{"version":3,"mappings":"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;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,ECHf,MAAM+pB,GAAY,CAChB,GAAI,CACF,QAAS,cACT,OAAQ,CACN,QACA,UACA,QACA,QACA,OACA,QACA,QACA,SACA,aACA,UACA,YACA,WACF,EACA,SAAU,CACR,UACA,QACA,SACA,eACA,SACA,UACA,WACF,EACA,YAAa,CACX,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACF,EACA,kBAAmB,WACnB,iBAAkB,WAClB,kBAAmB,QACnB,gBAAiB,QACjB,kBAAmB,aACnB,YAAa,uBACb,aAAc,wBACd,YAAa,uBACb,YAAa,uBACb,WAAY,WACZ,UAAW,iBACX,eAAgB,iBAChB,aAAc,IACd,aAAc,GAChB,EACA,GAAI,CACF,QAAS,aACT,OAAQ,CACN,UACA,YACA,WACA,QACA,OACA,QACA,QACA,SACA,WACA,UACA,WACA,UACF,EACA,SAAU,CACR,UACA,UACA,WACA,SACA,SACA,QACA,WACF,EACA,YAAa,CACX,MACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,KACF,EACA,kBAAmB,WACnB,iBAAkB,WAClB,kBAAmB,KACnB,gBAAiB,SACjB,kBAAmB,UACnB,YAAa,sBACb,aAAc,uBACd,YAAa,yBACb,YAAa,qBAKf,EACA,GAAI,CACF,QAAS,sDACT,OAAQ,CACN,uCACA,6CACA,2BACA,uCACA,qBACA,2BACA,2BACA,uCACA,mDACA,6CACA,uCACA,4CACF,EACA,SAAU,CACR,qEACA,qEACA,6CACA,iCACA,6CACA,6CACA,4CACF,EACA,YAAa,CACX,qBACA,qBACA,2BACA,qBACA,qBACA,2BACA,2BACA,qBACA,2BACA,qBACA,2BACA,oBACF,EACA,kBAAmB,6CACnB,iBAAkB,uCAClB,kBAAmB,SACnB,gBAAiB,eACjB,kBAAmB,uCACnB,YAAa,iDACb,aAAc,kDACd,YAAa,iDACb,YAAa,iDACb,WAAY,mGACd,EACA,GAAI,CACF,aAAc,IACd,aAAc,IACd,QAAS,0BACT,OAAQ,CACN,SACA,UACA,UACA,QACA,MACA,OACA,OACA,SACA,YACA,UACA,WACA,UACF,EACA,SAAU,CACR,UACA,SACA,WACA,WACA,aACA,UACA,SACF,EACA,YAAa,CACX,MACA,MACA,SACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACF,EACA,kBAAmB,cACnB,iBAAkB,UAClB,kBAAmB,MACnB,gBAAiB,MACjB,kBAAmB,WACnB,YAAa,wBACb,aAAc,yBACd,YAAa,4BACb,YAAa,wBACb,UAAW,uBACX,eAAgB,uBAChB,OAAQ,8DACV,EACA,GAAI,CACF,QAAS,mBACT,OAAQ,CACN,UACA,WACA,QACA,QACA,MACA,OACA,OACA,WACA,YACA,UACA,WACA,UACF,EACA,SAAU,CACR,SACA,UACA,UACA,WACA,YACA,UACA,UACF,EACA,YAAa,CACX,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACF,EACA,kBAAmB,aACnB,iBAAkB,UAClB,kBAAmB,QACnB,gBAAiB,MACjB,kBAAmB,UACnB,YAAa,mBACb,aAAc,oBACd,YAAa,mBACb,YAAa,mBACb,UAAW,QACX,eAAgB,QAChB,aAAc,IACd,aAAc,IACd,eAAgB,kBAChB,eAAgB,0BAClB,EACA,GAAI,CACF,QAAS,mBACT,OAAQ,CACN,OACA,aACA,OACA,QACA,aACA,UACA,SACA,eACA,WACA,OACA,aACA,aACF,EACA,SAAU,CACR,QACA,YACA,YACA,mBACA,gBACA,OACA,WACF,EACA,YAAa,CACX,OACA,aACA,OACA,QACA,aACA,UACA,SACA,eACA,WACA,OACA,aACA,aACF,EACA,kBAAmB,8BACnB,iBAAkB,cAClB,kBAAmB,2BACnB,gBAAiB,aACjB,kBAAmB,UACnB,YAAa,mBACb,aAAc,oBACd,YAAa,mBACb,YAAa,mBACb,UAAW,CAAC,+CAAsB,EAClC,eAAgB,CAAC,+CAAsB,EACvC,WAAY,CAAC,aAAQ,EACrB,aAAc,IACd,aAAc,GAChB,EACA,GAAI,CACF,QAAS,mBACT,OAAQ,CACN,UACA,WACA,QACA,SACA,SACA,SACA,SACA,SACA,YACA,UACA,WACA,UACF,EACA,SAAU,CACR,WACA,YACA,aACA,eACA,aACA,SACA,UACF,EACA,YAAa,CACX,MACA,MACA,MACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,MACA,KACF,EACA,kBAAmB,UACnB,iBAAkB,UAClB,kBAAmB,KACnB,gBAAiB,IACjB,kBAAmB,UACnB,YAAa,wBACb,aAAc,yBACd,YAAa,yBACb,YAAa,wBACb,WAAY,iBACZ,aAAc,IACd,aAAc,GAChB,EACA,GAAI,CACF,QAAS,gBACT,OAAQ,CACN,UACA,aACA,OACA,QACA,MACA,OACA,UACA,UACA,YACA,UACA,WACA,aACF,EACA,SAAU,CACR,WACA,QACA,QACA,WACA,QACA,WACA,QACF,EACA,YAAa,CACX,MACA,SACA,MACA,MACA,MACA,OACA,OACA,SACA,MACA,MACA,MACA,QACF,EACA,kBAAmB,WACnB,iBAAkB,WAClB,WAAY,WACZ,kBAAmB,KACnB,gBAAiB,KACjB,kBAAmB,aACnB,YAAa,2BACb,aAAc,4BACd,YAAa,2BACb,YAAa,2BACb,UAAW,2BACX,eAAgB,2BAChB,aAAc,IACd,aAAc,IACd,mBAAoB,OACpB,eAAgB,qCAChB,eAAgB,2BAChB,OAAQ,sEACV,EACA,QAAS,CACP,QAAS,gBACT,OAAQ,CACN,UACA,aACA,OACA,QACA,MACA,OACA,UACA,UACA,YACA,UACA,WACA,aACF,EACA,SAAU,CACR,WACA,QACA,QACA,WACA,QACA,WACA,QACF,EACA,YAAa,CACX,MACA,SACA,MACA,MACA,MACA,OACA,OACA,SACA,MACA,MACA,MACA,QACF,EACA,kBAAmB,WACnB,iBAAkB,WAClB,WAAY,WACZ,kBAAmB,KACnB,gBAAiB,KACjB,kBAAmB,aACnB,YAAa,2BACb,aAAc,4BACd,YAAa,2BACb,YAAa,2BACb,UAAW,2BACX,eAAgB,2BAChB,aAAc,IACd,aAAc,IACd,mBAAoB,OACpB,eAAgB,qCAChB,eAAgB,0BAClB,EACA,GAAI,CACF,QAAS,oBACT,OAAQ,CACN,eACA,OACA,SACA,gBACA,MACA,WACA,SACA,gBACA,gBACA,mBACA,WACA,eACF,EACA,SAAU,CACR,YACA,oBACA,SACA,aACA,WACA,cACA,QACF,EACA,YAAa,CACX,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,WACA,MACA,KACF,EACA,kBAAmB,SACnB,iBAAkB,aAClB,kBAAmB,KACnB,gBAAiB,KACjB,kBAAmB,oBACnB,YAAa,oBACb,aAAc,qBACd,YAAa,uBACb,YAAa,oBACb,aAAc,IACd,aAAc,GAGhB,EACA,GAAI,CACF,QAAS,wBACT,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WACA,WACA,UACF,EACA,YAAa,CACX,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WACA,WACA,UACF,EACA,SAAU,CACR,qBACA,qBACA,qBACA,qBACA,qBACA,qBACA,oBACF,EACA,kBAAmB,eACnB,iBAAkB,eAClB,kBAAmB,SACnB,gBAAiB,SACjB,kBAAmB,eACnB,YAAa,8BACb,aAAc,+BACd,YAAa,8BACb,YAAa,6BACf,CACF,uMC9jBAC,GAAKC,EAAU,EACf9hB,GAAM8hB,EAAU,EAChBC,GAAOD,EAAU,EACjBE,GAAUF,EAAU,EACpBG,GAAiBH,EAAU,EAC3BI,GAAMJ,EAAU,EAGhB,IAAqBK,GAArB,cAAqCloB,EAAI3C,EAAY,CAACb,EAAW,CAAE,MAAK,EAAC,CAAE,CAA3E,kCAIe,mBAEb,WAAW,YAAa,CACf,OACL,QAAS,CAAE,KAAM,MAAO,EAE5B,CASA,QAAQia,EAAmB,CACzB,MAAM,OAAOA,CAAiB,EAC1B,KAAK,OACHA,EAAkB,IAAI,SAAS,GAC5B,aAAQ,KAAYtB,IACvB,KAAK,MAAM,OAAOzF,GAAUyF,CAAG,EAAG,GAAM,EAAI,EAC7C,CAGP,CAEA,QAAS,CACA,gCACT,CAEA,cAAe,CACb,MAAM,aAAa,EACfwS,GAAU,KAAK,KAAK,S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AAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;A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AAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,ECGf,IAA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;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,mMCaf,IAAqBuxC,GAArB,cAA4CnvC,EAC1C3C,EACAuK,GACArB,GACA,CAAC/J,EAAW,CAAE,OAAK,CACrB,CAAE,CAoGA,IAAI,KAAM,CACR,OAAOmS,EAAc,CACvB,CAEA,WAAW,YAAa,CACf,OACL,QAAS,CACP,KAAM,OACN,QAAS,IAAM,CAAC,CAClB,EACA,OAAQ,CACN,KAAM,MACN,QAAS,IAAM,CAAC,aAAc,cAAc,CAC9C,EAEJ,CAEA,sBAAuB,CACrB,MAAM,kBAAkB,EACxB,cAAc,KAAK,QAAQ,CAC7B,CAEA,SAASC,EAAO,CACd,OAAIA,EAAM,MACDA,EAAM,MAER,KAAK,KAAK,OAAO,SAASA,EAAM,OAAO,EAC1C,KAAK,KAAK,EAAE,SAASA,EAAM,OAAO,EAClC,KAAK,KAAK,EAAE,YAAYA,EAAM,OAAO,CAC3C,CAEA,SAASA,EAAO,SACV,MACAwgC,EAAa,GACX,QAAM,KAAK,QAAQxgC,EAAM,OAC/B,GAAI,CAAC7L,EACGK,cACGwL,EAAM,OAAS,SACxBxL,EAAM,IAAI,KAAK,aACb,KAAK,KAAK,SACVwL,EAAM,cAAgB,KAAK,cAAgB,CAAC,CAC5C,SAAO,WAAW7L,CAAG,CAAC,UACf6L,EAAM,OAAS,aACxBxL,EAAM,IAAI,KAAK,aACb,KAAK,KAAK,SACVwL,EAAM,cAAgB,KAAK,cAAgB,CAAC,GAC5C,OAAO,WAAW7L,EAAI,QAAQ,IAAK,GAAG,CAAC,CAAC,UACjC6L,EAAM,OAAS,WACpBA,EAAM,QACFxL,IACAwL,QAAM,QAAajD,IACvBvI,EAAMA,EAAI,QAAQuI,EAAE,MAAOA,EAAE,IAAI,EAClC,EACYyjC,MAGfhsC,EADYlI,EAAMkI,GAAK3D,IAAM,aAAN,cAAkB,YAAY,EAC3C,QAAO8L,IAAM,aAAN,cAAkB,YAAY,UACtCqD,EAAM,OAAS,OAClBxL,KAAW,KAAK,QAAQwL,EAAM,OAAO,WAAW;AAAA,EAAQ,MAAM,CAAC,UAC5DA,EAAM,OAAS,MAGrB,KAAM,uBAAyB,KAAK,QAAQA,EAAM,MAClD,CAACA,EAAM,uBAAyBA,EAAM,IACvC,CACA,IAAIygC,EAAO,wBACPzgC,EAAM,sBAA+BygC,QAAK,QAAQzgC,EAAM,KACvDygC,GAAQzgC,EAAM,IACXygC,SACAA,KACAA,UACRjsC,EAAM4L,GAAWqgC,CAAI,CACvB,MAAOjsC,EAAM4L,GAAWjM,CAAG,OAErBK,OAAK,QAAQwL,EAAM,OAO3B,GAJIxL,IAAQ,KAAOwL,EAAM,YACjBxL,OAAK,KAAK,EAAEA,CAAG,GAGnBA,IAAQ,KAAOwL,EAAM,OAASwgC,EAChC,GAAI,MAAM,QAAQxgC,EAAM,KAAK,EAAG,CAC9B,IAAI0gC,EAASvsC,EACP6L,QAAM,QAAgB3K,IAC1BqrC,EAASA,EAAO,QAAQrrC,EAAK,MAAOA,EAAK,IAAI,EAC9C,EACKb,SAENA,EAAML,EAAI,QAAQ6L,EAAM,MAAM,MAAOA,EAAM,MAAM,IAAI,EAGrD,WAAQ,KAAOA,EAAM,SACvBxL,EAAMiM,EAAS,GAAGjM,IAAMwL,EAAM,SAAU,KAAK,OAAO,GAE/CxL,CACT,CAEA,WAAY,OAEH;AAAA1F,SACH+B,OAAK,SAAL,cAAa,IAAIyE,GAAKxG,4BAA+BwG;AAAA,oBAE3D,CAEA,SAASs1B,EAAQ,CACR,SAAO,IAAa5qB,IACnB,QAAM,KAAK,SAASA,CAAK,EAC/B,OAAO7L,IAAQ,IACXrF;AAAAA,sCAC4B,KAAK,SAASkR,CAAK;AAAA;AAAA,uBAElCA,EAAM,OAAS;AAAA,kCACJA,EAAM,MAAQ;AAAA;AAAA,gBAEhC7L;AAAA;AAAA,kBAGNrF,IACL,CACH,CAEA,MAAM,aAAawF,EAAU,CAC3B,MAAMI,EAASL,GAAyBC,EAAU,CAAC,WAAW,CAAC,EAO/D,GANA,KAAK,UAAYI,EAAO,UACxB,KAAK,QAAU,MAAM,KAAK,IAAI,WAAW,KAAK,SAAS,EAChD,cAAO,KAAMA,EAAO,OAAO,EAC9B,KAAK,QACP,KAAK,YAAY,EAEf,KAAK,WAAY,CACnB,KAAK,YAAY,EACjB,IAAI+kC,EAAQ,EACP,cAAW,YAAY,IAAM,CACvBA,KACT,KAAK,QAAQ,WAAWA,EAAQ,KAAK,OAAO,MAAM,GACjD,GAAQ,CACb,CACF,CAEA,QAAS,OACA,aAAQ5oC,OAAK,SAAL,cAAa,IACfu5B;AAAAt7B,YACL,KAAK,SAASs7B,EAAM,KAAK;AAAA,YACzBA,EAAM,OACJt7B;AAAAA;AAAAA,oBAEMs7B,EAAM,QACR,KAAK,eAAe,KAAK,SAASA,EAAM,KAAK,CAAC,EAC1ChqB,GAAWgqB,EAAM,MAAM,EACvB;AAAA;AAAA,sBAGR;AAAA;AAAA;AAAA,2BAIa,KAAK,QAAU,KAAK,OAAO,OAAS,GAAK;AAAA,UAC1D,KAAK,QAAU,KAAK,UAAU;AAAA,aAEtC,CAIA,eAAeuW,EAAoB,CACjC,IAAIC,EAAgB,GACpB,SAAmB,QAAcC,WAC3BhwC,IAAG,SAAH,QAAW,SAAwB+vC,MACxC,EACMA,CACT,CAEA,MAAM,aAAc,CAClB,YAAK,OAAS,MAAM,KAAK,IAAI,SAAS,KAAK,QAAQ,UAAU,EAC7D,KAAK,cAAc,EACZ,KAAK,MACd,CAEA,MAAM,aAAc,CAClB,MAAM,QAAQ,IACZ,KAAK,QAAQ,WACV,OAAa1iB,QAAK,OAAO,SAASxJ,EAAKwJ,EAAG,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAC3D,IAAI,MAAMA,GAAM,EACA,MAAM,KAAK,IAAI,UAAUA,EAAG,IAAI,GACxC,QAAgB7oB,IACrB,KAAK,QAAQA,EAAK,cAAgBqf,EAAKA,EAAKrf,EAAK,IAAI,CAAC,EACtD,MAAMsmB,EAAO5c,EAAMA,EAAM1J,EAAK,IAAI,CAAC,EAC7BumB,EAAK7c,EAAM2V,EAAKrf,EAAK,IAAI,CAAC,EAC5BsmB,GAAQC,IACL,aAAQ,GAAGvmB,EAAK,qBAAuBsmB,EACvC,aAAQ,GAAGtmB,EAAK,mBAAqBumB,EAC1C,KAAK,QAAQ,GAAGvmB,EAAK,yBAA2B,GAAG/I,EACjDqvB,GACA,OAAO,MAAM,OAAOrvB,EAAMsvB,CAAE,EAAE,OAAO,MAAM,IAC/C,CACD,EACF,EAEP,CACF,EAhTqB2kB,GAMZ,OAASvxC;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IAgGhBC,IADCiN,GAAM,UAAU,GArGEqkC,GAsGnB,uBAtGmBA,GAArBtxC,IADCE,EAAc,kBAAkB,GACZoxC,yMCmCrB,MAAMO,GAAe,CAEnBC,EACAtkC,IACG,CACC,MACJ,MAAM+B,EAAQ2E,GAAU49B,EAAiBhkC,KAAE,aAAeN,CAAS,EAEnE,OAAI+B,GAAS,GAAKA,EAAQuiC,EAAW,OAAS,EAC5CC,EAAWD,EAAWviC,EAAQ,GAE9B,CAACwiC,CAAQ,EAAID,EAERC,CACT,EAGMC,GAAmB,CACvBF,EACAtkC,IACG,CACC,MACJ,MAAM+B,EAAQ2E,GAAU49B,EAAiBhkC,KAAE,aAAeN,CAAS,EAEnE,OAAI+B,EAAQ,EACVwiC,EAAWD,EAAWviC,EAAQ,GAEnBwiC,IAAWD,EAAW,OAAS,GAErCC,CACT,EAGA,IAAqBE,GAArB,cAA8C9vC,EAC5C3C,EACAuK,GACArB,GACA,CACE6e,GACA,CAAE,eAAgB,gBAAiB,SAAU,OAAQ,aAAc,KAAM,CAC3E,EACA,CACEN,GACA,CAAE,eAAgB,wBAAyB,UAAW,KAAM,CAC9D,EACA,CAACtoB,EAAW,CAAEV,OAAK,CACrB,CAAE,CAbF,kCAoBE,cAAW,GAMI,qBAGD,oBAOqB,4BAOf,0BAgBpB,4BAAyB,GAWsB,0BA/B/C,IAAI,KAAM,CACR,OAAO6S,EAAc,CACvB,CAMA,IAAI,WAAY,CACd,OAAK,KAAK,aAAY,KAAK,WAAa5J,MACjC,KAAK,UACd,CAEA,IAAI,UAAUnC,EAAO,CACnB,KAAK,WAAaA,EAClB,KAAK,cAAc,CACrB,CAMA,IAAI,uBAAwB,CAC1B,OAAO,KAAK,sBACd,CAEA,IAAI,sBAAsBA,EAAO,CAC/B,KAAK,uBAAyBA,EAC9B,KAAK,cAAc,CACrB,CAIA,IAAI,eAAgB,CAClB,OAAO,KAAK,cACd,CAEA,IAAI,cAAcA,EAAO,CACvB,KAAK,eAAiBA,EACtB,KAAK,cAAc,CACrB,CAIA,aAAaM,EAAUgO,EAASvP,EAAQ,SAChC,QAASsB,GAAyBC,EAAU,CAChD,YACA,YACA,eACD,EACM,cAAO,KAAMI,EAAO,OAAO,EAE7B,gBAAa,KAAK,UAAU,WACjC,MAAMysC,EAAkB7sC,EAAS,MAAM,KAAK,MAAM,GAAG,EAAE,OACvD,KAAK,QAAUA,EAAS,OACxB,KAAK,aAAeA,EAAS,MAE7B,KAAK,aAAa,SAAW,KAAK,aAAa,SAAS,iBAC9C,QAAEe,EAAK,aAAaxE,IAAK,OAAL,cAAW,SAAS,UAAM,EAExD,KAAK,aAAa,WAAa,KAAK,aAAa,WAAW,iBAClD,QAAEwE,EAAK,aAAaxE,IAAK,OAAL,cAAW,SAAS,UAAM,EAGnD,gBAAayD,EAAS,SACxB,MAAM,GAAG,EACT,MAAM,EAAG6sC,CAAe,EACxB,KAAK,GAAG,EACX,KAAK,cACHxkC,OAAS,MAAM,WAAf,cAAyB,IAAatH,KACpC,OAAQA,EAAK,OACb,MAAOA,EAAK,MACZ,UAAWA,EAAK,UAChB,gBAAiBA,EAAK,iBAAmBA,EAAK,KAAK,MAAM,CAAC,EAC1D,KAAMA,EAAK,UALb,OAMO,GACL,KAAK,aAAef,EAAS,SAC1B,uBAAoB,IAAIA,EAAS,SACnC,MAAM,GAAG,EACT,MAAM6sC,CAAe,EACrB,KAAK,GAAG,IAEN,uBACH7sC,EAAS,WAAavB,EAAO,QAAQ,SAAS,SAAS,cACvD,CAACA,EAAO,QAAQ,SAAS,SAAS,aAC9B,KACA,IAAIA,EAAO,QAAQ,SAAS,SAAS,aAClC,MAAM,GAAG,EACT,MAAM,EAAE,IAGnB,KAAK,OAASA,EAGd,KAAK,OAAO,iBAAmB,CAACN,EAAUC,IAAa,CAEjDD,EAAS,OAASC,EAAS,SAC7B,KAAK,eAAiB,KAAK,kBAC3B,KAAK,kBAAoB,GACzB,KAAK,cAAc,EACrB,EAGF,KAAK,UAAYgC,EAAO,UACxB,KAAK,aAAeA,EAAO,aACtB,eAAUA,EAAO,SAAS,CACjC,CAGA,IAAI,gBAAiB,CACZ,yBACT,CAEA,iBAAkB,CACZ,YAAK,UAAY,KAAK,UACjB5F;AAAAA;AAAAA,6BAEgB,KAAK;AAAA;AAAA;AAAA,UAGxB,KAAK;mBAGJA,aACT,CAEA,kBAAmB,CACjB,OAAOA,IAAO,KAAK,UAAU,IAASwG,UAChC,WAAE,QAAF,QAAS,OACJ,KAAK,iBAAiBA,CAAC,EAEzB,KAAK,gBAAgBA,CAAC,CAC9B,IACH,CAKA,iBAAiBD,EAAM,OAKrB,OAHI,KAAK,oBAAsB,KAC7B,KAAK,kBAAoB,KAAK,gBAG9BA,EAAK,MACLA,EAAK,SACJA,EAAK,WAAYA,iBAAM,MAAM,KAAKC,GAAK,CAACA,EAAE,OAEpCxG,IAEFA,wBAA2BuG,EAAK;AAAA,UAClCxE,IAAK,QAAL,cAAY,OAAS,KAAK,gBAAgByE,CAAC,IAClD,CAKA,gBAAgBD,EAAM,CACb,OAACA,EAAK,KASTvG,IARAA;AAAAA,mBACWuG,EAAK;AAAA,kBACNA,EAAK;AAAA,mBACJA,EAAK;AAAA,mBACLA,EAAK;AAAA,uBACD,KAAK,oBAAsBA,EAAK;AAAA,aAC1CA,EAAK;AAAA,UAGhB,CAGA,cAAcipB,EAAK,CAGjB,MAAM8iB,EADOriC,EAAMuf,EAAI,OAAO,aAAa,EACxB,KACf8iB,IACF,KAAK,kBAAoBA,EACdzsC,MAAG,KAAK,aAAaysC,GAAO,EACvC,KAAK,gBAAkBA,EACvB,KAAK,cAAc,EAEvB,CAGA,cAAcxlB,EAAI,CAChB,MAAM1f,EAAQvI,KACR0tC,EAAY,GAAG3tC,GAAe,EAAE,MAAM,WAAW,EAAE,cACvDkoB,EAAG,cACDA,EAAG,cAAgBA,EAAG,mBAAmB1f,IAC7CvH,GAAW0sC,CAAS,CACtB,CAEA,YAAYxuC,EAAO,CACX,QAAUmJ,EAAK,KAAK,UAAW,CACnC,WAAYnJ,EAAM,OAAO,eAAe,MACzC,EACUuK,QAAK,cAAcA,CAAO,CACvC,CAEA,gBAAiB,CACT,QAAS,KAAK,UAAU,OAC5B,QAAK,sBAAsB,SAAS,EAAE,UAAU,GAG5C4jC,EAAWF,GAAaQ,EAAQ,KAAK,SAAS,EAExCN,QAAK,cAAcA,CAAQ,CACzC,CAEA,gBAAiB,CACT,QAAS,KAAK,UAAU,OAC5B,QAAK,sBAAsB,SAAS,EAAE,UAAU,GAG5CO,EAAWN,GAAiBK,EAAQ,KAAK,SAAS,EAC5CC,QAAK,cAAcA,CAAQ,CACzC,CAEA,aAAc,CACZ,MAAMP,EAAWF,GAAa,KAAK,gBAAiB,KAAK,SAAS,EACtDE,QAAK,cAAcA,CAAQ,CACzC,CAEA,aAAc,CACZ,MAAMO,EAAWN,GAAiB,KAAK,gBAAiB,KAAK,SAAS,EAC1DM,QAAK,cAAcA,CAAQ,CACzC,CAEA,YAAa,OACX,OAAO,KAAK,sBAAsB,SAAQ1wC,OAAK,WAAL,cAAe,UAAU,GAAK,CAC1E,CAEA,WAAWuM,EAAS,OACX,eAAK,WAAL,cAAe,cAAeA,EAAQ,UAC/C,CAEA,iBAAkB,CACT,YAAK,UACR,KAAK,UAAU,OACbL,QAAK,sBAAsB,SAASA,EAAE,UAAU,GAElD,EACN,CAEA,UAAW,SACT,OAAO,KAAK,WAAa,KAAK,aAC1BjO;AAAAA,qBACa,KAAK;AAAA;AAAA,mBAEP,KAAK,SAAS;AAAA;AAAA,YAErB,KAAK,kBAAkB,IAErBsO;AAAAtO,yBACWsO,EAAQ;AAAA,6BACJ,KAAK,WAAWA,CAAO;AAAA,mBACjCA,EAAQ,kBAAoBA,EAAQ;AAAA;AAAA,uBAI/CtO;AAAAA,eACK+B,OAAK,WAAL,cAAe,qBAClB8L,OAAK,WAAL,cAAe,eACf;AAAA,UAER,CAEA,aAAc,CACZhI,GAAW,KAAK,WAAW,MAAM,GAAG,EAAE,MAAM,EAAG,CAAC,EAAE,KAAK,GAAG,EAAI,KAAK,OAAO,CAC5E,CAEA,kBAAmB,CACjB,KAAK,kBAAoB,KACdA,QAAK,WAAa,KAAK,OAAO,CAC3C,CAEA,QAAS,iBAEA;AAAA7F;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,qBAMU,KAAK,KAAK,EAAE,MAAM;AAAA,sBACjB,KAAK;AAAA;AAAA;AAAA;AAAA,2CAIgB,KAAK,aAAe,GAAK;AAAA,uBAC7C,KAAK,KAAK,EAAE,oBAAoB;AAAA;AAAA,wBAE/B,KAAK;AAAA;AAAA;AAAA,iCAGI,KAAK;;2CAEK,KAAK,aAAe,GAAK;AAAA,uBAC7C,KAAK,KAAK,EAAE,gBAAgB;AAAA;AAAA,wBAE3B,KAAK;AAAA;AAAA;AAAA;AAAA,kCAIK,KAAK,aAAe,SAAW;AAAA,sBAC3C,KAAK;AAAA,qBACN,KAAK,aACV,KAAK,KAAK,EAAE,WAAW,EACvB,KAAK,KAAK,EAAE,QAAQ;AAAA,uBACb,KAAK,aAAe,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAMlC+B,OAAK,aAAL,cAAiB;AAAA;AAAA,yBAEf8L,OAAK,aAAL,cAAiB,WAC5B+B,OAAK,aAAL,cAAiB,sBACjB;;;;2BAIe,CAAC,KAAK,qBAAqB;AAAA;AAAA,cAExC,KAAK,YACH5P;AAAAA;AAAAA,oCAEmBmvB,OAAK,aAAL,cAAiB;AAAA,qDAEpCnvB;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,uBAQO,KAAK,KAAK,EAAE,iBAAiB;AAAA,wBAC5B,KAAK;AAAA;AAAA;AAAA;AAAA,gBAIf+P,OAAK,WAAL,cAAe,qBAAoBob,OAAK,WAAL,cAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAMzC,KAAK,KAAK,EAAE,aAAa;AAAA,wBACxB,KAAK;AAAA;AAAA;AAAA;AAAA,UAInB,KAAK;sCACuB,KAAK;;yBAElB,KAAK,kBAAoB,GAAK;AAAA;AAAA;AAAA;AAAA,sBAIjC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAczB,CAEA,kBAAmB,CACb,KAAK,sBAAsB,QAAQ,KAAK,SAAS,UAAU,IAAM,GACnE,KAAK,sBAAwB,CAC3B,GAAG,KAAK,sBACR,KAAK,SAAS,YAGX,2BAAwB,KAAK,sBAAsB,OACtD9b,GAAMA,IAAO,KAAK,SAAS,WAGjC,CAKA,kBAAmB,CACjB,OAAI,KAAK,UAAY,KAAK,SAAS,KAAK,YAC/BrP;AAAAA;AAAAA,aAEAsR,GACD,KAAK,SAAS,KAAK,YAAY,QAAQ,eAAgB,EAAE;AAAA;AAAA,cAK1D,EACT,CAEA,IAAI,uBAAwB,OAC1B,MAAMoY,IAAM3nB,OAAK,WAAL,cAAe,QAAS,CAAC,EAAG,CAAC,EACnCoxB,EAAS,IAAI4X,GAAQ,IAAIC,GAAMthB,CAAG,CAAC,EAClC,kBACL,IAAI4J,GAAM,CACR,MAAO,IAAIzB,GAAS,CAClB,gBAAiB,gBACjB,MAAO,MACP,KAAM,mBACP,EACF,GAEIsB,CACT,CAEA,YAAYuf,EAAM,CAChB,MAAMpkC,EAAU,KAAK,SACd,SAAK,OAAmBqkC,IACzB,UAAOA,EAAS,QAAW,SAC7B,OAAOrkC,EAAQ,WAAW,QACxBqkC,EAAS,OAASA,EAAS,SAAWvjB,EAAG,kBAAoB,IAKjE,GAAI,MAAM,QAAQujB,EAAS,MAAM,EAAG,CAClC,IAAIjtC,EAAM,GACC,UAACzD,EAAKiD,CAAK,IAAK,OAAO,QAAQytC,EAAS,MAAM,EACvDjtC,EACGA,GAAO4I,EAAQrM,KAASiD,GACxBQ,GAAO4I,EAAQrM,IAAQiD,IAAU,IAEtC,OAAOytC,EAAS,OAAO,KAAK3kC,GAC1BM,EAAQ,WAAW,KACjB8gB,KAASphB,IAAWohB,EAAG,kBAAoB,EAC7C,EAEJ,CAGA,GAAI,OAAOujB,EAAS,QAAW,UAAYA,EAAS,SAAW,KAAM,CACnE,IAAIjtC,EAAM,GACVktC,UAAKD,EAAS,OAAQ,CAACttC,EAAKpD,IAAQ,CAC9BA,IAAQ,YACVyD,EACEA,GACAL,EAAI,SACFiJ,EAAQ,OAAO,KAAatR,KAAK,oBAAsBuJ,CAAI,GAEtDtE,IAAQ,eACjByD,EACEA,GACAL,EAAI,QACFiJ,EAAQ,OAAO,KAAatR,KAAK,oBAAsBuJ,CAAI,GAEtDtE,IAAQ,OACjByD,EACEA,GACAL,EAAI,KAAKkB,GACP+H,EAAQ,OAAO,QAAatR,EAAK,KAAK,SAASuJ,CAAI,CAAC,GAE/C,MAAM,QAAQlB,CAAG,EAC1BK,EAAMA,GAAOL,EAAI,KAAayuB,KAAQ7xB,KAAS6xB,CAAI,EAC1CzuB,EAAI,QAAUA,EAAI,OAAO,CAAC,IAAM,IACzCK,EAAMA,GAAO4I,EAAQrM,IAAQqM,EAAQrM,KAASoD,EAAI,UAAU,CAAC,EAE7DK,EACGA,GAAO4I,EAAQrM,IAAQoD,IAAQ,KAC/BK,GAAO4I,EAAQrM,KAASoD,GACzBiJ,EAAQ,OAAO,KAAa/H,KAAKtE,KAASoD,CAAG,CACjD,CACD,EACMK,CACT,CACO,SACR,CACH,CAEA,MAAM,iBAAkB,SAClB,IAAC,KAAK,QACR,MAAO,GAEL,IACE,MACE,UAAY3D,OAAK,UAAL,cAAc,YAAa,UACrC,mBAAI,iBAAkB8wC,CAAS,EACnCA,IAAc,UAAWC,EAAS,aAAM,OAAO,qHAC1CD,IAAc,eACrBC,EAAS,aAAM,OAAO,+HACX,cAAM,0BAA2BD,CAAS,EACzC,MAAMC,EAAO,aACzB,KAAK,SACL,KAAK,SACLjlC,OAAK,UAAL,cAAc,oBAGTzH,GACC,qBAAM,6BAA8BA,CAAC,EACtC,EACT,CACF,CAEA,MAAM,UAAU2sC,EAAW,WACrB,QAAK,KAAO,KAAK,UAAW,CAU9B,GATA,KAAK,UAAY,MAAM,KAAK,IAAI,YAAY,EAC5C,KAAK,gBAAkB,KAAK,UAAU,KAAK,CAAChrC,EAAGC,IAAM,CAC7C,QAAM,WAAWD,EAAE,UAAU,EAC7BirC,EAAM,WAAWhrC,EAAE,UAAU,EACnC,OAAOirC,EAAMD,EACd,EACD,KAAK,SAAW,MAAM,KAAK,IAAI,WAAW,KAAK,SAAS,EACxD,MAAM,KAAK,gBAGT,KAAK,0BACL,KAAK,SAAS,KAAK,0BAEf,IACF,MAAME,EAAa,KAAK,MACtB,KAAK,SAAS,KAAK,2BAEjBA,EAAW,SACb,KAAK,SAAS,WAAa,KAAK,SAAS,WAAW,OAClD9jB,KAAW,SAASA,EAAG,iBAAiB,GAE1C,KAAK,SAAS,OAAS,KAAK,SAAS,OAAO,OAC1CA,KAAW,SAASA,EAAG,iBAAiB,UAI5C,QAAQ,MAAM,kCAAkC,CAClD,CAEI,QAAe,MAAM,KAAK,kBAC1B+jB,EAAkB,GAkBpB,GAjBJC,EAAa,QAAgB7sC,IACvBA,EAAK,OACPA,EAAK,MAAM,QAAQC,GAAK2sC,EAAgB,KAAK3sC,CAAC,CAAC,CACjD,CACD,EACD,KAAK,aAAa,SAAW,KAAK,aAAa,SAAS,OACtD4sC,EAAa,OAAOD,CAAe,GAErC,KAAK,aAAa,WAAa,KAAK,aAAa,WAAW,OAC1DC,EAAa,OAAOD,CAAe,GAErC,KAAK,UAAY,KAAK,YAAY,KAAK,YAAY,EAAE,OAAOC,CAAY,EAEnE,KAAK,UAAU,QAAa7sC,EAAK,OAAS,KAAK,iBAAiB,IACnE,KAAK,kBAAoB,MAGvB,CAAC,KAAK,kBAAmB,CAC3B,MAAM8sC,EAAgClQ,GACpC,KAAK,UAAU,IAAU38B,KAAE,MAAQ+oB,GAAO/oB,EAAGA,EAAE,KAAK,EAAIA,CAAE,GAGtD8sC,IACJvxC,IAAKsxC,EAAgB,CAAE,gBAAiB,GAAGN,GAAY,CAAC,IAAxD,cAA2D,SAC3DllC,IAAKwlC,EAAqB7sC,IAClB,QAAIA,EAAE,WAAa,GACvB,cAAKA,EAAE,KAAK,EACdC,EAAE,KAAKD,EAAE,KAAK,QAAQ,IAAK,EAAE,CAAC,EACvBC,EAAE,SAASssC,CAAS,EAC5B,IALD,cAKI,OACJ,KAAK,oBACLnjC,OAAK,UAAU,KAAf,cAAmB,MAErB,KAAK,kBAAoB0jC,CAC3B,CAEI,KAAK,mBAAqBpyC,EAAS,OAASR,EAC9C,WAAW,IAAM,CACfmF,GAAW,GAAG,KAAK,aAAa,KAAK,mBAAmB,GACvD,EAAE,EAEL,WAAW,IAAM,CACfA,GAAW,GAAG,KAAK,aAAa,KAAK,mBAAmB,GACvD,EAAE,EAGP,KAAK,cAAc,CACrB,CACF,CAEA,MAAM,eAAgB,CACpB,MAAM0tC,EAAU,MAAM,KAAK,IAAI,aAAa,EAC5C,KAAK,WAAaA,EAClBtd,GAAoB,KAAK,UAAU,EACnCsG,GAAU,CAAC,KAAK,QAAQ,EAAGgX,CAAO,EAClC,KAAK,WAAW,KAAK,OAAS,KAAK,SAAS,MACvC,gBAAW,KAAK,KACnB,KAAK,WAAW,KAAK,mBAAqB,KAAK,WAAW,KAAK,IACnE,CACF,EA/nBqBnB,GAcZ,OAASvgC,GAGhB1R,IADCC,EAAS,CAAE,KAAM,OAAQ,GAhBPgyC,GAiBnB,yBAGAjyC,IADCC,EAAS,CAAE,KAAM,OAAQ,GAnBPgyC,GAoBnB,wBAGAjyC,IADCC,EAAS,CAAE,KAAM,OAAQ,GAtBPgyC,GAuBnB,sBAvBmBA,GAArBjyC,IADCE,EAAc,oBAAoB,GACd+xC,IClErB,eAAsBoB,GAAcllC,EAAU,GAAIkF,EAAU,GAAI,CACxD,QAAO,MAAMzK,cAAO,0BACpB0qC,EAAKC,EAAK,MAAM,SAAS,EAC/B,GAAIplC,EAAS,CACX,MAAMqlC,EAAKD,EAAK,MAAM,aAAaplC,EAAQ,QAAQ,EAE9ColC,QAAM,cAAcC,EAAIrlC,EAAQ,KAAM,CAAE,OAAQ,GAAI,EACzDqlC,EAAG,SAAW,CAAC,CAAE,IAAK,EAAI,GAC1BD,EAAK,MAAM,kBAAkBD,EAAIE,EAAIngC,EAAQ,WAAa,QAAQ,CACpE,CACAkgC,EAAK,UAAUD,EAAI,GAAGjgC,EAAQ,MAAQ,iBAAiB,CACzD,sMCJA,IAAqBogC,GAArB,cAAgDtxC,EAC9C3C,EACAkJ,GACA,CAAC/J,EAAW,CAAE,OAAK,CACrB,CAAE,CAJF,kCAyFkB,sBAED,sBAEF,iBAAC,YAAa,QAAS,mBAAmB,EAEpC,uBAAC,YAAa,WAAY,QAAQ,EAE9B,2BACrB,MACA,gBACA,eACA,gBACA,UAGF,SAAMmS,GAAc,CAtBpB,WAAW,YAAa,CACf,OACL,QAAS,CAAE,KAAM,MAAO,EAE5B,CAoBA,mBAAoB,CACd,MAAM,mBAAmB,MAAM,kBAAkB,EAChD,qBAAkB,IAAI,KAAK,aAC9B,KAAK,KAAK,SACV,KAAK,cAAgB,CAAC,EAE1B,CAEA,MAAM,aAAazL,EAAU,CAC3B,MAAMI,EAASL,GAAyBC,EAAU,CAAC,WAAW,CAAC,EAC/D,KAAK,QAAU,MAAM,KAAK,IAAI,WAAWI,EAAO,SAAS,EAClD,cAAO,KAAMA,EAAO,OAAO,CACpC,CAEA,QACE8G,EACA3H,EACA8uC,EAAmB,mBACnB,CACO,YAAK,QAAQ,WAAW,OAC7BttC,GACEA,EAAK,oBAAsBxB,GAC3BwB,EAAK,KAAK,SAASmG,CAAQ,GAC3BnG,EAAK,YAAcstC,EAEzB,CAEA,aAAa9uC,EAAO,CACX,YAAK,iBAAiBA,IAAUA,CACzC,CAEA,UAAUymB,EAAQikB,EAAa,KAAM,CACnC,GAAI,CAACjkB,EACI,SAET,IAAI9lB,EAAMlI,EAAM,SAASguB,CAAM,EAAE,SAAS,EAC1C,OAAIA,IAAW,QACP9lB,OAAK,KAAK,EAAE,UAAU,GAE1B+pC,IACF/pC,GAAO,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK+pC,KAG3B/pC,EAAI,OAAO,CAAC,EAAE,cAAgBA,EAAI,MAAM,CAAC,CAClD,CAEA,QAAS,CACP,OAAO,KAAK,QACR1F;AAAAA,iCACyBsR,GAAW,KAAK,KAAK;AAAA;AAAA,gBAEtC,KAAK;gBACL,KAAK,QAAQ,IAAIwiC,GAAO9zC,IAAO,KAAK,WAAW8zC,CAAG,GAAG;AAAA;AAAA,cAEvD,KAAK;;;eAGJ,KAAK,KAAK,EAAE,iBAAiB;AAAA,aAEpC9zC,wBACN,CAGA,qBAAsB,CACb,UACT,CAEA,eAAgB,CACP;AAAAA;AAAAA,QAEH,KAAK,OACJ,OAAOuG,GACN,KAAK,QAAQ,WAAW,KACtB6oB,GAAMA,EAAG,oBAAsB7oB,EAAK,SACtC,GAED,IACC2K,GACElR,uCAA0CkR,EAAM;AAAA,WAG1D,CAEA,iBAAiB4iC,EAAK7a,EAAW,CACzB,QACJ6a,EAAI,OAAS,OAAS,KAAK,QAAQ,KAAO,KAAK,QAAQ,WACnDtlC,EAAQslC,EAAI,KAAK7a,IAAc6a,EAAI,KAErC,aAAM,QAAQtlC,CAAK,EACd+B,EAAK,KACV6e,GACEA,EAAG,oBAAsB6J,GACzBzqB,EAAM,KAAKrF,GAAKimB,EAAG,KAAK,SAASjmB,CAAC,CAAC,GAGlCoH,EAAK,QACJ6e,EAAG,oBAAsB6J,GAAa7J,EAAG,KAAK,SAAS5gB,CAAK,EAEtE,CAEA,oBAAoBslC,EAAK5iC,EAAO,CAC9B,MAAMkE,EAAS,MACX,KAAI,OAAS,OACR;AAAApV;AAAAA,2DAE8C,KAAK,iBACpD8zC,EACA5iC,EAAM,WAEJ,SACA;AAAA,mBACK,KAAK,KAAK,EAAE,cAAc;AAAA;AAAA,yBAEpB;AAAA,oBACLA;AAAA,qBACC4iC;AAAA,oBACD,KAAK;AAAA;AAAA,cAIrB,MAAMC,EAAW,KAAK,oBACpBD,EAAI,KACJ5iC,EAAM,UACNkE,GAEF,OAAK2+B,EAGE/zC;AAAAA,mBACQ+zC;AAAA;AAAA,qBAEE,KAAK,KAAK,EAAE,cAAc;AAAA;AAAA;AAAA,2BAGpB;AAAA,sBACL7iC;AAAA,uBACC4iC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2DAMoC,KAAK,iBACpDA,EACA5iC,EAAM,WAEJ,SACA;AAAA;AAAA;AAAA,yBAGW;AAAA,oBACLA;AAAA,qBACC4iC;AAAA,oBACD,IAAM,CACR,QAAO,SAAS,cAAc,GAAG,EACvC92C,EAAK,KAAO+2C,EACZnoC,GACE,GAAG5O,EAAK,aAAaA,EAAK,OAAOA,EAAK,WAAWA,EAAK,SAASA,EAAK,QAEtE,KAAK,WAAW,cAAc,eAAe,EAAE,KAAK;AAAA;AAAA,cAjCnDgD,GAqCX,CAEA,WAAW8zC,EAAK,CACP;AAAA9zC,0BACe,KAAK,UAAU8zC,EAAI,OAAQA,EAAI,UAAU;AAAA,QAC3D,KAAK,OACJ,OAAOvtC,GACN,KAAK,QAAQ,WAAW,KACtB6oB,GAAMA,EAAG,oBAAsB7oB,EAAK,SACtC,GAED,IACU2K;AAAAlR,cACL,KAAK,oBAAoB8zC,EAAK5iC,CAAK;AAAA;AAAA;AAAA,yBAGxB,KAAK,KAAK,EAAE,cAAc;AAAA,4CACP4iC,EAAI,OAAS,QACzC,KAAK,iBAAiBA,EAAK5iC,EAAM,SAAS,EACtC,SACA;AAAA;AAAA,+BAEW;AAAA,0BACLA;AAAA,2BACC4iC;AAAA,0BACD,KAAK;AAAA;AAAA;AAAA;AAAA,WAM7B,CAEA,aAAazpC,EAAM2pC,EAAS,CACtB,MACAC,EACAC,EACJ7pC,EAAK,QAAc+kB,IACbA,EAAG,aAAa,SAAS,KAAK,EAChC+kB,EAAQtlC,GAAMugB,EAAG,KAAMglB,GAAKA,EAAE,EAAE,EACvBhlB,EAAG,aAAa,SAAS,KAAK,EACvC8kB,EAAQrlC,GAAMugB,EAAG,KAAMglB,GAAKA,EAAE,EAAE,EACvBhlB,EAAG,aAAa,SAAS,MAAM,IACxC6kB,EAASplC,GAAMugB,EAAG,KAAMglB,GAAKA,EAAE,EAAE,EACnC,CACD,EAED,MAAMpd,EAAO3sB,EAAK,GAAG,QAAQ,MAAM,GAAG,EAChCgqC,EAAqBrd,EAAK,QAAQ,eAAe,EACjDsd,EAAuBtd,EAAK,QAAQ,cAAc,EAElDud,EAAO,GACb,cAAO,KAAKN,CAAM,EAAE,QAAa7xC,IAC/B,GAAI,IAAI,KAAKA,CAAC,EAAE,UAAY4xC,EAAS,CACnC,MAAM1/B,EAAM,CACV,KAAK,cACD9W,EAAM4E,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,EACzB5E,EAAM4E,CAAC,EAAE,OAAO,GAAG,EACvB+xC,EAAM/xC,GAAK,KAAK,gBAAgB,OAAO+xC,EAAM/xC,GAAG,EAAE,EAAI,GACtD6xC,EAAO7xC,GAAK,KAAK,gBAAgB,OAAO6xC,EAAO7xC,GAAG,EAAE,EAAI,GACxD8xC,EAAM9xC,GAAK,KAAK,gBAAgB,OAAO8xC,EAAM9xC,GAAG,EAAE,EAAI,IAGxD,GAAIiyC,IAAuB,GAAI,CAC7B,MAAMG,EACJ,KAAK,cAAcP,EAAO7xC,GAAGiyC,KAC7B,KAAK,cAAc,QACrB//B,EAAI,KAAKkgC,CAAY,CACvB,CAEIF,IAAyB,IACvBhgC,OAAK2/B,EAAO7xC,GAAGkyC,EAAqB,EAG1CC,EAAK,KAAKjgC,CAAG,CACf,EACD,EACMigC,CACT,CAEA,SAASlqC,EAAM2pC,EAAS,CACtB,MAAMhd,EAAO3sB,EAAK,GAAG,QAAQ,MAAM,GAAG,EAEhCgqC,EAAqBrd,EAAK,QAAQ,eAAe,EACjDsd,EAAuBtd,EAAK,QAAQ,cAAc,EAElDud,EAAO,GACb,eAAQ,KAAK,wBAAwB,EAChClqC,KAAG,KAAK,QAAgB9D,IAC3B,MAAMkuC,EAAS,IAAI,KAAKluC,EAAK,EAAE,EAAE,UACjC,GAAIkuC,EAAST,EAAS,CACpB,MAAM1/B,EAAM,CACV,KAAK,cACD9W,EAAMi3C,CAAM,EAAE,IAAI,EAAE,OAAO,MAAM,EACjCj3C,EAAMi3C,CAAM,EAAE,OAAO,MAAM,EAC/BluC,EAAK,KAAO,KAAO,GAAK,KAAK,gBAAgB,OAAOA,EAAK,EAAE,GAG7D,GAAI8tC,IAAuB,GAAI,CAC7B,MAAMG,EACJ,KAAK,cAAcjuC,EAAK8tC,KACxB,KAAK,cAAc,QACrB//B,EAAI,KAAKkgC,CAAY,CACvB,CAEIF,IAAyB,IACvBhgC,OAAK/N,EAAK+tC,EAAqB,EAErCC,EAAK,KAAKjgC,CAAG,CACf,EACD,EACD,QAAQ,QAAQ,wBAAwB,EACjCigC,CACT,CAEA,oBACEG,EACAzb,EACA7jB,EACQ,CACR,IAAIu/B,EAOC,KAAK,QAAQ,KAAK,OAAepuC,GAChCA,EAAK,oBAAsB0yB,EACtB,GAESyb,EAAKzb,GAEd1yB,EAAK,KAAK,SAASmuC,EAAKzb,EAAU,EAEvC,MAAM,QAAQyb,CAAI,EACbA,EACJ,IAAS7yC,KAAK,KAAK,SAASA,CAAC,CAAC,EAC9B,OAAO,CAACyN,EAAMslC,IAAStlC,GAAQslC,CAAI,EAEjCruC,EAAK,KAAK,SAASmuC,CAAI,CAC/B,EAUG,OARAC,EAAQ,OAAS,IACnBA,EAAUA,EAAQ,OAAOD,GACvBt/B,IAAW,MACPs/B,EAAK,KAAK,SAAS,KAAK,GAAKA,EAAK,KAAK,SAAS,MAAM,EACtDA,EAAK,KAAK,SAASt/B,CAAM,IAI7Bu/B,EAAQ,OAAS,EACZ,KAGF,KAAK,IAAI,QAAQ,IAAIA,EAAQ,GAAG,MAAM,CAC/C,CAEA,MAAM,SAASnlB,EAAK,SACZ,QAASA,EAAI,OAAO,WACpB,CAAE,SAAQ,OAAM,OAAM,YAAW,EAAIA,EAAI,OAAO,OAChD,CAAE,YAAW,OAAM,EAAIA,EAAI,OAAO,MAElCa,EACJb,EAAI,OAAO,OAAO,cAAgBA,EAAI,OAAO,MAAM,aACrD,GAAItJ,IAAS,OAAQ,CACnB,MAAM2uB,EAAS,KAAK,oBAAoBH,EAAMzb,EAAW7jB,CAAM,EAC3Dy/B,GACF,OAAO,KAAKA,CAAM,CAEtB,CACA,MAAMC,EAAW7kC,EACf,OAAOykC,GAAS,SACZ,KAAK,QAAQA,EAAKzb,GAAYA,CAAS,EACvC,KAAK,QAAQyb,EAAMzb,CAAS,GAE9B,MAAY/S,IAAS,OAAQ,CAC/B,IAAI6uB,EAAS,MAAM,KAAK,IAAI,UAAUD,EAAS,IAAI,EAInD,GAHIzkB,GAAenK,IAAS,QAC1B6uB,EAASA,EAAO,OAAexuC,KAAK,eAAiB8pB,CAAW,GAE9D0kB,EAAO,IAAMA,EAAO,GAAG,KAAK,GAAI,CAClC,MAAMC,EAAS,CAAE,GAAG,KAAK,QAAS,GAAGD,EAAO,IAC5CC,EAAO,SAAWx3C,EAAM,EAAE,GAAG,EAAE,OAAO,MAAM,EAC5Cw3C,EAAO,WAAavF,EACpB,MAAMuE,EACJxoB,IAAW,MACP,KACAhuB,IAAQ,GAAK,WAASA,EAAM,SAASguB,CAAM,CAAC,EAAE,QAAQ,EACtDnhB,EACJ6b,IAAS,OAAS6uB,EAAO,OAAS,EAC9B,KAAK,aAAaA,EAAQf,CAAO,EACjC,KAAK,SAASe,EAAQf,CAAO,EAE5BgB,QAAOjzC,IAAK,KAAL,cAAU,GACjBizC,MAAKnnC,IAAKxD,CAAI,IAAT,cAAa,GACnB,QAAW,KAAK,SAClB,GAAGsH,EAAS,KAAK,SAAUqjC,CAAM,KAAK,KAAK,UAAUxpB,CAAM,IAC3D,GAAGhuB,EAAQ,OAAK,OAAO,GAAG,KACxB,KAAK,QAAQ,oBACX6K,KAAS,KAAK,UAAUmjB,CAAM,IAChCypB,EAAW,KAAK,SAAS,IAAY1uC,IACzC,KAAK,SAASA,IAAS,KAAK,KAAK,EAAE,SAASA,GAAM,EAClD,KAAK,SAASA,IAASyuC,EAAOzuC,GAC/B,EAEK2uC,EACJhvB,IAAS,OAAS6uB,EAAO,OAAS,EAC9B,CAAC,KAAK,oBAAoB,EAC1B,CAAC,KAAK,gBAAgB,EAE5B,GAAI3/B,IAAW,MACbo+B,GACE,CACE,SAAUyB,EAAS,OAAOC,CAAM,EAChC,MACF,EACA,CACE,UACEhvB,IAAS,OAAS6uB,EAAO,OAAS,EAC9B,KAAK,KAAK,EAAE,WAAW,EACvB,KAAK,KAAK,EAAE,UAAU,EAC5B,KAAMvoC,GAASE,CAAQ,CACzB,OAEG,CACD,MAAYuoC,EACb,IAAY1uC,QAAIA,GAAK,KAAK,IAAI,GAAG,EACjC,KAAK;AAAA,CAAM,EACD4uC;AAAA,EAAOD,EACjB,IAAI3uC,IAAQ,GAAGA,GAAK,KAAK,KAAK,YAAY,GAAG,EAC7C,KAAK;AAAA,CAAM,IACD4uC;AAAA,EAAO9qC,EACjB,IAAI9D,IAAQ,GAAGA,GAAK,KAAK,KAAK,YAAY,GAAG,EAC7C,KAAK;AAAA,CAAM,IACDg1B,KAAW/uB,GAASE,CAAQ,CAAC,CAC5C,CACF,CACF,CACF,CACF,EA9fqBknC,GAKZ,OAAS1zC;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IALG0zC,GAArBzzC,IADCE,EAAc,sBAAsB,GAChBuzC,yMCVrB,IAAqBwB,GAArB,cAAqC9yC,EACnC3C,EACAuK,GACA5D,GACA,CAACxH,EAAW,CAAEV,OAAK,CACrB,CAAE,CALF,kCAME,SAAM6S,GAAc,CA8BpB,aAAazL,EAAU,SACrB,MAAMI,EAASL,GAAyBC,EAAU,CAAC,SAAS,CAAC,EAE7D,KAAK,SAAUqI,IAAO,UAAP,QAAkB9L,IAAO,UAAP,cAAgB,QAC3C,MAAE,eAAc,EAAI6D,EAAO,QACjC,KAAK,cACHyvC,IAAkB,OAAY,OAASzvC,EAAO,QAAQ,cACnD,UAAOA,EAAO,QAAQ,MAAQ,OAC9B,cAAWA,EAAO,QAAQ,UAAY,IAC7C,CAEA,YAAa,CACJ;AAAA5F;AAAAA,aAEE,KAAK,WAAW,KAAK,iBAAiB,KAAK,WAAW,KAAK;AAAA,eAEtE,CAGA,WAAY,CACL,cAAW,KAAK,UAAY,GAC5B,mBAAgB,KAAK,eAAiB,GAE3C,MAAMs1C,EAAU,IAAI,IAClB,GAAG,KAAK,WAAW,KAAK,iBAAiB,KAAK,WAAW,KAAK,OAC9D,OAAO,SAAS,MAChB,OACK;AAAAt1C;AAAAA,0CAE+Bs1C;AAAA,eAExC,CAGA,QAAS,CAEP,OAAO,KAAK,OAAS,MAAQ,KAAK,YAAc,KAAK,YACvD,CACF,EA1EqBF,GAQZ,OAASl1C;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IAqBhBC,IADCC,EAAS,CAAE,KAAM,OAAQ,GA5BPg1C,GA6BnB,uBAGAj1C,IADCC,EAAS,CAAE,KAAM,OAAQ,GA/BPg1C,GAgCnB,oBAhCmBA,GAArBj1C,IADCE,EAAc,UAAU,GACJ+0C,yMCDrB,IAAqBG,GAArB,cAAsCjzC,EAAI3C,EAAY,CACpD+nB,GACA,CAAE,eAAgB,WAAY,SAAU,WAAY,aAAc,EAAG,CACvE,CAAC,CAAE,CAiCD,aAAc,CACN,QAWI,kBAVV,KAAK,IAAMzW,IACX,KAAK,KAAO,EACd,CAEA,WAAW,YAAa,CACf,OACL,KAAM,CAAE,KAAM,KAAM,EAExB,CAIA,IAAI,UAAW,CACb,OAAO,KAAK,SACd,CAEA,IAAI,SAAS/L,EAAO,CAClB,KAAK,UAAYA,EACjB,KAAK,cAAc,CACrB,CAIA,MAAM,aAAaM,EAAU,OAC3B,MAAMI,EAASL,GAAyBC,EAAU,CAAC,SAAS,CAAC,EAC7D,KAAK,QAAUI,EAAO,QAEjB,iBAAY7D,IAAO,UAAP,cAAgB,YAAa,YAE9C,KAAK,UAAU,CACjB,CAGA,MAAM,WAAY,CACV,QAAM,MAAM,KAAK,IAAI,aACzB,IAAI,KAAK,uBACT,OACA,IAIF,KAAK,KAAOutB,GACVthB,GAAOsX,EAAI,OAAarN,IAEpB,KAAE,YAAc,mBAChBA,EAAE,KAAO,KAAK,SACdA,EAAE,QACF,CACA,MAAMu9B,EAAYv9B,EAAE,KAAK,MAAM,GAAG,EAChC,cAAOu9B,EAAUA,EAAU,OAAS,GACpCv9B,WAAW2N,EAAK4vB,CAAS,EAC3Bv9B,EAAE,MAAQza,EAAMya,EAAE,KAAM,cAAc,EAAE,OAAO,MAAM,EAC9C,EACT,CACO,SACR,EACD,OACA,QAEF,KAAK,cAAc,CACrB,CAEA,SAAU,SAERlW,OAAK,OAAL,cAAW,QAAS,GAClB,KAAK,eAAe,CAClB,OAAQ,CACN,eAAgB,CAAE,MAAO,KAAK,KAAK,GAAG,IAAK,CAC7C,EACD,CACL,CAEA,OAAO2yC,EAAM,CACX,MAAO,GAAG,KAAK,IAAI,YAAY,KAAK,aAAa,KAAK,WAAWA,GACnE,CAEA,eAAetuC,EAAG,CAIV,QAAS,GAAG,KAAK,IAAI,YAAY,KAAK,aAAa,KAAK,WAAWA,EAAE,OAAO,eAAe,mBACjG,KAAK,WAAW,cACd,eACF,EAAE,IAAM,gCACN,IAAI,IAAIqvC,EAAQ,OAAO,SAAS,MAAM,EAAE,MAE5C,CAEA,QAAS,CAEP,OAAO,KAAK,KACRz1C;AAAAA;AAAAA,mCAE2B,KAAK;AAAA,gBACxB,KAAK,KAAK,IACVuG,GACEvG,uBAA0BuG,EAAK;AAAA,uBAC1BA,EAAK,MAAM,QAAQ,OAAQ,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAS5CvG,wBACN,CACF,EAlJqBu1C,GAKZ,OAASr1C;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IALGq1C,GAArBp1C,IADCE,EAAc,WAAW,GACLk1C,yMCDrB,IAAqBG,GAArB,cAAyCpzC,EAAI3C,EAAY,CACvD+nB,GACA,CAAE,eAAgB,WAAY,SAAU,WAAY,aAAc,EAAG,CACvE,CAAC,CAAE,CAiCD,aAAc,CACN,QASI,kBARV,KAAK,IAAMzW,IACX,KAAK,KAAO,EACd,CAEA,WAAW,YAAa,CACtB,MAAO,EACT,CAIA,IAAI,UAAW,CACb,OAAO,KAAK,SACd,CAEA,IAAI,SAAS/L,EAAO,CAClB,KAAK,UAAYA,EACjB,KAAK,cAAc,CACrB,CAIA,MAAM,aAAaM,EAAU,SAC3B,MAAMI,EAASL,GAAyBC,EAAU,CAAC,SAAS,CAAC,EACvDmwC,GAAU9nC,OAAO,UAAP,cAAgB,YAAhB,OAA6B,YACxC,eAAY,GAAG8nC,KAAW/vC,EAAO,UAEtC,KAAK,UAAU,CACjB,CAGA,MAAM,WAAY,CAChB,MAAM0f,EAAM,MAAM,KAAK,IAAI,aAAa,IAAI,KAAK,sBAAsB,EACvE,KAAK,KAAOA,EAAI,KAGhB,KAAK,KAAOtX,GACV,KAAK,KACLiK,GAAKA,EAAE,WAAa,mBACpB,QAAQ,EACV,KAAK,aAAa,KAAK,KAAK,GAAG,IAAI,EACnC,KAAK,cAAc,CACrB,CAEA,OAAOy8B,EAAM,CACX,MAAO,GAAG,KAAK,IAAI,YAAY,KAAK,aAAaA,GACnD,CAEA,aAAakB,EAAK,CAChB,MAAMH,EAAS,GAAG,KAAK,IAAI,YAAY,KAAK,aAAaG,IACzD,KAAK,WAAW,cACd,eACF,EAAE,IAAM,gCACN,IAAI,IAAIH,EAAQ,OAAO,SAAS,MAAM,EAAE,MAE5C,CAEA,eAAervC,EAAG,CAChB,KAAK,aAAaA,EAAE,OAAO,eAAe,KAAK,CACjD,CAEA,QAAS,CAEP,OAAO,KAAK,KACRpG;AAAAA;AAAAA,mCAE2B,KAAK;AAAA,gBACxB,KAAK,KAAK,IACVuG,GACEvG,uBAA0BuG,EAAK;AAAA,uBAC1BA,EAAK,KAAK,QAAQ,OAAQ,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAS3CvG,wBACN,CACF,EAtHqB01C,GAKZ,OAASx1C;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IALGw1C,GAArBv1C,IADCE,EAAc,cAAc,GACRq1C,yMC4BrB,IAAqBG,GAArB,cAAsCvzC,EAAIsG,GAAOC,GAAiB,CAChE/J,EACA,KAAEV,EAAI,CACR,CAAC,CAAE,CAGD,aAAc,CACN,QAENZ,EAAM,OAAO,KAAK,KAAK,SAAS,aAAa,EAC7C,KAAK,SAAW,WACX,SAAM,GAAG,KAAK,0BACnB,KAAK,cAAgB,QACvB,CAEA,WAAW,YAAa,CACf,OACL,SAAU,CAAE,KAAM,MAAO,EACzB,cAAe,CAAE,KAAM,MAAO,EAC9B,QAAS,CAAE,KAAM,MAAO,EAE5B,CAGA,IAAI,KAAM,CACR,OAAOyT,EAAc,CACvB,CAGA,oBAAqB,CACnB,OAAOvJ,GAAY,CACrB,CAEA,aAAc,CACZ,MAAMouC,EAAW50C,EAAS,OAASR,EAAK,WAAa,aAE9C;AAAAV;AAAAA;AAAAA,sBAGW81C;AAAA,qBACI,IAChB,MAAMC,EAAelxC,KACfmxC,EAAkBpxC,GAAiB,UAAQ,SAAU,EAAE,EACvDqxC,EAAc,EAAE,OAAO,MAAM,QAAQ,SAAU,EAAE,EACnD,MAAS,EAAE,OAAO,MAClBD,IAAoBC,IACbC,KAAGA,IACVH,EAAa,OAAO,CAAC,IAAM,IAAM,GAAK,MACrCA,KAELlwC,GAAWqwC,CAAM;AAAA,kBAET,KAAK;;KAGrB,CAEA,eAAgB,CACP;AAAAl2C,gCACqB,KAAK,gBAAkB,UAAY;AAAA,gBACnD,KAAK;AAAA;AAAA;AAAA,8CAGyB,KAAK;AAAA,UACzC,KAAK;;WAGb,CAGA,eAAgB,qBACR,QAAc2H,GAAe,GAAK,GACjC;AAAA3H;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,oBAMS,KAAK;AAAA;AAAA;AAAA,uBAGJ+B,mBAAa,OAAb,cAAmB,OAAQ;AAAA;AAAA;AAAA,yBAGzB8L,mBAAa,OAAb,cAAmB,QAAS;AAAA,uBAC9B+B,mBAAa,OAAb,cAAmB,QAAS;AAAA,uBAC5Buf,mBAAa,OAAb,cAAmB,MAAO;AAAA;AAAA;AAAA,2BAGpBjuB,EAAS,OAASR,EAAK,GAAK,KAAK;;uBAEvCqP,mBAAa,QAAb,cAAoB,OAAQ;AAAA;AAAA;AAAA,yBAG1Bob,mBAAa,QAAb,cAAoB,QAAS;AAAA,uBAC/BwF,mBAAa,QAAb,cAAoB,QAAS;AAAA,uBAC7BvF,mBAAa,QAAb,cAAoB,MAAO;AAAA;AAAA;AAAA;AAAA,KAK9C,CACF,EAtGqByqB,GAIZ,OAAS,CAACjtC,GAAM,OAAQiJ,EAAK,EAJjBgkC,GAArB11C,IADCE,EAAc,YAAY,GACNw1C,yMCpCrB,IAAqBM,GAArB,cAA6Cx2C,CAAW,CACtD,WAAW,QAAS,CACX;AAAAO;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,KA2NT,CAEA,WAAW,YAAa,CACf,OACL,UAAW,CAAE,KAAM,MAAO,EAC1B,aAAc,CAAE,KAAM,KAAM,EAC5B,OAAQ,CAAE,KAAM,OAAQ,EACxB,SAAU,CAAE,KAAM,OAAQ,UAAW,WAAY,EACjD,aAAc,CAAE,KAAM,OAAQ,UAAW,sBAAuB,EAChE,aAAc,CAAE,KAAM,QAAS,UAAW,WAAY,EACtD,SAAU,CAAE,KAAM,QAAS,UAAW,QAAS,EAEnD,CAEA,aAAc,CACN,QACN,KAAK,OAAS,GACd,KAAK,SAAW,GAChB,KAAK,aAAe,EACpB,KAAK,SAAW,GAChB,KAAK,aAAe,EACtB,CAEA,mBAAoB,CACd,MAAM,mBAAmB,MAAM,kBAAkB,EAEjD,KAAK,WAAa,IACpB,KAAK,WACH,SAAS,iBACP,yBACA,KAAK,UAAU,KAAK,IAAI,GAI9B,KAAK,aAAe,KAAK,SACpB,eAAY,KAAK,aAAa,OAAS,EAEvC,WAAQ,MAAM,MAAM,KAAM,CAAE,OAAQ,KAAK,SAAW,GAAE,IACzD,OAAO,KACP,QAEF,KAAK,MAAM,QAEN,oBAAiBF,IAAO,KAAK,MAC/B,IAEGqF,oCAAiCA,qDAC9BA,EAAM,GAAK,WAGjB,KAAK;AAAA,CAAI,IACP,yBAAsBrF,IAAO,KAAK,MACpC,IACCqF,GACE,iCAAiCA,8CAAgDA,YAEpF,KAAK,IAAI;AAAA,qBAEZ,KAAK,2BAA6BrF;AAAAA;AAAAA,MAEhC,KAAK,MACJ,IACCqF,GACE,iCAAiCA,4CAC/BA,EAAM,MAGX,KAAK,IAAI;AAAA;AAAA;AAAA,mEAKZ,KAAK,uBAAyBrF;AAAAA;AAAAA,MAE5B,KAAK,MACJ,IACCqF,GACE,iCAAiCA,4CAC/BA,EAAM,MAGX,KAAK,IAAI;AAAA;AAAA;AAAA,qEAIP,gBAAa,GAAG,KAAK,MAAM,OACvBrF,iDAAoDqF,OAC7D,GACF,CAEA,sBAAuB,CACjB,MAAM,sBAAsB,MAAM,qBAAqB,EAC3D,KAAK,WACH,SAAS,oBACP,yBACA,KAAK,UAAU,KAAK,IAAI,EAE9B,CAEA,UAAU+wC,EAAI,CAER,GADaA,EAAG,OAAO,WACV,KAAK,SAAU,CACxB,MAAE,OAAM,EAAIA,EAAG,OACrB,KAAK,WAAW,cAAc,qBAAqBC,KAAS,EAAE,OAChE,CACF,CAEA,SAASD,EAAI,CACL,QAAeA,EAAG,OAAO,aAAa,KAAK,EAAE,MAAM,GAAG,EAAE,GAC9D,GAAI,KAAK,OAAQ,CACT,QAAQ,IAAI,YAAY,yBAA0B,CACtD,OAAQ,CACN,SAAU,KAAK,GACf,MAAOE,CACT,EACD,EACD,SAAS,cAAcvyC,CAAK,CAC9B,CACF,CAEA,SAAU,CACR,MAAMwyC,EAAa,KAAK,WAAa,GAAK,SAAW,GAqB9C,OApBQv2C;AAAAA,QACX,KAAK,MAAM,IAETqF;AAAArF,qBACWu2C;AAAA,0BACKlxC;AAAA,sBACJ,KAAK;AAAA;AAAA;AAAA,4BAICkxC;AAAA;AAAA,kBAEV,KAAK;AAAA;AAAA;AAAA,2BAGIA;AAAA,sBACL,KAAK,UAAY;AAAA,kBACrB,KAAK;AAAA;AAAA,WAIrB,CAEA,YAAa,CACX,MAAMC,EAAMx2C;AAAAA;AAAAA,UAEN,KAAK,MAAM,IACXqF,GACErF,uBAA0BqF,cAAgB,KAAK;AAAA;AAAA,YAIhD,YAAK,WAAa,GAAK,GAAKmxC,CACrC,CAEA,QAAS,CACA;AAAAx2C;AAAAA,UAED,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA;AAAA;AAAA,UAGL,KAAK,MAAM,IAAWqF,IAClB,MACJ,OAAIA,IAAQ,EACVigB,EAAMtlB,iDAAoDqF,QAEpDigB;AAAAtlB;AAAAA;AAAAA,2BAGSqF;AAAA;AAAA,gBAIVigB,EACR;AAAA;AAAA,YAEG,KAAK,MAAM,IAAIjgB,GAAOrF,QAAW,KAAK,aAAaqF,EAAM,SAAS;AAAA;AAAA;AAAA,UAGpE,KAAK,SAAW,GAAK,KAAK,WAAW;AAAA,UACrC,KAAK,aAAe,GAAK,KAAK,QAAQ;AAAA;AAAA,KAG9C,CACF,EA1ZqB8wC,GAArBh2C,IADCE,EAAc,mBAAmB,GACb81C,yMCKrB,IAAqBM,GAArB,cAAiDn0C,EAC/C3C,EACAkJ,EACF,CAAE,CA+DA,WAAW,YAAa,CACf,OACL,QAAS,CAAE,KAAM,KAAM,EACvB,MAAO,CAAE,KAAM,MAAO,EAE1B,CAEA,IAAI,UAAW,CACb,MAAM8P,EAAc,KAAK,QAAQ,OAAOlB,GAAOA,EAAI,QAAQ,EAC3D,OAAOkB,EAAY,OAASA,EAAY,GAAG,MAAQ,KAAK,QAAQ,GAAG,KACrE,CAEA,QAAS,CACH,OAAC,KAAK,QAAQ,QAGb,WAAQ,KAAK,OAAS,KAAK,SAEzB3Y;AAAAA,QACH,KAAK,QAAQ,IACb,CAAC4Y,EAAQpS,IAAM;AAAAxG;AAAAA;AAAAA,yBAGE4Y,EAAO,QAAU,KAAK,MAAQ,WAAa,MAAM,KAC3D,QAAQ,OACT,IACFpS,EACI,OACA;AAAA;AAAA,wBAEaJ,IACfA,EAAE,MAAQ,SAAW,KAAK,SAASwS,CAAM;AAAA,sBAEjC,IAAM,CACd,KAAK,SAASA,CAAM;AAAA;AAAA;AAAA,iBAIlB7W,mBAAQ,SAAR,cAAgB,IAEd8W;AAAA7Y,6BACW6Y,EAAM,OAAS;AAAA;AAAA,yCAEHA,EAAM,SAC3B,kBAAkBA,EAAM;AAAA;AAAA,sBAEtBA,EAAM;AAAA;AAAA;AAAA,cAIdD,EAAO,KACL,kBAAkBA,EAAO,MAAQ,iBACjC;AAAA,kCACkBA,EAAO;AAAA;AAAA;AAAA,OAvC5B5Y,GA4CX,CAEA,SAAS4Y,EAAQ,CACX,KAAK,QAAUA,EAAO,QACxB,KAAK,MAAQA,EAAO,MACf,mBACH,IAAI,YAAY,UAAW,CACzB,OAAQ,CAAE,MAAOA,EAAO,MAAO,QAASA,CAAO,EAChD,GAGP,CACF,EAxIqB69B,GAIZ,OAASv2C;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IAJGu2C,GAArBt2C,IADCE,EAAc,wBAAwB,GAClBo2C,yMCMrB,IAAqBC,GAArB,cAA0Cp0C,EACxC6O,GACA+F,GACA1C,GACA8C,GACAc,GACA,CAACtZ,EAAW,CAAEV,OAAK,CACrB,CAAE,CACA,WAAW,QAAS,CACX,OACL,MAAM,OACN8B;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,QAqCJ,CACF,EAjDqBw2C,GAArBv2C,IADCE,EAAc,iBAAiB,GACXq2C,ICbrB,OAAex2C;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,ECAR,MAAMy2C,EAAU,CACrB,OAAc,iBAAiBC,EAAQC,EAAQpc,EAAiB,CAC9D,MAAMqc,EAAYC,GAChBF,EAAO,IAASlsC,KAAE,IAAI,EACtB8vB,iBAAQ,MAEJ/tB,EAAWkZ,EAAKgxB,EAAO,MAAM,GAAG,CAAC,EAChC,SAAU,SAASlqC,CAAQ,CACpC,CACF,sMC4BA2d,GAAUF,CAAU,EACpB6sB,GAAY7sB,CAAU,EACtBG,GAAiBH,CAAU,EAC3BC,GAAOD,CAAU,EAGjB,IAAqB8sB,GAArB,cAA8C30C,EAC5C3C,EACAuK,GACArB,GACA,CAAC/J,EAAW,CAAEV,OAAK,EACnB,CACEgpB,GACA,CAAE,eAAgB,wBAAyB,UAAW,KAAM,CAC9D,EACA,CACEM,GACA,CACE,eAAgB,kBAChB,SAAU,SACV,aAAc,EAChB,CACF,CACF,CAAE,CAjBF,kCAkBe,kBAED,kBAES,2BAEJ,uBAEA,uBAED,sBAEL,kBAOX,4BAAyB,GAsBb,kBA1BZ,IAAI,gBAAiB,CACZ,yBACT,CAIA,IAAI,uBAAwB,CAC1B,OAAO,KAAK,sBACd,CAEA,IAAI,sBAAsBxiB,EAAO,CAC/B,KAAK,uBAAyBA,EAC9B,KAAK,cAAc,CACrB,CAIA,IAAI,iBAAkB,CACpB,OAAO,KAAK,gBACd,CAEA,IAAI,gBAAgBA,EAAO,CACzB,KAAK,iBAAmBA,EACxB,KAAK,cAAc,CACrB,CAMA,cAAe,CACR,KAAK,YACH,qBAAkB,YAAY,IAAM,CACvC,KAAK,UAAU,GACd,GAAM,GAEJ,cAAO,KAAM,KAAK,OAAO,GAE9B,KAAK,WAAW,KAAK,UAAU,SAAS,WAAW,GACnD,KAAK,aAEL,KAAK,UAAY,IAEd,qBAAkB,IAAI,KAAK,aAC9B,KAAK,KAAK,SACV,KAAK,cAAgB,CAAC,GAExB,KAAK,IAAM+L,IACX,KAAK,UAAU,CACjB,CAEA,MAAM,aAAazL,EAAU,CACrB,QAASD,GAAyBC,EAAU,CAChD,YACA,YACA,eACD,EAEM,cAAO,KAAM,KAAK,MAAM,KAAK,UAAUI,EAAO,OAAO,CAAC,CAAC,EAC9D,KAAK,UAAYA,EAAO,UACxB,KAAK,QAAUJ,EAAS,MACxB,KAAK,UAAYI,EAAO,SAC1B,CAEA,YAAa,OACX,OAAO,KAAK,sBAAsB,SAAQ7D,OAAK,UAAL,cAAc,UAAU,GAAK,CACzE,CAEA,kBAAmB,CACb,KAAK,sBAAsB,QAAQ,KAAK,QAAQ,UAAU,IAAM,GAClE,KAAK,sBAAwB,CAC3B,GAAG,KAAK,sBACR,KAAK,QAAQ,YAGV,2BAAwB,KAAK,sBAAsB,OACtDsN,GAAMA,IAAO,KAAK,QAAQ,WAGhC,CAEA,eAAgB,OACP,YAAK,IACR,GAAG,OAAO,SAAS,SAAS,OAAO,SAAS,SAAS,QACnD,SACA,EACF,yBACE,KAAK,QAAQ,oDAC2B,oBACxCtN,OAAK,UAAL,cAAc,IAChB,YAAY,KAAK,kBACjB,EACN,CAEA,mBAAoB,CACd,MAAM,mBAAmB,MAAM,kBAAkB,EAEjD,MACG,wBAAiB,SAAU,IAAM,CACtC,OAAO,aAAam1C,CAAM,EAC1BA,EAAS,WAAW,IAAM,CACnB,YAAS,KAAK,MAAM,OAAO,GAC/B,GAAG,EACP,CACH,CAEA,UAAU7xC,EAAK,CACb,OAA4BA,GAAQ,MAAQA,IAAQ,IAAM,OAAO,MAAMA,CAAG,EACtE,GACA,KAAK,gBAAgB,OAAOA,CAAG,CACrC,CAEA,IAAI,cAAe,CACV,OACL,CACE,MAAO,YACP,MAAO,KAAK,gBAAkB,KAAK,KAAK,EAAE,WAAW,EACrD,SAAU,GACV,SAAU,EACZ,EACA,CACE,MAAO,QACP,MAAO,KAAK,YAAc,KAAK,KAAK,EAAE,UAAU,EAChD,SAAU,EACZ,EAEJ,CAEA,aAAc,CACR4kB,GAAU,KAAK,KAAK,SAAS,UAAU,EAAG,CAAC,IAC7C,KAAK,WAAW,WAAW,CACzB,KAAMA,GAAU,KAAK,KAAK,SAAS,UAAU,EAAG,CAAC,GAClD,EAEE,WAAQ,KAAK,WAAW,MAC3B,KAAK,WAAW,cAAc,aAAa,EAC3C,KAAK,eAAe,EACpB,KAAK,aAAa,KAAK,IAAI,EAE/B,CAEA,aAAaktB,EAAO,CACZ,QAAI,IAAI,YAAY,OAAQ,CAChC,OAAQA,EACT,EACD,KAAK,cAAc,CAAC,CACtB,CAEA,QAAQp+B,EAAmB,CACrBA,EAAkB,IAAI,WAAW,IACnC,KAAK,QAAU,KACf,KAAK,UAAU,GAEb,KAAK,OACP,KAAK,MAAM,QAEf,CAEA,sBAAuB,CACjB,KAAK,QACP,KAAK,MAAM,UACX,KAAK,MAAQ,KAEjB,CAEA,WAAW,YAAa,CACf,OACL,UAAW,CAAE,KAAM,OAAQ,EAC3B,UAAW,CAAE,KAAM,OAAQ,EAC3B,UAAW,CAAE,KAAM,MAAO,EAC1B,QAAS,CAAE,KAAM,MAAO,EAE5B,CAEA,WAAWyS,EAAQsJ,EAAKK,EAAK,CAC3B,MAAMiiB,EAAMlqC,EAAK,KAAK,OAAQ,CAAE,MAAOse,EAAQ,EAC/C,IAAI6rB,EAAOviB,EACPwiB,EAAOniB,EAYX,IAXIiiB,EAAI,cACCC,KAAQ75C,IAAQ,KAAK,QAAQ,MAAM,EAAE,UACrC85C,KAAQ95C,EAAM,KAAK,SAAS,GAAG,EAAE,KAAK,UAC7C,KAAK,WACF,cAAc,eAAe,EAC7B,UAAU,OAAO,YAAY,GAEhC,KAAK,WACF,cAAc,eAAe,EAC7B,UAAU,IAAI,YAAY,EAExB,KAAK,MAAM,OAAO,OAAS,GAChC,KAAK,MAAM,OAAO,GAAG,OAAO,EAAK,EAG/B,QAAK,MAAM45C,EAAI,MAAO,CACpB5rB,IAAW,QACN6rB,IAAM,KAAK,MAAMD,EAAI,MAAM,GAAG,KAAK,GAAG,EAAE,EAAE,QAAQ,EAClDE,IAAM1xB,EAAK,KAAK,MAAMwxB,EAAI,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,QAAQ,GAExD,QACJC,GAAQ75C,EAAM85C,CAAI,EAAE,SAAS95C,EAAM,SAASguB,CAAM,CAAC,EAAE,QAAQ,EACzD+rB,EAAUD,GAAQ95C,EAAQ,OAAK,UAC/Bg6C,EAAQ,KAAK,MAAM,IAAI,WAAW,EACxC,KAAK,MAAM,UAYXA,EAAM,YAAYxD,EAASuD,EAAS,GAAO,EAAK,EAE5CH,EAAI,aACN,KAAK,WAAaA,EAAI,WACjB,WAAM,IAAI,WAAW,EAAE,SAAS,CAAE,KAAMA,EAAI,UAAW,EAAG,EAAK,GAGjE,WAAM,IAAI,UAAU,EAAE,OAAO,CAAE,QAAS,CAACA,EAAI,aAAc,EAAG,EAAK,EAElE,QAAaA,EAAI,YAAc,iBACjC,MAAKlqC,EAAK,KAAK,MAAMkqC,EAAI,MAAO,CAAE,aAAcA,EAAI,EAAI,GAG5D,GAFAhoB,EAAKA,GAAM,KAAK,MAAMgoB,EAAI,MAAM,GAG9B,KAAK,gBACLhoB,EAAG,QAAQ,QAAQ,wBAAwB,EAAI,GAC/C,CACM,MAAE,SAAY,IACdqoB,EAAan/B,EAAQ,QAAQ,OAAO,EACpCo/B,EAAWp/B,EAAQ,QAAQ,wBAAwB,EACtD8W,OAAK,QAAgB7oB,IAClBA,EAAKmxC,GAAY,KAAK,iBACxBnxC,EAAKkxC,GAAc,KACrB,CACD,CACH,CACA,MAAM1C,EAAS,KAAK,iBAAiB3lB,EAAG,KAAM4kB,EAASuD,CAAO,EACxDI,EAAU5C,EACV6C,EAAYtoB,GAAQylB,EAAQ,IAAK,CAAC,MAAM,CAAC,EAAE,IAAaxuC,KAC5D,UAAW/I,EAAM+I,EAAK,CAAC,EACpB,GACA,SAAO6wC,EAAI,iBAAmB,MAAM,EACvC,MAAO,KAAK,UAAU7wC,EAAK,CAAC,CAC5B,IACI+0B,EAAQ,KAAK,WAAW,eAAe,WAAW,EACxDA,EAAM,QAAU,KAAK,aAEhB,sBAAmBA,EAAM,KAAOsc,EACrCtc,EAAM,KAAO,KAAK,iBAGd,KAAK,gBACF,kBAAaqc,EAASE,CAAU,EAIvC,KAAK,MAAM,UACT,CACE,KAAM9C,EACN,KAAMqC,EAAI,SAAW,KAAK,gBAC1B,GAAI,OACJ,MAAO,UACP,SAAU,GACV,OAAQ,CAAE,QAAS,EAAM,EACzB,QAASxoC,EACP,CACE,cAAe,EACf,YAAa,IAAIwgB,EAAG,gBACpB,YAAayoB,CACf,EACA,KAAK,UACP,CACF,EACA,IAIGT,EAAI,aACP,KAAK,MAAM,UACT,CACE,KAAM,KAAK,oBACThoB,EAAG,KACH4kB,EACAuD,EACAH,EAAI,UACN,EACA,KAAMA,EAAI,UAAY,KAAK,UAAY,KAAK,KAAK,EAAE,UAAU,EAC7D,MAAOA,EAAI,cAAgB,YAAc,WACzC,KAAM,OACN,KAAM,OACN,OAAQ,CAAE,QAAS,EAAM,EACzB,MAAO,iBACP,SAAU,GACV,QAASxoC,EACP,CACE,cAAe,EACf,YAAa,IAAIwgB,EAAG,gBACpB,YAAayoB,CACf,EACA,KAAK,UACP,CACF,EACA,IAGJ,KAAK,MAAM,QACb,CACF,CAEA,iBAAkB,CACT,YAAK,QAAU,EACxB,CAEA,QAAS,CACD,QACJ,KAAK,YAAc,KAAK,QACpBlmC,EAAS,KAAK,WAAY,KAAK,OAAO,EACtC,GACC,sCAAkC,KAAK,UAAY,SAAW;AAAA,6BAC5CmmC;AAAA;AAAA,sBAEF,IACV,gBAAW,EAAE,OAAO,KAAK,EACzB,qBAAkB,EAAE,OAAO;AAAA,sBAEtB,KAAK;mBACR,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAMkB,KAAK,WAAa,GAAK;AAAA,qBAC5C,KAAK,KAAK,EAAE,WAAW;AAAA;AAAA;AAAA;AAAA,qBAIvB,IAAM,CACb,MAAMrhC,EAAQ,KAAK,WAAW,cAAc,iBAAiB,EAC7D,KAAK,WAAW,cACd,kBACA,MAAQ,gBAAgB,KAAK,cAAc,wDACzC,KAAK,oBACP,OAAO,KAAK,KAAK,cAAc,EAAG,QAAQ,EAEtCA,UAAUA,EAAM,KAAK,CAAE,GAAIA,EAAM,KAAK,EAAE;AAAA;AAAA;AAAA,oCAIxB,KAAK,UAAY,GAAK;AAAA,sBACpC,KAAK;AAAA,qBACN,KAAK,aACV,KAAK,KAAK,EAAE,WAAW,EACvB,KAAK,KAAK,EAAE,QAAQ;AAAA,uBACb,KAAK,aAAe,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAYvC,KAAK,KAAK,EAAE,YAAY;AAAA;AAAA,0BAEd,IAAM,CACd,KAAK,WAAW,cAAc,iBAAiB,EAAE,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAalD,IAAM,CACd,OAAO,KAAK,KAAK,cAAc,EAAG,QAAQ;AAAA,uBAEnC,KAAK,KAAK,EAAE,cAAc;AAAA,iBAChC,KAAK,KAAK,EAAE,SAAS;AAAA;AAAA;AAAA,wBAGd,IAAM,CACd7K,GACE,KAAK,WAAW,cAAc,gBAAgB,EAAE,MAClD;AAAA,uBAEO,KAAK,KAAK,EAAE,iBAAiB;AAAA,iBACnC,KAAK,KAAK,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAMd,KAAK,KAAK,EAAE,eAAe;AAAA;AAAA,sBAE1B,KAAK;AAAA;AAAA;AAAA,0CAGe,KAAK,UAAY,GAAK;AAAA;AAAA,uBAEzC,KAAK,KAAK,EAAE,kBAAkB;AAAA;AAAA,qBAEhC,KAAK,KAAK,EAAE,gBAAgB;AAAA;AAAA,qBAE5B,KAAK;AAAA,qBACL,IAAM,CACbA,GACE,KAAK,WACF,cAAc,YAAY,EAC1B,MAAMhE,IAAiB,EACvB,QAAQ,gBAAiB,EAAE,EAChC;AAAA;AAAA;AAAA;AAAA,qBAKO,KAAK,KAAK,EAAE,YAAY;AAAA;AAAA,yBAEpB,KAAK;AAAA,sBACR,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBASJ,KAAK;AAAA;AAAA,cAEd,KAAK,OAAO,IAEVmwC;AAAA/3C,8BACc+3C,EAAK,QAAU;AAAA,2BAClBA,EAAK;AAAA,qBACXA,EAAK;AAAA;AAAA;AAAA;AAAA;AAAA,yCAMe,KAAK,UAAY,GAAK;AAAA;AAAA;AAAA,wBAGvC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAO3B,CAIA,IAAI,QAAS,CACX,GAAI,KAAK,SAAU,CACb,MAAMv6C,EAAM,KAAK,SAAS,GAAG,EAAE,GAAK,MAAI,MAAM,EAC5C,QAAMA,EAAM,KAAK,SAAS,GAAG,EAAE,GAAK,MAAI,MAAM,EAC9Cw6C,EAAQ,CAAC,CAAE,MAAO,MAAO,MAAO,KAAK,KAAK,EAAE,aAAa,CAAG,GAClE,KAAO7iB,GAAOL,GACNkjB,OAAK,CAAE,MAAO7iB,EAAK,MAAOA,EAAI,WAAY,EACzCA,KAEF,QACT,CACO,OAAC,CAAE,MAAO,MAAO,MAAO,KAAK,KAAK,EAAE,aAAa,EAAG,CAC7D,CAEA,kBAAkB/uB,EAAG,CACnB,KAAM,CAAE,OAAU,IAAE,OAAO,eACrB0uB,EACJ5vB,GAASA,IAAU,MACf1H,EAAM0H,EAAO,MAAM,EAAE,GAAK,UAAQ,MAAM,EACxC1H,IAAQ,KAAK,QAAQ,MAAM,EAC3B23B,EACJjwB,GAASA,IAAU,MACf1H,EAAM0H,EAAO,MAAM,EAAE,KAAK,MAAM,MAAM,EACtC1H,IAAQ,KACd,KAAK,WAAW,MAAOs3B,EAAI,UAAWK,EAAI,SAAS,CACrD,CAEA,WAAY,CACV,KAAK,WAAW,cAAc,gBAAgB,EAAE,UAAU,OAAO,QAAQ,EACzE,KAAK,WACF,cAAc,sBAAsB,EACpC,UAAU,OAAO,YAAY,EAC3B,eAAY,CAAC,KAAK,UAClB,YAAS,KAAK,MAAM,OAAO,CAClC,CAEA,eAAgB,CACd,KAAK,MAAM,OACT,CACE,UAAW,CACT,aAAc,CACZ,MAAO,CACL,KAAM,KAAK,WACPxjB,EAAS,KAAK,WAAY,KAAK,OAAO,EACtC,EACN,EACA,SAAU,CACR,KAAM,GAAG,KAAK,KAAK,EAAE,YAAY,MAC/B,KAAK,QAAQ,gBACT,KAAK,KAAK,EAAE,YAAY,KAAKnU,IAChC,GAAG,EACH,OAAO,MAAM;AAAA,cAChBA,EAAM,KAAK,MAAM,MAAM,GAAG,GAAG,EAAE,OAAO,GAAG,OAAOA,EAC9C,KAAK,MAAM,MAAM,GAAG,GAEnB,KACA,SAAO,GAAG,GACf,CACF,EACA,SAAU,GAAG,KAAK,mBAAmB,KAAK,QAAQ,gBAChD,KAAK,QAAQ,cACXA,EAAM,EAAE,KAAK,OAAO,UAAU,IAClC,uBAAwB,GACxB,QAAS,CACP,cAAe,CACb,QAAS,EACX,CACF,EACA,YAAa,KACb,aAAc,IACd,MAAO,CACT,CACF,EACA,IAEF,KAAK,MAAM,kBACb,CAEA,MAAM,WAAY,UAChBuE,OAAK,QAAL,QAAY,UACZ,KAAK,MAAQ,KACb,MAAMk2C,EAAS,GACV,aAAU,KAAK,SAAY,MAAM,KAAK,IAAI,WAAW,KAAK,SAAS,EACxE,MAAM,QAAQ,IACZ,KAAK,QAAQ,WACV,OAEG7oB,KAAG,oBAAsB,KAAK,oBAC7B,CAAC,KAAK,0BACLunB,GAAU,iBAAiBvnB,EAAG,KAAM,KAAK,OAAQ,KAAK,MAAM,IAEjE,IAAI,MAAMA,GAAM,CACf6oB,EAAOryB,EAAKwJ,EAAG,KAAK,MAAM,GAAG,CAAC,GAAK,MAAM,KAAK,IAAI,UAAUA,EAAG,IAAI,EACpE,GAEL,KAAK,MAAQ6oB,EACb,MAAMC,EAAUhrC,EAAK,KAAK,OAAQ,CAAE,MAAO,MAAO,EAClD,GAAIgrC,GAAW,KAAK,MAAMA,EAAQ,MAAO,CACvC,MAAMnD,EAAS,KAAK,MAAMmD,EAAQ,MAAM,GAAG,KACvCnD,GAAUA,EAAO,KACnB,KAAK,SAAW,CACd,IAAKnvB,EAAKmvB,CAAM,EAAE,GAClB,IAAKA,EAAO,GAAG,IAGrB,CACA,GAAI,KAAK,QAAS,CAChB,KAAK,YAAY,EACjB,IAAIlT,GACFh0B,IAAK,KAAK,OAAQ,CAAE,WAAY,KAAK,SAAW,KAAhD,OACAX,EAAK,KAAK,OAAQ,CAAE,SAAU,GAAM,EACtC20B,EAAW,KAAK,iBAAmBA,EAAS,OAAS,KAAK,OAAO,GAAG,MAE/D30B,EAAK,KAAK,OAAQ,CAAE,OAAQ20B,EAAU,IAC9BA,OAAK,OAAO,GAAG,OAGvBA,IACQA,OAAK,OAAO,GAAG,OAE5B,KAAK,gBAAkBA,EACvB,KAAK,WAAWA,CAAQ,EAExB,KAAK,cAAc,CACrB,CACA,OAAO,KAAK,KACd,CAGA,iBAAiBx3B,EAAM2pC,EAASuD,EAAS,CACvC,MAAM5c,EAAS,GACf,SAAK,QAAcwd,IACjB,MAAM/oB,EAAK,IAAI,KAAK+oB,EAAG,EAAE,EAAE,UACvB,KAAKnE,GAAW5kB,EAAKmoB,EAAS,CAChC,MAAMa,EAAK,CACT,EAAGhpB,EACH,EAAG+oB,EAAG,GACN,MAAO,UACP,IAAK,QAGF,KAAK,iBACRC,EAAG,IAAMD,EAAG,GAAK,KAAK,MAAMA,EAAG,EAAE,EAAI,OACjCC,EAAG,IAAM,MACXA,EAAG,MAAQ,CACT,QAAS,CACP,KAAM,oCACN,MAAO,UACP,MAAO,EACP,OAAQ,CACV,GAEFA,EAAG,YAAc,YAGrBzd,EAAO,KAAKyd,CAAE,CAChB,EACD,EACMzd,CACT,CAGA,oBAAoBtwB,EAAM2pC,EAASuD,EAASc,EAAY,CACtD,IAAIre,EAAM,EACV,MAAMW,EAAS,GACf,SAAK,QAAcwd,IACX,QAAK36C,EAAM26C,EAAG,EAAE,EAChBG,EAAOlpB,EAAG,UACZkpB,GAAQtE,GAAWsE,GAAQf,IACzBc,GAAcA,IAAejpB,EAAG,OAAO,OAAO,IAC1C4K,KAEDW,OAAK,CAAC2d,EAAMH,EAAG,KAAO,KAAO,KAAQne,GAAOme,EAAG,EAAG,CAAC,EAC5D,CACD,EACMxd,CACT,CAEA,oBAAqB,CACnB,MAAM2S,EAAO,KA0GN,MAzGc,CACnB,MAAO,CACL,UAAW,GACX,KAAM,SACN,UAAW,OACX,SAAU,KAAK,SACf,QAAS,CACP,QAAS,EACX,CACF,EAEA,OAAQ,CAAC,EACT,YAAa,CACX,OAAQ,CACN,aAAc,EACd,WAAY,CACV,QAAS,GACT,WAAY,CAEV,MAAMiL,EAAQ,KAAK,MAAM,IAAM,IAAM,MAAQ,iBACvClzC,EAEJ,KAAK,MAAM,MAAQ,IACf,OACA,KAAK,MAAM,IACX,GAAG,KAAK,MAAM,OACd,GACN,OAAOioC,EAAK,aACR,uBAAuBiL,MAAUlzC,YACjC,EACN,CACF,CACF,EACA,OAAQ,CACN,UAAW,GACX,aAAcnE,EAAS,OAASR,GAAM,CAAC,KAAK,UAC5C,OAAQ,CACN,SAAU,CACR,QAAS,CACX,CACF,CACF,CACF,EACA,MAAO,CACLkO,EACE,CACE,QAAS,EACT,IAAK,EACL,cAAe,GACf,GAAI,YACJ,WAAY,CAAC,KAAK,UAClB,WAAY,EACZ,MAAO,CACL,KAAM,KAAK,YAAc,GAAG,KAAK,KAAK,EAAE,QAAQ,QAClD,CACF,EACA,KAAK,QACP,EACAA,EACE,CACE,QAAS,EACT,IAAK,EACL,cAAe,GACf,GAAI,WACJ,WAAY,CAAC,KAAK,UAClB,WAAY,EACZ,SAAU,GACV,MAAO,CACL,KAAM,KAAK,eAAiB,GAAG,KAAK,KAAK,EAAE,UAAU,QACvD,CACF,EACA,KAAK,QACP,EACA,CACE,GAAI,UACJ,OAAQ,CACN,QAAS,EACX,EACA,MAAO,CACL,QAAS,EACX,EACA,cAAe,CACjB,CACF,EACA,MAAO,CACL,CACE,GAAI,YACJ,KAAM,WACN,QAAS,GACT,OAAQ,CACN,WAAY,CACV,OAAO,KAAK,sBAAwB,UAClC,KAAK,iBAAiB,WAAa,OACjC,MAAM,KAAK,KAAK,sBAAsB,KAAK,IAAI,QAC/C,KAAK,KAAK,sBAAsB,KAAK,IAAI,CAC/C,CACF,EACA,IAAK,IAAI,KAAK,EAAE,QAAQ,CAC1B,EACA,CACE,QAAS,GACT,GAAI,WACN,CACF,EAGJ,CAEA,aAAammC,EAAQ8C,EAAY,CAE/B,MAAMW,EAAuB,GAC7BzD,EAAO,QAAa98B,IAClB,MAAMwgC,EAAW,GACjBA,EAAS,EAAIxgC,EAAE,EACfwgC,EAAS,EAAIxgC,EAAE,IACXA,EAAE,KAAKugC,EAAM,KAAKC,CAAQ,EAC/B,EAIGD,EAAM,OAAS,GACjB,KAAK,MAAM,UACT,CACE,KAAMA,EACN,MAAO,UACP,KAAM,KAAK,KAAK,EAAE,UAAU,EAC5B,GAAI,MACJ,MAAO,QACP,SAAU,GACV,OAAQ,CAAE,QAAS,EAAM,EACzB,QAAS,CACP,cAAe,EACf,YAAa,IACb,YAAaX,CACf,EACA,aAAc,GACd,QAAS,EACT,SAAU,EACZ,EACA,GAEN,CAEA,IAAI,eAAgB,CACZ,QAAU,KAAK,QAAU,CAAE,GAAG,KAAK,SAAY,CAAE,QAAS,IAChE,OAAIa,WAAS,OACXA,EAAQ,KAAO/mC,EAAS+mC,EAAQ,KAAM,KAAK,OAAO,GAEhD,KAAK,SAAWx3C,EAAS,OAASR,IAC5Bg4C,WAAWA,EAAQ,gBAAkBA,EAAQ,UAE/CA,UAAU,CAAC,KAAK,UACjBA,CACT,CAEA,gBAAiB,CACT,QAAiB,CAACl7C,EACrB,GACCA,IAAQ,GAAG,EACXA,EAAM,YAAcA,EAAM,YAAY,KAAOA,EAAM,GAAG,MAAM,GAE7D,UAAU,EAwGN,OAvGMoR,EACX,CACE,MAAO,CACL,KAAM,EACR,EACA,SAAU,CACR,KAAM,KAAK,UAAY,GACvB,SAAU,EACZ,EACA,QAAS,KAAK,cACd,UAAW,CACT,aAAc,CACZ,MAAO,CACL,KAAM,KAAK,WACP+C,EAAS,KAAK,WAAY,KAAK,OAAO,EACtC,EACN,EACA,SAAU,CACR,KAAM,GAAG,KAAK,KAAK,EAAE,YAAY,MAC/B,KAAK,QAAQ,gBACT,KAAK,KAAK,EAAE,YAAY,KAAKnU,IAAQ,GAAG,EAAE,OAAO,MAAM,GAC/D,CACF,EACA,SAAU,GAAG,KAAK,mBAAmB,KAAK,QAAQ,gBAChD,KAAK,QAAQ,cACXA,EAAM,EAAE,KAAK,OAAO,iBAAiB,IACzC,uBAAwB,GACxB,YAAa,KACb,aAAc,IACd,MAAO,EACP,QAAS,CACP,cAAe,CACb,QAAS,EACX,CACF,CACF,EACA,YAAa,CACX,OAAQ,CACN,MAAO,CACL,QAAS,EACX,EACA,eAAgB,IAChB,aAAc,GACd,OAAQ,CACN,cAAcuG,EAAO,CACfA,EAAM,QACR,KAAK,KAAK,EAGV,KAAK,KAAK,CAGd,EACA,iBAAkB,CACZ,KAAK,WACF,cAAS,QAAU,CAAC,KAAK,QAElC,EACA,MAAO,CACL,KAAK,MAAM,OAAO,CAChB,QAAS,GACV,CACH,EACA,MAAO,CACL,KAAK,MAAM,OAAO,CAChB,QAAS,GACV,CACH,CACF,CACF,CACF,EACA,OAAQ,CACN,QAAS,KAAK,aAAe,CAAC,KAAK,UACnC,MAAO,OACP,cAAe,EACf,aAAc,EACd,aAAc,GACd,aAAc,GACd,kBAAmB,CACjB,WAAY,OACd,CACF,EACA,QAAS,CACP,OAAQ,KAAK,cACb,MAAO,EACT,EACA,KAAM,CAEJ,mBAAoB,CACX,QACT,CACF,EACA,MAAO,CACL,GAAI,YACJ,SAAU,EACV,MAAO,CACL,KAAM,KAAK,YAAc,KAAK,KAAK,EAAE,UAAU,CACjD,CACF,EACA,OAAQ,CAAC,CACX,EACA,KAAK,mBAAmB,EAG5B,CACF,EAn7BqBkzC,GA6DZ,OAASplC,GA7DGolC,GAArB92C,IADCE,EAAc,qBAAqB,GACf42C,yMCpCR,OAAN,cAAkCA,EAAiB,CAAnD,kCAUO,kBAEZ,cAAe,CACR,qBAAkB,IAAI,KAAK,aAC9B,KAAK,KAAK,SACV,KAAK,cAAgB,CAAC,GAExB,KAAK,cAAc,EACd,qBAAkB,YAAY,IAAM,CACvC,KAAK,UAAU,GACd,GAAM,CACX,CAEA,MAAM,eAAgB,CACpB,KAAK,OAAS,MAAM9vC,GAAW,oBAAqB,CAAE,GACtDwC,GAAK,CAAE,SAAU,KAAK,OAAO,OAAS,GACtC,KAAK,IAAMsH,IACX,KAAK,UAAU,CACjB,CAEA,MAAM,WAAY,CACVzT,SAAO,KAAK,KAAK,QAAQ,EAC/B,MAAMm7C,EAAoBzrC,EAAK,KAAK,OAAO,MAAM,GAAG,SAAU,CAC5D,UAAW,qBACZ,EACK0rC,EAAa1rC,EAAKyrC,EAAkB,SAAU,CAAE,KAAM,KAAK,IAAK,EAClEC,GACK,cAAO,KAAMA,EAAW,OAAO,EAExC,KAAK,gBAAkB,KAAK,OAC5B,KAAK,WAAa,GAClB,KAAK,UAAY,GACjB,MAAM,UAAU,CAClB,CACF,EA1CEz4C,IADCC,EAAS,CAAE,KAAM,OAAQ,GADfy4C,GAEX,mBAGA14C,IADCC,EAAS,CAAE,KAAM,OAAQ,GAJfy4C,GAKX,yBAGA14C,IADCC,EAAS,CAAE,KAAM,OAAQ,GAPfy4C,GAQX,wBARWA,GAAN14C,IADNE,EAAc,yBAAyB,GAC3Bw4C,ICPb,OAAe34C;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,ECCR,MAAM44C,EAAY,CACvB,OAAc,kBACZzuC,EACyB,CACzB,OAAOA,EAAK,IAAS7D,IAAChJ,EAAMgJ,EAAE,EAAE,EAAE,QAAQ,EAAGA,EAAE,EAAE,CAAC,CACpD,CAGA,OAAc,oBAAoBuyC,EAAersC,EAA2B,CACtE,SAAMA,GACD,GACF,QACT,CAMA,OAAc,QAAQqsC,EAAeC,EAAoC,CACvE,IAAIhkC,EACF+jC,EAAMC,EAAY,OAClBD,EACE9oC,EAAMjC,GAAO,OAAO,KAAK+qC,CAAK,EAAQ32C,KAAE,SAAS42C,EAAY,IAAI,CAAC,CAAC,GAIvE,OAAIA,EAAY,eACLhkC,KAAOA,EACdoa,KAAY,aAAa,SAASA,EAAG,YAAY,IAG9Cpa,CACT,CACF,sMCsBA,IAAqBikC,GAArB,cAAwC32C,EACtC3C,EACAuK,GACA,CAACpL,EAAW,CAAEV,OAAK,EACnB,CACEgpB,GACA,CAAE,eAAgB,wBAAyB,UAAW,KAAM,CAC9D,EACA,CACEM,GACA,CACE,eAAgB,kBAChB,SAAU,SACV,aAAc,EAChB,CACF,EACA7e,EACF,CAAE,CA2EA,aAAc,CACN,QArER,aAAU,GAGE,kBAMe,iCAGf,kBAKO,yBAEP,yBAEZ,kBAAe,GAEK,0BAEC,2BAEV,kBAEH,cAIS,4BAEF,0BAEf,yBAAiD,GAOjD,4BAAyB,GAoJzB,kBAAe,IAAY,CACzB,KAAK,cAAc,GA3HnBqwC,GAAY/uB,CAAU,EACtBE,GAAUF,CAAU,EACpBG,GAAiBH,CAAU,EAC3BC,GAAOD,CAAU,EACjBD,GAAKC,CAAU,EACfI,GAAMJ,CAAU,CAClB,CApCA,IAAI,gBAAiB,CACZ,yBACT,CAIA,IAAI,uBAAwB,CAC1B,OAAO,KAAK,sBACd,CAEA,IAAI,sBAAsBjlB,EAAO,CAC/B,KAAK,uBAAyBA,EAC9B,KAAK,cAAc,CACrB,CAEA,IAAI,iBAAkB,CACpB,OAAO,KAAK,gBACd,CAEA,IAAI,gBAAgBA,EAAO,CACzB,KAAK,iBAAmBA,EACxB,KAAK,cAAc,CACrB,CAEA,WAAW,QAAS,CAClB,MAAO,CAAC2M,EAAK,CACf,CAYA,mBAAoB,CACd,MAAM,mBAAmB,MAAM,kBAAkB,EACjD,MACG,wBAAiB,SAAU,IAAM,CACtC,OAAO,aAAaqlC,CAAM,EAC1BA,EAAS,WAAW,IAAM,CACpB,KAAK,QACP,KAAK,MAAM,OAAO,CAChB,OAAQ,KAAK,cACb,QAAS,KAAK,cACf,EACD,KAAK,MAAM,WAEZ,GAAG,EACP,CACH,CAEA,cAAe,CACR,KAAK,YACH,qBAAkB,YAAY,IAAM,CACvC,KAAK,UAAU,GACd,GAAM,GAEJ,cAAO,KAAM,KAAK,OAAO,GAE9B,KAAK,WAAW,KAAK,UAAU,SAAS,WAAW,GACnD,KAAK,aAEL,KAAK,UAAY,IAEnB,KAAK,IAAMjmC,IACN,qBAAkB,IAAI,KAAK,aAC9B,KAAK,KAAK,SACV,KAAK,cAAgB,CAAC,GAEpB,KAAK,KACP,KAAK,UAAU,CAEnB,CAEA,MAAM,aAAazL,EAAU,CACrB,QAASD,GAAyBC,EAAU,CAChD,YACA,YACA,eACD,EACM,cAAO,KAAM,KAAK,MAAM,KAAK,UAAUI,EAAO,OAAO,CAAC,CAAC,EAC9D,KAAK,UAAYA,EAAO,UACxB,KAAK,QAAUJ,EAAS,MACxB,KAAK,UAAYI,EAAO,SAC1B,CAEA,YAAa,OACX,OAAO,KAAK,sBAAsB,SAAQ7D,OAAK,UAAL,cAAc,UAAU,GAAK,CACzE,CAEA,kBAAmB,CACb,KAAK,sBAAsB,QAAQ,KAAK,QAAQ,UAAU,IAAM,GAClE,KAAK,sBAAwB,CAC3B,GAAG,KAAK,sBACR,KAAK,QAAQ,YAGV,2BAAwB,KAAK,sBAAsB,OACtDsN,GAAMA,IAAO,KAAK,QAAQ,WAGhC,CAEA,aAAc,CACP,KAAK,QACJ4a,GAAU,KAAK,KAAK,SAAS,UAAU,EAAG,CAAC,IAC7CE,EAAW,WAAW,CACpB,KAAMF,GAAU,KAAK,KAAK,SAAS,UAAU,EAAG,CAAC,GAClD,EAEE,WAAQ,IAAIE,EAAW,WAC1B,KAAK,WAAW,cAAc,aAAa,EAC3C,KAAK,eAAe,EACpB,KAAK,aAAa,KAAK,IAAI,GAGjC,CAEA,aAAagtB,EAAO,CACZ,QAAI,IAAI,YAAY,OAAQ,CAChC,OAAQA,EACT,EACD,KAAK,cAAc,CAAC,CACtB,CAEA,QAAQp+B,EAAmB,CACrBA,EAAkB,IAAI,WAAW,IAEnC,KAAK,QAAU,KACf,KAAK,UAAU,GAEb,KAAK,OAEP,KAAK,MAAM,QAGf,CAEA,sBAAuB,CACjB,MAAM,sBAAsB,MAAM,qBAAqB,EACpD,2BAAoB,SAAU,KAAK,YAAY,EAClD,KAAK,QACP,KAAK,MAAM,UACX,KAAK,MAAQ,MAEf,cAAc,KAAK,eAAe,CACpC,CAOA,IAAI,eAAgB,CAClB,IAAIogC,EAAgB,CAClB,OAAQ,aACR,MAAO,OACP,cAAe,SACf,aAAc,GACd,iBAAkB,GAClB,aAAcj4C,EAAS,OAASR,EAAK,GAAK,GAC1C,MAAO,MACP,aAAc,EACd,aAAc,GACd,QAAS,CAAC,KAAK,WAGjB,OAAIQ,EAAS,OAASR,GAAMQ,EAAS,YACnBi4C,GACd,OAAQ,WACR,MAAO,OACP,cAAe,MACf,aAAc,GACd,iBAAkB,EAClB,QAAS,CAAC,KAAK,UACf,cAAe,EACf,aAAcj4C,EAAS,OAASR,EAAK,GAAK,GAC1C,MAAOQ,EAAS,OAASR,EAAK,MAAQ,MACtC,aAAc,EACd,aAAc,KAGXy4C,CACT,CAEA,IAAI,eAAgB,CACZ,QAAU,KAAK,QAAU,CAAE,GAAG,KAAK,SAAY,CAAE,QAAS,IAChE,OAAIT,WAAS,OACXA,EAAQ,KAAO/mC,EAAS+mC,EAAQ,KAAM,KAAK,OAAO,GAEhD,KAAK,SAAWx3C,EAAS,OAASR,IAC5Bg4C,WAAWA,EAAQ,gBAAkBA,EAAQ,UAE/CA,UAAU,CAAC,KAAK,UACjBA,CACT,CAGA,2BAA2BtB,EAAK/sC,EAAM2pC,EAASuD,EAAU,IAAU,CACjE,MAAM6B,EAAU,GACZhC,gBAAc,QAAuBiC,IACvC,MAAMjqB,EAAKliB,EAAK7C,EAAM,CAAE,aAAcgvC,EAAa,EAC7CtE,EAAS3mC,GAAQghB,EAAG,KAAMjU,CAAI,EACpCi+B,EAAQhqB,EAAG,cAAgB2lB,EAC5B,EAEK,QAAU7nC,EAAK7C,EAAM,CAAE,aAAc+sC,EAAI,cAAc,GAAI,EAC3DrC,EAAS,GACP,cAAK,QAAcoD,IACnB,SACH36C,EAAM,EAAE,UAAU,EAAIA,IAAQ,KAAK,aAAe,GAAK,IACpD4xB,EAAK+oB,EAAG,GACRG,EAAO,IAAI,KAAKlpB,CAAE,EAAE,QAAY,IAClC,MAAQ4kB,GAAWsE,GAAQf,EAAS,CAChC,QAAM,CAACe,CAAI,EACblB,gBAAc,QAAgB7wC,IAChC,MAAM+yC,EAASF,EAAQ7yC,GACjBlB,EAAMi0C,EAAOlqB,GAAMkqB,EAAOlqB,GAAI,GAAG,GAAK,KAC5C9a,EAAI,KAAKjP,CAAG,EACb,EACD0vC,EAAO,KAAKzgC,CAAG,CACjB,EACD,EACM,CAAE,KAAMygC,EACjB,CAGA,WAAWqC,EAAK/sC,EAAM2pC,EAASuD,EAAU,IAAU,OAC3C,SACH/5C,EAAM,EAAE,UAAU,EAAIA,IAAQ,KAAK,aAAe,GAAK,IACpD+7C,EAAgBlvC,EAAK,GAAG,SAC1BtI,IAAK,KAAL,cAAS,QAAQ,MAAM,KAAK,QAAQ,gBACpC,KACJ,GAAIq1C,EAAI,WAAY,CAClB,MAAMoC,EAAgB,GACtB,SAAI,WAAW,QAAQ,CAACC,EAAOjzC,IAAM,OAC/B,KAAM,kBAAoBizC,EAAM,iBAAkB,CACpDA,EAAM,KAAO,QACP,QAAQvsC,EAAK7C,EAAM,CACvB,aAAcovC,EAAM,iBACrB,EACKvF,EAAQhnC,EAAK7C,EAAM,CACvB,aAAcovC,EAAM,iBACrB,EACKC,EAAStrC,GAAQ+lC,EAAM,KAAMh5B,CAAI,EACjC45B,EAAS,GAETb,OAAK,QAAciE,IACvB,MAAM/oB,EAAK+oB,EAAG,GACRG,EAAO,IAAI,KAAKlpB,CAAE,EAAE,QAAY,IAChC+F,EAAMgjB,EAAG,GACTrjB,EAAM4kB,EAAOtqB,GAAMsqB,EAAOtqB,GAAI,GAAG,GAAK,KACxCkpB,GAAQtE,GAAWsE,GAAQf,GAC7BxC,EAAO,KAAK,CAACuD,EAAMxjB,EAAKK,CAAG,CAAC,CAC9B,CACD,EAEMqkB,OACL5qC,EACE,CACE,KAAMmmC,EACN,GAAI,QAAQvuC,IACZ,KAAM,KAAK,gBACX,MAAO,wBACP,KAAM,YACN,YAAa,GACb,MAAO,YAGP,SAAU,GACV,OAAQ,CACN,QAAS,EACX,EACA,QAAS,CACP,YAAa,IACX2tC,EAAM,gBAAkB,MAAQA,EAAM,cAAgB,KAExD,aAAapyC,OAAK,aAAL,OAAmB,UAClC,CACF,EACA03C,EAAM,OACR,EACF,KACK,CAEL,MAAMrqB,EAAKqqB,EAAM,sBACbvsC,EAAK7C,EAAM,CACT,aAAcovC,EAAM,aACpB,sBAAuBA,EAAM,sBAC9B,EACDvsC,EAAK7C,EAAM,CAAE,aAAcovC,EAAM,aAAc,EAC/CrqB,IACEqqB,EAAM,UACRzF,EACEx2C,EAAM,EAAE,GAAG,EAAE,SAASA,EAAM,SAASi8C,EAAM,OAAO,CAAC,EAAE,UACrDE,GAEGH,OACL5qC,EACE,CACE,QAASwgB,EAAG,QACZ,KAAM,KAAK,iBAAiBA,EAAG,KAAM4kB,EAASuD,EAASnoB,CAAE,EACzD,GAAI,QAAQ5oB,IACZ,KAAM,KAAK,gBACX,MAAO,KAAK,UACZ,MAAO,YACP,SAAU,GACV,OAAQ,CACN,OAAQ,EACR,QAAS,EACX,EACA,QAAS,CACP,gBAAiB,CACR,SAAG,KAAK,OAAO,YAAY,KAAK,KACrC4oB,EAAG,gBAAkB,MAAQA,EAAG,cAAgB,gBAEhDmqB,GAAiBnqB,EAAG,KAAK,KAAK,OAAOmqB,GACjC,oBACEnqB,EAAG,KAAK,KAAK,OAAOmqB,SAEtB,IAER,CACF,CACF,EACAE,EAAM,OACR,GAGN,EACD,EACMD,CACT,CACA,GAAInvC,EAAK,GAAI,CACL,QAAU+sC,EAAI,SAAW,GACzBhoB,EAAK/kB,EAAK,GACT,OACLuE,EACE,CACE,KAAM,KAAK,iBAAiBwgB,EAAG,KAAM4kB,EAASuD,EAASnoB,CAAE,EACzD,GAAI,OACJ,MAAO,UACP,KAAM,KAAK,gBACX,MAAO,YACP,SAAU,GACV,OAAQ,CACN,OAAQ,EACR,QAAS,EACX,EACA,QAAS,CACP,gBAAiB,CACR,SAAG,KAAK,OAAO,YAAY,KAAK,KACrCA,EAAG,gBAAkB,MAAQA,EAAG,cAAgB,gBAEhDmqB,GAAiBnqB,EAAG,KAAK,KAAK,OAAOmqB,GACjC,oBACEnqB,EAAG,KAAK,KAAK,OAAOmqB,SAEtB,IAER,EACA,YAAa,KAAK,WACd,GAAG,KAAK,mBACR,gBACN,CACF,EACA/lC,CACF,EAEJ,CACF,CAGA,iBACEnJ,EAAO,CACP,IAAU,KACVktC,EAAU,IACVqC,EAAa,GACb,CACA,MAAMjf,EAAS,GAETgf,GACHn8C,EAAM,EAAE,UAAU,EAAIA,IAAQ,KAAK,aAAe,GAAK,IAEpDq8C,EAAaD,EAAW,QAC1BA,iBAAY,QAAQ,MAAM,KAAK,QAAQ,gBACvC,KAEJ,SAAK,QAAczB,IACjB,MAAM/oB,EAAK,IAAI,KAAK+oB,EAAG,EAAE,EAAE,QAAY,IACnC,KAAK,aAAa,OAElB/oB,GAAM4kB,GACN5kB,GAAMmoB,GACN,CAAC,KAAK,aAAa,SAASY,EAAG0B,EAAW,GAEnClf,OAAK,CAACvL,EAAI,GAAG+oB,EAAG,MAAM,CAAC,CAAC,CAAC,EAEzB/oB,GAAM4kB,GAAW5kB,GAAMmoB,GACzB5c,OAAK,CAACvL,EAAI,GAAG+oB,EAAG,MAAM,CAAC,CAAC,CAAC,CAClC,CACD,EAEMxd,CAET,CAEA,cAAct1B,EAAK,CACjB,OAA4BA,GAAQ,MAAQA,IAAQ,IAAM,OAAO,MAAMA,CAAG,EACtE,GACA,KAAK,gBAAgB,OAAOA,CAAG,CACrC,CAEA,2BAA4B,CACpB,QAAU,KAAK,MAAM,KAAK,UAEhC,GAAI,CAACy0C,EACH,OAGF,KAAM,CAAE,QAASl0B,EAAKk0B,CAAO,EACvBC,EAAiB1vC,EAAK,GAC5B,GAAI,CAAC0vC,EACH,OAEF,MAAMC,EAAKx8C,EAAMu8C,EAAe,EAAE,EAAE,KAAK,UAEnCvC,EAAQ,KAAK,MAAM,IAAI,WAAW,EACxCA,EAAM,YAAY,CAChB,GAAI,KACJ,OAAQ,EACR,MAAO,OACP,MAAO,EACP,MAAOwC,EACP,MAAO,CAEL,EAAG,EACH,EAAG,KAAK,UAAY,GAAK,IACzB,cAAe,MACf,KAAM,IACR,EACD,EAGD,KAAK,MAAM,UAAU,CACnB,KAAM,KAAK,KAAK,EAAE,UAAU,EAC5B,SAAU,GACV,MAAO,QACP,GAAI,gBACJ,KAAMlB,GAAY,kBAAkBzuC,CAAI,EACxC,OAAQ,CACN,KAAM,IAAM,CACVmtC,EAAM,eAAe,IAAI,CAC3B,EACA,KAAM,IAAM,CACVA,EAAM,YAAY,CAChB,GAAI,KACJ,OAAQ,EACR,MAAO,OACP,MAAO,EACP,MAAOwC,EACP,MAAO,CAEL,EAAG,EACH,EAAG,KAAK,UAAY,GAAK,IACzB,cAAe,MACf,KAAM,IACR,EACD,CACH,CACF,EACD,CACH,CAEA,cAAe,CACP,QAAK,KAAK,MAAM,KAAK,UAC3B,GAAI,CAAC5qB,EACH,OAGG,WAAM,IAAI,WAAW,EAAE,YAAY,KAAM,KAAM,GAAO,EAAK,EAEhE,KAAM,CAAE,OAAM,SAAQ,EAAIA,EAAG,GACvB6qB,EAAW3hC,EAAQ,MAAM,GAAG,EAC5ByhC,EAAiB1vC,EAAK,GAC5B,GAAI,CAAC0vC,EACH,OAEF,MAAMG,EAAS18C,EAAMu8C,EAAe,EAAE,EAAE,KAAK,UAEvCI,EAAU,KAAK,QAAQ,KAAK,SAC9B,OAAO,KAAK,QAAQ,KAAK,QAAQ,EACjC,KACEC,EAAU,KAAK,QAAQ,KAAK,cAC9B,OAAO,KAAK,QAAQ,KAAK,aAAa,EACtC,KAEEC,EAAgB78C,EAAM08C,CAAM,EAAE,KAAK,IAAIE,EAAS,SAAS,EAAE,UAC3DE,EAAY98C,EAAM08C,CAAM,EAAE,KAAK,IAAIC,EAAS,OAAO,EAAE,UAErDI,EAAmB,KAAK,QAAQ,sBAChCC,EAAWP,EAAS,QAAQ,KAAK,EACjCQ,EAAWR,EAAS,QAAQ,KAAK,EACjCS,EAAcT,EAAS,QAAQ,QAAQ,EACvCU,EAAaV,EAAS,QAAQ,OAAO,EACrCW,EAAaX,EAAS,QAAQ,OAAO,EACrCY,EAAgBZ,EAAS,QAAQ,UAAU,EAE3Ca,EAAY,GACZC,EAAc,GACdC,EAAW,GACXC,GAAa,GAEf,OACAC,GACAC,GAEAZ,IAAqB,YAAcA,IAAqB,eAC9Ca,KACAF,OAEZX,IAAqB,YACrBA,IAAqB,iBAETa,KACAF,MAGZX,IAAqB,YACrBA,IAAqB,eAERY,MAEbZ,IAAqB,YACrBA,IAAqB,kBAERY,MAGf9wC,EAAK,QAAeiK,KAClB,MAAM+mC,GAAU79C,EAAM8W,GAAI,EAAE,EAAE,KAAK,UAC/B+mC,GAAUhB,IACRF,GAAWkB,IAAWf,GACxBQ,EAAU,KAAK,CAACO,GAAS/mC,GAAI6mC,GAAW,CAAC,EACzCJ,EAAY,KAAK,CAACM,GAAS/mC,GAAI8mC,IAAY9mC,GAAI4mC,GAAU,CAAC,IAE1DF,EAAS,KAAK,CAACK,GAAS/mC,GAAI6mC,GAAW,CAAC,EACxCF,GAAW,KAAK,CAACI,GAAS/mC,GAAI8mC,IAAY9mC,GAAI4mC,GAAU,CAAC,GAE7D,CACD,EAED,MAAM1D,GAAQ,KAAK,MAAM,IAAI,WAAW,EACpC,KAAK,QAAQ,uBAAyB,MACxCA,GAAM,YAAY,CAChB,GAAI,KACJ,OAAQ,EACR,MAAO,OACP,MAAO,EACP,MAAO0C,EACP,MAAO,CAEL,EAAG,EACH,EAAG,KAAK,UAAY,GAAK,IACzB,cAAe,MACf,KAAM,KAAK,UAAY,MAAQ,mBACjC,EACD,EAIDC,GACA,KAAK,QAAQ,4BAA8B,MAC3C,KAAK,QAAQ,uBAAyB,OAEtC3C,GAAM,YAAY,CAChB,GAAI,QACJ,OAAQ,EACR,MAAO,OACP,MAAO,EACP,MAAO8C,EACP,MAAO,CAEL,EAAG,EACH,EAAG,KAAK,UAAY,GAAK,IACzB,cAAe,MACf,KAAM,KAAK,UAAY,QAAU,OAAOH,YAC1C,EACD,EACD,KAAK,MAAM,UACT,CACE,KAAM,QACN,SAAU,GACV,MAAO,QACP,GAAI,aACJ,UAAW,MACX,KAAMW,EACN,OAAQ,CACN,KAAM,IAAM,CACVtD,GAAM,eAAe,OAAO,CAC9B,EACA,KAAM,IAAM,CACVA,GAAM,YAAY,CAChB,GAAI,QACJ,OAAQ,EACR,MAAO,OACP,MAAO,EACP,MAAO8C,EACP,MAAO,CAEL,EAAG,EACH,EAAG,KAAK,UAAY,GAAK,IACzB,cAAe,MACf,KAAM,KAAK,UAAY,QAAU,OAAOH,YAC1C,EACD,CACH,CACF,CACF,EACA,IAEF,KAAK,MAAM,UACT,CACE,KAAM,0BACN,KAAM,YACN,YAAa,GACb,SAAU,aACV,GAAI,iBACJ,aAAc,GACd,SAAU,GACV,UAAW,MACX,UAAW,wBACX,KAAMY,CACR,EACA,KAIA,KAAK,QAAQ,uBAAyB,OACxC,KAAK,MAAM,UACT,CACE,KAAM,oBACN,KAAM,YACN,YAAa,GACb,GAAI,oBACJ,SAAU,GACV,MAAO,sBACP,aAAc,GACd,UAAW,wBACX,KAAME,GACN,SAAU,eACZ,EACA,IAGF,KAAK,MAAM,UAAU,CACnB,KAAM,aACN,SAAU,GACV,MAAO,QACP,GAAI,gBACJ,KAAMD,EACN,OAAQ,CACN,KAAM,IAAM,CACVxD,GAAM,eAAe,IAAI,CAC3B,EACA,KAAM,IAAM,CACVA,GAAM,YAAY,CAChB,GAAI,KACJ,OAAQ,EACR,MAAO,OACP,MAAO,EACP,MAAO0C,EACP,MAAO,CAEL,EAAG,EACH,EAAG,KAAK,UAAY,GAAK,IACzB,cAAe,MACf,KAAM,KAAK,UAAY,MAAQ,mBACjC,EACD,CACH,CACF,EACD,EAEL,CAEA,0BAA0BnvB,EAAK,CACvB,SACHvtB,EAAM,EAAE,UAAU,EAAIA,IAAQ,KAAK,aAAe,GAAK,IAC1D,OAAKutB,EAGDA,IAAQ,MACHvtB,EAAM,KAAK,SAAS,GAAG,EAAE,GAAG,EAAE,QAAY,IAE/CutB,EAAI,OAAO,CAAC,IAAM,IACbvtB,IAAQ,IAAIA,EAAM,SAASutB,CAAG,CAAC,EAAE,QAAY,IAElDA,IAAQ,QACHvtB,EAAQ,KAAK,WAASA,EAAM,SAASutB,CAAG,CAAC,EAAE,UAAY4uB,GAElD,KAAK,kBACfn8C,IAAQ,MAAM,KAAK,EAAE,GAAG,EACxBA,EAAM,EAAE,GAAG,GACF,SAASA,EAAM,SAASutB,CAAG,CAAC,EAAE,QAAY,IAd9CvtB,EAAM,EAAE,GAAG,EAAE,UAAYm8C,CAepC,CAEA,WAAWnuB,EAAQsJ,EAAKK,EAAK,OACrB,QAAMjoB,EAAK,KAAK,OAAQ,CAAE,MAAOse,CAAO,CAAC,GAAK,KAAK,OAAO,GAC5D4rB,EAAI,aACN,KAAK,WACF,cAAc,eAAe,EAC7B,UAAU,OAAO,YAAY,EAEhC,KAAK,WACF,cAAc,eAAe,EAC7B,UAAU,IAAI,YAAY,EAG7B,KAAK,QAAQ,kBACb,KAAK,QAAQ,mBAAqB,OAElC,KAAK,WACF,cAAc,eAAe,EAC7B,UAAU,IAAI,YAAY,EAE/B,KAAK,MAAM,OACR,UAAcre,EAAI,YAAY,IAAMA,EAAI,YAAY,GAAG,SAAS,MAAM,CAAC,EACvE,WAAeA,EAAI,OAAO,EAAK,CAAC,EACnC,MAAMib,EAAUlf,GAAO,KAAK,0BAA0BtJ,CAAM,EACxD,MAAU2J,GAAO,KAAK,0BAA0B,EACpD,MAAMqiB,EAAQ,KAAK,MAAM,IAAI,WAAW,EA4DxC,GA3DA,KAAK,MAAM,UACPJ,EAAI,aACN,KAAK,WAAaA,EAAI,WACtB,KAAK,WAAW,eAAe,WAAW,EAAE,QAAU,KAAK,cAE7DA,EAAI,YACFA,EAAI,WAAW,QAAchoB,IACvBA,EAAG,UACKmoB,OAAK,0BAA0BnoB,EAAG,OAAO,EACrD,CACD,EAECgoB,EAAI,UACFA,YAAU,QAAckE,IACpB,QAAM,CAAE,GAAGA,GACbC,KAAK,WAAWD,EAAG,KACvBC,EAAI,MAAQ,KAAK,0BAA0BD,EAAG,KAAK,EAC7C9D,uBAAqB+D,EAAI,EAAE,EAC7BD,EAAG,OACDlE,aAAW,KAAK7wC,GAAQA,EAAK,eAAiB+0C,EAAG,MAAM,GACzD9D,EAAM,YAAY+D,CAAG,EAEvB/D,EAAM,YAAY+D,CAAG,CACvB,CACD,EAED/D,EAAM,kBAAkB,QACtB8D,GAAMA,EAAG,GAAG,SAAS,UAAU,GAAK9D,EAAM,eAAe8D,EAAG,EAAE,GAIlE9D,EAAM,eAAe,IAAI,EACzBA,EAAM,eAAe,OAAO,EACxBhsB,IAAW,QACbgsB,EAAM,YAAYxD,EAASx2C,EAAM+5C,CAAO,EAAG,GAAO,EAAK,EAC9C,KAAK,kBACRC,cACJxD,EACA,KAAK,kBAAoBx2C,EAAM+5C,CAAO,EAAE,MAAM,KAAK,EAAI/5C,EAAM+5C,CAAO,EACpE,GACA,IAQAH,EAAI,aACN,KAAK,aAAa,EAIhBA,EAAI,2BACN,KAAK,0BAA0B,EAG5B,WAAM,IAAI,MAAM,GAAK,KAAK,MAAM,IAAI,MAAM,EAAE,OAAO,EAAK,EAEzD0B,GAAY,oBAAoB,KAAK,MAAO1B,EAAI,IAAI,EAAG,CACzD,MAAM3rB,EAAS,KAAK,WAClB2rB,EACA0B,GAAY,QAAQ,KAAK,MAAO1B,CAAG,EACnCpD,EACAuD,GAEG,mBAAex1C,IAAI,eAAJ,OAAoB,KAAK,aACvC,QAAYq1C,EAAI,cAClB,KAAK,2BACHA,EACA0B,GAAY,QAAQ,KAAK,MAAO1B,CAAG,EACnCpD,EACAuD,GAEF,MAAM,QAAQ9rB,CAAM,EACpBA,EAAO,GACPA,EACA+vB,IAGG,sBAAmBlsB,GAAQksB,EAAU,KAAM,CAAC,CAAC,EAAG,CAAC,MAAM,CAAC,EAAE,IACrDj1C,IACN,MAAMw2B,EAAO,GAOb,GANKx2B,UAAQ,CAACwuB,EAAMvuB,IAAM,CACpBA,EAAI,GAAK,OAAOuuB,GAAS,UAC3BgI,EAAK,KAAK,KAAK,cAAchI,CAAI,CAAC,CACpC,CACD,EAEG,KAAK,YACA,OACL,UAAWv3B,EAAM+I,EAAK,EAAE,EAAE,OAAO6wC,EAAI,YAAc,MAAM,EACzD,MAAOra,GAIPA,EAAK,SAAW,IACbA,KAAK,MAAMA,EAAK,UAEjB,QAAMA,EAAK,KAAK,KAAK,EAE3B,GAAIye,EAAU,QAAS,CACrB,MAAMC,EAAS,CACb,UAAWj+C,EAAM+I,EAAK,EAAE,EAAE,OAAO6wC,EAAI,YAAc,MAAM,EACzD,MAAO/xC,GAET,SAAU,QAAQ,MAAM,GAAG,EAAE,QAAQ,CAACgM,EAAK7K,IAAM,CAC3CA,EAAI,GAAKD,EAAKC,KAAO,SACvBi1C,EAAOpqC,GAAO9K,EAAKC,GACrB,CACD,EACMi1C,CACT,CAEO,OACL,UAAWj+C,EAAM+I,EAAK,EAAE,EAAE,OAAO6wC,EAAI,YAAc,MAAM,EACzD,MAAO/xC,EAEX,GAGF,KAAK,WAAW,eAAe,WAAW,EAAE,KAC1C,KAAK,kBAEFomB,UAAQ,CAAC2D,EAAI5oB,IAAM,CACxB,KAAK,MAAM,UAAU4oB,EAAI5oB,IAAMilB,EAAO,OAAS,CAAC,EACjD,CACH,CACF,CAEA,iBAAkB,CACT,YAAK,QAAU,EACxB,CAEA,iBAAkB,CACX,wBAAqB,CAAC,KAAK,mBAC3B,WAAM,OAAO,QAAesN,IAC3BA,EAAI,QAAQ,aACVA,SACF,CACE,KACE,KAAK,oBAAsBA,EAAI,QAAQ,YACnC,MAAMA,EAAI,QAAQ,kBAAkBA,EAAI,QAAQ,cAChDA,EAAI,QAAQ,UAClB,SAAUA,EAAI,QAAQ,OACxB,EACA,GAEJ,CACD,EACD,KAAK,MAAM,QACb,CAEA,eAAgB,OACP,YAAK,IACR,GAAG,OAAO,SAAS,SAAS,OAAO,SAAS,SAAS,QACnD,SACA,EACF,yBACE,KAAK,QAAQ,6CACoB,oBACjCh3B,OAAK,UAAL,cAAc,IAChB,YAAY,KAAK,kBACjB,EACN,CAEA,QAAS,CAED,QACJ,KAAK,YAAc,KAAK,QACpB4P,EAAS,KAAK,WAAY,KAAK,OAAO,EACtC,GACC,qCAAiC,KAAK,UAAY,SAAW;AAAA,6BAC3CmmC;AAAA;AAAA,sBAEF,IACX,KAAK,OACF,gBAAW,EAAE,OAAO,KAAK,EAE3B,qBAAkB,EAAE,OAAO;AAAA,sBAEtB,KAAK;;mBAER,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,0CAKkB,KAAK,YACnC52C,EAAS,OAASR,EACd,GACA;AAAA,qBACK,KAAK,KAAK,EAAE,WAAW;AAAA;AAAA;AAAA,qBAGvB,IAAM,CACb,KAAK,WAAW,cACd,kBACA,MAAQ,gBAAgB,KAAK,cAAc,yDAC7C,MAAM+V,EAAQ,KAAK,WAAW,cAAc,iBAAiB,EACzD,KAAK,oBACP,OAAO,KAAK,KAAK,cAAc,EAAG,QAAQ,EAEtCA,UAAUA,EAAM,KAAK,CAAE,GAAIA,EAAM,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAa5C,KAAK,KAAK,EAAE,YAAY;AAAA;AAAA,0BAEd,IAAM,CACd,KAAK,WAAW,cAAc,iBAAiB,EAAE,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAclD,IAAM,CACd,OAAO,KAAK,KAAK,cAAc,EAAG,QAAQ;AAAA,uBAEnC,KAAK,KAAK,EAAE,cAAc;AAAA,iBAChC,KAAK,KAAK,EAAE,SAAS;AAAA;AAAA;AAAA,wBAGd,IAAM,CACd7K,GACE,KAAK,WAAW,cAAc,gBAAgB,EAAE,MAClD;AAAA,uBAEO,KAAK,KAAK,EAAE,iBAAiB;AAAA,iBACnC,KAAK,KAAK,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA,oCAIC,KAAK,UAAY,GAAK;AAAA,sBACpC,KAAK;AAAA,qBACN,KAAK,aACV,KAAK,KAAK,EAAE,WAAW,EACvB,KAAK,KAAK,EAAE,QAAQ;AAAA,uBACb,KAAK,aAAe,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKlC,KAAK,WAAa1K,EAAS,OAASR,EACzC,GACA,YAAY,KAAK,mBAAqB,WAAa;AAAA,qBAC9C,KAAK,KAAK,EAAE,cAAc;AAAA;AAAA,sBAEzB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKN,KAAK,KAAK,EAAE,eAAe;AAAA;AAAA,sBAE1B,KAAK;AAAA;AAAA;AAAA,0CAGe,KAAK,UAAY,GAAK;AAAA;AAAA,uBAEzC,KAAK,KAAK,EAAE,kBAAkB;AAAA;AAAA,qBAEhC,KAAK,KAAK,EAAE,gBAAgB;AAAA;AAAA,qBAE5B,KAAK;AAAA,qBACL,IAAM,CACbkL,GACE,KAAK,WACF,cAAc,YAAY,EAC1B,MAAMhE,IAAiB,EACvB,QAAQ,gBAAiB,EAAE,EAChC;AAAA;AAAA;AAAA,0CAI4B,KAAK,UAAY,GAAK;AAAA;AAAA,uBAEzC,KAAK,KAAK,EAAE,kBAAkB;AAAA;AAAA,qBAEhC,KAAK,KAAK,EAAE,yBAAyB;AAAA;AAAA,qBAErC,KAAK;AAAA,qBACL,IAAM,CACb2zB,GACE,KAAK,WACF,cAAc,YAAY,EAC1B,MAAM3zB,IAAiB,EACvB,QAAQ,gBAAiB,EAAE,EAC9B,GAAG,KAAK,QAAQ,cAAc,KAAK,QAAQ,+BAC7C;AAAA;AAAA;AAAA;AAAA,qBAKO,KAAK,KAAK,EAAE,YAAY;AAAA;AAAA,uBAEtB,KAAK;AAAA,sBACN,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBASJ,KAAK;AAAA;AAAA,cAEd,KAAK,OAAO,IAEVmwC;AAAA/3C,8BACc+3C,EAAK,QAAU;AAAA,2BAClBA,EAAK;AAAA,qBACXA,EAAK;AAAA;AAAA;AAAA;AAAA;AAAA,yCAMe,KAAK,UAAY,GAAK;AAAA;AAAA;AAAA,wBAGvC,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAO3B,CAEA,IAAI,aAAc,CAChB,OAAOpmC,EAAS,KAAK,WAAY,KAAK,OAAO,CAC/C,CAEA,IAAI,QAAS,CACX,GAAI,KAAK,SAAU,CACb,MAAMnU,EAAM,KAAK,SAAS,GAAG,EAAE,GAAK,MAAI,MAAM,EAC5C,QAAMA,EAAM,KAAK,SAAS,GAAG,EAAE,GAAK,MAAI,MAAM,EAChD,KAAK,iBAAmB,UACnB23B,MAEH,QAAQ,CAAC,CAAE,MAAO,MAAO,MAAO,KAAK,KAAK,EAAE,aAAa,CAAG,GAClE,KAAOA,GAAOL,GACNkjB,OAAK,CAAE,MAAO7iB,EAAK,MAAOA,EAAI,WAAY,EACzCA,KAEF,QACT,CACO,OAAC,CAAE,MAAO,MAAO,MAAO,KAAK,KAAK,EAAE,aAAa,EAAG,CAC7D,CAEA,IAAI,cAAe,OACjB,OACEpzB,OAAK,eAAL,OAAqB,CACnB,CACE,MAAO,YACP,MAAO,KAAK,gBAAkB,KAAK,KAAK,EAAE,WAAW,EACrD,SAAU,GACV,SAAU,EACZ,EACA,CACE,MAAO,QACP,MAAO,KAAK,aAAe,KAAK,KAAK,EAAE,cAAc,EACrD,SAAU,GACV,OAAQ,OACR,IAAK,sCACP,EAGN,CAEA,kBAAkBqE,EAAG,CACnB,KAAM,CAAE,OAAU,IAAE,OAAO,eACrBs1C,EAAWx2C,EACXy2C,GAAY,SAASz2C,EAAO,EAAE,EAAI,GAAG,WAErC4vB,EACJ5vB,GAASA,IAAU,MACf1H,EAAM,GAAGk+C,IAAW,KAAK,iBAAkB,WAAW,EAAE,KACxDl+C,IAAQ,GAAG,EAAE,QAAQ,MAAM,EAE3B23B,EACJjwB,GAASA,IAAU,MACf1H,EAAM,GAAGm+C,IAAW,KAAK,eAAgB,WAAW,EAAE,KACtDn+C,IAAQ,KACd,KAAK,WAAW,MAAOs3B,EAAI,UAAWK,EAAI,SAAS,CACrD,CAEA,WAAY,CACV,KAAK,WAAW,cAAc,gBAAgB,EAAE,UAAU,OAAO,QAAQ,EACzE,KAAK,WACF,cAAc,sBAAsB,EACpC,UAAU,OAAO,YAAY,EAChC,KAAK,WACF,cAAc,yBAAyB,EACvC,UAAU,OAAO,YAAY,EAC3B,eAAY,CAAC,KAAK,UAClB,YAAS,KAAK,MAAM,OAAO,CAClC,CAEA,eAAgB,CACd,KAAK,MAAM,OACT,CACE,UAAW,CACT,aAAc,CACZ,MAAO,CACL,KAAM,KAAK,WACPxjB,EAAS,KAAK,WAAY,KAAK,OAAO,EACtC,EACN,EACA,SAAU,CACR,KAAM,GAAG,KAAK,KAAK,EAAE,YAAY,MAC/B,KAAK,QAAQ,gBACT,KAAK,KAAK,EAAE,YAAY,KAAKnU,EAAM,EAAE,OAAO,MAAM;AAAA,cACxDA,EAAM,KAAK,MAAM,MAAM,GAAG,IAAM,GAAK,EACpC,KACA,OAAO,GAAG,OAAOA,EAAM,KAAK,MAAM,MAAM,GAAG,IAAM,GAAK,EACpD,GACA,SAAO,GAAG,GACf,CACF,EACA,SAAU,GAAG,KAAK,mBAAmB,KAAK,QAAQ,gBAChD,KAAK,QAAQ,cACXA,EAAM,EAAE,KAAK,OAAO,UAAU,IAClC,uBAAwB,GACxB,QAAS,CACP,cAAe,CACb,QAAS,EACX,CACF,EACA,YAAa,KACb,aAAc,IACd,MAAO,CACT,CACF,EACA,IAEF,KAAK,MAAM,kBACb,CAEA,MAAM,WAAY,UAChBuE,OAAK,QAAL,QAAY,UACZ,KAAK,MAAQ,KACb,MAAMk2C,EAAS,GACV,aAAU,KAAK,SAAY,MAAM,KAAK,IAAI,WAAW,KAAK,SAAS,EACxE,MAAM2D,EAAc,GAEf,aAAQ,WAAW,QAAcxsB,UAKlCA,EAAG,oBAAsB,KAAK,mBAC9B,KAAK,OAAO,KAAcT,KAAG,KAAK,SAASA,EAAM,IAAI,CAAC,GAE1CitB,OAAKxsB,EAAG,IAAI,EAEtB,KAAK,mBACF,uBAAkB,QAAiBysB,IAClCzsB,EAAG,KAAK,SAASysB,CAAK,GACZD,OAAKxsB,EAAG,IAAI,CAC1B,CACD,GAECrtB,yBAAM,SAAN,QAAc,MACX,YAAO,KAAK,QAAiB85C,IAC5BzsB,EAAG,KAAK,SAASysB,CAAK,GACZD,OAAKxsB,EAAG,IAAI,CAC1B,CACD,CACH,CACD,EAED,MAAM,QAAQ,IACZwsB,EAAY,IAAI,MAAME,GAAQ,CAC5B,MAAMxJ,EAAQwJ,EAAK,MAAM,GAAG,EAAE,QAAQ,EAChC/0B,EAAM,GAAGurB,EAAM,MAAMA,EAAM,KACjC2F,EAAOlxB,GAAO,MAAM,KAAK,IAAI,UAAU+0B,CAAI,EAC5C,GAGH,KAAK,MAAQ7D,EACb,IAAIpW,EAAW30B,EAAK,KAAK,OAAQ,CAAE,SAAU,GAAM,EACnD,MAAMgrC,EAAUhrC,EAAK,KAAK,UACxB,CAAC,MAAO,KAAK,EAAE,SAASyhB,EAAM,KAAK,GAErC,GAAIupB,GAAWY,GAAY,oBAAoB,KAAK,MAAOZ,EAAQ,IAAI,EAAG,CAClE,SAASjoC,IAAM6oC,GAAY,QAAQ,KAAK,MAAOZ,CAAO,CAAC,IAA9CjoC,cAAiD,KAC5D8kC,GAAUA,EAAO,GACnB,KAAK,SAAW,CACd,IAAK9kC,EAAM8kC,CAAM,EAAE,GACnB,IAAKnvB,EAAKmvB,CAAM,EAAE,IAEf,QAAQ,KAAK,mBAAmB,CACzC,CACA,SAAW,KAAK,iBAAmBlT,EAAS,OAAS,KAAK,OAAO,GAAG,MAC/D30B,EAAK,KAAK,OAAQ,CAAE,MAAO20B,EAAU,IAC7BA,OAAK,OAAO,GAAG,OAE5B,KAAK,gBAAkBA,EACvB,KAAK,aAAaA,CAAQ,EACtB,KAAK,UACP,KAAK,YAAY,EACZ,YAAO,QAAiBlT,IACvBA,EAAM,aACJ,KAAK,mBACF,uBAAkB,QAAgBotB,IACjC,KAAK,MAAMptB,EAAM,OACf,KAAK,MAAMotB,KACb,KAAK,MAAMptB,EAAM,MAAQ,KAAK,MAAMA,EAAM,MAAM,OAC9C,KAAK,MAAMotB,IAGjB,CACD,EAIGptB,aAAaA,EAAM,WAAW,OAClCS,GACE,CAACA,EAAG,cACJ0pB,GAAY,QAAQ,KAAK,MAAOnqB,CAAK,EAAE,KACrCqtB,GAAU5sB,EAAG,eAAiB4sB,EAAO,YACvC,GAEN,CACD,EAED,KAAK,WAAWna,CAAQ,EACxB,KAAK,cAAc,GAEd,KAAK,KACd,CAEA,aAAarW,EAAQ,CACnB,MAAM4rB,EAAMlqC,EAAK,KAAK,OAAQ,CAAE,MAAOse,EAAQ,EAC/C,GAAIstB,GAAY,oBAAoB,KAAK,MAAO1B,EAAI,IAAI,EAAG,CACzD,IAAI6E,EAAa,KACbC,EAAa,IACjBpD,GAAY,QAAQ,KAAK,MAAO1B,CAAG,EAAE,QAAchoB,IAC9CA,OAAK,QAAc+oB,IACpB8D,EAAa,KAAK,IAAI9D,EAAG,GAAI8D,CAAU,EACvCC,EAAa,KAAK,IAAI/D,EAAG,GAAI+D,CAAU,EACxC,EACF,EACD,KAAK,eAAiBD,EACtB,KAAK,eAAiBC,CACxB,CACF,CAGA,cAAc7xC,EAAM,CAClB,OAAOA,GAAQA,EAAK,GAAKub,EAAKA,EAAKvb,CAAI,CAAC,EAAI,IAC9C,CAGA,kBAAkBA,EAAM,CACtB,MAAM8xC,EAAc,GACpB,SAAK,QAAc/sB,IACjBA,EAAG,KAAK,QAAQ+oB,GACdgE,EAAY,KAAK,CACf,QAAS3+C,EAAM26C,EAAG,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,EACrC,KAAM,CAACA,CAAE,EACV,EACH,CACD,EACMgE,CACT,CAEA,cAAc/sB,EAAI5oB,EAAGvE,EAAKm6C,EAAW,CAC5B,SACLxtC,EACE,CACE,GAAI,GAAG3M,KAAOuE,MACd,MAAO,KAAK,cAAc4oB,EAAG,IAAI,EACjC,MAAO,EACP,MAAO,sBACP,UAAW,OACX,OAAQ,IACR,MAAO,CACL,KAAMA,EAAG,aACLA,EAAG,aAAa,QAAQ,OAAQ,EAAE,EAClCA,EAAG,QACP,MAAO,QACP,EAAG,GACH,EAAG,CACL,CACF,EACAgtB,CACF,EACC,KAAK,oBAAsB,KAAK,mBAAmBhtB,EAAG,eACrD,CAAC,EAEP,CAGA,cAAc/kB,EAAM,CACZ,QAAYub,EAAKvb,CAAI,EAC3B,OAAOA,EAAK,OACR,CACE,CAAC,EAAGgyC,EAAU,EAAE,EAChB,CAAC,EAAGA,EAAU,EAAE,GAElB,EACN,CAEA,gBACEC,EACA/rC,EACAtO,EACAoG,EACA+zC,EAAY,KACZjlC,EAAU,GACV,CACIA,IAAY,QAAU,OAAOA,GAAY,WAC3CA,EAAU,KAAK,YAAcA,GAG3B,MACC5G,UAAQ,CAAC6e,EAAI5oB,IAAM,CACtB,MAAM+1C,EAAK,KAAK,cAAcntB,EAAI5oB,EAAGvE,EAAKm6C,CAAS,EACnD7D,EAAQgE,EAAG,OAAS,sBACpBD,EAAa,OAAO,KAAK,CACvB,MAAO,CACL,QAAS,GACT,iBAAkB,GAClB,MAAO,CACL,MAAO,gBACP,WAAY,QACd,CACF,EACA,UAAWC,EAAG,UACd,MAAOA,EAAG,MACV,MAAO,YACP,OAAQ,CAAE,QAAS,EAAM,EACzB,oBAAqB,GACrB,SAAUt6C,EACV,aAAc,GACd,KAAM,KAAK,cAAcmtB,EAAG,IAAI,EAChC,YAAamtB,EAAG,MAAM,YACtB,UAAWA,EAAG,MAAM,KACpB,KACE,KAAK,oBAAsBA,EAAG,MAAM,YAChCA,EAAG,MAAM,YACTA,EAAG,MAAM,KACf,QACD,EACF,EACDD,EAAa,OAAO,KAAK,CACvB,KAAMj0C,EACN,MAAOkI,EAAK,SAAW,EAAIgoC,EAAQ,sBACnC,GAAIt2C,EACJ,UACA,SAAUkV,EACX,CACH,CAEA,oBAAqB,aACb,SAAgBpV,OAAK,SAAL,cAAa,KACnC,IAAIy6C,EAAYC,EACZC,GAAQvZ,GAAQsZ,EAAc,IAAY/H,QAAK,MAAMA,EAAK,CAAC,CAAC,EAC5D,KACJ,MAAM4H,EAAe,CACnB,MAAO,CAEL,UAAW,GACX,KAAM,KAAK,UACX,UAAW,OACX,SAAU,KAAK,SACf,QAAS,CACP,QAAS,EACX,CACF,EACA,MAAO,CACL,QAAS,KAAK,MACd,mBAAoB,GACpB,WAAY,EACd,EACA,OAAQ,CAAC,EACT,YAAa,CACX,KAAM,CACJ,UAAW,IACb,EACA,OAAQ,CACN,aAAc,CAChB,EACA,OAAQ,CAGN,UAAW,GACX,QAAS,KAAK,UAAY,OAAY,KAAK,QAAU,EACrD,MAAO,CACL,QAAS,EACX,EACA,OAAQ,CACN,SAAU,CACR,QAAS,CACX,CACF,CACF,CACF,EACA,MAAO1tC,EACL,CACE,GAAI,YACJ,UAAW,CAAC,CACd,EACA,KAAK,KACP,EACA,MAAO,CACL,CACE,GAAI,YACJ,KAAM,WACN,QAAS,GACT,OAAQ,CACN,WAAY,CACV,OAAO,KAAK,sBAAwB,UAClC,KAAK,iBAAiB,WAAa,OACjC,MAAM,KAAK,KAAK,sBAAsB,KAAK,IAAI,QAC/C,KAAK,KAAK,sBAAsB,KAAK,IAAI,CAC/C,CACF,CACF,EACA,CACE,QAAS,GACT,IAAK,EACL,IAAK,EACL,GAAI,WACN,CACF,GAuBE,GArBJ,KAAK,UAAY,GAGb,KAAK,oBAAoB,QAC3B,KAAK,wBAAwB0tC,CAAY,GAGvCzuC,OAAK,SAAL,QAAa,oBACf2uC,EAAY,GACP,YAAO,MAAM,QAAgBj2C,IAC3BA,SAAO,QAAc6oB,IACpB,KAAK,QAAQA,IACfotB,EAAU,KAAK,CACb,aAAcptB,EACd,KAAM,CAAC,CAAC,IAAI,KAAK,EAAE,QAAQ,EAAG,WAAW,KAAK,QAAQA,EAAG,CAAC,CAAC,EAC5D,CACH,CACD,EACF,GAGCotB,GAAaA,EAAU,KAAKptB,GAAMA,EAAG,KAAK,OAAS,CAAC,EAAG,CACzD,IAAIutB,EAAQ,IACZxtB,UAAK,SAAL,cAAa,QAAb,QAAoB,QAAQ,CAAC5oB,EAAMC,IAAM,CACvC,MAAMi0B,EAAS+hB,EAAU,OACvBptB,KAAK,OAAO,SAASA,EAAG,YAAY,GAEtC,GAAIqL,EAAO,KAAKrL,GAAMA,EAAG,KAAK,MAAM,EAAG,CACjC,IAAE,QAAW,IACb7oB,EAAK,SAAW,QACdk0B,EAAO,GAAG,KAAK,GAAG,GAAK,KAAK,eACrBmiB,KAEAA,KAGP,CAACA,GAAUD,IACJC,KACDD,OAEDp2C,EAAK,SAAW,YACrBk0B,EAAO,GAAG,KAAK,GAAG,GAAK,KAAK,eACrBmiB,KAEAA,KAGP,CAACA,GAAUD,IACJC,KACDD,OAGP,qBACHL,EACA7hB,EACA,SAASj0B,KACTD,EAAK,OAAS,KAAK,KAAK,EAAE,aAAa,EACvC,KACAq2C,GAEF,KAAK,UAAY,EACnB,GAEJ,CAEI,QAAK,MAAM,KAAK,QAAS,CAC3B,MAAMC,EAAmB,CACvB,MAAO,EACP,MAAO,sBACP,UAAW,UACX,MAAO,CACL,MAAO,OACP,EAAG,GACH,EAAG,CACL,GAEG,qBACHP,EACA,KAAK,kBAAkB,KAAK,MAAM,KAAK,OAAO,EAC9C,UACA,gBACAO,EACA,GAEJ,CACO,QACT,CAGA,UAAUC,EAAW,OAEf,QAAK,QAAQA,EAAU,OAAQ,OAAO,KAAK,QAG/C,MAAMx3B,GAAMvjB,OAAK,iBAAL,cAAqB,IAAag7C,GACxC,KAAK,OAAS,KAAK,MAAMA,GAAeA,EACrC,MAEL,UAAY9sC,EAAM,KAAK,MAAMA,EAAMqV,CAAG,EAAE,CAG9C,CAEA,wBAAwBg3B,EAAc,CACpC,MAAMU,EAAc,GAEf,yBAAoB,QAAgBz2C,YAGjC,QAAQ,KAAK,UAAUA,CAAI,EAE/Bw2C,GACAA,EAAMx2C,EAAK,QACXw2C,EAAMx2C,EAAK,SAAW,IACtB,CAAC,OAAO,MAAMw2C,EAAMx2C,EAAK,MAAM,GAE/By2C,EAAY,KAAK,CACf,aAAcz2C,EAAK,MACnB,KAAM,CAAC,CAAC,IAAI,KAAK,EAAE,YAAY,EAAG,WAAWw2C,EAAMx2C,EAAK,MAAM,CAAC,CAAC,EAChE,QAAOxE,IAAK,QAAL,cAAY,OAAQwE,EAAK,MAChC,MAAOA,EAAK,MACZ,QAASA,EAAK,QACd,SAAUA,EAAK,SACf,YAAaA,EAAK,SACdoL,EAASpL,EAAK,YAAaw2C,CAAK,EAChCx2C,EAAK,YACT,YAAWsH,IAAK,QAAL,cAAY,OAAQtH,EAAK,MACrC,CACH,CACD,EACGy2C,IACUA,UAAQ,CAACC,EAAOz2C,IAAM,SAChC81C,EAAa,OAAO,KAAK,CACvB,MAAO,YACP,OAAQ,CAAE,QAAS,EAAM,EACzB,oBAAqB,GACrB,KAAMW,EAAM,MACZ,MAAO,CACL,KAAMA,EAAM,MACZ,QAAS,EACX,EACA,MAAOA,EAAM,OAAS,sBACtB,UAAW,OACX,GAAI,SAASz2C,IACb,SAASzE,IAAM,WAAN,OAAkB,GAC3B,UAAU8L,IAAM,WAAN,OAAkB,GAC5B,KAAM,KAAK,cAAcovC,EAAM,IAAI,EACnC,YAAaA,EAAM,YACnB,UAAWA,EAAM,MAClB,EACF,EACD,KAAK,UAAY,GAErB,CAEA,aAAapN,EAAM,CACb,cAAO,KAAKA,IAAU,SACjB,KAAKA,GAEV,KAAKA,IAAS,KAAK,QAAQ,KAAKA,KAC3B,KAAK,QAAQ,KAAKA,IAAS,OAAO,KAAK,QAAQ,KAAKA,GAAM,EAE5D,IACT,CAEA,gBAAiB,CACT,QAAiB,CAACryC,EACrB,GACCA,IAAQ,GAAG,EACXA,EAAM,YAAcA,EAAM,YAAY,KAAOA,EAAM,GAAG,MAAM,GAE7D,UAAU,EAmHN,OAjHMoR,EACX,CACE,MAAO,CACL,KAAM,EACR,EACA,SAAU,CACR,KAAM,KAAK,UAAY,GACvB,SAAU,EACZ,EACA,QAAS,KAAK,cACd,OAAQ,CAAC,EACT,UAAW,CACT,aAAc,CACZ,MAAO,CACL,KAAM,KAAK,WACP+C,EAAS,KAAK,WAAY,KAAK,OAAO,EACtC,EACN,EACA,SAAU,CACR,KAAM,GAAG,KAAK,KAAK,EAAE,YAAY,MAC/B,KAAK,QAAQ,gBACT,KAAK,KAAK,EAAE,YAAY,KAAKnU,IAAQ,GAAG,EAAE,OAAO,MAAM,GAC/D,CACF,EACA,SAAU,GAAG,KAAK,mBAAmB,KAAK,QAAQ,gBAChD,KAAK,QAAQ,cACXA,EAAM,EAAE,KAAK,OAAO,iBAAiB,IACzC,uBAAwB,GACxB,QAAS,CACP,cAAe,CACb,QAAS,EACX,CACF,EACA,YAAa,KACb,aAAc,IACd,MAAO,CACT,EACA,UAAW,CACT,QAAS,EACX,EACA,cAAe,CACb,QAAS,EACX,EACA,UAAW,CACT,QAAS,EACX,EACA,WAAY,CACV,QAAS,EACX,EACA,YAAa,CACX,OAAQ,CAIN,aAAc,CACZ,QAAS,EACX,EACA,aAAc0D,EAAS,OAASR,EAChC,OAAQ,CACN,cAAcqD,EAAO,CACnBA,EAAM,eAAe,EACjBA,EAAM,QACR,KAAK,KAAK,EAEV,KAAK,KAAK,CAEd,EACA,gBAAgBA,EAAO,CACrBA,EAAM,eAAe,EACjB,KAAK,SACH,KAAK,WACP,KAAK,SAAS,QAAU,IAE1B,KAAK,KAAK,IAEN,KAAK,WACP,KAAK,SAAS,QAAU,IAE1B,KAAK,KAAK,EAEd,CACF,CACF,CACF,EACA,OAAQ,KAAK,cACb,QAAS,CACP,OAAQ,GACR,MAAO,EACT,EACA,KAAM,CAEJ,mBAAoB,CACX,QACT,CAIF,EACA,MAAO,CACL,cAAe,CAAC,KAAK,kBACrB,SAAU,KAAK,cAAgB,GAC/B,SAAU,KAAK,aAAa,eAAe,EAC3C,QAAS,KAAK,aAAa,UAAU,EACrC,QAAS,KAAK,aAAa,UAAU,EACrC,SAAU,GACV,MAAO,CACL,KAAM,KAAK,aAAe,KAAK,KAAK,EAAE,cAAc,CACtD,CACF,EACA,OAAQ,CAAC,CACX,EACA,KAAK,mBAAmB,EAG5B,CACF,EAvxDE5D,IADCC,EAAS,CAAE,KAAM,OAAQ,GApBP64C,GAqBnB,uBAGA94C,IADCC,EAAS,CAAE,KAAM,OAAQ,GAvBP64C,GAwBnB,uBAGA94C,IADCC,EAAS,CAAE,KAAM,QAAS,GA1BR64C,GA2BnB,yBAMA94C,IADCC,EAAS,CAAE,KAAM,QAAS,GAhCR64C,GAiCnB,wCAGA94C,IADCC,EAAS,CAAE,KAAM,QAAS,GAnCR64C,GAoCnB,yBAGA94C,IADCC,EAAS,CAAE,KAAM,OAAQ,GAtCP64C,GAuCnB,yBAvCmBA,GAArB94C,IADCE,EAAc,cAAc,GACR44C,yMCjDR,OAAN,cAA4BA,EAAW,CAAvC,kCAUO,kBAEZ,cAAe,CACR,qBAAkB,IAAI,KAAK,aAC9B,KAAK,KAAK,SACV,KAAK,cAAgB,CAAC,GAExB,KAAK,cAAc,EACd,qBAAkB,YAAY,IAAM,CACvC,KAAK,UAAU,GACd,GAAM,CACX,CAEA,MAAM,eAAgB,CACpB,KAAK,OAAS,MAAM9xC,GAAW,oBAAqB,CAAE,GACtDwC,GAAK,CAAE,SAAU,KAAK,OAAO,OAAS,GACtC,KAAK,IAAMsH,IACX,KAAK,UAAU,CACjB,CAEA,MAAM,WAAY,CACVzT,SAAO,KAAK,KAAK,QAAQ,EAC/B,MAAMm7C,EAAoBzrC,EAAK,KAAK,OAAO,MAAM,GAAG,SAAU,CAC5D,UAAW,qBACZ,EACK0rC,EAAa1rC,EAAKyrC,EAAkB,SAAU,CAAE,KAAM,KAAK,IAAK,EAClEC,GACK,cAAO,KAAMA,EAAW,OAAO,EAExC,KAAK,gBAAkB,KAAK,OAC5B,KAAK,WAAa,GAClB,KAAK,UAAY,GACjB,MAAM,UAAU,CAClB,CACF,EA1CEz4C,IADCC,EAAS,CAAE,KAAM,OAAQ,GADf88C,GAEX,mBAGA/8C,IADCC,EAAS,CAAE,KAAM,OAAQ,GAJf88C,GAKX,yBAGA/8C,IADCC,EAAS,CAAE,KAAM,OAAQ,GAPf88C,GAQX,wBARWA,GAAN/8C,IADNE,EAAc,kBAAkB,GACpB68C,yMCGbhE,GAAY/uB,EAAU,EAEtB,IAAqBgzB,GAArB,cAA8C76C,EAAI3C,EAAY,CAC5Db,EACA,KAAEV,EAAI,CACR,CAAC,CAAE,CAHH,kCA0B+C,mBAE7C,yBAAiD,EAAC,CAElD,WAAW,YAAa,CACf,OACL,eAAgB,CAAE,KAAM,MAAO,UAAW,EAAM,EAChD,aAAc,CAAE,KAAM,OAAQ,UAAW,EAAM,EAC/C,SAAU,CAAE,KAAM,OAAQ,UAAW,EAAM,EAE/C,CAEA,mBAAoB,CACd,MAAM,mBAAmB,MAAM,kBAAkB,EAErD,KAAK,eAAiB,GACjB,qBAAkB,IAAI,KAAK,aAC9B,KAAK,KAAK,SACV,KAAK,cAAgB,CAAC,GAGjB,wBAAiB,SAAU,IAChC,WAAW,IAAM,CACV,YAAS,KAAK,MAAM,OAAO,GAC/B,IAAI,EAEX,CAEA,MAAM,aAAaoH,EAAU,CACrB,QAASD,GAAyBC,EAAU,CAChD,YACA,YACA,eACD,EACD,KAAK,IAAMyL,IACX,KAAK,UAAYrL,EAAO,UACjB,cAAO,KAAMA,EAAO,OAAO,EAElC,KAAK,QAAU,MAAM,KAAK,IAAI,WAAW,KAAK,SAAS,EACvD,KAAK,UAAU,CACjB,CAEA,aAAc,CACP,WAAQ,KAAK,WAAW,MAC3B,KAAK,WAAW,cAAc,aAAa,EAC3C,KAAK,aAAa,EAClB,KAAK,aAAa,KAAK,IAAI,EAE/B,CAEA,cAAcP,EAAK,CACjB,OAA4BA,GAAQ,MAAQA,IAAQ,IAAM,OAAO,MAAMA,CAAG,EACtE,GACA,KAAK,gBAAgB,OAAOA,CAAG,CACrC,CAGA,cAAe,CACb,MAAMioC,EAAO,KACN,OACL,QAAS,CACP,QAAS,EACX,EACA,YAAa,CACX,OAAQ,CACN,MAAO,CACL,QAAS,EACX,EACA,OAAQ,CACN,SAAU,CACR,QAAS,CACX,CACF,CACF,CACF,EACA,MAAO,CACL,KAAM,KAAK,KAAK,EAAE,kBAAkB,CACtC,EACA,QAAS,CACP,QAAS,GACT,YAAa,KACb,UAAUrS,EAAS,CACb,SAAK,iBAAmB,KACnB,GAAGqS,EAAK,KAAK,EAAE,UAAU,KAC9B,KAAK,6BAEL,KAAK,OAAO,2CAEZ,KAAK,OAAO,aACL,SAAS,KAAK,EAAI,IAAK,EAAE,YAE7BrS,EAAQ,iBAAiB,KAAK,KAAMA,CAAO,CACpD,EACA,aAAc,GAAGqS,EAAK,KAAK,EAAE,UAAU,sBACvC,cAAe,CACjB,EACA,MAAO,CACL,MAAO,CACL,KAAM,KAAK,YAAc,KAAK,KAAK,EAAE,QAAQ,CAC/C,CACF,EACA,OAAQ,CACN,MAAO,CACL,KAAM,EACR,CACF,EACA,MAAO,CACL,MAAO,CACL,KAAM,GAAG,KAAK,KAAK,EAAE,UAAU,OACjC,EACA,OAAQ,CACN,WAAY,CACV,MAAO,GAAGA,EAAK,cAAc,KAAK,KAAK,GACzC,CACF,CACF,EAEJ,CAGA,kBAAkB8P,EAAW,CAC3BA,EAAU,KAAO,OACjBA,EAAU,UAAYA,EAAU,MAChCA,EAAU,KAAOA,EAAU,SACvB,GAAGA,EAAU,aAAazrC,EACxByrC,EAAU,YACVA,EAAU,WAEZ,GAAGA,EAAU,aAAaA,EAAU,cACxCA,EAAU,aAAe,GACzBA,EAAU,MAAQ,CAChB,QAAS,GACT,MAAO,CAAE,MAAO,SAAU,GAE5BA,EAAU,QAAU,GAEpBA,EAAU,KAAO,CACf,CAAC,EAAGA,EAAU,SAAW,GAAG,EAC5B,CAACx3B,EAAK,KAAK,MAAM,OAAO,GAAG,IAAI,EAAE,EAAGw3B,EAAU,SAAW,GAAG,GAE9DA,EAAU,OAAS,GAGnBA,EAAU,OAAS,CACjB,QAAS,GACT,OAAQ,CAAE,MAAO,CAAE,QAAS,EAAM,EAAG,SAAU,CAAE,QAAS,EAAI,GAI3D,WAAM,UAAUA,CAAS,CAChC,CAEA,kBAAkBp7C,EAAMqI,EAAMkuC,EAAOtS,EAAG,CACtC,MAAMmX,EAAY,GAQd,GAPJA,EAAU,KAAO,OACjBA,EAAU,GAAKp7C,EACfo7C,EAAU,KAAOp7C,EACjBo7C,EAAU,MAAQ,CAChB,QAAS,IAGP,MAAM,QAAQ/yC,CAAI,EAAG+yC,EAAU,KAAO/yC,MACrC,CAEH,MAAMgzC,EAAQz3B,EAAK,KAAK,MAAM,OAAO,GAAG,IAAI,EAAE,EAExC03B,EAAa,GACnBA,EAAW,KAAK,CAAE,EAAG,EAAG,EAAGjzC,EAAM,EACjCizC,EAAW,KAAK,CAAE,EAAGD,EAAO,EAAGhzC,EAAM,EACrC+yC,EAAU,KAAOE,CACnB,CACAF,EAAU,MAAQ7E,EAClB6E,EAAU,UAAY7E,EACtB6E,EAAU,OAASnX,EACnBmX,EAAU,UAAY,KAGtBA,EAAU,OAAS,CACjB,QAAS,GACT,OAAQ,CAAE,MAAO,CAAE,QAAS,EAAM,EAAG,SAAU,CAAE,QAAS,EAAI,GAI3D,WAAM,UAAUA,CAAS,CAChC,CAEA,aAAajG,EAAO,CACZ,QAAI,IAAI,YAAY,OAAQ,CAChC,OAAQA,EACT,EACD,KAAK,cAAc,CAAC,CACtB,CAEA,SAAU,CACJ,KAAK,OACP,KAAK,MAAM,QAEf,CAEA,cAActgC,EAAO,CAEZ,OADkB,KAAK,aAAa,GAAG,QAAQ,MAC9B,IAAWshC,KAAE,EAAGA,EAAG,EAAG,EAAGthC,GAAQ,CAC3D,CAEA,QAAS,CACA;AAAA7W;AAAAA,WAGT,CAEA,MAAM,WAAY,WAEhB,MAAMi4C,EAAS,GACV,kBAAe,MAAM,KAAK,IAAI,UACjC,qBAAqB,KAAK,QAAQ,WAAW,KAAK,QAAQ,+CAI5D,MAAM,QAAQ,IACZ,KAAK,QAAQ,WACV,OAAa7oB,KAAG,oBAAsB,KAAK,iBAAiB,EAC5D,IAAI,MAAMA,GAAM,CACf6oB,EAAOryB,EAAKwJ,EAAG,KAAK,MAAM,GAAG,CAAC,GAAK,MAAM,KAAK,IAAI,UAAUA,EAAG,IAAI,EACpE,GAEL,KAAK,UAAWnf,IAAMgoC,EAAO,YAAY,IAAzBhoC,cAA4B,KAE5C,KAAK,YAAY,EACjB,MAAMstC,GAAmBttC,OAAM,KAAK,YAAY,IAAvBA,cAA0B,UAA1BA,cAAmC,MAEvD,uBACH,KAAK,KAAK,EAAE,SAAS,EACrBstC,EACA,wBACA,IAIF,MAAMC,EAAY53B,EAAK,KAAK,QAAQ,EAAE,GAStC,GARK,uBACH,KAAK,KAAK,EAAE,mBAAmB,EAC/B,KAAK,cAAc43B,EAAY,GAAG,EAClC,yBACA,GAIE,KAAK,oBAAqB,CACtB,QAAavtC,EAAMgoC,EAAO,YAAY,EACvC,yBAAoB,QAAcwF,IACjC,OAAO,KAAKC,CAAU,EAAE,SAASD,EAAG,KAAK,GAC3C,KAAK,eAAe,KAAK,CACvB,QAASC,EACT,QAASD,EAAG,MACZ,SAAU,WAAWC,EAAWD,EAAG,MAAM,EACzC,GAAGA,EACJ,CACH,CACD,CACH,CAGQnuB,QAAK,eAAgB,WAAY,CAAC,MAAM,CAAC,EAAE,QAAa9oB,IAC9D,KAAK,kBAAkBA,CAAC,EACzB,CACH,CACF,EApSqB22C,GAKZ,OAASj9C;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IAqBgBC,IAA/BC,EAAS,CAAE,UAAW,GAAO,GA1BX+8C,GA0Ba,0BA1BbA,GAArBh9C,IADCE,EAAc,qBAAqB,GACf88C,ICZd,MAAMQ,EAAgB,CAa3B,aAAc,CACZ,KAAK,SAAW,GAChB,KAAK,QAAU,GACf,KAAK,OAAS,GACd,KAAK,OAAS,GACd,KAAK,OAAS,GACd,KAAK,aAAe,EACtB,CACF,CCrBA,OAAez9C;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,mMCef,IAAqB09C,GAArB,cAAuCt7C,EAAI3C,EAAY,CAACb,EAAW,CAAEV,MAAK,EAAC,CAAE,CAA7E,kCAKa,uBAWX,qBAAmC,IAAIu/C,EAAgB,CAEvD,QAAS,CACA;AAAA39C;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,0BAWe,KAAK,gBAAgB,KAAK,gBAAgB,MAAM;AAAA;AAAA,sBAEpD,KAAK,gBAAgB,OAAO;AAAA;AAAA,0BAExB,KAAK,gBAAgB,KAAK,gBAAgB,MAAM;AAAA;AAAA,sBAEpD,KAAK,gBAAgB,OAAO;AAAA;AAAA,0BAExB,KAAK,gBAAgB,KAAK,gBAAgB,MAAM;AAAA;AAAA,sBAEpD,KAAK,gBAAgB,OAAO;AAAA;AAAA,0BAExB,KAAK,gBAAgB,KAAK,gBAAgB,OAAO;AAAA;AAAA,sBAErD,KAAK,gBAAgB,QAAQ;AAAA;AAAA;AAAA,wBAG3B,KAAK,gBAAgB,KAAK,gBAAgB,YAAY;AAAA;AAAA;AAAA,sBAGxD,KAAK,gBAAgB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,oCAKpB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAcpB,KAAK,YAAY,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,KAMzC,CAEA,aAAawF,EAAU,SACrB,KAAK,IAAMyL,IACX,MAAMrL,EAASL,GAAyBC,EAAU,CAAC,WAAW,CAAC,EAC1D,gBAAYzD,IAAO,UAAP,cAAgB,UAC5B,2BAAuB8L,IAAO,UAAP,cAAgB,qBACvC,eAAU,KAAK,SAAS,CAC/B,CAEA,MAAM,UAAUklC,EAAW,CACzB,MAAM1C,EAAS,MAAM,KAAK,IAAI,UAAU,EACnC,qBAAkB,IAAIsN,GAC3B,KAAK,gBAAgB,SAAW,MAAM,KAAK,IAAI,aAC7CtN,EAAO0C,IAEJ,qBAAgB,SAAS,QAAa3sC,IAErCA,EAAE,gBAAkB,GACtB,KAAK,gBAAgB,aAAa,KAAKA,EAAE,YAAY,EAC9C,KAAK,UAAUA,EAAE,SAAUA,EAAE,aAAa,EACjD,KAAK,gBAAgB,QAAQ,KAAKA,EAAE,YAAY,EACzC,KAAK,UAAUA,EAAE,SAAUA,EAAE,aAAa,EACjD,KAAK,gBAAgB,OAAO,KAAKA,EAAE,YAAY,EACxC,KAAK,UAAUA,EAAE,SAAUA,EAAE,aAAa,EACjD,KAAK,gBAAgB,OAAO,KAAKA,EAAE,YAAY,EACxC,KAAK,UAAUA,EAAE,cAAeA,EAAE,QAAQ,GACjD,KAAK,gBAAgB,OAAO,KAAKA,EAAE,YAAY,EAClD,EAID,KAAK,cAAc,CACrB,CAOA,UAAU2B,EAAuBC,EAAuB,CACtD,OAAID,GAAKC,EAAU,OAAOD,CAAC,EAAI,OAAOC,CAAC,GACvC,QAAQ,KAAK,sBAAsB,EAC5B,GACT,CAEA,gBAAgB61C,EAAa,CAE3B,IAAI7oC,EAAS,GACb,SAAY,MAAM,EAAG,CAAO,EAAE,QAAa/G,IACzC+G,GAAU,GAAG/G,MACd,EAEG4vC,EAAY,OAAS,EACvB7oC,EAASA,EAAO,UAAU,EAAGA,EAAO,OAAS,CAAC,EACjCA,UACRA,CACT,CACF,EArIqB4oC,GAEZ,OAAS/rC,GAGhB1R,IADCC,EAAS,CAAE,KAAM,OAAQ,GAJPw9C,GAKnB,wBAIAz9C,IADCC,EAAS,CAAE,KAAM,OAAQ,GARPw9C,GASnB,yBAIAz9C,IADCC,EAAS,CAAE,KAAM,OAAQ,GAZPw9C,GAanB,oCAGAz9C,IADCC,EAAS,CAAE,KAAM,OAAQ,GAfPw9C,GAgBnB,+BAhBmBA,GAArBz9C,IADCE,EAAc,aAAa,GACPu9C,s0HCKrBE,GAAY,CACVC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EACF,CAAC,EAEDC,GAAsB,OAAQC,EAAI,EAGlC,IAAqBC,GAArB,cAAsCp/C,CAAW,CAAjD,kCAkBsB,iBAGP,cAGU,oBAEvB,IAAI,cAAe,CACV,SAAe,KAAM,QAAQ,CACtC,CAEA,WAAY,CACV,KAAK,MAAQq/C,GAAa,KAAK,aAAc,KAAK,SAAW,OAAS,GAAI,CAAE,SAAU,KAAK,YAAc,MAAQ,SAAU,CAC7H,CAEA,eAAgB,CACV,KAAK,OACCC,GAAQ,KAAK,KAAK,EAE5B,KAAK,UAAU,EACf,KAAK,QAAQ,CACf,CAEA,cAAe,CACb,KAAK,UAAU,CACjB,CAEA,SAAU,OACJ,KAAK,OAAS,KAAK,UAAa,GAACl9C,OAAK,QAAQ,QAAb,QAAoB,OAAS,KAAK,QAAQ,MAAM,KAAK,OAAS,IAC5F,WAAM,UAAU,KAAK,OAAO,CAErC,CAEA,YAAYm9C,EAAiB,CAC3B,KAAK,SAAWA,EAChB,KAAK,cAAc,CACrB,CAEA,QAAS,CACP,KAAK,MAAM,QACb,CAEA,QAAS,CACA,gDACT,CACF,EAhEqBH,GACZ,OAAS7+C;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IAchBC,IADCC,EAAS,CAAE,KAAM,OAAQ,GAdP2+C,GAenB,uBAGA5+C,IADCC,EAAS,CAAE,KAAM,QAAS,GAjBR2+C,GAkBnB,wBAGA5+C,IADCC,EAAS,CAAE,KAAM,OAAQ,UAAW,GAAO,GApBzB2+C,GAqBnB,qBAGA5+C,IADCC,EAAS,CAAE,KAAM,QAAS,GAvBR2+C,GAwBnB,2BAxBmBA,GAArB5+C,IADCE,EAAc,WAAW,GACL0+C,yMCtCd,MAAMI,GAAa,CACxB,QAAS,EACT,OAAQ,EACR,MAAO,CACT,EAGA,IAAqBC,GAArB,cAAsCz/C,CAAW,CAAjD,kCAcE,UAAew/C,GAAW,MAEF,sBAExB,WAAW,YAAa,CACf,OACL,cAAe,CAAE,KAAM,MAAO,EAC9B,KAAM,CAAE,KAAM,MAAO,EAEzB,CAEA,qBAAsB,SACpB,OAAQ,KAAK,WACNA,GAAW,OACP,eACJA,GAAW,MACP,cACJA,GAAW,aACX,eACI,CACP,MAAMz4C,EAAS,KAAK,OAAM3E,OAAK,gBAAL,OAAsB,IAAI,EACpD,OAAI2E,EACK1G,yBAA4B0G,mBAE9BmH,IAAO,OAAP,OAAe,EACxB,EAEJ,CAEA,QAAS,CACA;AAAA7N,sCAC2B,KAAK;KAEzC,CACF,EAhDqBo/C,GACZ,OAASl/C;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IADGk/C,GAArBj/C,IADCE,EAAc,WAAW,GACL++C,ICVrB,MAAMC,GAAkB,wBAEZ,YACVC,yBACAA,yBACAA,2BAHUA,YAMAC,QACVA,yBACAA,uBACAA,qBACAA,+BAJUA,YAOC,SAAY,MACvBC,IAUiB,MAAM,MACrB,GAAGH,aAA0B,mBAAmBG,CAAI,IACpD,CACE,OAAQ,MACR,KAAM,OACN,MAAO,WACP,QAAS,CACP,OAAQ,kBACV,CACF,IAEc,OAGLC,GAAa,MACxBz9C,EACA4f,EACA89B,KAsBQ,MAhBS,MAAM,MAAM,GAAGL,YAA0B,CACxD,OAAQ,OACR,KAAM,OACN,MAAO,WACP,YAAa,cACb,QAAS,CACP,eAAgB,kBAClB,EACA,SAAU,SACV,eAAgB,cAChB,KAAM,KAAK,UAAU,CACnB,OACA,cACA,SACD,EACF,GACsB,QAAQ,KAGpBM,GAAmB,IAIvB,CACP,CACE,CACE,QAAS,EACT,cAAe,CACb,MAAO,CACL,KAAM,WACN,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CACxD,EACA,MAAO,CACL,KAAM,OACR,EACA,OAAQ,CACN,CACE,KAAM,CAAC,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,IAAK,GAAG,EACjD,KAAM,MACR,CACF,CACF,CACF,EACA,CACE,QAAS,EACT,cAAe,CACb,MAAO,CACL,KAAM,WACN,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CACxD,EACA,MAAO,CACL,KAAM,OACR,EACA,OAAQ,CACN,CACE,KAAM,CAAC,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,IAAK,GAAG,EACjD,KAAM,MACR,CACF,CACF,CACF,EACA,CACE,QAAS,EACT,cAAe,CACb,MAAO,CACL,KAAM,WACN,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CACxD,EACA,MAAO,CACL,KAAM,OACR,EACA,OAAQ,CACN,CACE,KAAM,CAAC,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,IAAK,GAAG,EACjD,KAAM,MACR,CACF,CACF,CACF,CACF,EACA,CACE,CACE,QAAS,EACT,cAAe,CACb,MAAO,CACL,KAAM,WACN,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CACxD,EACA,MAAO,CACL,KAAM,OACR,EACA,OAAQ,CACN,CACE,KAAM,CAAC,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,IAAK,GAAG,EACjD,KAAM,MACR,CACF,CACF,CACF,EACA,CACE,QAAS,EACT,cAAe,CACb,MAAO,CACL,KAAM,WACN,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CACxD,EACA,MAAO,CACL,KAAM,OACR,EACA,OAAQ,CACN,CACE,KAAM,CAAC,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,IAAK,GAAG,EACjD,KAAM,MACR,CACF,CACF,CACF,CACF,EACA,CACE,CACE,QAAS,EACT,cAAe,CACb,MAAO,CACL,KAAM,WACN,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CACxD,EACA,MAAO,CACL,KAAM,OACR,EACA,OAAQ,CACN,CACE,KAAM,CAAC,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,IAAK,GAAG,EACjD,KAAM,MACR,CACF,CACF,CACF,CACF,EACA,CACE,CACE,QAAS,EACT,cAAe,CACb,MAAO,CACL,KAAM,WACN,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CACxD,EACA,MAAO,CACL,KAAM,OACR,EACA,OAAQ,CACN,CACE,KAAM,CAAC,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,IAAK,CAAC,EAC/C,KAAM,MACR,CACF,CACF,CACF,EACA,CACE,QAAS,EACT,cAAe,CACb,MAAO,CACL,KAAM,WACN,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CACxD,EACA,MAAO,CACL,KAAM,OACR,EACA,OAAQ,CACN,CACE,KAAM,CAAC,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,IAAK,CAAC,EAC/C,KAAM,MACR,CACF,CACF,CACF,CACF,EACA,CACE,CACE,QAAS,EACT,cAAe,CACb,MAAO,CACL,KAAM,WACN,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CACxD,EACA,MAAO,CACL,KAAM,OACR,EACA,OAAQ,CACN,CACE,KAAM,CAAC,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,IAAK,CAAC,EAC/C,KAAM,MACR,CACF,CACF,CACF,CACF,EACA,CACE,CACE,QAAS,EACT,cAAe,CACb,MAAO,CACL,KAAM,WACN,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CACxD,EACA,MAAO,CACL,KAAM,OACR,EACA,OAAQ,CACN,CACE,KAAM,CAAC,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,IAAK,CAAC,EAC/C,KAAM,MACR,CACF,CACF,CACF,CACF,EACA,CACE,CACE,QAAS,EACT,cAAe,CACb,MAAO,CACL,KAAM,WACN,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CACxD,EACA,MAAO,CACL,KAAM,OACR,EACA,OAAQ,CACN,CACE,KAAM,CAAC,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,IAAK,CAAC,EAC/C,KAAM,MACR,CACF,CACF,CACF,CACF,EACA,CACE,CACE,QAAS,EACT,cAAe,CACb,MAAO,CACL,KAAM,WACN,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CACxD,EACA,MAAO,CACL,KAAM,OACR,EACA,OAAQ,CACN,CACE,KAAM,CAAC,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,IAAK,CAAC,EAC/C,KAAM,MACR,CACF,CACF,CACF,CACF,EACA,CACE,CACE,QAAS,EACT,cAAe,CACb,MAAO,CACL,KAAM,WACN,KAAM,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAK,CACxD,EACA,MAAO,CACL,KAAM,OACR,EACA,OAAQ,CACN,CACE,KAAM,CAAC,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,IAAK,CAAC,EAC/C,KAAM,MACR,CACF,CACF,CACF,CACF,CACF,ECtUY,YACVC,qBACAA,qBACAA,uBAHUA,YAMC,SAAiBx5C,GAOb,CAET,QAAeA,EAAE,OAAO,aAAe,GACvCy5C,EAAez5C,EAAE,OAAO,aAAe05C,EAEzC,SAAE,OAASA,EACN,EAGL15C,EAAE,OAASy5C,EACN,EAGF,CACT,uMCnBA,MAAME,GAAkCx7B,IAClC,MACJ,OAAQA,EAAQ,kBACTg7B,GAAY,OACfS,EAAoBb,GAAW,OAC/B,WACGI,GAAY,MACfS,EAAoBb,GAAW,MAC/B,WACGI,GAAY,gBACZA,GAAY,aACZ,eAEHS,EAAoBb,GAAW,QAC/B,MAGG;AAAAn/C;AAAAA,cAEKggD;AAAA,uBACS,KAAK,UAAUz7B,EAAQ,aAAa;AAAA;AAAA,GAG3D,EAEM07B,GAAoC95B;AAAAnmB,yCACDmmB;AAAA,EAGnC+5B,GAAuBC,IAC3B,MAAMC,EAAgBD,EAAS,OACzBE,EAAe,CAAC,GAAGF,CAAQ,EAC3BG,EAAeH,EAAS,GACxBI,EAAeD,EAAa,cAAgBf,GAAY,OAE3D,SAAa,UAAYD,GAAQ,SAAWc,EAAgB,GAC5DE,EAAa,UAAYhB,GAAQ,UAAYc,EAAgB,KAE9DC,EAAa,KAAK,CAChB,QAASC,EAAa,QACtB,YAAaC,EAAehB,GAAY,MAAQA,GAAY,OAC7D,EACGe,EAAa,UAAYhB,GAAQ,UAAYc,EAAgB,GAC/DC,EAAa,KAAK,CAChB,QAASC,EAAa,QACtB,YAAaf,GAAY,MAC1B,GAGEc,CACT,EAEMG,GAAwCC,IACxC,MAEJ,SAAa,MAAiBl8B,IACbm8B,IACRn8B,EAAQ,cAAgB,OAChC,EAEMm8B,CACT,EAGA,IAAqBC,GAArB,cAA6ChhD,CAAW,CAAxD,kCA4DE,YAIQ,GAER,kBAIQ,GAEsB,2BAEP,oBAgBZ,gCAEX,WAAW,YAAa,CACf,OACL,OAAQ,CAAE,KAAM,MAAO,UAAW,EAAM,EACxC,aAAc,CAAE,KAAM,MAAO,UAAW,EAAM,EAC9C,sBAAuB,CAAE,KAAM,OAAQ,UAAW,EAAM,EACxD,mBAAoB,CAAE,KAAM,QAAS,UAAW,EAAM,EACtD,YAAa,CAAE,KAAM,QAAS,UAAW,EAAM,EAC/C,YAAa,CAAE,KAAM,OAAQ,UAAW,EAAM,EAElD,CAEA,cAAc2U,EAAK,CACZ,YAAOA,GAAK,QAAgB/N,IAE/BA,EAAK,SAAW,EACjB,EACD,KAAK,mBAAmB,EACxB,KAAK,cAAc,CACrB,CAEA,oBAAqB,CACnB,KAAK,aAAe,GAEf,YAAO,QAAQ45C,GAAY,KAAK,aAAa,KAAK,CAAC,GAAGA,CAAQ,CAAC,CAAC,CACvE,CAGA,cAAc7rC,EAAayY,EAAgB,CACrC,KAAK,OAAOzY,GAAK,OAASyY,EACxB,KAAK,OAAOzY,GAAK,SAAW,EACzB,YAAO,OAAOA,EAAK,CAAC,EAEzB,KAAK,OAAOA,GAAK,OAAOyY,EAAQ,CAAC,EAG9B,YAAOzY,GAAK,QAAgB/N,IAE/BA,EAAK,SAAW,EACjB,EAEH,KAAK,mBAAmB,EACxB,KAAK,cAAc,CACrB,CAEA,iBAAiBxC,EAAO,CACtB,KAAK,mBAAmB,EACxB,KAAK,mBAAqB,GAC1B,KAAK,YAAc,GAEb,MAAE,QAAW,IAEb68C,EAAoBxhD,EAAO,YAC3ByhD,EAAuBzhD,EAAO,eAE9B0hD,EAA4B,CAChC,QAAS,KAAK,OAAOF,GAAmBC,GACxC,IAAKD,EACL,OAAQC,GAGJE,EAAiBD,EAA0B,QAAQ,QAGzD,WAAW,IAAM,CACf,KAAK,sBAAwBA,EACxB,gBAAWF,EAAmBC,EAAsBE,CAAc,GACtE,EAAE,CACP,CAEA,0BAA0Bh9C,EAAOi9C,EAAkBC,EAAkB,OACnE,MAAMC,EAAsBF,EAAiB,eACvCG,EAAgB,KAAK,OAAOF,GAAkBC,GAC9CE,EAAuB,KAAK,OAAOH,GAAkB,GAAG,QAG1D,KAFsBl/C,mBAAe,cAAf,OAA8Bw9C,GAAY,WAE1CA,GAAY,WACpC,OAGI,QACJ6B,IAAyB9B,GAAQ,SACjC,KAAK,OAAO2B,GAAkB,GAAG,cAAgB1B,GAAY,OAW3D,IATD6B,IAAyB9B,GAAQ,UAChC,KAAK,OAAO2B,GAAkB,QAAU,KACzCG,IAAyB9B,GAAQ,SAChC,KAAK,OAAO2B,GAAkB,QAAU,IAC1C,CAACI,GAKC,CAAC,KAAK,sBACR,OAGI,QAAiBA,EAAkB,EAAI,EACvCC,EAAeH,EACjBD,EACA,KAAK,OAAOD,GAAkB,OAC5BM,EAAc,CAClB,QAASH,EACT,cAAe,KAAK,sBAAsB,QAAQ,cAClD,YAAa7B,GAAY,YAE3B,KAAK,OAAO0B,GAAkB,OAC5BK,EACAE,EACAD,GAEF,KAAK,YAAc,GACnBx9C,EAAM,eAAe,EACrB,KAAK,cAAc,CACrB,CAEA,aAAaA,EAAO09C,EAAqB,CACnC,IAAC,KAAK,sBACR,OAGF,KAAK,iBAAiB,EAEtB,MAAMT,EAAmBR,GAAsBz8C,EAAM,aAAc,GAE7Dk9C,EAAmBD,EAAiB,YAEtCS,IAAa7B,GAAU,OACzB,KAAK,YAAcqB,EACnB,KAAK,YAAc,GACnBl9C,EAAM,eAAe,EACrB,KAAK,cAAc,GACV09C,IAAa7B,GAAU,OAASqB,EAAmB,GAC5D,KAAK,YAAcA,EAAmB,EACtC,KAAK,YAAc,GACnBl9C,EAAM,eAAe,EACrB,KAAK,cAAc,GAEd,+BAA0BA,EAAOi9C,EAAkBC,CAAgB,CAE5E,CAEA,gBAAgBl9C,EAAO,CACf,QAAkB29C,GAAc39C,CAAK,EAEvC49C,IAAoB,KAAK,aACtB,kBAAa59C,EAAO49C,CAAe,EAExC59C,EAAM,eAAe,EAGvB,KAAK,aAAe49C,CACtB,CAEA,aAAc,CACR,KAAK,cACP,KAAK,mBAAqB,GAE9B,CAEA,kBAAmB,CAGjB,GAFA,KAAK,YAAc,OACnB,KAAK,aAAa,EACd,KAAK,sBAAuB,CACxB,MAAE,KAAI,EAAI,KAAK,sBACf,CAAE,QAAO,EAAI,KAAK,sBAClBC,EAAiB,KAAK,sBAAsB,QAAQ,QACrD,gBAAWttC,EAAKyY,EAAQ60B,CAAc,EAC3C,KAAK,cAAc,CACrB,CACA,KAAK,YAAc,EACrB,CAEA,gBAAiB,CACX,KAAK,cAAgB,QACvB,KAAK,cAAc,EAEhB,KAAK,oBAIR,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,IAJxB,KAAK,aAAa,EAClB,KAAK,cAAc,GAKrB,KAAK,sBAAwB,KAC7B,KAAK,cAAc,CACrB,CAEA,eAAgB,CAEZ,KAAK,oBACL,KAAK,cAAgB,QACrB,KAAK,wBAEA,2BAAsB,QAAQ,QAAUtC,GAAQ,SACrD,KAAK,OAAO,OAAO,KAAK,YAAc,EAAG,EAAG,CAC1C,KAAK,sBAAsB,QAC5B,GAEH,KAAK,YAAc,MACrB,CAEA,cAAe,CACb,KAAK,OAAS,GAET,kBAAa,QAAQa,GAAY,KAAK,OAAO,KAAK,CAAC,GAAGA,CAAQ,CAAC,CAAC,CACvE,CAEA,WAAW7rC,EAAKyY,EAAQg0B,EAAgB,CACtC,KAAK,OAAOzsC,GAAK,OAAOyY,EAAQ,CAAC,EAC7B,KAAK,OAAOzY,GAAK,SAAW,GACzB,YAAOA,GAAK,KAAK,CACpB,QAASysC,EACT,YAAaxB,GAAY,OAC1B,EAEH,KAAK,cAAc,CACrB,CAEA,iBAAkB,CAChB,KAAK,OAAO,QAAQ,CAACjrC,EAAK5E,IAAU,EAC9B4E,EAAI,SAAW,GAAKA,EAAI,GAAG,cAAgBirC,GAAY,SACpD,YAAO,OAAO7vC,EAAO,CAAC,CAC7B,CACD,CACH,CAEA,eAAgB,CACd,MAAMmyC,EAAY,CAAC,GAAG,KAAK,MAAM,EACjC,KAAK,OAAS,GACd,KAAK,cAAc,EACnB,KAAK,OAASA,CAChB,CAEA,cAAct9B,EAASu9B,EAAUC,EAAa,CACrC;AAAA/hD;AAAAA,qBAEU8hD;AAAA,wBACGC;AAAA,sBACFx9B,EAAQ,cAAgB,QACtCA,EAAQ,cAAgBg7B,GAAY;AAAA,sBACtB,KAAK;AAAA,qBACN,KAAK;AAAA,iBACT,KAAK;AAAA,oBACF,KAAK;AAAA,gCACOh7B,EAAQ,UAAY+6B,GAAQ,QAChD,WACA;AAAA;AAAA,UAEFS,GAAqBx7B,CAAO;AAAA,UAC3B,KAAK,sBAsBJvkB,IArBAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,4BAKgB,IAAM,KAAK,cAAc8hD,EAAUC,CAAW;AAAA;AAAA;AAAA,gBAGzDx9B,EAAQ,UAAY+6B,GAAQ,SAAWyC,IAAgB,GAC1Dx9B,EAAQ,UAAY+6B,GAAQ,QACxBt/C;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,kCAKgB,IAAM,KAAK,cAAc8hD,CAAQ;AAAA;AAAA;AAAA,oBAIjD9hD;AAAAA;AAAAA;AAAAA,KAKhB,CAEA,UAAUmgD,EAAU2B,EAAU,CACrB;AAAA9hD;AAAAA,2BAEgBmgD,EAAS,GAAG,cAAgBZ,GAAY,OACvD,iBACA;AAAA;AAAA,UAEFY,EAAS,IAAI,CAAC57B,EAAS7U,IACvB,KAAK,cAAc6U,EAASu9B,EAAUpyC,CAAK;AAAA;AAAA;AAAA,2BAI1B,KAAK,uBACxB,KAAK,cAAgBoyC,GACrB3B,EAAS,GAAG,cAAgBZ,GAAY,OACpC,GACA;AAAA,qBACSuC;AAAA,iBACJ,KAAK;AAAA;AAAA,UAEZ,KAAK,4BAA4BA,CAAQ;AAAA,UACzC7B,GAAuB,GAAG,KAAKA,GAAuB,GAAG;AAAA;AAAA,KAGjE,CAEA,4BAA4B6B,EAAU,OAC9B,QACJ,KAAK,cAAgB,QAAa,KAAK,cAAgBA,EACnD/B,IAAqBh+C,OAAK,wBAAL,cAA4B,OAAO,EACxD,IACC,YAAQk+C,GAAuB95B,CAAO,IAC/C,CAEA,QAAS,CACA;AAAAnmB;AAAAA,UAED,KAAK,OAAO,IAAI,CAACmgD,EAAUzwC,IAC3B,KAAK,UAAUwwC,GAASC,CAAQ,EAAGzwC,CAAK;AAAA;AAAA,KAIhD,CACF,EA3ZqBixC,GACZ,OAASzgD;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IADGygD,GAArBxgD,IADCE,EAAc,mBAAmB,GACbsgD,yMC1CrB,IAAqBqB,GAArB,cAA4C1/C,EAAI22C,EAAU,CAAE,CAC1D,MAAM,WAAY,CAChB,MAAMhB,EAAS,GACV,aAAU,KAAK,SAAY,MAAM,KAAK,IAAI,WAAW,KAAK,SAAS,EAExE,MAAM2D,EAAc,GAEf,aAAQ,WAAW,QAAcxsB,IAChCA,EAAG,oBAAsB,KAAK,kBACpBwsB,OAAKxsB,EAAG,IAAI,EACf,KAAK,mBACT,uBAAkB,QAAiBysB,IAClCzsB,EAAG,KAAK,SAASysB,CAAK,GACZD,OAAKxsB,EAAG,IAAI,CAC1B,CACD,CACH,CACD,EAED,MAAM,QAAQ,IACZwsB,EAAY,IAAI,MAAME,GAAQ,CACrB7D,IAAK6D,EAAK,MAAM,GAAG,CAAC,GAAK,MAAM,KAAK,IAAI,UAAUA,CAAI,EAC9D,GAGH,KAAK,MAAQ7D,EACb,IAAIpW,EAAW30B,EAAK,KAAK,OAAQ,CAAE,SAAU,GAAM,EACnD,MAAMgrC,EAAUhrC,EAAK,KAAK,UACxB,CAAC,MAAO,KAAK,EAAE,SAASyhB,EAAM,KAAK,GAErC,GAAIupB,GAAW,KAAK,MAAMA,EAAQ,MAAO,CACvC,MAAMnD,EAAS,KAAK,MAAMmD,EAAQ,MAAM,GAAG,KACvCnD,GAAUA,EAAO,KACnB,KAAK,SAAW,CACd,IAAKnvB,EAAKmvB,CAAM,EAAE,GAClB,IAAKA,EAAO,GAAG,IAGrB,CACA,SAAW,KAAK,iBAAmBlT,EAAS,OAAS,KAAK,OAAO,GAAG,MAC/D30B,EAAK,KAAK,OAAQ,CAAE,MAAO20B,EAAU,IAC7BA,OAAK,OAAO,GAAG,OAE5B,KAAK,gBAAkBA,EACvB,KAAK,aAAaA,CAAQ,EAC1B,KAAK,YAAY,EAEZ,YAAO,QAAiBlT,IACvBA,EAAM,aACFA,aAAaA,EAAM,WAAW,UAEhC,CAACS,EAAG,cACJ,KAAK,MAAMT,EAAM,MAAM,KACrBqtB,GAAU5sB,EAAG,eAAiB4sB,EAAO,YACvC,GAEN,CACD,EACG,KAAK,mBACP,OAAO,QAAQ,KAAK,KAAK,EAAE,QAAStH,GAAwB,CAC1DA,EAAK,GAAG,QAAQ,CAACtlB,EAAI5oB,IAAM,CACrB,KAAK,kBAAkB,SAAS4oB,EAAG,YAAY,IAC5C,WAAMslB,EAAK,IAAIluC,GAAG,KAAO,KAAK,MAAMkuC,EAAK,IAAIluC,GAAG,KAAK,IAChDD,IACF,MACJ,OAAIA,EAAK,KAAO,KAAM07C,EAAS,YAAY,CAAC17C,EAAK,IAAI,QAAQ,CAAC,CAAC,EACtDA,EAAK,KAAO,KACV07C,cACN,KAAK,QAAQ,KAAK,mBAAqB17C,EAAK,IAAI,QAAQ,CAAC,GAEhD07C,OACP,CAAC17C,EAAK,GAAI07C,CAAM,CACzB,GAEJ,CACD,EACF,EAGH,KAAK,WAAWpgB,CAAQ,EACxB,KAAK,cAAc,EACZ,KAAK,KACd,CAGA,WAAWuV,EAAK/sC,EAAM2pC,EAASuD,EAAU,IAAU,CACjD,GAAIH,EAAI,WAAY,CAClB,MAAMoC,EAAS,GACf,SAAI,WAAW,QAAQ,CAACC,EAAOjzC,IAAM,CAC/B,KAAM,kBAAoBizC,EAAM,iBAAkB,CAC9C,QAAQvsC,EAAK7C,EAAM,CACvB,aAAcovC,EAAM,iBACrB,EACKvF,EAAQhnC,EAAK7C,EAAM,CACvB,aAAcovC,EAAM,iBACrB,EACKC,EAAStrC,GAAQ+lC,EAAM,KAAMh5B,CAAI,EACjC45B,EAAS,GAETb,OAAK,QAAciE,IACvB,MAAM/oB,EAAK+oB,EAAG,GACRG,EAAO,IAAI,KAAKlpB,CAAE,EAAE,QAAQ,EAC5B+F,EAAMgjB,EAAG,GACTrjB,EAAM4kB,EAAOtqB,GAAMsqB,EAAOtqB,GAAI,GAAG,GAAK,KACxCkpB,GAAQtE,GAAWsE,GAAQf,GAC7BxC,EAAO,KAAK,CAACuD,EAAMxjB,EAAKK,CAAG,CAAC,CAC9B,CACD,EAEMqkB,OACL5qC,EACE,CACE,KAAMmmC,EACN,GAAI,QAAQvuC,IACZ,KAAM,KAAK,gBACX,MAAO,wBACP,KAAM,YACN,YAAa,GACb,MAAO,YACP,MAAO,EAEP,SAAU,GACV,OAAQ,CACN,QAAS,EACX,EACA,QAAS,CACP,YAAa,IAAI2tC,EAAM,gBACvB,YAAa,UACf,CACF,EACAsF,EAAM,OACR,EACF,KACK,CACL,MAAMrqB,EAAKliB,EAAK7C,EAAM,CAAE,aAAcovC,EAAM,aAAc,EACtDrqB,IAIEqqB,EAAM,UACEzF,MACP,KACA,SAASx2C,EAAM,SAASi8C,EAAM,OAAO,CAAC,EACtC,QAAQ,GAEND,OACL5qC,EACE,CACE,KAAM,KAAK,iBAAiBwgB,EAAG,KAAM4kB,EAASuD,CAAO,EACrD,GAAI,QAAQ/wC,IACZ,KAAM,KAAK,gBACX,MAAO,UACP,MAAO,YACP,SAAU,GACV,OAAQ,CACN,OAAQ,EACR,QAAS,EACX,EACA,QAAS,CACP,YAAa,IAAI4oB,EAAG,eACtB,CACF,EACAqqB,EAAM,OACR,GAGN,EACD,EACMD,CACT,CACA,GAAInvC,EAAK,GAAI,CACL,QAAU+sC,EAAI,SAAW,GACzBhoB,EAAK/kB,EAAK,GACT,OACLuE,EACE,CACE,KAAM,KAAK,iBAAiBwgB,EAAG,KAAM4kB,EAASuD,CAAO,EACrD,GAAI,OACJ,MAAO,UACP,KAAM,KAAK,gBACX,MAAO,YACP,SAAU,GACV,OAAQ,CACN,OAAQ,EACR,QAAS,EACX,EACA,QAAS,CACP,YAAa,IAAInoB,EAAG,gBACpB,YAAa,gBACf,CACF,EACA5b,CACF,EAEJ,CACF,CAEA,oBAAqB,WACf,MACA,KAAK,oBACO0uC,OAAK,QAAQ,KAAK,oBAE5B,SAAgBngD,OAAK,SAAL,cAAa,KAC7By6C,EAAYC,EACdC,GAAQvZ,GAAQsZ,EAAc,IAAY/H,QAAK,MAAMA,EAAK,CAAC,CAAC,EAC5D,KACE4H,EAAe,CACnB,MAAO,CAEL,UAAW,GACX,KAAM,KAAK,UACX,UAAW,OACX,SAAU,IACV,QAAS,CACP,QAAS,EACX,CACF,EACA,MAAO,CACL,mBAAoB,EACtB,EACA,OAAQ,CAAC,EACT,YAAa,CACX,KAAM,CACJ,UAAW,IACb,EACA,OAAQ,CACN,aAAc,CAChB,EACA,OAAQ,CACN,UAAW,GACX,QAAS,KAAK,UAAY,OAAY,KAAK,QAAU,EACrD,MAAO,CACL,QAAS,EACX,EACA,OAAQ,CACN,SAAU,CACR,QAAS,CACX,CACF,CACF,CACF,EACA,MAAO,CACL,CACE,SAAU,KAAK,cAAgB,GAC/B,SAAU,KAAK,aAAa,eAAe,EAC3C,QAAS,KAAK,aAAa,UAAU,EACrC,QAAS,KAAK,aAAa,UAAU,EACrC,SAAU,GACV,MAAO,CACL,KAAM,KAAK,aAAe,KAAK,KAAK,EAAE,cAAc,CACtD,CACF,EACA,CACE,SAAU,GACV,SAAU,EACV,OAAQ,CACN,WAAY,CACH,SACH,WAAW4F,EAAc,KAAK,KAAK,EAAE,QAAQ,CAAC,EAC9C,KAAK,KACX,CACF,EACA,MAAO,CACL,KAAM,KAAK,oBACb,CACF,CACF,EACA,MAAO,CACL,CACE,GAAI,YACJ,KAAM,WACN,QAAS,GACT,OAAQ,CACN,WAAY,CACV,OAAO,KAAK,sBAAwB,UAClC,KAAK,iBAAiB,WAAa,OACjC,MAAM,KAAK,KAAK,sBAAsB,KAAK,IAAI,QAC/C,KAAK,KAAK,sBAAsB,KAAK,IAAI,CAC/C,CACF,CACF,EACA,CACE,QAAS,GACT,IAAK,EACL,IAAK,EACL,GAAI,WACN,CACF,GASE,GAPJ,KAAK,UAAY,GAGb,KAAK,qBACP,KAAK,wBAAwB5F,CAAY,EAGvCE,GAAaA,EAAU,KAAKptB,GAAMA,EAAG,KAAK,OAAS,CAAC,EAAG,CACzD,IAAIutB,EAAQ,IACZ/sC,UAAK,SAAL,cAAa,QAAb,QAAoB,QAAQ,CAACrJ,EAAMC,IAAM,CACvC,MAAMi0B,EAAS+hB,EAAU,OACvBptB,KAAK,OAAO,SAASA,EAAG,YAAY,GAEtC,GAAIqL,EAAO,KAAKrL,GAAMA,EAAG,KAAK,MAAM,EAAG,CACjC,IAAE,QAAW,IACb7oB,EAAK,SAAW,SACdk0B,EAAO,GAAG,KAAK,GAAG,GAAK,KAAK,eACrBmiB,KAEAA,KAGP,CAACA,GAAUD,IACJC,KACDD,OAGP,qBACHL,EACA7hB,EACA,SAASj0B,KACTD,EAAK,OAAS,KAAK,KAAK,EAAE,aAAa,EACvC,KACAq2C,GAEF,KAAK,UAAY,EACnB,GAEJ,CAEI,QAAK,MAAM,KAAK,QAAS,CAC3B,MAAMC,EAAmB,CACvB,MAAO,EACP,MAAO,sBACP,UAAW,UACX,MAAO,CACL,MAAO,OACP,EAAG,GACH,EAAG,CACL,GAEG,qBACHP,EACA,KAAK,kBAAkB,KAAK,MAAM,KAAK,OAAO,EAC9C,UACA,gBACAO,EACA,GAEJ,CACO,QACT,CAEA,WAAWrxB,EAAQsJ,EAAKK,EAAK,CACrB,QAAMjoB,EAAK,KAAK,OAAQ,CAAE,MAAOse,CAAO,CAAC,GAAK,KAAK,OAAO,GAE5D4rB,EAAI,aACN,KAAK,WACF,cAAc,eAAe,EAC7B,UAAU,OAAO,YAAY,EAEhC,KAAK,WACF,cAAc,eAAe,EAC7B,UAAU,IAAI,YAAY,EAG7B,KAAK,QAAQ,kBACb,KAAK,QAAQ,mBAAqB,OAElC,KAAK,WACF,cAAc,eAAe,EAC7B,UAAU,IAAI,YAAY,EAE/B,KAAK,MAAM,OACR,UAAcre,EAAI,YAAY,IAAMA,EAAI,YAAY,GAAG,SAAS,MAAM,CAAC,EACvE,WAAeA,EAAI,OAAO,EAAK,CAAC,EACnC,MAAMib,EAAUlf,GAAO,KAAK,0BAA0BtJ,CAAM,EACxD,MAAU2J,GAAO,KAAK,0BAA0B,EACpD,MAAMqiB,EAAQ,KAAK,MAAM,IAAI,WAAW,EAwCpC,GAvCJ,KAAK,MAAM,UACPJ,EAAI,aACN,KAAK,WAAaA,EAAI,WACtB,KAAK,WAAW,eAAe,WAAW,EAAE,QAAU,KAAK,cAE7DA,EAAI,YACFA,EAAI,WAAW,QAAchoB,IACvBA,EAAG,UACKmoB,OAAK,0BAA0BnoB,EAAG,OAAO,EACrD,CACD,EAECgoB,EAAI,UACFA,YAAU,QAAckE,IACpB,QAAM,CAAE,GAAGA,GACbC,KAAK,WAAWD,EAAG,KACvBC,EAAI,MAAQ,KAAK,0BAA0BD,EAAG,KAAK,EAC/CA,EAAG,OACDlE,aAAW,KAAK7wC,GAAQA,EAAK,eAAiB+0C,EAAG,MAAM,GACzD9D,EAAM,YAAY+D,CAAG,EAEvB/D,EAAM,YAAY+D,CAAG,CACvB,CACD,EAED/D,EAAM,kBAAkB,QACtB8D,GAAMA,EAAG,GAAG,SAAS,UAAU,GAAK9D,EAAM,eAAe8D,EAAG,EAAE,GAIlE9D,EAAM,eAAe,IAAI,EACzBA,EAAM,eAAe,OAAO,EACxBJ,EAAI,aACNI,EAAM,YAAY,KAAM,KAAM,GAAO,EAAK,EAC1C,KAAK,aAAa,GAElBA,EAAM,YAAYxD,EAASuD,EAAS,GAAO,EAAK,EAE7C,WAAM,IAAI,MAAM,GAAK,KAAK,MAAM,IAAI,MAAM,EAAE,OAAO,EAAK,EACzD,KAAK,MAAMH,EAAI,MAAO,CACxB,MAAM3rB,EAAS,KAAK,WAClB2rB,EACA,KAAK,MAAMA,EAAI,MACfpD,EACAuD,GAGIiE,EAAYpE,EAAI,cAClB,KAAK,2BACHA,EACA,KAAK,MAAMA,EAAI,MACfpD,EACAuD,GAEF,MAAM,QAAQ9rB,CAAM,EACpBA,EAAO,GACPA,EACA+vB,IAEF,QAAQ,KAAK,OAAO,EACf,sBAAmBlsB,GAAQksB,EAAU,KAAM,CAAC,CAAC,EAAG,CAAC,MAAM,CAAC,EAAE,IACrDj1C,IACN,MAAMw2B,EAAO,GACRx2B,UAAQ,CAACwuB,EAAMvuB,IAAM,CACpBA,EAAI,GACNu2B,EAAK,KAAK,KAAK,cAAchI,CAAI,CAAC,CACpC,CACD,EACGgI,EAAK,SAAW,IACbA,KAAK,MAAMA,EAAK,UAEjB,QAAMA,EAAK,KAAK,KAAK,EAEpB,OACL,UAAWv/B,EAAM+I,EAAK,EAAE,EAAE,OAAO6wC,EAAI,YAAc,MAAM,EACzD,MAAO/xC,EAEX,GAEF,QAAQ,QAAQ,OAAO,EACvB,KAAK,WAAW,eAAe,WAAW,EAAE,KAC1C,KAAK,kBAEFomB,UAAQ,CAAC2D,EAAI5oB,IAAM,CACxB,KAAK,MAAM,UAAU4oB,EAAI5oB,IAAMilB,EAAO,OAAS,CAAC,EACjD,CACH,CACF,CACF,EAldqBu2B,GAArB7hD,IADCE,EAAc,mBAAmB,GACb2hD,yMCtBrB,IAAqBG,GAArB,cAA8CxiD,CAAW,CAWvD,MAAM,aAAa6F,EAAU,CAC3B,MAAMI,EAASL,GAAyBC,EAAU,CAAC,WAAW,CAAC,EAC/D,KAAK,IAAMyL,IACX,KAAK,UAAYrL,EAAO,UACxB,KAAK,QAAU,MAAM,KAAK,IAAI,WAAW,KAAK,SAAS,EAChD,cAAO,KAAMA,EAAO,OAAO,CACpC,CAEA,WAAW,YAAa,CACf,OACL,QAAS,CAAE,KAAM,MAAO,EACxB,QAAS,CAAE,KAAM,MAAO,EAE5B,CAEA,QAAS,CAEA;AAAA5F,QACH,KAAK,SAAW,KAAK,QAAQ,KAAK,SAChCsR,GAAW,KAAK,QAAQ,KAAK,QAAQ,EACrC;AAAA,WAER,CACF,EAlCqB6wC,GACZ,OAASjiD;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IADGiiD,GAArBhiD,IADCE,EAAc,oBAAoB,GACd8hD,yMCQrB,IAAqBC,GAArB,cAAyCziD,CAAW,CAApD,kCA6DE,YAIQ,GAEO,aAEO,oBAEtB,WAAW,YAAa,CACf,OACL,OAAQ,CAAE,KAAM,MAAO,UAAW,EAAM,EACxC,KAAM,CAAE,KAAM,OAAQ,UAAW,EAAM,EACvC,YAAa,CAAE,KAAM,OAAQ,UAAW,EAAM,EAElD,CAIA,MAAM,cAAe,CACb,QAAamF,GAAe,MAAM,EACxC,GAAIu9C,EAAY,CACR,QAAS,MAAMC,GAAUD,CAAU,EACzC,KAAK,OAASE,EAAO,OACrB,KAAK,KAAOA,EAAO,KACnB,KAAK,YAAcA,EAAO,iBAE1B,KAAK,OAAS5C,KACd,KAAK,KAAO,iBACZ,KAAK,YAAc,qBAEvB,CAEA,QAAS,CACA;AAAA3/C;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,wBAUa,KAAK;AAAA,wBACCoG,QAAK,KAAOA,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAU3B,KAAK;AAAA,wBACCA,QAAK,YAAcA,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAOlC,KAAK;AAAA;AAAA;AAAA;AAAA,sCAIS,KAAK;AAAA;AAAA,KAGzC,CAEA,MAAM,YAAa,CACjB,MAAMo8C,EAAYnqB,EAAe,KAAM,mBAAmB,EAAE,OAEtDoqB,EAAU,MAAMhD,GAAW,KAAK,KAAM,KAAK,YAAa+C,CAAS,EAEnEC,GACFx9C,GAAe,OAAQw9C,CAAO,CAElC,CACF,EA/IqBL,GACZ,OAASliD;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IADGkiD,GAArBjiD,IADCE,EAAc,cAAc,GACR+hD,yMCLrB,IAAqBM,GAArB,cAA0C/iD,CAAW,CA0BnD,aAAc,CACN,QAIR,UAAO,GAGA,uBAGO,oBATZ,KAAK,IAAMsR,GACb,CAUA,MAAM,aAAazL,EAAU,OAC3B,MAAMI,EAASL,GAAyBC,EAAU,CAAC,SAAS,CAAC,EACrD,YAAII,EAAO,OAAO,EAErB,WAAO7D,IAAO,UAAP,cAAgB,KAE5B,KAAK,UAAU,CACjB,CAEA,aAAa4gD,EAAS,CACpB,OAAO,IAAI,IACT,GAAG,OAAO,SAAS,aAAa,OAAO,SAAS,OAAO,OAAO,SAAS,WAAW,KAAK,IAAI,WAAW,KAAK,QAAQA,GACnH,MACJ,CAEA,MAAM,WAAY,CAChB,MAAMr9B,EAAM,MAAM,KAAK,IAAI,aAAa,IAAI,KAAK,iBAAiB,EAElE,KAAK,KAAOA,EAAI,KACb,KAAK,CAACvd,EAAGC,IAAM,IAAI,KAAKA,EAAE,YAAY,EAAI,IAAI,KAAKD,EAAE,YAAY,CAAC,EAClE,IAAY66C,KAAE,MAAOA,EAAI,KAAK,QAAQ,OAAQ,EAAE,EAAG,MAAOA,EAAI,MAAO,EACpE,KAAK,KAAK,SACZ,KAAK,YAAc,GAAG,KAAK,aAAa,KAAK,KAAK,GAAG,KAAK,IAE9D,CAEA,QAAS,CAEA,YAAK,MAAQ,KAAK,YACrB5iD;AAAAA;AAAAA,yBAEsBoG,IACT,iBAAc,GAAG,KAAK,aACzBA,EAAE,OAAO,eAAe,KAC1B;AAAA;AAAA,gBAGA,KAAK,KAAK,IACVG,GACEvG,uBAA0BuG,EAAK;AAAA,uBAC1BA,EAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kDASsB,KAAK;AAAA;AAAA,kBAG/CvG,wBACN,CACF,EA7FqB0iD,GAEZ,OAASxiD;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IAgChBC,IADCC,EAAS,CAAE,KAAM,OAAQ,GAjCPsiD,GAkCnB,oBAGAviD,IADCC,EAAS,CAAE,KAAM,OAAQ,GApCPsiD,GAqCnB,2BArCmBA,GAArBviD,IADCE,EAAc,gBAAgB,GACVqiD,yMCJrB,IAAqBG,GAArB,cAAgDvgD,EAAImvC,EAAc,CAAE,CAClE,SAASvgC,EAAO,CACV,MACE,QAAM,KAAK,QAAQA,EAAM,OAmC3B,GAlCC7L,EAEM6L,EAAM,OAAS,SACxBxL,EAAM,IAAI,KAAK,aACb,KAAK,KAAK,SACVwL,EAAM,cAAgB,KAAK,cAAgB,CAAC,CAC5C,SAAO,WAAW7L,CAAG,CAAC,EACf6L,EAAM,OAAS,aACxBxL,EAAM,IAAI,KAAK,aACb,KAAK,KAAK,SACVwL,EAAM,cAAgB,KAAK,cAAgB,CAAC,GAC5C,OAAO,WAAW7L,EAAI,QAAQ,IAAK,GAAG,CAAC,CAAC,EACjC6L,EAAM,OAAS,OAClBxL,KACJ,KAAK,QAAQwL,EAAM,OAAO,QAAQ,SAAU,eAAe,GAEpDA,EAAM,OAAS,MAClBxL,KAAG,KAAK,QAAQwL,EAAM,IAAI,OAAO,KAAK,QAAQA,EAAM,IAAI,OAC5D,KAAK,QAAQA,EAAM,IAAI,OACrB,KAAK,QAAQA,EAAM,IAAI,OAAO,KAAK,QAAQA,EAAM,IAAI,MAChDA,EAAM,OAAS,OAClBxL,KACJ,0FACE,KAAK,QAAQwL,EAAM,WAChB,KAAK,QAAQA,EAAM,cAGpBxL,OAAK,QAAQwL,EAAM,OA1BnBxL,MA6BJA,IAAQ,KAAOwL,EAAM,YACjBxL,OAAK,KAAK,EAAEA,CAAG,GAGnBA,IAAQ,KAAOwL,EAAM,MACvB,GAAI,MAAM,QAAQA,EAAM,KAAK,EAAG,CAC9B,IAAI0gC,EAASvsC,EACP6L,QAAM,QAAgB3K,IAC1BqrC,EAASA,EAAO,QAAQrrC,EAAK,MAAOA,EAAK,IAAI,EAC9C,EACKb,SAENA,EAAML,EAAI,QAAQ6L,EAAM,MAAM,MAAOA,EAAM,MAAM,IAAI,EAGrD,WAAQ,KAAOA,EAAM,SACvBxL,EAAMiM,EAAS,GAAGjM,IAAMwL,EAAM,SAAU,KAAK,OAAO,GAE/CxL,CACT,CACF,EAtDqBm9C,GAArB1iD,IADCE,EAAc,uBAAuB,GACjBwiD,yMCArB,IAAqBC,GAArB,cAAoDxgD,EAAIsxC,EAAkB,CAAE,CAA5E,kCACiB,sBAEf,sBAAmB,CAAC,OAAQ,QAAS,eAAgB,QAAQ,EAEtC,2BACrB,MACA,gBACA,aACA,gBACA,SACF,CAEA,SAASvpC,EAAM2pC,EAAS,CACtB,MAAMhd,EAAO3sB,EAAK,GAAG,QAAQ,MAAM,GAAG,EAEhC04C,EAAmB/rB,EAAK,QAAQ,gBAAgB,EAChDqd,EAAqBrd,EAAK,QAAQ,eAAe,EACjDsd,EAAuBtd,EAAK,QAAQ,cAAc,EAClDud,EAAO,GACb,QAAQ,KAAK,wBAAwB,EAC/B,SACH/2C,EAAM,EAAE,UAAU,EAAIA,IAAQ,KAAK,aAAe,GAAK,IACrD,YAAG,KAAK,QAAgB+I,UAC3B,MAAMkuC,EAAS,IAAI,KAAKluC,EAAK,EAAE,EAAE,QAAY,IAC7C,GAAIkuC,EAAST,EAAS,CAChB,OACAjyC,OAAK,yBAAL,QAA6B,SAASsI,EAAK,GAAG,cAChDnF,EACEqB,EAAKw8C,KAAsB,KACvB,GACA,KAAK,IACHx8C,EAAKw8C,GAAoB,KAAK,QAAQ,KAAK,oBAC3C,QAAQ,CAAC,EAEjB79C,EAAQqB,EAAK,KAAO,KAAO,GAAKA,EAAK,GAAG,QAAQ,CAAC,EAE7C,QAAM,CAAC/I,EAAMi3C,CAAM,EAAE,OAAO,MAAM,EAAGvvC,CAAK,EAE1C89C,EACJz8C,EAAKw8C,KAAsB,KACvB,GACAx8C,EAAKw8C,GAAkB,QAAQ,CAAC,EAGtC,GAFAzuC,EAAI,KAAK0uC,CAAM,EAEX3O,IAAuB,GAAI,CAC7B,MAAMG,EACJ,KAAK,cAAcjuC,EAAK8tC,KACxB,KAAK,cAAc,QACrB//B,EAAI,KAAKkgC,CAAY,CACvB,CAEIF,IAAyB,IACvBhgC,OAAK/N,EAAK+tC,EAAqB,EAErCC,EAAK,KAAKjgC,CAAG,CACf,EACD,EACD,QAAQ,QAAQ,wBAAwB,EACjCigC,CACT,CACF,EA7DqBuO,GAArB3iD,IADCE,EAAc,2BAA2B,GACrByiD,yMCerB,IAAqBG,GAArB,cAA6C3gD,EAAI+4B,EACjD,CAAE,CAEA,QAAS,CAEP,YAAK,UAAU,OAAO,QAAS,KAAK,aAAe,OAAO,EAGtD,KAAK,eAAiB,KAAK,WAC7B,KAAK,aAAa,EAGlB,KAAK,cACL;AAAAr7B,UACI,KAAK;;;yBAGU,KAAK,KAAK,EAAE,eAAe;AAAA,oBAChC,KAAK;AAAA,qBACCoG,IACd,KAAK,gBAAkB,GAClB,mBAAgBA,EAAE,OAAO;AAAA;AAAA;AAAA,UAIhC,KAAK,eAAiB,KAAK,aAAe,QACxC,KAAK,qBACLpG;AAAAA;AAAAA,UAEF,KAAK,aAAe,QACpBA;AAAAA;AAAAA,8BAEoB,KAAK;AAAA,iCACF,KAAK;AAAA,gCACN,KAAK,WAAW;AAAA,6BACnB,KAAK;AAAA,4BACN,KAAK;AAAA,2BACDoG,IAChB,KAAK,gBAAkB,GACvB,KAAK,cAAgB,KAAK,UAAUA,EAAE,OAAO,KAAK;AAAA;AAAA,kCAIxDpG;AAAAA;AAAAA;AAAAA;AAAAA,sBAIY,KAAK;AAAA,oBACP,KAAK;AAAA,sBACEoG,IACf,KAAK,gBAAkB,GAClB,gBAAaA,EAAE,OAAO;AAAA;AAAA,kDAGW,KAAK;AAAA;AAAA,cAEzC,KAAK,aAAe,QAAU,KAAK,YAAgB;AAAApG;AAAAA;AAAAA,cAGnD,KAAK,aAAe,MAAQ,KAAK,UAAc;AAAAA;AAAAA;AAAAA,UAGnD,KAAK,aAAe,QACpBA,IACAA;AAAAA;AAAAA;AAAAA,4BAGkB,KAAK;AAAA,4BACL,KAAK;AAAA;AAAA;AAAA;AAAA,kDAKiB,KAAK;AAAA,YAC3C,KAAK,KAAK,EAAE,aAAa;AAAA,YACzBxC,EAAM,GAAG,KAAK,WAAW,oBAAoB,EAAE,OAAO,MAAM;AAAA,YAC5D,KAAK,KAAK,OAAO,mBAAmBA,EAAM,EAAE,GAAG,EAAE,OAAO,KAAK,CAAC,CAAC,EAC7D,KAAK,KAAK,EAAE,mBAAmBA,EAAM,EAAE,GAAG,EAAE,OAAO,KAAK,CAAC,CAAC,EAC1DA,EAAM,EAAE,GAAG,EAAE,OAAO,KAAK;AAAA;AAAA,OAIrC,CAEF,EApFqBylD,GAArB9iD,IADCE,EAAc,mBAAmB,GACb4iD,ICnBrB,IAAel8C,IACb,CACE,UAAW,SACX,aAAc,SAAY,CACxB,MAAMgC,cAAO,kHACf,CACF,CACF,mMCQA,IAAqBm6C,GAArB,cAAwCh5C,GAAYvK,CAAU,CAAE,CAQ9D,aAAc,CACN,QACN,KAAK,aAAe,GACpB,KAAK,eAAiB,mBACxB,CAEA,QAAS,CACH,OAAC,KAAK,aAIHK,2BAA8BsH,GAAU,sBAHtC,KAAK,eAIhB,CAEA,cAAe,CACR,mBACHH,GAAW,KAAK,eAAgBJ,EAAa,EAAE,KAAeL,IAC5DiD,GAAK,CAAE,SAAUjD,EAAO,OAAS,GACjC,KAAK,QAAUA,EACf,KAAK,aAAe,GACrB,EAEL,CACF,EA/BqBw8C,GACZ,OAAShjD;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IADGgjD,GAArB/iD,IADCE,EAAc,cAAc,GACR6iD","names":["p","relList","link","processPreload","mutations","mutation","node","getFetchOpts","script","fetchOpts","dayjs","duration","customParseFormat","advancedFormat","localizedFormat","relativeTime","utc","timezone","i18next","lng","getCurrentLang","i18nInstance","nls","language","rs","namespace","initFn","languageDetector","err","extendCls","superclass","addNls","i18nMixin","nls$2","en","is","fr","de","target","selector","all","getIconPath","iconName","libName","KiIcon","LitElement","icons","ic","iconPath","unsafeSVG","html","until","css","__decorateClass","property","customElement","KiIconBtn","fnName","wrapper","originFn","SM","MD","LG","LANDSCAPE","emitter","EventEmitter","XSM_BREAKPOINT","MD_BREAKPOINT","ViewPort","detect","hasChaged","w","h","_newSize","_newLandscape","debounce","connectedCallbackForTarget","disconnectedCallbackForTarget","clz","f","claz","_a","name","key","_options","anonymity","k","initial","Mix","clzs","c1","c2","c3","defaultUrl","_searchString","_lastParamsString","_urlParams","_getUrlParams","_rewriteHashedSearchParams","newString","path","searchString","searchParamsChangedSubject","BehaviorSubject","HashRouter","Router","search","pathname","pathWithSearchParam","newRoute","oldRoute","context","globalHashChangeHandler","event","HASHCHANGE","router","getSearchParams","initRouter","baseUrl","setRoutes","routes","commands","newPath","attachRouter","outlet","getCurrentLocation","getCurrentPath","getSearchParamString","getSearchParam","param","getAllSearchParams","setSearchParam","value","urlParams","rest","val","paramString","getRouteOptionsAndParams","location","paramNames","ret","paramName","params","navigateTo","conserveSearchParams","navTo","searchParamString","addString","unregisterRouter","KiLink","e","KiBreadcrumbs","PropertyDefaultValue","item","i","l","config","initialized","_assertInitialized","getRoutesFromConfig","configRoutes","importActions","route","actions","act","initConfig","configPath","getConfig","getRoutes","getNavItemLabel","navItem","subNavItem","getNavItems","getLogoOptions","getCsvDelimiter","getPreviousSiblings","child","a","b","siblings","getFullPath","getCrumb","fullPath","label","recursivelyGetCrumbs","siblingsCrumbs","sibling","parentCrumbs","calculateBreadCrumbs","KiAppBreadcrumbs","KiApp","responsiveMixin","_initDarkMode","__vitePreload","themeService","KiAppBootstrapper","KiNav","t","ReplaySubject","darkTheme","updateTheme","currentTheme","setDarkTheme","newTheme","dontUpdate","init","isDarkTheme","toggleTheme","newValue","activateLightTheme","activateDarkTheme","Loader","LoaderMixin","MsgMixin","msg","data","_match","p1","get","RGBAToHex","rgba","r","inParts","g","outParts","part","padZero","str","len","colorVal","bw","hex","rStr","gStr","bStr","fallbackCopyTextToClipboard","text","textArea","copyTextToClipboard","handle","touchstartX","touchstartY","touchendX","touchendY","timerstart","setWithExpiry","ttl","session","now","itemStr","deUmlaut","string","filename","defaultLayer","API","reportsPath","basePath","configSubPath","staticConfigPath","dataPath","find","classes","query","stations","site_no","station_no","ahref","base","stationNo","stationId","siteNo","_b","reports","sortBy","filter","s","parameterName","tsName","groupBy","stobj","station","entry","token","cleanShortName","nocache","response","merge","keyBy","alias","parFilter","par","condition","has","resp","ids","id","prev","current","additionaldata","externalData","index","datattr","_c","map","obj","_e","prop","first","filteredstations","stat","dataLayer","maxVal","maxBy","list","st","reportGroup","fileName","images","img","x","doFetch","currentApi","args","getCurrentApi","field","BaseTable","repeat","col","unsafeHTML","keyFn","_item","getFromItem","prefix","template","suffix","style","PromiseData","error","cloneDeep","maxIterations","object","propertyName","iteration","proto","targetDescriptor","delay","_target","_key","descriptor","fn","ldb","debounceMixin","targetProperty","propertyDescriptor","getPropertyDescriptor","getterChain","computeUUID","_preProcessWatchers","watchers","v","getComputedGetter","originGetter","options","targetname","cacheKey","cacheParamsKey","values","isEqual","re","q","computedMixin","wrapperFn","_inlectLazyRendering","n","idProperty","findIndex","row","counter","LazyRendering","SortAble","removeOrder","sortIndex","sort","sortIcon","_sort","changeOrder","result","compareProperty","bValue","aValue","format","parsedB","parsedA","_s","KiPopup","ownerRoot","parentNode","closeAfterMilliSeconds","parentRect","targetRect","popupLeft","popupTop","popupRight","popupBottom","position","positionVal","isPercentage","endsWith","targetPosition","positionNum","sizeNode","popup","KiListItem","UpdatingElement","next","level","KiListItemGroup","KiList","KiCheckBox","square","ColumnHider","visible","op","c","ColumnFormatter","formatters","formatter","opt","dayjsFormat","_opt","precisiontable","precision","formatted","numberFormatter","Selection","d","escapeCsv","delimiter","Export","exportcolumns","columns","displayValue","renderedCell","KiTable","KiSwitcher","preselected","option","badge","KiStack","changedProperties","selectedChild","KiSearchbox","input","SearchSytaxQueryParser","peg$subclass","parent","ctor","peg$SyntaxError","message","expected","found","DESCRIBE_EXPECTATION_FNS","expectation","literalEscape","escapedParts","classEscape","ch","describeExpectation","describeExpected","descriptions","j","describeFound","peg$parse","peg$FAILED","peg$startRuleFunctions","peg$parseStart","peg$startRuleFunction","peg$c0","expr","peg$c1","peg$c2","peg$literalExpectation","peg$c3","peg$c4","peg$c5","head","tail","buildLogicalExpression","peg$c6","operator","peg$c7","peg$otherExpectation","peg$c8","peg$c9","peg$classExpectation","peg$c10","peg$currPos","peg$c11","peg$c12","peg$c13","peg$c14","peg$c15","peg$c16","peg$c17","peg$c18","peg$c19","peg$c20","peg$c21","buildArray","peg$c22","peg$c23","peg$c24","peg$c25","peg$c26","peg$c27","peg$c28","peg$c29","peg$c30","peg$c31","peg$c32","peg$c33","peg$c34","peg$c35","peg$c36","peg$c37","peg$c38","peg$c39","peg$c40","peg$c41","peg$c42","peg$c43","peg$c44","peg$c45","peg$c46","peg$c47","peg$c48","peg$c49","chars","peg$c50","peg$c51","peg$c52","peg$c53","sequence","peg$c54","peg$c55","peg$c56","peg$c57","peg$c58","peg$c59","digits","peg$c60","peg$c61","peg$c62","peg$c63","peg$c64","peg$anyExpectation","peg$c65","peg$c66","peg$c67","peg$c68","peg$c69","peg$c70","peg$c71","peg$c72","peg$c73","peg$c74","peg$c75","peg$c76","peg$c77","peg$c78","peg$c79","peg$c80","peg$c81","peg$c82","peg$c83","peg$c84","peg$c85","peg$c86","peg$c87","peg$c88","peg$savedPos","peg$posDetailsCache","peg$maxFailPos","peg$maxFailExpected","peg$silentFails","peg$result","ignoreCase","parts","inverted","peg$endExpectation","description","peg$computePosDetails","pos","details","peg$computeLocation","startPos","endPos","startPosDetails","endPosDetails","peg$fail","peg$buildStructuredError","s0","s1","peg$parseLogicExpr","peg$parseExpr","s2","s3","s4","s5","peg$parsesp","s6","s7","peg$parseFieldExpr","peg$parse_","peg$parseLopr","peg$parseKey","peg$parseCopr","peg$parseValue","s8","s9","peg$parseStringLiteral","peg$parseDoubleStringCharacter","peg$parseSourceCharacter","peg$parseEscapeSequence","peg$parseCharacterEscapeSequence","peg$parseDecimalDigit","peg$parseHexEscapeSequence","peg$parseUnicodeEscapeSequence","peg$parseHexDigit","peg$parseSingleEscapeCharacter","peg$parseNonEscapeCharacter","peg$parseEscapeCharacter","peg$parseLineTerminator","element","KiSearchQueryAction","mode","KiQueryableSearchbox","KiTreeNode","labelClickedEvent","itemSelectedEvent","SCROLL_STEP","KiTree","scroller","paddingLeft","grandChild","currentValue","length","KiWcpVersionTag","res","pkg","KiModal","step","touch","addSwipeEvents","last","previousEl","modal","previous","KiToast","toast","type","content","KiAccordion","_loaderMixin","loaderTargetFn","prototype","aspect","loaderMixin","globalLocalStorage","getId","getGetter","local","initialGetter","_id","defaultConverter","typeParam","initializer","getSetter","localStorageMixin","getterFn","setterFn","defaultValue","searchParamValue","oldSetter","queryParamMixin","nls$1","deCommon","enCommon","frCommon","isCommon","zhCommon","KiMenu","hasSubMenu","renderSubMenu","currentMenuItem","width","left","top","height","subItem","selectedEvent","getAbsolutePath","callcache","KIWIS","service","datasource","returnfields","CSL","url","request","urlKey","req","KiwisHelper","kiwisCfg","windowLocation","relPath","loc","ts_shortname","deKiwis","enKiwis","isKiwis","frKiwis","style$9","hclocales","more","Highcharts","nodata","exporting","offlineexporting","boost","KiChart","Chart","LinkedTo","_t","originHander","plotLines","vis","dur","past","start","TsData","_f","_h","plotline","transform","getTimestampFromDuration","period","series","interpolationType","ts_path","ts_name","KiTsGraph","PeriodsList","classification","m","unit","matched","returnOptions","returnCol","periodValue","getDefaultJsDatepickerOptions","i18n","dateFormatter","onHide","eventName","MobileFromToTabs","PeriodListElement","from","to","column","optTo","optFrom","isSelected","KiTimeRangePicker","date","fromOptions","mobileTab","instance","toOptions","initDatepicker","periodList","render","foundPeriodList","mobileTabs","foundMobileTab","periodsList","toValue","fromValue","emitChange","ignoreHistory","auxFrom","auxTo","_periodEnd","_firstCheck","_periodStart","_additionalCheck","isPeriodLess24H","range","isHidden","Parent","KiTsViewerTable","KiTsViewer","mainTs","unzipWith","y","_d","ts","KiTsListSelect","orderBy","concat","evt","searchExp","regx","_matchRuleShort","rule","escapeRegex","unescapedStr","_findTsByString","pattern","array","matchWith","isOriginalTsName","isOriginalTsShortname","tsShortname","tsArray","evaluateTsName","KiWISInst","graphRange","WwpStationTsViewer","_g","_i","_j","_k","_l","_m","queryparams","findTsByString","filterOriginalTs","flattenDeep","findFirstTsByString","tsObj","ensTs","tmpCanvas","tmpCanvasCtx","olStyleImage","canvas","half","FontIcon","FontSymbol","iconStyle","el","icon","cs","glyph","shape","backgroundColor","Fill","border","Stroke","descar","arys","ary","newResult","reItem","LegendFactory","tg","tag","tag1","tag2","marker","tgs","zIndex","Style","Icon","getValueRule","_getValue","getValue","oldGetValue","getExistsRule","propExists","cond","isArray","getNegatedRule","createRule","internalRule","getInRule","inArray","getIncludesRule","mustInclude","getExactRule","mustBe","getMinRule","multiplier","ruleMin","ruleMinString","ruleAbs","min","_val","getMaxRule","ruleMax","ruleMaxString","max","getDurationRule","maxRule","minRule","Classifier","tagProperty","tags","dataItem","StatusIcon","image","dir","rotation","deg","registeredProjections","registerProjections","mapCfg","proj","extent","proj4","getProjection","olProj","register","dataProjection","point","viewProjection","offset","containsCoordinate","ListMode","sorted","cols","sortedCol","changeColumn","getOptions","KiResponsiveTable","pelement","maxLeft","posY","topoffset","posX","getDisplayValue","returnString","placeholderString","capturingPlaceholder","lastCharDollar","currentChar","KiWcpWwpFilter","activeFilter","filt","filterValue","combobox","getQueryObject","_stations","uniqBy","sortDir","addText","additionalText","displayTemplate","numberValb","numberVala","WwMapPopup","ser","mainParameter","parameter","stationparameterNo","sdata","timestamp","river","isMain","graph","WwMapPopupAuto","WwMapPopupBase","stationDetailRoute","conf","WwMapPopupPrecip","sumSeries","sumData","sumlineData","sum","WwGraphWrapper","currentData","currentId","threshholdMappings","WwMapPopupDynamic","paths","tsPath","tsPathBase","alarms","mainTsData","tsData","maxValue","tsv","newId","tagName","datapoint","tooltip","findClosest","sparkline","KiWwpSparkline","WwpOverview","table","downloadFile","tab","elem","regex","filterOptions","searchData","filteredStations","fields","orders","navigationPath","detailPaths","allHits","anyHits","detailPath","sameLayer","mapConfig","reproject","tagCount","countBy","factory","locale","getTrendArrow","trend","opts","vals","popupBeforeLeft","getRelativePosAndPercentageFromMouseEventOnBar","targetX","pointedX","percentage","targetwidth","KiProgressBar","_changedProperties","newElement","marginDifference","oldMargin","legendType","KiProgressBarLegend","popupItems","lastPercentage","absolutePercentage","percentageRange","newPercentage","maxWidth","firstEntry","lastEntry","lastPercentageNumber","newWidth","lastItem","KiPlayerSpeedChooser","newSpeed","speed","selectedItems","selectedSpeed","selectedText","playAccuracy","KiPlayer","newTicks","ticks","classiObj","rgbNumber","rgbString","WwRasterLegend","getLegendEntry","lastTimestamp","untilTimestamp","fromUnixMilliseconds","untilPercentage","childrenTimestamps","toTime","timeDifference","children","fillInMissingImages","rasterItem","minTime","maxTime","stepDuration","newImages","rasterImageIndex","rasterImage","returnValue","WwRasterPlayer","rasterlist","raster","ImageLayer","legendEntries","_type","childrenArray","fromTime","steps","timeSpan","time","oldTimestamp","newTimestamp","dayUntil","imageNumber","secImage","rasterProduct","selectedLayer","bbox","projection","Static","selected","primary","primaryDuration","secondaryDuration","secondMin","secondMax","tsitem","dateformat","t0String","coverage","listitem","group","itemId","WwRasterOverview","queryAsync","KiLegend","absoluteCount","abscnt","mobile","desc","grp","descr","flatten","_AddOn","KiBaseLayers","KiCatchmentInfo","parserWMTS","WMTSCapabilities","styleFontIconDefaults","styleDefaults","textStyleDefaultPoint","textStyleDefault","getTextStyle","textStyle","Text","getStyle","retStyle","stroke","fill","CircleStyle","getVectorTileLayer","VectorTileLayer","_style","VectorTileSource","MVT","attribution","getWTMSLayer","TileLayer","optionsFromCapabilities","tileLayer","attributions","WMTS","getWMSLayer","TileWMS","opacity","ImageWMS","getMapBoxStyleLayer","newLayer","getOSMLayer","OSM","getXYZLayer","XYZ","gridParams","TileGrid","getCustomLayer","urlTemplate","TileImage","tileCoord","z","_z","_r","getTileArcGISRestLayer","TileArcGISRest","getStaticImageLayer","ImageStatic","getImageArcGISRestLayer","ImageArcGISRest","getJsonLayer","vectorSource","VectorSource","FeatureParser","TopoJSON","GeoJSON","layer","VectorLayer","hoverStyle","haslinks","feature","xhr","features","feat","styleProperty","highlightedStyle","labelProperty","_getLayer","bglayer","selectable","getLayer","items","legendColor","KiLayerFactory","toggleValue","flag","conflictList","KiLayersControlElement","stopEvent","groupId","groupChecked","groupIntermediate","toggleGroup","checkbox","trees","tree","checkboxOrButtons","selection","layerOptions","LayersControl","Control","unByKey","layerGroups","groupName","ls","getWithExpiry","viewFilter","KiLayersControl","_CanvasVectorLayerRenderer","CanvasVectorLayerRenderer","squaredTolerance","styles","builderGroup","optTransform","StationsLayer","legends","clusterMarker","_clusterMarker","stationSource","clusterSource","Cluster","styleCache","size","_features","colors","count","iconData","iconColors","info","Feature","Point","LegendSwitcher","KiLegendControl","newVal","oldVal","LocationControl","resolve","reject","fromLonLat","KiLocationControl","PopupSwitcher","KiPopupControl","KiStationDownloadButton","StationDownloadLayer","KiStationDownloadControl","formatterMap","getKey","formatNumberForLocale","number","formatNumber","KiStationInfo","stationMapOverviewLayer","div","se","_ovmap","VisibleMixin","Overview","inAndOut","Circle","attrs","KiStationMapOverviewControl","StationMapOverviewLayer","projections","MultiMousePosition","MousePosition","pixel","coordinate","decimals","self","select","MapPositionScaleLayer","ScaleLine","kiStationMapPositionScaleControl","RasterControl","kiStationMapRasterControl","KiStationMapZoomButton","StationMapControl","KiStationMapZoomControl","KiOlLayer","KiStationMap","View","Map","defaultControls","Attribution","readyEvent","loadCacheZoom","popupelement","padding","Popup","showPopup","horizontal","vertical","layerAlias","closePopup","unsafeCSS","olcss","popupStyle","ovStyle","queryAssignedNodes","currentStationStyle","defaultMarkerStyle","StationsMarkerLayer","dynamicMarkerSize","resolution","valueToDisplay","contrastColor","StationsChartLayer","attr","remarkAttribute","outdatdedCfg","outdated","StationsTrendLayer","KiIconSwitcher","__publicField","MultiSelectionToggle","layers","it","DragPan","Select","DragBox","always","selectedFeatures","selectionGeo","KiStationsLayer","customPosition","boundingExtent","activePopup","JsonLayer","KiJsonLayer","JSONLayer","catchment","hovering","OlVectorLayer","mapKeys","updateFn","WwpStationInfo","_skipSubst","_url","tmpret","templateResultList","anyValueFound","tr","_getNextItem","collection","nextItem","_getPreviousItem","WwpStationDetail","mainRouteLength","_path","toReplace","favSta","prevItem","menu","menuItem","each","className","module","layerName","bId","aId","filterList","dynMenuSubPaths","dynMenuItems","_flattenedList","initialSelection","mapInfo","downloadExcel","wb","XLSX","ws","WwpStationDownload","mimeType","per","filehref","minDate","meanTs","maxTs","minTs","o","releaseStatusIndex","qualityCodeNameIndex","rows","releaseState","datems","file","dlfiles","curr","dlfile","datafile","tsdata","mdList","mdfields","header","csvResult","WwpHtml","contentFolder","fullurl","WwReport","pathArray","pdfurl","WwDocuments","baseDir","pdf","KiAppWWP","menuMode","currentQuery","currentViewType","newViewType","newUrl","KiContentSlider","ev","slide","slideChecked","arrowClass","nav","KiWwpSwitcherBottom","KiWwpTsTable","PopupUtil","tshref","ranges","whitelist","union","patternFill","KiWwpGraphPrecip","resize","chart","cfg","_min","_max","maxDate","xAxis","valueIndex","accIndex","accData","tableData","timeformat","title","year","years","_files","yearcfg","dp","_p","resetSumAt","tsms","color","_data","newPoint","credits","stationDetailComp","configItem","KiWwpGraphPrecipExt","GraphHelper","files","rangeConfig","KiWwpGraph","serieslabel","legendOptions","tsIndex","tsshortname","tempts","dCommentIndex","tslist","tscfg","minIdx","tzoffset","timeseries","qCodeIndex","ts_list","firstDataPoint","t0","colArray","progTs","trendAb","progDur","prognoseBisTs","trendAbTs","prognoseBranches","indexMin","indexMax","indexMittel","indexTUMin","indexTUMax","indexTUMittel","dataTrend","dataTrendVB","dataProg","dataProgVB","actualMax","actualMean","actualMin","tsValue","pl","_pl","tabledata","retObj","prevYear","nextYear","dataToFetch","addts","href","addf","tsfile","currentMax","currentMin","artificalTs","ploptions","lastValue","graphOptions","al","alarmFile","alarmFileName","compact","spare","active","defaultPlOptions","fielditem","_file","_thresholds","thres","KiWwpGraphExt","KiWwCrossSection","newSeries","x_max","level_data","crossSectionData","lastlevel","at","stationObj","WaterlevelTable","KiWwStart","stationList","echarts.use","ToolboxComponent","TooltipComponent","TitleComponent","LegendComponent","GraphicComponent","DataZoomComponent","MarkLineComponent","GridComponent","LineChart","BarChart","ScatterChart","SVGRenderer","CanvasRenderer","UniversalTransition","echarts.registerTheme","dark","KiEchart","echarts.init","echarts.dispose","isDark","widgetType","KiWidget","configServerUrl","rowType","elementType","uuid","saveLayout","layout","getExampleLayout","DragAreas","maxThreshold","minThreshold","renderElementContent","elementWidgetType","renderNewRowDropTarget","patchRow","rowArray","currentLength","patchedArray","firstElement","addNewExists","getFirstLayoutElement","elementArray","foundElement","KiDynamicLayout","draggedElementRow","draggedElementColumn","tempCurrentDraggedElement","currentRowType","targetDomElement","targetElementRow","targetElementColumn","targetElement","targetElementRowType","isFullRowTarget","targetColumn","tempElement","removeElements","dragArea","getAreaOfDrag","currentDragArea","elementRowType","oldLayout","rowIndex","columnIndex","KiWwpGraphAlbg","_value","offsetValue","WwpAttributeHtml","WwDashboard","uuidToLoad","getLayout","loaded","newLayout","newUuid","WwPdfReports","subpath","doc","WwpStationInfoAlbg","WwpStationDownloadAlbg","absoluteValIndex","absVal","WwpOverviewAlbg","wwAppIndex"],"sources":["../../vite/modulepreload-polyfill","../../../../libs/wcp-base/src/common/dayjsext.ts","../../../../libs/wcp-base/src/decorators/i18n.ts","../../../../libs/wcp-base/src/locales/index.ts","../../../../libs/wcp-base/src/decorators/query.ts","../../../../libs/wcp-base/src/components/ki-icon/ki-icon.ts","../../../../libs/wcp-base/src/components/ki-icon/ki-icon-btn.ts","../../../../libs/wcp-base/src/common/aspect.ts","../../../../libs/wcp-base/src/decorators/responsive.ts","../../../../libs/wcp-base/src/common/PropertyDefaultValue.ts","../../../../libs/wcp-base/src/common/Mix.ts","../../../../libs/wcp-base/src/components/ki-app/routing/ki-router.ts","../../../../libs/wcp-base/src/components/ki-app/ki-link.ts","../../../../libs/wcp-base/src/components/ki-app/ki-breadcrumbs.ts","../../../../libs/wcp-base/src/components/ki-app/services/ki-app-config-service.ts","../../../../libs/wcp-base/src/components/ki-app/ki-app-breadcrumbs.ts","../../../../libs/wcp-base/src/components/ki-app/ki-app.ts","../../../../libs/wcp-base/src/components/ki-app/ki-app-bootstrapper.ts","../../../../libs/wcp-base/src/components/ki-app/ki-nav.ts","../../../../libs/wcp-base/src/components/ki-app/services/ki-theme-service.ts","../../../../libs/wcp-base/src/common/Loader.ts","../../../../libs/wcp-base/src/common/LoaderMixin.ts","../../../../libs/wcp-base/src/common/MsgMixin.ts","../../../../libs/wcp-base/src/common/util.ts","../../../../libs/wiski-web/src/api/jsonpi.ts","../../../../libs/wiski-web/src/api/API.ts","../../../../libs/wcp-base/src/components/ki-table/base-table.css.js?used&inline","../../../../libs/wcp-base/src/components/ki-table/GetField.ts","../../../../libs/wcp-base/src/components/ki-table/BaseTable.ts","../../../../libs/wcp-base/src/components/ki-table/PromiseData.ts","../../../../libs/wcp-base/src/decorators/helper/getPropertyDescriptor.ts","../../../../libs/wcp-base/src/decorators/debounce.ts","../../../../libs/wcp-base/src/decorators/computed.ts","../../../../libs/wcp-base/src/components/ki-table/LazyRendering.ts","../../../../libs/wcp-base/src/components/ki-table/SortAble.ts","../../../../libs/wcp-base/src/components/ki-popup/ki-popup.ts","../../../../libs/wcp-base/src/components/ki-list/ki-list-item.ts","../../../../libs/wcp-base/src/components/ki-list/ki-list-item-group.ts","../../../../libs/wcp-base/src/components/ki-list/ki-list.ts","../../../../libs/wcp-base/src/components/ki-checkbox/ki-checkbox.ts","../../../../libs/wcp-base/src/components/ki-table/ColumnHider.ts","../../../../libs/wcp-base/src/components/ki-table/ColumnFormatter.ts","../../../../libs/wcp-base/src/components/ki-table/Selection.ts","../../../../libs/wcp-base/src/components/ki-table/Export.ts","../../../../libs/wcp-base/src/components/ki-table/ki-table.ts","../../../../libs/wcp-base/src/components/ki-switcher/ki-switcher.ts","../../../../libs/wcp-base/src/components/ki-stack/ki-stack.ts","../../../../libs/wcp-base/src/components/ki-searchbox/ki-searchbox.ts","../../../../libs/wcp-base/tools/SearchSytaxQueryParser_ES6.js","../../../../libs/wcp-base/src/components/ki-searchbox/ki-search-query-action.ts","../../../../libs/wcp-base/src/components/ki-searchbox/ki-queryable-searchbox.ts","../../../../libs/wcp-base/src/components/ki-tree/ki-tree-node.ts","../../../../libs/wcp-base/src/components/ki-tree/ki-tree.ts","../../../../libs/wcp-base/src/components/ki-wcp-version-tag/ki-wcp-version-tag.ts","../../../../libs/wcp-base/src/components/ki-modal/ki-modal.ts","../../../../libs/wcp-base/src/components/ki-toast/ki-toast.ts","../../../../libs/wcp-base/src/components/ki-accordion/ki-accordion.ts","../../../../libs/wcp-base/src/components/ki-table/ColumnResizing.ts","../../../../libs/wcp-base/src/decorators/loader.ts","../../../../libs/wcp-base/src/decorators/localStorage.ts","../../../../libs/wcp-base/src/decorators/queryParam.ts","../../../../libs/wiski-web/src/components/ki-app-wwp/ki-app-wwp.css.js?used&inline","../../../../libs/wiski-web/src/locales/index.ts","../../../../libs/wiski-web/src/components/ki-menu/ki-menu.ts","../../../../libs/wcp-water/src/api/kiwis.ts","../../../../libs/wcp-water/src/api/KiwisHelper.ts","../../../../libs/wcp-water/src/locales/index.ts","../../../../libs/wcp-water/src/components/ki-ts-viewer/ki-ts-viewer.css.js?used&inline","../../../../libs/wcp-water/src/common/highcharts-locales.ts","../../../../libs/wcp-water/src/components/ki-chart/ki-chart.ts","../../../../libs/wcp-water/src/components/ki-chart/LinkedTo.ts","../../../../libs/wcp-water/src/common/ts-utils.ts","../../../../libs/wcp-water/src/components/ki-chart/TsData.ts","../../../../libs/wcp-water/src/components/ki-chart/ki-ts-graph.ts","../../../../libs/wcp-water/src/components/ki-time-range-picker/ki-time-range-picker.css.js?used&inline","../../../../libs/wcp-water/src/components/ki-time-range-picker/PeriodsList.ts","../../../../libs/wcp-water/src/components/ki-time-range-picker/js-datepicker-helper.ts","../../../../libs/wcp-water/src/components/ki-time-range-picker/mobile-from-to-tabs.ts","../../../../libs/wcp-water/src/components/ki-time-range-picker/period-list.ts","../../../../libs/wcp-water/src/components/ki-time-range-picker/ki-time-range-picker.ts","../../../../libs/wcp-water/src/components/ki-ts-viewer/ki-ts-viewer-table.ts","../../../../libs/wcp-water/src/components/ki-ts-viewer/ki-ts-viewer.ts","../../../../libs/wcp-water/src/components/ki-ts-viewer/ki-ts-list-select.ts","../../../../libs/wiski-web/src/common/timeseries/FindTs.ts","../../../../libs/wiski-web/src/components/wwp-station-ts-viewer/wwp-station-ts-viewer.ts","../../../../libs/wcp-water/src/components/ki-station-map/FontIcon.ts","../../../../libs/wcp-water/src/components/ki-station-map/LegendFactory.ts","../../../../libs/wcp-water/src/components/ki-station-map/Classifier.ts","../../../../libs/wcp-water/src/components/ki-status-icon/ki-status-icon.ts","../../../../libs/wcp-water/src/common/base.ts","../../../../libs/wiski-web/src/views/wwp-overview/wwp-overview.css.js?used&inline","../../../../libs/wiski-web/src/common/maputils.ts","../../../../libs/wiski-web/src/components/ki-responsive-table/ListMode.ts","../../../../libs/wiski-web/src/components/ki-responsive-table/ki-responsive-table.ts","../../../../libs/wiski-web/src/components/ki-wcp-wwp-filter/ki-wcp-wwp-filter.ts","../../../../libs/wiski-web/src/components/common/ww-map-popup.ts","../../../../libs/wiski-web/src/components/common/ww-map-popup-base.ts","../../../../libs/wiski-web/src/components/common/ww-map-popup-auto.ts","../../../../libs/wiski-web/src/components/common/ww-map-popup-precip.ts","../../../../libs/wiski-web/src/components/common/ww-graph-wrapper.ts","../../../../libs/wiski-web/src/components/common/ww-map-popup-dynamic.ts","../../../../libs/wiski-web/src/components/ki-wwp-graph/ki-wwp-sparkline.ts","../../../../libs/wiski-web/src/views/wwp-overview/wwp-overview.ts","../../../../libs/wcp-base/src/components/ki-progress-bar/ki-progress-bar.ts","../../../../libs/wcp-base/src/components/ki-progress-bar/ki-progress-bar-legend.ts","../../../../libs/wcp-base/src/components/ki-progress-bar/ki-player-speed-chooser.ts","../../../../libs/wcp-base/src/components/ki-progress-bar/ki-player.ts","../../../../libs/wiski-web/src/components/ki-ww-raster/ww-raster-legend.ts","../../../../libs/wiski-web/src/components/ki-ww-raster/ww-raster-player.ts","../../../../libs/wiski-web/src/views/wwp-overview/ww-raster-overview.ts","../../../../libs/wcp-water/src/components/ki-legend/ki-legend.ts","../../../../libs/wcp-water/src/components/ki-station-map/_AddOn.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-base-layers.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-catchment-info.ts","../../../../libs/wcp-water/src/common/ki-ol-layer-generator.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-layer-factory.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-layers-control-element.css.js?used&inline","../../../../libs/wcp-water/src/components/ki-station-map/ki-layers-control-element.ts","../../../../libs/wcp-water/src/components/ki-station-map/LayersControl.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-layers-control.ts","../../../../libs/wcp-water/src/components/ki-station-map/StationsLayer.ts","../../../../libs/wcp-water/src/components/ki-station-map/LegendSwitcher.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-legends-control.ts","../../../../libs/wcp-water/src/components/ki-station-map/LocationControl.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-location-control.ts","../../../../libs/wcp-water/src/components/ki-station-map/PopupSwitcher.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-popup-control.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-station-map.css.js?used&inline","../../../../libs/wcp-water/src/components/ki-station-map/ki-station-download-button.ts","../../../../libs/wcp-water/src/components/ki-station-map/StationDownloadLayer.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-station-download-control.ts","../../../../libs/wcp-base/src/common/NumberFormatter.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-station-info.ts","../../../../libs/wcp-water/src/components/ki-station-map/VisibleMixin.ts","../../../../libs/wcp-water/src/components/ki-station-map/StationMapOverviewLayer.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-station-map-overview-control.ts","../../../../libs/wcp-water/src/common/projections.ts","../../../../libs/wcp-water/src/components/ki-station-map/MultiMousePosition.ts","../../../../libs/wcp-water/src/components/ki-station-map/MapPositionScaleLayer.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-station-map-position-scale-control.ts","../../../../libs/wcp-water/src/components/ki-station-map/RasterControl.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-station-map-raster-control.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-station-map-zoom-button.ts","../../../../libs/wcp-water/src/components/ki-station-map/StationMapControl.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-station-map-zoom-control.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-ol-layer.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-station-map.ts","../../../../libs/wcp-water/src/components/ki-station-map/StationsMarkerLayer.ts","../../../../libs/wcp-water/src/components/ki-station-map/StationsChartLayer.ts","../../../../libs/wcp-water/src/components/ki-station-map/StationsTrendLayer.ts","../../../../libs/wcp-base/src/components/ki-switcher/ki-icon-switcher.js","../../../../libs/wcp-water/src/components/ki-station-map/MultiSelectionToggle.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-stations-layer.ts","../../../../libs/wcp-water/src/components/ki-station-map/JSONLayer.ts","../../../../libs/wcp-water/src/components/ki-station-map/ki-json-layer.ts","../../../../libs/wcp-water/src/components/ki-station-map/ol-vector-layer.ts","../../../../libs/wiski-web/src/views/wwp-station-detail/wwp-station-detail.css.js?used&inline","../../../../libs/wiski-web/src/views/wwp-station-detail/wwp-station-info.ts","../../../../libs/wiski-web/src/views/wwp-station-detail/wwp-station-detail.ts","../../../../libs/wiski-web/src/common/download.ts","../../../../libs/wiski-web/src/views/wwp-station-detail/wwp-station-download.ts","../../../../libs/wiski-web/src/views/wwp-html/wwp-html.ts","../../../../libs/wiski-web/src/views/ww-report/ww-report.ts","../../../../libs/wiski-web/src/views/ww-report/ww-documents.ts","../../../../libs/wiski-web/src/components/ki-app-wwp/ki-app-wwp.ts","../../../../libs/wiski-web/src/components/ki-content-slider/ki-content-slider.ts","../../../../libs/wiski-web/src/components/ki-wwp-graph/ki-wwp-switcher-bottom.ts","../../../../libs/wiski-web/src/components/ki-wwp-graph/ki-wwp-ts-table.ts","../../../../libs/wiski-web/src/components/ki-wwp-graph/ki-wwp-graph-precip.css.ts?used&inline","../../../../libs/wiski-web/src/components/ki-wwp-graph/ki-wwp-graph-helper.ts","../../../../libs/wiski-web/src/components/ki-wwp-graph/ki-wwp-graph-precip.ts","../../../../libs/wiski-web/src/components/ki-wwp-graph/ki-wwp-graph-precip-ext.ts","../../../../libs/wiski-web/src/components/ki-wwp-graph/ki-wwp-graph.css.ts?used&inline","../../../../libs/wiski-web/src/components/ki-wwp-graph/GraphHelper.ts","../../../../libs/wiski-web/src/components/ki-wwp-graph/ki-wwp-graph.ts","../../../../libs/wiski-web/src/components/ki-wwp-graph/ki-wwp-graph-ext.ts","../../../../libs/wiski-web/src/components/ki-wwp-graph/ki-ww-cross-section.ts","../../../../libs/wiski-web/src/components/ki-ww-start/WaterlevelTable.ts","../../../../libs/wiski-web/src/components/ki-ww-start/ki-ww-start.css.js?used&inline","../../../../libs/wiski-web/src/components/ki-ww-start/ki-ww-start.ts","../../../../libs/wcp-base/src/components/ki-echart/ki-echart.ts","../../../../libs/wiski-web/src/components/ki-widget/ki-widget.ts","../../../../libs/wiski-web/src/components/ki-dynamic-layout/service/layout-service.ts","../../../../libs/wiski-web/src/components/ki-dynamic-layout/service/layout-helper.ts","../../../../libs/wiski-web/src/components/ki-dynamic-layout/ki-dynamic-layout.ts","../../../../common/src/components/ki-wwp-graph-albg.ts","../../../../libs/wiski-web/src/views/wwp-station-detail/wwp-attribute-html.ts","../../../../libs/wiski-web/src/views/ww-dashboard/ww-dashboard.ts","../../../../libs/wiski-web/src/views/ww-report/ww-pdf-reports.ts","../../../../common/src/views/wwp-station-info-albg.ts","../../../../common/src/views/wwp-station-download-albg.ts","../../../../common/src/views/wwp-overview-albg.ts","../../src/import-actions/import-actions.ts","../../src/index.ts"],"sourcesContent":["const p = function polyfill() {\n const relList = document.createElement('link').relList;\n if (relList && relList.supports && relList.supports('modulepreload')) {\n return;\n }\n for (const link of document.querySelectorAll('link[rel=\"modulepreload\"]')) {\n processPreload(link);\n }\n new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type !== 'childList') {\n continue;\n }\n for (const node of mutation.addedNodes) {\n if (node.tagName === 'LINK' && node.rel === 'modulepreload')\n processPreload(node);\n }\n }\n }).observe(document, { childList: true, subtree: true });\n function getFetchOpts(script) {\n const fetchOpts = {};\n if (script.integrity)\n fetchOpts.integrity = script.integrity;\n if (script.referrerpolicy)\n fetchOpts.referrerPolicy = script.referrerpolicy;\n if (script.crossorigin === 'use-credentials')\n fetchOpts.credentials = 'include';\n else if (script.crossorigin === 'anonymous')\n fetchOpts.credentials = 'omit';\n else\n fetchOpts.credentials = 'same-origin';\n return fetchOpts;\n }\n function processPreload(link) {\n if (link.ep)\n // ep marker = processed\n return;\n link.ep = true;\n // prepopulate the load record\n const fetchOpts = getFetchOpts(link);\n fetch(link.href, fetchOpts);\n }\n};__VITE_IS_MODERN__&&p();","import dayjs from 'dayjs';\nimport duration from 'dayjs/plugin/duration';\nimport localizedFormat from 'dayjs/plugin/localizedFormat';\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\nimport utc from 'dayjs/plugin/utc';\nimport timezone from 'dayjs/plugin/timezone';\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport advancedFormat from 'dayjs/plugin/advancedFormat';\n\nimport 'dayjs/locale/de'; // Germany\nimport 'dayjs/locale/en-ie'; // Ireland\nimport 'dayjs/locale/is'; // ICeland\nimport 'dayjs/locale/fr'; // France\nimport 'dayjs/locale/en-gb';\n\ndayjs.extend(duration);\ndayjs.extend(customParseFormat);\ndayjs.extend(advancedFormat);\ndayjs.extend(localizedFormat);\ndayjs.extend(relativeTime);\ndayjs.extend(utc);\ndayjs.extend(timezone);\n\nexport default dayjs;\n","/* eslint-disable func-names */\nimport i18next from 'i18next';\nimport languageDetector from 'i18next-browser-languagedetector';\nimport dayjs from '../common/dayjsext';\n\nif (!i18next.isInitialized) {\n i18next.init({\n fallbackLng: 'en',\n });\n i18next.on('languageChanged', lng => {\n dayjs.locale(lng);\n });\n}\n\nexport function getCurrentLang() {\n return i18next.language;\n}\n\nexport function addNls(i18nInstance, nls) {\n Object.entries(nls).forEach(([language, rs]) => {\n // @ts-expect-error\n Object.entries(rs).forEach(([namespace, r]) => {\n i18nInstance.addResourceBundle(language, namespace, r, true, true);\n });\n });\n}\n\nfunction initFn() {\n // @ts-expect-error\n this.i18n = i18next.createInstance();\n // @ts-expect-error\n this.i18n.use(languageDetector);\n // @ts-expect-error\n this.i18n.init(\n {\n detection: {\n order: [\n 'sessionStorage',\n 'querystring',\n 'cookie',\n 'navigator',\n 'htmlTag',\n 'path',\n 'subdomain',\n 'localStorage',\n ],\n },\n fallbackLng: 'en',\n defaultNS: 'common',\n debug: false,\n resources: {},\n },\n err => {\n if (err) {\n // eslint-disable-next-line no-console\n console.log('something went wrong loading', err);\n }\n },\n );\n // @ts-expect-error\n this.i18n.on('initialized', () => {\n // @ts-expect-error\n this.requestUpdate();\n });\n // @ts-expect-error\n this.i18n.on('languageChanged', () => {\n // @ts-expect-error\n this.requestUpdate();\n });\n // @ts-expect-error\n this.i18n.store.on('added', () => this.requestUpdate());\n // @ts-expect-error\n this.i18n.store.on('removed', () => this.requestUpdate());\n}\n\nconst extendCls = function (superclass, nls) {\n return class extends superclass {\n constructor() {\n super();\n this.i18n || initFn.call(this);\n addNls(this.i18n, nls);\n }\n };\n};\n\n// TODO find better method to do aspect\nexport const i18n = function (nls) {\n return function decorator(superclass) {\n return extendCls(superclass, nls);\n };\n};\n\nexport const i18nMixin = (superclass, { nls = {} }) =>\n extendCls(superclass, nls);\n","import en from './en/common.json';\nimport is from './is/common.json';\nimport fr from './fr/common.json';\nimport de from './de/common.json';\n\nexport default {\n en: {\n common: en,\n },\n is: {\n common: is,\n },\n fr: {\n common: fr,\n },\n de: {\n common: de,\n },\n};\n","/* eslint-disable func-names */\n\nexport const getQueryObject = (target, selector, { all = false } = {}) => {\n if (all) {\n return target.renderRoot.querySelectorAll(selector);\n }\n return target.renderRoot.querySelector(selector);\n};\n\nexport const query = function (selector, { all = false } = {}) {\n return (target, _key, descriptor) => {\n delete descriptor.writable;\n delete descriptor.initializer;\n descriptor.get = getQueryObject(target, selector, { all });\n return descriptor;\n };\n};\n","/* eslint-disable max-classes-per-file */\nimport { css, html, LitElement } from 'lit';\nimport icons from '@kisters/watericons';\n/* eslint-disable import/extensions */\nimport { until } from 'lit/directives/until.js';\nimport { customElement, property } from 'lit/decorators.js';\nimport { unsafeSVG } from 'lit/directives/unsafe-svg.js';\n/* eslint-enable import/extensions */\nimport { getQueryObject } from '../../decorators/query';\n\nconst getIconPath = iconName => {\n const libName = iconName.split(' ')[0];\n\n return `./icons/${libName}/${iconName.substring(libName.length * 2 + 2)}.svg`;\n};\n\n@customElement('ki-icon')\nexport default class KiIcon extends LitElement {\n static styles = [\n css`\n :host {\n display: inline-block;\n width: 1em;\n }\n svg {\n vertical-align: middle;\n max-width: 1em;\n max-height: 1em;\n }\n `,\n ];\n\n @property({ type: String })\n icon: string = '';\n\n @property({ type: String })\n color: string = 'black';\n\n async fetchIcon() {\n if (this.icon) {\n if (this.icon.startsWith('...`)}`;\n }\n}\n","/* eslint-disable wc/no-self-class */\nimport { css } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\nimport KiIcon from './ki-icon';\n\n@customElement('ki-icon-btn')\nexport default class KiIconBtn extends KiIcon {\n // language=CSS\n static styles = [\n ...KiIcon.styles,\n css`\n :host {\n display: block;\n color: gray;\n fill: gray;\n background: white;\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n width: 40px;\n height: 40px;\n text-align: center;\n line-height: 40px;\n border-radius: 40px;\n cursor: pointer;\n position: relative;\n }\n :host(:hover) ki-icon::part(icon) {\n fill: #4a4a49;\n }\n\n :host([active]) {\n color: white;\n fill: white;\n background: var(--theme-color-secondary, #0056a0);\n }\n\n :host(.ripple) {\n background-position: center;\n transition: background 0.8s;\n }\n :host(.ripple:hover) {\n background: #47a7f5 radial-gradient(circle, transparent 1%, #47a7f5 1%)\n center/15000%;\n }\n :host(.ripple:active) {\n background-color: var(--theme-color-secondary, #0056a0);\n background-size: 100%;\n transition: background 0s;\n }\n\n :host(.disabled) {\n pointer-events: none;\n opacity: 0.5;\n }\n\n svg {\n max-width: 5em;\n }\n `,\n ];\n\n @property({ type: Boolean, reflect: true })\n active = false;\n\n @property({ type: String })\n tooltip: string = '';\n\n @property({ type: Boolean })\n disabled: boolean = false;\n\n selected: boolean = false;\n\n @property({ type: Boolean })\n toggle: boolean = false;\n\n clickHandler;\n\n connectedCallback() {\n // @ts-expect-error\n if (super.connectedCallback) super.connectedCallback();\n this.clickHandler = () => {\n if (this.toggle) this.active = !this.active;\n };\n this.addEventListener('click', this.clickHandler);\n if (this.selected) this.classList.add('selected');\n }\n\n disconnectedCallback() {\n // @ts-expect-error\n if (super.disconnectedCallback) super.disconnectedCallback();\n this.removeEventListener('click', this.clickHandler);\n }\n}\n","// aspect fn with before\n/*\nexample:\n\n const a = {\n name: 'q',\n say(){\n console.log(1);\n }\n }\n\n aspect(a,'say',(origin)=>{\n return function(args){\n console.log(this.name);\n origin.apply(this);\n console.log(2);\n }\n })\n\n a.say();\n\n* */\nexport default function aspect(target, fnName, wrapper) {\n const originFn = target[fnName];\n // eslint-disable-next-line no-param-reassign\n target[fnName] = wrapper(originFn);\n}\n","/* eslint-disable func-names */\nimport { EventEmitter } from 'events';\nimport { debounce } from 'lodash-es/function';\nimport aspect from '../common/aspect';\n\nexport const SM = 'sm-screen';\nexport const MD = 'md-screen';\nexport const LG = 'lg-screen';\nexport const LANDSCAPE = 'landscape';\n\nconst emitter = new EventEmitter();\nconst XSM_BREAKPOINT = 800;\nconst MD_BREAKPOINT = 1280;\nexport const ViewPort = {\n size: LG,\n landscape: true,\n};\n\nlet detect = function () {\n // console.log(\"responsive detection\")\n let _newSize;\n let hasChaged = false;\n const w = window.innerWidth;\n const h = window.innerHeight;\n if (\n w <= XSM_BREAKPOINT ||\n /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent,\n )\n ) {\n _newSize = SM;\n } else if (w <= MD_BREAKPOINT) {\n _newSize = MD;\n } else {\n _newSize = LG;\n }\n const _newLandscape = w > h;\n\n if (_newSize !== ViewPort.size) {\n document.body.classList.remove(SM, MD, LG);\n document.body.classList.add(_newSize);\n ViewPort.size = _newSize;\n hasChaged = true;\n }\n if (ViewPort.landscape !== _newLandscape) {\n document.body.classList.toggle(LANDSCAPE, _newLandscape);\n ViewPort.landscape = _newLandscape;\n hasChaged = true;\n }\n if (hasChaged) {\n emitter.emit('changed');\n }\n};\n\ndetect = debounce(detect, 50);\n\nwindow.addEventListener('resize', detect);\nwindow.addEventListener('orientationchange', detect);\nwindow.addEventListener('DOMContentLoaded', detect);\n\nfunction connectedCallbackForTarget(target) {\n target.$resizeHandler = () => {\n if (target.isConnected) {\n // console.log(\"responsive change sizemode\", target)\n target.classList.remove(SM, MD, LG);\n target.classList.add(ViewPort.size);\n target.classList.toggle('LANDSCAPE', ViewPort.landscape);\n target.requestUpdate();\n } else {\n // console.log(\"responsive change sizemod for disconnceted\", target)\n }\n };\n emitter.on('changed', target.$resizeHandler);\n target.$resizeHandler();\n}\n\nfunction disconnectedCallbackForTarget(target) {\n emitter.removeListener('changed', target.$resizeHandler);\n}\n\nexport const responsive = function (target) {\n // console.log(\"responsive decorator for\", target)\n // console.log(\"responsive wrapped connectedCallback\")\n aspect(\n target.prototype,\n 'connectedCallback',\n origin =>\n function () {\n // @ts-expect-error\n connectedCallbackForTarget(this);\n // @ts-expect-error\n origin.apply(this);\n },\n );\n\n aspect(\n target.prototype,\n 'disconnectedCallback',\n origin =>\n function () {\n // @ts-expect-error\n disconnectedCallbackForTarget(this);\n // @ts-expect-error\n origin.apply(this);\n },\n );\n};\n\nexport const responsiveMixin = function (clz) {\n return class extends clz {\n connectedCallback() {\n connectedCallbackForTarget(this);\n if (super.connectedCallback) super.connectedCallback();\n }\n\n disconnectedCallback() {\n disconnectedCallbackForTarget(this);\n if (super.disconnectedCallback) super.disconnectedCallback();\n }\n };\n};\n","// TODO move to base\nexport default function f(claz) {\n const anonymity = class extends claz {\n static __$propertyDefaultValues = {};\n\n static getPropertyDescriptor(name, key, _options) {\n if (Object.hasOwnProperty.call(_options, 'initial')) {\n this.__$propertyDefaultValues[key] = _options.initial;\n }\n\n if (Object.hasOwnProperty.call(_options, 'default')) {\n this.__$propertyDefaultValues[key] = () => _options.default;\n }\n\n return super.getPropertyDescriptor(name, key, _options);\n }\n\n constructor() {\n super();\n Object.entries(anonymity.__$propertyDefaultValues).forEach(\n ([k, initial]) => {\n // @ts-expect-error\n this[k] = initial();\n },\n );\n }\n };\n\n return anonymity;\n}\n","export default function Mix(...clzs) {\n // TODO temp, try to do same as properties.\n return clzs.reduce((c1, c2) => {\n let c3;\n if (Array.isArray(c2)) {\n c3 = c2[0](c1, c2[1]);\n } else {\n c3 = c2(c1);\n }\n c3.styles = [].concat(c1.styles || []).concat(c3.styles || []);\n return c3;\n });\n}\n","import { Router } from '@vaadin/router';\nimport { last } from 'lodash-es';\nimport { BehaviorSubject } from 'rxjs';\n\nconst defaultUrl = '/';\n\nlet _searchString = '';\n\nlet _lastParamsString = '';\n\nlet _urlParams = new URLSearchParams(_searchString);\n\nconst _getUrlParams = (): URLSearchParams => {\n if (_lastParamsString !== _searchString) {\n _urlParams = new URLSearchParams(_searchString);\n _lastParamsString = _searchString;\n }\n\n return _urlParams;\n};\n\nconst _rewriteHashedSearchParams = (newString: string): void => {\n const path = window.location.hash.split('?')[0];\n const searchString = `${\n newString && newString.length > 0 ? `?${newString}` : ''\n }`;\n window.location.hash = `${path}${searchString}`;\n};\n\nexport const searchParamsChangedSubject = new BehaviorSubject(true);\n\nclass HashRouter extends Router {\n /* eslint-disable class-methods-use-this */\n /* eslint-disable no-unused-vars */\n __updateBrowserHistory({ pathname, search }) {\n _searchString = search || '';\n const pathWithSearchParam = `${pathname}${_searchString}`;\n if (window.location.hash.length === 0) {\n window.location.hash = `#${defaultUrl}`;\n } else if (window.location.hash.substring(1) !== pathWithSearchParam) {\n window.location.hash = `#${pathWithSearchParam}`;\n }\n searchParamsChangedSubject.next(true);\n }\n\n navigationChange(newRoute, oldRoute) {\n console.log(newRoute, oldRoute);\n }\n\n /* eslint-enable class-methods-use-this */\n /* eslint-enable no-unused-vars */\n async __resolveRoute(context) {\n if (context.hash && context.hash.length > 0) {\n Router.go(context.hash.substring(1));\n return null;\n }\n // @ts-expect-error\n return super.__resolveRoute(context);\n }\n}\n\nfunction globalHashChangeHandler(event: any): void {\n if (event.newURL.split('?')[0] !== event.oldURL.split('?')[0]) {\n const pathname =\n event.newURL.indexOf('#') > -1\n ? event.newURL.substring(event.newURL.indexOf('#') + 1)\n : '/';\n\n Router.go(pathname);\n }\n}\n\nconst HASHCHANGE = {\n activate() {\n window.addEventListener('hashchange', globalHashChangeHandler, false);\n },\n\n inactivate() {\n window.removeEventListener('hashchange', globalHashChangeHandler, false);\n },\n};\n\n// @ts-expect-error\nRouter.NavigationTrigger = [HASHCHANGE];\n\nlet router;\n\nconst getSearchParams = (): URLSearchParams => {\n if (router?.location.searchParams) {\n return router?.location.searchParams;\n }\n return _getUrlParams();\n};\n\n/**\n * Initializes the router and subscribes to window events. Call unsubscribe when router is no longer needed.\n * @param {string} baseUrl baseurl. Can be the base url of the application (\"import.meta.env.BASE_URL\" for a vite app) or the base url + url for a sub view if this router is a nested one.\n */\nexport const initRouter = (baseUrl: string): void => {\n router = new HashRouter(null, { baseUrl });\n router.subscribe();\n};\n\n/**\n * @param {Array} routes The vaid routes for this router. See https://vaadin.github.io/router/vaadin-router/#/classes/Router#method-setRoutes\n */\nexport const setRoutes = (routes: Array): void => {\n router.setRoutes([\n // Redirect to URL without trailing slash\n {\n path: '(.+)/',\n action: (context, commands) => {\n const newPath = context.pathname.slice(0, -1);\n return commands.redirect(newPath);\n },\n },\n ...routes,\n // Remove the following section to deactivate defaultUrl\n {\n path: '(.*)',\n action: (context, commands) =>\n commands.redirect(context.path.split('/').slice(0, -1).join('/')),\n },\n ]);\n};\n\n/**\n * Attaches router to a DOM Element in which the view gets rendered\n * @param {?Node} outlet The (DOM) Element where the components will be rendered to\n */\nexport const attachRouter = (outlet: Element): void => {\n router.setOutlet(outlet);\n};\n\n/**\n * @returns The current location Object of the Vaadin Router.\n */\nexport const getCurrentLocation = (): any => router.location;\n\n/**\n * @param {string} name The name of the route you want to get\n * @param {Object} params Params. See https://vaadin.github.io/router/vaadin-router/#/classes/Router\n * @returns The url leading to the specified component\n */\nexport const urlForName = (name: string, params: any): string =>\n router.urlForName(name, params);\n\n/**\n * @returns Returns the String of all Search Params from the URL\n */\nexport const getCurrentPath = (): string => router.location.pathname;\n\n/**\n * @returns Returns the String of the last Param from the URL\n */\nexport const getLastParamString = (): string =>\n decodeURIComponent(last(router.location.pathname.split('/')));\n\n/**\n * @returns Returns the String of all Search Params from the URL\n */\nexport const getSearchParamString = (): string => _searchString;\n\n/**\n * Gets a single value of the given param.\n * @param {string} param The parameter you're looking for.\n * @returns Returns the value of the prameter\n */\nexport const getSearchParam = (param: string): string | null =>\n getSearchParams().get(param);\n\n/**\n * Gets an array with all values of the given param.\n * @param {string} param The parameter you're looking for.\n * @returns Returns the value of the prameter\n */\nexport const getAllSearchParams = (param: string): Array =>\n getSearchParams().getAll(param);\n\n/**\n * @param {string} param The parameter you want to set.\n * @param {string} value The value to set.\n */\nexport const setSearchParam = (\n param: string,\n value: string | Array,\n): void => {\n const urlParams = _getUrlParams();\n if (!value || (Array.isArray(value) && value.length === 0)) {\n urlParams.delete(param);\n } else if (Array.isArray(value)) {\n urlParams.set(param, value[0]);\n const [, ...rest] = value;\n rest.forEach(val => urlParams.append(param, val));\n } else {\n urlParams.set(param, value);\n }\n\n const paramString = urlParams.toString();\n\n if (paramString !== _searchString) {\n _searchString = paramString;\n _lastParamsString = paramString;\n\n _rewriteHashedSearchParams(paramString);\n }\n};\n\n/**\n * Gets the options and route params for the location.\n * You can call this method inside 'onAfterEnter' in your component.\n * @param {Object} location Current location Object of Vaadin Router.\n * @param {Array} paramNames Array of parameters to load.\n * @returns Returns the value of the prameter\n */\nexport const getRouteOptionsAndParams = (\n location: any,\n paramNames: Array,\n): any => {\n const { options } = location.route;\n const { params } = location;\n\n const ret = { options };\n\n paramNames.forEach(paramName => {\n ret[paramName] = params[paramName];\n });\n\n return ret;\n};\n\n/**\n * @param {string} path The path you want to route to\n * @param {boolean} conserveSearchParams Whether to preserve the search parameters.\n * @returns Returns a boolean without waiting until the navigation is complete. Returns true if at least one Router has handled the navigation (was subscribed and had baseUrl matching the path argument), otherwise returns false.\n */\nexport const navigateTo = (\n path: string,\n conserveSearchParams: boolean = false,\n): boolean => {\n let navTo = path;\n if (conserveSearchParams) {\n const searchParamString = getSearchParamString();\n const addString = `${\n searchParamString.length > 0 && !searchParamString.startsWith('?')\n ? '?'\n : ''\n }${searchParamString}`;\n navTo = `${navTo}${addString}`;\n }\n router.navigationChange(\n navTo.split('?')[0],\n router.location.pathname.split('?')[0],\n );\n return Router.go(navTo);\n};\n\n/**\n * Unregisters the router from window events\n */\nexport const unregisterRouter = (): void => {\n router.unsubscribe();\n};\n","import { LitElement, html } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\nimport { navigateTo } from './routing/ki-router';\n\n@customElement('ki-link')\nexport default class KiLink extends LitElement {\n @property({ type: String })\n href: string = '';\n\n @property({ type: String })\n label: string = '';\n\n constructor() {\n super();\n this.addEventListener('click', () => {\n navigateTo(this.href);\n });\n this.addEventListener('keydown', e => {\n if (e.key === 'Enter') {\n navigateTo(this.href);\n }\n });\n }\n\n render() {\n // language=html\n return html`${this.label}`;\n }\n}\n","// view stack\nimport { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport Mix from '../../common/Mix';\nimport PropertyDefaultValue from '../../common/PropertyDefaultValue';\n\nimport './ki-link';\n\n// @ts-expect-error\n@customElement('ki-breadcrumbs')\nexport default class KiBreadcrumbs extends Mix(\n LitElement,\n PropertyDefaultValue,\n) {\n // language=CSS\n static styles = css`\n :host {\n display: block;\n padding: var(--ki-breadcrumbs-padding, 0px);\n background: var(--ki-breadcrumbs-background, white);\n border-bottom: var(\n --ki-breadcrumbs-border-bottom,\n var(--ki-breadcrumbs-border, none)\n );\n border-top: var(\n --ki-breadcrumbs-border-top,\n var(--ki-breadcrumbs-border, none)\n );\n border-radius: var(--ki-breadcrumbs-border-radius, 0px);\n box-shadow: var(--ki-breadcrumbs-box-shadow, none);\n font-size: var(--ki-breadcrumbs-font-size, 0.8em);\n line-height: var(--ki-breadcrumbs-line-height, 16px);\n white-space: var(--ki-breadcrumbs-white-space, nowrap);\n overflow: auto hidden;\n }\n\n .breadcrumb {\n display: inline-flex;\n position: relative;\n }\n .breadcrumb:hover {\n cursor: pointer;\n }\n .breadcrumb .label {\n padding: var(--ki-breadcrumbs-label-padding, 8px);\n display: inline-block;\n color: var(--ki-breadcrumbs-textcolor, black);\n }\n .breadcrumb:hover .label {\n background: var(--theme-color-secondary, white);\n color: var(\n --ki-breadcrumbs-textcolor-hover,\n --ki-breadcrumbs-textcolor,\n darkgray\n );\n }\n\n .breadcrumb::after {\n content: '\\\\f018';\n display: inline-block;\n text-align: center;\n font-family: Kisterswater;\n font-size: 16px;\n font-stretch: 100%;\n font-style: normal;\n font-weight: 400;\n text-rendering: auto;\n align-self: center;\n width: var(--ki-breadcrumbs-after-width, 24px);\n -webkit-font-smoothing: antialiased;\n color: var(--ki-breadcrumbs-textcolor, black);\n transform: var(--ki-breadcrumbs-after-transform, none);\n }\n\n .last::after {\n content: unset !important;\n }\n\n @media only screen and (min-width: 800px) {\n .breadcrumb.last .label {\n pointer-events: none;\n }\n }\n\n .breadcrumb.last .label {\n color: var(--ki-breadcrumbs-last-textcolor, black);\n }\n `;\n\n static get properties() {\n return {\n items: { type: Array, initial: () => [] },\n };\n }\n\n render() {\n // language=html\n const l = this.items.length;\n return this.items.map(\n (item, i: number) =>\n // Detect last item and do not render arrow\n // Required for Firefox as CSS-Selector solution did not work in Shadow-DOM\n html`
= l ? `last` : ``}\">\n \n
`,\n );\n }\n}\n","let config: any = {};\nlet routes: Array = [];\n\nlet initialized = false;\n\nconst _assertInitialized = () => {\n if (!initialized) {\n throw new Error(\"Config hasn't been loaded yet!\");\n }\n};\n\nconst getRoutesFromConfig = (configRoutes, importActions) =>\n configRoutes.map(route => {\n const newRoute = { ...route };\n\n const actions = importActions.filter(\n act => act.component === route.component,\n );\n\n if (actions.length > 0) {\n // should be only one\n newRoute.action = actions[0].importAction;\n }\n\n if (route.children && route.children.length > 0) {\n newRoute.children = getRoutesFromConfig(route.children, importActions);\n }\n\n return newRoute;\n });\n\nexport const initConfig = async (configPath, importActions) => {\n const resp = await fetch(configPath);\n config = await resp.json();\n routes = getRoutesFromConfig(config.route, importActions);\n\n initialized = true;\n return config;\n};\n\nexport const getConfig = () => config;\n\nexport const getRoutes = () => {\n _assertInitialized();\n return routes;\n};\n\nexport const getNavItemLabel = path => {\n _assertInitialized();\n let ret = '';\n config.navList.forEach(navItem => {\n if (navItem.link === path) {\n ret = navItem.breadcrumb ?? navItem.label;\n }\n if (navItem.items) {\n navItem.items.forEach(subNavItem => {\n if (subNavItem.link === path) {\n ret = subNavItem.breadcrumb ?? subNavItem.label;\n }\n });\n }\n });\n\n return ret;\n};\n\nexport const getNavItems = () => {\n _assertInitialized();\n return config.navList;\n};\n\nexport const getApiPath = () => {\n _assertInitialized();\n return config.apiPath;\n};\n\nexport const getLeftLogoLink = () => {\n _assertInitialized();\n return config.leftLogoLink;\n};\n\nexport const getRightLogoLink = () => {\n _assertInitialized();\n return config.rightLogoLink;\n};\n\nexport const getLogoOptions = () => {\n _assertInitialized();\n return config.logo;\n};\n\nexport const getCsvDelimiter = () => {\n _assertInitialized();\n return config.csvDelimiter ?? ';';\n};\n","/* eslint-disable max-classes-per-file */\n// @ts-nocheck\n// view stack\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport './ki-breadcrumbs';\nimport { getCurrentLocation } from './routing/ki-router';\nimport { getNavItemLabel } from './services/ki-app-config-service';\n\nconst getPreviousSiblings = route => {\n if (!route.parent || !route.parent.children) {\n return [];\n }\n const siblings = route.parent.children.filter(\n child =>\n child.path.length < route.path.length &&\n route.path.startsWith(child.path),\n );\n siblings.sort((a, b) => a.path.length > b.path.length);\n return siblings;\n};\n\nconst getFullPath = route => {\n if (!route || !route.path || route.path === '' || route.path === '/') {\n return '';\n }\n return `${getFullPath(route.parent)}${route.path}`;\n};\n\nconst getCrumb = (route, params, search) => {\n let fullPath = getFullPath(route);\n let { label } = route;\n Object.entries(params).forEach(([key, value]) => {\n fullPath = fullPath.replace(`:${key}`, value);\n label = getNavItemLabel(fullPath) || label.replace(`\\${${key}}`, value);\n });\n return {\n path: `${fullPath}${search || ''}`,\n label,\n };\n};\n\nconst recursivelyGetCrumbs = (route, params, search) => {\n if (route.path === '') {\n return [];\n }\n const siblingsCrumbs = getPreviousSiblings(route)\n .filter(sibling => sibling.label)\n .map(sibling => getCrumb(sibling, params, search));\n const parentCrumbs = recursivelyGetCrumbs(route.parent, params, search);\n\n if (route.label) {\n return [\n ...parentCrumbs,\n ...siblingsCrumbs,\n getCrumb(route, params, search),\n ];\n }\n return [...parentCrumbs, ...siblingsCrumbs];\n};\n\nconst calculateBreadCrumbs = location => {\n const { route, params, search } = location;\n\n return recursivelyGetCrumbs(route, params, search);\n};\n\n@customElement('ki-app-breadcrumbs')\nexport default class KiAppBreadcrumbs extends LitElement {\n // language=CSS\n static styles = css`\n :host {\n display: block;\n }\n `;\n\n @property({ type: Number })\n maxitems = Infinity;\n\n @property({ type: Array })\n breadCrumbs = [];\n\n connectedCallback() {\n if (super.connectedCallback) super.connectedCallback();\n window.addEventListener(\n 'vaadin-router-location-changed',\n this.handleVaadinRouterEvent,\n );\n }\n\n disconnectedCallback() {\n if (super.disconnectedCallback) super.disconnectedCallback();\n window.removeEventListener(\n 'vaadin-router-location-changed',\n this.handleVaadinRouterEvent,\n );\n }\n\n handleVaadinRouterEvent = event => {\n this._setBreadCrumbs(event.detail.location);\n };\n\n _setBreadCrumbs(location) {\n this.breadCrumbs = calculateBreadCrumbs(location).slice(0, this.maxitems);\n }\n\n render() {\n // language=html\n return html``;\n }\n\n firstUpdated() {\n this._setBreadCrumbs(getCurrentLocation());\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport { css, html, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement } from 'lit/decorators.js';\nimport { i18nMixin, addNls } from '../../decorators/i18n';\nimport nls from '../../locales/index';\nimport '../ki-icon/ki-icon';\nimport '../ki-icon/ki-icon-btn';\nimport { responsiveMixin, SM, ViewPort } from '../../decorators/responsive';\nimport PropertyDefaultValue from '../../common/PropertyDefaultValue';\nimport Mix from '../../common/Mix';\n\nimport './ki-app-breadcrumbs';\n\n// @ts-expect-error\n@customElement('ki-app')\nexport default class KiApp extends Mix(\n LitElement,\n PropertyDefaultValue,\n [i18nMixin, { nls }],\n responsiveMixin,\n) {\n // var headerHeight\n\n // language=CSS\n static styles = css`\n :host {\n height: 100%;\n width: 100%;\n }\n\n .ki-app-container {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .header {\n display: flex;\n height: 60px;\n background: var(--theme-color-tertiary, 'white');\n overflow: visible;\n }\n\n ki-icon-btn {\n display: none;\n }\n\n :host .logo {\n flex: 0;\n }\n\n .spacer {\n flex: 1;\n height: 100%;\n }\n\n .nav {\n z-index: 99;\n width: 100%;\n overflow: visible;\n }\n\n .main {\n flex: 1;\n overflow: auto;\n display: flex;\n flex-direction: column;\n }\n\n .main-slot {\n flex: 1;\n overflow: auto;\n }\n\n .drawer-container {\n display: block;\n left: -100%;\n width: 100%;\n height: calc(100% - 80px);\n top: 60px;\n position: absolute;\n z-index: 9999;\n transition: left 0s 0.5s;\n }\n\n .drawer-container.visible {\n left: 0;\n transition: left 0s 0s;\n }\n\n .overlay {\n background: rgba(0, 0, 0, 0.5);\n width: 100%;\n height: 100%;\n display: none;\n position: fixed;\n opacity: 0;\n top: 0;\n transition: all 0.5s;\n }\n\n .drawer {\n display: block;\n max-width: 95%;\n position: absolute;\n background: var(--theme-text-color, white);\n z-index: 1;\n height: 100%;\n left: -100%;\n transition: left 0.5s;\n }\n\n .drawer-container.visible .drawer {\n left: 0;\n }\n\n .drawer-container.visible .overlay {\n display: block;\n opacity: 1;\n }\n\n :host(.sm-screen) [active] {\n display: block;\n background: transparent;\n box-shadow: none;\n fill: var(--theme-color-primary, white);\n margin: 10px;\n }\n\n :host(.sm-screen) .logo {\n flex: 1;\n text-align: center;\n }\n\n :host(.sm-screen) .spacer {\n flex: 0 0 50px;\n }\n\n :host(.sm-screen) .nav {\n display: none;\n }\n\n :host(.sm-screen) .drawer {\n background: transparent;\n }\n\n :host(.sm-screen.LANDSCAPE) .drawer-container {\n top: 0px;\n height: 100%;\n }\n :host(.sm-screen.LANDSCAPE) .drawer {\n left: 60px;\n }\n `;\n\n static get properties() {\n return {\n drawerWidth: {\n type: String,\n default: '95%',\n },\n _sideBarVisible: {\n type: Boolean,\n default: false,\n },\n nls: {\n type: String,\n },\n };\n }\n\n constructor() {\n // TODO\n super();\n\n // Close menu (e.g. Pressing \"Start\" while being in \"Start\")\n window.addEventListener('selected', () => {\n this._sideBarVisible = false;\n });\n\n window.addEventListener('hashchange', () => {\n this._sideBarVisible = false;\n });\n }\n\n _setNls() {\n this.i18n && this.nls && addNls(this.i18n, this.nls);\n }\n\n _renderDrawer() {\n return html` \n
\n
\n \n
\n `;\n }\n\n _renderHeader() {\n return html`\n
\n \n
\n \n
\n
\n
\n ${ViewPort.size === SM ? '' : html``}\n
\n
\n `;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _renderMain() {\n return html`
\n \n \n
`;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _renderFooter() {\n return html``;\n }\n\n render() {\n // language=html\n return html`\n
\n ${ViewPort.size === SM ? this._renderDrawer() : ''}\n ${this._renderHeader()} ${this._renderMain()} ${this._renderFooter()}\n
\n `;\n }\n\n toggleSideBar() {\n this._sideBarVisible = !this._sideBarVisible;\n }\n}\n","import { css, html, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\nimport { getQueryObject } from '../../decorators/query';\nimport {\n initRouter,\n setRoutes,\n attachRouter,\n unregisterRouter,\n} from './routing/ki-router';\n\nconst _initDarkMode = () => {\n import('./services/ki-theme-service').then(themeService => {\n themeService.init();\n });\n};\n\n@customElement('ki-app-index')\nexport default class KiAppBootstrapper extends LitElement {\n get _mainElement() {\n return getQueryObject(this, '.app-container');\n }\n\n // language=CSS\n static styles = css`\n :host {\n height: 100%;\n width: 100%;\n }\n\n .app-container {\n height: 100%;\n width: 100%;\n }\n `;\n\n @property({ type: String })\n baseUrl: string = '/';\n\n @property({ type: Object })\n route: any;\n\n @property({ type: Boolean })\n themable: boolean = false;\n\n render() {\n // language=html\n return html`
`;\n }\n\n firstUpdated() {\n if (this.themable) {\n _initDarkMode();\n }\n if (this.route && this._mainElement) {\n initRouter(this.baseUrl);\n // register routes in vaadin router\n setRoutes(this.route);\n attachRouter(this._mainElement);\n } else {\n console.error(\n `couldn't initialize router! baseUrl: ${this.baseUrl} route: ${this.route} mainElement: ${this._mainElement}`,\n );\n }\n }\n\n disconnectedCallback() {\n // @ts-expect-error\n if (super.disconnectedCallback) super.disconnectedCallback();\n unregisterRouter();\n }\n}\n","/* eslint-disable wc/no-self-class */\nimport { html, css, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement } from 'lit/decorators.js';\nimport '../ki-icon/ki-icon';\nimport PropertyDefaultValue from '../../common/PropertyDefaultValue';\nimport Mix from '../../common/Mix';\n\n// @ts-expect-error\n@customElement('ki-nav')\nexport default class KiNav extends Mix(LitElement, PropertyDefaultValue) {\n // language=css\n static styles = css`\n :host(.vertical) {\n display: flex;\n flex-direction: column;\n padding: 5px 0px;\n height: 100%;\n }\n\n :host(.horizontal) ki-list {\n display: flex;\n color: var(--theme-text-color);\n fill: var(--theme-text-color);\n }\n :host(.horizontal) ki-list > ki-list-item,\n :host(.horizontal) ki-list > ki-list-item-group {\n display: inline-block;\n }\n :host(.horizontal) ki-list > ki-list-item-group .children {\n position: absolute;\n top: 100%;\n right: 0;\n background: white;\n color: var(--theme-color);\n fill: var(--theme-color);\n padding-top: 5px;\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n }\n\n :host(.horizontal) .nav-item {\n padding: 8px;\n }\n\n ki-list-item-group .children.folded {\n display: none;\n }\n\n .nav-item {\n display: flex;\n flex-direction: row;\n align-items: center;\n cursor: pointer;\n padding: 4px;\n }\n .nav-icon {\n min-width: 30px;\n text-align: center;\n }\n\n .nav-label {\n padding: 0px 15px 0px 10px;\n flex: 1;\n }\n `;\n\n static get properties() {\n return {\n direction: { type: String, default: 'vertical' }, // vertical, horizontal\n items: { type: Array, initial: () => [] },\n value: { type: String },\n selectedItem: { type: Object },\n };\n }\n\n // TODO move to global object\n // eslint-disable-next-line class-methods-use-this\n get _selectedView() {\n return `#${window.location.hash.slice(1).split('?')[0] || ''}`;\n }\n\n // eslint-disable-next-line class-methods-use-this\n set _selectedView(link) {\n window.location.hash = link;\n }\n\n renderItem(item) {\n if (item.items?.length > 0) {\n // language=html\n return html` \n {\n item.folded = !item.folded;\n this.requestUpdate();\n }}\"\n >\n
\n
\n
${item.label}
\n
\n \n
\n
\n \n
\n ${item.items.map(t => this.renderItem(t))}\n
\n
`;\n }\n // language=html\n return html` this.handleClick(item)}\"\n >\n
\n
\n
${item.label}
\n
\n `;\n }\n\n render() {\n this.classList.toggle('vertical', this.direction === 'vertical');\n this.classList.toggle('horizontal', this.direction === 'horizontal');\n // language=html\n return html`\n ${this.items.map(item => this.renderItem(item))}\n `;\n }\n\n handleClick(item) {\n if (this.selectedItem === item) {\n return;\n }\n this.dispatchEvent(\n new CustomEvent('selected', {\n detail: {\n item,\n },\n }),\n );\n this._selectedView = item.link;\n }\n}\n","import { ReplaySubject } from 'rxjs';\n\nexport const currentTheme = new ReplaySubject(1);\n\nlet darkTheme: boolean | undefined;\n\nexport const updateTheme = () => {\n if (darkTheme !== undefined) {\n currentTheme.next(darkTheme);\n }\n};\n\nconst setDarkTheme = (newTheme: boolean, dontUpdate: boolean = false) => {\n darkTheme = newTheme;\n if (!dontUpdate) {\n updateTheme();\n }\n};\n\nexport const init = () => {\n setDarkTheme(window.matchMedia('(prefers-color-scheme: dark)').matches);\n};\n\nexport const isDarkTheme = (): boolean => {\n if (darkTheme === undefined) {\n throw new Error('Theme Service needs to be initialized first.');\n }\n\n return darkTheme;\n};\n\nexport const toggleTheme = (dontUpdate: boolean = false): boolean => {\n const newValue = !darkTheme;\n setDarkTheme(newValue, dontUpdate);\n return newValue;\n};\n\nexport const activateLightTheme = () => {\n setDarkTheme(false);\n};\n\nexport const activateDarkTheme = () => {\n setDarkTheme(true);\n};\n","import { html } from 'lit';\n\nexport class Loader extends EventTarget {\n get loading() {\n return this._$loaderCount > 0;\n }\n\n _loaderCountChanged = new Event('loaderCountChanged');\n\n _$loaderCount = 0;\n\n promiseLoader(p) {\n this._$loaderCount += 1;\n this.dispatchEvent(this._loaderCountChanged);\n return p.finally(() => {\n this._$loaderCount -= 1;\n this.dispatchEvent(this._loaderCountChanged);\n });\n }\n\n // default loader\n _renderLoader() {\n if (this.loading) {\n return html`\n \n
\n
\n
\n
\n
\n
\n
\n `;\n }\n return '';\n }\n}\n","import { Loader } from './Loader';\n// deprecated\n/*\n *\n * provide loader counting functionality\n *\n * class A extend LoaderMixin(parentClass){\n *\n * someFn(){\n * ...\n * promiseLoader(new Promise())\n * ...\n *\n * console.log(this.loading); //show loading status\n * }\n *\n * }\n *\n * */\nexport default function LoaderMixin(clz) {\n return class extends clz {\n _loader = new Loader();\n\n loaderUpdate() {\n this.requestUpdate();\n }\n\n constructor() {\n super();\n this._loader.addEventListener('loaderCountChanged', () =>\n this.loaderUpdate(),\n );\n }\n\n get loading() {\n return this._loader.loading;\n }\n\n promiseLoader(p) {\n return this._loader.promiseLoader(p);\n }\n\n // default loader\n _renderLoader() {\n return this._loader._renderLoader();\n }\n };\n}\n","import { css, html } from 'lit';\n\nexport default function MsgMixin(clz) {\n return class extends clz {\n static styles = css`\n .msg {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n\n .msg .error {\n color: red;\n }\n `;\n\n constructor() {\n super();\n this._msg = '';\n }\n\n _renderMsg() {\n if (this._msg) {\n return html`
${this._msg}
`;\n }\n return '';\n }\n\n set msg(msg) {\n this._msg = msg;\n this.requestUpdate();\n }\n };\n}\n","// TODO move to i18n\n\nimport { mapValues, get } from 'lodash-es/object';\n\nexport function translate(obj, i18n) {\n if (obj) {\n if (typeof obj === 'string') {\n return obj.replace(/\\$i18n{([\\s\\S]+?)}/g, (_match, p1) => i18n.t(p1));\n }\n\n if (Array.isArray(obj)) {\n return obj.map(s => translate(s, i18n));\n }\n\n if (typeof obj === 'object') {\n return mapValues(obj, s => translate(s, i18n));\n }\n }\n return obj;\n}\n\nexport function readCookie(name) {\n const nameEQ = `${name}=`;\n const ca = document.cookie.split(';');\n for (let i = 0; i < ca.length; i += 1) {\n let c = ca[i];\n while (c.charAt(0) === ' ') c = c.substring(1, c.length);\n if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n }\n return null;\n}\n\nexport function template(t, data) {\n if (typeof t === 'string') {\n return t.replace(/\\${([\\s\\S]+?)}/g, (_match, p1) => get(data, p1));\n }\n return t;\n}\n\nexport function RGBAToHex(rgba) {\n const inParts = rgba.substring(rgba.indexOf('(')).split(',');\n const r = Number(inParts[0].substring(1).trim());\n const g = Number(inParts[1].trim());\n const b = Number(inParts[2].trim());\n // const a = parseFloat(inParts[3].substring(0, inParts[3].length - 1).trim()).toFixed(2);\n const outParts = [r.toString(16), g.toString(16), b.toString(16)];\n\n // Pad single-digit output values\n outParts.forEach((part, i) => {\n if (part.length === 1) {\n outParts[i] = `0${part}`;\n }\n });\n\n return `#${outParts.join('')}`;\n}\n\nfunction padZero(str, len = 2) {\n const zeros = new Array(len).join('0');\n return (zeros + str).slice(-len);\n}\n\nexport function contrastColor(colorVal, bw) {\n let hex = colorVal;\n if (colorVal.includes('rgba')) {\n hex = RGBAToHex(hex);\n }\n if (hex.indexOf('#') === 0) {\n hex = hex.slice(1);\n }\n // convert 3-digit hex to 6-digits.\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n if (hex.length !== 6) {\n throw new Error('Invalid HEX color.');\n }\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n if (bw) {\n return r * 0.299 + g * 0.587 + b * 0.114 > 186 ? '#000000' : '#FFFFFF';\n }\n // invert color components\n const rStr = (255 - r).toString(16);\n const gStr = (255 - g).toString(16);\n const bStr = (255 - b).toString(16);\n // pad each with zeros and return\n return `#${padZero(rStr)}${padZero(gStr)}${padZero(bStr)}`;\n}\n\nfunction fallbackCopyTextToClipboard(text) {\n const textArea = document.createElement('textarea');\n textArea.value = text;\n\n // Avoid scrolling to bottom\n textArea.style.top = '0';\n textArea.style.left = '0';\n textArea.style.position = 'fixed';\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n const successful = document.execCommand('copy');\n const msg = successful ? 'successful' : 'unsuccessful';\n // eslint-disable-next-line no-console\n console.info(`Fallback: Copying text command was ${msg}`);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('Fallback: Oops, unable to copy', err);\n }\n\n document.body.removeChild(textArea);\n}\n\nexport function copyTextToClipboard(text) {\n if (!navigator.clipboard) {\n fallbackCopyTextToClipboard(text);\n return;\n }\n navigator.clipboard.writeText(text).then(\n () => {\n // eslint-disable-next-line no-console\n console.info('Async: Copying to clipboard was successful!');\n },\n err => {\n // eslint-disable-next-line no-console\n console.error('Async: Could not copy text: ', err);\n },\n );\n}\n\nexport function addSwipeEvents(target, handle) {\n let touchstartX = 0;\n let touchstartY = 0;\n let touchendX = 0;\n let touchendY = 0;\n let timerstart = new Date().getTime();\n target.addEventListener(\n 'touchstart',\n event => {\n timerstart = new Date().getTime();\n touchstartX = event.changedTouches[0].screenX;\n touchstartY = event.changedTouches[0].screenY;\n },\n false,\n );\n\n target.addEventListener(\n 'touchend',\n event => {\n if (new Date().getTime() - timerstart < 250) {\n touchendX = event.changedTouches[0].screenX;\n touchendY = event.changedTouches[0].screenY;\n handle(touchstartX, touchendX, touchstartY, touchendY);\n }\n },\n false,\n );\n}\n\nexport function delay(ms) {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\n });\n}\n\nexport function setWithExpiry(key, value, ttl, session = false) {\n const now = new Date();\n\n // `item` is an object which contains the original value\n // as well as the time when it's supposed to expire\n const item = {\n value,\n expiry: now.getTime() + ttl * 1000,\n };\n const storage = session && sessionStorage ? sessionStorage : localStorage;\n storage.setItem(key, JSON.stringify(item));\n}\n\nexport function getWithExpiry(key, session) {\n const storage = session && sessionStorage ? sessionStorage : localStorage;\n const itemStr = storage.getItem(key);\n // if the item doesn't exist, return null\n if (!itemStr) {\n return null;\n }\n const item = JSON.parse(itemStr);\n const now = new Date();\n // compare the expiry time of the item with the current time\n if (now.getTime() > item.expiry) {\n // If the item is expired, delete the item from storage\n // and return null\n localStorage.removeItem(key);\n return null;\n }\n return item.value;\n}\n\nexport function deUmlaut(value) {\n /* eslint-disable no-param-reassign */\n value = value.toLowerCase();\n value = value.replace(/ä/g, 'ae');\n value = value.replace(/ö/g, 'oe');\n value = value.replace(/ü/g, 'ue');\n value = value.replace(/ß/g, 'ss');\n value = value.replace(/ /g, '-');\n value = value.replace(/\\./g, '');\n value = value.replace(/,/g, '');\n value = value.replace(/\\(/g, '');\n value = value.replace(/\\)/g, '');\n /* eslint-enable no-param-reassign */\n return value;\n}\n\nexport function downloadFile(string, filename) {\n const link = document.createElement('a');\n link.style.display = 'none';\n link.setAttribute('target', '_blank');\n link.setAttribute(\n 'href',\n `data:text/csv;charset=utf-8,${encodeURIComponent(string)}`,\n );\n link.setAttribute('download', filename);\n document.body.appendChild(link);\n link.click();\n}\n\nexport function downloadTableAsCsv(\n table,\n seperator = ',',\n filename = 'data.csv',\n header = '',\n) {\n const csv: Array = [];\n for (const row of table.rows) {\n const tmpCell: Array = [];\n for (const cell of row.cells) {\n if (cell.colSpan === 1) {\n const field = cell.innerText\n .replace(/(\\r\\n|\\n|\\r)/gm, '')\n .replace(/(\\s\\s)/gm, ' ')\n .replace(/\"/g, '\"\"');\n tmpCell.push(`\"${field}\"`);\n }\n }\n csv.push(tmpCell.join(seperator));\n }\n downloadFile(`${header}${csv.join('\\n')}`, filename);\n}\n","import {\n has,\n get,\n find,\n filter,\n sortBy,\n merge,\n keyBy,\n groupBy,\n maxBy,\n values,\n first,\n} from 'lodash-es';\nimport { Dictionary } from 'lodash';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport { TsDataResponse, TsDataPoint } from '../common/timeseries';\nimport { Layer, RequestLayersResponse } from '../common/layers';\n// api for file generator\n\nconst defaultLayer = {\n tablePopup: true,\n popupControl: true,\n popup: 'ww-map-popup-dynamic',\n filter: [],\n classification: {\n default: {\n marker: {\n backgroundColor: 'rgb(7, 97, 199)',\n shape: 'circle',\n color: 'rgba(255,255,255, 1)',\n icon: '',\n fontSize: 0.8,\n radius: 8,\n border: {\n color: 'rgba(29,29,27, 1)',\n width: 1,\n },\n },\n },\n tags: [\n {\n name: 'wert',\n label: 'aktuelle Werte',\n filter: {\n timestamp: {\n duration: 'PT48H',\n },\n },\n marker: {\n backgroundColor: 'rgb(7, 97, 199)',\n shape: 'circle',\n },\n },\n {\n name: 'keinwert',\n priority: 1,\n label: 'keine aktuellen Werte',\n filter: {\n timestamp: {\n not: {\n duration: 'PT48H',\n },\n },\n },\n marker: {\n backgroundColor: 'rgba(255, 255, 255, 1)',\n },\n },\n ],\n },\n sortedBy: [{ field: 'station_longname', ascending: true }],\n columns: [\n {\n css: 'width:95px;',\n field: '__tag',\n label: 'Status',\n format: 'status',\n sortable: true,\n },\n {\n field: 'station_name',\n label: 'Station',\n sortable: true,\n },\n\n {\n field: 'timestamp',\n label: 'Zeitpunkt [MEZ]',\n format: 'dateTime',\n sortable: true,\n hideAble: true,\n },\n {\n field: 'ts_value',\n label: 'Wert',\n sortable: true,\n hideAble: true,\n format: {\n type: 'number',\n options: {\n minimumFractionDigits: 2,\n },\n },\n },\n ],\n};\n\nexport class API {\n reportsPath: string;\n\n basePath: string;\n\n configSubPath: string;\n\n configPath: string;\n\n staticConfigPath: string;\n\n dataPath: string;\n\n reportList: any;\n\n _cache: any;\n\n imagesList: any;\n\n constructor({\n basePath,\n dataPath,\n configSubPath,\n reportsPath,\n staticConfigPath,\n }) {\n this.reportsPath = reportsPath || null;\n this.basePath = basePath || '.';\n this.configSubPath = configSubPath || 'config';\n this.staticConfigPath = staticConfigPath || 'static_config';\n this.configPath = `${this.basePath}/${this.configSubPath}`;\n this.dataPath = dataPath || './data';\n this._cache = new Map();\n this._requestcache = new Map();\n this.reportList = null;\n this.imagesList = null;\n }\n\n async getClassification(name) {\n const classes = await this.getClassifications();\n return find(classes, { name });\n }\n\n async getClassifications() {\n return this._requestJson('/internet/raster/classifications.json');\n }\n\n async getMapConfig() {\n return this._requestJson('/map.json', this.configPath);\n }\n\n async getSites() {\n return this._requestJson('/stations/sites.json');\n }\n\n async getStations(query = {}) {\n const stations = await this._requestJson(\n '/internet/stations/stations.json',\n );\n return filter(stations, query);\n }\n\n /**\n * Get external/static stations from file\n *\n * @param filename - Path to file in public - directory containing local stations, e.g. 'projects.json' or 'waterlevel.json'\n * @param query - Filter query on found static stations; See lodash filter method\n *\n * @returns Array of External/static Stations from a provided JSON File, optionally to be filterred by query\n *\n * @remarks\n * This function is also used in ww-worldmap to fetch the provided projects, handled as stations\n */\n async getExternalStations(filename, query = {}): Promise {\n const stations = await this._requestJson(filename, './');\n return filter(stations, query);\n }\n\n async getStationIndex(site_no, station_no) {\n const station = await this._requestJson(\n `/internet/stations/${site_no}/${station_no}/index.json`,\n );\n return station;\n }\n\n async getRasterList() {\n const rasterlist = await this._requestJson('/internet/raster/index.json');\n return rasterlist._links.filter(item => item.type === 'resource');\n }\n\n async getRessource(ahref, base) {\n return this._requestJson(ahref, base);\n }\n\n async getStationByNo(stationNo) {\n const station = await this.getStations({ station_no: stationNo })[0];\n return station;\n }\n\n async getStation(stationId: string): Promise {\n let siteNo = '';\n let stationNo = '';\n if (siteNo.length === 0 || stationNo.length === 0) {\n const station = (await this.getStations({ station_id: stationId }))[0];\n siteNo = station?.site_no ?? '';\n stationNo = station?.station_no ?? '';\n }\n\n if (siteNo.length === 0 || stationNo.length === 0) {\n return null;\n }\n\n const data = await this._requestJson(\n `/internet/stations/${[siteNo, stationNo].join('/')}/index.json`,\n );\n const reports = await this.getReport(stationNo);\n return {\n ...data,\n reports,\n zips: sortBy(\n filter(\n data._links,\n s =>\n s.mime_type === 'application/zip' ||\n s.mime_type === 'application/msexcel' ||\n s.mime_type === 'text/comma-separated-values',\n ),\n 'station_parameter',\n ),\n downloads: sortBy(\n filter(data._links, s => s.mime_type === 'application/msexcel'),\n 'station_parameter',\n ),\n timeseries: sortBy(\n filter(\n data._links,\n s => s.station_parameter && s.mime_type === 'application/json',\n ),\n 'station_parameter',\n ),\n };\n }\n\n // todo tsName for file name ?\n async getTs({ siteNo, stationNo, parameterName, tsName }) {\n return this._requestJson(\n `/internet/stations/${[siteNo, stationNo, parameterName, tsName].join(\n '/',\n )}.json`,\n );\n }\n\n getLink(ahref: string): string {\n return this.dataPath + ahref;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _transformLayerData(data: never[], config) {\n if (!config) console.warn('No layer config provided!');\n data = data.map(item => {\n Object.keys(item).forEach(key => {\n if (key.startsWith('metadata_')) {\n item[key.replace('metadata_', '')] = item[key];\n delete item[key];\n }\n });\n return item;\n });\n const stations = groupBy(data, 'station_id');\n\n const ret = [];\n for (const [, station] of Object.entries(stations)) {\n const stobj = {\n mainParameter: config?.mainParameter,\n ts_values: {},\n ...station[0],\n };\n station.forEach(entry => {\n // eslint-disable-next-line no-restricted-syntax\n for (const key in entry) {\n if (Object.prototype.hasOwnProperty.call(entry, key)) {\n const value = entry[key];\n const param = entry.stationparameter_name;\n /** Multi-value icons/piecharts in map (e.g. LANUV Geberzeitreihen) */\n if (config?.tsreplace) {\n config.tsreplace.forEach(token => {\n entry.ts_shortname = entry.ts_shortname.replace(token, '');\n });\n }\n if (config?.multiTs) {\n const cleanShortName = entry.ts_shortname.replace(/\\./g, '');\n if (!stobj.ts_values[param]) {\n stobj.ts_values[param] = {};\n }\n if (!stobj.ts_values[param][cleanShortName]) {\n stobj.ts_values[param][cleanShortName] = {};\n }\n\n if (\n key.includes('tsinfo_') ||\n key.includes('ts_') ||\n key.includes('param') ||\n key.includes('timestamp')\n ) {\n stobj.ts_values[param][cleanShortName][key] = value;\n } else if (key !== 'ts_values') {\n stobj[key] = value;\n }\n } else {\n if (!stobj.ts_values[param]) {\n stobj.ts_values[param] = {};\n }\n if (\n key.startsWith('tsinfo_') ||\n key.startsWith('ts_') ||\n key.includes('param') ||\n key.startsWith('timestamp')\n ) {\n stobj.ts_values[param][key] = value;\n } else {\n stobj[key] = value;\n }\n }\n }\n }\n });\n ret.push(stobj);\n }\n // console.timeEnd('transform');\n // console.log(ret);\n return ret;\n }\n\n async getTsData(ahref: string, nocache = true) {\n return this._requestJson(`/${ahref}`, this.dataPath, nocache);\n }\n\n async getLayers(): Promise> {\n const response: RequestLayersResponse = await this._requestJson(\n '/internet/layers/index.json',\n undefined,\n true,\n );\n\n response._links.push({\n type: 'resource',\n layer_type: 'STATION_LAYER',\n alias: 'stations',\n id: 'stations',\n } as Layer);\n const config = await this._requestJson('/layercfg.json', this.configPath);\n if (!response || !config) {\n throw Error('error loading config or data');\n }\n response._links.forEach(item => {\n item.creationDateInMillis = response.creationDateInMillis;\n });\n return merge(\n keyBy(filter(response._links, { type: 'resource' }), 'alias'),\n keyBy(config, 'alias'),\n );\n }\n\n async getLayer(alias): Promise {\n const l = filter(await this.getLayers(), { alias })[0];\n if (!l.config) {\n l.config = { ...defaultLayer };\n l.config.id = l.id;\n l.config.alias = l.alias;\n l.config.classification.label = l.alias;\n l.config.columns = l.config.columns.map(item => {\n if (item.field === 'ts_value') {\n item.label = `${l.label}`;\n }\n return item;\n });\n }\n if (l?.id) {\n let data = await this.getLayerData(l);\n\n if (l.config.parameterFilterAttribute) {\n try {\n data.forEach(station => {\n if (station[l.config.parameterFilterAttribute]) {\n const parFilter = JSON.parse(\n station[l.config.parameterFilterAttribute],\n );\n if (Array.isArray(parFilter) && parFilter.length !== 0) {\n Object.keys(station.ts_values).forEach(par => {\n if (!parFilter.includes(par)) {\n delete station.ts_values[par];\n }\n });\n }\n }\n });\n data = data.filter(item => Object.keys(item.ts_values).length);\n } catch (e) {\n console.error('invalid parameterFilterAttribute');\n }\n }\n\n if (l.config.stationsFilter) {\n data = data.filter(station =>\n Object.keys(l.config.stationsFilter).every(key => {\n const condition = l.config.stationsFilter[key];\n if (condition === '*') {\n return has(station, key);\n }\n if (condition.startsWith('!')) {\n return (\n get(station, key) !== l.config.stationsFilter[key].substr(1)\n );\n }\n return get(station, key) === l.config.stationsFilter[key];\n }),\n );\n }\n return {\n data,\n config: l.config,\n creationDateInMillis: l.creationDateInMillis,\n } as TsDataResponse;\n }\n\n throw new Error(`layer ${alias} does not exist`);\n }\n\n async getLayerData(l: Layer): Promise {\n if (l.layer_type === 'TS_VALUES') {\n return this.getTsValuesLayerData(l);\n }\n if (l.layer_type === 'STATION_LAYER') {\n return this.getStationLayerData(l);\n }\n if (l.layer_type === 'MULTI_LAYER') {\n return this.getMultiLayerData(l);\n }\n if (l.layer_type === 'TS_MAX_VALUES') {\n return this.getMaxLayerData(l);\n }\n return this.getDefaultLayerData(l);\n }\n\n async getMaxLayerData(l: Layer): Promise {\n const ids = typeof l.id === 'string' ? [l.id] : l.id;\n let resp = [];\n await Promise.all(\n ids.map(async id => {\n try {\n const data = await this._requestJson(\n `/internet/layers/${id}/index.json`,\n this.dataPath,\n true,\n );\n resp = resp.concat(data);\n } catch {\n console.warn(\n `error loading data for layer ${l.alias}, dataId: ${id}`,\n );\n }\n }),\n );\n if (!l.parameter) {\n console.error('no parameter provided for comparison');\n return [];\n }\n\n const ret = Object.values(groupBy(resp, 'station_id')).map(item =>\n item.reduce((prev, current) =>\n prev.ts_values[l.parameter]?.ts_value >\n current.ts_values[l.parameter]?.ts_value\n ? prev\n : current,\n ),\n );\n return ret;\n }\n\n async getDefaultLayerData(l: Layer): Promise {\n const ids = typeof l.id === 'string' ? [l.id] : l.id;\n let resp = [];\n await Promise.all(\n ids.map(async id => {\n try {\n let data = await this._requestJson(\n `/internet/layers/${id}/index.json`,\n this.dataPath,\n true,\n );\n if (data[0]?.metadata_station_id) {\n data = data.map(item => {\n Object.keys(item).forEach(key => {\n if (key.startsWith('metadata_')) {\n item[key.replace('metadata_', '')] = item[key];\n delete item[key];\n }\n });\n return item;\n });\n }\n resp = resp.concat(data);\n } catch {\n console.warn(\n `error loading data for layer ${l.alias}, dataId: ${id}`,\n );\n }\n }),\n );\n\n if (l?.config?.additionalData) {\n const additionaldata = await this._requestJson(\n l?.config?.additionalData,\n '.',\n );\n resp = values(\n merge(keyBy(resp, 'station_id'), keyBy(additionaldata, 'station_id')),\n ).filter(item => item.station_name);\n }\n\n if (l?.config?.external) {\n const externalData = await this.getExternalStations(l.config.external);\n resp = resp.concat(\n externalData.map((item, index) => ({\n ...item,\n external: true,\n station_id: item.station_id ? item.station_id : `ext_${index}`,\n })),\n );\n }\n\n if (l?.config?.timeActive) {\n resp = resp.map(station => {\n Object.values(station.ts_values).forEach(value => {\n if (station.ts_values[value.stationparameter_name]?.high_tides) {\n station.ts_values[value.stationparameter_name].historic =\n station.ts_values[value.stationparameter_name]?.high_tides;\n }\n const datattr =\n station.ts_values[value.stationparameter_name]?.historic;\n if (datattr) {\n datattr.data = datattr.data.reduce((map, obj) => {\n map[new Date(obj[0]).getTime()] = obj;\n return map;\n }, {});\n }\n });\n return station;\n });\n }\n\n return !resp[0]?.ts_values\n ? this._transformLayerData(resp, l.config)\n : Object.values(groupBy(resp, 'station_id')).map(item => {\n const ret = Object.assign({}, ...item);\n Object.values(ret.ts_values).forEach(val => {\n val.time = dayjs(val.timestamp).format('LT');\n });\n return ret;\n });\n }\n\n async getMultiLayerData(l: Layer): Promise {\n const data = await this._requestJson(\n `/internet/layers/${l.id}/index.json`,\n this.dataPath,\n true,\n );\n return data.map(item => {\n Object.keys(item).forEach(key => {\n if (key.startsWith('metadata_')) {\n item[key.replace('metadata_', '')] = item[key];\n delete item[key];\n }\n if (key.startsWith('L1_')) {\n item[key.replace('L1_', '')] = item[key];\n delete item[key];\n }\n });\n return item;\n });\n }\n\n async getStationLayerData(l: Layer): Promise {\n const stations = await this._requestJson(\n `/internet/stations/stations.json`,\n );\n // Filter on station level\n if (l.filter) {\n // eslint-disable-next-line consistent-return\n l.filter.forEach(f => {\n const prop = first(Object.keys(f));\n const filteredstations = stations.filter(stat =>\n stat[prop].includes(f[prop]),\n );\n // Return filtered remaining stations; Return all otherwise\n if (filteredstations.length > 0) return filteredstations;\n console.warn(\n 'Station filter did not match - return all stations instead',\n );\n });\n }\n return stations;\n }\n\n async getTsValuesLayerData(l: Layer): Promise {\n let dataLayer = await this._requestJson(\n `/internet/layers/${l.id}/index.dajson`,\n this.dataPath,\n true,\n );\n if (l?.config?.additionalData) {\n const additionaldata = await this._requestJson(\n l?.config?.additionalData,\n '.',\n );\n dataLayer = values(\n merge(\n keyBy(dataLayer, 'station_id'),\n keyBy(additionaldata, 'station_id'),\n ),\n ).filter(item => item.station_name);\n }\n dataLayer.forEach(item => {\n const maxVal = maxBy(item.data, 1);\n item.timestamp = maxVal?.[0];\n item.ts_value = maxVal?.[1];\n item.classification = maxVal?.[2];\n });\n return dataLayer;\n }\n\n async getImages() {\n if (this.imagesList) {\n return this.imagesList;\n }\n\n const list = await this._requestJson('/images/index.json');\n this.imagesList =\n list && list.all_listing\n ? list.all_listing.filter(st => st.mimeType.includes('image/'))\n : [];\n return this.imagesList;\n }\n\n async getReport(stationNo) {\n const list = await this.getReports();\n return list[stationNo];\n }\n\n async getReports() {\n if (!this.reportsPath) {\n return [];\n }\n if (this.reportList) {\n return this.reportList;\n }\n const list = await this._requestJson(`/${this.reportsPath}/index.json`);\n this.reportList =\n list && list.all_listing\n ? groupBy(\n list.all_listing.map(st => {\n const [, stationNo, reportGroup, fileName] = st.name.split('/');\n return {\n path: st.name,\n stationNo,\n reportGroup,\n fileName,\n mimeType: st.mimeType,\n };\n }),\n 'stationNo',\n )\n : {};\n return this.reportList;\n }\n\n async getImage(stationNo) {\n const list = await this.getImages();\n const images = list.filter(st => st.name.includes(`/${stationNo}/`));\n if (images.length) {\n return images.map(img => `${this.dataPath}/${img.name}`);\n }\n return [];\n }\n\n async getReportInfo() {\n // TODO need better file structure.\n return this._requestJson(`/documents/index.json`, undefined, true); // todo\n }\n\n async requestText(path, base = this.dataPath) {\n return fetch(`${base}${path}`).then(x => x.text());\n }\n\n /* eslint-disable class-methods-use-this */\n /* eslint-disable no-unused-vars */\n\n /*\n * cache all request;\n * */\n // eslint-disable-next-line default-param-last\n async _requestJson(path, base = this.dataPath, nocache?) {\n let data;\n if (!nocache && this._requestcache.get(path)) {\n const cachedrequest = await this._requestcache.get(path);\n const cachedrequestdata = await cachedrequest.clone().json();\n return cachedrequestdata;\n }\n\n if (!nocache && this._cache.get(path)) {\n return this._cache.get(path);\n }\n try {\n const doFetch = fetch(`${base}${path}`);\n this._requestcache.set(path, doFetch);\n const resp = await doFetch;\n data = await resp.clone().json();\n this._cache.set(path, data);\n this._requestcache.delete(path);\n } catch (err) {\n // catches errors both in fetch and response.json\n throw path;\n }\n\n return data;\n }\n}\n","import { API } from './jsonpi';\nimport { Zarrpi } from './zarrpi';\n\nlet currentApi: API | Zarrpi;\n\nexport const init = (args: {\n basePath: any;\n dataPath: any;\n configSubPath: any;\n reportsPath: any;\n staticConfigPath: any;\n}) => {\n if (!currentApi) {\n currentApi = new API(args);\n }\n return currentApi;\n};\n\nexport const initZarrApi = (args: {\n basePath: any;\n dataPath: any;\n configSubPath: any;\n reportsPath: any;\n staticConfigPath: any;\n}) => {\n if (!currentApi) {\n currentApi = new Zarrpi(args);\n }\n return currentApi;\n};\n\nexport const getCurrentApi = (): API | Zarrpi => {\n if (!currentApi) {\n // eslint-disable-next-line no-throw-literal\n throw 'api not initialized';\n }\n return currentApi;\n};\n","import { css } from 'lit';\n// language=CSS\nexport default css`\n :host {\n display: block;\n position: relative;\n overflow: auto;\n }\n\n .table {\n border-collapse: collapse;\n border-spacing: 0;\n width: 100%;\n display: table;\n table-layout: fixed;\n }\n\n br {\n display: none;\n }\n\n .header {\n display: table-header-group;\n text-align: left;\n }\n\n .body {\n display: table-row-group;\n height: 100%;\n overflow: auto;\n }\n\n .row {\n display: table-row;\n border-width: 1px 0;\n border-color: #ececec;\n border-style: solid;\n cursor: pointer;\n }\n\n .row:hover {\n background: lightgray !important;\n }\n\n .cell {\n padding: 5px 10px;\n display: table-cell;\n vertical-align: middle;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .cell.number,\n .cell.date {\n text-align: right;\n }\n\n .header .row {\n border-top-width: 0;\n background-color: white;\n border-bottom: 1px solid darkgray;\n }\n\n .header .cell {\n position: sticky;\n top: 0;\n background: inherit;\n z-index: 2;\n padding: 0;\n }\n\n .header-content {\n padding: 10px;\n overflow: hidden !important;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .header-content .col-label {\n }\n`;\n","import get from 'lodash-es/get';\n\n/** TODO: Unit test */\nexport function getFromItem(\n item: object,\n field: Array | string,\n): string {\n if (!Array.isArray(field)) {\n return get(item, field);\n }\n return field.map(f => get(item, f)).filter(i => i !== undefined)[0];\n}\n","/* eslint-disable lit-a11y/click-events-have-key-events */\n/* eslint-disable max-classes-per-file */\nimport { html, LitElement } from 'lit';\n/* eslint-disable import/extensions */\nimport { repeat } from 'lit/directives/repeat.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\n/* eslint-enable import/extensions */\nimport style from './base-table.css?inline';\nimport '../ki-icon/ki-icon';\nimport { template } from '../../common/util';\nimport Mix from '../../common/Mix';\nimport PropertyDefaultValue from '../../common/PropertyDefaultValue';\nimport { getFromItem } from './GetField';\n\nexport default class BaseTable extends Mix(LitElement, PropertyDefaultValue) {\n // language=CSS\n static styles = style;\n\n constructor() {\n super();\n this.data = [];\n }\n\n get renderingData() {\n return this.data;\n }\n\n get renderingColumns() {\n // for customize\n return (\n this.columns ||\n Object.keys(this.renderingData[0] || {}).map(key => ({\n field: key,\n label: key,\n sortable: true,\n }))\n );\n }\n\n static get properties() {\n return {\n idproperty: {\n type: String,\n },\n data: {\n type: Array,\n },\n /*\n * [\n * {\n * field: String,\n * label: String,\n * renderHeaderCell: function.\n * renderCell: function\n * }\n * ]\n *\n * */\n columns: {\n type: Array,\n },\n renderRow: {\n type: Function,\n },\n };\n }\n\n _renderHeader() {\n return html`\n
\n
\n ${repeat(\n this.renderingColumns,\n (col: { field: any }) => col.field,\n col => this._renderHeaderCell(col),\n )}\n
\n
\n `;\n }\n\n // The ignore is important because prettier inserts whitespace which the table renders\n // prettier-ignore\n // eslint-disable-next-line class-methods-use-this\n _renderHeaderCell(col) {\n return col.renderHeaderCell\n ? col.renderHeaderCell()\n : html`\n \n ${unsafeHTML(col.label)}\n \n \n `;\n }\n\n _renderData() {\n // language=html\n const keyFn = this.idproperty && (item => item[this.idproperty]);\n return html`\n
\n ${repeat(this.renderingData || [], keyFn, this.renderRow.bind(this))}\n
\n `;\n }\n\n // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars\n mouseenter(_e?, _item?) {\n // implement in parent class if needed\n }\n\n // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars\n mouseleave(_e?, _item?) {\n // implement in parent class if needed\n }\n\n renderRow(item) {\n // can be override;\n // language=html\n return html`\n this.mouseenter(e, item)}\"\n @mouseleave=\"${e => this.mouseleave(e, item)}\"\n @click=\"${() => {\n this._onRowClick(item);\n }}\"\n >\n ${this.renderingColumns.map(col => this._renderCell(col, item))}\n \n `;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _renderCell(col, item) {\n const val = getFromItem(item, col.field);\n const prefix = col.prefix && val ? template(col.prefix, item) : '';\n const suffix = col.suffix && val ? template(col.suffix, item) : '';\n return col.renderCell\n ? col.renderCell(item)\n : html`\n `col-${field}`)\n .join(' ')}\"\n >\n ${prefix}${val}${suffix}\n \n `;\n }\n\n render() {\n // language=html\n return html`\n
\n ${this._renderHeader()} ${this._renderData()}\n
\n `;\n }\n\n _onRowClick(item) {\n this.dispatchEvent(\n new CustomEvent('row-click', {\n detail: {\n data: item,\n },\n }),\n );\n }\n}\n","import { html } from 'lit';\nimport cloneDeep from 'lodash-es/cloneDeep';\nimport MsgMixin from '../../common/MsgMixin';\nimport LoaderMixin from '../../common/LoaderMixin';\nimport Mix from '../../common/Mix';\n\nexport default function PromiseData(clz) {\n return class extends Mix(clz, LoaderMixin, MsgMixin) {\n set data(val) {\n this.msg = '';\n if (val && val.then) {\n // promise\n this.promiseLoader(\n val\n .then(data => {\n this.data = data;\n })\n .catch(error => {\n this.msg = html` ${error} `;\n }),\n );\n } else {\n super.data = cloneDeep(val) || [];\n if (super.data.length === 0) {\n this.msg = this.noDataMessage || 'No Data';\n }\n }\n }\n\n get data() {\n return super.data;\n }\n\n render() {\n return this._renderLoader() || this._renderMsg() || super.render();\n }\n };\n}\n","const maxIterations = 150;\n\nexport default function getPropertyDescriptor(object, propertyName) {\n let iteration = 0;\n let proto = Object.getPrototypeOf(object);\n let targetDescriptor;\n do {\n targetDescriptor = Object.getOwnPropertyDescriptor(proto, propertyName);\n iteration += 1;\n if (targetDescriptor === undefined) {\n proto = Object.getPrototypeOf(proto);\n }\n } while (\n proto !== undefined &&\n proto !== null &&\n targetDescriptor === undefined &&\n iteration <= maxIterations\n );\n\n if (iteration === maxIterations) {\n console.warn(`Max iterations reached.`);\n }\n\n if (targetDescriptor === undefined) {\n console.error(`couldn't find property \"${propertyName}\".`);\n }\n\n return [proto, targetDescriptor];\n}\n","/* eslint-disable func-names */\nimport { debounce as ldb } from 'lodash-es';\nimport getPropertyDescriptor from './helper/getPropertyDescriptor';\n\n// TODO should bind with this;\n\nexport const debounce = function (delay = 0) {\n return (_target, _key, descriptor) => {\n const fn = descriptor.value;\n descriptor.value = ldb(fn, delay);\n return descriptor;\n };\n};\n\n// eslint-disable-next-line default-param-last\nexport const debounceMixin = function (targetProperty, delay = 0, clz) {\n return class extends clz {\n constructor() {\n super();\n\n const [, propertyDescriptor] = getPropertyDescriptor(\n this,\n targetProperty,\n );\n debounce(delay)(this, targetProperty, propertyDescriptor);\n }\n };\n};\n","/* eslint-disable func-names */\n// discussion: update when get or update when set, update via getting is better for data logic\n// why not apply to this, pass this can reduce code size with t=>t.name instead function(){return this.name}\n// and void miss typing with ()=>this.name which is wrong\n/*\n value be cached util props in watch fired.\n all watcher only check when updating element, so make it's called.\n example:\n class Demo {\n\n @computed([t => t.lastName, t => t.firstName,])\n get fullName() {\n return `${this.firstName} ${this.lastName}`;\n }\n\n @computed([t => t.fullName, t => t.classRoom])\n get info() {\n return `${this.classRoom } ${this.fullName}`;;\n }\n\n @autoRun([t => t.fullName])\n fetchInfo() {\n return fetch('http://server.com/user?fullName=${this.fullName}').then((u)=>{console.log(u)})\n }\n\n // async\n @computed('fullName' , { default: {a:1} })\n get asyncData(){\n return fetch('http://server.com/user?fullName=${this.fullName}')\n }\n\n\n }\n\n\n*/\n\nimport { isEqual } from 'lodash-es';\nimport getPropertyDescriptor from './helper/getPropertyDescriptor';\n\nconst getterChain: Array = [];\n\nlet computeUUID = 0;\n\nexport function _preProcessWatchers(watchers) {\n if (!watchers) {\n throw new Error('must set watchers');\n }\n\n if (!Array.isArray(watchers)) {\n watchers = [watchers];\n }\n return watchers.map(w => {\n if (typeof w === 'string') {\n return function getter(v) {\n return v[w];\n };\n }\n return w;\n });\n}\n\nconst getComputedGetter = (\n originGetter,\n key,\n watchers,\n options,\n id,\n target,\n targetname,\n) =>\n function getter() {\n const fnName = `${id}_${targetname}.${key}`;\n\n if (getterChain.indexOf(fnName) >= 0) {\n console.debug(getterChain);\n throw new Error(`recursive getter chain with :${fnName}`);\n }\n getterChain.push(fnName);\n // console.debug(getterChain);\n try {\n const cacheKey = `__cached_${key}`;\n const cacheParamsKey = `__cached_params_${key}`;\n\n const values = watchers.map(w => w(target));\n // simple equal;\n if (\n !target[cacheParamsKey] ||\n !values.every((v, i) => isEqual(v, target[cacheParamsKey][i]))\n ) {\n // if watcher changes\n target[cacheParamsKey] = values;\n // recall\n\n const re = originGetter.call(target);\n\n if (re && re.then) {\n const q = re.then(v => {\n target[cacheKey] = v;\n });\n // async\n // need have loader mixin,so can call request update\n if (target.promiseLoader) {\n // avoid update loader in same loop\n setImmediate(() => {\n target.promiseLoader(q);\n });\n } else {\n q.then(() => target.requestUpdate());\n }\n if (target[cacheKey] === undefined) {\n target[cacheKey] = options.default;\n }\n } else {\n target[cacheKey] = re;\n }\n }\n getterChain.pop();\n return target[cacheKey];\n } catch (e) {\n getterChain.pop();\n console.error(e);\n throw e;\n }\n };\n\nexport const computed = function (watchers, options = {}) {\n watchers = _preProcessWatchers(watchers);\n const id = computeUUID;\n computeUUID += 1;\n\n return function decorator(target, key, descriptor) {\n if (descriptor.get) {\n // for getter\n const originGetter = descriptor.get;\n descriptor.get = getComputedGetter(\n originGetter,\n key,\n watchers,\n options,\n id,\n target,\n target.constructor.name,\n );\n }\n\n return descriptor;\n };\n};\n\nexport const computedMixin = function (\n targetProperty,\n watchers,\n // eslint-disable-next-line default-param-last\n options = {},\n clz,\n) {\n watchers = _preProcessWatchers(watchers);\n const id = computeUUID;\n computeUUID += 1;\n return class extends clz {\n constructor() {\n super();\n\n const [proto, targetDescriptor] = getPropertyDescriptor(\n this,\n targetProperty,\n );\n\n const wrapperFn = getComputedGetter(\n targetDescriptor.get,\n targetProperty,\n watchers,\n options,\n id,\n this,\n proto.constructor.name,\n );\n Object.defineProperty(this, targetProperty, {\n get: wrapperFn,\n configurable: true,\n });\n }\n };\n};\n","/* eslint-disable max-classes-per-file */\nimport { css, html } from 'lit';\nimport { findIndex } from 'lodash-es';\nimport { getQueryObject } from '../../decorators/query';\nimport { debounceMixin } from '../../decorators/debounce';\nimport { computedMixin } from '../../decorators/computed';\n\nfunction _inlectLazyRendering(clz) {\n return class extends clz {\n // language=CSS\n static styles = css`\n .scroller {\n overflow: auto;\n height: 100%;\n overflow-anchor: none;\n }\n\n .cell {\n white-space: nowrap;\n }\n\n .scroller-content {\n box-sizing: border-box;\n }\n\n .scroller-content::after {\n display: block;\n padding: 10px;\n color: gray;\n text-align: center;\n }\n `;\n\n static get properties() {\n return {\n startIndex: {\n type: Number,\n default: 0,\n },\n };\n }\n\n rowHeight = 30;\n\n get renderingData() {\n return this.data.slice(\n this.startIndex,\n Math.min(this.data.length, this.__lastIndex),\n );\n }\n\n get __scroller() {\n return getQueryObject(this, '.scroller');\n }\n\n render() {\n // TODO\n // try to just render visible part.\n // language=html\n return html`\n
\n \n ${super.render()}\n
\n \n `;\n }\n\n get __lastIndex() {\n return (\n this.startIndex +\n Math.max(50, Math.round(this.offsetHeight / this.rowHeight))\n );\n }\n\n _onScroll() {\n const n = Math.round(this.__scroller.scrollTop / this.rowHeight);\n if (Math.abs(n - this.startIndex - 5) > 5) {\n this.startIndex = Math.min(n, this.data.length - 50);\n this.startIndex = Math.max(this.startIndex, 0);\n }\n }\n\n _resetScroll() {\n if (this.__scroller) {\n this.__scroller.scrollTop = 0;\n }\n }\n\n // scroll to the specific row with idproperty\n scrollTo(idProperty = '') {\n const counter =\n this.data.length &&\n findIndex(this.data, row => row[this.idproperty] === idProperty);\n if (counter !== -1 && this.__scroller) {\n this.__scroller.scrollTop = counter * this.rowHeight;\n }\n }\n };\n}\n\nexport default function LazyRendering(clz) {\n return class extends debounceMixin(\n '_onScroll',\n 100,\n computedMixin('__lastIndex', 'startIndex', {}, _inlectLazyRendering(clz)),\n ) {};\n}\n","/* eslint-disable class-methods-use-this */\nimport '../ki-icon/ki-icon';\nimport { html, css } from 'lit';\nimport first from 'lodash-es/first';\nimport get from 'lodash-es/get';\n\nexport default function SortAble(clz) {\n return class extends clz {\n // language=CSS\n static styles = css`\n .sortable {\n cursor: pointer;\n }\n\n .header-content .icons,\n .header-content .sort-index {\n display: none;\n }\n\n .header-content .sort-index {\n font-size: 8px;\n line-height: 8px;\n transform: translateY(-10px);\n color: var(--theme-color, #0056a0);\n }\n\n .header-content.sortable .icons {\n padding-left: 10px;\n display: inline-block;\n }\n\n .header-content.sortable .icons,\n .header-content.sortable .sort-index {\n display: inline-block;\n }\n\n .header-content.sortable ki-icon {\n display: block;\n color: lightgray;\n }\n\n .header-content.sortable ki-icon {\n visibility: hidden;\n }\n\n .header-content.sortable:hover ki-icon {\n visibility: visible;\n }\n\n .header-content.sortable ki-icon[icon~='ki-sort-up'],\n .header-content.sortable ki-icon[icon~='ki-sort-down'] {\n color: var(--theme-color, #0056a0);\n visibility: visible;\n }\n `;\n\n static get properties() {\n return {\n sort: {\n type: Array,\n },\n multisort: {\n type: Boolean,\n },\n // Transform Ä,Ö,Ü to A,O,U to be conform with DIN5007\n normalizeSpecialCharacters: {\n type: Boolean,\n },\n };\n }\n\n constructor() {\n super();\n this.sort = [];\n this.normalizeSpecialCharacters = false;\n }\n\n render() {\n this._sortData();\n return super.render();\n }\n\n _renderHeaderCell(col) {\n // put text in td\n let changeOrder;\n let removeOrder;\n let sortIndex = '';\n let sort;\n let sortIcon = 'ki-sort-v';\n if (col.sortable) {\n sort = this.sort.find(_sort => _sort.field === col.field);\n if (sort) {\n sortIndex = this.multisort ? this.sort.indexOf(sort) + 1 : '';\n sortIcon = sort.ascending ? 'ki-sort-up' : 'ki-sort-down';\n changeOrder = () => {\n sort.ascending = !sort.ascending;\n // move to first\n this.sort = [sort, ...this.sort.filter(a => a !== sort)];\n };\n removeOrder = () => {\n this.sort = [...this.sort.filter(a => a !== sort)];\n };\n } else {\n changeOrder = () => {\n this.sort = [\n {\n field: col.field,\n sortBy: col.sortBy,\n ascending: false,\n format: col.format,\n useDIN5007: col.useDIN5007,\n },\n ...this.sort,\n ];\n };\n }\n }\n\n return col.renderHeaderCell\n ? col.renderHeaderCell()\n : // The ignore is important because prettier inserts whitespace which the table renders\n // prettier-ignore\n html`\n ${col.label}\n \n \n \n
${sortIndex}
\n \n \n `;\n }\n\n _sortData() {\n // Check if we should apply DIN5007 / defined in layercfg -> col\n if (first(this.sort)?.useDIN5007) this.normalizeSpecialCharacters = true;\n\n if (this.sort.length > 0) {\n if (!this.multisort) {\n this.sort = this.sort.slice(0, 1);\n }\n\n this.data.sort((a, b) => {\n const sort = [...this.sort];\n let result = 0;\n do {\n const _sort = sort.shift();\n const compareProperty = _sort.sortBy || _sort.field;\n let aValue = get(a, compareProperty);\n let bValue = get(b, compareProperty);\n if (typeof aValue === 'string') {\n aValue = aValue.toLowerCase();\n if (this.normalizeSpecialCharacters)\n aValue = this._normalizeSpecChars(aValue);\n }\n if (typeof bValue === 'string') {\n bValue = bValue.toLowerCase();\n if (this.normalizeSpecialCharacters)\n bValue = this._normalizeSpecChars(bValue);\n }\n const format =\n typeof _sort.format === 'string'\n ? _sort.format\n : _sort.format?.type;\n if (['textnumber', 'number', 'wiskinumber'].indexOf(format) >= 0) {\n const parsedA =\n typeof aValue === 'string'\n ? parseFloat(aValue.replace(',', ''))\n : aValue;\n const parsedB =\n typeof bValue === 'string'\n ? parseFloat(bValue.replace(',', ''))\n : bValue;\n if (Number.isNaN(parsedA) && Number.isNaN(parsedB)) {\n aValue = 0;\n bValue = 0;\n } else if (Number.isNaN(parsedA)) {\n bValue = parsedB;\n aValue = bValue - 1;\n } else if (Number.isNaN(parsedB)) {\n aValue = parsedA;\n bValue = aValue - 1;\n } else {\n aValue = parsedA;\n bValue = parsedB;\n }\n }\n if (aValue === bValue) {\n result = 0;\n } else {\n result = (aValue > bValue ? 1 : -1) * (_sort.ascending ? 1 : -1);\n }\n } while (result === 0 && sort.length > 0);\n return result;\n });\n }\n }\n\n // Enforce DIN5007 sorting order\n _normalizeSpecChars(str: string): string {\n let _s: string = str;\n _s = _s.replace('ä', 'a');\n _s = _s.replace('ö', 'o');\n _s = _s.replace('ü', 'u');\n return _s;\n }\n };\n}\n","import { css, html, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\nimport { endsWith } from 'lodash-es/string';\n\n/*\n * position related to it's parent with (position: relative;)\n *\n * */\n@customElement('ki-popup')\nexport default class KiPopup extends LitElement {\n // language=CSS\n static styles = css`\n :host {\n display: block;\n position: fixed;\n outline: none;\n z-index: 999;\n cursor: default;\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n background: white;\n\n transition: visibility linear 0s 0s, all ease-in-out 0.6s 0.1s;\n\n visibility: hidden;\n pointer-events: none;\n opacity: 0;\n }\n\n :host(.visible) {\n visibility: visible;\n pointer-events: visible;\n opacity: 1;\n }\n #focus-node:focus {\n outline: none;\n }\n `;\n\n @property({ type: Boolean, reflect: true })\n visible: boolean = false;\n\n @property({ type: String })\n for: string | undefined;\n\n @property({ type: String })\n top: string | undefined;\n\n @property({ type: String })\n left: string | undefined;\n\n @property({ type: String })\n right: string | undefined;\n\n @property({ type: String })\n bottom: string | undefined;\n\n @property({ type: String })\n sizeref: string | undefined;\n\n @property({ type: Boolean })\n autofit: boolean = false;\n\n // if for is not set , use parent node\n get target() {\n const { parentNode } = this;\n const ownerRoot = this.getRootNode();\n let target;\n if (this.for) {\n // @ts-expect-error\n target = ownerRoot.querySelector(`#${this.for}`);\n } else {\n // use host if parent is root of shadow dom\n target =\n parentNode?.nodeType === Node.DOCUMENT_FRAGMENT_NODE\n ? // @ts-expect-error\n ownerRoot.host\n : parentNode;\n }\n return target;\n }\n\n render() {\n // @ts-expect-error\n this.renderRoot.host.classList.toggle('visible', this.visible);\n // language=html\n return html`\n {\n e.stopPropagation();\n }}\"\n >\n \n \n `;\n }\n\n firstUpdated() {\n this._addEventListener();\n }\n\n updated() {\n if (this.visible) {\n this.updatePosition();\n // this.updateComplete.then(() => {\n // const focusNode = this.renderRoot.getElementById('focus-node');\n // focusNode.focus();\n // });\n // console.log(focusNode); // TODO dom node change make the focus not working.\n // setTimeout(() => focusNode.focus(), 500); // workaround: focus not working in runtime\n }\n }\n\n // closeAfterMilliSeconds: auto close popup after N milliseconds\n show({ closeAfterMilliSeconds }) {\n if (closeAfterMilliSeconds) {\n setTimeout(() => this.hide(), closeAfterMilliSeconds);\n }\n this.visible = true;\n }\n\n hide() {\n this.visible = false;\n this.dispatchEvent(new CustomEvent('popup-hiding', {}));\n }\n\n updatePosition() {\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent\n // need set display not 'none'\n const { target } = this;\n const parentRect = {\n left: 0,\n top: 0,\n };\n const targetRect = target.getBoundingClientRect();\n\n const popupLeft =\n this.left && this._calculate(parentRect, targetRect, 'left');\n const popupTop = this.top && this._calculate(parentRect, targetRect, 'top');\n const popupRight =\n this.right && this._calculate(parentRect, targetRect, 'right');\n const popupBottom =\n this.bottom && this._calculate(parentRect, targetRect, 'bottom');\n\n this.style.left = popupLeft && `${popupLeft}px`;\n this.style.top = popupTop && `${popupTop}px`;\n\n this.style.right = popupRight && `${popupRight}px`;\n this.style.bottom = popupBottom && `${popupBottom}px`;\n }\n\n _calculate(parentRect, targetRect, position) {\n // position: left, right, top, bottom\n const positionVal = this[position]; // positionVal: 0, 1px, 22px /100%\n const isPercentage = endsWith(positionVal, '%');\n\n let targetPosition = targetRect[position] - parentRect[position];\n if (position === 'bottom' || position === 'right') {\n targetPosition *= -1;\n }\n\n let positionNum;\n if (isPercentage) {\n positionNum = Number(positionVal.slice(0, positionVal.length - 1));\n } else {\n positionNum = endsWith(positionVal, 'px')\n ? Number(positionVal.slice(0, positionVal.length - 2))\n : Number(positionVal);\n }\n const sizeNode =\n this.sizeref === 'popup' ? this.getBoundingClientRect() : targetRect;\n let popup;\n if (isPercentage) {\n popup =\n targetPosition +\n ((position === 'top' || position === 'bottom'\n ? sizeNode.height\n : sizeNode.width) *\n positionNum) /\n 100;\n } else {\n popup = targetPosition + positionNum;\n }\n\n return popup;\n }\n\n _addEventListener() {\n // click: this.events = {\n // visible: 'mousedown',\n // invisible: 'mouseup'\n // }\n\n // todo hover: this.events = {\n // visible: 'mouseover',\n // invisible: 'mouseout'\n // }\n\n window.addEventListener('resize', () => {\n this.requestUpdate();\n });\n\n window.addEventListener('mouseup', () => {\n this._clickOutsideHanlder();\n });\n }\n\n _clickOutsideHanlder() {\n this.visible && this.hide();\n }\n}\n","/* eslint-disable wc/no-self-class */\n/* eslint-disable max-classes-per-file */\nimport { UpdatingElement, html, css } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('ki-list-item')\nexport default class KiListItem extends UpdatingElement {\n // language=CSS\n static styles = css`\n ki-list-item {\n display: block;\n position: relative;\n padding: 12px;\n }\n\n ki-list-item:hover,\n ki-list-item:focus {\n color: var(--theme-color, #0056a0);\n background-color: #eeeeee;\n }\n\n ki-list-item.selected {\n background-color: var(--theme-color, #0056a0);\n color: var(--theme-text-color, white);\n }\n `;\n\n @property({ type: Boolean })\n selected: boolean = false;\n\n @property({ type: String })\n _indent: string | undefined;\n\n constructor() {\n super();\n this.addEventListener('keydown', e => {\n switch (e.key) {\n case 'Enter':\n this.dispatchEvent(new CustomEvent('click'));\n break;\n case 'ArrowUp':\n case 'ArrowLeft':\n // @ts-expect-error\n this._getPrev()?.focus();\n break;\n case 'ArrowDown':\n case 'ArrowRight':\n // @ts-expect-error\n this._getNext()?.focus();\n break;\n default:\n }\n });\n }\n\n get itemNode(): HTMLElement {\n return this;\n }\n\n _getNext() {\n let next = this.nextSibling;\n // @ts-expect-error\n while (!/^KI-LIST-ITEM/.test(next?.tagName)) {\n next = next?.nextSibling ?? null;\n }\n return next;\n }\n\n _getPrev() {\n let next = this.previousSibling;\n\n // @ts-expect-error\n while (!/^KI-LIST-ITEM/.test(next?.tagName)) {\n next = next?.previousSibling ?? null;\n }\n return next;\n }\n\n _updateSelectedState() {\n this.setAttribute('tabindex', this.selected ? '0' : '-1');\n this.classList.toggle('selected', !!this.selected);\n }\n\n connectedCallback() {\n // @ts-expect-error\n if (super.connectedCallback) super.connectedCallback();\n let level = 0;\n let node: HTMLElement | null = this;\n while (node && node.tagName !== 'KI-LIST') {\n if (/^KI-LIST/.test(node.tagName)) level += 1;\n node = node.parentElement;\n }\n this.itemNode.style[\n 'padding-left'\n ] = `calc( var(--ki-list-indent) * ${level})`;\n }\n\n createRenderRoot() {\n return this;\n }\n\n render() {\n return html` `;\n }\n}\n","/* eslint-disable wc/no-constructor-attributes */\n/* eslint-disable wc/no-self-class */\n/* eslint-disable max-classes-per-file */\nimport { html, css } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\nimport KiListItem from './ki-list-item';\n\n@customElement('ki-list-item-group')\nexport default class KiListItemGroup extends KiListItem {\n // language=CSS\n static styles = css`\n ki-list-item-group {\n display: block;\n position: relative;\n }\n ki-list-item-group .label {\n padding: 12px 0;\n }\n\n ki-list-item-group .label:hover,\n ki-list-item-group .label:focus {\n color: var(--theme-color, #0056a0);\n background-color: #eeeeee;\n }\n\n ki-list-item-group .children {\n display: block;\n overflow: hidden;\n height: auto;\n }\n\n ki-list-item-group.folded .children {\n max-height: 0px;\n }\n `;\n\n @property({ type: Boolean })\n folded: boolean = false;\n\n // @ts-expect-error\n get itemNode() {\n return this.querySelector('.label'); // TODO\n }\n\n constructor() {\n super();\n this.setAttribute('tabindex', '-1');\n }\n\n _updateSelectedState() {\n this.classList.toggle('folded', !!this.folded);\n }\n\n createRenderRoot() {\n return this;\n }\n\n render() {\n return html` `;\n }\n}\n","import { html, css, UpdatingElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement } from 'lit/decorators.js';\nimport './ki-list-item';\nimport './ki-list-item-group';\nimport PropertyDefaultValue from '../../common/PropertyDefaultValue';\nimport Mix from '../../common/Mix';\n\n// @ts-expect-error\n@customElement('ki-list')\nexport default class KiList extends Mix(UpdatingElement, PropertyDefaultValue) {\n // language=CSS\n static styles = css`\n ki-list {\n display: block;\n --ki-list-indent: 12px;\n }\n `;\n\n createRenderRoot() {\n return this;\n }\n\n render() {\n return html` `;\n }\n}\n","import { css, html, LitElement, TemplateResult } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('ki-checkbox')\nexport default class KiCheckBox extends LitElement {\n // language=CSS\n static styles = css`\n :host {\n outline: none;\n display: inline-block;\n position: relative;\n }\n\n .ki-checkbox {\n display: block;\n cursor: pointer;\n user-select: none;\n color: rgba(128, 128, 128, 1);\n }\n\n .ki-checkbox input {\n position: absolute;\n opacity: 0;\n cursor: pointer;\n }\n\n .ki-checkbox input:checked ~ svg {\n font-size: inherit;\n }\n\n .ki-checkbox input:checked ~ svg {\n fill: var(--theme-color, #0056a0);\n }\n .ki-checkbox input:indeterminate ~ svg {\n fill: var(--theme-color, #0056a0);\n }\n\n .ki-checkbox input:disabled ~ svg {\n color: lightgray;\n cursor: not-allowed;\n }\n svg.icon {\n width: 18px;\n fill: var(--ki-checkbox-box-color, gray);\n cursor: pointer;\n }\n `;\n\n @property({ type: Boolean })\n checked = false;\n\n @property({ type: Boolean })\n disabled = false;\n\n @property({ type: Boolean })\n indeterminate = false;\n\n @property({ type: String })\n value = '';\n\n interediateImage: TemplateResult = html`\n \n `;\n\n checkedImage: TemplateResult = html`\n \n `;\n\n uncheckedImage: TemplateResult = html`\n \n `;\n\n render() {\n let square = this.checked ? this.checkedImage : this.uncheckedImage;\n square = this.indeterminate ? this.interediateImage : square;\n\n return html` `;\n }\n\n _handleClick() {\n this.checked = !this.checked;\n this.indeterminate = false;\n }\n\n _handleChange() {\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: {\n value: this.value,\n checked: this.checked,\n },\n }),\n );\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport '../ki-icon/ki-icon';\nimport { html, css } from 'lit';\nimport '../ki-popup/ki-popup';\nimport '../ki-list/ki-list';\nimport '../ki-checkbox/ki-checkbox';\n/* eslint-disable-next-line import/extensions */\nimport { repeat } from 'lit/directives/repeat.js';\nimport debounce from 'lodash-es/debounce';\n\n/*\n * col:{\n * hideAble: Boolean,\n * hide: Boolean\n * }\n *\n *\n * */\nexport default function ColumnHider(clz) {\n return class extends clz {\n // language=CSS\n static styles = css`\n .header-cell-hider {\n width: 50px;\n text-align: center;\n cursor: pointer;\n color: gray;\n }\n .header-cell-hider:hover {\n color: #4a4a49;\n }\n\n .hider.active {\n padding: 2px;\n background-color: var(--theme-color, #0056a0);\n color: white;\n fill: white;\n border-radius: 15px;\n }\n\n ki-popup {\n right: 10px;\n text-align: left;\n bottom: 0;\n /*temp solution*/\n }\n\n .header-cell-hider ki-popup {\n padding: 0;\n overflow: clip;\n display: flex;\n }\n .header-cell-hider ki-popup::part(focus-node) {\n display: flex;\n flex: 1;\n }\n\n ki-list {\n flex: 1;\n overflow: auto;\n min-width: 200px;\n /* adjusting for scroll bar */\n padding-right: 15px;\n }\n ki-list-item {\n padding: 5px;\n display: flex;\n align-items: center;\n }\n ki-checkbox {\n padding: 10px;\n }\n `;\n\n constructor() {\n super();\n this.__hiderOptionVisible = false;\n this._hiddenColumns = null;\n }\n\n static get properties() {\n return {\n hiddenColumns: { type: Array },\n __hiderOptionVisible: {\n type: Boolean,\n },\n };\n }\n\n get hiddenColumns() {\n return (\n this._hiddenColumns ||\n this.columns\n ?.filter(item => item.hideAble && (item.hide || item.hidden))\n .map(i => i.field) ||\n []\n );\n }\n\n // TODO: More generic solution? e.g. set target element from outside\n _togglePopupColumnHider() {\n this.dispatchEvent(\n new CustomEvent('toggledPopupColumnHider', {\n detail: {\n visible: this.__hiderOptionVisible,\n },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n // Callum Ramage:\n // This avoids a race condition between the ki-popup hiding from an outside click and the header icon being clicked.\n // Both trigger at the same time with the ki-popup triggering first.\n setHiderVisible = debounce(visible => {\n this.__hiderOptionVisible = visible;\n }, 100);\n\n get renderingColumns() {\n if (super.renderingColumns.filter(item => item.hideAble).length > 0) {\n return super.renderingColumns\n .filter(col => this.hiddenColumns.indexOf(col.field) < 0)\n .concat([\n {\n field: '__options',\n renderHeaderCell: () => {\n const togglePopup = () => {\n this.setHiderVisible(!this.__hiderOptionVisible);\n this._togglePopupColumnHider();\n };\n\n return html`\n
\n
\n \n
\n {\n this.setHiderVisible(false);\n this._togglePopupColumnHider();\n }}\n >\n ${this.__renderHiderColumnOptions()}\n \n
\n `;\n },\n },\n ]);\n }\n return super.renderingColumns;\n }\n\n __renderHiderColumnOption(item) {\n return html`\n \n \n ${item.title || item.label}\n \n `;\n }\n\n __renderHiderColumnOptions() {\n const options = this.columns.filter(item => item.hideAble);\n const keyFn = op => op.field;\n return html`\n ${repeat(\n options,\n keyFn,\n this.__renderHiderColumnOption.bind(this),\n )}\n `;\n }\n\n get __hiderOptionCheckBox() {\n return this.renderRoot.querySelectorAll('ki-checkbox.hiderBox');\n }\n\n _toggleHiderOption() {\n const list: Array = [];\n this.__hiderOptionCheckBox.forEach(c => {\n c.checked || list.push(c.name);\n });\n this._hiddenColumns = list;\n this.requestUpdate();\n }\n };\n}\n","/* eslint-disable default-param-last */\n/* eslint-disable max-classes-per-file */\nimport { html } from 'lit';\n/* eslint-disable-next-line import/extensions */\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport dayjs from '../../common/dayjsext';\nimport { template } from '../../common/util';\nimport { getFromItem } from './GetField';\n\n// TODO temp\n// https://jira-development.kisters.de/browse/WEBCP-48\n// https://jira-development.kisters.de/browse/WEBCP-65\n// const numberFormatter = new Intl.NumberFormat();\n\nexport default function ColumnFormatter(clz) {\n return class extends clz {\n // build in formatters , also can extend with subclass.\n static formatters = {\n // TODO remove cell wrapper, after find proper way to style columns?\n dateTime(val, opt = { options: { dayjsFormat: 'L LT' } }, col) {\n const dayjsFormat = opt?.options?.dayjsFormat || 'L LT';\n return html`\n
\n ${val ? dayjs(val).tz().format(dayjsFormat) : ''}\n
\n `;\n },\n\n html(val, _opt, col) {\n return html`\n
\n ${val ? unsafeHTML(val.replace('./html', './public/html')) : ''}\n
\n `;\n },\n date(val, opt: { css: string | undefined } = { css: undefined }) {\n return html`\n
\n ${val ? dayjs(val).tz().format('L') : ''}\n
\n `;\n },\n wiskinumber(\n val,\n opt: {\n options: any;\n locale: string | undefined;\n } = { options: undefined, locale: undefined },\n col,\n item,\n ) {\n const precisiontable = {\n 'Deci,0,0,0': { minimumFractionDigits: 0, maximumFractionDigits: 0 },\n 'Deci,1,0,0': { minimumFractionDigits: 1, maximumFractionDigits: 1 },\n 'Deci,2,0,0': { minimumFractionDigits: 2, maximumFractionDigits: 2 },\n 'Deci,3,0,0': { minimumFractionDigits: 3, maximumFractionDigits: 3 },\n };\n const precision = item.ts_precision || 'Deci,2,0,0';\n const options: any = precisiontable[precision] || opt.options;\n\n if (typeof val === 'string') {\n val = val.replace(',', '.').replace(/[^\\d.-]/g, '');\n }\n\n const numberFormatter = new Intl.NumberFormat(opt.locale || 'en', {\n ...options,\n });\n const formatted = numberFormatter.format(val);\n return html`\n
\n ${col.prefix ? template(col.prefix, item) : ''}\n ${val === undefined ||\n val === null ||\n val === '' ||\n Number.isNaN(val)\n ? ''\n : formatted}\n ${val && col.suffix ? template(col.suffix, item) : ''}\n
\n `;\n },\n number(\n val,\n opt: {\n options: any;\n locale: string | undefined;\n } = { options: undefined, locale: undefined },\n col,\n item,\n ) {\n const numberFormatter = new Intl.NumberFormat(opt.locale || 'en', {\n ...opt.options,\n });\n const formatted = val === 0 ? val : numberFormatter.format(val);\n return html`\n
\n ${col.prefix ? template(col.prefix, item) : ''}\n ${val === undefined ||\n val === null ||\n val === '' ||\n Number.isNaN(val)\n ? ''\n : formatted}\n ${val && col.suffix ? template(col.suffix, item) : ''}\n
\n `;\n },\n textnumber(\n val,\n opt: {\n options: any;\n locale: string | undefined;\n } = { options: undefined, locale: undefined },\n col,\n item,\n ) {\n val = parseFloat(val && val.toString().replace(',', '.'));\n const numberFormatter = new Intl.NumberFormat(opt.locale || 'en', {\n ...opt.options,\n });\n const formatted = val === 0 ? val : numberFormatter.format(val);\n return html`\n
\n ${col.prefix ? template(col.prefix, item) : ''}\n ${val === undefined ||\n val === null ||\n val === '' ||\n Number.isNaN(val)\n ? ''\n : formatted}\n ${val && col.suffix ? template(col.suffix, item) : ''}\n
\n `;\n },\n };\n\n static get properties() {\n return {\n formatters: { type: Object },\n };\n }\n\n get renderingColumns() {\n // @ts-expect-error\n const formatters = { ...this.constructor.formatters, ...this.formatters };\n return super.renderingColumns?.map(c => {\n const col = { ...c };\n if (!col.renderCell) {\n if (col.format) {\n let { format } = col;\n if (typeof format === 'string') {\n format = {\n type: format,\n };\n }\n const formatter = formatters[format.type];\n if (formatter) {\n col.renderCell = item =>\n (Array.isArray(col.field) ? col.field : [col.field]).map(\n field =>\n formatter(\n getFromItem(item, field),\n { ...format, ...{ locale: this.i18n.language } },\n col,\n item,\n ),\n );\n }\n }\n }\n return col;\n });\n }\n };\n}\n","// extension for ki-table\nimport { html, css } from 'lit';\n/* eslint-disable-next-line import/extensions */\nimport { repeat } from 'lit/directives/repeat.js';\nimport { getQueryObject } from '../../decorators/query';\nimport '../ki-checkbox/ki-checkbox';\n\nexport default function Selection(clz) {\n // TODO multi / single ?\n\n return class extends clz {\n static styles = css`\n .body .row.selected,\n .body .row.selected:hover {\n background: var(--theme-color, #0056a0);\n color: var(--theme-text-color, white);\n }\n .selection-col {\n font-size: 22px;\n vertical-align: middle;\n width: 40px;\n }\n .header .row {\n line-height: 25px;\n }\n `;\n\n static get properties() {\n return {\n multiselection: {\n type: Boolean,\n },\n selection: {\n type: Array,\n },\n };\n }\n\n set selection(val) {\n this.__selectionSet = new Set(val);\n this.requestUpdate();\n }\n\n constructor() {\n super();\n this.selectionActive = true;\n this.__selectionSet = new Set();\n }\n\n get __selectAllCheckbox() {\n return getQueryObject(this, '#select-all-checkbox');\n }\n\n _isSelected(row) {\n return this.__selectionSet.has(row[this.idproperty]);\n }\n\n _addSelection(row) {\n this.__selectionSet.add(row[this.idproperty]);\n this.requestUpdate();\n this.__fireSelection();\n }\n\n _toggleSelection(row) {\n if (this.__selectionSet.has(row[this.idproperty])) {\n this.__selectionSet.delete(row[this.idproperty]);\n } else {\n if (!this.multiselection) {\n this.__selectionSet.clear();\n }\n this.__selectionSet.add(row[this.idproperty]);\n }\n this.requestUpdate();\n this.__fireSelection();\n }\n\n _clearSelection() {\n this.__selectionSet.clear();\n this.requestUpdate();\n this.__fireSelection();\n }\n\n __fireSelection() {\n this.dispatchEvent(\n new CustomEvent('selection', {\n bubbles: true,\n composed: true,\n detail: { selection: Array.from(this.__selectionSet.values()) },\n }),\n );\n }\n\n _selectAll() {\n const flag = this.__selectAllCheckbox.checked;\n if (flag) {\n this.selection = this.data.map(d => d[this.idproperty]);\n } else {\n this.selection = [];\n }\n this.__fireSelection();\n }\n\n // TODO use get renderingColumns;\n\n _renderHeader() {\n if (!this.selectionActive) return super._renderHeader();\n\n return html`\n
\n
\n
\n
\n 0}\"\n @change=\"${() => {\n this._selectAll();\n }}\"\n >\n
\n
\n ${repeat(\n this.renderingColumns,\n (col: { field: any }) => col.field,\n col => this._renderHeaderCell(col),\n )}\n
\n
\n `;\n }\n\n renderRow(item) {\n if (!this.selectionActive) return super.renderRow(item);\n // TODO consider\n // language=html\n return html`\n this.mouseenter(e, item)}\"\n @mouseleave=\"${e => this.mouseleave(e, item)}\"\n @click=\"${() => {\n this._onRowClick(item);\n }}\"\n >\n
e.stopPropagation()}\">\n {\n this._toggleSelection(item);\n }}\"\n >\n
\n ${this.renderingColumns.map(col => this._renderCell(col, item))}\n \n `;\n }\n };\n}\n","/* eslint-disable default-param-last */\nimport get from 'lodash-es/get';\n\nconst escapeCsv = (delimiter, text) => {\n if (text) {\n return `${text}`.includes(delimiter) ? `\"${text}\"` : text;\n }\n return '';\n};\n\nexport default function Export(clz) {\n return class extends clz {\n toCSV(delimiter = ';', all = true, exportcolumns) {\n let result = '#';\n let columns = all ? this.columns : this.renderingColumns;\n\n if (exportcolumns) {\n columns = columns.filter(col => exportcolumns.includes(col.field));\n }\n\n columns.forEach((col, i) => {\n result += `${i === 0 ? '' : delimiter}${escapeCsv(\n delimiter,\n col.label,\n )}`;\n });\n result += '\\r\\n';\n this.data.forEach(item => {\n columns.forEach((col, i) => {\n result += i === 0 ? '' : delimiter;\n let displayValue = '';\n if (col.renderCell) {\n const renderedCell = col.renderCell(item);\n const index = col.renderCellIndex ?? 0;\n if (\n renderedCell.values &&\n (renderedCell.values.length ?? 0) > index\n ) {\n // eslint-disable-next-line prefer-destructuring\n displayValue = renderedCell.values[index];\n } else {\n displayValue = renderedCell;\n }\n } else if (col.field === '__tag') {\n displayValue = get(item, '__tag_label');\n } else {\n displayValue = get(item, col.field);\n }\n result += escapeCsv(delimiter, displayValue);\n });\n result += '\\r\\n';\n });\n return result;\n }\n };\n}\n","import { customElement } from 'lit/decorators.js';\nimport { i18nMixin } from '../../decorators/i18n';\nimport nls from '../../locales/index';\nimport BaseTable from './BaseTable';\nimport PromiseData from './PromiseData';\nimport LazyRendering from './LazyRendering';\nimport SortAble from './SortAble';\nimport Mix from '../../common/Mix';\nimport ColumnHider from './ColumnHider';\nimport ColumnFormatter from './ColumnFormatter';\nimport Selection from './Selection';\nimport Export from './Export';\n\n// for inherit setter getter need define both\n// @ts-expect-error\n@customElement('ki-table')\nexport default class KiTable extends Mix(\n BaseTable,\n [i18nMixin, { nls }],\n LazyRendering,\n Selection,\n PromiseData,\n SortAble,\n ColumnHider,\n ColumnFormatter,\n Export,\n) {}\n","import { css, html, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement } from 'lit/decorators.js';\n\nimport Mix from '../../common/Mix';\nimport { responsiveMixin } from '../../decorators/responsive';\n// TODO consider use sub element?\n\n// @ts-expect-error\n@customElement('ki-switcher')\nexport default class KiSwitcher extends Mix(LitElement, responsiveMixin) {\n static styles = [\n css`\n :host {\n display: flex;\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n border-radius: 30px;\n font-size: 0;\n overflow: visible;\n }\n .tab {\n background: white;\n color: var(--theme-text-color-primary, #1d1d1b);\n fill: var(--theme-text-color-primary, #1d1d1b);\n display: flex;\n padding: 8px 10px;\n min-width: 40px;\n text-align: center;\n cursor: pointer;\n user-select: none;\n position: relative;\n font-size: 14px;\n line-height: 24px;\n align-items: center;\n justify-content: center;\n }\n\n ki-icon {\n margin-right: 5px;\n font-size: 1.3em;\n }\n .tab.selected {\n color: #ffffff;\n fill: #ffffff;\n background: var(--theme-color-primary, #0056a0);\n }\n\n :host.round .tab.last {\n border-bottom-right-radius: 30px;\n border-top-right-radius: 30px;\n }\n :host(.round).tab.first {\n border-bottom-left-radius: 30px;\n border-top-left-radius: 30px;\n }\n :host(.sm-screen) span.label {\n display: none;\n }\n :host(.sm-screen) ki-icon {\n font-size: 1.5em;\n margin-right: 0;\n }\n\n :host(.sm-screen) .tab {\n min-width: initial;\n padding: 9px 10px;\n }\n .badgesContainer {\n position: absolute;\n top: 0;\n display: flex;\n transform: translateY(130%);\n right: 0;\n }\n .badge {\n display: block;\n position: relative;\n outline: none;\n z-index: 999;\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n color: white;\n padding: 0 10px;\n border-radius: 30px;\n font-size: 0.8em;\n }\n `,\n ];\n\n static get properties() {\n return {\n options: { type: Array },\n value: { type: String },\n };\n }\n\n get selected() {\n const preselected = this.options.filter(opt => opt.selected);\n return preselected.length ? preselected[0].value : this.options[0].value;\n }\n\n render() {\n this.value = this.value || this.selected;\n // language=html\n return html`\n ${this.options.map(\n (option, i) => html`\n {\n e.key === 'Enter' && this.switchTo(option.value);\n }}\"\n @click=\"${() => {\n this.switchTo(option.value);\n }}\"\n >\n
\n ${option?.badges?.map(\n badge =>\n html`\n ${badge.count}\n
`,\n )}\n \n ${option.icon\n ? html``\n : ''}\n ${option.label}\n \n `,\n )}\n `;\n }\n\n switchTo(value) {\n if (this.value !== value) {\n this.value = value;\n this.dispatchEvent(new CustomEvent('changed', { detail: { value } }));\n }\n }\n}\n","import { LitElement, html, css } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('ki-stack')\nexport default class KiStack extends LitElement {\n // language=CSS\n static styles = css`\n :host {\n display: block;\n position: relative;\n overflow: hidden;\n height: 100%;\n width: 100%;\n }\n\n .stack-container {\n height: 100%;\n width: 100%;\n display: block;\n overflow: hidden;\n }\n\n .stack-container > ::slotted(*[key]) {\n position: absolute;\n top: 0;\n left: 0;\n display: none;\n height: 100%;\n width: 100%;\n }\n\n .stack-container > ::slotted(.selected) {\n display: block;\n }\n `;\n\n @property({ type: String })\n selected: string | null | undefined = this.children[0].getAttribute('key');\n\n history: Array = [];\n\n update(changedProperties) {\n super.update(changedProperties);\n if (changedProperties.has('selected')) {\n this._select(this.selected);\n }\n }\n\n render() {\n return html`
`;\n }\n\n /* @private\n * */\n _select(key) {\n let selectedChild;\n for (const c of this.children) {\n const s = c.getAttribute('key') === key;\n c.classList.toggle('selected', s);\n if (s) {\n selectedChild = c;\n }\n }\n if (!selectedChild) {\n return;\n }\n if (!selectedChild.getAttribute('skipHistory')) {\n this.history.push(key);\n }\n if (selectedChild.onShow) {\n selectedChild.onShow(); // TODO need consider\n }\n }\n\n back() {\n this.selected = this.history.pop();\n }\n}\n","import { css, html, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\nimport debounce from 'lodash-es/debounce';\nimport Mix from '../../common/Mix';\nimport '@ui5/webcomponents/dist/Input.js';\nimport '../ki-icon/ki-icon';\nimport nls from '../../locales/index';\nimport { i18nMixin } from '../../decorators/i18n';\n\n// @ts-expect-error\n@customElement('ki-searchbox')\nexport default class KiSearchbox extends Mix(LitElement, [i18nMixin, { nls }]) {\n static styles = [\n css`\n :host {\n display: flex;\n flex-wrap: nowrap;\n flex-direction: row;\n }\n\n .hide {\n display: none;\n }\n `,\n ];\n\n @property({ type: String })\n value = '';\n\n @property({ type: String })\n placeholder = '';\n\n @property({ type: Array })\n fieldList = [];\n\n constructor() {\n super();\n this.emitSearch = debounce(() => {\n this.dispatchEvent(\n new CustomEvent('search', { detail: { value: this.value } }),\n );\n }, 200);\n }\n\n render() {\n // language=html\n return html`\n \n \n\n \n `;\n }\n\n _handleChanged() {\n const input = this.renderRoot.querySelector('#input');\n this.value = input.value;\n this.dispatchEvent(\n new CustomEvent('change', { detail: { value: this.value } }),\n );\n this.emitSearch(); // debounced\n }\n\n resetValue() {\n this.value = '';\n this.renderRoot.querySelector('#input').value = '';\n this._handleChanged();\n }\n}\n","const SearchSytaxQueryParser =\n/*\n * Generated by PEG.js 0.10.0.\n *\n * http://pegjs.org/\n */\n\n(function() {\n\nfunction peg$subclass(child, parent) {\n function ctor() { this.constructor = child; }\n ctor.prototype = parent.prototype;\n child.prototype = new ctor();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n this.message = message;\n this.expected = expected;\n this.found = found;\n this.location = location;\n this.name = \"SyntaxError\";\n\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(this, peg$SyntaxError);\n }\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n const DESCRIBE_EXPECTATION_FNS = {\n literal(expectation) {\n return `\"${ literalEscape(expectation.text) }\"`;\n },\n\n \"class\": function(expectation) {\n let escapedParts = \"\";\n let i;\n\n for (i = 0; i < expectation.parts.length; i++) {\n escapedParts += expectation.parts[i] instanceof Array\n ? `${classEscape(expectation.parts[i][0]) }-${ classEscape(expectation.parts[i][1])}`\n : classEscape(expectation.parts[i]);\n }\n\n return `[${ expectation.inverted ? \"^\" : \"\" }${escapedParts }]`;\n },\n\n any(expectation) {\n return \"any character\";\n },\n\n end(expectation) {\n return \"end of input\";\n },\n\n other(expectation) {\n return expectation.description;\n }\n };\n\n function hex(ch) {\n return ch.charCodeAt(0).toString(16).toUpperCase();\n }\n\n function literalEscape(s) {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\0/g, '\\\\0')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/[\\x00-\\x0F]/g, (ch) => `\\\\x0${ hex(ch)}`)\n .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, (ch) => `\\\\x${ hex(ch)}`);\n }\n\n function classEscape(s) {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\]/g, '\\\\]')\n .replace(/\\^/g, '\\\\^')\n .replace(/-/g, '\\\\-')\n .replace(/\\0/g, '\\\\0')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/[\\x00-\\x0F]/g, (ch) => `\\\\x0${ hex(ch)}`)\n .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, (ch) => `\\\\x${ hex(ch)}`);\n }\n\n function describeExpectation(expectation) {\n return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n }\n\n function describeExpected(expected) {\n const descriptions = new Array(expected.length);\n let i; let j;\n\n for (i = 0; i < expected.length; i++) {\n descriptions[i] = describeExpectation(expected[i]);\n }\n\n descriptions.sort();\n\n if (descriptions.length > 0) {\n for (i = 1, j = 1; i < descriptions.length; i++) {\n if (descriptions[i - 1] !== descriptions[i]) {\n descriptions[j] = descriptions[i];\n j++;\n }\n }\n descriptions.length = j;\n }\n\n switch (descriptions.length) {\n case 1:\n return descriptions[0];\n\n case 2:\n return `${descriptions[0] } or ${ descriptions[1]}`;\n\n default:\n return `${descriptions.slice(0, -1).join(\", \")\n }, or ${\n descriptions[descriptions.length - 1]}`;\n }\n }\n\n function describeFound(found) {\n return found ? `\"${ literalEscape(found) }\"` : \"end of input\";\n }\n\n return `Expected ${ describeExpected(expected) } but ${ describeFound(found) } found.`;\n};\n\nfunction peg$parse(input, options) {\n options = options !== void 0 ? options : {};\n\n const peg$FAILED = {};\n\n const peg$startRuleFunctions = { Start: peg$parseStart };\n let peg$startRuleFunction = peg$parseStart;\n\n const peg$c0 = function(expr) {return expr};\n const peg$c1 = \"(\";\n const peg$c2 = peg$literalExpectation(\"(\", false);\n const peg$c3 = \")\";\n const peg$c4 = peg$literalExpectation(\")\", false);\n const peg$c5 = function(head, tail) {return buildLogicalExpression (head, tail)};\n const peg$c6 = function(key, operator, value) { return { type: 'field' ,operator, key, value } };\n const peg$c7 = peg$otherExpectation(\"field name\");\n const peg$c8 = /^[A-Za-z1-9_$]/;\n const peg$c9 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"1\", \"9\"], \"_\", \"$\"], false, false);\n const peg$c10 = function(w) {\n \tconst key=w.join('');\n if(!options.fields || options.fields.indexOf(key) >= 0){\n \treturn key;\n }\n peg$currPos -= key.length\n \treturn peg$FAILED // TODO hacking way, try use plugin\n \t\n };\n const peg$c11 = /^[A-Za-z0-9_$]/;\n const peg$c12 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\", \"$\"], false, false);\n const peg$c13 = function(w) {return w.join('')};\n const peg$c14 = function(w) {return w.value };\n const peg$c15 = \"[\";\n const peg$c16 = peg$literalExpectation(\"[\", false);\n const peg$c17 = \",\";\n const peg$c18 = peg$literalExpectation(\",\", false);\n const peg$c19 = \"]\";\n const peg$c20 = peg$literalExpectation(\"]\", false);\n const peg$c21 = function(head, tail) { return buildArray(head,tail) };\n const peg$c22 = peg$otherExpectation(\"whitespace\");\n const peg$c23 = /^[ \\t\\n\\r]/;\n const peg$c24 = peg$classExpectation([\" \", \"\\t\", \"\\n\", \"\\r\"], false, false);\n const peg$c25 = peg$otherExpectation(\"space\");\n const peg$c26 = /^[ ]/;\n const peg$c27 = peg$classExpectation([\" \"], false, false);\n const peg$c28 = \"=\";\n const peg$c29 = peg$literalExpectation(\"=\", false);\n const peg$c30 = \"!=\";\n const peg$c31 = peg$literalExpectation(\"!=\", false);\n const peg$c32 = \">=\";\n const peg$c33 = peg$literalExpectation(\">=\", false);\n const peg$c34 = \"<=\";\n const peg$c35 = peg$literalExpectation(\"<=\", false);\n const peg$c36 = \"<\";\n const peg$c37 = peg$literalExpectation(\"<\", false);\n const peg$c38 = \">\";\n const peg$c39 = peg$literalExpectation(\">\", false);\n const peg$c40 = \"IN\";\n const peg$c41 = peg$literalExpectation(\"IN\", false);\n const peg$c42 = \"AND\";\n const peg$c43 = peg$literalExpectation(\"AND\", false);\n const peg$c44 = \"OR\";\n const peg$c45 = peg$literalExpectation(\"OR\", false);\n const peg$c46 = peg$otherExpectation(\"string\");\n const peg$c47 = \"\\\"\";\n const peg$c48 = peg$literalExpectation(\"\\\"\", false);\n const peg$c49 = function(chars) {\n return { type: \"Literal\", value: chars.join(\"\") };\n };\n const peg$c50 = \"\\\\\";\n const peg$c51 = peg$literalExpectation(\"\\\\\", false);\n const peg$c52 = function() { return text(); };\n const peg$c53 = function(sequence) { return sequence; };\n const peg$c54 = \"0\";\n const peg$c55 = peg$literalExpectation(\"0\", false);\n const peg$c56 = function() { return \"\\0\"; };\n const peg$c57 = \"x\";\n const peg$c58 = peg$literalExpectation(\"x\", false);\n const peg$c59 = function(digits) {\n return String.fromCharCode(parseInt(digits, 16));\n };\n const peg$c60 = \"u\";\n const peg$c61 = peg$literalExpectation(\"u\", false);\n const peg$c62 = /^[0-9]/;\n const peg$c63 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n const peg$c64 = peg$anyExpectation();\n const peg$c65 = /^[0-9a-f]/i;\n const peg$c66 = peg$classExpectation([[\"0\", \"9\"], [\"a\", \"f\"]], false, true);\n const peg$c67 = \"'\";\n const peg$c68 = peg$literalExpectation(\"'\", false);\n const peg$c69 = \"b\";\n const peg$c70 = peg$literalExpectation(\"b\", false);\n const peg$c71 = function() { return \"\\b\"; };\n const peg$c72 = \"f\";\n const peg$c73 = peg$literalExpectation(\"f\", false);\n const peg$c74 = function() { return \"\\f\"; };\n const peg$c75 = \"n\";\n const peg$c76 = peg$literalExpectation(\"n\", false);\n const peg$c77 = function() { return \"\\n\"; };\n const peg$c78 = \"r\";\n const peg$c79 = peg$literalExpectation(\"r\", false);\n const peg$c80 = function() { return \"\\r\"; };\n const peg$c81 = \"t\";\n const peg$c82 = peg$literalExpectation(\"t\", false);\n const peg$c83 = function() { return \"\\t\"; };\n const peg$c84 = \"v\";\n const peg$c85 = peg$literalExpectation(\"v\", false);\n const peg$c86 = function() { return \"\\v\"; };\n const peg$c87 = /^[\\n\\r\\u2028\\u2029]/;\n const peg$c88 = peg$classExpectation([\"\\n\", \"\\r\", \"\\u2028\", \"\\u2029\"], false, false);\n\n var peg$currPos = 0;\n let peg$savedPos = 0;\n const peg$posDetailsCache = [{ line: 1, column: 1 }];\n let peg$maxFailPos = 0;\n let peg$maxFailExpected = [];\n let peg$silentFails = 0;\n\n let peg$result;\n\n if (\"startRule\" in options) {\n if (!(options.startRule in peg$startRuleFunctions)) {\n throw new Error(`Can't start parsing from rule \"${ options.startRule }\".`);\n }\n\n peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n }\n\n function text() {\n return input.substring(peg$savedPos, peg$currPos);\n }\n\n function location() {\n return peg$computeLocation(peg$savedPos, peg$currPos);\n }\n\n function expected(description, location) {\n location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)\n\n throw peg$buildStructuredError(\n [peg$otherExpectation(description)],\n input.substring(peg$savedPos, peg$currPos),\n location\n );\n }\n\n function error(message, location) {\n location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)\n\n throw peg$buildSimpleError(message, location);\n }\n\n function peg$literalExpectation(text, ignoreCase) {\n return { type: \"literal\", text, ignoreCase };\n }\n\n function peg$classExpectation(parts, inverted, ignoreCase) {\n return { type: \"class\", parts, inverted, ignoreCase };\n }\n\n function peg$anyExpectation() {\n return { type: \"any\" };\n }\n\n function peg$endExpectation() {\n return { type: \"end\" };\n }\n\n function peg$otherExpectation(description) {\n return { type: \"other\", description };\n }\n\n function peg$computePosDetails(pos) {\n let details = peg$posDetailsCache[pos]; let p;\n\n if (details) {\n return details;\n } \n p = pos - 1;\n while (!peg$posDetailsCache[p]) {\n p--;\n }\n\n details = peg$posDetailsCache[p];\n details = {\n line: details.line,\n column: details.column\n };\n\n while (p < pos) {\n if (input.charCodeAt(p) === 10) {\n details.line++;\n details.column = 1;\n } else {\n details.column++;\n }\n\n p++;\n }\n\n peg$posDetailsCache[pos] = details;\n return details;\n \n }\n\n function peg$computeLocation(startPos, endPos) {\n const startPosDetails = peg$computePosDetails(startPos);\n const endPosDetails = peg$computePosDetails(endPos);\n\n return {\n start: {\n offset: startPos,\n line: startPosDetails.line,\n column: startPosDetails.column\n },\n end: {\n offset: endPos,\n line: endPosDetails.line,\n column: endPosDetails.column\n }\n };\n }\n\n function peg$fail(expected) {\n if (peg$currPos < peg$maxFailPos) { return; }\n\n if (peg$currPos > peg$maxFailPos) {\n peg$maxFailPos = peg$currPos;\n peg$maxFailExpected = [];\n }\n\n peg$maxFailExpected.push(expected);\n }\n\n function peg$buildSimpleError(message, location) {\n return new peg$SyntaxError(message, null, null, location);\n }\n\n function peg$buildStructuredError(expected, found, location) {\n return new peg$SyntaxError(\n peg$SyntaxError.buildMessage(expected, found),\n expected,\n found,\n location\n );\n }\n\n function peg$parseStart() {\n let s0; let s1;\n\n s0 = peg$currPos;\n s1 = peg$parseLogicExpr();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c0(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parseExpr() {\n let s0; let s1; let s2; let s3; let s4; let s5;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 40) {\n s1 = peg$c1;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c2); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parsesp();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseLogicExpr();\n if (s3 !== peg$FAILED) {\n s4 = peg$parsesp();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 41) {\n s5 = peg$c3;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c4); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c0(s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$parseLogicExpr();\n }\n\n return s0;\n }\n\n function peg$parseLogicExpr() {\n let s0; let s1; let s2; let s3; let s4; let s5; let s6; let s7;\n\n s0 = peg$currPos;\n s1 = peg$parseFieldExpr();\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parseLopr();\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseFieldExpr();\n if (s7 === peg$FAILED) {\n s7 = peg$parseExpr();\n }\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$currPos;\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parseLopr();\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseFieldExpr();\n if (s7 === peg$FAILED) {\n s7 = peg$parseExpr();\n }\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c5(s1, s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseFieldExpr() {\n let s0; let s1; let s2; let s3; let s4; let s5;\n\n s0 = peg$currPos;\n s1 = peg$parseKey();\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseCopr();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n s5 = peg$parseValue();\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c6(s1, s3, s5);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseKey() {\n let s0; let s1; let s2;\n\n peg$silentFails++;\n s0 = peg$currPos;\n s1 = [];\n if (peg$c8.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c9); }\n }\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n if (peg$c8.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c9); }\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c10(s1);\n }\n s0 = s1;\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c7); }\n }\n\n return s0;\n }\n\n function peg$parseValue() {\n let s0; let s1; let s2; let s3; let s4; let s5; let s6; let s7; let s8; let s9;\n\n s0 = peg$currPos;\n s1 = [];\n if (peg$c11.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c12); }\n }\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n if (peg$c11.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c12); }\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c13(s1);\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = peg$parseStringLiteral();\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c14(s1);\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 91) {\n s1 = peg$c15;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c16); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parsesp();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseValue();\n if (s3 !== peg$FAILED) {\n s4 = [];\n s5 = peg$currPos;\n s6 = peg$parsesp();\n if (s6 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s7 = peg$c17;\n peg$currPos++;\n } else {\n s7 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c18); }\n }\n if (s7 !== peg$FAILED) {\n s8 = peg$parsesp();\n if (s8 !== peg$FAILED) {\n s9 = peg$parseValue();\n if (s9 !== peg$FAILED) {\n s6 = [s6, s7, s8, s9];\n s5 = s6;\n } else {\n peg$currPos = s5;\n s5 = peg$FAILED;\n }\n } else {\n peg$currPos = s5;\n s5 = peg$FAILED;\n }\n } else {\n peg$currPos = s5;\n s5 = peg$FAILED;\n }\n } else {\n peg$currPos = s5;\n s5 = peg$FAILED;\n }\n while (s5 !== peg$FAILED) {\n s4.push(s5);\n s5 = peg$currPos;\n s6 = peg$parsesp();\n if (s6 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s7 = peg$c17;\n peg$currPos++;\n } else {\n s7 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c18); }\n }\n if (s7 !== peg$FAILED) {\n s8 = peg$parsesp();\n if (s8 !== peg$FAILED) {\n s9 = peg$parseValue();\n if (s9 !== peg$FAILED) {\n s6 = [s6, s7, s8, s9];\n s5 = s6;\n } else {\n peg$currPos = s5;\n s5 = peg$FAILED;\n }\n } else {\n peg$currPos = s5;\n s5 = peg$FAILED;\n }\n } else {\n peg$currPos = s5;\n s5 = peg$FAILED;\n }\n } else {\n peg$currPos = s5;\n s5 = peg$FAILED;\n }\n }\n if (s4 !== peg$FAILED) {\n s5 = peg$parsesp();\n if (s5 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 93) {\n s6 = peg$c19;\n peg$currPos++;\n } else {\n s6 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c20); }\n }\n if (s6 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c21(s3, s4);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n }\n\n return s0;\n }\n\n function peg$parse_() {\n let s0; let s1;\n\n peg$silentFails++;\n s0 = [];\n if (peg$c23.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c24); }\n }\n if (s1 !== peg$FAILED) {\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n if (peg$c23.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c24); }\n }\n }\n } else {\n s0 = peg$FAILED;\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c22); }\n }\n\n return s0;\n }\n\n function peg$parsesp() {\n let s0; let s1;\n\n peg$silentFails++;\n s0 = [];\n if (peg$c26.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c27); }\n }\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n if (peg$c26.test(input.charAt(peg$currPos))) {\n s1 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c27); }\n }\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c25); }\n }\n\n return s0;\n }\n\n function peg$parseCopr() {\n let s0;\n\n if (input.charCodeAt(peg$currPos) === 61) {\n s0 = peg$c28;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c29); }\n }\n if (s0 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c30) {\n s0 = peg$c30;\n peg$currPos += 2;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c31); }\n }\n if (s0 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c32) {\n s0 = peg$c32;\n peg$currPos += 2;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c33); }\n }\n if (s0 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c34) {\n s0 = peg$c34;\n peg$currPos += 2;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c35); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 60) {\n s0 = peg$c36;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c37); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 62) {\n s0 = peg$c38;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c39); }\n }\n if (s0 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c40) {\n s0 = peg$c40;\n peg$currPos += 2;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c41); }\n }\n }\n }\n }\n }\n }\n }\n\n return s0;\n }\n\n function peg$parseLopr() {\n let s0;\n\n if (input.substr(peg$currPos, 3) === peg$c42) {\n s0 = peg$c42;\n peg$currPos += 3;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c43); }\n }\n if (s0 === peg$FAILED) {\n if (input.substr(peg$currPos, 2) === peg$c44) {\n s0 = peg$c44;\n peg$currPos += 2;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c45); }\n }\n }\n\n return s0;\n }\n\n function peg$parseStringLiteral() {\n let s0; let s1; let s2; let s3;\n\n peg$silentFails++;\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 34) {\n s1 = peg$c47;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c48); }\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$parseDoubleStringCharacter();\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parseDoubleStringCharacter();\n }\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 34) {\n s3 = peg$c47;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c48); }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c49(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n peg$silentFails--;\n if (s0 === peg$FAILED) {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c46); }\n }\n\n return s0;\n }\n\n function peg$parseDoubleStringCharacter() {\n let s0; let s1; let s2;\n\n s0 = peg$currPos;\n s1 = peg$currPos;\n peg$silentFails++;\n if (input.charCodeAt(peg$currPos) === 34) {\n s2 = peg$c47;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c48); }\n }\n if (s2 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 92) {\n s2 = peg$c50;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c51); }\n }\n }\n peg$silentFails--;\n if (s2 === peg$FAILED) {\n s1 = void 0;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseSourceCharacter();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c52();\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 92) {\n s1 = peg$c50;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c51); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseEscapeSequence();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c53(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n\n return s0;\n }\n\n function peg$parseEscapeSequence() {\n let s0; let s1; let s2; let s3;\n\n s0 = peg$parseCharacterEscapeSequence();\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 48) {\n s1 = peg$c54;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c55); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$currPos;\n peg$silentFails++;\n s3 = peg$parseDecimalDigit();\n peg$silentFails--;\n if (s3 === peg$FAILED) {\n s2 = void 0;\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c56();\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$parseHexEscapeSequence();\n if (s0 === peg$FAILED) {\n s0 = peg$parseUnicodeEscapeSequence();\n }\n }\n }\n\n return s0;\n }\n\n function peg$parseHexEscapeSequence() {\n let s0; let s1; let s2; let s3; let s4; let s5;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 120) {\n s1 = peg$c57;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c58); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$currPos;\n s3 = peg$currPos;\n s4 = peg$parseHexDigit();\n if (s4 !== peg$FAILED) {\n s5 = peg$parseHexDigit();\n if (s5 !== peg$FAILED) {\n s4 = [s4, s5];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n if (s3 !== peg$FAILED) {\n s2 = input.substring(s2, peg$currPos);\n } else {\n s2 = s3;\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c59(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseCharacterEscapeSequence() {\n let s0;\n\n s0 = peg$parseSingleEscapeCharacter();\n if (s0 === peg$FAILED) {\n s0 = peg$parseNonEscapeCharacter();\n }\n\n return s0;\n }\n\n function peg$parseUnicodeEscapeSequence() {\n let s0; let s1; let s2; let s3; let s4; let s5; let s6; let s7;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 117) {\n s1 = peg$c60;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c61); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$currPos;\n s3 = peg$currPos;\n s4 = peg$parseHexDigit();\n if (s4 !== peg$FAILED) {\n s5 = peg$parseHexDigit();\n if (s5 !== peg$FAILED) {\n s6 = peg$parseHexDigit();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseHexDigit();\n if (s7 !== peg$FAILED) {\n s4 = [s4, s5, s6, s7];\n s3 = s4;\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n } else {\n peg$currPos = s3;\n s3 = peg$FAILED;\n }\n if (s3 !== peg$FAILED) {\n s2 = input.substring(s2, peg$currPos);\n } else {\n s2 = s3;\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c59(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseDecimalDigit() {\n let s0;\n\n if (peg$c62.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c63); }\n }\n\n return s0;\n }\n\n function peg$parseSourceCharacter() {\n let s0;\n\n if (input.length > peg$currPos) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c64); }\n }\n\n return s0;\n }\n\n function peg$parseHexDigit() {\n let s0;\n\n if (peg$c65.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c66); }\n }\n\n return s0;\n }\n\n function peg$parseSingleEscapeCharacter() {\n let s0; let s1;\n\n if (input.charCodeAt(peg$currPos) === 39) {\n s0 = peg$c67;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c68); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 34) {\n s0 = peg$c47;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c48); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 92) {\n s0 = peg$c50;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c51); }\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 98) {\n s1 = peg$c69;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c70); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c71();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 102) {\n s1 = peg$c72;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c73); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c74();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 110) {\n s1 = peg$c75;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c76); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c77();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 114) {\n s1 = peg$c78;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c79); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c80();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 116) {\n s1 = peg$c81;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c82); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c83();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 118) {\n s1 = peg$c84;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c85); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c86();\n }\n s0 = s1;\n }\n }\n }\n }\n }\n }\n }\n }\n\n return s0;\n }\n\n function peg$parseEscapeCharacter() {\n let s0;\n\n s0 = peg$parseSingleEscapeCharacter();\n if (s0 === peg$FAILED) {\n s0 = peg$parseDecimalDigit();\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 120) {\n s0 = peg$c57;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c58); }\n }\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 117) {\n s0 = peg$c60;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c61); }\n }\n }\n }\n }\n\n return s0;\n }\n\n function peg$parseNonEscapeCharacter() {\n let s0; let s1; let s2;\n\n s0 = peg$currPos;\n s1 = peg$currPos;\n peg$silentFails++;\n s2 = peg$parseEscapeCharacter();\n if (s2 === peg$FAILED) {\n s2 = peg$parseLineTerminator();\n }\n peg$silentFails--;\n if (s2 === peg$FAILED) {\n s1 = void 0;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parseSourceCharacter();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c52();\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseLineTerminator() {\n let s0;\n\n if (peg$c87.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c88); }\n }\n\n return s0;\n }\n\n\n \t function buildLogicalExpression(head, tail) {\n return tail.reduce((result, element) => ({\n type: 'logic',\n operator: element[1],\n left: result,\n right: element[3]\n }), head);\n }\n\n function buildArray(head, tail) {\n const re = [head]\n tail.forEach((element) =>{\n re.push(element[3])\n })\n return re;\n }\n\n\n peg$result = peg$startRuleFunction();\n\n if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n return peg$result;\n } \n if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n peg$fail(peg$endExpectation());\n }\n\n throw peg$buildStructuredError(\n peg$maxFailExpected,\n peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n peg$maxFailPos < input.length\n ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n );\n \n}\n\nreturn {\n SyntaxError: peg$SyntaxError,\n parse: peg$parse\n};\n})();\n\n\nexport default SearchSytaxQueryParser;","import { css, html, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\nimport SearchSytaxQueryParser from '../../../tools/SearchSytaxQueryParser_ES6';\nimport '../ki-popup/ki-popup';\n\n@customElement('ki-search-query-action')\nexport default class KiSearchQueryAction extends LitElement {\n // language=CSS\n static styles = css`\n .hide {\n display: none !important;\n }\n\n ki-icon {\n cursor: pointer;\n }\n\n ki-icon.ok {\n fill: #00c300;\n }\n\n ki-icon.ok:hover {\n fill: green;\n }\n\n ki-icon.error {\n fill: red;\n }\n\n ki-icon.error:hover {\n fill: #cf0000;\n }\n `;\n\n @property({ type: String })\n content: string | undefined;\n\n @property({ type: Array })\n fieldList: Array = [];\n\n @property({ type: String })\n error: string = '';\n\n @property({ type: String })\n suggestion: any;\n\n @property({ type: Object })\n inputElement: any;\n\n @property({ type: Object })\n query: any;\n\n render() {\n let mode = '';\n if (!this.content) {\n mode = 'info';\n } else if (this.error === '') {\n mode = 'ok';\n } else {\n mode = 'error';\n }\n // language=html\n return html`\n
\n \n \n
\n ${this.error}\n `;\n }\n\n updated(changedProperties) {\n if (changedProperties.has('content')) {\n this._checkContent();\n }\n }\n\n _checkContent() {\n this.error = '';\n try {\n if (this.content) {\n this.query = SearchSytaxQueryParser.parse(this.content, {\n fields: this.fieldList,\n });\n this.dispatchEvent(\n new CustomEvent('query', {\n detail: {\n query: this.query,\n },\n }),\n );\n }\n this.dispatchEvent(\n new CustomEvent('suggestion', {\n detail: {\n suggestion: null,\n },\n }),\n );\n } catch (e: any) {\n this.error = e.message;\n this.suggestion = this.getSuggestions(e);\n this.dispatchEvent(\n new CustomEvent('suggestion', {\n detail: {\n suggestion: {\n options: this.suggestion,\n location: e.location,\n },\n },\n }),\n );\n }\n }\n\n getSuggestions(event) {\n let data: Array = [];\n event.expected.forEach(item => {\n if (item.description === 'field name') {\n data = data.concat(this.fieldList);\n }\n if (item.type === 'literal' && item.text) {\n if (['('].indexOf(item.text) < 0) {\n data.indexOf(item.text) < 0 && data.push(item.text);\n }\n }\n });\n data = [...new Set(data)];\n return data;\n }\n}\n","import { css, html, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\nimport './ki-searchbox';\nimport './ki-search-query-action';\nimport '../ki-list/ki-list';\nimport '../ki-list/ki-list-item';\n\n@customElement('ki-queryable-searchbox')\nexport default class KiQueryableSearchbox extends LitElement {\n // language=CSS\n static styles = css`\n :host {\n display: block;\n position: relative;\n }\n #suggestion-popup {\n top: 100%;\n left: 0;\n width: 100%;\n }\n `;\n\n @property({ type: String })\n content = '';\n\n @property({ type: Array })\n fieldList: Array = [];\n\n @property({ type: Array })\n suggestion: any;\n\n render() {\n // language=html\n return html`\n {\n this.content = e.detail.value;\n }}\"\n >\n
\n \n
\n \n \n ${this.suggestion &&\n this.suggestion.options.map(\n h =>\n html`\n \n this._applySuggestion(this.suggestion.location, h)}\"\n >${h}\n `,\n )}\n \n `;\n }\n\n _onSuggestion(e) {\n this.suggestion = e.detail.suggestion;\n }\n\n _applySuggestion(location, text) {\n this.content = this.content.substr(0, location.start.offset) + text;\n }\n\n onSearch(e) {\n this.dispatchEvent(\n new CustomEvent('search', { detail: { query: e.detail.query } }),\n );\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport { html, css, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\nimport '../ki-icon/ki-icon';\nimport { getQueryObject } from '../../decorators/query';\n\n@customElement('ki-tree-node')\nexport default class KiTreeNode extends LitElement {\n static styles = css`\n .tree-item {\n cursor: pointer;\n display: flex;\n flex-direction: column;\n line-height: 2.5em;\n color: grey;\n width: 100%;\n }\n\n :host(.hideRoot) .tree-item .tree-node-content {\n display: none;\n }\n :host(.hideRoot) .tree-item .tree-node-children {\n padding-left: 0;\n }\n\n .tree-node-content.leaf-content {\n background-color: white;\n }\n\n .tree-item.selected .tree-node-content {\n color: white;\n background: var(--theme-color, #0056a0);\n }\n\n .tree-node-content {\n display: flex;\n flex-direction: row;\n padding: 0px 20px;\n height: 40px;\n overflow: hidden;\n }\n\n .tree-node-label {\n flex: 1;\n }\n .tree-node-label:hover {\n color: var(--theme-color, #0056a0);\n cursor: pointer;\n }\n .tree-item.selected .tree-node-label:hover {\n color: white;\n opacity: 0.8;\n }\n .tree-node-label .node-content-label {\n white-space: nowrap;\n max-width: 300px;\n display: inline-block;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .node-content-label {\n flex: 1;\n line-height: 40px;\n }\n\n .node-content-icon {\n vertical-align: top;\n padding: 10px;\n font-size: 18px;\n cursor: pointer;\n }\n\n span::selection {\n background: white;\n }\n\n .expand-icon {\n padding: 10px;\n width: 36px;\n text-align: center;\n }\n\n .expand-icon.hide {\n display: none;\n }\n .expand-icon:hover {\n fill: var(--theme-color, #0056a0);\n cursor: pointer;\n border-radius: 50%;\n }\n\n .tree-node-children.hide {\n display: none;\n }\n `;\n\n @property({ type: String })\n icon: string | undefined;\n\n @property({ type: String })\n label: string = '';\n\n @property({ type: Object })\n value;\n\n @property({ type: Boolean })\n isLeaf: boolean = false;\n\n @property({ type: Array })\n selectedItem: Array | undefined;\n\n @property({ type: Boolean })\n expand: boolean = false;\n\n @property({ type: Number })\n paddingLeft: number = 0;\n\n get __labelElement() {\n return getQueryObject(this, '#label');\n }\n\n render() {\n return html`\n \n \n
\n ${this.icon\n ? html``\n : ''}\n \n
\n \n \n
\n \n
\n \n `;\n }\n\n _createPapertooltip() {\n if (this.__labelElement.offsetWidth < this.__labelElement.scrollWidth) {\n const node = document.createElement('paper-tooltip');\n // @ts-expect-error\n node.for = 'label';\n node.innerHTML = this.label;\n this.__labelElement.appendChild(node);\n }\n }\n\n handleContentClick() {\n const labelClickedEvent = new CustomEvent('labelClicked', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n });\n if (!this.isLeaf) {\n this.dispatchEvent(labelClickedEvent);\n this.expand = !this.expand;\n } else {\n this.dispatchEvent(\n new CustomEvent('itemSelected', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n }\n\n handleClick() {\n // this.value = this.value;\n const itemSelectedEvent = new CustomEvent('itemSelected', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n });\n\n if (this.isLeaf) {\n this.expand = false;\n this.dispatchEvent(itemSelectedEvent);\n } else {\n this.expand = !this.expand;\n }\n\n // @ts-expect-error\n this.requestUpdate(this.expand, !this.expand);\n }\n}\n","import { html, css, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\nimport './ki-tree-node';\n\nconst SCROLL_STEP = 50; // for performance\n\n@customElement('ki-tree')\nexport default class KiTree extends LitElement {\n static styles = css`\n :host {\n height: 100%;\n width: 100%;\n display: block;\n overflow: auto;\n }\n .group {\n overflow: hidden;\n }\n `;\n\n _data: any = [];\n\n @property({ type: Object })\n get data() {\n return this._data;\n }\n\n set data(val) {\n this._data = val;\n this.requestUpdate();\n }\n\n @property({ type: Number })\n _tailIndex = SCROLL_STEP;\n\n @property({ type: Boolean })\n multiple;\n\n @property({ type: Number })\n indent = 20; // default 20px;\n\n @property({ type: Boolean })\n hideRoot;\n\n value: Array = [];\n\n expand = true;\n\n handleLabelClick;\n\n render() {\n return html`\n \n \n ${this.data.children &&\n this.data.children\n .slice(0, Math.min(this._tailIndex, this.data.children.length))\n .map(child => this._renderChild(child, this.indent * 2))}\n \n \n `;\n }\n\n _loadMore() {\n const scroller = this.renderRoot.querySelector('.tree');\n if (scroller && scroller.scrollTop > scroller.scrollHeight / 2) {\n if (this._tailIndex < this.data.children.length) {\n this._tailIndex = Math.min(\n this._tailIndex + SCROLL_STEP,\n this.data.children.length,\n );\n }\n }\n }\n\n _renderChild(child, paddingLeft) {\n if (child && child.children && child.children.length > 0) {\n return html`\n
\n this.value.indexOf(c.value) >= 0)}\"\n .paddingLeft=\"${paddingLeft}\"\n >\n ${child.children.map(grandChild =>\n this._renderChild(grandChild, paddingLeft + this.indent),\n )}\n \n
\n `;\n }\n\n return html`\n \n `;\n }\n\n handleItemSelected(event) {\n // console.log(event);\n const currentValue = event.detail.value;\n event.stopPropagation();\n const index = this.value && this.value.indexOf(currentValue);\n if (this.multiple) {\n if (index !== -1) {\n this.value = [\n ...this.value.slice(0, index),\n ...this.value.slice(index + 1),\n ];\n } else {\n this.value = [...this.value, currentValue];\n }\n } else {\n const { length } = this.value;\n if (length === 0 || index === -1) {\n this.value = [currentValue];\n } else {\n this.value = [];\n }\n }\n console.log('selected items:', this.value);\n this.requestUpdate();\n\n this.dispatchEvent(\n new CustomEvent('itemSelected', {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n // TODO deprecated\n reset() {\n this.value = [];\n this.requestUpdate();\n }\n}\n","import { css, html, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\nimport '../ki-popup/ki-popup';\n\n// TODO collapse, popup with change log.\n@customElement('ki-wcp-version-tag')\nexport default class KiWcpVersionTag extends LitElement {\n // language=CSS\n static styles = css`\n :host {\n display: block;\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n position: absolute;\n }\n\n .version {\n display: block;\n padding: 10px 20px;\n cursor: pointer;\n color: var(--theme-color);\n }\n `;\n\n @property({ type: Object })\n pkg: any = {};\n\n @property({ type: Boolean })\n showPopup: boolean = false;\n\n _packageJsonPath = './package.json';\n\n @property({ type: String })\n get packageJsonPath(): string {\n return this._packageJsonPath;\n }\n\n set packageJsonPath(val: string) {\n this._packageJsonPath = val;\n if (val) {\n fetch(val)\n .then(res => res.json())\n .then(pkg => {\n this.pkg = pkg;\n });\n }\n }\n\n constructor() {\n super();\n this.packageJsonPath = './package.json';\n }\n\n render() {\n // language=html\n return html`\n {\n this.showPopup = !this.showPopup;\n }}\"\n >\n ${this.pkg.name}#${this.pkg.version} at ${this.pkg.versionDate}\n \n place holder for change log\n `;\n }\n}\n","/* eslint-disable wc/no-constructor-attributes */\n/* eslint-disable wc/no-self-class */\nimport { LitElement, html, css } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\nimport '../ki-icon/ki-icon';\nimport { last } from 'lodash-es/array';\nimport { some } from 'lodash-es/collection';\nimport { addSwipeEvents } from '../../common/util';\n// import style from './ki-modal.css?inline';\n\n@customElement('ki-modal')\nexport default class KiModal extends LitElement {\n // language=CSS\n static styles = css`\n :host {\n background-color: #fefefe;\n width: 100%;\n height: auto;\n max-height: 100%;\n border-top: 1px solid lightgray;\n position: fixed;\n z-index: 100;\n overflow: auto;\n left: 0;\n bottom: -100%;\n transition: bottom 0.5s;\n }\n\n :host(.visible) {\n z-index: 101;\n bottom: 0;\n max-height: 100%;\n filter: drop-shadow(1px 4px 7px grey);\n }\n\n :host(.visible.full-screen) {\n bottom: 0;\n }\n :host(.draggable) .ki-modal-drag {\n display: block;\n }\n\n .ki-modal-drag {\n display: none;\n width: 20%;\n height: 3px;\n margin: 5px auto 0px;\n border-radius: 32px;\n border: 1px solid transparent;\n background: gray;\n }\n\n .ki-modal-header {\n display: flex;\n flex-direction: row;\n padding: 0px 10px;\n font-size: 1.2em;\n line-height: 1.8em;\n }\n .ki-modal-header.bottom-border {\n border-bottom: 1px solid lightgray;\n }\n .ki-modal-header.bottom-border .ki-modal-label {\n height: 1.8em;\n }\n .ki-modal-label {\n flex: 1;\n display: inline-block;\n }\n .close {\n fill: gray;\n line-height: 1.8em;\n }\n .close.hide {\n display: none;\n }\n .close:hover {\n cursor: pointer;\n }\n .close:focus {\n cursor: pointer;\n }\n `;\n\n static history: Array = []; // use to track order of popup modals\n\n @property({ type: Boolean })\n visible = false;\n\n @property({ type: Boolean })\n draggable = false;\n\n @property({ type: Boolean })\n closeable = false;\n\n @property({ type: Boolean })\n closeOnSwipeDown = false;\n\n __fullscreen = false; // __fullscreen is one state of draggable\n\n @property({ type: Boolean })\n trackable = false;\n\n @property({ type: String })\n label: string = '';\n\n @property({ type: Number })\n minContentHeight: number | undefined;\n\n _originTop: number = 0;\n\n render() {\n this.classList.toggle('visible', this.visible);\n this.classList.toggle('full-screen', this.__fullscreen);\n this.classList.toggle('draggable', this.draggable);\n return html`\n
\n
\n \n ${this.label}\n \n \n \n \n `;\n }\n\n handleTouchMove(e) {\n if (this.draggable) {\n const touch = e.targetTouches[0];\n const step = this._originTop - touch.clientY;\n this.__fullscreen = step > 0;\n this.requestUpdate();\n this._originTop = touch.clientY;\n }\n }\n\n handleTouchStart(e) {\n if (this.draggable) {\n const touch = e.targetTouches[0];\n this._originTop = touch.clientY;\n }\n }\n\n handleClick(e) {\n e.stopPropagation();\n if (this.draggable) {\n this.__fullscreen = !this.__fullscreen;\n this.dispatchEvent(\n new CustomEvent('togglefullscreen', {\n bubbles: true,\n composed: true,\n detail: {\n fullscreen: this.__fullscreen,\n },\n }),\n );\n this.requestUpdate();\n }\n }\n\n connectedCallback() {\n // @ts-expect-error\n if (super.connectedCallback) super.connectedCallback();\n // this.draggable && this._addEventListener();\n // @ts-expect-error\n addSwipeEvents(this.renderRoot, (...args) => this.handleGesure(...args));\n }\n\n updated() {\n if (this.visible && this.trackable) {\n !some(KiModal.history, this) && KiModal.history.push(this);\n }\n if (this.__fullscreen || !this.visible) {\n this.__height = null;\n } else {\n this.__height = this.minContentHeight;\n }\n }\n\n set __height(val) {\n if (val) {\n this.style.bottom = `calc(${val}px - 100%)`;\n } else {\n // @ts-expect-error\n this.style.bottom = null;\n }\n }\n\n show() {\n this.visible = true;\n if (this.trackable) {\n const previousEl = last(KiModal.history);\n if (previousEl) {\n previousEl.visible = false;\n }\n } else {\n // make sure only one modal popup, case sernario: legends&layers vs station-list\n /* eslint-disable no-return-assign */\n KiModal.history.forEach(modal => (modal.visible = false));\n /* eslint-enable no-return-assign */\n }\n }\n\n close() {\n this.visible = false;\n if (this.trackable) {\n KiModal.history.pop(); // popup last element\n const previous = last(KiModal.history);\n if (previous) {\n previous.visible = true;\n }\n } else {\n /* eslint-disable no-return-assign */\n KiModal.history.forEach(modal => (modal.visible = true));\n /* eslint-enable no-return-assign */\n }\n }\n\n handleGesure(touchstartX, touchendX, touchstartY, touchendY) {\n // Swiped left\n if (touchendX < touchstartX + 50) {\n console.log('Swiped left');\n }\n // Swiped right\n if (touchendX > touchstartX + 50) {\n console.log('Swiped right');\n }\n // Swiped up\n if (touchendY < touchstartY + 50) {\n console.log('Swiped up');\n }\n // Swiped down\n if (touchendY > touchstartY + 50) {\n this.closeOnSwipeDown && this.close();\n }\n // tap\n if (touchendY === touchstartY + 50) {\n console.log('Tap');\n }\n }\n}\n","import { css, html, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('ki-toast')\nexport default class KiToast extends LitElement {\n // language=CSS\n static styles = css`\n :host {\n display: flex;\n flex-direction: row;\n position: fixed;\n background-color: white;\n color: black;\n fill: black;\n border: 1px solid var(--ki-toast-color, black);\n min-height: 48px;\n max-width: 400px;\n /*max-width: 80%; !*for mobile*!*/\n min-width: 288px;\n padding: 12px 0;\n box-sizing: border-box;\n border-radius: 2px;\n font-size: 14px;\n cursor: default;\n opacity: 0;\n transform: translateX(200px);\n transition: transform linear 0.3s, opacity linear 0.3s;\n z-index: 10;\n }\n\n :host(.visible) {\n opacity: 1;\n transform: translateX(0px);\n }\n\n /*right-bottom*/\n :host {\n position: fixed;\n right: 20px;\n bottom: 20px;\n }\n\n .icon-container {\n color: var(--ki-toast-color, black);\n flex: 0 0 70px;\n text-align: center;\n font-size: 24px;\n margin: auto;\n }\n\n .content-container {\n flex: 1;\n }\n\n .action-container {\n flex: 0 40px;\n text-align: center;\n }\n\n .close-btn {\n fill: lightgray;\n cursor: pointer;\n }\n .close-btn:hover {\n fill: gray;\n }\n\n :host(.success) {\n --ki-toast-color: var(--ki-success-color, #1eaf1e);\n }\n\n :host(.error) {\n --ki-toast-color: var(--ki-error-color, #d30535);\n }\n\n :host(.warning) {\n --ki-toast-color: var(--ki-warning-color, #fe7402);\n }\n\n :host(.info) {\n --ki-toast-color: var(--ki-info-color, #3f86cd);\n }\n `;\n\n @property({ type: String })\n content: string | undefined;\n\n @property({ type: String })\n type: string = '';\n\n visible: boolean = false;\n\n static types = {\n success: {\n className: 'success',\n icon: 'ki ki-check',\n },\n error: {\n className: 'error',\n icon: 'ki ki-exclamation',\n },\n warning: {\n className: 'warning',\n icon: 'ki ki-question',\n },\n info: {\n className: 'info',\n icon: 'ki ki-info',\n },\n };\n\n static showToast({ type = 'success', content = 'msg content' } = {}) {\n const toast = document.createElement('ki-toast');\n // @ts-expect-error\n toast.type = type;\n // @ts-expect-error\n toast.content = content;\n document.body.appendChild(toast);\n setTimeout(() => {\n // @ts-expect-error\n toast.open();\n });\n }\n\n renderMsg() {\n return this.content ? html` ${this.content} ` : html` `;\n }\n\n render() {\n // @ts-expect-error\n this.renderRoot.host.classList.toggle('visible', this.visible);\n // @ts-expect-error\n this.renderRoot.host.classList.remove(Object.keys(KiToast.types));\n\n const type = KiToast.types[this.type];\n if (type) {\n // @ts-expect-error\n this.renderRoot.host.classList.add(KiToast.types[this.type].className);\n }\n\n // language=html\n return html`\n
\n \n
\n
${this.renderMsg()}
\n
\n \n
\n `;\n }\n\n open({ duration = 200000 } = {}) {\n this.visible = true;\n this.requestUpdate();\n setTimeout(() => {\n this.close();\n }, duration);\n }\n\n close() {\n this.visible = false;\n this.requestUpdate();\n\n // or maybe use msg stack , reuse the element.\n // wait after animation\n // setTimeout(() => {\n // this.remove();\n // }, 1000)\n }\n}\n\n// TODO stack for multi toast\n","import { css, html, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement } from 'lit/decorators.js';\nimport nls from '../../locales/index';\nimport Mix from '../../common/Mix';\nimport { i18nMixin } from '../../decorators/i18n';\n\n// @ts-expect-error\n@customElement('ki-accordion')\nexport default class KiAccordion extends Mix(LitElement, [i18nMixin, { nls }]) {\n // language=CSS\n static styles = css`\n :host {\n display: block;\n }\n `;\n\n constructor() {\n super();\n this.content = 'default content';\n }\n\n static get properties() {\n return {\n multiple: { type: Boolean },\n };\n }\n\n render() {\n // language=html\n return html``;\n }\n}\n","import { css, html } from 'lit';\n\n/**\n * Uses canvas.measureText to compute and return the width of the given text of given font in pixels.\n *\n * @param {String} text The text to be rendered.\n * @param {String} font The css font descriptor that text is to be rendered with (e.g. \"bold 14px verdana\").\n *\n * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393\n */\nconst canvas = document.createElement('canvas');\n\nfunction getTextWidth(text, font) {\n const context = canvas.getContext('2d');\n if (context) {\n context.font = font;\n const metrics = context.measureText(text);\n return metrics.width;\n }\n return 1;\n}\n\nfunction getCssStyle(element, prop) {\n return window.getComputedStyle(element, null).getPropertyValue(prop);\n}\n\nfunction getCanvasFont(el = document.body) {\n const fontWeight = getCssStyle(el, 'font-weight') || 'normal';\n const fontSize = getCssStyle(el, 'font-size') || '16px';\n const fontFamily = getCssStyle(el, 'font-family') || 'Times New Roman';\n\n return `${fontWeight} ${fontSize} ${fontFamily}`;\n}\n\nexport default function ColumnResizing(clz) {\n return class extends clz {\n // language=CSS\n static styles = css`\n .header .resize {\n overflow: visible;\n }\n\n .row:hover {\n --resizer-display: flex;\n }\n\n .header .resize .resizer {\n top: 0px;\n width: 10px;\n height: 100%;\n cursor: e-resize;\n position: absolute;\n z-index: 2;\n justify-content: center;\n display: var(--resizer-display, none);\n align-items: center;\n user-select: none;\n background: inherit; /* Hides any text behind this element */\n }\n\n .header .resize .resizer.left {\n left: -10px;\n }\n\n /* This allows column headers to be centered with text-align set in the css property of the column in layercfg */\n .resize .cell {\n width: 100% !important;\n display: block;\n }\n\n /* allows columns added to the table after a resizing to have more than 0 width */\n /* also allows for custom css to set a relative width for columns instead of a fixed width */\n .cell {\n width: 100%;\n }\n `;\n\n renderStarted = true;\n\n _columnSizeStyle: any = {};\n\n minimumWidth: number = 120;\n\n // the padding on cells in table rows, used when auto resizing to content width (double click)\n cellPadding: number = 20;\n\n get renderingColumns() {\n return super.renderingColumns?.map(c => {\n const col = { ...c };\n const style = this._columnSizeStyle[col.field];\n if (style) {\n Object.keys(style).forEach(key => {\n if (!col.css) col.css = '';\n // Try not to mangle custom css too much\n // This made more sense to me than overriding renderCell, you are free to disagree\n // This also stop you from having css conflicting with the custom css\n if (col.css.indexOf(`${key}:`) >= 0) {\n const regex = new RegExp(`${key}:[^;]+;?`, `i`);\n col.css = col.css.replace(regex, `${key}: ${style[key]};`);\n } else {\n col.css += `${key}: ${style[key]};`;\n }\n });\n }\n return col;\n });\n }\n\n findPreviousColumn(field) {\n let previousColumn = this.renderingColumns[0];\n this.renderingColumns.forEach((column, index) => {\n if (column.field === field && index > 0) {\n previousColumn = this.renderingColumns[index - 1];\n }\n });\n return previousColumn;\n }\n\n // Sort columns by current width\n // middle column after sorting becomes 100% standard (100% because then if someone hides all other columns the table will still be full)\n // apply width calculation to all columns based on width after resize\n\n // Used to calculate column width percentages later, call this before changing the width of a column\n setStandardWidth() {\n const allColumns: Array = Array.from(\n this.shadowRoot.querySelectorAll('.resize.cell'),\n );\n allColumns.sort((a, b) => a.offsetWidth - b.offsetWidth);\n this.standardWidth =\n allColumns[Math.trunc(allColumns.length / 2)].offsetWidth;\n }\n\n initResize(event, col) {\n this.removeListeners();\n this.previousColumn = this.findPreviousColumn(col.field);\n this.previousColumnElement = this.shadowRoot.getElementById(\n `resize-col-${this.previousColumn.field}`,\n );\n this.postColumn = col;\n this.postColumnElement = this.shadowRoot.getElementById(\n `resize-col-${col.field}`,\n );\n\n this.previousColumnElement.style.left = `${this.previousColumnElement.offsetLeft}px`;\n this.previousColumnWidth = this.previousColumnElement.offsetWidth;\n this.postColumnWidth = this.postColumnElement.offsetWidth;\n this.startMouseX = event.clientX;\n\n this.setStandardWidth();\n\n this.resizeEvent = e => this.Resize(e);\n this.stopResizeEvent = () => this.stopResize();\n window.addEventListener('mousemove', this.resizeEvent, false);\n window.addEventListener('mouseup', this.stopResizeEvent, false);\n }\n\n Resize(e) {\n const newPrevColumnWidth =\n this.previousColumnWidth - (this.startMouseX - e.clientX);\n const newPostColumnWidth =\n this.postColumnWidth - (e.clientX - this.startMouseX);\n if (\n newPrevColumnWidth < this.minimumWidth ||\n newPostColumnWidth < this.minimumWidth\n ) {\n return;\n }\n this.previousColumnElement.style.width = `${newPrevColumnWidth}px`;\n this.postColumnElement.style.width = `${newPostColumnWidth}px`;\n }\n\n removeListeners() {\n window.removeEventListener('mousemove', this.resizeEvent, false);\n window.removeEventListener('mouseup', this.stopResizeEvent, false);\n }\n\n // This requires you set the width of the column before calling it\n resizeColumns() {\n const allColumns: Array = Array.from(\n this.shadowRoot.querySelectorAll('.resize.cell'),\n );\n allColumns.forEach(column => {\n const field = column.getAttribute('field');\n if (field) {\n this._columnSizeStyle[field] = {\n width: `${(column.offsetWidth / this.standardWidth) * 100}%`,\n };\n }\n });\n }\n\n stopResize() {\n this.previousColumnElement.style.left = `unset`;\n this.removeListeners();\n this.resizeColumns();\n\n this.requestUpdate();\n }\n\n // This can't work for cells with custom content (not field value text)\n fitContent(field) {\n const existingCell = this.shadowRoot.querySelector(\n `.scroller .cell.col-${field}`,\n );\n const font = getCanvasFont(existingCell);\n\n let maxWidth = 0;\n\n this.data.forEach(item => {\n if (Object.prototype.hasOwnProperty.call(item, field)) {\n const width = getTextWidth(item[field], font) || 1;\n if (width > maxWidth) {\n maxWidth = width;\n }\n }\n });\n maxWidth = Math.ceil(maxWidth);\n\n if (maxWidth < 0) {\n return;\n }\n\n if (maxWidth < this.minimumWidth) {\n maxWidth = this.minimumWidth;\n }\n\n this.setStandardWidth();\n const headerElement = this.shadowRoot.getElementById(\n `resize-col-${field}`,\n );\n headerElement.style.width = `${maxWidth + this.cellPadding + 1}px`;\n this.resizeColumns();\n\n this.requestUpdate();\n }\n\n // I'm putting the resizer in the following column and aligning it to the left because I can't know which column is the last\n // The last column needs to not have a resizer on the right.\n // This way I can remove it from the first one and the last appears not to have one.\n _renderHeaderCell(col) {\n if (col.field === '__options') {\n this.renderStarted = true;\n return super._renderHeaderCell(col);\n }\n const resizer = this.renderStarted\n ? ''\n : html` {\n this.initResize(e, col);\n }}\n @dblclick=${() =>\n this.fitContent(this.findPreviousColumn(col.field).field)}\n >\n ║\n `;\n const fisrt = this.renderStarted ? 'firstResizable' : ``;\n this.renderStarted = false;\n return html`\n \n ${super._renderHeaderCell(col)} ${resizer}\n \n `;\n }\n };\n}\n","/* eslint-disable func-names */\nimport { html } from 'lit';\nimport aspect from '../common/aspect';\n\nconst _loaderMixin = {\n __$loaderCount: 0,\n\n get loading() {\n return this.__$loaderCount > 0;\n },\n\n promiseLoader(p) {\n this.__$loaderCount += 1;\n // @ts-expect-error\n this.requestUpdate();\n return p.finally(() => {\n this.__$loaderCount -= 1;\n // @ts-expect-error\n this.requestUpdate();\n });\n },\n\n // default loader\n _renderLoader() {\n if (this.loading) {\n return html`\n \n
\n `;\n }\n return '';\n },\n};\n\nconst loaderTargetFn = function (prototype) {\n Object.assign(prototype, _loaderMixin);\n aspect(\n prototype,\n 'render',\n origin =>\n function () {\n // @ts-expect-error\n return html`${this._renderLoader()}${origin.apply(this)}`;\n },\n );\n};\n\nexport const loaderFn = function (target) {\n loaderTargetFn(target.prototype);\n};\n\nexport const loader = function () {\n return function decorator(target) {\n loaderFn(target);\n };\n};\n\nexport const loaderMixin = function (clz) {\n return class extends clz {\n constructor() {\n super();\n loaderTargetFn(this);\n }\n };\n};\n","/* eslint-disable func-names */\nimport { defaultConverter } from 'lit';\nimport getPropertyDescriptor from './helper/getPropertyDescriptor';\n\nconst globalLocalStorage = window.localStorage;\n\nconst getId = (target, key, id = undefined) => {\n id = id || target.localStorageId || target.getAttribute('local-storage-id');\n if (!id) {\n return undefined;\n }\n if (typeof id === 'string') {\n return `${id}-${key}`;\n }\n if (typeof id === 'function') {\n // @ts-expect-error\n return `${id(target)}-${key}`;\n }\n throw new Error('idFn should only be string or function');\n};\n\nconst getGetter = (\n target,\n local,\n key,\n initialGetter,\n // @ts-expect-error\n { id, typeParam = String, initializer } = {},\n) =>\n function getter() {\n const _id = getId(target, key, id);\n let val;\n if (_id) {\n // @ts-expect-error\n val = defaultConverter.fromAttribute(\n globalLocalStorage.getItem(_id),\n typeParam,\n );\n } else {\n val = local;\n }\n if (val === undefined || val === null) {\n val = (initializer && initializer()) || initialGetter.call(target);\n }\n return val;\n };\n\n// @ts-expect-error\nconst getSetter = (target, local, key, { id, typeParam = String } = {}) =>\n function setter(val) {\n const _id = getId(target, key, id);\n local = val;\n if (_id) {\n // @ts-expect-error\n val = defaultConverter.toAttribute(val, typeParam); // convert string to specified type\n globalLocalStorage.setItem(_id, val);\n }\n // @ts-expect-error\n this.requestUpdate && this.requestUpdate(); // for updating-element\n };\n\n// todo auto compute id with parent path and id ?\n/*\n * @param {(String | Function)} options.id: string or fn for generating id. use instance's localStorageId+fieldName or disabled when all not set.\n *\n * performance tested: reading 1million/s, similar to object access. so it's ok to read directly from storage.\n * for big data might be problem when rerender very often, can try cache it.\n * */\n// @ts-expect-error\nexport const localStorage = function ({ id, typeParam = String } = {}) {\n return function decorator(target, key, descriptor) {\n const { initializer } = descriptor;\n delete descriptor.initializer;\n delete descriptor.writable;\n let local; // fallback when not set local-storage-id\n\n descriptor.get = getGetter(target, local, key, descriptor.get, {\n id,\n typeParam,\n initializer,\n });\n\n descriptor.set = getSetter(target, local, key, { id, typeParam });\n\n return descriptor;\n };\n};\n\nexport const localStorageMixin = function (\n clz,\n { targetProperty, id, typeParam = String },\n) {\n return class extends clz {\n constructor() {\n super();\n let local; // fallback when local-storage-id is not set\n const [, propertyDescriptor] = getPropertyDescriptor(\n this,\n targetProperty,\n );\n delete propertyDescriptor.initializer;\n delete propertyDescriptor.writable;\n const getterFn = getGetter(\n this,\n local,\n targetProperty,\n propertyDescriptor.get,\n // @ts-expect-error\n {\n id,\n typeParam,\n },\n );\n const setterFn = getSetter(this, local, targetProperty, {\n id,\n typeParam,\n });\n Object.defineProperty(this, targetProperty, {\n get: getterFn,\n set: setterFn,\n configurable: true,\n });\n }\n };\n};\n","/* eslint-disable func-names */\nimport getPropertyDescriptor from './helper/getPropertyDescriptor';\nimport {\n setSearchParam,\n getSearchParam,\n getAllSearchParams,\n} from '../components/ki-app/routing/ki-router';\n\nconst getGetter = (param, type, defaultValue) =>\n function getter() {\n const searchParamValue = getSearchParam(param);\n if (\n (defaultValue && searchParamValue === undefined) ||\n searchParamValue === null\n ) {\n return defaultValue;\n }\n if (type === 'array') {\n return getAllSearchParams(param);\n }\n return searchParamValue;\n };\n\nconst getSetter = (target, param, oldSetter) =>\n function setter(val) {\n setSearchParam(param, val);\n if (oldSetter) {\n oldSetter.call(target, val);\n }\n };\n\n// @ts-expect-error\nexport const queryParam = function (param, { type, defaultValue } = {}) {\n return function decorator(target, _key, descriptor) {\n delete descriptor.initializer;\n delete descriptor.writable;\n descriptor.set = getSetter(target, param, descriptor.set);\n descriptor.get = getGetter(param, type, defaultValue);\n return descriptor;\n };\n};\n\nexport const queryParamMixin = function (\n clz,\n { targetProperty, selector, type = String, defaultValue },\n) {\n return class extends clz {\n constructor() {\n super();\n const [, propertyDescriptor] = getPropertyDescriptor(\n this,\n targetProperty,\n );\n delete propertyDescriptor.initializer;\n delete propertyDescriptor.writable;\n\n const setterFn = getSetter(this, selector, propertyDescriptor.set);\n const getterFn = getGetter(selector, type, defaultValue);\n\n Object.defineProperty(this, targetProperty, {\n get: getterFn,\n set: setterFn,\n configurable: true,\n });\n }\n };\n};\n","import { css } from 'lit';\n// language=CSS\nexport default css`\n ki-app-views {\n display: flex;\n flex-direction: column;\n flex: 1;\n }\n\n ki-menu {\n width: 100%;\n }\n .logo-left,\n .logo-right {\n display: flex;\n }\n .logo-right {\n margin-left: auto;\n }\n .logo-left img,\n .logo-right img {\n height: 75px;\n padding: 5px;\n }\n .header {\n height: 80px;\n }\n\n .sm-screen .logo-Demo {\n padding: 10px 0px;\n }\n\n :host(.sm-screen) .toggle-btn {\n display: flex;\n border-radius: 0;\n margin: 0 10px 0 0;\n min-width: 60px;\n width: 60px;\n justify-content: center;\n flex-direction: column;\n background-color: var(--theme-color-primary, white);\n color: white;\n fill: white;\n font-size: 1.5em;\n height: 100%;\n }\n`;\n","import deCommon from './de/common.json';\nimport enCommon from './en/common.json';\nimport frCommon from './fr/common.json';\nimport isCommon from './is/common.json';\nimport zhCommon from './zh/common.json';\n\nexport default {\n de: {\n common: deCommon,\n },\n en: {\n common: enCommon,\n },\n fr: {\n common: frCommon,\n },\n is: {\n common: isCommon,\n },\n zh: {\n common: zhCommon,\n },\n};\n","/* eslint-disable lit-a11y/click-events-have-key-events */\n/* eslint-disable max-classes-per-file */\nimport { html, css, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport '@kisters/wcp-base/components';\nimport { PropertyDefaultValue, Mix } from '@kisters/wcp-base/common';\nimport { responsiveMixin } from '@kisters/wcp-base/decorators';\n\n@customElement('ki-menu')\nexport default class KiMenu extends Mix(\n LitElement,\n PropertyDefaultValue,\n responsiveMixin,\n) {\n static styles = css`\n :host {\n display: flex;\n height: 100%;\n overflow: auto;\n }\n\n :host(.vertical) {\n flex-direction: column;\n }\n\n .menu-item {\n display: flex;\n flex-direction: row;\n padding: 10px 5px;\n background: white;\n fill: var(--theme-text-menu-color, --theme-text-color);\n color: var(--theme-text-menu-color, --theme-text-color);\n background: var(\n --theme-background-menu-color,\n var(--theme-color-primary, #1d1d1b)\n );\n border: 1px solid\n var(--theme-background-menu-color, var(--theme-color-primary, #1d1d1b));\n align-items: center;\n flex: 1;\n position: relative;\n justify-content: start;\n transition: all 0.3s ease;\n min-width: 0%;\n max-height: 100px;\n max-width: 320px;\n }\n\n :host(.sm-screen) .menu-item {\n max-width: initial;\n }\n\n .menu-item.selected {\n background: var(--theme-color-secondary, #1d1d1b);\n color: var(\n --theme-text-menu-color-selected,\n --theme-text-menu-color,\n --theme-color-primary,\n white\n );\n fill: var(\n --theme-text-menu-color-selected,\n --theme-text-menu-color,\n --theme-color-primary,\n white\n );\n }\n .menu-item:hover,\n .menu-item:focus {\n cursor: pointer;\n background: var(--theme-color-secondary, #1d1d1b);\n color: var(--theme-text-menu-color-selected, white);\n }\n .menu-icon {\n min-width: 30px;\n text-align: center;\n }\n\n .hidden {\n display: none;\n }\n\n .menu-label {\n padding: 0px 5px 0px 5px;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n .expand-icon {\n margin-left: auto;\n margin-right: 5px;\n }\n .expand-icon.hidden {\n visibility: hidden;\n }\n\n .sub-menu-wrapper {\n display: flex;\n flex-direction: column;\n }\n\n .sub-menu-wrapper.horizontal {\n position: absolute;\n }\n .sub-menu-item {\n display: flex;\n flex-direction: row;\n padding: 10px;\n fill: var(--theme-text-menu-color, --theme-text-color);\n background: var(\n --theme-background-menu-color,\n var(--theme-color-primary, #1d1d1b)\n );\n color: var(--theme-text-menu-color, --theme-text-color);\n align-items: center;\n padding-left: 20px;\n transition: all 0.3s ease;\n }\n .sub-menu-item:hover,\n .sub-menu-item.focused,\n .sub-menu-item:focus {\n cursor: pointer;\n background: var(--theme-color-secondary, #1d1d1b);\n color: var(--theme-color-primary, white);\n }\n `;\n\n connectedCallback() {\n if (super.connectedCallback) super.connectedCallback();\n window.addEventListener('click', () => this.deselectItem());\n }\n\n disconnectedCallback() {\n if (super.disconnectedCallback) super.disconnectedCallback();\n window.removeEventListener('click', () => this.deselectItem());\n }\n\n deselectItem() {\n this.value = '';\n this.requestUpdate();\n }\n\n static get properties() {\n return {\n direction: { type: String, default: 'vertical' }, // vertical, horizontal\n items: { type: Array, initial: () => [] },\n value: { type: String },\n };\n }\n\n render() {\n // eslint-disable-next-line wc/no-self-class\n this.classList.toggle('vertical', this.direction === 'vertical');\n return html`${this.items.map((item, index) => {\n const renderSubMenu = this.value === item;\n const hasSubMenu = item.items?.length > 0;\n return html`\n
\n \n
\n
${item.label}
\n
\n \n
\n \n ${renderSubMenu ? this._renderSubMenu() : ''} `;\n })}`;\n }\n\n _renderSubMenu() {\n // 如果menuitem position relative, 那么absolute的子菜单无法显示。所以使用如下计算\n const currentMenuItem = this.renderRoot.getElementById(\n `menu-item-${this.items.indexOf(this.value)}`,\n );\n const { width, height, top, left } =\n currentMenuItem.getBoundingClientRect(); // sub menu left position\n return html`\n ${this.value?.items?.map(\n subItem => html`\n
\n \n
\n
${subItem.label}
\n `,\n )}\n `;\n }\n\n handleClick(event) {\n event.stopPropagation();\n if (\n event.currentTarget.value.link &&\n event.currentTarget.value.link.includes('://')\n ) {\n window.open(event.currentTarget.value.link);\n } else if (event.currentTarget.value?.items) {\n if (this.value === event.currentTarget.value) {\n this.value = null;\n } else {\n this.value = event.currentTarget.value;\n }\n this.requestUpdate();\n } else {\n this.value = event.currentTarget.value;\n\n // https://lit-element.polymer-project.org/guide/events#working-with-events-and-shadow-dom\n // Bubbles and Composed must be true to buble through shadow DOM\n const selectedEvent = new CustomEvent('selected', {\n detail: {\n value: event.currentTarget.value.link,\n },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(selectedEvent);\n }\n }\n\n updated() {\n const b = this.renderRoot.querySelector('.sub-menu-wrapper');\n if (b) {\n b.scrollIntoView();\n }\n }\n}\n","/* eslint-disable default-param-last */\nfunction getAbsolutePath(path) {\n if (path.includes('//')) {\n return path;\n }\n return new URL(`${window.location.protocol}//${window.location.host}/${path}`)\n .href;\n}\n\nconst callcache = {};\nexport default class KIWIS {\n constructor({\n basePath,\n service = 'kisters',\n type = 'queryServices',\n datasource = 0,\n }) {\n this.basePath = getAbsolutePath(basePath);\n this.service = service;\n this.type = type;\n this.datasource = datasource;\n }\n\n static _handleCSL(val) {\n if (Array.isArray(val)) {\n return val.join(',');\n }\n return val;\n }\n\n /**\n * Retrieves a list of stations with metadata.\n * @param params\n\n * @param {(String | String[] )} params.station_no ,\n * @param {(String | String[] )} params.station_id ,\n * @param {(String | String[] )} params.station_uuid ,\n * @param {(String | String[] )} params.station_name ,\n * @param {(String | String[] )} params.catchment_no ,\n * @param {(String | String[] )} params.catchment_id ,\n * @param {(String | String[] )} params.catchment_name ,\n * @param {(String | String[] )} params.site_no ,\n * @param {(String | String[] )} params.site_id ,\n * @param {(String | String[] )} params.site_uuid ,\n * @param {(String | String[] )} params.site_name ,\n * @param {String} params.stationgroup_id ,\n * @param {(String | String[] )} params.parametertype_id ,\n * @param {(String | String[] )} params.parametertype_name ,\n * @param {(String | String[] )} params.stationparameter_name ,\n * @param {(String | String[] )} params.object_type ,\n * @param {(String | String[] )} params.object_type_shortname ,\n * @param {String} params.bbox comma separated list with four values in order min_x, min_y, max_x, max_y; use 'crs' parameter to choose between local and global coordinates,\n * @param {String} params.fulltext fulltext filter for all station metadata fields,\n * @param {String} params.custattrfilter filter for one ore more custom station attributes in the form 'key1:value1;key2:value2;...'\n\n * @param {String} [params.csvdiv] overwrite the standard CSV delimiter (;) with another symbol in CSV requests,\n * @param {String} [params.crs] select which coordinates should be used for bbox filtering, possible values are 'localxy', 'regional' and 'global'; default is global; KML and LPK format will need global coordinates,\n * @param {String} [params.ca_site_returnfields] selects a set of custom defined site attributes (returnfield 'ca_site' must be active, allows comma separated list),\n * @param {String} [params.ca_sta_returnfields] selects a set of custom defined station attributes (returnfield 'ca_sta' must be active, allows comma separated list),\n * @param {String} [params.custattr_returnfields] DEPRECATED - use ca_sta_returnfields instead,\n * @param {String} [params.jsoncallback] return any JSON request as jsonp with the given function name,\n * @param {String} [params.downloadaszip] provides the result as a ZIP file containing a file in the selected format,\n * @param {String} [params.downloadfilename] sets the file name if downloadaszip=true is set or CSV and Excel downloads are requested, default name is generic per request,\n * @param {String} [params.flatten] if true, the list will be flattened to contain one station per station_id, all parameter and the object_type fields will be concatenated per entry; default is false,\n * @param {String} [params.addlinks] adds links for easier data discovery to the response\n * @param {('station_no'|'station_id'|'station_uuid'|'station_name'|'catchment_no'|'catchment_id'|'catchment_name'|'station_latitude'|'station_longitude'|'station_carteasting'|'station_cartnorthing'|'station_local_x'|'station_local_y'|'site_no'|'site_id'|'site_uuid'|'site_name'|'parametertype_id'|'parametertype_name'|'stationparameter_name'|'stationparameter_no'|'stationparameter_id'|'parametertype_longname'|'object_type'|'object_type_shortname'|'station_georefsystem'|'station_longname'|'station_area_wkt'|'station_area_wkt_org'|'river_id'|'river_name'|'area_id'|'area_name'|'ca_site'|'ca_sta'|'custom_attributes')[]} [returnfields] Returnable fields as optional parameter 'returnfields' (allows comma separated list)\n * \t station_no:\n* \t station_id:\n* \t station_uuid: Unique database independent ID\n* \t station_name:\n* \t catchment_no:\n* \t catchment_id:\n* \t catchment_name:\n* \t station_latitude:\n* \t station_longitude:\n* \t station_carteasting:\n* \t station_cartnorthing:\n* \t station_local_x:\n* \t station_local_y:\n* \t site_no:\n* \t site_id:\n* \t site_uuid: Unique database independent ID\n* \t site_name:\n* \t parametertype_id:\n* \t parametertype_name:\n* \t stationparameter_name:\n* \t stationparameter_no:\n* \t stationparameter_id:\n* \t parametertype_longname:\n* \t object_type: Station type, e.g. 'Surface Water'; Multiple values are concatenated with ; as separator\n* \t object_type_shortname: Station type shortname; Multiple values are concatenated with ; as separator\n* \t station_georefsystem:\n* \t station_longname:\n* \t station_area_wkt: the WKT string of the station extent if set\n* \t station_area_wkt_org: the original WKT string of the station extent if set\n* \t river_id:\n* \t river_name:\n* \t area_id:\n* \t area_name:\n* \t ca_site: returns custom site attributes, optionally use parameter ca_site_returnfields to select specific fields\n* \t ca_sta: returns custom station attributes, optionally use parameter ca_sta_returnfields to select specific fields\n* \t custom_attributes: DEPRECATED - use ca_sta instead\n * @param {String} format Possible formats as parameter [\"ascii\",\"html\",\"csv\",\"tabjson\",\"objson\",\"geojson\",\"kml\",\"lpk\",\"xlsx\"]\n */\n\n getStationList(params = {}, returnfields, format = 'objson') {\n let CSL = [\n 'station_no',\n 'station_id',\n 'station_uuid',\n 'station_name',\n 'catchment_no',\n 'catchment_id',\n 'catchment_name',\n 'site_no',\n 'site_id',\n 'site_uuid',\n 'site_name',\n 'parametertype_id',\n 'parametertype_name',\n 'stationparameter_name',\n 'object_type',\n 'object_type_shortname',\n ];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n if (returnfields) {\n query.returnfields = KIWIS._handleCSL(returnfields);\n }\n\n return this._request('getStationList', query);\n }\n\n /**\n * Retrieves a list of timeseries with metadata.\n * @param params\n\n * @param {(String | String[] )} params.station_no ,\n * @param {(String | String[] )} params.station_id ,\n * @param {(String | String[] )} params.station_name ,\n * @param {(String | String[] )} params.ts_id ,\n * @param {String} params.ts_path The timeseries path as definied in WISKI7 - 'site_no/station_no/stationparameter_no/ts_shortname'; A single path can be used with wildcards, or a comma seperated list of paths without wildcards; using the ts_path filter disables all other filters,\n * @param {(String | String[] )} params.ts_name ,\n * @param {(String | String[] )} params.ts_shortname ,\n * @param {(String | String[] )} params.ts_type_id ,\n * @param {(String | String[] )} params.parametertype_id ,\n * @param {(String | String[] )} params.parametertype_name ,\n * @param {(String | String[] )} params.stationparameter_name ,\n * @param {(String | String[] )} params.stationparameter_no ,\n * @param {(String | String[] )} params.ts_unitname ,\n * @param {String} params.timeseriesgroup_id ,\n * @param {String} params.fulltext fulltext filter for all timeseries metadata fields\n\n * @param {String} [params.csvdiv] overwrite the standard CSV delimiter (;) with another symbol in CSV requests,\n * @param {String} [params.dateformat] the date format that will be returned, see date formats,\n * @param {String} [params.timezone] the time zone that will be returned for all timestamps, any time zone string as understood by Java (e.g. GMT+5, UTC, CET),\n * @param {String} [params.jsoncallback] return any JSON request as jsonp with the given function name,\n * @param {String} [params.downloadaszip] provides the result as a ZIP file containing a file in the selected format,\n * @param {String} [params.downloadfilename] sets the file name if downloadaszip=true is set or CSV and Excel downloads are requested, default name is generic per request,\n * @param {String} [params.ca_site_returnfields] selects a set of custom defined site attributes (returnfield 'ca_site' must be active, allows comma separated list),\n * @param {String} [params.ca_sta_returnfields] selects a set of custom defined station attributes (returnfield 'ca_sta' must be active, allows comma separated list),\n * @param {String} [params.ca_par_returnfields] selects a set of custom defined parameter attributes (returnfield 'ca_par' must be active, allows comma separated list),\n * @param {String} [params.ca_ts_returnfields] selects a set of custom defined parameter attributes (md_returnfield 'ca_ts' must be active, allows comma separated list),\n * @param {String} [params.addlinks] adds links for easier data discovery to the response\n * @param {('station_no'|'station_id'|'station_name'|'station_latitude'|'station_longitude'|'station_carteasting'|'station_cartnorthing'|'station_local_x'|'station_local_y'|'station_georefsystem'|'station_longname'|'ts_id'|'ts_name'|'ts_shortname'|'ts_path'|'ts_type_id'|'ts_type_name'|'parametertype_id'|'parametertype_name'|'stationparameter_name'|'stationparameter_no'|'stationparameter_longname'|'ts_unitname'|'ts_unitsymbol'|'ts_unitname_abs'|'ts_unitsymbol_abs'|'site_no'|'site_id'|'site_name'|'catchment_no'|'catchment_id'|'catchment_name'|'coverage'|'ts_density'|'ts_exchange'|'ts_spacing'|'ts_clientvalue##'|'datacart'|'ca_site'|'ca_sta'|'ca_par'|'ca_ts')[]} [returnfields] Returnable fields as optional parameter 'returnfields' (allows comma separated list)\n * \t station_no:\n* \t station_id:\n* \t station_name:\n* \t station_latitude:\n* \t station_longitude:\n* \t station_carteasting:\n* \t station_cartnorthing:\n* \t station_local_x:\n* \t station_local_y:\n* \t station_georefsystem:\n* \t station_longname:\n* \t ts_id:\n* \t ts_name:\n* \t ts_shortname:\n* \t ts_path: The timeseries path as definied in WISKI7 - 'site_no/station_no/stationparameter_no/ts_shortname'\n* \t ts_type_id:\n* \t ts_type_name:\n* \t parametertype_id:\n* \t parametertype_name:\n* \t stationparameter_name:\n* \t stationparameter_no:\n* \t stationparameter_longname:\n* \t ts_unitname:\n* \t ts_unitsymbol:\n* \t ts_unitname_abs:\n* \t ts_unitsymbol_abs:\n* \t site_no:\n* \t site_id:\n* \t site_name:\n* \t catchment_no:\n* \t catchment_id:\n* \t catchment_name:\n* \t coverage: will add from/to values of the data coverage\n* \t ts_density: will add an estimation of how many values this timeseries theoretically has per year\n* \t ts_exchange: will add the timeseries exchange ID in case it exists\n* \t ts_spacing: value spacing of equidistant timeseries as ISO period\n* \t ts_clientvalue##: timeseries client values reaching from 1-10, e.g. ts_clientvalue4\n* \t datacart: use this fieldname to retrieve the result as a full 'Datacart', other entries will be ignored if existent\n* \t ca_site: returns custom site attributes, optionally use parameter ca_site_returnfields to select specific fields\n* \t ca_sta: returns custom station attributes, optionally use parameter ca_sta_returnfields to select specific fields\n* \t ca_par: returns custom parameter attributes, optionally use parameter ca_par_returnfields to select specific fields\n* \t ca_ts: returns custom timeseries attributes, optionally use parameter ca_ts_returnfields to select specific fields\n * @param {String} format Possible formats as parameter [\"ascii\",\"html\",\"csv\",\"tabjson\",\"objson\",\"geojson\",\"kml\",\"lpk\",\"xlsx\"]\n */\n\n getTimeseriesList(params = {}, returnfields, format = 'objson') {\n let CSL = [\n 'station_no',\n 'station_id',\n 'station_name',\n 'ts_id',\n 'ts_name',\n 'ts_shortname',\n 'ts_type_id',\n 'parametertype_id',\n 'parametertype_name',\n 'stationparameter_name',\n 'stationparameter_no',\n 'ts_unitname',\n ];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n if (returnfields) {\n query.returnfields = KIWIS._handleCSL(returnfields);\n }\n\n return this._request('getTimeseriesList', query);\n }\n\n /**\n * Retrieves timeseries data.\n * @param params\n\n * @param {(String | String[] )} params.ts_id either ts_id or timeseriesgroup_id or ts_path can be used; one or more transformations may be concatenated to each ID with a semicolon, e.g. ts_id=123;factor(3.0),\n * @param {(String | String[] )} params.timeseriesgroup_id either ts_id or timeseriesgroup_id or ts_path can be used,\n * @param {String} params.ts_path the timeseries path according to WISKI7; a single path with placeholders may be used or a comma separated list without placeholders; either ts_id or timeseriesgroup_id or ts_path can be used; one or more transformations may be concatenated to each path with a semicolon, e.g. ts_path=a/b/c/d;factor(3.0),\n * @param {String} params.from see date formats, not providing 'from' delivers the last ts value only,\n * @param {String} params.to see date formats, using yyyy-MM-dd as format includes the complete given day,\n * @param {String} params.period retrieve data for a time period according to ISO format P#Y#M#DT#H#M#S where P just indicates an arbitrary period with the # being integers; the entities are: Y=Year, M=Month, D=Day, T just indicates that smaller entities are included, H=Hour, M=Minute, S=Second; W=Week is also supported but mutually exclusive with D=Day setting; Examples: P3D, P1Y, P1DT12H, PT6H, P1Y6M3DT4H20M30S; all periods are applied by calendar; as an alternative period can be set to 'complete' to return all data,\n * @param {String} params.changedsince see date formats, will return all data of the timeseries changed since the given date (requires active ts edit history in WISKI)\n\n * @param {String} [params.csvdiv] overwrite the standard CSV delimiter (;) with another symbol in CSV requests,\n * @param {String} [params.metadata] set metadata=true to add more metadata fields to responses,\n * @param {String} [params.md_returnfields] specify exactly which metadata fields should be returned; available fields: ts_id, ts_path, ts_name, ts_shortname, station_no, station_id, station_latitude, station_longitude, station_carteasting, station_cartnorthing, station_local_x, station_local_y, station_name, stationparameter_name, stationparameter_no, stationparameter_longname, ts_unitname, ts_unitsymbol, ts_unitname_abs, ts_unitsymbol_abs, parametertype_id, parametertype_name, ts_exchange, ts_precision, station_longname, site_id, site_no, site_name, catchment_id, catchment_no, catchment_name, ensembledate, ensembledispatchinfo, timezone (the timezone of the values), ts_spacing, ts_clientvalue## (client values 1-10), river_name, custom_attributes (deprecated - use ca_sta), ca_site (custom site attributes), ca_sta (custom station attributes), ca_par (custom parameter attributes), ca_ts (custom timeseries attributes),\n * @param {String} [params.custattr_returnfields] DEPRECATED - use ca_sta_returnfields instead,\n * @param {String} [params.ca_site_returnfields] selects a set of custom defined site attributes (md_returnfield 'ca_site' must be active, allows comma separated list),\n * @param {String} [params.ca_sta_returnfields] selects a set of custom defined station attributes (md_returnfield 'ca_sta' must be active, allows comma separated list),\n * @param {String} [params.ca_par_returnfields] selects a set of custom defined parameter attributes (md_returnfield 'ca_par' must be active, allows comma separated list),\n * @param {String} [params.ca_ts_returnfields] selects a set of custom defined timeseries attributes (md_returnfield 'ca_ts' must be active, allows comma separated list),\n * @param {String} [params.dateformat] the date format that will be returned, see date formats,\n * @param {String} [params.timezone] the time zone that will be returned for all timestamps, any time zone string as understood by Java (e.g. GMT+5, UTC, CET) or 'individual' to use individual timeseries timezones,\n * @param {String} [params.crs] set crs=webmercator to retrieve position data in webmercator projection (only applies for esrijson format),\n * @param {String} [params.valueorder] sets the order in which the values will be returned, asc/ascending or desc/descending; default is ascending,\n * @param {String} [params.useprecision] advises KiWIS to use the WISKI precision for value formatting, true or false; default is true,\n * @param {String} [params.valuelocale] sets the locale in which the values will be formatted; default is en; for de, csvDiv will automatically be ';', all json formats will use locale en; only applies if useprecision=true,\n * @param {String} [params.valuesasstring] advises KiWIS to return timeseries values in JSON as string instead of number, true or false; default is false,\n * @param {String} [params.jsoncallback] return any JSON request as jsonp with the given function name,\n * @param {String} [params.downloadaszip] provides the result as a ZIP file containing a file in the selected format,\n * @param {String} [params.downloadfilename] sets the file name if downloadaszip=true is set or CSV and Excel downloads are requested, default name is generic per request,\n * @param {String} [params.getensembletimestampsonly] can only be used if all ts_ids are ensemble timeseries and will return a list of available fore-/hindcast timestamps without values; cannot be used for wml2 format,\n * @param {String} [params.sincefirstchange] only active for the changedsince filter; retrieves all data since the first changed timestamp without gaps\n * @param {('Timestamp'|'Value'|'Interpolation Type'|'Quality Code'|'Quality Code Name'|'Quality Code Description'|'Aggregation Accuracy'|'Absolute Value'|'AV Interpolation Type'|'AV Quality Code'|'AV Quality Code Name'|'AV Quality Code Description'|'Runoff Value'|'RV Interpolation Type'|'RV Quality Code'|'RV Quality Code Name'|'RV Quality Code Description'|'Stagesource Value'|'Occurrance Timestamp'|'Occurrance Count'|'Timeseries Comment'|'Agent Comment'|'Station Comment'|'Parameter Comment'|'Data Comment'|'Release State')[]} [returnfields] Returnable fields as optional parameter 'returnfields' (allows comma separated list)\nPlease note that transformation results will have fixed automatic returnfields.\n * \t Timestamp:\n* \t Value: Default value column if present in the timeseries\n* \t Interpolation Type:\n* \t Quality Code:\n* \t Quality Code Name:\n* \t Quality Code Description:\n* \t Aggregation Accuracy: Percentage of not missing/good values for aggregation timeseries\n* \t Absolute Value: Absolute value column if present in the timeseries\n* \t AV Interpolation Type:\n* \t AV Quality Code:\n* \t AV Quality Code Name:\n* \t AV Quality Code Description:\n* \t Runoff Value: Runoff value column if present in the timeseries\n* \t RV Interpolation Type:\n* \t RV Quality Code:\n* \t RV Quality Code Name:\n* \t RV Quality Code Description:\n* \t Stagesource Value: Stagesource value column if present in the timeseries\n* \t Occurrance Timestamp: Time of occurrance for statistical values (e.g. time of the monthly max)\n* \t Occurrance Count: Occurrance count for statistical values\n* \t Timeseries Comment: Any comments written at the timeseries level, separated with a ';'\n* \t Agent Comment: Any comments written at the agent level, separated with a ';'\n* \t Station Comment: Any comments written at the station level, separated with a ';'\n* \t Parameter Comment: Any comments written at the parameter level, separated with a ';'\n* \t Data Comment: Any comments written at the data level, separated with a ';'\n* \t Release State: Any release states written at the data level, separated with a ';'\n * @param {String} format Possible formats as parameter [\"ascii\",\"html\",\"csv\",\"dajson\",\"esrijson\",\"wml2\",\"zrxp\",\"xlsx\"]\n */\n\n getTimeseriesValues(params = {}, returnfields, format = 'objson') {\n let CSL = ['ts_id', 'timeseriesgroup_id'];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n if (returnfields) {\n query.returnfields = KIWIS._handleCSL(returnfields);\n }\n\n return this._request('getTimeseriesValues', query, true);\n }\n\n /**\n * Retrieves a layer of timeseries values for a given date including location data.\n * @param params\n\n * @param {(String | String[] )} params.ts_id either ts_id, ts_path, timeseriesgroup_id or bbox can be used,\n * @param {String} params.ts_path the timeseries path according to WISKI7; a single path with placeholders may be used or a comma separated list without placeholders; either ts_id, ts_path, timeseriesgroup_id or bbox can be used,\n * @param {(String | String[] )} params.timeseriesgroup_id either ts_id, ts_path, timeseriesgroup_id or bbox can be used,\n * @param {String} params.bbox either ts_id, ts_path, timeseriesgroup_id or bbox can be used; comma separated list with four values in order min_x, min_y, max_x, max_y; use 'crs' parameter to choose between local and global coordinates; fields stationparameter_no and ts_shortname are required for bbox; the function will select 0 or 1 timeseries per station in the area according to filters,\n * @param {(String | String[] )} params.stationparameter_no with bbox filter only; if multiple values are given the order will be considered for timeseries selection,\n * @param {(String | String[] )} params.ts_shortname with bbox filter only; if multiple values are given the order will be considered for timeseries selection,\n * @param {String} params.date the date to request values for, see date formats,\n * @param {String} params.valuecolumn the value column to use for output; valid values are: default, absolute, runoff, stagesource,\n * @param {(String | String[] )} params.site_no can be used to additionally filter for sites\n\n * @param {String} [params.csvdiv] overwrite the standard CSV delimiter (;) with another symbol in CSV requests,\n * @param {String} [params.metadata] set metadata=true to add more metadata fields to responses,\n * @param {String} [params.md_returnfields] specify exactly which metadata fields should be returned; available fields: ts_id, ts_path, ts_name, ts_shortname, station_no, station_id, station_name, stationparameter_name, stationparameter_no, stationparameter_longname, ts_unitname, ts_unitsymbol, ts_unitname_abs, ts_unitsymbol_abs, parametertype_id, parametertype_name, station_longname, custom_attributes (deprecated - use ca_sta), station_count (adds a field containing the number of duplicate stations per entry), aggaccuracy_percent (adds percentage of not missing/good values for aggregation timeseries), timezone (the timezone of the values), group_item_order (only for one group), site_id, site_no, site_name, catchment_id, catchment_no, catchment_name, object_type, object_type_shortname, ts_clientvalue## (client values 1-10), ca_site (custom site attributes), ca_sta (custom station attributes), ca_par (custom parameter attributes), ca_ts (custom timeseries attributes),\n * @param {String} [params.custattr_returnfields] DEPRECATED - use ca_sta_returnfields instead,\n * @param {String} [params.ca_site_returnfields] selects a set of custom defined site attributes (md_returnfield 'ca_site' must be active, allows comma separated list),\n * @param {String} [params.ca_sta_returnfields] selects a set of custom defined station attributes (md_returnfield 'ca_sta' must be active, allows comma separated list),\n * @param {String} [params.ca_par_returnfields] selects a set of custom defined parameter attributes (md_returnfield 'ca_par' must be active, allows comma separated list),\n * @param {String} [params.ca_ts_returnfields] selects a set of custom defined timeseries attributes (md_returnfield 'ca_ts' must be active, allows comma separated list),\n * @param {String} [params.dateformat] the date format that will be returned, see date formats,\n * @param {String} [params.timezone] the time zone that will be returned for all timestamps, any time zone string as understood by Java (e.g. GMT+5, UTC, CET) or 'individual' to use individual timeseries timezones,\n * @param {String} [params.crs] set to 'localxy', 'regional' or 'global' to use the local, regional or global station reference system, set to 'webmercator' to retrieve position data in webmercator projection (only applies for esrijson format and uses global station coordinates for calculation),\n * @param {String} [params.orderby] sorts the result set by the given field, this can be helpful e.g. for drawing order in a map; available fields: value, timestamp, station_name, station_no, group_item_order (only with one group),\n * @param {String} [params.orderdir] sets the sort direction, only usable together with 'orderby'; possible values: asc, desc; default is ascending,\n * @param {String} [params.invalidperiod] sets the deviation period between requested and returned timestamp to determine which values will be invalidated, must be used together with 'invalidvalue'; can be used like the normal period parameter for other requests,\n * @param {String} [params.invalidvalue] sets the value that will be inserted for invalids, must be used together with 'invalidperiod'; any numeric value can be used,\n * @param {String} [params.showemptytimeseries] sets if timeseries without a value should be removed or shown in the layer; default is true,\n * @param {String} [params.hidetsid] sets if timeseries ids should be hidden or shown in the layer; default is false; DEPRECATED - use returnfields instead,\n * @param {String} [params.useprecision] advises KiWIS to use the WISKI precision for value formatting, true or false; default is true,\n * @param {String} [params.valuelocale] sets the locale in which the values will be formatted; default is en; for de, csvDiv will automatically be ';', all json formats will use locale en; only applies if useprecision=true,\n * @param {String} [params.valuesasstring] advises KiWIS to return timeseries values in JSON as string instead of number, true or false; default is false,\n * @param {String} [params.jsoncallback] return any JSON request as jsonp with the given function name,\n * @param {String} [params.downloadaszip] provides the result as a ZIP file containing a file in the selected format,\n * @param {String} [params.downloadfilename] sets the file name if downloadaszip=true is set or CSV and Excel downloads are requested, default name is generic per request\n * @param {('ts_id'|'timestamp'|'ts_value'|'req_timestamp'|'ts_intpol'|'q_code'|'q_code_name'|'q_code_desc'|'sta_location')[]} [returnfields] Returnable fields as optional parameter 'returnfields' (allows comma separated list)\n * \t ts_id:\n* \t timestamp:\n* \t ts_value:\n* \t req_timestamp:\n* \t ts_intpol: Interpolation Type\n* \t q_code: Quality Code\n* \t q_code_name: Quality Code Name\n* \t q_code_desc: Quality Code Description\n* \t sta_location: Station coordinates with consideration of the crs paramter\n * @param {String} format Possible formats as parameter [\"ascii\",\"html\",\"csv\",\"objson\",\"esrijson\",\"geojson\",\"xlsx\"]\n */\n\n getTimeseriesValueLayer(params = {}, returnfields, format = 'objson') {\n let CSL = [\n 'ts_id',\n 'timeseriesgroup_id',\n 'stationparameter_no',\n 'ts_shortname',\n 'site_no',\n ];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n if (returnfields) {\n query.returnfields = KIWIS._handleCSL(returnfields);\n }\n\n return this._request('getTimeseriesValueLayer', query, true);\n }\n\n /**\n * Retrieves a list of sites with metadata.\n * @param params\n\n * @param {(String | String[] )} params.site_no ,\n * @param {(String | String[] )} params.site_id ,\n * @param {(String | String[] )} params.site_uuid ,\n * @param {(String | String[] )} params.site_name ,\n * @param {(String | String[] )} params.parametertype_id ,\n * @param {(String | String[] )} params.parametertype_name ,\n * @param {(String | String[] )} params.stationparameter_name ,\n * @param {String} params.bbox comma separated list with four values in order min_x, min_y, max_x, max_y; use 'crs' parameter to choose between local and global coordinates\n\n * @param {String} [params.csvdiv] overwrite the standard CSV delimiter (;) with another symbol in CSV requests,\n * @param {String} [params.crs] select which coordinates should be used for bbox filtering, possible values are 'local' and 'global'; default is global,\n * @param {String} [params.custattr_returnfields] DEPRECATED - use ca_site_returnfields instead,\n * @param {String} [params.ca_site_returnfields] selects a set of custom defined site attributes (md_returnfield 'ca_site' must be active, allows comma separated list),\n * @param {String} [params.jsoncallback] return any JSON request as jsonp with the given function name,\n * @param {String} [params.downloadaszip] provides the result as a ZIP file containing a file in the selected format,\n * @param {String} [params.downloadfilename] sets the file name if downloadaszip=true is set or CSV and Excel downloads are requested, default name is generic per request,\n * @param {String} [params.addlinks] adds links for easier data discovery to the response\n * @param {('site_no'|'site_id'|'site_uuid'|'site_name'|'site_latitude'|'site_longitude'|'site_carteasting'|'site_cartnorthing'|'site_type_name'|'site_type_shortname'|'parametertype_id'|'parametertype_name'|'stationparameter_name'|'site_georefsystem'|'site_area_wkt'|'site_area_wkt_org'|'ca_site'|'custom_attributes')[]} [returnfields] Returnable fields as optional parameter 'returnfields' (allows comma separated list)\n * \t site_no:\n* \t site_id:\n* \t site_uuid: Unique database independent ID\n* \t site_name:\n* \t site_latitude:\n* \t site_longitude:\n* \t site_carteasting:\n* \t site_cartnorthing:\n* \t site_type_name:\n* \t site_type_shortname:\n* \t parametertype_id:\n* \t parametertype_name:\n* \t stationparameter_name:\n* \t site_georefsystem:\n* \t site_area_wkt: the WKT string of the site extent if set\n* \t site_area_wkt_org: the original WKT string of the site extent if set\n* \t ca_site: returns custom site attributes, optionally use parameter ca_site_returnfields to select specific fields\n* \t custom_attributes: DEPRECATED - use ca_site instead\n * @param {String} format Possible formats as parameter [\"ascii\",\"html\",\"csv\",\"tabjson\",\"objson\",\"geojson\",\"xlsx\"]\n */\n\n getSiteList(params = {}, returnfields, format = 'objson') {\n let CSL = [\n 'site_no',\n 'site_id',\n 'site_uuid',\n 'site_name',\n 'parametertype_id',\n 'parametertype_name',\n 'stationparameter_name',\n ];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n if (returnfields) {\n query.returnfields = KIWIS._handleCSL(returnfields);\n }\n\n return this._request('getSiteList', query);\n }\n\n /**\n * Retrieves a list of parameters available at sites and/or stations.\n * @param params\n\n * @param {(String | String[] )} params.station_no ,\n * @param {(String | String[] )} params.station_id ,\n * @param {(String | String[] )} params.station_name ,\n * @param {(String | String[] )} params.site_no ,\n * @param {(String | String[] )} params.site_id ,\n * @param {(String | String[] )} params.site_name ,\n * @param {(String | String[] )} params.stationparameter_id ,\n * @param {(String | String[] )} params.stationparameter_name ,\n * @param {(String | String[] )} params.stationparameter_no ,\n * @param {(String | String[] )} params.stationparameter_longname ,\n * @param {(String | String[] )} params.parametertype_id ,\n * @param {(String | String[] )} params.parametertype_name ,\n * @param {(String | String[] )} params.parametertype_longname\n\n * @param {String} [params.csvdiv] overwrite the standard CSV delimiter (;) with another symbol in CSV requests,\n * @param {String} [params.jsoncallback] return any JSON request as jsonp with the given function name,\n * @param {String} [params.ca_par_returnfields] selects a set of custom defined parameter attributes (returnfield 'ca_par' must be active, allows comma separated list),\n * @param {String} [params.downloadaszip] provides the result as a ZIP file containing a file in the selected format,\n * @param {String} [params.downloadfilename] sets the file name if downloadaszip=true is set or CSV and Excel downloads are requested, default name is generic per request\n * @param {('station_no'|'station_id'|'station_name'|'site_no'|'site_id'|'site_name'|'stationparameter_id'|'stationparameter_name'|'stationparameter_no'|'stationparameter_longname'|'parametertype_id'|'parametertype_name'|'parametertype_longname'|'parametertype_shortunitname'|'parametertype_unitname'|'ca_par')[]} [returnfields] Returnable fields as optional parameter 'returnfields' (allows comma separated list)\n * \t station_no:\n* \t station_id:\n* \t station_name:\n* \t site_no:\n* \t site_id:\n* \t site_name:\n* \t stationparameter_id:\n* \t stationparameter_name:\n* \t stationparameter_no:\n* \t stationparameter_longname:\n* \t parametertype_id:\n* \t parametertype_name:\n* \t parametertype_longname:\n* \t parametertype_shortunitname:\n* \t parametertype_unitname:\n* \t ca_par: custom parameter attributes\n * @param {String} format Possible formats as parameter [\"ascii\",\"html\",\"csv\",\"tabjson\",\"objson\",\"xlsx\"]\n */\n\n getParameterList(params = {}, returnfields, format = 'objson') {\n let CSL = [\n 'station_no',\n 'station_id',\n 'station_name',\n 'site_no',\n 'site_id',\n 'site_name',\n 'stationparameter_id',\n 'stationparameter_name',\n 'stationparameter_no',\n 'stationparameter_longname',\n 'parametertype_id',\n 'parametertype_name',\n 'parametertype_longname',\n ];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n if (returnfields) {\n query.returnfields = KIWIS._handleCSL(returnfields);\n }\n\n return this._request('getParameterList', query);\n }\n\n /**\n * Retrieves the system defined parameter type list.\n * @param params\n\n * @param {(String | String[] )} params.parametertype_id ,\n * @param {(String | String[] )} params.parametertype_name\n\n * @param {String} [params.csvdiv] overwrite the standard CSV delimiter (;) with another symbol in CSV requests,\n * @param {String} [params.jsoncallback] return any JSON request as jsonp with the given function name,\n * @param {String} [params.downloadaszip] provides the result as a ZIP file containing a file in the selected format,\n * @param {String} [params.downloadfilename] sets the file name if downloadaszip=true is set or CSV and Excel downloads are requested, default name is generic per request\n\n\n * @param {String} format Possible formats as parameter [\"ascii\",\"html\",\"csv\",\"tabjson\",\"objson\",\"xlsx\"]\n */\n\n getParameterTypeList(params = {}, format = 'objson') {\n let CSL = ['parametertype_id', 'parametertype_name'];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n return this._request('getParameterTypeList', query);\n }\n\n /**\n * Retrieves a timeseries type list.\n * @param params\n\n * @param {(String | String[] )} params.ts_type_id ,\n * @param {(String | String[] )} params.ts_shortname ,\n * @param {(String | String[] )} params.ts_name\n\n * @param {String} [params.csvdiv] overwrite the standard CSV delimiter (;) with another symbol in CSV requests,\n * @param {String} [params.jsoncallback] return any JSON request as jsonp with the given function name,\n * @param {String} [params.downloadaszip] provides the result as a ZIP file containing a file in the selected format,\n * @param {String} [params.downloadfilename] sets the file name if downloadaszip=true is set or CSV and Excel downloads are requested, default name is generic per request\n * @param {('ts_type_id'|'ts_type_name'|'ts_name'|'ts_shortname')[]} [returnfields] Returnable fields as optional parameter 'returnfields' (allows comma separated list)\n * \t ts_type_id:\n* \t ts_type_name:\n* \t ts_name:\n* \t ts_shortname:\n * @param {String} format Possible formats as parameter [\"ascii\",\"html\",\"csv\",\"tabjson\",\"objson\",\"xlsx\"]\n */\n\n getTimeseriesTypeList(params = {}, returnfields, format = 'objson') {\n let CSL = ['ts_type_id', 'ts_shortname', 'ts_name'];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n if (returnfields) {\n query.returnfields = KIWIS._handleCSL(returnfields);\n }\n\n return this._request('getTimeseriesTypeList', query);\n }\n\n /**\n * Retrieves a list of timeseries and station groups.\n * @param params\n\n * @param {(String | String[] )} params.group_name ,\n * @param {String} params.group_type valid values are 'station', 'parameter', 'timeseries' and 'timeseries_dynamic',\n * @param {(String | String[] )} params.supergroup_name\n\n * @param {String} [params.csvdiv] overwrite the standard CSV delimiter (;) with another symbol in CSV requests,\n * @param {String} [params.jsoncallback] return any JSON request as jsonp with the given function name,\n * @param {String} [params.downloadaszip] provides the result as a ZIP file containing a file in the selected format,\n * @param {String} [params.downloadfilename] sets the file name if downloadaszip=true is set or CSV and Excel downloads are requested, default name is generic per request,\n * @param {String} [params.ca_group_returnfields] selects a set of custom defined group attributes (md_returnfield 'ca_group' must be active, allows comma separated list),\n * @param {String} [params.addlinks] adds links for easier data discovery to the response\n * @param {('group_name'|'group_id'|'supergroup_id'|'supergroup_name'|'group_type'|'group_remark'|'ca_group')[]} [returnfields] Returnable fields as optional parameter 'returnfields' (allows comma separated list)\n * \t group_name:\n* \t group_id:\n* \t supergroup_id:\n* \t supergroup_name:\n* \t group_type:\n* \t group_remark:\n* \t ca_group: returns custom group attributes, optionally use parameter ca_group_returnfields to select specific fields\n * @param {String} format Possible formats as parameter [\"ascii\",\"html\",\"csv\",\"tabjson\",\"objson\",\"xlsx\"]\n */\n\n getGroupList(params = {}, returnfields, format = 'objson') {\n let CSL = ['group_name', 'supergroup_name'];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n if (returnfields) {\n query.returnfields = KIWIS._handleCSL(returnfields);\n }\n\n return this._request('getGroupList', query);\n }\n\n /**\n * Retrieves a graph image of timeseries data.\n * @param params\n\n * @param {(String | String[] )} params.ts_id either ts_id or ts_path can be used,\n * @param {(String | String[] )} params.ext_ts_id additional ts ids for usage with the placeholder mechanism in templates; either ext_ts_id or ext_ts_path can be used,\n * @param {(String | String[] )} params.ts_path either ts_id or ts_path can be used,\n * @param {(String | String[] )} params.ext_ts_path additional ts paths for usage with the placeholder mechanism in templates; either ext_ts_id or ext_ts_path can be used,\n * @param {String} params.from see date formats,\n * @param {String} params.to see date formats, using yyyy-MM-dd as format includes the complete given day,\n * @param {String} params.period retrieve a graph for a time period according to ISO format P#Y#M#DT#H#M#S where P just indicates an arbitrary period with the # being integers; the entities are: Y=Year, M=Month, D=Day, T just indicates that smaller entities are included, H=Hour, M=Minute, S=Second; W=Week is also supported but mutually exclusive with D=Day setting; Examples: P3D, P1Y, P1DT12H, PT6H, P1Y6M3DT4H20M30S; all periods are applied by calendar; as an alternative period can be set to 'complete' to return all data,\n * @param {String} params.width in pixels, 100 - 2000,\n * @param {String} params.height in pixels, 50 - 1500,\n * @param {String} params.template use a stored template for graph design,\n * @param {String} params.templategroup optionally select a group (sub-directory) for a stored template,\n * @param {(String | String[] )} params.showgroups select specific object groups to be visible in the graph; only applies for template graphs and the template must have groups specified,\n * @param {String} params.hidelegend true|false - overwrites or sets the hide-legend flag for template graphs,\n * @param {String} params.overlayinterval set the overlay interval to year, month, week, day or halfyear; only applies for template graphs where the template contains overlaid setting for one timeseries,\n * @param {(String | String[] )} params.overlayslices select the slices that will be shown, e.g. 0,1,2 will show the first three years if interval is year; only applies for template graphs where the template contains overlaid setting for one timeseries\n\n * @param {String} [params.renderer] supported values: XYTsRenderer, XYAreaRenderer, XYBarRenderer, XYLineAndShapeRenderer, XYStepAreaRenderer, YIntervalRenderer; does not apply for template graphs,\n * @param {String} [params.timezone] the time zone that will be used in graph, any time zone string as understood by Java (e.g. GMT+5, UTC, CET); if a zone is already defined in a template, it will NOT be overriden,\n * @param {String} [params.downloadaszip] provides the result as a ZIP file containing a file in the selected format,\n * @param {String} [params.downloadfilename] sets the file name if downloadaszip=true is set, default name is generic per request\n\n\n * @param {String} format Possible formats as parameter [\"jpg\",\"png\"]\n */\n\n getGraph(params = {}, format = 'objson') {\n let CSL = [\n 'ts_id',\n 'ext_ts_id',\n 'ts_path',\n 'ext_ts_path',\n 'showgroups',\n 'overlayslices',\n ];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n return this._request('getGraph', query);\n }\n\n /**\n * Retrieves a graph image of timeseries data based on stations with a template.\n * @param params\n\n * @param {(String | String[] )} params.station_id ,\n * @param {String} params.from see date formats,\n * @param {String} params.to see date formats, using yyyy-MM-dd as format includes the complete given day,\n * @param {String} params.period retrieve a graph for a time period according to ISO format P#Y#M#DT#H#M#S where P just indicates an arbitrary period with the # being integers; the entities are: Y=Year, M=Month, D=Day, T just indicates that smaller entities are included, H=Hour, M=Minute, S=Second; W=Week is also supported but mutually exclusive with D=Day setting; Examples: P3D, P1Y, P1DT12H, PT6H, P1Y6M3DT4H20M30S; all periods are applied by calendar; as an alternative period can be set to 'complete' to return all data,\n * @param {String} params.width in pixels, 100 - 2000,\n * @param {String} params.height in pixels, 50 - 1500,\n * @param {String} params.template select a stored template for station graph design, mandatory,\n * @param {String} params.templategroup optionally select a group (sub-directory) for a stored template,\n * @param {(String | String[] )} params.showgroups select specific groups to be visible in the graph; only applies for template graphs and the template must have groups specified,\n * @param {String} params.hidelegend true|false - overwrites or sets the hide-legend flag for template graphs,\n * @param {String} params.overlayinterval set the overlay interval to year, month, week, day or halfyear; only applies for template graphs where the template contains overlaid setting for one timeseries,\n * @param {(String | String[] )} params.overlayslices select the slices that will be shown, e.g. 0,1,2 will show the first three years if interval is year; only applies for template graphs where the template contains overlaid setting for one timeseries\n\n * @param {String} [params.timezone] the time zone that will be used in graph, any time zone string as understood by Java (e.g. GMT+5, UTC, CET); if a zone is already defined in a template, it will NOT be overriden,\n * @param {String} [params.downloadaszip] provides the result as a ZIP file containing a file in the selected format,\n * @param {String} [params.downloadfilename] sets the file name if downloadaszip=true is set, default name is generic per request\n\n\n * @param {String} format Possible formats as parameter [\"jpg\",\"png\"]\n */\n\n getStationGraph(params = {}, format = 'objson') {\n let CSL = ['station_id', 'showgroups', 'overlayslices'];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n return this._request('getStationGraph', query);\n }\n\n /**\n * Retrieves a list of stored graph templates with metadata.\n * @param params\n\n * @param {String} params.templategroup optionally select a group (sub-directory) for stored templates\n\n * @param {String} [params.csvdiv] overwrite the standard CSV delimiter (;) with another symbol in CSV requests,\n * @param {String} [params.jsoncallback] return any JSON request as jsonp with the given function name\n\n\n * @param {String} format Possible formats as parameter [\"ascii\",\"html\",\"csv\",\"tabjson\",\"xlsx\"]\n */\n\n getGraphTemplateList(params = {}, format = 'objson') {\n let CSL = [];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n return this._request('getGraphTemplateList', query);\n }\n\n /**\n * Retrieves a list of catchments with metadata.\n * @param params\n\n * @param {(String | String[] )} params.catchment_no ,\n * @param {(String | String[] )} params.catchment_id ,\n * @param {(String | String[] )} params.catchment_name ,\n * @param {(String | String[] )} params.catchment_parent_id\n\n * @param {String} [params.csvdiv] overwrite the standard CSV delimiter (;) with another symbol in CSV requests,\n * @param {String} [params.jsoncallback] return any JSON request as jsonp with the given function name,\n * @param {String} [params.downloadaszip] provides the result as a ZIP file containing a file in the selected format,\n * @param {String} [params.downloadfilename] sets the file name if downloadaszip=true is set, default name is generic per request,\n * @param {String} [params.addlinks] adds links for easier data discovery to the response\n * @param {('catchment_no'|'catchment_id'|'catchment_name'|'catchment_parent_id'|'catchment_size'|'catchment_area_wkt'|'catchment_area_wkt_org')[]} [returnfields] Returnable fields as optional parameter 'returnfields' (allows comma separated list)\n * \t catchment_no:\n* \t catchment_id:\n* \t catchment_name:\n* \t catchment_parent_id:\n* \t catchment_size:\n* \t catchment_area_wkt: the WKT string of the catchment polygon if set\n* \t catchment_area_wkt_org: the original WKT string of the site extent if set\n * @param {String} format Possible formats as parameter [\"ascii\",\"html\",\"csv\",\"tabjson\",\"objson\",\"xlsx\"]\n */\n\n getCatchmentList(params = {}, returnfields, format = 'objson') {\n let CSL = [\n 'catchment_no',\n 'catchment_id',\n 'catchment_name',\n 'catchment_parent_id',\n ];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n if (returnfields) {\n query.returnfields = KIWIS._handleCSL(returnfields);\n }\n\n return this._request('getCatchmentList', query);\n }\n\n /**\n * Retrieves a list of rivers with metadata.\n * @param params\n\n * @param {(String | String[] )} params.river_id ,\n * @param {(String | String[] )} params.river_name\n\n * @param {String} [params.csvdiv] overwrite the standard CSV delimiter (;) with another symbol in CSV requests,\n * @param {String} [params.jsoncallback] return any JSON request as jsonp with the given function name,\n * @param {String} [params.downloadaszip] provides the result as a ZIP file containing a file in the selected format,\n * @param {String} [params.downloadfilename] sets the file name if downloadaszip=true is set or CSV and Excel downloads are requested, default name is generic per request\n * @param {('river_id'|'river_name')[]} [returnfields] Returnable fields as optional parameter 'returnfields' (allows comma separated list)\n * \t river_id:\n* \t river_name:\n * @param {String} format Possible formats as parameter [\"ascii\",\"html\",\"csv\",\"tabjson\",\"objson\",\"xlsx\"]\n */\n\n getRiverList(params = {}, returnfields, format = 'objson') {\n let CSL = ['river_id', 'river_name'];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n if (returnfields) {\n query.returnfields = KIWIS._handleCSL(returnfields);\n }\n\n return this._request('getRiverList', query);\n }\n\n /**\n * Retrieves a list of WISKI color classifications.\n * @param params\n\n * @param {String} params.name The stationClassification name,\n * @param {String} params.parameterType The parameter type,\n * @param {String} params.classificationType The stationClassification type\n\n\n\n * @param {String} format Possible formats as parameter [\"json\"]\n */\n\n getColorClassifications(params = {}, format = 'objson') {\n let CSL = [];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n return this._request('getColorClassifications', query);\n }\n\n /**\n * Retrieves a list of timeseries release states.\n * @param params\n\n * @param {(String | String[] )} params.ts_id either ts_id or ts_path can be used,\n * @param {(String | String[] )} params.ts_path the timeseries path according to WISKI7; either ts_id or ts_path can be used,\n * @param {String} params.from see date formats,\n * @param {String} params.to see date formats, using yyyy-MM-dd as format includes the complete given day,\n * @param {String} params.period retrieve data for a time period according to ISO format P#Y#M#DT#H#M#S where P just indicates an arbitrary period with the # being integers; the entities are: Y=Year, M=Month, D=Day, T just indicates that smaller entities are included, H=Hour, M=Minute, S=Second; W=Week is also supported but mutually exclusive with D=Day setting; Examples: P3D, P1Y, P1DT12H, PT6H, P1Y6M3DT4H20M30S; all periods are applied by calendar\n\n\n\n * @param {String} format Possible formats as parameter [\"json\"]\n */\n\n getTimeseriesReleaseStateList(params = {}, format = 'objson') {\n let CSL = ['ts_id', 'ts_path'];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n return this._request('getTimeseriesReleaseStateList', query);\n }\n\n /**\n * Retrieves a list of timeseries ensembles with values for one or more timeseries.\n * @param params\n\n * @param {(String | String[] )} params.ts_id either ts_id, ts_path or timeseriesgroup_id can be used,\n * @param {String} params.ts_path the timeseries path according to WISKI7; a single path with placeholders may be used or a comma separated list without placeholders; either ts_id, ts_path or timeseriesgroup_id can be used,\n * @param {(String | String[] )} params.timeseriesgroup_id either ts_id, ts_path or timeseriesgroup_id can be used,\n * @param {String} params.from see date formats,\n * @param {String} params.to see date formats, using yyyy-MM-dd as format includes the complete given day,\n * @param {String} params.period retrieve data for a time period according to ISO format P#Y#M#DT#H#M#S where P just indicates an arbitrary period with the # being integers; the entities are: Y=Year, M=Month, D=Day, T just indicates that smaller entities are included, H=Hour, M=Minute, S=Second; W=Week is also supported but mutually exclusive with D=Day setting; Examples: P3D, P1Y, P1DT12H, PT6H, P1Y6M3DT4H20M30S; all periods are applied by calendar,\n * @param {String} params.ensembledispatchinfo the dispatch info for which ensembles should be returned\n\n * @param {String} [params.downloadaszip] provides the result as a ZIP file containing a file in the selected format,\n * @param {String} [params.downloadfilename] sets the file name if downloadaszip=true is set or CSV and Excel downloads are requested, default name is generic per request,\n * @param {String} [params.dateformat] the date format that will be returned, see date formats,\n * @param {String} [params.timezone] the time zone that will be returned for all timestamps, any time zone string as understood by Java (e.g. GMT+5, UTC, CET),\n * @param {String} [params.useprecision] advises KiWIS to use the WISKI precision for value formatting, true or false; default is true\n\n\n * @param {String} format Possible formats as parameter [\"json\"]\n */\n\n getTimeseriesEnsembleValues(params = {}, format = 'objson') {\n let CSL = ['ts_id', 'timeseriesgroup_id'];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n return this._request('getTimeseriesEnsembleValues', query);\n }\n\n getUrl(params = {}, returnfields, format = 'objson') {\n let CSL = ['group_name', 'supergroup_name'];\n CSL = CSL.concat([]);\n CSL.forEach(key => {\n if (params[key]) {\n params[key] = KIWIS._handleCSL(params[key]);\n }\n });\n const query = { format, ...params };\n\n if (returnfields) {\n query.returnfields = KIWIS._handleCSL(returnfields);\n }\n\n const url = new URL(this.basePath);\n url.search = new URLSearchParams({\n request: 'getTimeseriesValues',\n service: this.service,\n type: this.type,\n datasource: this.datasource,\n ...query,\n }).toString();\n return url.toString();\n }\n\n _request(request, query, nocache) {\n const url = new URL(this.basePath);\n url.search = new URLSearchParams({\n request,\n service: this.service,\n type: this.type,\n datasource: this.datasource,\n ...query,\n }).toString();\n const urlKey = url.toString();\n if (callcache[urlKey] && !nocache) {\n return callcache[urlKey];\n }\n const req = fetch(urlKey).then(resp => {\n if (query.format === 'objson' || query.format === 'json') {\n return resp.json();\n }\n return resp.text();\n });\n callcache[urlKey] = req;\n return req;\n }\n}\n","/* eslint-disable camelcase */\nimport { KiwisConfig } from './KiwisConfig';\n\nexport default class KiwisHelper {\n /** Detect and convert relative path to absolute path\n * @param windowLocation is required if a realtive path is supplied\n */\n public static resolveUrl(\n kiwisCfg: KiwisConfig,\n windowLocation?: Object,\n ): string {\n /** Catch absolute path */\n if (\n kiwisCfg.basePath &&\n kiwisCfg.basePath.includes('//') &&\n !kiwisCfg.basePath.startsWith('//')\n )\n return kiwisCfg.basePath;\n /** Build from relative path and location */\n if (kiwisCfg.basePath && windowLocation) {\n return this._buildAbsPath(kiwisCfg.basePath, windowLocation);\n }\n throw Error(\"Can't build kiwis path\");\n }\n\n static _buildAbsPath(relPath, loc): string {\n /** Absolute path without specified protocol (http and https) */\n if (relPath.startsWith('//')) return `${loc.protocol}${relPath}`;\n /** Relative path handling */\n if (relPath.startsWith('/')) return `${loc.origin}${relPath}`;\n return `${loc.origin}/${relPath}`;\n }\n\n public static buildTsPath(station, ts_shortname) {\n if (ts_shortname)\n return `${station.site_no}/${station.station_no}/${station.stationparameter_no}/${ts_shortname}`;\n return `${station.site_no}/${station.station_no}/${station.stationparameter_no}/${station.ts_shortname}`;\n }\n}\n","import deCommon from './de/common.json';\nimport deKiwis from './de/kiwis.json';\nimport enCommon from './en/common.json';\nimport enKiwis from './en/kiwis.json';\nimport isCommon from './is/common.json';\nimport isKiwis from './is/kiwis.json';\nimport frCommon from './fr/common.json';\nimport frKiwis from './fr/kiwis.json';\nimport zhCommon from './zh/common.json';\n\nexport default {\n de: {\n common: deCommon,\n kiwis: deKiwis,\n },\n en: {\n common: enCommon,\n kiwis: enKiwis,\n },\n is: {\n common: isCommon,\n kiwis: isKiwis,\n },\n fr: {\n common: frCommon,\n kiwis: frKiwis,\n },\n zh: {\n common: zhCommon,\n },\n};\n","import { css } from 'lit';\n\n// language=CSS\nexport default css`\n :host {\n display: block;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n }\n\n .header {\n flex: 0 0 50px;\n padding: 0 20px;\n line-height: 20px;\n font-size: 0.8em;\n color: gray;\n max-height: 100px;\n min-height: 35px;\n border-bottom: 1px solid lightgray;\n display: flex;\n }\n\n .title {\n font-size: 1.5em;\n line-height: 50px;\n }\n\n .header-center {\n flex: 1;\n }\n\n .customAttributes {\n margin-top: 15px;\n font-size: 1.25em;\n }\n\n .adminStatus {\n color: red;\n font-weight: bold;\n }\n\n .adminBemerkung {\n margin-left: 5px;\n }\n\n .actions {\n display: flex;\n justify-content: flex-end;\n }\n\n .containerNode {\n height: calc(100% - 50px);\n display: flex;\n flex-direction: row;\n }\n\n ki-icon-btn {\n margin: 5px;\n box-shadow: none;\n }\n\n ki-icon-btn.selected {\n fill: white;\n background: var(--theme-color-secondary, #0056a0);\n }\n\n .chart-wrapper {\n flex: 1;\n overflow: hidden;\n }\n\n .table-wrapper {\n flex: 0 30%;\n border-left: lightgray 1px solid;\n height: 100%;\n overflow: auto;\n }\n\n .hidden {\n display: none;\n }\n\n ki-ts-graph {\n height: 100%;\n }\n\n .header .separator {\n font-size: 1.2em;\n font-weight: 600;\n padding: 0px 0.5em;\n color: rgb(204, 204, 204);\n line-height: 50px;\n }\n\n ki-time-range-picker {\n height: 50px;\n }\n`;\n","const hclocales = {\n es: {\n loading: 'Cargando...',\n months: [\n 'Enero',\n 'Febrero',\n 'Marzo',\n 'Abril',\n 'Mayo',\n 'Junio',\n 'Julio',\n 'Agosto',\n 'Septiembre',\n 'Octubre',\n 'Noviembre',\n 'Diciembre',\n ],\n weekdays: [\n 'Domingo',\n 'Lunes',\n 'Martes',\n 'Miércoles',\n 'Jueves',\n 'Viernes',\n 'Sábado',\n ],\n shortMonths: [\n 'Ene',\n 'Feb',\n 'Mar',\n 'Abr',\n 'May',\n 'Jun',\n 'Jul',\n 'Ago',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dic',\n ],\n exportButtonTitle: 'Exportar',\n printButtonTitle: 'Importar',\n rangeSelectorFrom: 'Desde',\n rangeSelectorTo: 'Hasta',\n rangeSelectorZoom: 'Período',\n downloadPNG: 'Descargar imagen PNG',\n downloadJPEG: 'Descargar imagen JPEG',\n downloadPDF: 'Descargar imagen PDF',\n downloadSVG: 'Descargar imagen SVG',\n printChart: 'Imprimir',\n resetZoom: 'Reiniciar zoom',\n resetZoomTitle: 'Reiniciar zoom',\n thousandsSep: ',',\n decimalPoint: '.',\n },\n pt: {\n loading: 'Aguarde...',\n months: [\n 'Janeiro',\n 'Fevereiro',\n 'Março',\n 'Abril',\n 'Maio',\n 'Junho',\n 'Julho',\n 'Agosto',\n 'Setembro',\n 'Outubro',\n 'Novembro',\n 'Dezembro',\n ],\n weekdays: [\n 'Domingo',\n 'Segunda',\n 'Terça',\n 'Quarta',\n 'Quinta',\n 'Sexta',\n 'Sábado',\n ],\n shortMonths: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Abr',\n 'Maio',\n 'Jun',\n 'Jul',\n 'Ago',\n 'Set',\n 'Out',\n 'Nov',\n 'Dez',\n ],\n exportButtonTitle: 'Exportar',\n printButtonTitle: 'Imprimir',\n rangeSelectorFrom: 'De',\n rangeSelectorTo: 'Até',\n rangeSelectorZoom: 'Periodo',\n downloadPNG: 'Download imagem PNG',\n downloadJPEG: 'Download imagem JPEG',\n downloadPDF: 'Download documento PDF',\n downloadSVG: 'Download imagem SVG',\n // resetZoom: \"Reset\",\n // resetZoomTitle: \"Reset,\n // thousandsSep: \".\",\n // decimalPoint: ','\n },\n ru: {\n loading: 'Загрузка...',\n months: [\n 'Январь',\n 'Февраль',\n 'Март',\n 'Апрель',\n 'Май',\n 'Июнь',\n 'Июль',\n 'Август',\n 'Сентябрь',\n 'Октябрь',\n 'Ноябрь',\n 'Декабрь',\n ],\n weekdays: [\n 'Воскресенье',\n 'Понедельник',\n 'Вторник',\n 'Среда',\n 'Четверг',\n 'Пятница',\n 'Суббота',\n ],\n shortMonths: [\n 'Янв',\n 'Фев',\n 'Март',\n 'Апр',\n 'Май',\n 'Июнь',\n 'Июль',\n 'Авг',\n 'Сент',\n 'Окт',\n 'Нояб',\n 'Дек',\n ],\n exportButtonTitle: 'Экспорт',\n printButtonTitle: 'Печать',\n rangeSelectorFrom: 'С',\n rangeSelectorTo: 'По',\n rangeSelectorZoom: 'Период',\n downloadPNG: 'Скачать PNG',\n downloadJPEG: 'Скачать JPEG',\n downloadPDF: 'Скачать PDF',\n downloadSVG: 'Скачать SVG',\n printChart: 'Напечатать график',\n },\n de: {\n decimalPoint: ',',\n thousandsSep: '.',\n loading: 'Daten werden geladen...',\n months: [\n 'Januar',\n 'Februar',\n 'März',\n 'April',\n 'Mai',\n 'Juni',\n 'Juli',\n 'August',\n 'September',\n 'Oktober',\n 'November',\n 'Dezember',\n ],\n weekdays: [\n 'Sonntag',\n 'Montag',\n 'Dienstag',\n 'Mittwoch',\n 'Donnerstag',\n 'Freitag',\n 'Samstag',\n ],\n shortMonths: [\n 'Jan',\n 'Feb',\n 'Mär',\n 'Apr',\n 'Mai',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Okt',\n 'Nov',\n 'Dez',\n ],\n exportButtonTitle: 'Exportieren',\n printButtonTitle: 'Drucken',\n rangeSelectorFrom: 'Von',\n rangeSelectorTo: 'Bis',\n rangeSelectorZoom: 'Zeitraum',\n downloadPNG: 'Download als PNG-Bild',\n downloadJPEG: 'Download als JPEG-Bild',\n downloadPDF: 'Download als PDF-Dokument',\n downloadSVG: 'Download als SVG-Bild',\n resetZoom: 'Zoom zurücksetzen',\n resetZoomTitle: 'Zoom zurücksetzen',\n noData: 'keine Daten vorhanden für den ausgewählten Zeitbereich',\n },\n nl: {\n loading: 'Wordt geladen...',\n months: [\n 'januari',\n 'februari',\n 'maart',\n 'april',\n 'mei',\n 'juni',\n 'juli',\n 'augustus',\n 'september',\n 'oktober',\n 'november',\n 'december',\n ],\n weekdays: [\n 'zondag',\n 'maandag',\n 'dinsdag',\n 'woensdag',\n 'donderdag',\n 'vrijdag',\n 'zaterdag',\n ],\n shortMonths: [\n 'jan',\n 'feb',\n 'maa',\n 'apr',\n 'mei',\n 'jun',\n 'jul',\n 'aug',\n 'sep',\n 'okt',\n 'nov',\n 'dec',\n ],\n exportButtonTitle: 'Exporteren',\n printButtonTitle: 'Printen',\n rangeSelectorFrom: 'Vanaf',\n rangeSelectorTo: 'Tot',\n rangeSelectorZoom: 'Periode',\n downloadPNG: 'Download als PNG',\n downloadJPEG: 'Download als JPEG',\n downloadPDF: 'Download als PDF',\n downloadSVG: 'Download als SVG',\n resetZoom: 'Reset',\n resetZoomTitle: 'Reset',\n thousandsSep: '.',\n decimalPoint: ',',\n exitFullscreen: 'Vollbild Modues',\n viewFullscreen: 'Vollbild Modus verlassen',\n },\n tr: {\n loading: 'Yükleniyor...',\n months: [\n 'Ocak',\n 'Şubat',\n 'Mart',\n 'Nisan',\n 'Mayıs',\n 'Haziran',\n 'Temmuz',\n 'Ağustos',\n 'Eylül',\n 'Ekim',\n 'Kasım',\n 'Aralık',\n ],\n weekdays: [\n 'Pazar',\n 'Pazartesi',\n 'Salı',\n 'Çarşamba',\n 'Perşembe',\n 'Cuma',\n 'Cumartesi',\n ],\n shortMonths: [\n 'Ocak',\n 'Şubat',\n 'Mart',\n 'Nisan',\n 'Mayıs',\n 'Haziran',\n 'Temmuz',\n 'Ağustos',\n 'Eylül',\n 'Ekim',\n 'Kasım',\n 'Aralık',\n ],\n exportButtonTitle: 'Dışarı Aktar',\n printButtonTitle: 'Yazdır',\n rangeSelectorFrom: 'Başlangış',\n rangeSelectorTo: 'Bitiş',\n rangeSelectorZoom: 'Periyot',\n downloadPNG: 'PNG Olarak indir',\n downloadJPEG: 'JPEG olarak indir',\n downloadPDF: 'PDF olarak indir',\n downloadSVG: 'SVG olarak indir',\n resetZoom: ['Yakınlaşmayı Sıfırla'],\n resetZoomTitle: ['Yakınlaşmayı Sıfırla'],\n printChart: ['Yazdır'],\n thousandsSep: '.',\n decimalPoint: ',',\n },\n it: {\n loading: 'Sto caricando...',\n months: [\n 'Gennaio',\n 'Febbraio',\n 'Marzo',\n 'Aprile',\n 'Maggio',\n 'Giugno',\n 'Luglio',\n 'Agosto',\n 'Settembre',\n 'Ottobre',\n 'Novembre',\n 'Dicembre',\n ],\n weekdays: [\n 'Domenica',\n 'Lunedì',\n 'Martedì',\n 'Mercoledì',\n 'Venerdì',\n 'Sabato',\n 'Domenica',\n ],\n shortMonths: [\n 'Gen',\n 'Feb',\n 'Mar',\n 'Apr',\n 'Mag',\n 'Giu',\n 'Lugl',\n 'Ago',\n 'Set',\n 'Ott',\n 'Nov',\n 'Dic',\n ],\n exportButtonTitle: 'Esporta',\n printButtonTitle: 'Importa',\n rangeSelectorFrom: 'Da',\n rangeSelectorTo: 'A',\n rangeSelectorZoom: 'Periodo',\n downloadPNG: 'Download immagine PNG',\n downloadJPEG: 'Download immagine JPEG',\n downloadPDF: 'Download documento PDF',\n downloadSVG: 'Download immagine SVG',\n printChart: 'Stampa grafico',\n thousandsSep: '.',\n decimalPoint: ',',\n },\n fr: {\n loading: 'Chargement...',\n months: [\n 'janvier',\n 'février',\n 'mars',\n 'avril',\n 'mai',\n 'juin',\n 'juillet',\n 'août',\n 'septembre',\n 'octobre',\n 'novembre',\n 'décembre',\n ],\n weekdays: [\n 'dimanche',\n 'lundi',\n 'mardi',\n 'mercredi',\n 'jeudi',\n 'vendredi',\n 'samedi',\n ],\n shortMonths: [\n 'jan',\n 'fév',\n 'mar',\n 'avr',\n 'mai',\n 'juin',\n 'juil',\n 'aoû',\n 'sep',\n 'oct',\n 'nov',\n 'déc',\n ],\n exportButtonTitle: 'Exporter',\n printButtonTitle: 'Imprimer',\n printChart: 'Imprimer',\n rangeSelectorFrom: 'Du',\n rangeSelectorTo: 'au',\n rangeSelectorZoom: 'Période',\n downloadPNG: 'Télécharger en PNG',\n downloadJPEG: 'Télécharger en JPEG',\n downloadPDF: 'Télécharger en PDF',\n downloadSVG: 'Télécharger en SVG',\n resetZoom: 'Réinitialiser le zoom',\n resetZoomTitle: 'Réinitialiser le zoom',\n thousandsSep: ' ',\n decimalPoint: ',',\n contextButtonTitle: 'Menu',\n exitFullscreen: \"Quitter l'affichage plein écran\",\n viewFullscreen: 'Affichage plein écran',\n noData: 'Aucune donnée disponible pour la plage horaire sélectionnée',\n },\n 'fr-BE': {\n loading: 'Chargement...',\n months: [\n 'janvier',\n 'février',\n 'mars',\n 'avril',\n 'mai',\n 'juin',\n 'juillet',\n 'août',\n 'septembre',\n 'octobre',\n 'novembre',\n 'décembre',\n ],\n weekdays: [\n 'dimanche',\n 'lundi',\n 'mardi',\n 'mercredi',\n 'jeudi',\n 'vendredi',\n 'samedi',\n ],\n shortMonths: [\n 'jan',\n 'fév',\n 'mar',\n 'avr',\n 'mai',\n 'juin',\n 'juil',\n 'aoû',\n 'sep',\n 'oct',\n 'nov',\n 'déc',\n ],\n exportButtonTitle: 'Exporter',\n printButtonTitle: 'Imprimer',\n printChart: 'Imprimer',\n rangeSelectorFrom: 'Du',\n rangeSelectorTo: 'au',\n rangeSelectorZoom: 'Période',\n downloadPNG: 'Télécharger en PNG',\n downloadJPEG: 'Télécharger en JPEG',\n downloadPDF: 'Télécharger en PDF',\n downloadSVG: 'Télécharger en SVG',\n resetZoom: 'Réinitialiser le zoom',\n resetZoomTitle: 'Réinitialiser le zoom',\n thousandsSep: ' ',\n decimalPoint: ',',\n contextButtonTitle: 'Menu',\n exitFullscreen: \"Quitter l'affichage plein écran\",\n viewFullscreen: 'Affichage plein écran',\n },\n pl: {\n loading: 'Ładowanie...',\n months: [\n 'Styczeń',\n 'Luty',\n 'Marzec',\n 'Kwiecień',\n 'Maj',\n 'Czerwiec',\n 'Lipiec',\n 'Sierpień',\n 'Wrzesień',\n 'Październik',\n 'Listopad',\n 'Grudzień',\n ],\n weekdays: [\n 'Niedziela',\n 'Poniedziałek',\n 'Wtorek',\n 'Środa',\n 'Czwartek',\n 'Piątek',\n 'Sobota',\n ],\n shortMonths: [\n 'Sty',\n 'Lut',\n 'Mar',\n 'Kwi',\n 'Maj',\n 'Cze',\n 'Lip',\n 'Sie',\n 'Wrz',\n 'Paź',\n 'Lis',\n 'Gru',\n ],\n exportButtonTitle: 'Export',\n printButtonTitle: 'Drukowanie',\n rangeSelectorFrom: 'Od',\n rangeSelectorTo: 'Do',\n rangeSelectorZoom: 'Przybliżenie',\n downloadPNG: 'Pobierz obraz PNG',\n downloadJPEG: 'Pobierz obraz JPEG',\n downloadPDF: 'Pobierz dokument PDF',\n downloadSVG: 'Pobierz obraz SVG',\n thousandsSep: ' ',\n decimalPoint: ',',\n // resetZoom: \"Reset\",\n // resetZoomTitle: \"Reset,\n },\n zh: {\n loading: '加载中...',\n months: [\n '1月',\n '2月',\n '3月',\n '4月',\n '5月',\n '6月',\n '7月',\n '8月',\n '9月',\n '10月',\n '11月',\n '12月',\n ],\n shortMonths: [\n '1月',\n '2月',\n '3月',\n '4月',\n '5月',\n '6月',\n '7月',\n '8月',\n '9月',\n '10月',\n '11月',\n '12月',\n ],\n weekdays: [\n '星期日',\n '星期一',\n '星期二',\n '星期三',\n '星期四',\n '星期五',\n '星期六',\n ],\n exportButtonTitle: '导出',\n printButtonTitle: '打印',\n rangeSelectorFrom: '从',\n rangeSelectorTo: '到',\n rangeSelectorZoom: '缩放',\n downloadPNG: '下载PNG格式',\n downloadJPEG: '下载JPEG格式',\n downloadPDF: '下载PDF格式',\n downloadSVG: '下载SVG格式',\n },\n};\nexport default hclocales;\n","/* eslint-disable max-classes-per-file */\nimport { LitElement, html, css } from 'lit';\nimport { customElement, query } from 'lit/decorators.js';\nimport { Mix } from '@kisters/wcp-base/common';\nimport Highcharts from 'highcharts/highstock';\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport { cloneDeep } from 'lodash-es';\nimport more from 'highcharts/highcharts-more';\nimport nodata from 'highcharts/modules/no-data-to-display';\nimport exporting from 'highcharts/modules/exporting';\nimport label from 'highcharts/modules/series-label';\nimport offlineexporting from 'highcharts/modules/offline-exporting';\nimport boost from 'highcharts/modules/boost';\nimport hclocales from '../../common/highcharts-locales';\nimport nls from '../../locales/index';\n\nmore(Highcharts);\nlabel(Highcharts);\nnodata(Highcharts);\nexporting(Highcharts);\nofflineexporting(Highcharts);\nboost(Highcharts);\n\n@customElement('ki-chart')\nexport default class KiChart extends Mix(LitElement, [i18nMixin, { nls }]) {\n @query('#chart')\n chartNode;\n\n highcharts = Highcharts;\n\n static get properties() {\n return {\n options: { type: Object },\n };\n }\n\n static styles = css`\n #chart {\n height: 100%;\n width: 100%;\n }\n `;\n\n updated(changedProperties) {\n super.update(changedProperties);\n if (this.chart) {\n if (changedProperties.has('options')) {\n this.options.then(opt => {\n this.chart.update(cloneDeep(opt), true, true);\n });\n }\n }\n }\n\n render() {\n return html`
`;\n }\n\n firstUpdated() {\n super.firstUpdated();\n if (hclocales[this.i18n.language.substring(0, 2)]) {\n this.highcharts.setOptions({\n lang: hclocales[this.i18n.language.substring(0, 2)],\n });\n }\n\n const Chart = Highcharts.chart;\n if (Chart) {\n this.chart = Chart(\n this.chartNode,\n cloneDeep(this.options || {}),\n this.callback ? this.callback : null,\n );\n }\n }\n\n disconnectedCallback() {\n this.chart?.destroy();\n if (super.disconnectedCallback) super.disconnectedCallback();\n }\n}\n","// inject tsData to data in series and value in plotline\n// set id for series is better for performance\n// TODO write unit test\n\nexport default function LinkedTo(clz) {\n return class extends clz {\n static get properties() {\n return {\n visibleFlags: {\n type: Object,\n initial: () => ({}),\n },\n };\n }\n\n _addLinkedTo(options) {\n const series = options.series || [];\n const _t = this;\n series.forEach(s => {\n // the condition for fake series\n if (typeof s !== 'string') {\n const originHander = s.events?.legendItemClick;\n s.events = {\n ...s.events,\n legendItemClick() {\n originHander && originHander.call(this);\n _t.visibleFlags = { ..._t.visibleFlags, [s.id]: !this.visible };\n },\n };\n }\n });\n\n if (options.xAxis?.plotLines) {\n options.xAxis.plotLines = this._filterPlotLines(\n options.xAxis.plotLines,\n );\n }\n\n if (options.yAxis?.plotLines) {\n options.yAxis.plotLines = this._filterPlotLines(\n options.yAxis.plotLines,\n );\n }\n\n return options;\n }\n\n _filterPlotLines(plotLines) {\n return plotLines.filter(p => {\n if (p.linkedTo) {\n const vis = this.visibleFlags[p.linkedTo];\n return vis === undefined || vis;\n }\n return true;\n });\n }\n };\n}\n","import dayjs from '@kisters/wcp-base/common/dayjsext';\n\nexport function getTimestampFromDuration(\n dur,\n { start, past = true } = {},\n): number {\n if (!dur) {\n return dayjs(start).tz().valueOf();\n }\n if (past) {\n return dayjs(start).tz().subtract(dayjs.duration(dur)).valueOf();\n }\n return dayjs(start).tz().add(dayjs.duration(dur)).valueOf();\n}\n\n/*\n * condition:\n * ts should be ordered,\n * and [0] is same (most time is timestamp)\n * */\nexport function mergeTs(ts1, ts2) {\n return ts1.map((d, i) => {\n if (d[0] !== ts2[i][0]) {\n throw new Error(\"can't merge ts data are not consist\");\n }\n return [...d, ts2[i][1]];\n });\n}\n","/* eslint-disable camelcase */\n/* eslint-disable class-methods-use-this */\nimport { merge, last } from 'lodash-es';\nimport { getTimestampFromDuration } from '../../common/ts-utils';\n\nexport default function TsData(clz) {\n return class extends clz {\n static get properties() {\n return {\n options: { type: Object, initial: () => ({}) },\n getTsData: {\n type: Function,\n default: () => {\n throw new Error('getTsData is required: getTsData(tsName)');\n },\n },\n };\n }\n\n async _addTsDataToOptions(options) {\n // default\n options = merge({ xAxis: { type: 'datetime' } }, options);\n return {\n ...options,\n yAxis: {\n ...options.yAxis,\n plotLines: await Promise.all(\n options.xAxis?.plotLines\n ?.filter(p => !!p)\n ?.map(p => this._addTsDataToPlotLine(p, d => d?.[0]?.[1])) || [],\n ),\n },\n xAxis: {\n ...options.xAxis,\n ...this._addMinMaxFromPeriod(options.xAxis.period),\n plotLines: await Promise.all(\n options.xAxis?.plotLines\n ?.filter(p => !!p)\n ?.map(p => this._addTsDataToPlotLine(p, d => d?.[0]?.[0])) || [],\n ),\n },\n series: await Promise.all(\n options.series\n ?.filter(p => !!p)\n ?.map(this._addTsDataToSeries.bind(this)) || [],\n ),\n };\n }\n\n async _addTsDataToPlotLine(plotline, transform) {\n if (typeof plotline === 'string') {\n plotline = { ts: plotline };\n }\n let { value } = plotline;\n if (plotline.ts) {\n const data = await this.getTsData(plotline.ts);\n value = (plotline.transform || transform)(data);\n } else if (/^[+-]P/.test(plotline.value)) {\n // value is peroid\n value = getTimestampFromDuration(plotline.value.substr(1), {\n past: plotline.value.charAt(0) === '-',\n });\n }\n\n return {\n dashStyle: 'dash',\n width: 2,\n label: { text: plotline.ts, align: 'left' },\n ...plotline,\n value,\n };\n }\n\n // eslint-disable-next-line class-methods-use-this\n _addMinMaxFromPeriod(period) {\n if (period) {\n return {\n min: getTimestampFromDuration(period),\n max: getTimestampFromDuration(),\n };\n }\n return {};\n }\n\n _setInterpolation(series, data) {\n const interpolationType = data[0][2];\n if (series.isThreshold) {\n series.step = 'left';\n } else if (interpolationType === 3) {\n series.step = 'left';\n } else if (interpolationType === 4) {\n series.step = 'right';\n }\n }\n\n async _addTsDataToSeries(series) {\n if (typeof series === 'string') {\n series = { ts: series };\n }\n if (series.ts) {\n let data = await this.getTsData(series.ts);\n\n data = data.map(d => [new Date(d[0]).getTime(), ...d.slice(1)]);\n series.transform?.(data);\n if (data.length) {\n this._setInterpolation(series, data);\n }\n series = merge(\n { name: await this._resolveTsName(series.ts), data },\n series,\n );\n }\n return series;\n }\n\n async _resolveTsName(ts_path) {\n const ts_name = last(ts_path.split('/'));\n if (ts_name && ts_name[0] && ts_name[0].ts_name)\n return ts_name[0].ts_name;\n return ts_path;\n }\n };\n}\n","/* eslint-disable max-classes-per-file */\nimport { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport './ki-chart';\nimport { Mix, PropertyDefaultValue } from '@kisters/wcp-base/common';\nimport { i18nMixin, getQueryObject } from '@kisters/wcp-base/decorators';\nimport nls from '../../locales/index';\nimport LinkedTo from './LinkedTo';\nimport TsData from './TsData';\n\n@customElement('ki-ts-graph')\nexport default class KiTsGraph extends Mix(\n LitElement,\n PropertyDefaultValue,\n TsData,\n LinkedTo,\n [i18nMixin, { nls }],\n) {\n // language=CSS\n static styles = css`\n :host {\n display: block;\n }\n\n ki-chart {\n display: block;\n height: 100%;\n }\n `;\n\n static get properties() {\n return {\n afterComputedOptions: Function,\n };\n }\n\n render() {\n // language=html\n return html``;\n }\n\n get chartNode() {\n return getQueryObject(this, '#chartNode');\n }\n\n get chart() {\n return this.chartNode?.chart;\n }\n\n get computedOptions() {\n return this._addTsDataToOptions(this.options).then(async options => {\n options = await this._addLinkedTo(options);\n return this.afterComputedOptions?.(options) || options;\n });\n }\n}\n","import { css } from 'lit';\n// language=CSS\nexport default css`\n :host {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n flex-direction: row;\n height: 45px;\n }\n\n .display-none {\n disblay: none;\n }\n\n /* START custom style datepickers */\n .qs-datepicker-container {\n display: flex;\n flex-direction: row;\n width: 580px;\n font-size: 1rem;\n font-family: sans-serif;\n color: #000;\n position: absolute;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n z-index: 9001;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n border: 1px solid #ccc;\n overflow: hidden;\n background: #fff;\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12),\n 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n }\n\n .qs-datepicker-container * {\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n }\n\n .qs-datepicker-container.qs-centered {\n position: fixed;\n top: 50%;\n left: 50%;\n -webkit-transform: translate(-50%, -50%);\n -ms-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n }\n\n .qs-datepicker-container.qs-hidden {\n display: none;\n }\n\n .qs-datepicker,\n .qs-datepicker .qs-overlay {\n padding: 0.5em;\n border-left: 1px solid #ccc;\n }\n\n .qs-datepicker {\n width: 70%;\n }\n\n .qs-datepicker .qs-overlay {\n width: 100%;\n }\n\n .qs-datepicker .qs-overlay {\n position: absolute;\n top: 0;\n left: 0;\n background: rgba(0, 0, 0, 0.75);\n color: #fff;\n height: 100%;\n padding: 0.5em;\n z-index: 1;\n opacity: 1;\n -webkit-transition: opacity 0.3s;\n transition: opacity 0.3s;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n }\n\n .qs-datepicker .qs-overlay.qs-hidden {\n opacity: 0;\n z-index: -1;\n }\n\n .qs-datepicker .qs-overlay .qs-overlay-year {\n background: rgba(0, 0, 0, 0);\n border: none;\n border-bottom: 1px solid #fff;\n border-radius: 0;\n color: #fff;\n font-size: 0.875em;\n padding: 0.25em 0;\n width: 80%;\n text-align: center;\n margin: 0 auto;\n display: block;\n }\n\n .qs-datepicker .qs-overlay .qs-overlay-year::-webkit-inner-spin-button {\n -webkit-appearance: none;\n }\n\n .qs-datepicker .qs-overlay .qs-close {\n padding: 0.5em;\n cursor: pointer;\n position: absolute;\n top: 0;\n right: 0;\n }\n\n .qs-datepicker .qs-overlay .qs-submit {\n border: 1px solid #fff;\n border-radius: 0.26392em;\n padding: 0.5em;\n margin: 0 auto auto;\n cursor: pointer;\n background: hsla(0, 0%, 50.2%, 0.4);\n }\n\n .qs-datepicker .qs-overlay .qs-submit.qs-disabled {\n color: grey;\n border-color: grey;\n cursor: not-allowed;\n }\n\n .qs-datepicker .qs-overlay .qs-overlay-month-container {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -webkit-box-flex: 1;\n -ms-flex-positive: 1;\n flex-grow: 1;\n }\n\n .qs-datepicker .qs-overlay .qs-overlay-month {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n width: calc(100% / 3);\n cursor: pointer;\n opacity: 0.5;\n -webkit-transition: opacity 0.15s;\n transition: opacity 0.15s;\n }\n\n .qs-datepicker .qs-overlay .qs-overlay-month.active,\n .qs-datepicker .qs-overlay .qs-overlay-month:hover {\n opacity: 1;\n }\n\n .qs-datepicker .qs-controls {\n height: 35px;\n width: 100%;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-pack: justify;\n -ms-flex-pack: justify;\n justify-content: space-between;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-flex: 1;\n -ms-flex-positive: 1;\n flex-grow: 1;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n -webkit-filter: blur(0);\n filter: blur(0);\n -webkit-transition: -webkit-filter 0.3s;\n transition: -webkit-filter 0.3s;\n transition: filter 0.3s;\n transition: filter 0.3s, -webkit-filter 0.3s;\n }\n\n .qs-datepicker .qs-controls.qs-blur {\n -webkit-filter: blur(5px);\n filter: blur(5px);\n }\n\n .qs-datepicker .qs-arrow {\n height: 1.7em;\n width: 1.7em;\n position: relative;\n cursor: pointer;\n border-radius: 0.26392em;\n -webkit-transition: background 0.15s;\n transition: background 0.15s;\n }\n\n .qs-datepicker .qs-arrow:hover {\n background: rgba(0, 0, 0, 0.1);\n }\n\n .qs-datepicker .qs-arrow:hover.qs-left:after {\n border-right-color: #000;\n }\n\n .qs-datepicker .qs-arrow:hover.qs-right:after {\n border-left-color: #000;\n }\n\n .qs-datepicker .qs-arrow:after {\n content: '';\n border: 0.39062em solid rgba(0, 0, 0, 0);\n position: absolute;\n top: 50%;\n -webkit-transition: border 0.2s;\n transition: border 0.2s;\n }\n\n .qs-datepicker .qs-arrow.qs-left:after {\n border-right-color: grey;\n right: 50%;\n -webkit-transform: translate(25%, -50%);\n -ms-transform: translate(25%, -50%);\n transform: translate(25%, -50%);\n }\n\n .qs-datepicker .qs-arrow.qs-right:after {\n border-left-color: grey;\n left: 50%;\n -webkit-transform: translate(-25%, -50%);\n -ms-transform: translate(-25%, -50%);\n transform: translate(-25%, -50%);\n }\n\n .qs-datepicker .qs-month-year {\n font-weight: 700;\n -webkit-transition: border 0.2s;\n transition: border 0.2s;\n border-bottom: 1px solid rgba(0, 0, 0, 0);\n cursor: pointer;\n }\n\n .qs-datepicker .qs-month-year:hover {\n border-bottom: 1px solid grey;\n }\n\n .qs-datepicker .qs-month-year:active:focus,\n .qs-datepicker .qs-month-year:focus {\n outline: none;\n }\n\n .qs-datepicker .qs-month {\n padding-right: 0.5ex;\n }\n\n .qs-datepicker .qs-year {\n padding-left: 0.5ex;\n }\n\n .qs-datepicker .qs-squares {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -webkit-filter: blur(0);\n filter: blur(0);\n -webkit-transition: -webkit-filter 0.3s;\n transition: -webkit-filter 0.3s;\n transition: filter 0.3s, -webkit-filter 0.3s;\n }\n\n .qs-datepicker .qs-squares.qs-blur {\n -webkit-filter: blur(5px);\n filter: blur(5px);\n }\n\n .qs-datepicker .qs-square {\n margin-top: 0.7em;\n width: calc(100% / 7);\n height: 50px;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n cursor: pointer;\n -webkit-transition: background 0.1s;\n transition: background 0.1s;\n border-radius: 50px;\n }\n\n .qs-datepicker .qs-square.qs-current {\n font-weight: 700;\n }\n\n .qs-datepicker .qs-square.qs-current span {\n text-decoration: underline;\n }\n\n .qs-datepicker .qs-square.qs-active {\n background: #1093cd;\n color: #fff;\n }\n\n .qs-datepicker .qs-square.qs-range-date-start:not(.qs-range-date-6) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n .qs-datepicker .qs-square.qs-range-date-middle {\n background: #e5eef5;\n }\n\n .qs-datepicker .qs-square.qs-range-date-middle {\n border-radius: 0;\n }\n\n .qs-datepicker .qs-square.qs-range-date-middle.qs-range-date-0 {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n .qs-datepicker .qs-square.qs-range-date-end:not(.qs-range-date-0),\n .qs-datepicker .qs-square.qs-range-date-middle.qs-range-date-6 {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n\n .qs-datepicker .qs-square.qs-disabled span {\n opacity: 0.2;\n }\n\n .qs-datepicker .qs-square.qs-empty {\n cursor: default;\n }\n\n .qs-datepicker .qs-square.qs-disabled {\n cursor: not-allowed;\n }\n\n .qs-datepicker .qs-square.qs-day {\n cursor: default;\n color: grey;\n }\n\n .qs-datepicker\n .qs-square:not(.qs-empty):not(.qs-disabled):not(.qs-day):not(.qs-active):hover {\n background: #69b0e7;\n color: #fff;\n }\n\n .qs-datepicker .qs-event {\n position: relative;\n }\n\n .qs-datepicker .qs-event:after {\n content: '';\n position: absolute;\n width: 0.46875em;\n height: 0.46875em;\n border-radius: 50%;\n background: #07f;\n bottom: 0;\n right: 0;\n }\n\n .qs-datepicker .qs-event.qs-disabled:after,\n .qs-datepicker .qs-event.qs-empty:after {\n background: #cce4ff;\n }\n\n /* END custom style datepickers */\n\n .input-group {\n display: flex;\n align-items: center;\n }\n\n input[type='text'],\n a.input-button {\n border: 1px solid #ccc;\n box-sizing: border-box;\n height: 36px;\n }\n\n input[type='text'] {\n width: 8em;\n padding: 0.5em;\n display: inline-block;\n }\n\n input#from,\n input#to {\n text-align: center;\n font-family: Calibri, Candara, Segoe, Segoe UI, Optima, Arial, sans-serif;\n }\n\n input#from {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n border-top-left-radius: 50px;\n border-bottom-left-radius: 50px;\n border-right: 0;\n }\n\n input[type='text']:focus {\n background: #e8f3fb;\n }\n\n a.input-button {\n text-decoration: none;\n display: block;\n padding: 0 10px;\n border-left: 0;\n cursor: pointer;\n align-self: center;\n justify-content: center;\n line-height: 1;\n }\n\n a.input-button ki-icon-btn {\n border: 0;\n display: flex;\n box-shadow: none;\n height: 100%;\n width: auto;\n align-items: center;\n }\n\n ki-icon-btn {\n box-shadow: none;\n }\n\n ki-icon-btn.selected,\n ki-icon-btn:hover {\n box-sizing: border-box;\n }\n\n ki-icon-btn.selected,\n ki-icon-btn.selected:hover {\n fill: #ffffff;\n background: #1093cd;\n }\n\n ki-icon-btn:hover {\n fill: #4a4a49;\n }\n\n #periodListBtn {\n display: flex;\n justify-content: center;\n align-items: center;\n border-top-right-radius: 50px 50px;\n border-bottom-right-radius: 50px;\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n border: 1px solid #ccc;\n border-left: 0;\n box-sizing: border-box;\n height: 36px;\n }\n\n #periodListSummary {\n display: none;\n border: 1px solid #9099a0;\n border-radius: 50px;\n color: #9099a0;\n cursor: pointer;\n text-align: center;\n padding: 0.5em 1em;\n }\n\n #periodListSummary:hover {\n color: #4a4a49;\n fill: #4a4a49;\n }\n\n #periodListSummary.selected {\n background-color: #3f85cc;\n color: #ffffff;\n fill: #ffffff;\n border: 1px solid #fff;\n }\n\n .period-list {\n display: block;\n }\n\n .mobile-tabs {\n display: none;\n }\n\n /* Media queries */\n @media (max-width: 1024px) {\n input[type='text'],\n a.input-button {\n width: 0;\n visibility: hidden;\n }\n\n .input-group {\n width: 0;\n }\n\n #periodListBtn {\n display: none;\n }\n\n #periodListSummary {\n display: block;\n white-space: nowrap;\n }\n\n .qs-datepicker-container {\n position: absolute;\n flex-direction: column;\n top: 50px !important;\n left: 0 !important;\n width: 400px;\n transform: translateX(-100px);\n }\n\n .qs-datepicker-container .qs-datepicker {\n width: 100%;\n }\n\n .qs-datepicker,\n .qs-datepicker .qs-overlay {\n width: 100%;\n }\n\n .period-list {\n display: none;\n }\n\n .mobile-tabs {\n display: block;\n }\n }\n`;\n","import dayjs from '@kisters/wcp-base/common/dayjsext';\n\nexport interface IPeriod {\n from: number;\n to: number;\n}\n\nexport interface IColumnOption {\n label: string;\n dates: IPeriod;\n}\n\nexport class PeriodsList {\n allowtime;\n\n constraints;\n\n _periods;\n\n _periodsWithoutTime;\n\n periodListOptions;\n\n value;\n\n constructor(classification) {\n this.constraints =\n classification && classification.constraints\n ? classification.constraints\n : {};\n\n const options =\n classification && classification.periods\n ? classification.periods\n : [\n [\n 'today',\n 'thisWeek',\n 'thisMonth',\n 'thisYear',\n 'theDaySoFar',\n 'last15day',\n 'last30day',\n 'last60day',\n 'last6month',\n 'last1year',\n 'last2year',\n 'last3year',\n ],\n ];\n this.allowtime === true\n ? (this.periods = options)\n : (this.periodsWithoutTime = options);\n this.periodListOptions =\n classification && classification.periodListOptions\n ? classification.periodListOptions\n : null;\n this.value = 'today';\n }\n\n set periods(val) {\n if (!val) {\n return;\n }\n this._periods = val;\n }\n\n get periods() {\n return this._periodss;\n }\n\n set periodsWithoutTime(val) {\n if (!val) {\n return;\n }\n this._periodsWithoutTime = val;\n }\n\n get periodsWithoutTime() {\n return this._periodsWithoutTime;\n }\n\n static getDurationBySrt(period: string): IPeriod | null {\n let matched;\n let m;\n let unit;\n switch (period) {\n case 'custom':\n return {\n from: dayjs().valueOf(),\n to: dayjs().valueOf(),\n };\n case 'today':\n return {\n from: dayjs().startOf('day').valueOf(),\n to: dayjs().add(1, 'days').startOf('day').valueOf(),\n };\n case 'thisWeek':\n return {\n from: dayjs().startOf('week').valueOf(),\n to: dayjs().add(1, 'weeks').startOf('week').valueOf(),\n };\n case 'thisMonth':\n return {\n from: dayjs().startOf('month').valueOf(),\n to: dayjs().add(1, 'months').startOf('month').valueOf(),\n };\n case 'lastMonth':\n return {\n from: dayjs().add(-1, 'months').valueOf(),\n to: dayjs().valueOf(),\n };\n case 'thisYear':\n return {\n from: dayjs().startOf('year').valueOf(),\n to: dayjs().add(1, 'years').startOf('year').valueOf(),\n };\n case 'lastYear':\n return {\n from: dayjs().add(-1, 'years').valueOf(),\n to: dayjs().valueOf(),\n };\n case 'theDaySoFar':\n return {\n from: dayjs().startOf('day').valueOf(),\n to: dayjs().valueOf(),\n };\n case 'WTD':\n return {\n from: dayjs().startOf('week').valueOf(),\n to: dayjs().startOf('day').valueOf(),\n };\n case 'MTD':\n return {\n from: dayjs().startOf('month').valueOf(),\n to: dayjs().startOf('day').valueOf(),\n };\n case 'YTD':\n return {\n from: dayjs().startOf('year').valueOf(),\n to: dayjs().startOf('day').valueOf(),\n };\n case 'yesterday':\n m = dayjs().subtract(1, 'days');\n return {\n from: m.clone().startOf('day').valueOf(),\n to: m.add(1, 'days').startOf('day').valueOf(),\n };\n case 'dayBeforeYesterday':\n m = dayjs().subtract(2, 'days');\n return {\n from: m.clone().startOf('day').valueOf(),\n to: m.add(1, 'days').startOf('day').valueOf(),\n };\n case 'dayLastWeek':\n m = dayjs().subtract(1, 'weeks');\n return {\n from: m.clone().startOf('day').valueOf(),\n to: m.add(1, 'days').startOf('day').valueOf(),\n };\n case 'preWeek':\n m = dayjs().subtract(1, 'weeks');\n return {\n from: m.clone().startOf('week').valueOf(),\n to: m.add(1, 'weeks').startOf('week').valueOf(),\n };\n case 'preMonth':\n m = dayjs().subtract(1, 'months');\n return {\n from: m.clone().startOf('month').valueOf(),\n to: m.add(1, 'months').startOf('month').valueOf(),\n };\n case 'preYear':\n m = dayjs().subtract(1, 'years');\n return {\n from: m.clone().startOf('year').valueOf(),\n to: m.add(1, 'years').startOf('year').valueOf(),\n };\n case 'periodOfRecord':\n return {\n from: dayjs().startOf('year').valueOf(),\n to: dayjs().startOf('day').valueOf(),\n };\n default:\n matched = period.match(/^last(\\d+)(min|hour|day|month|year)/i);\n if (matched) {\n m = dayjs();\n unit = matched[2].toLowerCase();\n if (unit === 'min') {\n unit = 'minute';\n }\n return {\n from: m.clone().subtract(matched[1], `${unit}s`).valueOf(),\n to: m.valueOf(),\n };\n }\n return null;\n }\n }\n\n getPeriodsList() {\n const returnOptions: Array> = [];\n const options =\n this.allowtime === true ? this.periods : this.periodsWithoutTime;\n options.forEach(col => {\n const returnCol: Array = [];\n col.forEach(opt => {\n const periodValue = PeriodsList.getDurationBySrt(opt);\n\n if (periodValue) {\n returnCol.push({\n label: opt,\n dates: periodValue,\n });\n }\n });\n returnOptions.push(returnCol);\n });\n return returnOptions;\n }\n}\n","export const getDefaultJsDatepickerOptions = (\n id: string,\n i18n: { t: (i: string) => string },\n dateFormatter: (input: { value: string }, date: number | string) => void,\n onHide: () => void,\n) => ({\n id,\n startDay: 1, // 0 = Sunday, 1 = Monday\n showAllDates: true,\n position: 'br',\n customDays: [\n i18n.t('sundayAbbr'),\n i18n.t('mondayAbbr'),\n i18n.t('tuesdayAbbr'),\n i18n.t('wednesdayAbbr'),\n i18n.t('thursdayAbbr'),\n i18n.t('fridayAbbr'),\n i18n.t('saturdayAbbr'),\n ],\n customMonths: [\n i18n.t('January'),\n i18n.t('February'),\n i18n.t('March'),\n i18n.t('April'),\n i18n.t('May'),\n i18n.t('June'),\n i18n.t('July'),\n i18n.t('August'),\n i18n.t('September'),\n i18n.t('October'),\n i18n.t('November'),\n i18n.t('December'),\n ],\n overlayButton: i18n.t('Submit'),\n overlayPlaceholder: i18n.t('year'),\n formatter: dateFormatter,\n onHide,\n});\n","import { css, html, LitElement, TemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('ww-mobile-tabs')\nexport class MobileFromToTabs extends LitElement {\n static styles = [\n css`\n :host {\n flex: 1;\n display: flex;\n flex-direction: row;\n }\n\n .tabSection {\n display: none;\n }\n\n /* Media queries */\n @media (max-width: 1024px) {\n .tabSection {\n display: flex;\n height: 40px;\n width: 100%;\n }\n .tabSection .tab {\n display: flex;\n flex: 1;\n height: 100%;\n width: 100%;\n align-items: center;\n justify-content: center;\n }\n\n .tabSection .tab.tab-selected {\n border-bottom: 4px solid #1093cd;\n }\n }\n `,\n ];\n\n @property({ type: String })\n selectedTab: 'from' | 'to' | null = null;\n\n @property({ type: String })\n fromValue: string = '';\n\n @property({ type: String })\n toValue: string = '';\n\n protected render(): TemplateResult {\n return html`\n
\n \n ${this.fromValue}\n
\n \n ${this.toValue}\n \n \n `;\n }\n\n tabClicked(eventName: string) {\n return (e: Event) => {\n e.stopPropagation();\n this.dispatchEvent(new Event(eventName));\n };\n }\n}\n","import { css, html, LitElement, TemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport nls from '../../locales/index';\n\n@customElement('ww-period-list')\nexport class PeriodListElement extends i18nMixin(LitElement, { nls }) {\n static styles = [\n css`\n :host {\n flex: 1;\n display: flex;\n flex-direction: row;\n }\n\n .popover-column {\n display: flex;\n flex-direction: column;\n flex: 1;\n padding: 0.5em 0;\n }\n\n .popover-button {\n display: flex;\n font-family: Calibri, Candara, Segoe, Segoe UI, Optima, Arial,\n sans-serif;\n cursor: pointer;\n padding: 0.5em 0.6em;\n }\n\n .popover-button.disabled {\n pointer-events: none;\n cursor: not-allowed;\n }\n\n .popover-button .check-icon {\n display: flex;\n align-items: center;\n width: 25px;\n flex-shrink: 0;\n }\n\n .popover-button.selected,\n .popover-button:hover {\n fill: #ffffff;\n }\n\n .popover-button.selected,\n .popover-button:hover {\n fill: #1093cd;\n }\n @media (max-width: 1024px) {\n .popover-column {\n display: flex;\n position: absolute;\n background: white;\n z-index: 999;\n height: 100%;\n width: 100%;\n }\n\n .popover-column.hide-mobile {\n display: none;\n }\n }\n `,\n ];\n\n @property({ type: Array })\n options: Array<\n Array<{\n label: string | null;\n dates: {\n from: number;\n to: number;\n } | null;\n }>\n > = [];\n\n @property({ type: String })\n selectedPeriod = '';\n\n @property({ type: Object })\n constraints: {\n min: number | string;\n max: number | string;\n } | null = null;\n\n selectPeriod(value: string, from: number, to: number) {\n this.selectedPeriod = value;\n this.dispatchEvent(\n new CustomEvent('period-selected', {\n detail: {\n value,\n from,\n to,\n },\n }),\n );\n }\n\n protected render(): Array {\n return this.options.map(\n columns => html`\n
\n ${columns.map(column => {\n let optFrom: number = column.dates\n ? column.dates.from\n : dayjs().valueOf();\n let optTo: number = column.dates\n ? column.dates.to\n : dayjs().valueOf();\n const value = `from_${optFrom}_to_${optTo}`;\n\n const isSelected = this.selectedPeriod === value;\n\n if (column.label === 'periodOfRecord') {\n if (\n this.constraints &&\n this.constraints.min &&\n this.constraints.max\n ) {\n optFrom = dayjs(this.constraints.min).valueOf();\n optTo = dayjs(this.constraints.max).valueOf();\n }\n }\n\n return html` {\n this.selectPeriod(value, optFrom, optTo);\n }}\n >\n \n ${isSelected\n ? html``\n : ''} ${this.i18n.t(column.label) ||\n column.label ||\n column ||\n ''}\n `;\n })}\n
\n `,\n );\n }\n}\n","/* eslint-disable*/\nimport { html, LitElement, render } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport initDatepicker from 'js-datepicker/dist/datepicker.min';\nimport { LoaderMixin, Mix } from '@kisters/wcp-base/common';\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport style from './ki-time-range-picker.css?inline';\nimport { IColumnOption, PeriodsList } from './PeriodsList';\nimport nls from '../../locales/index';\nimport { getDefaultJsDatepickerOptions } from './js-datepicker-helper';\n\nimport { PeriodListElement } from './period-list';\nimport { MobileFromToTabs } from './mobile-from-to-tabs';\n\nimport './mobile-from-to-tabs';\nimport './period-list';\n\ninterface datepicker {\n show: () => void;\n hide: () => void;\n setDate: (date: Date, updateCalendar: boolean) => void;\n navigate: (date: Date) => void;\n getRange: () => {\n start: Date;\n end: Date;\n };\n calendarContainer: HTMLElement;\n}\n\n@customElement('ki-time-range-picker')\nexport class KiTimeRangePicker extends Mix(\n LitElement,\n [i18nMixin, { nls }],\n LoaderMixin,\n) {\n // language=CSS\n static styles = style;\n\n @property({ type: Boolean })\n allowtimebox = false;\n\n @property({ type: Object })\n constraints = {};\n\n fromDate: datepicker | null = null;\n\n toDate: datepicker | null = null;\n\n @property({ type: Boolean })\n showPeriodList: boolean = false;\n\n _periodsListOptions: Array> | null = null;\n\n @property({ type: Array })\n periods = [];\n\n @property({ type: String })\n dateFormat = 'DD/MM/YYYY';\n\n @property({ type: Number })\n initMin: number | null = null;\n\n @property({ type: Number })\n initMax: number | null = null;\n\n @property({ type: String, attribute: false })\n selectedPeriod = '';\n\n @property({ type: String, attribute: false })\n rangeSummaryValue = '';\n\n @property({ type: Boolean, attribute: false })\n datepickerOpen = false;\n\n _mobileFromToTabs: Array = [];\n _periodLists: Array = [];\n\n _createInputs() {\n const _t = this;\n const id = dayjs().toISOString();\n\n const options = getDefaultJsDatepickerOptions(\n id,\n this.i18n,\n (input, date) => {\n input.value = dayjs(date).format(_t.dateFormat);\n },\n () => {\n _t.datepickerOpen = false;\n },\n );\n\n const fromOptions = {\n ...options,\n onShow: () => {\n this._mobileFromToTabs.forEach(\n mobileTab => (mobileTab.selectedTab = 'from'),\n );\n _t.datepickerOpen = true;\n },\n onSelect: (instance: datepicker) => {\n _t.toDate?.show();\n _t._checkRangeAndEmitChanges(instance);\n },\n };\n\n const toOptions = {\n ...options,\n onShow: () => {\n this._mobileFromToTabs.forEach(\n mobileTab => (mobileTab.selectedTab = 'to'),\n );\n _t.datepickerOpen = true;\n },\n onSelect: (instance: datepicker) => {\n _t._checkRangeAndEmitChanges(instance);\n },\n };\n\n this.fromDate = initDatepicker(\n this.renderRoot.querySelector('#from'),\n fromOptions,\n );\n this.toDate = initDatepicker(\n this.renderRoot.querySelector('#to'),\n toOptions,\n );\n }\n\n _generatePeriodList(node: HTMLElement) {\n const periodList = html`\n {\n this._selectPeriod(e.detail.value);\n this.selectPeriod(e.detail.from, e.detail.to, true);\n }}\n >\n `;\n\n render(periodList, node, {\n renderBefore: node.childNodes[0],\n });\n\n const foundPeriodList = Array.from(node.childNodes.values()).find(\n child => child.nodeName === 'WW-PERIOD-LIST',\n );\n\n if (foundPeriodList) {\n this._periodLists.push(foundPeriodList as PeriodListElement);\n }\n }\n\n _createTabsForMobile(node: HTMLElement) {\n const mobileTabs = html` {\n this.toDate?.hide();\n this.fromDate?.show();\n }}\n @to-clicked=${() => {\n this.fromDate?.hide();\n this.toDate?.show();\n }}\n >`;\n\n render(mobileTabs, node, {\n renderBefore: node.childNodes[0],\n });\n\n const foundMobileTab = Array.from(node.childNodes.values()).find(\n child => child.nodeName === 'WW-MOBILE-TABS',\n );\n\n if (foundMobileTab) {\n this._mobileFromToTabs.push(foundMobileTab as MobileFromToTabs);\n }\n }\n\n renderPeriodLists() {\n const _t = this;\n const periodsList = new PeriodsList({\n allowtime: this.allowtimebox,\n periods: this.periods,\n });\n this._periodsListOptions = periodsList.getPeriodsList();\n const nodes = this.renderRoot.querySelectorAll('.qs-datepicker-container');\n nodes.forEach((node: HTMLElement) => {\n _t._generatePeriodList(node);\n _t._createTabsForMobile(node);\n });\n }\n\n firstUpdated() {\n this._createInputs();\n this.renderPeriodLists();\n this._setFirstDates();\n }\n\n setMobileTabValues(from: number | null, to: number | null) {\n const fromValue = from !== null ? dayjs(from).format(this.dateFormat) : '';\n const toValue = to !== null ? dayjs(to).format(this.dateFormat) : '';\n\n this.rangeSummaryValue = `${fromValue} - ${toValue}`;\n\n this._mobileFromToTabs.forEach(mobileTab => {\n mobileTab.fromValue = fromValue;\n mobileTab.toValue = toValue;\n });\n }\n\n selectPeriod(from: number, to: number, emitChange: boolean) {\n this.fromDate?.setDate(new Date(from), false);\n this.toDate?.setDate(new Date(to), false);\n\n this._updateSelections(from, to);\n\n emitChange && this._emitDatesChanged(from, to);\n }\n\n _emitDatesChanged(from: number, to: number, ignoreHistory: boolean = false) {\n const auxFrom = dayjs(from).startOf('day');\n const auxTo = dayjs(to).endOf('day');\n this.dispatchEvent(\n new CustomEvent('changedate', {\n bubbles: true,\n detail: {\n fromTime: auxFrom,\n toTime: auxTo,\n ignoreHistory: ignoreHistory,\n fromTimeUnix: dayjs(auxFrom).valueOf(),\n toTimeUnix: dayjs(auxTo).valueOf(),\n },\n }),\n );\n }\n\n _updateSelections(from: number, to: number) {\n this._deselectPeriod();\n this.toDate?.navigate(new Date(to));\n this.fromDate?.navigate(new Date(from));\n this.setMobileTabValues(from, to);\n this._checkPeriodListSelection(from, to);\n }\n\n _selectPeriod(period: string) {\n this.selectedPeriod = period;\n\n this._periodLists.forEach(periodList => {\n periodList.selectedPeriod = this.selectedPeriod;\n });\n }\n\n _deselectPeriod() {\n this._selectPeriod('');\n }\n\n _checkPeriodListSelection(from: number, to: number) {\n const ONE_DAY_MS = 86400000;\n const isPeriodLess24H = to - from < ONE_DAY_MS;\n this._deselectPeriod();\n\n this._periodsListOptions?.forEach(column => {\n column.forEach(period => {\n const _periodStart = period.dates.from;\n const _periodEnd = period.dates.to;\n\n const _firstCheck = _periodStart === from && _periodEnd === to;\n\n const _additionalCheck = isPeriodLess24H\n ? false\n : dayjs(_periodStart).startOf('day').valueOf() === from &&\n dayjs(_periodEnd).endOf('day').valueOf() === to;\n\n if (_firstCheck || _additionalCheck) {\n this._selectPeriod(`from_${period.dates.from}_to_${period.dates.to}`);\n }\n });\n });\n }\n\n _setFirstDates() {\n if (!this.initMin || !this.initMax) {\n return;\n }\n\n this.selectPeriod(this.initMin, this.initMax, false);\n }\n\n render() {\n // language=html\n return html`\n
\n \n \n \n
\n \n ${this.rangeSummaryValue}\n \n \n `;\n }\n\n _checkRangeAndEmitChanges(input: datepicker | null) {\n if (input === null) {\n return;\n }\n const range = input.getRange();\n const from = range.start.getTime();\n const to = range.end.getTime();\n this.setMobileTabValues(from, to);\n if (range && range.start && range.end) {\n this._deselectPeriod();\n this._emitDatesChanged(from, to);\n }\n }\n\n openFromCalendar(e) {\n e.stopPropagation();\n this.toDate?.hide();\n if (this.fromDate) {\n const isHidden =\n this.fromDate?.calendarContainer.classList.contains('qs-hidden');\n this.fromDate[isHidden ? 'show' : 'hide']();\n }\n }\n}\n","import { i18nMixin } from '@kisters/wcp-base/decorators';\nimport { customElement } from 'lit/decorators.js';\nimport {\n BaseTable,\n Export,\n Selection,\n ColumnFormatter,\n SortAble,\n LazyRendering,\n} from '@kisters/wcp-base/components';\nimport { Mix } from '@kisters/wcp-base/common';\nimport { css } from 'lit';\nimport nls from '../../locales/index';\n\nconst Parent = Mix(\n BaseTable,\n Selection,\n ColumnFormatter,\n LazyRendering,\n SortAble,\n Export,\n);\n\n@customElement('ki-ts-viewer-table')\nexport default class KiTsViewerTable extends Mix(Parent, [i18nMixin, { nls }]) {\n static styles = [\n ...Parent.styles,\n css`\n :host {\n height: 100%;\n }\n .col-value {\n text-align: right;\n }\n .header .header-content {\n padding: 10px 5px;\n hyphens: auto;\n text-align: left;\n }\n .table {\n font-size: 14px;\n }\n .table .body .cell {\n padding: 5px 5px;\n }\n .selection-col {\n display: none;\n }\n .row {\n cursor: default;\n }\n `,\n ];\n}\n","/* eslint-disable max-classes-per-file */\nimport { html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport merge from 'lodash-es/merge';\nimport { getQueryObject, i18nMixin } from '@kisters/wcp-base/decorators';\nimport { Mix, PropertyDefaultValue } from '@kisters/wcp-base/common';\nimport { debounce, unzipWith, last } from 'lodash-es';\nimport nls from '../../locales/index';\nimport style from './ki-ts-viewer.css?inline';\nimport '@kisters/wcp-base/components';\nimport '../ki-chart/ki-ts-graph';\nimport '../ki-time-range-picker/ki-time-range-picker';\nimport './ki-ts-viewer-table';\n\n@customElement('ki-ts-viewer')\nexport default class KiTsViewer extends Mix(LitElement, PropertyDefaultValue, [\n i18nMixin,\n { nls },\n]) {\n constructor() {\n super();\n\n this.tableOptions = {\n columns: [\n {\n field: 'x',\n label: this.i18n.t('valueTableHeaderTimestamp'),\n format: 'dateTime',\n sortable: true,\n },\n {\n field: 'y',\n label: this.i18n.t('valueTableHeaderValue'),\n sortable: false,\n },\n ],\n sort: [\n {\n field: 'x',\n ascending: false,\n },\n ],\n };\n }\n\n static styles = style;\n\n static get properties() {\n return {\n chartOptions: { type: Object, default: {} },\n customAttributes: { type: Object, default: {} },\n tableOptions: Object,\n periods: {\n type: Array,\n default: [\n ['last1month', 'last6month', 'last1year', 'last5year', 'last10year'],\n ],\n },\n // context with this\n getTsData: Function,\n // context with this\n getTableData: {\n type: Function,\n default() {\n // getTableData work with tableOptions\n const mainTs = this.graph.chart.series.find(s => s.options.mainTs);\n return mainTs\n ? unzipWith(\n [mainTs.processedXData, mainTs.processedYData],\n (x, y) => ({ x, y }),\n )\n : [];\n },\n },\n // inner\n tableVisible: Boolean,\n range: { Object },\n tableData: {\n type: Array,\n default: [],\n },\n };\n }\n\n get graph() {\n return getQueryObject(this, '#graph');\n }\n\n render() {\n // language=html\n return html`\n
\n
Title
\n
\n
\n ${this.customAttributes?.AdminStatus ||\n this.customAttributes?.AdminBemerkung\n ? html` ${this.customAttributes.AdminStatus}\n ${this.customAttributes.AdminBemerkung}`\n : html``}\n
\n
\n
\n \n\n
|
\n\n \n \n {\n this.tableVisible = !this.tableVisible;\n }}\"\n >\n \n \n
\n
\n
\n
\n \n this.getTsData({\n range: this.range,\n ts,\n })}\"\n >\n
\n
\n \n \n
\n
\n `;\n }\n\n toggleTableVisible() {\n this.graph.chart.reflow();\n }\n\n _updateRange(e) {\n this.graph.chart.zoomOut();\n this.range = {\n min: e.detail.fromTime.valueOf(),\n max: e.detail.toTime.valueOf(),\n };\n this.dispatchEvent(\n new CustomEvent('rangeChange', {\n detail: {\n range: this.range,\n },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n // eslint-disable-next-line class-methods-use-this\n _transformAlarmTs(data) {\n // Add left-side limit\n data[0].data.unshift([\n new Date('1900-1-1').toISOString(),\n data[0].data[0][1],\n ]);\n // Add right-side limit\n data[0].data.push([\n new Date(Date.now()).toISOString(),\n last(data[0].data)[1],\n ]);\n }\n\n get computedChartOptions() {\n const options = merge(\n {\n xAxis: {\n events: {\n // todo debounce ?\n afterSetExtremes: debounce(e => {\n this.tableData = this.getTableData({ max: e.max, min: e.min });\n }, 100),\n },\n },\n },\n this.chartOptions,\n );\n\n merge(options, {\n xAxis: {\n ...this.range,\n },\n });\n return options;\n }\n\n downloadGraph() {\n this.graph.chart.exportChartLocal();\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport { html, LitElement, css } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { concat, orderBy } from 'lodash-es';\nimport { Mix, PropertyDefaultValue } from '@kisters/wcp-base/common';\nimport {\n responsiveMixin,\n SM,\n ViewPort,\n i18nMixin,\n} from '@kisters/wcp-base/decorators';\nimport '@kisters/wcp-base/components';\nimport nls from '../../locales/index';\nimport '@ui5/webcomponents/dist/Popover';\nimport '@ui5/webcomponents/dist/List';\nimport '@ui5/webcomponents/dist/StandardListItem';\n\n@customElement('ki-ts-list-select')\nexport default class KiTsListSelect extends Mix(\n LitElement,\n PropertyDefaultValue,\n responsiveMixin,\n [i18nMixin, { nls }],\n) {\n static styles = css`\n :host {\n position: relative;\n }\n\n ui5-list {\n width: 350px;\n }\n\n ki-icon-btn {\n margin: 5px;\n box-shadow: none;\n }\n\n ki-icon-btn:hover {\n fill: white;\n background: var(--theme-color-secondary, #0056a0);\n }\n\n .hidden {\n display: none;\n }\n .no-ts {\n padding: 8px;\n width: 400px;\n text-align: center;\n }\n\n ki-searchbox {\n box-shadow: unset;\n }\n `;\n\n _open;\n\n static get properties() {\n return {\n tsList: {\n type: Array,\n default: [],\n },\n mainTs: {\n type: String,\n default: '',\n },\n presetTs: {\n type: Array,\n default: [],\n },\n filteredOut: {\n type: Array,\n default: [],\n },\n selectedTs: {\n type: Array,\n default: [],\n },\n };\n }\n\n render() {\n return html`\n \n \n ${ViewPort.size === SM ? this._renderMobile() : this._renderMenu()}\n `;\n }\n\n _renderMenu() {\n return html`\n \n \n ${this.tsList?.length > 0\n ? this._renderList()\n : html`
${this.i18n.t('noTimeseriesList')}
`}\n \n \n `;\n }\n\n _renderMobile() {\n return html` \n \n ${this.tsList?.length > 0\n ? this._renderList()\n : html`
${this.i18n.t('noTimeseriesList')}
`}\n
\n `;\n }\n\n _renderList() {\n return html` \n ${orderBy(this.tsList, ['ts_name'], ['asc']).map(\n item =>\n html`${item.ts_name}`,\n )}`;\n }\n\n firstUpdated() {\n /** Select mainTs and presets if defined */\n this.selectedTs = this.presetTs?.length\n ? concat(\n [this.mainTs],\n this.presetTs.map(ts => ts.ts_path),\n )\n : [this.mainTs];\n\n // use to render default ts in graph\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: { value: this.selectedTs },\n }),\n );\n }\n\n _handleSearch(evt) {\n const searchExp = evt.detail.value;\n if (!searchExp) {\n this.filteredOut = [];\n } else {\n const regx = new RegExp(searchExp, 'i');\n this.filteredOut = this.tsList\n .filter(ts => !regx.test(ts.ts_shortname) && !regx.test(ts.ts_name))\n .map(item => item.ts_path);\n }\n }\n\n _openTsList() {\n if (ViewPort.size === SM) {\n this.renderRoot.querySelector('#ts-list-modal')?.show();\n } else {\n if (this._open) this.renderRoot.querySelector('#ts-list').close();\n else\n this.renderRoot\n .querySelector('#ts-list')\n .showAt(this.renderRoot.querySelector('#ts-list-selector-btn'));\n\n this._open = !this._open;\n }\n }\n\n _updateTs(evt) {\n this.selectedTs = [\n ...new Set(evt.detail.selectedItems.map(ts => ts.title)),\n ];\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: { value: this.selectedTs },\n }),\n );\n }\n}\n","import { filter, first } from 'lodash-es';\nimport { TsDataPoint } from './TsDataPoint';\n\n/**\n * Checks if a string matches a Wildcard-Pattern\n * @param str string to evaluate\n * @param rule to apply on provided string\n * @returns true if strign matches rule\n */\nfunction _matchRuleShort(str: string, rule: string): boolean {\n /* eslint-disable no-useless-escape */\n const escapeRegex = unescapedStr =>\n unescapedStr.replace(/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, '\\\\$1');\n /* eslint-enable no-useless-escape */\n return new RegExp(`^${rule.split('*').map(escapeRegex).join('.*')}$`).test(\n str,\n );\n}\n\nfunction _findTsByString(\n pattern: string,\n array: TsDataPoint[],\n matchWith?: string,\n): TsDataPoint[] {\n if (pattern && array) {\n return filter(array, ts => {\n if (matchWith) return _matchRuleShort(ts[matchWith], pattern);\n return (\n _matchRuleShort(ts.ts_shortname, pattern) ||\n _matchRuleShort(ts.ts_name, pattern) ||\n _matchRuleShort(ts.ts_path, pattern)\n );\n });\n }\n return [];\n}\n\nfunction _findTsByProperty(property, array, value): TsDataPoint[] {\n return filter(array, ts => (ts[property] === value ? ts : null));\n}\n\n/**\n * @param tsName\n * @returns true if ends with \".O\"\n */\nexport function isOriginalTsName(tsName: string) {\n return tsName.endsWith('.O');\n}\n\n/**\n * @param tsShortname System\n * @returns true if includes \".O.\"\n */\nexport function isOriginalTsShortname(tsShortname: string) {\n return tsShortname.includes('.O.');\n}\n\n/**\n * Removes all orignal timeseries from provided array\n * @param tsArray Input with all timeseries\n * @param evaluateTsName Evaluate ony human-readable name\n * @remark ts_shortname is evaluated by default\n * @returns Filtered array without original timeseries\n * */\nexport function filterOriginalTs(\n tsArray: Array,\n evaluateTsName: boolean = true,\n): Array {\n const result = tsArray.filter(ts =>\n evaluateTsName\n ? !isOriginalTsName(ts.ts_name)\n : !isOriginalTsShortname(ts.ts_shortname),\n );\n return result;\n}\n\n// Array contains tsList\nexport function findTsByString(pattern, array, matchWith) {\n return _findTsByString(pattern, array, matchWith);\n}\nexport function findFirstTsByString(pattern, array, matchWith) {\n return first(_findTsByString(pattern, array, matchWith));\n}\n// Find ts by providing a property and the corresponding value\nexport function findTsByProperty(property, array, value) {\n return _findTsByProperty(property, array, value);\n}\nexport function findFirstTsByProperty(property, array, value) {\n return first(_findTsByProperty(property, array, value));\n}\n","/* eslint-disable func-names */\n/* eslint-disable no-console */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable camelcase */\n/* eslint-disable array-callback-return */\n/* eslint-disable max-classes-per-file */\n\nimport { merge, first, flattenDeep, last } from 'lodash-es';\nimport { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { Mix, PropertyDefaultValue } from '@kisters/wcp-base/common';\nimport {\n i18nMixin,\n loaderMixin,\n getQueryObject,\n} from '@kisters/wcp-base/decorators';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport { KIWIS } from '@kisters/wcp-water/kiwis';\nimport { getRouteOptionsAndParams } from '@kisters/wcp-base/components';\nimport nls from '../../locales/index';\nimport '@kisters/wcp-water/components/ki-ts-viewer/ki-ts-viewer';\nimport '@kisters/wcp-water/components/ki-ts-viewer/ki-ts-list-select';\nimport {\n findTsByString,\n findFirstTsByString,\n filterOriginalTs,\n} from '../../common/timeseries';\n\nlet KiWISInst;\nconst graphRange = {\n min: dayjs().subtract(dayjs.duration('P1Y')).valueOf(),\n max: dayjs().valueOf(),\n};\n\n@customElement('wwp-station-ts-viewer')\nexport default class WwpStationTsViewer extends Mix(\n LitElement,\n PropertyDefaultValue,\n loaderMixin,\n [i18nMixin, { nls }],\n) {\n static styles = css``;\n // kiwis = new KIWIS({ basePath: 'http://localhost:3003/services/KiWIS/KiWIS', datasource: 1 });\n\n static get properties() {\n return {\n stationNo: String,\n stationId: String,\n parameterNo: String,\n parameterName: String,\n groupBy: { type: String, default: 'stationparameter_no' },\n // mainTs, alarmTs and presetTs are provided as patterns via presetTsFilter supporting wildcards\n // patterns will be resolved to available timeseries\n // only available timeseries will be displayed\n mainTs: Array,\n // Preselected timeseries, only loaded on first init\n presetTs: Array,\n alarmTs: Array,\n periods: {\n type: Array,\n default: [\n ['last1month', 'last6month', 'last1year', 'last5year', 'last10year'],\n ],\n },\n // Buffer for selected timeseries\n selectedTs: { type: Array, default: [] },\n };\n }\n\n onAfterEnter(location) {\n console.warn(\n 'Component is OBSOLETE and will be removed in future releases!',\n );\n const params = getRouteOptionsAndParams(location, [\n 'layerName',\n 'stationId',\n 'stationLabel',\n 'remarkAttr',\n ]);\n console.log(params);\n this.title = params.options?.title || '';\n this.parameterName = params.options?.parameter;\n this.parameterNo = params.options?.parameterNo;\n this.groupBy = params.options?.groupBy;\n this.dynMenu = params.options?.dynMenu;\n this.mainTs = params.options?.mainTs;\n this.periods = params.options?.periods;\n this.alarmTs = params.options?.alarmTs;\n this.tsFilter = params.options?.tsFilter;\n this.presetTs = params.options?.presetTs;\n this.stationLabel = params.options?.stationLabel;\n this.alarmTs = params.options?.alarmTs || [];\n this.stationId = params.stationId;\n\n if (params?.options?.defaultPeriod) {\n graphRange.min = dayjs()\n .subtract(\n dayjs.duration(params.options.defaultPeriod || 'P1Y').asMinutes(),\n 'minute',\n )\n .valueOf();\n }\n }\n\n async firstUpdated() {\n super.firstUpdated();\n KiWISInst = new KIWIS({ ...this.dynMenu.kiwis });\n await this.fetchTsList();\n }\n\n async fetchTsList() {\n const queryparams = {\n metadata: true,\n station_id: this.stationId,\n };\n queryparams[this.groupBy] = this.parameterNo;\n let list = await KiWISInst.getTimeseriesList(queryparams, [\n 'ts_id',\n 'ts_name',\n 'ts_shortname',\n 'coverage',\n 'ts_path',\n 'ca_ts',\n 'stationparameter_name',\n 'stationparameter_longname',\n 'stationparameter_no',\n 'ts_unitsymbol',\n ]);\n\n // Remove empty ts and filter by provided definition\n list = list.filter(ts => ts.to !== '');\n if (this.tsFilter) {\n list = flattenDeep(\n this.tsFilter?.map(pattern => {\n const res = findTsByString(pattern, list);\n // Filter all timeseries which are original timeseries (ending with .O)\n if (this.filterOriginal) return filterOriginalTs(res);\n return res;\n }),\n );\n }\n // Resolve timeseries objects from patterns\n this._resolveTsFromPatterns(list);\n\n // Further checks\n list.map(item => {\n // Detect alarmTs\n\n item.isBinary = item.ts_shortname.includes('.Binary.');\n\n if (\n this.thresholdTsList &&\n Array.isArray(this.thresholdTsList) &&\n this.thresholdTsList\n .flatMap(t => t.ts_shortname)\n .includes(item.ts_shortname)\n )\n item.isThreshold = true;\n // Mark as preselected to keep ts-selector in sync with chart\n if (\n this.presetTsList\n .flatMap(p => p.ts_shortname)\n ?.includes(item.ts_shortname)\n )\n item.preselected = true;\n });\n this.tsList = list;\n this.requestUpdate();\n }\n\n // Convert provided patterns to available timeseries\n _resolveTsFromPatterns(l = this.tsList) {\n // Find TS\n this.mainTsObj =\n first(flattenDeep(this.mainTs?.map(ts => findTsByString(ts, l)))) ||\n first(l) ||\n {};\n this.thresholdTsList = flattenDeep(\n this.alarmTs?.map(ts => findTsByString(ts, l)),\n );\n this.presetTsList = flattenDeep(\n this.presetTs?.map(ts => findTsByString(ts, l)),\n );\n console.log(\n 'Filter Resolving Results (Main/Alarm/Preset): ',\n this.mainTsObj,\n this.thresholdTsList,\n this.presetTsList,\n );\n }\n\n render() {\n // language=html\n return this.tsList?.length\n ? html`\n \n
${this.title}
\n
\n \n
\n \n `\n : // TODO: Loading spinner\n html`Loading...`;\n }\n\n get _tsSelect() {\n return getQueryObject(this, '#ts-selctor');\n }\n\n // eslint-disable-next-line class-methods-use-this\n get chartOptions() {\n return merge(\n {\n chart: {\n zoomType: 'x',\n },\n boost: {\n useGPUTranslations: true,\n seriesThreshold: 5,\n },\n credits: {\n enabled: false,\n },\n\n exporting: {\n chartOptions: {\n title: {\n text: `${this.parameterName}`,\n },\n subtitle: {\n text: `${this.stationNo}-${this.parameterName}`,\n },\n },\n filename: `${this.stationLabel}-${this.parameterName}`,\n fallbackToExportServer: false,\n sourceWidth: 1600,\n sourceHeight: 800,\n scale: 1,\n buttons: {\n contextButton: {\n enabled: false,\n },\n },\n },\n plotOptions: {\n series: {\n marker: {\n enabled: false,\n },\n // Disable hover animation\n states: {\n inactive: {\n enabled: false,\n },\n },\n },\n },\n series: this.selectedTs?.map(ts => ({\n label: {\n enabled: findFirstTsByString(ts, this.tsList).isThreshold ?? false,\n },\n ts,\n id: ts,\n mainTs: ts === this.mainTsObj.ts_path,\n name: findFirstTsByString(ts, this.tsList).ts_name || ts,\n step: findFirstTsByString(ts, this.tsList).isThreshold\n ? 'left'\n : undefined,\n dashStyle: findFirstTsByString(ts, this.tsList).isThreshold\n ? 'Dash'\n : 'Solid',\n })),\n title: {\n text: '',\n },\n yAxis: {\n title: {\n // Hide Y-Axis-label if no information is available\n text: this.mainTsObj\n ? `${\n this.mainTsObj.stationparameter_longname ||\n this.mainTsObj.stationparameter_name\n } [${this.mainTsObj.ts_unitsymbol}]`\n : '',\n },\n },\n },\n {},\n );\n }\n\n async getTsData({ range, ts }) {\n // Keep selected timeframe\n const tsObj = findFirstTsByString(ts, this.tsList);\n\n graphRange.min = range.min;\n graphRange.max = range.max;\n\n const { ts_path } = tsObj;\n let data;\n // Get whole dataset if ts is Alarm\n // or just selected timeframe if timeseries is regular\n if (tsObj.isThreshold) {\n data = await KiWISInst.getTimeseriesValues(\n {\n ts_path,\n period: 'complete',\n },\n null,\n 'json',\n );\n // Add pivot point for displaying alarmTs\n this._transformAlarmTs(data);\n } else if (tsObj.isBinary) {\n data = await KiWISInst.getTimeseriesValues(\n {\n metadata: true,\n md_returnfields: 'ts_id,ensembledate,ensembledispatchinfo',\n ts_path,\n },\n null,\n 'json',\n );\n if (data[0]?.ensembledate) {\n const ensTs = new Date(data[0]?.ensembledate).getTime();\n if (ensTs > graphRange.max) {\n graphRange.max = ensTs + 7 * 24 * 60 * 60 * 1000;\n }\n }\n } else {\n data = await KiWISInst.getTimeseriesValues(\n {\n ts_path: `${ts_path};compress(2000)`,\n from: range.min,\n to: range.max,\n },\n null,\n 'json',\n );\n }\n this.dispatchEvent(\n new CustomEvent('changedate', {\n bubbles: true,\n detail: {\n fromTime: range.min,\n toTime: range.max,\n },\n }),\n );\n return data[0].data;\n }\n\n _transformAlarmTs(data) {\n // Add left-side limit\n data[0].data.unshift([\n new Date('1950-1-1').toISOString(),\n data[0].data[0][1],\n ]);\n // Add right-side limit\n data[0].data.push([\n new Date(Date.now()).toISOString(),\n last(data[0].data)[1],\n ]);\n }\n\n updateTs(evt) {\n this.selectedTs = [...evt.detail.value];\n }\n}\n","import FontSymbol from 'ol-ext/style/FontSymbol';\nimport Fill from 'ol/style/Fill';\nimport Stroke from 'ol/style/Stroke';\nimport olStyleImage from 'ol/style/Image';\n\n/*\n * must ensure font css loaded before use it.\n * */\n\nconst tmpCanvas = document.createElement('CANVAS');\nconst tmpCanvasCtx = tmpCanvas.getContext('2d');\n\nolStyleImage.prototype.getImagePNGLegend = function () {\n const canvas = this.getImage(1);\n if (canvas) {\n try {\n tmpCanvasCtx.restore();\n tmpCanvas.width = canvas.width;\n tmpCanvas.height = canvas.height;\n if (this.getRotation()) {\n const half = canvas.width / 2;\n tmpCanvasCtx.translate(half, half);\n tmpCanvasCtx.rotate(this.getRotation());\n tmpCanvasCtx.drawImage(canvas, half * -1, half * -1);\n return tmpCanvas.toDataURL('image/png');\n }\n\n tmpCanvasCtx.drawImage(canvas, 0, 0);\n return tmpCanvas.toDataURL('image/png');\n } catch (e) {\n return false;\n }\n } else {\n return false;\n }\n};\nexport class FontIcon extends FontSymbol {\n constructor({\n iconTemplate = '',\n iconTemplateDecimals = 0,\n icon = 'ki ki-info-circle',\n color = 'darkblue',\n shape = 'circle',\n radius = 10,\n rotation = 0,\n rotateWithView = false,\n backgroundColor,\n border /* color,width */,\n fontSize = 1,\n } = {}) {\n let glyph;\n let iconStyle;\n if (icon.length > 3) {\n const el = document.createElement('i');\n el.className = icon;\n el.setAttribute('style', 'display:none');\n document.body.append(el);\n const cs = window.getComputedStyle(el, ':before');\n iconStyle = {\n content: cs.getPropertyValue('content'),\n fontFamily: cs.getPropertyValue('font-family'),\n fontWeight: cs.getPropertyValue('font-weight'),\n fontSize: cs.getPropertyValue('font-size'),\n backgroundColor: 'rgb(0,255,0)',\n };\n if (iconStyle.content.length === 3) {\n iconStyle.content = iconStyle.content.charAt(1);\n } else if (iconStyle.content.length === 1) {\n // safari browser\n iconStyle.content = iconStyle.content.charAt(0);\n }\n document.body.removeChild(el);\n glyph = {\n char: iconStyle.content,\n font: iconStyle.fontFamily,\n theme: 'none',\n name: 'none',\n search: '',\n };\n } else {\n glyph = {\n char: icon,\n font: 'Arial',\n theme: 'none',\n name: 'none',\n search: '',\n iconTemplate,\n iconTemplateDecimals,\n };\n }\n super({\n form: shape,\n gradient: false,\n glyph,\n fontSize, // related to radius\n fontStyle: iconStyle ? iconStyle.fontWeight : 900, // need for font awesome\n radius,\n rotation,\n rotateWithView,\n offsetY: 0,\n color,\n fill: backgroundColor && new Fill({ color: backgroundColor }),\n stroke: border && new Stroke(border),\n });\n }\n\n getGlyph(name) {\n if (typeof name === 'object') {\n return name;\n }\n return super.getGlyph(name);\n }\n\n getImagePNGLegend = olStyleImage.prototype.getImagePNGLegend;\n}\n","import Style from 'ol/style/Style';\nimport Icon from 'ol/style/Icon';\nimport Fill from 'ol/style/Fill';\nimport Stroke from 'ol/style/Stroke';\nimport { FontIcon } from './FontIcon';\n\nfunction descar(arys, fn) {\n let result = [null];\n\n arys.forEach(ary => {\n const newResult = [];\n [...ary, null].forEach(item => {\n result.forEach(reItem => {\n if (reItem && item) {\n newResult.push(fn(reItem, item));\n } else {\n newResult.push(reItem || item);\n }\n });\n });\n result = result.concat(newResult);\n });\n\n return result.filter(r => !!r);\n}\n\nexport default class LegendFactory {\n constructor(classification = {}) {\n // TODO use image instead fontIcon, to reuse it and good for performance?\n\n this.label = classification.label;\n\n this.description = classification.description;\n this.hideEmptyClasses = classification.hideEmptyClasses;\n this.notInteractive = classification.notInteractive;\n this.tagProperty = classification.tagProperty || '__tag';\n\n this.selectedMarkers = {}; // TODO move style settings to station,\n this.pngs = {};\n this.labels = {};\n this.tagCount = {};\n this.defaultMarker = this._createIconStyle(classification.default?.marker);\n this.defaultMarkerStyle = classification.default?.marker;\n\n this.markers = { _default: this.defaultMarker };\n this.polygons = {\n _default: this._createPolygonStyle(classification.default?.marker),\n };\n this.markers_ = { _default: classification.default?.marker };\n\n this.pngs._default = this.defaultMarker.icon\n ? this.defaultMarker.icon.image_.getImagePNGLegend()\n : this.defaultMarker.image_.getImagePNGLegend();\n this.tagGroups = classification.tags || [];\n if (!Array.isArray(this.tagGroups[0])) {\n this.tagGroups = [this.tagGroups];\n }\n this.tagGroups.forEach((tg, j) => {\n tg.forEach((tag, i) => {\n tag.zIndex = tag.zIndex || i + j;\n });\n });\n\n const allTags = descar(this.tagGroups, (tag1, tag2) => ({\n name: `${tag1.name}|${tag2.name}`,\n hideInLegend: tag1.hideInLegend || tag2.hideInLegend,\n deactivate: tag1.deactivate || tag2.deactivate,\n label: `${tag1.label},${tag2.label}`,\n zIndex: tag1.zIndex + tag2.zIndex,\n marker: {\n ...tag1.marker,\n ...tag2.marker,\n },\n }));\n\n allTags.forEach(item => {\n const marker = this._createIconStyle(item.marker, item.zIndex);\n this.markers[item.name] = marker;\n this.polygons[item.name] = this._createPolygonStyle(\n item.marker,\n item.zIndex,\n );\n this.markers_[item.name] = item.marker;\n this.selectedMarkers[item.name] = this._selectedStyle(item.marker); // TODO svg ?\n this.pngs[item.name] =\n item.marker.icon?.svg || marker.image_.getImagePNGLegend();\n this.labels[item.name] = item.label;\n return {\n ...item,\n marker,\n };\n });\n\n this.legendOptions = {\n description: this.description,\n label: this.label,\n notInteractive: this.notInteractive,\n hideEmptyClasses: this.hideEmptyClasses,\n items: this.tagGroups.map(tgs =>\n tgs.map(item => ({\n icon: this.pngs[item.name],\n label: item.label,\n name: item.name,\n hidden: item.hideInLegend,\n deactivate: item.deactivate,\n })),\n ),\n };\n }\n\n getMarker(item) {\n return this.markers[item[this.tagProperty]] || this.defaultMarker;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _createPolygonStyle(marker = {}, zIndex = 0) {\n return new Style({\n fill: new Fill({\n color: marker.backgroundColor,\n }),\n stroke: new Stroke(marker.border),\n zIndex,\n });\n }\n\n // can be override\n // eslint-disable-next-line class-methods-use-this\n _createIconStyle(marker = {}, zIndex = 0) {\n if (marker.icon?.svg) {\n return new Style({\n image: new Icon({\n src: marker.icon.svg,\n }),\n });\n }\n return new Style({\n image: new FontIcon({\n border: { color: 'white', width: 1 },\n ...this.defaultMarkerStyle,\n ...marker,\n }), // all style will mix on default\n zIndex,\n });\n }\n\n // eslint-disable-next-line class-methods-use-this\n _selectedStyle(marker) {\n marker = {\n ...this.defaultMarkerStyle,\n ...marker,\n };\n return [\n new Style({\n image: new FontIcon({\n border: { color: '#3399FF', width: 1 },\n ...marker,\n icon: 'ki ki-arrow-alt-to-bottom',\n backgroundColor: '#3399FF',\n }),\n }),\n ];\n }\n\n getLegendOptions() {\n return this.legendOptions;\n }\n}\n","import dayjs from '@kisters/wcp-base/common/dayjsext';\nimport { orderBy, get } from 'lodash-es';\nimport { template } from '@kisters/wcp-base/common';\nimport { isArray } from 'highcharts';\n\nfunction getValueRule(\n key: string,\n rule: string | Object,\n): (item: Object) => string | number | Array | undefined {\n const _getValue = (item: Object) => get(item, key);\n let getValue = (item: Object) => _getValue(item);\n if (typeof rule === 'object') {\n if (Object.prototype.hasOwnProperty.call(rule, 'last')) {\n getValue = item => {\n const values = _getValue(item);\n if ((values?.length ?? 0) > 0) {\n return values[values.length - 1];\n }\n return undefined;\n };\n }\n\n if (Object.prototype.hasOwnProperty.call(rule, 'first')) {\n getValue = item => {\n const values = _getValue(item);\n if ((values?.length ?? 0) > 0) {\n return values[0];\n }\n return undefined;\n };\n }\n\n if (Object.prototype.hasOwnProperty.call(rule, 'resultIndex')) {\n const oldGetValue = getValue;\n getValue = item => {\n const values = oldGetValue(item);\n if ((values?.length ?? 0) > 0) {\n return values[rule.resultIndex];\n }\n return undefined;\n };\n }\n }\n return getValue;\n}\n\nfunction getExistsRule(\n propExists: string | Array,\n): (item: Object) => boolean {\n return (item: Object) => {\n let cond = propExists;\n if (!isArray(cond)) {\n cond = [cond as string];\n }\n return (cond as Array).every((token: string) => {\n const value = get(item, token);\n return value !== undefined && value !== null && value !== '';\n });\n };\n}\n\nfunction getNegatedRule(\n rule: string | object,\n key = '',\n): (item: Object) => boolean {\n // eslint-disable-next-line no-use-before-define\n const internalRule = createRule(key, rule);\n return (item: Object) => !internalRule(item);\n}\n\nfunction getInRule(\n key: string,\n rule: string | object,\n): (item: object) => boolean {\n const getValue = getValueRule(key, rule);\n let inArray = rule.in;\n if ((inArray?.length ?? 0) === 0) {\n inArray = [];\n }\n return (item: object) => inArray.indexOf(getValue(item)) >= 0;\n}\n\nfunction getIncludesRule(\n key: string,\n rule: string | object,\n): (item: object) => boolean {\n const getValue = getValueRule(key, rule);\n const mustInclude = rule.includes;\n return (item: object) => {\n const values = getValue(item);\n if (!Array.isArray(values) && !(typeof values === 'string')) {\n return false;\n }\n return values.includes(mustInclude);\n };\n}\n\nfunction getExactRule(\n key: string,\n rule: string | object,\n): (item: object) => boolean {\n const getValue = getValueRule(key, rule);\n const mustBe = rule.exact;\n return (item: object) => {\n const values = getValue(item);\n if (!Array.isArray(values) || !Array.isArray(mustBe)) {\n return values === mustBe;\n }\n\n return (\n values.every(value => mustBe.includes(value)) &&\n mustBe.every(value => values.includes(value))\n );\n };\n}\n\nfunction getMinRule(\n key: string,\n rule: string | object,\n): (item: object) => boolean {\n const getValue = getValueRule(key, rule);\n const multiplier = rule.multiplier || 1;\n const ruleMin = rule.min;\n const ruleMinString = typeof ruleMin === 'string';\n const ruleAbs = rule.absolute;\n\n return (item: object) => {\n const min = ruleMinString\n ? template(ruleMin, item)\n ?.replace(',', '.')\n .replace(/[^\\d.-]/g, '')\n : ruleMin;\n\n const _val = getValue(item);\n const value = ruleAbs && typeof _val === 'number' ? Math.abs(_val) : _val;\n\n return min !== '' && value !== undefined && value >= min * multiplier;\n };\n}\n\nfunction getMaxRule(\n key: string,\n rule: string | object,\n): (item: object) => boolean {\n const getValue = getValueRule(key, rule);\n const multiplier = rule.multiplier || 1;\n const ruleMax = rule.max;\n const ruleMaxString = typeof ruleMax === 'string';\n const ruleAbs = rule.absolute;\n\n return (item: object) => {\n const max = ruleMaxString\n ? template(ruleMax, item)\n ?.replace(',', '.')\n .replace(/[^\\d.-]/g, '')\n : ruleMax;\n\n const _val = getValue(item);\n const value = ruleAbs && typeof _val === 'number' ? Math.abs(_val) : _val;\n\n return max !== '' && value !== undefined && value <= max * multiplier;\n };\n}\n\nfunction getDurationRule(\n key: string,\n rule: string | object,\n): (item: object) => boolean {\n const getValue = getValueRule(key, rule);\n const last = dayjs().tz().subtract(dayjs.duration(rule.duration));\n return (item: object) => {\n if (item.station_no === '22016') {\n console.log(\n item,\n key,\n getValue(item),\n dayjs(getValue(item)).tz() >= last,\n );\n }\n return dayjs(getValue(item)).tz() >= last;\n };\n}\n\nfunction createRule(key: string, rule: string | object) {\n if (key === 'not') {\n return getNegatedRule(rule);\n }\n if (key === 'exists') {\n return getExistsRule(rule);\n }\n if (rule && typeof rule === 'object') {\n if (Object.prototype.hasOwnProperty.call(rule, 'in')) {\n return getInRule(key, rule);\n }\n if (Object.prototype.hasOwnProperty.call(rule, 'includes')) {\n return getIncludesRule(key, rule);\n }\n if (Object.prototype.hasOwnProperty.call(rule, 'exact')) {\n return getExactRule(key, rule);\n }\n if (\n Object.prototype.hasOwnProperty.call(rule, 'max') &&\n Object.prototype.hasOwnProperty.call(rule, 'min')\n ) {\n const minRule = getMinRule(key, rule);\n const maxRule = getMaxRule(key, rule);\n return (item: object) => minRule(item) && maxRule(item);\n }\n if (Object.prototype.hasOwnProperty.call(rule, 'max')) {\n return getMaxRule(key, rule);\n }\n if (Object.prototype.hasOwnProperty.call(rule, 'min')) {\n return getMinRule(key, rule);\n }\n if (Object.prototype.hasOwnProperty.call(rule, 'not')) {\n return getNegatedRule(rule.not, key);\n }\n if (Object.prototype.hasOwnProperty.call(rule, 'duration')) {\n return getDurationRule(key, rule);\n }\n if (Object.prototype.hasOwnProperty.call(rule, 'exists')) {\n return getExistsRule(rule.exists);\n }\n // TODO no rule\n return () => true;\n }\n return item => get(item, key) === rule;\n}\n\n// TODO move out.\n// TODO use symbol for _default\nexport default class Classifier {\n constructor({ label, tags = [], tagProperty = '__tag' } = {}) {\n this.label = label;\n this.valueProperty = 'ts_value';\n this.tagProperty = tagProperty;\n\n if (!Array.isArray(tags[0])) {\n tags = [tags];\n }\n\n this.tagGroups = tags.map(tgs =>\n orderBy(tgs, 'priority').map(tag => ({\n ...tag,\n filter: this._createFilterFn(tag.filter),\n })),\n );\n }\n\n _classify(dataItem) {\n dataItem = { ...dataItem, [this.tagProperty]: '_default' };\n this.tagGroups.forEach(tgs => {\n tgs.some((item, i) => {\n if (item.filter(dataItem)) {\n if (\n !dataItem[this.tagProperty] ||\n dataItem[this.tagProperty] === '_default'\n ) {\n dataItem[this.tagProperty] = item.name;\n if (item.invalidateValue) {\n dataItem.invalidatedValue = dataItem[this.valueProperty];\n dataItem[this.valueProperty] = null;\n }\n } else {\n dataItem[this.tagProperty] += `|${item.name}`;\n } /** Sorting - e.g. ignore \"remark\" in multi classification, see LANUV-204 (STationsinformationen) */\n if (!item.classificationIgnore) {\n dataItem.__tagpriority = item.sortPriority || i;\n dataItem.__tag_label = item.label || '';\n }\n return true;\n }\n return false;\n });\n });\n\n return dataItem;\n }\n\n classify(data) {\n return data.map(item => this._classify(item));\n }\n\n // able to override\n // eslint-disable-next-line class-methods-use-this\n _createFilterFn(filter) {\n if (typeof filter === 'function') {\n return filter;\n }\n\n // TODO use 3rd party standard filter syntax\n const rules = Object.keys(filter).map(key => createRule(key, filter[key]));\n return function filterFn(item) {\n return rules.reduce((prev, rule) => prev && rule(item), true);\n };\n }\n\n getTag(station) {\n return station[this.tagProperty];\n }\n}\n","import { html } from 'lit';\n\n// eslint-disable-next-line default-param-last\nexport function StatusIcon(image, label = '', col) {\n return html` \n \"${label}\"\n `;\n}\n","export const getTrendArrow = (dir, rotation) => {\n let deg;\n if (dir > 15) {\n deg = rotation ? 4.71238898038469 : '-90';\n } else if (dir > 5) {\n deg = rotation ? 5.497787143782138 : '-45';\n } else if (dir > -5) {\n deg = rotation ? 0 : '0';\n } else if (dir > -15) {\n deg = rotation ? 0.7853981633974483 : '45';\n } else if (dir > -Infinity) {\n deg = rotation ? 1.5707963267948966 : '90';\n }\n return deg;\n};\n","import { css } from 'lit';\n// language=CSS\nexport default css`\n :host {\n display: block;\n position: relative;\n height: 100%;\n }\n\n :host ki-searchbox {\n border-radius: 0;\n transition: none;\n flex: 0;\n position: absolute;\n max-width: 35%;\n right: 20px;\n top: 10px;\n height: 40px;\n box-shadow: none;\n align-items: center;\n z-index: 3;\n }\n\n :host ki-switcher:hover {\n border-bottom: 1px solid rgba(0, 0, 0, 0.87);\n }\n\n :host #copyToClipboardButton {\n position: absolute;\n top: 10px;\n right: 300px;\n z-index: 2;\n }\n\n :host(.sm-screen) .downloadButton {\n display: none;\n }\n\n #multiGraphDialog {\n width: 95vw;\n height: 95vh;\n top: 0px;\n }\n\n #multiGraphDialog::part(content) {\n padding: 0px;\n }\n\n #selectedStationTableDialog {\n max-width: 95vw;\n max-height: 95vh;\n }\n\n #selectedStationTableDialog::part(content) {\n padding: 0px;\n }\n\n .downloadButton {\n position: absolute;\n z-index: 2;\n right: 350px;\n top: 10px;\n }\n\n ki-wcp-wwp-filter {\n width: 33vw;\n position: absolute;\n left: 20px;\n top: 10px;\n z-index: 3;\n }\n\n :host ki-switcher {\n /*border: 1px solid var(--theme-color);*/\n border-bottom: 1px solid rgba(0, 0, 0, 0.42);\n box-shadow: none;\n border-radius: 0;\n position: absolute;\n top: 10px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 3;\n }\n\n ki-stack {\n height: 100%;\n }\n\n ki-station-map {\n height: 100%;\n width: 100%;\n display: block;\n }\n\n ki-stack > .map-container {\n display: block;\n }\n\n ki-stack > .overview-container {\n padding-top: 60px;\n box-sizing: border-box;\n }\n\n ki-stack > .station-list {\n padding-top: 60px;\n box-sizing: border-box;\n background: white;\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12),\n 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n z-index: 1;\n top: 0;\n left: auto;\n right: -100%;\n display: block;\n transition: right 0.6s ease-in-out;\n }\n\n ki-stack > .station-list.selected {\n right: 0;\n }\n\n #selectedStations {\n position: absolute;\n bottom: 20px;\n transform: translateX(-50%);\n width: auto;\n left: 50%;\n z-index: 1;\n }\n\n ki-responsive-table {\n width: 100%;\n min-height: 50px;\n flex: 1;\n }\n\n :host(.table) ki-searchbox,\n :host(.table) ki-switcher {\n box-shadow: none;\n border: 1px solid lightgray;\n transition: all 0.3s ease-in-out 0.6s;\n }\n\n :host(.sm-screen) ki-searchbox {\n width: 100%;\n top: 10px;\n min-width: 33%;\n max-width: 33%;\n right: 5px;\n }\n\n :host(.sm-screen) #copyToClipboardButton {\n top: 12px;\n left: 120px;\n }\n\n :host(.sm-screen) ki-wcp-wwp-filter {\n top: 10px;\n left: 5px;\n padding: 2px;\n display: flex;\n align-items: center;\n }\n\n :host(.sm-screen) ki-switcher {\n top: 10px;\n }\n\n :host(.sm-screen) ki-stack > .station-list {\n padding-top: 50px;\n }\n\n ki-legend {\n bottom: 40px;\n left: 20px;\n max-width: 400px;\n transition: 0.6s all;\n z-index: 1;\n }\n\n ts-graph-viewer {\n background: white;\n width: 100%;\n position: absolute;\n z-index: 2;\n top: 0px;\n bottom: 0px;\n }\n\n ts-graph-viewer::part(search) {\n display: none;\n }\n\n .lastUpdate {\n position: absolute;\n bottom: 10px;\n color: rgb(74, 74, 73);\n left: 23px;\n font-size: 0.8em;\n background: var(\n --ki-overview-lastUpdate-background,\n rgba(255, 255, 255, 0)\n );\n padding: 2px;\n }\n\n :host(.sm-screen) .lastUpdate,\n :host(.overview) .lastUpdate {\n display: none;\n }\n\n :host(.sm-screen) ki-legend {\n display: block;\n top: unset;\n bottom: 85px;\n right: unset;\n left: 5px;\n z-index: unset;\n }\n\n :host(.table) ki-legend {\n left: unset;\n right: 20px;\n }\n\n :host(.sm-screen.table) ki-legend,\n :host(.overview) ki-legend {\n display: none;\n }\n\n :host(.md-screen) ki-station-map::part(overview-map) {\n background-color: rgba(255, 255, 255, 0.5);\n }\n\n :host(.sm-screen) ki-wcp-wwp-filter {\n left: 5px;\n top: 10px;\n display: inline-flex;\n padding: 0px;\n }\n\n :host(.md-screen) ki-wcp-wwp-filter {\n left: 5px;\n top: 10px;\n display: flex;\n padding: 0px;\n }\n\n :host(.md-screen) ki-legend {\n left: 5px;\n }\n\n :host(.sm-screen) ki-switcher {\n left: 50%;\n }\n`;\n","import proj4 from 'proj4';\nimport { register } from 'ol/proj/proj4';\nimport { containsCoordinate } from 'ol/extent';\nimport { get as getProjection } from 'ol/proj';\n\nlet registeredProjections = false;\n\nexport function registerProjections(mapCfg) {\n if (mapCfg.projections && !registeredProjections) {\n mapCfg.projections.forEach(proj => {\n const extent = proj.length === 3 ? proj.pop() : null;\n proj4.defs(proj[0], proj[1]);\n const olProj = getProjection(proj[0]);\n if (olProj && extent) {\n olProj.setExtent(extent);\n }\n });\n registeredProjections = true;\n register(proj4);\n }\n}\n\nexport function reproject(data, mapCfg) {\n try {\n registerProjections(mapCfg);\n } catch (e) {\n console.error('error registering projections', mapCfg);\n }\n\n const viewProjection = mapCfg?.view?.projection || 'EPSG:3857';\n const dataProjection = mapCfg?.dataProjection || 'EPSG:4326';\n let x = 'station_longitude';\n let y = 'station_latitude';\n if (mapCfg.crs === 'regional') {\n x = 'station_carteasting';\n y = 'station_cartnorthing';\n } else if (mapCfg.crs === 'local') {\n x = 'station_local_x';\n y = 'station_local_y';\n }\n\n const stations = [];\n\n data.forEach(station => {\n if (station[x] && station[y]) {\n const point =\n dataProjection !== viewProjection\n ? proj4(dataProjection, viewProjection, [\n parseFloat(station[x]),\n parseFloat(station[y]),\n ])\n : [parseFloat(station[x]), parseFloat(station[y])];\n if (station.Web_Offset) {\n try {\n const offset = JSON.parse(station.Web_Offset);\n point[0] += offset[0];\n point[1] += offset[1];\n } catch (e) {\n console.error('Could no parse station offset');\n }\n }\n if (mapCfg.view.extent) {\n if (containsCoordinate(mapCfg.view.extent, point)) {\n station.point = point;\n stations.push(station);\n } else {\n console.warn('station outside exten', station);\n }\n } else {\n station.point = point;\n stations.push(station);\n }\n }\n });\n // console.log(\"reproject: \", new Date().getTime()-start)\n return stations;\n}\n","import { css, html } from 'lit';\nimport '@ui5/webcomponents/dist/Select';\nimport '@ui5/webcomponents/dist/Option';\n\nexport default function ListMode(clz) {\n return class extends clz {\n // language=CSS\n static styles = css`\n :host(.sm-screen) .row {\n display: table;\n width: 100%;\n padding: 10px;\n }\n\n :host(.sm-screen) .inner-row {\n display: table-row;\n font-size: 14px;\n width: 100%;\n }\n\n :host(.sm-screen) .label.cell {\n width: 45%;\n font-weight: 600;\n }\n\n :host(.sm-screen) .cell {\n text-align: left !important;\n white-space: normal !important;\n }\n\n :host {\n height: 100%;\n }\n\n :host(.sm-screen) .header .row {\n display: flex;\n box-sizing: border-box;\n padding: 0;\n }\n\n :host(.sm-screen) .header .row .cell {\n flex: 1;\n }\n\n ui5-select {\n overflow: hidden;\n width: 100%;\n margin: 0;\n border: none;\n height: 35px !important;\n background: white;\n }\n\n .col-selector {\n padding: 0;\n }\n `;\n\n static get properties() {\n return {\n renderListItem: {\n type: Function,\n },\n };\n }\n\n _renderHeader() {\n if (this.classList.contains('sm-screen')) {\n const sorted = this.sort[0] || {};\n const cols = this.renderingColumns.filter(c => c.sortable);\n const sortedCol = cols.find(col => col.field === sorted.field) || {\n field: this.renderingColumns[0].field,\n };\n const changeColumn = e => {\n const col = cols.find(c => c.field === e.target.selectedOption.value);\n this.sort = [{ ...sorted, field: col.field, sortBy: col.sortBy }];\n };\n const changeOrder = e => {\n this.sort = [\n {\n ...sorted,\n ascending: e.target.selectedOption.value === 'Asc',\n },\n ];\n };\n\n const getOptions = item =>\n item.field === sortedCol.field\n ? html`${item.label}`\n : html`${item.label}`;\n\n // language=html\n return html`\n
\n
\n
\n
${this.i18n.t('sortBy')}:
\n
\n
\n
\n ${cols.map(item => getOptions(item))}\n
\n
\n
\n
\n \n ${this.i18n.t('asc')}\n ${this.i18n.t('desc')}\n \n
\n
\n
\n
\n `;\n }\n return super._renderHeader();\n }\n\n renderRow(item) {\n if (this.classList.contains('sm-screen')) {\n return html`\n {\n this._onRowClick(item);\n }}\"\n >\n ${this.renderListItem(item)}\n \n `;\n }\n return super.renderRow(item);\n }\n\n renderListItem(item) {\n return html`\n ${this.renderingColumns.map(\n col => html`\n
\n
${col.label}
\n ${this._renderCell(col, item)}\n
\n `,\n )}\n `;\n }\n };\n}\n","/* eslint-disable lit-a11y/click-events-have-key-events */\n/* eslint-disable max-classes-per-file */\nimport { customElement, property } from 'lit/decorators.js';\nimport { i18nMixin, responsiveMixin } from '@kisters/wcp-base/decorators';\nimport {\n BaseTable,\n PromiseData,\n SortAble,\n ColumnHider,\n ColumnFormatter,\n Export,\n Selection,\n // LazyRendering\n} from '@kisters/wcp-base/components';\nimport { Mix } from '@kisters/wcp-base/common';\nimport nls from '../../locales/index';\nimport ListMode from './ListMode';\n\n@customElement('ki-responsive-table')\nexport default class KiResponsiveTable extends Mix(\n BaseTable,\n [i18nMixin, { nls }],\n Selection,\n responsiveMixin,\n PromiseData,\n SortAble,\n ColumnFormatter,\n ColumnHider,\n // LazyRendering,\n ListMode,\n Export,\n) {\n static nls = nls;\n\n @property({ type: Boolean })\n selectionActive = false;\n\n multiselection = true;\n\n _timeout;\n\n popupContainer;\n\n popupTimeout: ReturnType | undefined;\n\n constructor() {\n super();\n this.noDataMessage = this.i18n.t('noDataMessage');\n this.normalizeSpecialCharacters = true;\n }\n\n // eslint-disable-next-line class-methods-use-this\n get localStorageId() {\n return `ww-station-table-columnHidder`;\n }\n\n showPopup(station, e) {\n this.popupElement = document.createElement(\n this.infoTag || 'ki-station-info',\n );\n const pelement = this.popupElement;\n\n pelement.layerAlias = this.layerAlias;\n pelement.stations = [station];\n pelement.style.position = 'fixed';\n pelement.style.background = 'white';\n pelement.style.zIndex = '111';\n pelement.style.border = '1px solid #ddd';\n this.popupContainer.appendChild(pelement);\n pelement.style.display = 'block';\n // const tablebody = this.renderRoot.querySelector('.body');\n // const {top} = tablebody.getBoundingClientRect();\n const top = 150;\n const obs = new ResizeObserver(() => {\n if (pelement.clientHeight > 0) {\n const topoffset = top + pelement.clientHeight;\n const maxLeft = window.document.body.clientWidth - pelement.clientWidth;\n const posY =\n e.clientY > topoffset ? e.clientY - pelement.clientHeight : e.clientY;\n const posX =\n e.clientX > maxLeft\n ? e.clientX - pelement.clientWidth - 30\n : e.clientX + 30;\n\n pelement.style.left = `${posX}px`;\n pelement.style.top = `${posY}px`;\n }\n });\n\n obs.observe(pelement);\n }\n\n hidePopup() {\n if (this.popupElement) {\n this.popupElement.remove();\n }\n }\n\n disconnectedCallback() {\n if (super.disconnectedCallback) super.disconnectedCallback();\n this.hidePopup();\n }\n\n showPopupForItem(item, e) {\n this.hidePopup();\n this.showPopup(item, e);\n }\n\n startPopupTimer(item, e) {\n if (!this.classList.contains('sm-screen') && this.tablePopup) {\n if (this.popupTimeout) {\n clearTimeout(this.popupTimeout);\n }\n this.popupTimeout = setTimeout(() => this.showPopupForItem(item, e), 200);\n }\n }\n\n endPopupTimer() {\n if (this.popupTimeout) {\n clearTimeout(this.popupTimeout);\n this.popupTimeout = undefined;\n }\n this.hidePopup();\n }\n\n mouseenter(e, item) {\n this.startPopupTimer(item, e);\n }\n\n mouseleave(e) {\n this.endPopupTimer(e);\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Mix } from '@kisters/wcp-base/common';\nimport {\n i18nMixin,\n SM,\n ViewPort,\n responsiveMixin,\n getQueryObject,\n} from '@kisters/wcp-base/decorators';\nimport '@kisters/wcp-base/components';\n// eslint-disable-next-line import/extensions\nimport { repeat } from 'lit/directives/repeat.js';\nimport { uniqBy, orderBy, get } from 'lodash-es';\nimport '@ui5/webcomponents/dist/MultiComboBox';\nimport '@ui5/webcomponents/dist/ComboBox';\nimport nls from '../../locales/index';\nimport { Filter } from './Filter';\n\nconst getDisplayValue = (item: any, template: string): string => {\n let returnString = '';\n let placeholderString = '';\n let capturingPlaceholder = false;\n let lastCharDollar = false;\n\n // eslint-disable-next-line no-plusplus\n for (let i = 0; i < template.length; i++) {\n const currentChar = template.charAt(i);\n\n if (!capturingPlaceholder && !lastCharDollar && currentChar !== '$') {\n returnString = `${returnString}${currentChar}`;\n } else if (!capturingPlaceholder && lastCharDollar && currentChar !== '{') {\n returnString = `${returnString}$${currentChar}`;\n } else if (!capturingPlaceholder && lastCharDollar) {\n capturingPlaceholder = true;\n } else if (capturingPlaceholder && currentChar === '}') {\n returnString = `${returnString}${item[placeholderString]}`;\n capturingPlaceholder = false;\n placeholderString = '';\n } else if (capturingPlaceholder) {\n placeholderString = `${placeholderString}${currentChar}`;\n }\n\n lastCharDollar = currentChar === '$';\n }\n\n return returnString;\n};\n\n@customElement('ki-wcp-wwp-filter')\nexport default class KiWcpWwpFilter extends Mix(LitElement, responsiveMixin, [\n i18nMixin,\n { nls },\n]) {\n // language=CSS\n static styles = css`\n :host {\n display: flex;\n }\n\n ui5-multi-combobox,\n ui5-combobox {\n --_ui5_input_icon_padding: 11px;\n --_ui5_input_height: 40px;\n margin-right: 5px;\n flex: 1;\n border: 0;\n border-bottom: 1px solid var(--sapField_BorderColor);\n max-width: 250px;\n }\n\n ki-icon-btn.active,\n ki-icon-btn.selected {\n background-color: var(--theme-color-primary, #1d1d1b);\n color: white;\n }\n\n .hide {\n display: none;\n }\n\n .list-item {\n padding: 10px 20px;\n color: rgb(74, 74, 73);\n font-size: 1.2em;\n }\n\n .clear-container {\n display: flex;\n flex-direction: row;\n align-items: center;\n }\n\n .clear-icon {\n margin-right: 2px;\n cursor: pointer;\n fill: #7e7e7e;\n width: 12px;\n }\n\n ui5-combobox:not([value]) .clear-icon,\n ui5-combobox[value=''] .clear-icon,\n ui5-multi-combobox:not([value]) .clear-icon,\n ui5-multi-combobox[value=''] .clear-icon {\n display: none;\n }\n\n :host(.sm-screen) ki-icon-btn {\n margin-right: 10px;\n }\n\n :host(.sm-screen) ui5-combobox,\n :host(.md-screen) ui5-combobox,\n :host(.sm-screen) ui5-multi-combobox,\n :host(.md-screen) ui5-multi-combobox {\n margin-bottom: 5px;\n }\n `;\n\n constructor() {\n super();\n this.filters = [];\n this.favorites = [];\n }\n\n static get properties() {\n return {\n activeFilter: { type: String, default: '{}' },\n filters: { type: Array, default: [] },\n stations: { type: Array, default: [] },\n favorites: { type: Array },\n favsactive: { type: Boolean },\n };\n }\n\n // Hide favorite button\n @property({ type: Boolean })\n hideFavorite = false;\n\n get favOn() {\n let activeFilter = {};\n try {\n activeFilter = JSON.parse(this.activeFilter);\n } catch (e) {\n console.warn(`broken filter ${this.activeFilter}`);\n }\n return activeFilter.fav || false;\n }\n\n render() {\n // language=html\n return html` ${repeat(this.filters, item => this._getFilter(item))}\n ${!this.hideFavorite && this.favorites.length\n ? this._renderFavoriteBtn()\n : ''}`;\n }\n\n _renderFavoriteBtn() {\n return html` {\n this.favsactive = !this.favsactive;\n this._handleChanged();\n }}\"\n icon=\"ki ki-star\"\n >`;\n }\n\n _renderBtn(filt, activeFilter) {\n return html`\n {\n if (activeFilter[filt.field]) {\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: { value: {} },\n }),\n );\n } else {\n this.renderRoot\n .querySelector(`#${filt.field.replaceAll('.', '\\\\.')}`)\n .show();\n }\n }}\"\n >\n \n `;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _getFilter(filt: Filter) {\n const activeFilter = JSON.parse(this.activeFilter);\n if (ViewPort.size === SM && filt.icon) {\n return html`\n ${this._renderBtn(filt, activeFilter)}\n \n
\n ${this.filterOptions(filt).map(\n option =>\n html` {\n const filterValue = {};\n filterValue[filt.field] = option.value;\n this.renderRoot\n .querySelector(`#${filt.field.replaceAll('.', '\\\\.')}`)\n .close();\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: { value: filterValue },\n }),\n );\n }}\"\n >\n ${option.displayValue}\n
`,\n )}\n \n
\n `;\n }\n\n const isSelected = item =>\n activeFilter[filt.field] && activeFilter[filt.field].includes(item)\n ? 'selected'\n : '';\n\n switch (filt.type) {\n case 'multiselect':\n return html`\n ${this.filterOptions(filt).map(item =>\n isSelected(item.value)\n ? html``\n : html``,\n )}\n `;\n default:\n return html`\n ${this.filterOptions(filt).map(\n item =>\n html``,\n )}\n
\n {\n const combobox = getQueryObject(\n this,\n `#${filt.field.replaceAll('.', '\\\\.')}`,\n );\n if (filt.linkedTo && typeof filt.linkedTo === 'string') {\n console.warn(\n 'Filters should be provided as Array of strings',\n filt,\n );\n filt.linkedTo = [filt.linkedTo]; // Backward compatibility (used to be string)\n }\n if (filt.linkedTo) {\n filt.linkedTo.forEach(item => {\n const node = this.renderRoot.querySelector(`#${item}`);\n if (node.value) {\n node.value = '';\n }\n });\n }\n\n combobox.value = '';\n this._handleChanged();\n }}\"\n >\n
\n `;\n }\n }\n\n filterOptions({\n field,\n type,\n sort,\n displayTemplate,\n additionalText,\n sortBy,\n sortDir,\n }) {\n let _stations = uniqBy(\n type === 'multiselect' ? this.allStations : this.stations,\n field,\n );\n\n if (sortBy) {\n _stations = orderBy(_stations, sortBy, sortDir);\n }\n\n let data: Array<{\n value: string;\n additionalText: string;\n displayValue: string;\n }> = [];\n\n _stations.forEach(item => {\n const value = get(item, field);\n const addText = item[additionalText] ?? '';\n\n if (Array.isArray(value)) {\n value.forEach(val => {\n data.push({\n value: val,\n additionalText: addText,\n displayValue: displayTemplate\n ? getDisplayValue(item, displayTemplate)\n : val,\n });\n });\n } else {\n data.push({\n value,\n additionalText: item[additionalText] ?? '',\n displayValue: displayTemplate\n ? getDisplayValue(item, displayTemplate)\n : value,\n });\n }\n });\n\n data =\n data\n .filter(\n (t, index) =>\n data.findIndex(item => item.value === t.value) === index,\n )\n .filter(t => !!t.value) || [];\n\n if (sort === 'numeric' && !sortBy) {\n data.sort((a, b) => {\n const numberVala = parseFloat(a.value);\n const numberValb = parseFloat(b.value);\n // eslint-disable-next-line no-restricted-globals\n if (!isNaN(numberVala) && !isNaN(numberValb)) {\n if (numberVala > numberValb) return 1;\n if (numberVala < numberValb) return -1;\n return 0;\n }\n\n if (a.value > b.value) return 1;\n if (a.value < b.value) return -1;\n return 0;\n });\n } else if (!sortBy) {\n data.sort(\n (a, b) => a.value.localeCompare && a.value.localeCompare(b.value),\n );\n }\n return data;\n }\n\n _resetValue() {\n this.value = '';\n this.renderRoot.querySelector('#input').value = '';\n this._handleChanged();\n }\n\n _handleChangedMulti() {\n const activeFilter = {\n fav: this.favsactive,\n };\n this.renderRoot.querySelectorAll('ui5-multi-combobox').forEach(node => {\n if (node.selectedValues.length) {\n activeFilter[node.id] = node.selectedValues.map(item => item.text);\n }\n });\n this.dispatchEvent(\n new CustomEvent('change', { detail: { value: activeFilter } }),\n );\n }\n\n _handleChanged() {\n const activeFilter = {\n fav: this.favsactive,\n };\n this.renderRoot.querySelectorAll('ui5-combobox').forEach(node => {\n if (node.value) activeFilter[node.id] = node.value;\n });\n this.dispatchEvent(\n new CustomEvent('change', { detail: { value: activeFilter } }),\n );\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Mix } from '@kisters/wcp-base/common';\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport Highcharts from 'highcharts/highstock';\nimport { groupBy, find } from 'lodash-es';\nimport { ExternalStation } from '@kisters/wcp-water/common';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport hclocales from '@kisters/wcp-water/common/highcharts-locales.js';\nimport nls from '../../locales/index';\nimport { getCurrentApi } from '../../api/API';\n\n// eslint-disable-next-line import/extensions\n\n@customElement('ww-map-popup')\nexport default class WwMapPopup extends Mix(LitElement, [i18nMixin, { nls }]) {\n static styles = css`\n :host {\n display: block;\n z-index: 100;\n }\n .station-name {\n padding-right: 5px;\n padding-left: 10px;\n padding-top: 10px;\n font-size: 1.2em;\n }\n\n hr {\n margin: 5px 0;\n }\n .table {\n display: table;\n line-height: 1.5em;\n }\n .row {\n display: table-row;\n }\n\n .hidden {\n display: none !important;\n }\n\n .highlight {\n font-weight: bold;\n }\n\n .cell {\n display: table-cell;\n padding: 0 10px;\n min-width: 50px;\n color: gray;\n }\n\n .label {\n color: #4a4a49;\n }\n\n .highcharts-label {\n display: none;\n }\n\n #chartcontainer {\n border-top: 1px dotted lightgray;\n height: 200px;\n min-width: 360px;\n width: 100%;\n }\n\n .remark {\n padding: 2px 10px;\n color: red;\n max-width: fit-content;\n }\n `;\n\n @property({ type: Array })\n stations: Array = [];\n\n @property({ type: String })\n stationRemark; // Additional comment in left Menu\n\n constructor() {\n super();\n if (hclocales[this.i18n.language.substring(0, 2)]) {\n Highcharts.setOptions({\n lang: hclocales[this.i18n.language.substring(0, 2)],\n });\n }\n this.stations = [];\n this.api = getCurrentApi();\n const formatter = new Intl.NumberFormat(this.i18n.language, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n this.valFormatter = {\n format(val) {\n return val === 0 ? val : formatter.format(val);\n },\n };\n }\n\n firstUpdated() {\n const node = this.shadowRoot.querySelector('#chartcontainer');\n if (node) {\n this.chart = new Highcharts.Chart(node, {\n chart: {\n animation: false,\n },\n title: {\n text: '',\n },\n subtitle: {\n text: '',\n },\n exporting: {\n enabled: false,\n },\n legend: {\n enabled: false,\n },\n labels: {\n enabled: false,\n },\n credits: {\n enabled: false,\n },\n xAxis: {\n type: 'datetime',\n },\n yAxis: [\n {\n id: 'mainYAxis',\n\n title: {\n text: '',\n },\n },\n {\n id: 'sumYAxis',\n title: {\n text: '',\n },\n opposite: true,\n },\n ],\n plotOptions: {\n series: {\n animation: false,\n label: {\n enabled: false,\n },\n },\n },\n series: [\n {\n id: 'preview',\n data: [],\n label: {\n enabled: false,\n },\n },\n {\n id: 'linehelper',\n type: 'scatter',\n data: [],\n showInLegend: false,\n marker: {\n enabled: false,\n },\n enableMouseTracking: false,\n },\n ],\n });\n }\n }\n\n /* eslint-disable-next-line class-methods-use-this */\n getSeries(data, tsShortname) {\n const ser = find(data, { ts_shortname: tsShortname }) || data[0];\n if (ser) {\n ser.data = ser.data.map(item => [new Date(item[0]).getTime(), item[1]]);\n }\n return ser;\n }\n\n async _setChartData(station) {\n if (this.chart && this.lastStationId !== station.station_id) {\n this.chart.showLoading();\n const series = this.chart.get('preview');\n series.setData([]);\n const mainParameter =\n station.mainParameter || Object.keys(station.ts_values)[0];\n const parameter = station.ts_values[mainParameter];\n this.lastStationId = station.station_id;\n const siteNo = station.site_no || station.ts_path?.split('/')[0] || 0;\n const stationparameterNo =\n parameter.stationparameter_no || parameter.ts_path?.split('/')[2];\n const data = await this.api.getTsData(\n `internet/stations/${siteNo}/${station.station_no}/${stationparameterNo}/week.json`,\n false,\n );\n const sdata = this.getSeries(data, parameter.ts_shortname).data;\n series.update({ type: 'line', data: sdata });\n\n this.chart.hideLoading();\n }\n }\n\n /* eslint-disable-next-line class-methods-use-this */\n _getRow(station) {\n const parameter =\n station.stationparameter_longname || station.stationparameter_name;\n const value =\n station.ts_value != null\n ? `${this.valFormatter.format(station.ts_value)} ${\n station.ts_unitsymbol\n }`\n : '-';\n const timestamp = station.timestamp\n ? dayjs(station.timestamp).tz().format('L LT')\n : '-';\n return html`
\n
${parameter}
\n
${value} (${timestamp})
\n
`;\n }\n\n _valueTmpl() {\n const station = this.stations[0];\n const river = station.WTO_OBJECT ? `(${station.WTO_OBJECT})` : '';\n if (station.external) return this._stationExternal(station);\n return html`
\n ${station.station_no} | ${station.station_name} ${river}\n
\n
\n
\n ${Object.values(station.ts_values)\n .reverse()\n .map(st => this._getRow(st))}\n
`;\n }\n\n _stationTmpl(stations) {\n const station = stations[0];\n const river = station.WTO_OBJECT ? `(${station.WTO_OBJECT})` : '';\n if (station.external) return this._stationExternal(station);\n if (this.stations.length < 2) {\n this._setChartData(station);\n }\n return html`
\n ${station.station_no} | ${station.station_name} ${river}\n
\n
${this.stationRemark}
\n
\n
\n ${station.ts_values\n ? Object.values(station.ts_values)\n .reverse()\n .map(st => this._getRow(st))\n : stations.map(st => this._getRow(st))}\n
`;\n }\n\n /* eslint-disable-next-line class-methods-use-this */\n _stationExternal(station: ExternalStation) {\n return html`
${station.station_name}
\n
\n
\n
\n
${unsafeHTML(station.description)}
\n
\n
`;\n }\n\n render() {\n if (this.stations && this.stations[0] && this.stations[0].mainParameter)\n return this._render();\n return this._renderLegacy();\n }\n\n _render() {\n return html`${this.stations[0] &&\n this.stations[0].ts_values &&\n Object.keys(this.stations[0].ts_values).length > 1\n ? this._valueTmpl()\n : Object.values(groupBy(this.stations, 'station_id')).map(station =>\n this._stationTmpl(station),\n )}\n ${(Object.keys(this.stations[0].ts_values).length < 2 &&\n !this.stations[0].external) ||\n this.stations[0].mainParameter\n ? '
'\n : ''} `;\n }\n\n _renderLegacy() {\n return html`${this.stations &&\n this.stations[0] &&\n this.stations[0].ts_values &&\n Object.keys(this.stations[0].ts_values).length > 1\n ? this._valueTmpl()\n : Object.values(groupBy(this.stations, 'station_id')).map(station =>\n this._stationTmpl(station),\n )}\n `;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Mix } from '@kisters/wcp-base/common';\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport Highcharts from 'highcharts/highstock';\nimport { orderBy } from 'lodash-es';\nimport hclocales from '@kisters/wcp-water/common/highcharts-locales.js';\nimport { until } from 'lit/directives/until.js';\nimport { getConfig } from '@kisters/wcp-base/app';\nimport nls from '../../locales/index';\nimport { getCurrentApi } from '../../api/API';\n\n// eslint-disable-next-line import/extensions\n\n@customElement('ww-map-popup-base')\nexport default class WwMapPopup extends Mix(LitElement, [i18nMixin, { nls }]) {\n static styles = css`\n :host {\n display: block;\n z-index: 100;\n max-width: 400px;\n }\n .station-name {\n padding-right: 5px;\n padding-left: 10px;\n padding-top: 10px;\n font-size: 1.2em;\n }\n\n hr {\n margin: 5px 0;\n }\n .table {\n display: table;\n line-height: 1.5em;\n }\n .row {\n display: table-row;\n }\n\n .hidden {\n display: none !important;\n }\n\n .highlight {\n font-weight: bold;\n }\n\n .cell {\n display: table-cell;\n padding: 0 10px;\n min-width: 50px;\n color: gray;\n }\n\n .label {\n color: #4a4a49;\n }\n\n .highcharts-label {\n display: none;\n }\n\n #chartcontainer {\n border-top: 1px dotted lightgray;\n height: 200px;\n min-width: 360px;\n width: 100%;\n }\n\n :host([flexSize]) #chartcontainer {\n width: auto;\n flex: 1;\n height: auto;\n }\n\n :host([flexSize]) {\n max-width: initial;\n }\n\n .remark {\n padding: 2px 10px;\n color: red;\n max-width: fit-content;\n }\n `;\n\n @property({ type: Boolean })\n flexSize = false;\n\n @property({ type: Array })\n stations: Array = [];\n\n /* Additional comment also displayed in left Menu at stationDetils\n * Config: app -> remarkAttr\n */\n @property({ type: String })\n stationRemark;\n\n constructor() {\n super();\n if (hclocales[this.i18n.language.substring(0, 2)]) {\n Highcharts.setOptions({\n lang: hclocales[this.i18n.language.substring(0, 2)],\n });\n }\n this.stations = [];\n this.api = getCurrentApi();\n this.formatter = new Intl.NumberFormat(this.i18n.language, {});\n this.config = getConfig();\n }\n\n valFormatter(val) {\n return val === 0 ? val : this.formatter.format(val);\n }\n\n /* eslint-disable-next-line class-methods-use-this */\n _getRow(station, mainParameter) {\n const isMain =\n (mainParameter && mainParameter === station.stationparameter_no) ||\n mainParameter === station.stationparameter_name;\n const parameter =\n station.stationparameter_longname || station.stationparameter_name;\n const value =\n station.ts_value != null\n ? `${this.valFormatter(station.ts_value)} ${station.ts_unitsymbol}`\n : '-';\n const timestamp = station.timestamp\n ? dayjs(station.timestamp).tz().format('L LT')\n : '-';\n return html`
\n
${parameter}
\n
${value} (${timestamp})
\n
`;\n }\n\n // eslint-disable-next-line class-methods-use-this\n getGraph(station) {\n // override for graph\n console.log(station);\n return html``;\n }\n\n _stationTmpl(stations, graph = true) {\n const station = stations[0];\n const river = station.WTO_OBJECT ? `(${station.WTO_OBJECT})` : '';\n\n if (station && this.config?.remarkAttr)\n this.stationRemark = station[this.config?.remarkAttr] || '';\n return html`
\n ${station.station_no} | ${station.station_name} ${river}\n
\n
${this.stationRemark}
\n
\n
\n ${station.ts_values\n ? orderBy(Object.values(station.ts_values), [\n item => item.stationparameter_name.toLowerCase(),\n ]).map(st => this._getRow(st, station.mainParameter))\n : stations.map(st => this._getRow(st, station.mainParameter))}\n
\n ${graph\n ? until(\n this.getGraph(station),\n html`...`,\n )\n : ''}`;\n }\n\n render() {\n return this?.stations?.length\n ? this._stationTmpl(this.stations)\n : html`
`;\n }\n}\n","// eslint-disable-next-line max-classes-per-file\nimport { html } from 'lit';\nimport { getRoutes } from '@kisters/wcp-base/components/ki-app/services/ki-app-config-service';\n\nimport WwMapPopupBase from './ww-map-popup-base';\n\nexport default class WwMapPopupAuto extends WwMapPopupBase {\n // eslint-disable-next-line class-methods-use-this\n getGraph(station) {\n const routes = getRoutes();\n\n if (routes.length <= 0) {\n return [];\n }\n\n const stationDetailRoute = routes[0].children?.find\n ? routes[0].children.find(\n child => child?.component === 'wwp-station-detail',\n )\n : undefined;\n\n if (!stationDetailRoute) {\n return [];\n }\n\n const conf = stationDetailRoute.children.find(\n item =>\n item.component.includes('ki-wwp-graph') &&\n item.options.station_parameter === station.stationparameter_no,\n );\n\n if (!conf) {\n return html``;\n }\n\n const options = JSON.parse(JSON.stringify(conf.options));\n\n options.ranges = [options.ranges[0]];\n if (conf.component === 'ki-wwp-graph-precip') {\n return html``;\n }\n\n return html``;\n }\n}\n\ncustomElements.define('ww-map-popup-auto', WwMapPopupAuto);\n","/* eslint-disable class-methods-use-this */\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { Mix } from '@kisters/wcp-base/common';\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport Highcharts from 'highcharts/highstock';\nimport { groupBy, find } from 'lodash-es';\nimport hclocales from '@kisters/wcp-water/common/highcharts-locales.js';\nimport nls from '../../locales/index';\nimport { getCurrentApi } from '../../api/API';\n\n@customElement('ww-map-popup-precip')\nexport default class WwMapPopupPrecip extends Mix(LitElement, [\n i18nMixin,\n { nls },\n]) {\n static styles = css`\n :host {\n display: block;\n }\n .station-name {\n padding-right: 5px;\n padding-left: 10px;\n padding-top: 10px;\n font-size: 1.2em;\n }\n\n hr {\n margin: 5px 0;\n }\n .table {\n display: table;\n line-height: 1.5em;\n }\n .row {\n display: table-row;\n }\n .cell {\n display: table-cell;\n padding: 0 10px;\n min-width: 50px;\n color: gray;\n }\n .label {\n color: #4a4a49;\n }\n\n #chartcontainer {\n height: 200px;\n min-width: 360px;\n width: 100%;\n }\n\n .remark {\n padding-left: 10px;\n color: red;\n max-width: fit-content;\n }\n `;\n\n @property({ type: Array })\n stations: Array = [];\n\n @property({ type: String })\n stationRemark; // Additional comment in left Menu\n\n constructor() {\n super();\n Highcharts.setOptions({\n lang: hclocales[this.i18n.language.substring(0, 2)],\n });\n this.stations = [];\n this.api = getCurrentApi();\n const formatter = new Intl.NumberFormat(this.i18n.language, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n this.valFormatter = {\n format(val) {\n return val === 0 ? val : formatter.format(val);\n },\n };\n }\n\n firstUpdated() {\n this.chart = Highcharts.chart(\n this.renderRoot.querySelector('#chartcontainer'),\n {\n chart: {\n animation: false,\n },\n title: {\n text: '',\n },\n subtitle: {\n text: '',\n },\n exporting: {\n enabled: false,\n },\n legend: {\n enabled: false,\n },\n labels: {\n enabled: false,\n },\n credits: {\n enabled: false,\n },\n xAxis: {\n type: 'datetime',\n },\n yAxis: [\n {\n id: 'mainYAxis',\n title: {\n text: '',\n },\n },\n {\n id: 'sumYAxis',\n title: {\n text: '',\n },\n opposite: true,\n },\n ],\n plotOptions: {\n series: {\n animation: false,\n label: {\n enabled: false,\n },\n },\n },\n series: [\n {\n id: 'preview',\n type: 'scatter',\n data: [],\n label: {\n enabled: false,\n },\n },\n {\n id: 'linehelper',\n type: 'scatter',\n data: [],\n showInLegend: false,\n marker: {\n enabled: false,\n },\n enableMouseTracking: false,\n },\n {\n id: 'sumline',\n type: 'line',\n data: [],\n showInLegend: false,\n enableMouseTracking: false,\n step: 'left',\n marker: { enabled: false },\n color: 'rgb(170,70,67)',\n yAxis: 'sumYAxis',\n },\n ],\n },\n );\n }\n\n /* eslint-disable-next-line class-methods-use-this */\n getSeries(data, tsShortname) {\n const ser = find(data, { ts_shortname: tsShortname }) || data[0];\n if (ser) {\n ser.data = ser.data.map(item => [new Date(item[0]).getTime(), item[1]]);\n }\n return ser;\n }\n\n async _setChartData(station) {\n if (this.chart && this.lastStationId !== station.station_id) {\n this.chart.showLoading();\n const series = this.chart.get('preview');\n const sumSeries = this.chart.get('sumline');\n sumSeries?.setData([]);\n series.setData([]);\n this.lastStationId = station.station_id;\n const siteNo = station.site_no || station.ts_path?.split('/')[0] || 0;\n const stationparameterNo =\n station.stationparameter_no || station.ts_path.split('/')[2];\n const data = await this.api.getTsData(\n `internet/stations/${siteNo}/${station.station_no}/${stationparameterNo}/week.json`,\n false,\n );\n const sdata = this.getSeries(data, station.ts_shortname).data;\n series.update({ type: 'bar', data: sdata }, false);\n\n const sumData = this._sumLine(sdata);\n sumSeries.setData(sumData);\n\n this.chart.hideLoading();\n }\n }\n\n /* eslint-disable-next-line class-methods-use-this */\n _getRow(station) {\n const parameter =\n station.stationparameter_longname || station.stationparameter_name;\n const value =\n station.ts_value != null\n ? `${this.valFormatter.format(station.ts_value)} ${\n station.ts_unitsymbol\n }`\n : '-';\n const timestamp = station.timestamp\n ? dayjs(station.timestamp).tz().format('L LT')\n : '-';\n return html`
\n
${parameter}
\n
${value} (${timestamp})
\n
`;\n }\n\n _stationTmpl(stations) {\n const station = stations[0];\n if (this.stations.length < 2) {\n this._setChartData(station);\n }\n const river = station.WTO_OBJECT ? `(${station.WTO_OBJECT})` : '';\n return html`
\n ${station.station_no} | ${station.station_name} ${river}\n
\n
${this.stationRemark}
\n
\n
${stations.map(st => this._getRow(st))}
\n `;\n }\n\n _sumLine(data: Array<[string, number]>): Array<[string, number]> {\n const sumlineData: Array<[string, number]> = [];\n let sum: number = 0;\n data.forEach(d => {\n sum += d[1];\n const t: [string, number] = [d[0], sum];\n sumlineData.push(t);\n });\n return sumlineData;\n }\n\n render() {\n return html`${Object.values(groupBy(this.stations, 'station_id')).map(\n station => this._stationTmpl(station),\n )}`;\n }\n}\n","/* eslint-disable class-methods-use-this */\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { html, LitElement } from 'lit';\nimport Highcharts from 'highcharts/highstock';\nimport nodata from 'highcharts/modules/no-data-to-display';\nimport boost from 'highcharts/modules/boost';\nimport more from 'highcharts/highcharts-more';\n\n@customElement('ww-graph-wrapper')\nexport default class WwGraphWrapper extends LitElement {\n highcharts = Highcharts;\n\n chart;\n\n @property({ type: Boolean })\n showLoading;\n\n @query('#chartcontainer')\n chartcontainer;\n\n @property({ type: Boolean })\n display;\n\n @property({ type: Array, attribute: false })\n series = [];\n\n constructor() {\n super();\n\n nodata(Highcharts);\n more(Highcharts);\n boost(Highcharts);\n }\n\n protected firstUpdated(): void {\n this.chart?.destroy();\n this.chart = new Highcharts.Chart({\n chart: {\n renderTo: this.chartcontainer,\n animation: false,\n },\n title: {\n text: '',\n },\n subtitle: {\n text: '',\n },\n exporting: {\n enabled: false,\n },\n legend: {\n enabled: false,\n },\n credits: {\n enabled: false,\n },\n xAxis: [\n {\n id: 'mainXAxis',\n type: 'datetime',\n },\n {\n visible: false,\n min: 1,\n max: 2,\n },\n ],\n yAxis: {\n id: 'mainYAxis',\n title: {\n text: '',\n },\n },\n plotOptions: {\n series: {\n animation: false,\n label: {\n enabled: false,\n },\n },\n },\n series: [],\n });\n }\n\n updated(changedProperties) {\n super.update(changedProperties);\n if (this.series) {\n if (changedProperties.has('series')) {\n this.chart.series.forEach(ser => {\n ser.remove(false);\n });\n this.series.forEach(ser => {\n this.chart.addSeries(ser, false);\n });\n this.chart.update({});\n }\n }\n }\n\n render() {\n return html``;\n }\n}\n","/* eslint-disable class-methods-use-this */\nimport { customElement } from 'lit/decorators.js';\nimport { getConfig } from '@kisters/wcp-base/app';\nimport { html } from 'lit';\nimport { KIWIS, KiwisHelper } from '@kisters/wcp-water/kiwis';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport WwMapPopupBase from './ww-map-popup-base';\nimport './ww-graph-wrapper';\n\nlet currentData = [];\nlet currentId;\n\nconst threshholdMappings = {\n 'Cmd.Sys.W.MNW': {\n width: 2,\n color: 'rgba(64,64,64, 1)',\n dashStyle: 'dash',\n label: {\n text: 'MNW',\n shortText: 'MNW',\n align: 'right',\n description: 'Mittleres Niedrigwasser*',\n y: 12,\n x: -5,\n },\n },\n 'Cmd.Sys.W.MW': {\n width: 2,\n color: 'rgba(64,64,64, 1)',\n dashStyle: 'dash',\n label: {\n text: 'MW',\n shortText: 'MW',\n align: 'right',\n description: 'Mittelwasser*',\n y: 12,\n x: -5,\n },\n },\n 'Cmd.Sys.W.MHW': {\n width: 2,\n color: 'rgba(64,64,64, 1)',\n dashStyle: 'dash',\n label: {\n text: 'MHW',\n shortText: 'MHW',\n align: 'right',\n description: 'Mittleres Hochwasser*',\n y: 12,\n x: -5,\n },\n },\n 'Cmd.Sys.W.N7W': {\n width: 2,\n color: 'rgba(197,142,69, 1)',\n dashStyle: 'dash',\n label: {\n text: 'N7W',\n shortText: 'N7W',\n align: 'center',\n description: 'Minimum der niedrigsten jährl. 7-Tages-Mittel*',\n y: 12,\n x: 25,\n },\n },\n 'Cmd.Sys.W.MN7W': {\n width: 2,\n color: 'rgba(255,221,128,1)',\n dashStyle: 'dash',\n label: {\n text: 'MN7W',\n shortText: 'MN7W',\n align: 'center',\n description: 'Mittel der niedrigsten jährl. 7-Tages-Mittel*',\n y: 12,\n x: -25,\n },\n },\n 'Cmd.Sys.W.HN7W': {\n width: 2,\n color: 'rgba(99,195,199,1)',\n dashStyle: 'dash',\n label: {\n text: 'HN7W',\n shortText: 'HN7W',\n align: 'center',\n description: 'Maximum der niedrigsten jährl. 7-Tages-Mittel*',\n y: 12,\n x: -75,\n },\n },\n 'Cmd.Sys.W.Info1': {\n width: 2,\n color: 'rgba(255, 231, 76, 1)',\n dashStyle: 'dash',\n label: {\n text: 'Informationswert 1',\n shortText: 'Info 1',\n align: 'left',\n description:\n 'Ggfs. Ausuferung des Gewässers, land- und forstwirtschaftliche Flächen können überflutet werden; leichte Verkehrsbehinderungen auf Hauptverkehrs- und Gemeindestraßen sind möglich.',\n y: 12,\n x: -5,\n },\n },\n 'Cmd.Sys.W.Info2': {\n width: 2,\n color: 'rgba(252, 186, 2, 1)',\n dashStyle: 'dash',\n label: {\n text: 'Informationswert 2',\n shortText: 'Info 2',\n align: 'left',\n description:\n 'Gefahr der Überflutung einzelner bebauter Grundstücke oder Keller; Sperrung überörtlicher Verkehrsverbindungen oder vereinzelter Einsatz der Wasser- oder Dammwehr (Feuerwehr, Katastrophenschutz) möglich.',\n y: 12,\n x: -5,\n },\n },\n 'Cmd.Sys.W.Info3': {\n width: 2,\n color: 'rgba(252, 81, 47, 1)',\n dashStyle: 'dash',\n label: {\n text: 'Informationswert 3',\n shortText: 'Info 3',\n align: 'left',\n description:\n 'Bebaute Gebiete in größerem Umfang können überflutet werden; Einsatz der Wasser- oder Dammwehr (Feuerwehr, Katastrophenschutz) in großem Umfang möglich.',\n y: 12,\n x: -5,\n },\n },\n};\n\n@customElement('ww-map-popup-dynamic')\nexport default class WwMapPopupDynamic extends WwMapPopupBase {\n constructor() {\n super();\n\n this.config = getConfig();\n this.kiwis = new KIWIS({\n basePath: KiwisHelper.resolveUrl(this.config?.kiwis, window.location),\n datasource: this.config?.kiwis.datasource || 0,\n });\n }\n\n kiwisReq(paths = [], from = '', to = '') {\n return this.kiwis.getTimeseriesValues(\n {\n dateformat: 'UNIX',\n ts_path: paths.join(),\n metadata: true,\n md_returnfields: 'ts_shortname,ts_name',\n from,\n to,\n },\n null,\n 'json',\n );\n }\n\n async getSeries(station) {\n if (this.layerAlias === 'Wasserstand') {\n const tsPath = station.ts_path || KiwisHelper.buildTsPath(station);\n const tsPathBase = tsPath.split('/').slice(0, 3).join('/');\n const alarms = [\n 'Cmd.Sys.W.Info1',\n 'Cmd.Sys.W.Info2',\n 'Cmd.Sys.W.Info3',\n ].map(item => `${tsPathBase}/${item}`);\n try {\n const tsData = await Promise.all([\n this.kiwisReq(\n [tsPath],\n dayjs().subtract(1, 'months').valueOf(),\n dayjs().valueOf(),\n ),\n this.kiwisReq(alarms),\n ]);\n const mainTsData = tsData[0] ? tsData[0][0].data ?? [] : [];\n const maxValue = Math.max(...mainTsData.map(tsv => tsv[1]));\n return [\n {\n id: 'preview',\n type: 'line',\n data: mainTsData,\n },\n ...tsData[1]\n .sort((a, b) => a.ts_shortname.localeCompare(b.ts_shortname))\n .map((item, i) => ({\n ...threshholdMappings[item.ts_shortname],\n type: 'line',\n step: 'left',\n visible: i === 0 || (item.data[0] && item.data[0][1] < maxValue),\n name: item.ts_name,\n marker: { enabled: false },\n label: {\n enabled: true,\n style: {\n color: '#111111',\n },\n },\n xAxis: 1,\n data: [\n [1, item.data[0] ? item.data[0][1] : null],\n [2, item.data[0] ? item.data[0][1] : null],\n ],\n })),\n ];\n } catch (e) {\n return [];\n }\n }\n\n if (this.layerAlias === 'Niedrigwasser') {\n const tsPath = station.ts_path || KiwisHelper.buildTsPath(station);\n const tsPathBase = tsPath.split('/').slice(0, 3).join('/');\n const alarms = ['Cmd.Sys.W.N7W', 'Cmd.Sys.W.MN7W', 'Cmd.Sys.W.HN7W'].map(\n item => `${tsPathBase}/${item}`,\n );\n try {\n const tsData = await Promise.all([\n this.kiwisReq(\n [tsPath],\n dayjs().subtract(1, 'months').valueOf(),\n dayjs().valueOf(),\n ),\n this.kiwisReq(alarms),\n ]);\n const mainTsData = tsData[0][0].data ?? [];\n return [\n {\n id: 'preview',\n type: 'line',\n data: mainTsData,\n },\n ...tsData[1]\n .sort((a, b) => a.ts_shortname.localeCompare(b.ts_shortname))\n .map(item => ({\n ...threshholdMappings[item.ts_shortname],\n type: 'line',\n step: 'left',\n\n name: item.ts_name,\n marker: { enabled: false },\n label: {\n enabled: true,\n style: {\n color: '#111111',\n },\n },\n xAxis: 1,\n data: [\n [1, item.data[0] ? item.data[0][1] : null],\n [2, item.data[0] ? item.data[0][1] : null],\n ],\n })),\n ];\n } catch (e) {\n return [];\n }\n }\n\n const tsPath = station.ts_path || KiwisHelper.buildTsPath(station);\n try {\n const tsData = await Promise.all([\n this.kiwisReq(\n [tsPath],\n dayjs().subtract(1, 'months').valueOf(),\n dayjs().valueOf(),\n ),\n ]);\n const mainTsData = tsData[0][0].data ?? [];\n return [\n {\n id: 'preview',\n type: 'line',\n data: mainTsData,\n },\n ];\n } catch (e) {\n return [];\n }\n }\n\n async getGraph() {\n const station = this.stations[0];\n const newId = station.ts_path || KiwisHelper.buildTsPath(station);\n if (currentId !== newId) {\n currentData = await this.getSeries(station);\n currentId = newId;\n }\n return html` `;\n }\n}\n","// eslint-disable-next-line max-classes-per-file\nimport { customElement } from 'lit/decorators.js';\nimport { html, LitElement, css } from 'lit';\nimport sparkline from '@fnando/sparkline/src/sparkline';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\n\n@customElement('ki-wwp-sparkline')\nexport class KiWwpSparkline extends LitElement {\n data = [];\n\n static get properties() {\n return {\n data: { type: Array },\n };\n }\n\n static styles = css`\n *[hidden] {\n display: none;\n }\n\n .tooltip {\n position: fixed;\n background: rgba(0, 0, 0, 0.7);\n color: #fff;\n padding: 2px 5px;\n font-size: 12px;\n white-space: nowrap;\n z-index: 9999;\n }\n\n .sparkline--cursor {\n stroke: orange;\n }\n\n .sparkline--spot {\n fill: red;\n stroke: red;\n }\n `;\n\n // eslint-disable-next-line class-methods-use-this\n _findClosest(target: { tagName: any; parentNode: any }, tagName: any) {\n if (target.tagName === tagName) {\n return target;\n }\n\n // eslint-disable-next-line no-cond-assign\n while ((target = target.parentNode)) {\n if (target.tagName === tagName) {\n break;\n }\n }\n\n return target;\n }\n\n protected firstUpdated(): void {\n const findClosest = (target, tagName) => {\n if (target.tagName === tagName) {\n return target;\n }\n\n // eslint-disable-next-line no-cond-assign\n while ((target = target.parentNode)) {\n if (target.tagName === tagName) {\n break;\n }\n }\n\n return target;\n };\n\n const options = {\n onmousemove(event, datapoint) {\n const svg = findClosest(event.target, 'svg');\n const tooltip = svg.nextElementSibling;\n const date = dayjs(datapoint.date).tz().format('L LT');\n\n tooltip.hidden = false;\n tooltip.textContent = `${date}: ${datapoint.value} ${datapoint.unit}`;\n tooltip.style.top = `${event.clientY}px`;\n tooltip.style.left = `${event.clientX + 20}px`;\n },\n\n onmouseout(event) {\n const svg = findClosest(event.target, 'svg');\n const tooltip = svg.nextElementSibling;\n\n tooltip.hidden = true;\n },\n };\n sparkline(this.renderRoot.querySelector('#sparkline'), this.data, options);\n }\n\n protected render(): unknown {\n return html``;\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport { filter, countBy, pickBy, every, orderBy } from 'lodash-es';\n\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport {\n navigateTo,\n getRouteOptionsAndParams,\n} from '@kisters/wcp-base/components';\nimport {\n localStorageMixin,\n responsiveMixin,\n i18nMixin,\n getQueryObject,\n queryParamMixin,\n ViewPort,\n SM,\n} from '@kisters/wcp-base/decorators';\nimport {\n LoaderMixin,\n Mix,\n PropertyDefaultValue,\n downloadFile,\n} from '@kisters/wcp-base/common';\n\nimport LegendFactory from '@kisters/wcp-water/components/ki-station-map/LegendFactory';\nimport Classifier from '@kisters/wcp-water/components/ki-station-map/Classifier';\nimport { StatusIcon } from '@kisters/wcp-water/components/ki-status-icon/ki-status-icon';\nimport { getTrendArrow } from '@kisters/wcp-water/common/base';\n\nimport { html, LitElement } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport '@ui5/webcomponents/dist/Toast';\n\nimport { getCsvDelimiter } from '@kisters/wcp-base/components/ki-app/services/ki-app-config-service';\n\nimport { getCurrentApi } from '../../api/API';\n\nimport nls from '../../locales/index';\nimport style from './wwp-overview.css?inline';\n\nimport { reproject, registerProjections } from '../../common/maputils';\nimport '../../components/ki-responsive-table/ki-responsive-table';\n\nimport '../../components/ki-wcp-wwp-filter/ki-wcp-wwp-filter';\nimport '../../components/common/ww-map-popup';\nimport '../../components/common/ww-map-popup-auto';\nimport '../../components/common/ww-map-popup-base';\nimport '../../components/common/ww-map-popup-precip';\nimport '../../components/common/ww-map-popup-dynamic';\n\nimport '../../components/ki-wwp-graph/ki-wwp-sparkline';\nimport { SortedBy } from './SortedBy';\n\n@customElement('wwp-overview')\nexport default class WwpOverview extends Mix(\n LitElement,\n LoaderMixin,\n PropertyDefaultValue,\n [\n localStorageMixin,\n { targetProperty: '__favouriteStationIds', typeParam: Array },\n ],\n [\n queryParamMixin,\n { targetProperty: 'viewSelection', selector: 'mode', defaultValue: 'map' },\n ],\n [\n queryParamMixin,\n {\n targetProperty: 'filterContent',\n selector: 'filter',\n defaultValue: '{}',\n },\n ],\n [\n queryParamMixin,\n {\n targetProperty: 'searchContent',\n selector: 'search',\n defaultValue: '',\n },\n ],\n responsiveMixin,\n [i18nMixin, { nls }],\n) {\n @query('#map')\n stationMap;\n\n static styles = style;\n\n static get properties() {\n return {\n strictSearch: { type: Boolean },\n layersToggleAll: { type: Boolean },\n layersTreeList: { type: Boolean },\n layerName: { type: String },\n showCsvExport: { type: Boolean },\n _dataLayer: { type: Object },\n quickFilters: { type: Array, default: [] },\n homeExtent: { type: Array, default: [] },\n positionProjections: { type: Array, default: [] },\n _legends: { type: Array, default: [] },\n displayStationsInLayerControl: {\n type: Boolean,\n default: true,\n attribute: false,\n },\n _view: {\n type: Object,\n default: {\n projection: 'EPSG:3857',\n zoom: 8,\n },\n attribute: false,\n },\n layerGroups: {\n type: Array,\n default: [\n 'Layers',\n 'Information',\n { name: 'Backgrounds', type: 'radio' },\n ],\n attribute: false,\n },\n };\n }\n\n layersToggleAll = false;\n\n layersTreeList = false;\n\n _firstWWVisit = 'yes';\n\n _enableAutoZoom = false;\n\n tzFormat = 'zzz';\n\n zoomReset = false;\n\n refreshTimer = true;\n\n _filterContent = '{}';\n\n currentStationExtent = null;\n\n mapsLoaded = false;\n\n @property({ type: Boolean })\n hideFavoriteButton = false;\n\n @property({ type: Boolean })\n allowViewmodeOverview = false;\n\n get filterContent() {\n return this._filterContent;\n }\n\n set filterContent(value) {\n this._filterContent = value;\n this.requestUpdate();\n }\n\n // eslint-disable-next-line no-undef\n cachePrefix = __APP_NAME__;\n\n // eslint-disable-next-line no-undef\n version = __APP_VERSION__;\n\n _searchContent = '';\n\n get searchContent() {\n return this._searchContent;\n }\n\n set searchContent(value) {\n this._searchContent = value;\n this.requestUpdate();\n }\n\n _viewSelection: 'map' | 'table' | 'overview' = 'map';\n\n api = getCurrentApi();\n\n get viewSelection() {\n return this._viewSelection;\n }\n\n set viewSelection(value) {\n this._viewSelection = value;\n this.requestUpdate();\n }\n\n ___favouriteStationIds = [];\n\n get __favouriteStationIds() {\n return this.___favouriteStationIds;\n }\n\n set __favouriteStationIds(value) {\n this.___favouriteStationIds = value;\n this.requestUpdate();\n }\n\n get searchBox() {\n return getQueryObject(this, '#searchbox');\n }\n\n overViewLayer = {\n layer: [],\n };\n\n connectedCallback() {\n if (super.connectedCallback) super.connectedCallback();\n this.addEventListener('toggledPopupColumnHider', this._toggleLegend);\n\n this._loader._$loaderCount = 1;\n this.refresh = setInterval(() => {\n if (this.refreshTimer) {\n this.getDataLayer(true);\n }\n }, 60000);\n this._firstWWVisit = sessionStorage.getItem('firstWWVisit');\n }\n\n disconnectedCallback() {\n if (super.disconnectedCallback) super.disconnectedCallback();\n this.removeEventListener('toggledPopupColumnHider', this._toggleLegend);\n clearInterval(this.refresh);\n }\n\n _toggleLegend(e) {\n const l = this.shadowRoot.querySelector('#overview-legend');\n if (l && e.detail?.visible === true) l.collapsed = true;\n }\n\n exportTable() {\n const table = getQueryObject(this, 'ki-responsive-table');\n\n if (table) {\n navigator.clipboard.writeText(table.toCSV(getCsvDelimiter())).then(\n () => {\n getQueryObject(this, '#DownloadSuccessToast').show();\n },\n () => {\n getQueryObject(this, '#DownloadFailureToast').show();\n },\n );\n } else {\n getQueryObject(this, '#DownloadNoTableToast').show();\n }\n }\n\n triggerCSVDownload() {\n const table = getQueryObject(this, 'ki-responsive-table');\n if (table) {\n downloadFile(\n table.toCSV(getCsvDelimiter()),\n `station_overview_table.csv`,\n );\n }\n }\n\n get _switcherOptions() {\n const options = [\n { label: 'Map', value: 'map', icon: 'ki ki-map' },\n { label: 'Table', value: 'table', icon: 'ki ki-table' },\n ];\n if (this.allowViewmodeOverview)\n options.push({\n label: 'Übersicht',\n value: 'overview',\n icon: 'ki ki-widgets2',\n });\n return options.map(tab => ({\n label: this.i18n.t(tab.label),\n value: tab.value,\n icon: tab.icon,\n }));\n }\n\n // eslint-disable-next-line class-methods-use-this\n get localStorageId() {\n return `wwp-favorites-ids`;\n }\n\n /**\n * Create handle during rendering\n * Pass handle to table to avoid overlapping of menu elements over popup\n */\n initPopupContainer() {\n const elem = document.createElement('div');\n elem.id = 'popupContainer';\n this.popupContainerHandle = elem;\n return html`${elem}`;\n }\n\n // Vaadin Router Method that gets called after this component is called\n // eslint-disable-next-line no-unused-vars\n onAfterEnter(location) {\n this.filterContent = '{}';\n const params = getRouteOptionsAndParams(location, ['layerName']);\n this.layerName = params.layerName;\n Object.assign(this, params.options);\n }\n\n // eslint-disable-next-line class-methods-use-this\n additionalContent() {\n return html``;\n }\n\n // eslint-disable-next-line class-methods-use-this\n parseData(data) {\n return data;\n }\n\n enableAutoZoom() {\n this._enableAutoZoom = true;\n setTimeout(() => {\n this._enableAutoZoom = false;\n }, 50);\n }\n\n render() {\n // eslint-disable-next-line wc/no-self-class\n this.classList.toggle('table', this.viewSelection === 'table');\n // TODO rename ki-station-layer to ki-maker-layer or value layer ?\n // language=html\n if (this.currentLayer !== this.layerName) {\n this.getDataLayer();\n }\n return (\n this._renderLoader() ||\n html`\n ${this.additionalContent()} ${this.initPopupContainer()}\n {\n this.enableAutoZoom();\n this.searchContent = e.detail.value;\n }}\"\n >\n \n ${this.showCsvExport && this.viewSelection === 'table'\n ? this.renderExportButton()\n : html``}\n {\n this.enableAutoZoom();\n this.filterContent = JSON.stringify(e.detail.value);\n }}\"\n >\n \n {\n this.enableAutoZoom();\n this.viewSelection = e.detail.value;\n }}\"\n >\n \n
\n ${this.viewSelection === 'table' ? this.renderTable() : html``}\n
\n
\n ${this.viewSelection === 'map' ? this.renderMap() : html``}\n
\n
\n ${this.viewSelection === 'overview' && this.allowViewmodeOverview\n ? this.renderOverview()\n : html``}\n
\n
\n \n
\n ${this.mapLastSyncedLabel\n ? this.mapLastSyncedLabel\n : this.i18n.t('lastupdated')}:\n ${dayjs.tz(this._dataLayer.creationDateInMillis).format('L LT')}\n ${this.__getTimezone()}\n
\n `\n );\n }\n\n __getTimezone() {\n if (this.tzFormat) {\n return this.i18n.exists(\n encodeURIComponent(dayjs().tz().format(this.tzFormat)),\n )\n ? this.i18n.t(encodeURIComponent(dayjs().tz().format(this.tzFormat)))\n : dayjs().tz().format(this.tzFormat);\n }\n return '';\n }\n\n renderExportButton() {\n return html`\n \n ${this.i18n.t('copyTableMessage')}\n ${this.i18n.t('copyTableNoTableMessage')}\n ${this.i18n.t('copyTableFailureMessage')}`;\n }\n\n get filteredStations() {\n const regex = new RegExp(\n `${\n this.strictSearch\n ? `^${this.searchContent.replaceAll('*', '.')}`\n : this.searchContent.replaceAll('*', '.')\n }`,\n 'i',\n );\n let filterOptions = JSON.parse(this.filterContent);\n\n if (filterOptions && this._dataLayer.config.filter) {\n filterOptions = pickBy(filterOptions, (value, key) =>\n this._dataLayer.config.filter.some(\n f => f.field === key || key === 'fav',\n ),\n );\n }\n\n let searchData = this._dataLayer.data?.filter(\n s =>\n regex.test(s.station_longname || s.station_name) ||\n regex.test(s.station_no),\n );\n if (filterOptions.fav) {\n searchData = searchData.filter(s =>\n this.__favouriteStationIds.includes(s.station_id),\n );\n }\n delete filterOptions.fav;\n return filter(searchData, obj =>\n every(filterOptions, (value, key) => {\n const val = obj[key] && obj[key].toString();\n return Array.isArray(value) ? value.includes(val) : val === value;\n }),\n ).filter(s => {\n const tag = s.__tag;\n if (tag && this._legends.length > 0) {\n return tag.split('|').every(t => this._legends.indexOf(t) !== -1);\n }\n return true;\n });\n }\n\n get quickFilters() {\n return this._dataLayer.config?.filter || [];\n }\n\n get popup() {\n return this._dataLayer.config?.popup || 'ww-map-popup';\n }\n\n get sortedBy(): Array {\n return this._dataLayer.config?.sortedBy;\n }\n\n // Presort by\n renderTable() {\n return html``;\n }\n\n _initialOrder(filteredStations: Array) {\n // Transform provided dataset from layercfg\n const fields: Array = []; // field name\n const orders: Array<'asc' | 'desc'> = [];\n if (this.sortedBy && Array.isArray(this.sortedBy)) {\n this.sortedBy.forEach(_sort => {\n _sort.ascending ? orders.push('asc') : orders.push('desc');\n _sort.sortBy ? fields.push(_sort.sortBy) : fields.push(_sort.field);\n });\n return orderBy(filteredStations, fields, orders);\n }\n return filteredStations;\n }\n\n renderOverview() {\n return html``;\n }\n\n renderMap() {\n return html`\n ${this._dataLayer.config.popupControl\n ? html``\n : html``}\n\n {\n if (\n this.zoomReset ||\n this._enableAutoZoom ||\n this._firstWWVisit !== 'no'\n ) {\n this.stationMap.zoomTo(\n e.detail.extent,\n this._enableAutoZoom ? 500 : 0,\n this.extentBuffer,\n );\n this._firstWWVisit = 'no';\n sessionStorage.setItem('firstWWVisit', 'no');\n }\n }}\"\n >\n \n \n \n \n \n \n `;\n }\n\n // eslint-disable-next-line class-methods-use-this\n showStation(e) {\n // TODO provide route-link , route.linkTo\n // TODO site_no ?\n const station = e.detail.data;\n const label = station.station_longname || station.station_name;\n if (station.external && station.projectName)\n /** Go to project detail page, see ww-worldmap\n * station_id ~ project_id\n * */\n window.open(\n `#/overview/${this.layerName}/${station.station_id}`,\n '_self',\n );\n else if (station.external && station.url) {\n window.open(station.url, '_new');\n } else if (station.URLEXTERN) {\n window.open(station.URLEXTERN, '_new');\n } else {\n let navigationPath = `/overview/${this.layerName}/station/${\n station.station_id\n }/${encodeURIComponent(label)}`;\n\n let detailPaths =\n this.detailsPaths?.filter(path => path.layerName === this.layerName) ??\n [];\n\n const anyHits = detailPaths.filter(path => {\n if (!path.anyParameters) {\n return false;\n }\n\n for (const param of path.anyParameters) {\n if (station.ts_values[param]) {\n return true;\n }\n }\n return false;\n });\n\n const allHits = detailPaths.filter(path => {\n if (!path.parameters) {\n return false;\n }\n\n for (const param of path.parameters) {\n if (!station.ts_values[param]) {\n return false;\n }\n }\n return true;\n });\n\n detailPaths = detailPaths.filter(\n path => !path.anyParameters && !path.parameters,\n );\n\n let detailPath;\n\n /* eslint-disable prefer-destructuring */\n if (anyHits.length > 0) {\n detailPath = anyHits[0];\n } else if (allHits.length > 0) {\n detailPath = allHits[0];\n } else if (detailPaths.length > 0) {\n detailPath = detailPaths[0];\n }\n /* eslint-enable prefer-destructuring */\n\n if (detailPath) {\n navigationPath = `${navigationPath}/${detailPath.detailsPath}`;\n }\n\n navigateTo(`${navigationPath}?mode=${this.viewSelection}`);\n }\n }\n\n async getDataLayer(sameLayer: boolean = false) {\n if (!this.mapsLoaded) {\n const mapConfig = await this.api.getMapConfig();\n this.mapConfig = mapConfig;\n }\n if (this.layerName) {\n this.currentLayer = this.layerName;\n\n let resp;\n try {\n resp = await this.api.getLayer(this.layerName);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\n `error loading layer \"${this.layerName}\". Going back to start...`,\n );\n navigateTo('/');\n return;\n }\n\n if (!resp?.config) {\n // eslint-disable-next-line no-console\n console.warn(\n `layer \"${this.layerName}\" not found or has no config. Going back to start`,\n );\n navigateTo('/');\n return;\n }\n\n if (this.zoomReset && sessionStorage) {\n sessionStorage.removeItem(`${this.cachePrefix}-ki-station-map-zoom`);\n }\n\n resp.data = reproject(resp.data, this.mapConfig);\n // console.time('clientFilter');\n\n if (this.parameterFilterAttribute) {\n try {\n resp.data.forEach(station => {\n if (station[this.parameterFilterAttribute]) {\n const parFilter = JSON.parse(\n station[this.parameterFilterAttribute],\n );\n if (Array.isArray(parFilter) && parFilter.length !== 0) {\n Object.keys(station.ts_values).forEach(par => {\n if (!parFilter.includes(par)) {\n delete station.ts_values[par];\n }\n });\n }\n }\n });\n resp.data = resp.data.filter(\n item => Object.keys(item.ts_values).length,\n );\n } catch (e) {\n console.error('invalid parameterFilterAttribute');\n }\n }\n\n resp.data.forEach(item => {\n if (item.ts_value) item.ts_value = parseFloat(item.ts_value);\n if (item.ts_values?.temp?.ts_value)\n item.ts_values.temp.ts_value = parseFloat(\n item.ts_values.temp.ts_value,\n );\n });\n // console.timeEnd('clientFilter');\n const data = new Classifier(resp.config.classification).classify(\n this.parseData(resp.data),\n );\n const tagCount =\n resp.config.classification.tagCount !== false\n ? countBy(data, '__tag')\n : null;\n this._loader._$loaderCount = 0;\n this._dataLayer = {\n config: resp.config,\n data,\n tagCount,\n creationDateInMillis: resp.creationDateInMillis,\n };\n if (!sameLayer) {\n this._legends = [];\n }\n if (!this.mapsLoaded) {\n registerProjections(this.mapConfig);\n this._view = this.mapConfig.view || this._view;\n this.homeExtent = this.mapConfig.homeExtent;\n this.homeExtentMobile =\n this.mapConfig.homeExtentMobile ?? this.mapConfig.homeExtent;\n this.positionProjections = this.mapConfig.positionProjections;\n this.displayStationsInLayerControl =\n this.mapConfig.displayStationsInLayerControl;\n this.mapsLoaded = true;\n }\n this.requestUpdate();\n }\n }\n\n get legendFactory() {\n return new LegendFactory(this._dataLayer.config.classification);\n }\n\n get legendOptions() {\n const opts = this.legendFactory.getLegendOptions();\n return [{ ...opts, tagCount: this._dataLayer.tagCount }];\n }\n\n get formatters() {\n const factory = this.legendFactory;\n return {\n status(val, locale, col) {\n return StatusIcon(factory.pngs[val], factory.labels[val], col);\n },\n info(val, locale, col) {\n // todo move into options.\n return val\n ? html`
\n \n
`\n : html`
`;\n },\n trend(val) {\n const trend =\n val !== null && val !== undefined\n ? `transform: rotateZ(${getTrendArrow(val)}deg)`\n : 'display:none;';\n return html`
\n \n
`;\n },\n sparkline(val, opts, col, item) {\n const vals = opts.options.values\n .map(value => ({\n unit: item?.ts_values[item.mainParameter]?.ts_unitsymbol,\n name: item?.ts_values[item.mainParameter]\n ?.stationparameter_longname,\n value: item[value],\n date: item[value.replace('ts_value', 'timestamp')],\n }))\n .filter(f => f.value);\n return html` `;\n },\n };\n }\n\n legendChanged(e) {\n this._legends = e.detail.value;\n }\n}\n","/* eslint-disable lit-a11y/mouse-events-have-key-events */\n/* eslint-disable lit-a11y/click-events-have-key-events */\nimport { html, css, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport '../ki-icon/ki-icon-btn';\n\nconst popupBeforeLeft = 13;\n\nconst getRelativePosAndPercentageFromMouseEventOnBar = e => {\n const targetwidth = e.target.clientWidth;\n const targetX = e.target.getBoundingClientRect().x;\n const mouseX = e.x;\n const pointedX = mouseX - targetX;\n const percentage = (pointedX * 100) / targetwidth;\n\n return { pointedX, percentage };\n};\n\n@customElement('ki-progress-bar')\nexport default class KiProgressBar extends LitElement {\n static styles = css`\n :host {\n width: 100%;\n display: block;\n }\n .progress-bar-container {\n padding-top: 33px;\n width: 100%;\n height: 8px;\n }\n .progress-bar {\n height: 8px;\n }\n .left-border-rounded {\n border-bottom-left-radius: 8px;\n border-top-left-radius: 8px;\n }\n .right-border-rounded {\n border-bottom-right-radius: 8px;\n border-top-right-radius: 8px;\n }\n .progress-bar-background {\n width: 100%;\n cursor: pointer;\n background-color: gray;\n }\n .progress-status-bar {\n pointer-events: none;\n position: relative;\n top: -8px;\n background-color: green;\n }\n .smooth-transition {\n -webkit-transition: width ease-in-out 0.7s;\n transition: width ease-in-out 0.7s;\n }\n .popup {\n pointer-events: none;\n position: absolute;\n display: block;\n box-sizing: border-box;\n padding: 3px;\n top: 0px;\n z-index: 999;\n border: 1px solid black;\n background: white;\n border-radius: 5px;\n margin-left: 250px;\n }\n .popup::before {\n pointer-events: none;\n top: 100%;\n left: ${popupBeforeLeft}px;\n border: solid transparent;\n content: '';\n height: 0;\n width: 0;\n position: absolute;\n border-top-color: black;\n border-width: 0.5em;\n margin-left: -0.5em;\n }\n `;\n\n @property({ type: Object, attribute: false })\n currentPopupItem:\n | {\n label: string;\n untilPercentage: number;\n }\n | undefined;\n\n /**\n * Percentage steps on right/left arrow key.\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n keyDownSteps: number = 5;\n\n /**\n * Width of the legend popup.\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n popupWidth: number = 140;\n\n @property({ type: Number, attribute: false })\n popupMarginLeft: number = 0;\n\n /**\n * Items for showing on hover.\n *\n * @type {Array<{ label: string, untilPercentage: number, }>}\n */\n @property({ type: Array, attribute: true })\n popupItems: Array<{\n label: string;\n untilPercentage: number;\n }> = [];\n\n /**\n * Current status.\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n statusPercentage: number = 0;\n\n @property({ type: Boolean, attribute: false })\n trackMovement: boolean = false;\n\n @property({ type: Boolean, attribute: false })\n forcePopup: boolean = false;\n\n clickBackground(e): void {\n this.trackMovement = false;\n this.updateStatus(e);\n }\n\n connectedCallback() {\n // eslint-disable-next-line wc/guard-super-call\n super.connectedCallback();\n window.addEventListener('mouseup', this.mouseUp);\n window.addEventListener('keydown', this.keyDown);\n }\n\n disconnectedCallback() {\n // eslint-disable-next-line wc/guard-super-call\n super.disconnectedCallback();\n window.removeEventListener('mouseup', this.mouseUp);\n window.addEventListener('keydown', this.keyDown);\n }\n\n updated(_changedProperties: Map): void {\n if (\n _changedProperties.has('popupItems') &&\n !_changedProperties.has('forcePopup')\n ) {\n this.mouseLeaveBar();\n }\n }\n\n updateStatus(e) {\n const { percentage } = getRelativePosAndPercentageFromMouseEventOnBar(e);\n\n this.statusPercentage = percentage;\n this.emitProgressChange();\n }\n\n emitProgressChange() {\n const options = {\n detail: { newPercentage: this.statusPercentage },\n bubbles: true,\n composed: true,\n };\n this.dispatchEvent(new CustomEvent('progressChange', options));\n }\n\n mouseOverBar(e): void {\n if (this.trackMovement) {\n this.updateStatus(e);\n }\n const { percentage, pointedX } =\n getRelativePosAndPercentageFromMouseEventOnBar(e);\n // -15 so that the arrow aligns with the mouse\n this.popupMarginLeft = pointedX - 15;\n this.setCurrentPopupItem(percentage);\n this.requestUpdate();\n }\n\n mouseDown(): void {\n this.trackMovement = true;\n }\n\n mouseUp(): void {\n this.trackMovement = false;\n }\n\n mouseLeaveBar(): void {\n this.currentPopupItem = undefined;\n this.requestUpdate();\n }\n\n keyDown = (e): void => {\n switch (e.key) {\n case 'ArrowLeft':\n this.statusPercentage -= this.keyDownSteps;\n this.emitProgressChange();\n break;\n case 'ArrowRight':\n this.statusPercentage += this.keyDownSteps;\n this.emitProgressChange();\n break;\n default:\n break;\n }\n };\n\n setCurrentPopupItem(percentage: number) {\n let newElement;\n this.popupItems\n .filter(item => item.untilPercentage >= percentage)\n .forEach(item => {\n if (!newElement || newElement.untilPercentage > item.untilPercentage) {\n newElement = item;\n }\n });\n this.currentPopupItem = newElement;\n }\n\n renderPopup() {\n if (this.forcePopup) {\n this.setCurrentPopupItem(this.statusPercentage);\n this.popupMarginLeft =\n (this.clientWidth * this.statusPercentage) / 100 - 15;\n }\n let marginDifference = 0;\n if (this.popupMarginLeft + this.popupWidth > this.clientWidth) {\n const oldMargin = this.popupMarginLeft;\n this.popupMarginLeft = this.clientWidth - this.popupWidth;\n marginDifference = oldMargin - this.popupMarginLeft;\n }\n return this.currentPopupItem !== undefined\n ? html`\n ${marginDifference !== 0\n ? html`\n \n `\n : ''}\n \n ${this.currentPopupItem.label}\n \n `\n : html``;\n }\n\n render() {\n return html`\n
\n
\n = 99\n ? 'right-border-rounded'\n : ''} ${this.trackMovement ? '' : 'smooth-transition'}\"\n .style=\"width: ${this.statusPercentage}%\"\n >\n ${this.renderPopup()}\n \n `;\n }\n}\n","/* eslint-disable lit-a11y/click-events-have-key-events */\nimport { html, css, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { getQueryObject } from '../../decorators/query';\nimport './ki-progress-bar';\n\n// eslint-disable-next-line no-shadow\nexport enum legendType {\n legendEntries,\n minMax,\n}\n\nexport interface LegendEntryChild {\n label: string;\n untilPercentage: number;\n}\n\nexport interface LegendEntry {\n labelPosition: string;\n label: string;\n untilPercentage: number;\n children: Array;\n}\n\nexport interface MinMaxConfig {\n minLabel: string;\n maxLabel: string;\n children: Array;\n}\n\n@customElement('ki-progress-bar-legend')\nexport default class KiProgressBarLegend extends LitElement {\n static styles = css`\n :host {\n width: 100%;\n display: block;\n }\n .legend-container {\n overflow: hidden;\n width: 100%;\n height: 24px;\n }\n .left-border {\n border-left: 1px solid black;\n }\n .legend-entry {\n overflow: hidden;\n cursor: pointer;\n padding-left: 5px;\n height: 100%;\n float: left;\n clear: none;\n }\n .min-max-container {\n display: flex;\n width: 100%;\n height: 100%;\n flex-direction: row;\n }\n .min-max-item {\n margin-top: 5px;\n }\n .min-max-item-left {\n margin-left: 5px;\n }\n .min-max-item-center {\n flex: 1;\n }\n .min-max-item-right {\n margin-right: 5px;\n }\n `;\n\n /**\n * Auto show popup in progess.\n *\n * @type {number}\n */\n @property({ type: Boolean, attribute: true })\n forcePopup: Boolean = false;\n\n /**\n * Percentage steps on right/left arrow key.\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n keyDownSteps: number = 5;\n\n /**\n * Width of the legend popup.\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n popupWidth: number = 140;\n\n /**\n * Current status.\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n statusPercentage: number = 0;\n\n /**\n * The legend entries. Each entry has a label and a max percentage.\n * Children are the entries shown on hover. The `untilPercentage` of each child is relative to its parent.\n *\n * @type {Array}\n */\n @property({ type: Array, attribute: true })\n legendEntries: Array = [];\n\n /**\n * The type of legend. (legendEntries, minMax)\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n legendType: legendType = legendType.legendEntries;\n\n /**\n * The configuration for the legend. Consists of label for min and max value.\n * Children are the entries shown on hover. The `untilPercentage` of each child is relative to the whole bar.\n *\n * @type {{ minLabel: string; maxLabel: string, children: Array<{ label: string; untilPercentage: number}> }}\n */\n @property({ type: Object, attribute: true })\n minMaxConfig: MinMaxConfig | undefined;\n\n getPopupItems() {\n switch (this.legendType) {\n case legendType.legendEntries:\n return this.getPopupItemsFromLegendEntries();\n case legendType.minMax:\n return this.minMaxConfig?.children ?? [];\n default:\n return [];\n }\n }\n\n getPopupItemsFromLegendEntries() {\n const popupItems: Array<{ label: string; untilPercentage: number }> = [];\n let lastPercentage = 0;\n this.legendEntries.forEach(entry => {\n const percentageRange = entry.untilPercentage - lastPercentage;\n entry.children.forEach(child => {\n const absolutePercentage =\n lastPercentage + (percentageRange * child.untilPercentage) / 100;\n const { label } = child;\n\n popupItems.push({\n label,\n untilPercentage: absolutePercentage,\n });\n });\n\n if (\n popupItems.length === 0 ||\n popupItems[popupItems.length - 1].untilPercentage <\n entry.untilPercentage\n ) {\n popupItems.push({\n label: entry.label,\n untilPercentage: entry.untilPercentage,\n });\n }\n\n lastPercentage = entry.untilPercentage;\n });\n\n return popupItems;\n }\n\n connectedCallback() {\n // eslint-disable-next-line wc/guard-super-call\n super.connectedCallback();\n window.addEventListener('resize', this.handleResize);\n }\n\n disconnectedCallback() {\n // eslint-disable-next-line wc/guard-super-call\n super.disconnectedCallback();\n window.removeEventListener('resize', this.handleResize);\n }\n\n handleResize = (): void => {\n this.requestUpdate();\n };\n\n jumpToPercentage(percentage): void {\n this.updatePercentage(percentage);\n }\n\n emitProgressChange(e): void {\n this.updatePercentage(e.detail.newPercentage);\n }\n\n updatePercentage(percentage) {\n let newPercentage = percentage;\n if (newPercentage < 0) {\n newPercentage = 0;\n }\n if (newPercentage > 100) {\n newPercentage = 100;\n }\n this.statusPercentage = newPercentage;\n this.dispatchEvent(\n new CustomEvent('progressChange', {\n detail: { newPercentage },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n renderLegend() {\n const maxWidth = getQueryObject(this, '#progress-bar')?.offsetWidth;\n\n switch (this.legendType) {\n case legendType.legendEntries:\n return this.renderEntries(maxWidth);\n case legendType.minMax:\n return this.renderMinMax();\n default:\n return [];\n }\n }\n\n renderLegendEntry(\n entry: { label: string; untilPercentage: number; labelPosition: string },\n firstEntry: boolean,\n lastEntry: boolean,\n lastPercentage: number | undefined,\n maxWidth: number,\n ) {\n const lastPercentageNumber = lastPercentage ?? 0;\n const newWidth =\n ((entry.untilPercentage - lastPercentageNumber) * maxWidth) / 100 -\n (firstEntry ? 5 : 6) -\n (lastEntry ? 1 : 0);\n\n return html`\n {\n this.jumpToPercentage(lastPercentageNumber);\n }}\n >\n ${entry.label}\n \n `;\n }\n\n renderEntries(maxWidth) {\n let lastItem: { label: string; untilPercentage: number };\n return this.legendEntries.map((entry, index) => {\n const lastPercentage = lastItem?.untilPercentage;\n const last = index === this.legendEntries.length - 1;\n lastItem = entry;\n return this.renderLegendEntry(\n entry,\n lastPercentage === undefined,\n last,\n lastPercentage,\n maxWidth,\n );\n });\n }\n\n renderMinMax() {\n if (!this.minMaxConfig) {\n return html``;\n }\n return html`
\n
\n ${this.minMaxConfig.minLabel}\n
\n
\n
\n ${this.minMaxConfig.maxLabel}\n
\n
`;\n }\n\n protected firstUpdated(): void {\n this.requestUpdate();\n }\n\n render() {\n return html`\n \n
${this.renderLegend()}
\n `;\n }\n}\n","/* eslint-disable lit-a11y/click-events-have-key-events */\nimport { html, css, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\n\n/* eslint-disable import/no-extraneous-dependencies */\nimport '@ui5/webcomponents/dist/Popover';\nimport '@ui5/webcomponents/dist/List';\nimport '@ui5/webcomponents/dist/ListItem';\n/* eslint-enable import/no-extraneous-dependencies */\n\nimport { getQueryObject } from '../../decorators/query';\nimport { i18nMixin } from '../../decorators/i18n';\n\nimport nls from '../../locales/index';\n\ninterface Speed {\n label: string;\n value: number;\n}\n\n// @ts-expect-error\n@customElement('ki-player-speed-chooser')\nexport default class KiPlayerSpeedChooser extends i18nMixin(LitElement, {\n nls,\n}) {\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n justify-content: space-around;\n align-items: center;\n width: 40px;\n height: 40px;\n border-radius: 40px;\n background: white;\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n cursor: pointer;\n position: relative;\n }\n .speed-chooser {\n cursor: pointer;\n }\n .closepopup {\n text-decoration: underline;\n cursor: pointer;\n }\n .speed-popup {\n cursor: default;\n }\n `;\n\n /**\n * Playback speed.\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n speed: number = 1;\n\n @property({ type: Array, attribute: false })\n speeds: Array = [\n {\n label: '2x',\n value: 2,\n },\n {\n label: '1.75x',\n value: 1.75,\n },\n {\n label: '1.5x',\n value: 1.5,\n },\n {\n label: '1.25x',\n value: 1.25,\n },\n {\n label: '1x',\n value: 1,\n },\n {\n label: '0.75x',\n value: 0.75,\n },\n {\n label: '0.5x',\n value: 0.5,\n },\n {\n label: '0.25x',\n value: 0.25,\n },\n ];\n\n @property({ type: Boolean, attribute: false })\n popupOpened: boolean = false;\n\n get chooser() {\n return getQueryObject(this, '.speed-chooser');\n }\n\n get popup() {\n return getQueryObject(this, '.speed-popup');\n }\n\n constructor() {\n super();\n this.addEventListener('click', this.togglePopup);\n }\n\n dispatchSpeedChange(newSpeed: number): void {\n this.dispatchEvent(\n new CustomEvent('speedChange', {\n detail: { newSpeed },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n render() {\n return html`\n
${this.speed}x
\n\n \n
\n \n ${this.speeds.map(speed => this._renderListItem(speed))}\n \n
\n
\n `;\n }\n\n _renderListItem(item: Speed) {\n return html`${item.label}`;\n }\n\n selectionChanged(e) {\n const { selectedItems } = e.detail;\n if (!selectedItems || selectedItems.length <= 0) {\n return;\n }\n\n const selectedText = selectedItems[0].textContent;\n const selectedSpeed = this.speeds.find(\n speed => speed.label === selectedText,\n );\n if (!selectedSpeed) {\n return;\n }\n this.speed = selectedSpeed.value;\n this.dispatchSpeedChange(this.speed);\n }\n\n togglePopup() {\n if (this.popupOpened) {\n this.closePopup();\n } else {\n this.openPopup();\n }\n }\n\n openPopup() {\n this.popupOpened = true;\n this.popup.showAt(this.chooser);\n }\n\n closePopup() {\n this.popupOpened = false;\n this.popup.close();\n }\n}\n","/* eslint-disable lit-a11y/click-events-have-key-events */\nimport { html, css, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\n\nimport '../ki-icon/ki-icon-btn';\nimport { legendType } from './ki-progress-bar-legend';\nimport './ki-player-speed-chooser';\n\nconst playAccuracy = 0.001;\n\n@customElement('ki-player')\nexport default class KiPlayer extends LitElement {\n static styles = css`\n :host {\n width: 100%;\n display: block;\n }\n .player-container {\n width: 100%;\n display: flex;\n flex-direction: row;\n }\n .button-container {\n width: 150px;\n padding-right: 10px;\n display: flex;\n flex-direction: row;\n }\n .no-left-radius {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .no-right-radius {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .left-button {\n margin-left: 2px;\n }\n .button-element {\n margin-top: 15px;\n }\n .speed-chooser {\n margin-left: 10px;\n }\n .button-element:hover {\n background-color: lightgray;\n }\n ki-progress-bar-legend {\n flex: 1;\n }\n `;\n\n @property({ type: Boolean, attribute: false })\n playing: boolean = false;\n\n @property({ type: Number, attribute: false })\n playInterval: number | undefined;\n\n /**\n * Percentage steps on right/left arrow key.\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n keyDownSteps: number = 5;\n\n /**\n * How many playing steps there are.\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n playSteps: number = 100;\n\n get tickSize(): number {\n return 100 / this.playSteps;\n }\n\n /**\n * Time in ms every tick should take.\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n playTickTime: number = 1000;\n\n /**\n * Width of the legend popup.\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n popupWidth: number = 140;\n\n /**\n * Current status.\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n statusPercentage: number = 0;\n\n /**\n * Playback speed.\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n speed: number = 1;\n\n /**\n * Current tick.\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n tickStatus: number = 0;\n\n /**\n * The legend entries. Each entry has a label and a max percentage.\n * Children are the entries shown on hover. The `untilPercentage` of each child is relative to its parent.\n *\n * @type {Array<{ label: string; untilPercentage: number, children: Array<{ label: string; untilPercentage: number}> }>}\n */\n @property({ type: Array, attribute: true })\n legendEntries: Array<{\n label: string;\n untilPercentage: number;\n children: Array<{ label: string; untilPercentage: number }>;\n }> = [];\n\n /**\n * The type of legend. (legendEntries, minMax)\n *\n * @type {number}\n */\n @property({ type: Number, attribute: true })\n legendType: legendType = legendType.legendEntries;\n\n /**\n * The configuration for the legend. Consists of label for min and max value.\n * Children are the entries shown on hover. The `untilPercentage` of each child is relative to the whole bar.\n *\n * @type {{ minLabel: string; maxLabel: string, children: Array<{ label: string; untilPercentage: number}> }}\n */\n @property({ type: Object, attribute: true })\n minMaxConfig:\n | {\n minLabel: string;\n maxLabel: string;\n children: Array<{ label: string; untilPercentage: number }>;\n }\n | undefined;\n\n disconnectedCallback(): void {\n // eslint-disable-next-line wc/guard-super-call\n super.disconnectedCallback();\n if (this.playInterval) {\n clearInterval(this.playInterval);\n this.playInterval = undefined;\n }\n }\n\n dispatchProgressChange(newPercentage: number, newTicks: number): void {\n this.dispatchEvent(\n new CustomEvent('progressChangePlayer', {\n detail: { newPercentage, newTicks },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n emitProgressChange(e): void {\n this.updatePercentage(e.detail.newPercentage);\n }\n\n updatePercentage(percentage) {\n let newPercentage = percentage;\n if (newPercentage < 0) {\n newPercentage = 0;\n }\n if (newPercentage > 100) {\n newPercentage = 100;\n }\n this.statusPercentage = newPercentage;\n\n let newTicks = newPercentage / this.tickSize;\n\n newTicks = Math.floor(newTicks);\n this.tickStatus = newTicks;\n\n this.dispatchProgressChange(newPercentage, newTicks);\n }\n\n updateTicks(ticks) {\n let newTicks = ticks;\n if (newTicks < 0) {\n newTicks = 0;\n }\n if (newTicks > this.playSteps) {\n newTicks = this.playSteps;\n }\n this.tickStatus = newTicks;\n\n this.statusPercentage = this.tickSize * newTicks;\n\n this.dispatchProgressChange(this.statusPercentage, newTicks);\n }\n\n speedChanged(e) {\n const { newSpeed } = e.detail;\n this.speed = newSpeed;\n if (this.playing) {\n this.togglePlay();\n this.togglePlay();\n }\n }\n\n togglePlay() {\n this.playing = !this.playing;\n if (this.playing && !this.playInterval) {\n this.playInterval = window.setInterval(\n this.play,\n this.playTickTime / this.speed,\n );\n } else if (this.playInterval) {\n clearInterval(this.playInterval);\n this.playInterval = undefined;\n }\n }\n\n skipInfront() {\n const newTicks =\n this.tickStatus - 1 < 0\n ? this.playSteps + playAccuracy\n : this.tickStatus - 1;\n this.updateTicks(newTicks);\n this.requestUpdate();\n }\n\n skipAhead() {\n this.play();\n }\n\n play = () => {\n const newTicks =\n this.tickStatus + 1 > this.playSteps + playAccuracy\n ? 0\n : this.tickStatus + 1;\n this.updateTicks(newTicks);\n this.requestUpdate();\n };\n\n render() {\n return html`\n
\n
\n \n \n \n \n
\n \n \n
\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { getCurrentApi } from '@kisters/wiski-web/api';\nimport { until } from 'lit/directives/until.js';\n\n@customElement('ww-raster-legend')\nexport class WwRasterLegend extends LitElement {\n static styles = css`\n :host {\n padding: 10px;\n }\n .legend {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n .legend-item {\n flex: 1;\n color: white;\n padding: 0 5px;\n text-align: center;\n }\n `;\n\n api = getCurrentApi();\n\n @property() classification;\n\n @property() classiObj = { color: [] };\n\n async renderClass() {\n if (!this.classification) {\n return html``;\n }\n const classiObj = await this.api.getClassification(this.classification);\n if (classiObj) {\n return html`
${classiObj.description}
\n
\n ${classiObj.color.map(\n item =>\n html`\n ${item.description}\n
`,\n )}\n `;\n }\n return html``;\n }\n\n // eslint-disable-next-line class-methods-use-this\n getRgbString(rgbNumber: number) {\n let rgbString = rgbNumber.toString(16);\n while (rgbString.length < 6) {\n rgbString = `0${rgbString}`;\n }\n return rgbString;\n }\n\n render() {\n return html` ${until(this.renderClass(), html`...`)} `;\n }\n}\n","/* eslint-disable no-plusplus */\nimport { html, css, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property, query } from 'lit/decorators.js';\nimport '@kisters/wcp-base/components/ki-progress-bar/ki-player';\nimport { getCurrentApi } from '@kisters/wiski-web/api';\nimport '@ui5/webcomponents/dist/Popover';\nimport '@ui5/webcomponents/dist/Button';\nimport '@ui5/webcomponents/dist/List';\nimport '@ui5/webcomponents/dist/StandardListItem';\nimport '@ui5/webcomponents/dist/GroupHeaderListItem';\nimport '@ui5/webcomponents-icons/dist/cancel.js';\nimport ImageLayer from 'ol/layer/Image';\nimport ImageSource from 'ol/source/Image';\nimport Static from 'ol/source/ImageStatic';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport { sortBy, keyBy } from 'lodash-es';\nimport {\n legendType,\n LegendEntry,\n} from '@kisters/wcp-base/components/ki-progress-bar/ki-progress-bar-legend';\nimport KiStationMap from '@kisters/wcp-water/components/ki-station-map/ki-station-map';\nimport './ww-raster-legend';\n\ndeclare type LegendEntry_ = typeof LegendEntry;\ndeclare type KiStationMap_ = typeof KiStationMap;\n\ninterface ImageItem {\n timestamp: string;\n time: number;\n value: string;\n}\n\ninterface RasterItem {\n id: string;\n label: string;\n group: string;\n images: Array;\n meta: {\n attributes: {\n classification: string;\n parameterKey: string;\n };\n valueDistance: string;\n };\n}\n\nconst getLegendEntry = (\n lastTimestamp: any,\n untilTimestamp: any,\n fromUnixMilliseconds: number,\n untilPercentage: number,\n childrenTimestamps: Array,\n) => {\n const label = `${lastTimestamp.format('ddd DD.MM')}`;\n const toTime = untilTimestamp.valueOf();\n const timeDifference = toTime - lastTimestamp.valueOf();\n\n const children = childrenTimestamps.map(timestamp => ({\n label: timestamp.format('LLL'),\n untilPercentage:\n ((timestamp.valueOf() + timeDifference - fromUnixMilliseconds) /\n (toTime - fromUnixMilliseconds)) *\n 100,\n }));\n\n return {\n label,\n untilPercentage,\n children,\n };\n};\n\nconst fillInMissingImages = (\n rasterItem: RasterItem,\n minTime: number,\n maxTime: number,\n stepDuration: number,\n): RasterItem => {\n if (rasterItem.images.length === 0) {\n return rasterItem;\n }\n\n const newImages: Array = [];\n\n let rasterImageIndex = 0;\n\n for (let i = minTime; i <= maxTime; i += stepDuration) {\n let image = '';\n const rasterImage = rasterItem.images[rasterImageIndex];\n\n if (rasterImage.time > i) {\n if (rasterImageIndex > 0) {\n image = rasterItem.images[rasterImageIndex - 1].value;\n }\n } else {\n image = rasterImage.value;\n if (rasterImageIndex < rasterItem.images.length - 1) {\n rasterImageIndex += 1;\n }\n }\n\n if (rasterImage.time === i) {\n newImages.push(rasterImage);\n continue;\n }\n\n newImages.push({\n value: image,\n timestamp: dayjs(i).format('YYYY-MM-DDTHH:mm:ssZ'),\n time: i,\n });\n }\n\n const returnValue = {\n ...rasterItem,\n };\n returnValue.images = newImages;\n\n return returnValue;\n};\n\n@customElement('ww-raster-player')\nexport default class WwRasterPlayer extends LitElement {\n static styles = css`\n :host {\n height: 100%;\n display: flex;\n align-items: center;\n overflow: hidden;\n }\n\n ui5-popover {\n max-width: calc(100% - 100px);\n overflow-y: hidden;\n overflow-x: hidden;\n }\n\n ww-raster-legend {\n position: fixed;\n right: 60px;\n bottom: 90px;\n }\n\n ki-player {\n margin-right: 10px;\n }\n\n ui5-popover slot[name='header'] {\n display: flex;\n justify-content: space-between;\n border-bottom: 1px solid darkgray;\n align-items: center;\n }\n\n .popupover-header {\n font-size: 1.3em;\n color: #32363a;\n }\n\n ui5-li::part(additional-text) {\n padding-left: 40px;\n max-width: initial;\n }\n\n .selection {\n display: flex;\n flex-direction: column;\n width: 300px;\n }\n\n .tsLabel {\n position: absolute;\n width: 100%;\n left: 50%;\n top: 15px;\n color: dimgray;\n font-size: 1.3em;\n transform: translateX(-50%);\n text-align: center;\n }\n\n .popover-content {\n display: flex;\n flex-direction: column;\n }\n\n ki-icon-btn {\n font-size: 20px;\n margin-top: 6px;\n margin-left: auto;\n }\n\n ki-icon-btn:hover,\n .icon-btn:hover {\n fill: #4a4a49;\n }\n\n .list-item-content-wrapper {\n line-height: 25px;\n display: flex;\n flex-direction: row;\n }\n\n .left-right-container {\n padding-left: 16px;\n display: flex;\n flex-direction: row;\n }\n\n .selection-button-left {\n border-right: 1px solid black; -->\n }\n\n .selection-button {\n margin-top: -5px;\n }\n\n .selection-item {\n width: var(--_ui5_radio_button_height);\n height: var(--_ui5_radio_button_height);\n line-height: var(--_ui5_radio_button_height);\n text-align: center;\n }\n\n ui5-li::part(description) {\n padding-left: 90px;\n }\n ki-icon-btn[active] {\n background-color: var(--theme-color-primary, #0056a0);\n fill: white;\n }\n `;\n\n static get properties() {\n return {\n rasterlist: { type: Array },\n imageList: { type: Array },\n };\n }\n\n @property({ type: Object, attribute: true })\n comparemap;\n\n @property({ type: Array, attribute: false })\n imageLists: Array = [];\n\n @property({ type: Object, attribute: true })\n map: Promise = Promise.resolve(undefined);\n\n @property({ type: Object, attribute: true })\n _map: KiStationMap_ | undefined;\n\n @property({ type: Object, attribute: false })\n primarySelection: RasterItem | undefined | null;\n\n @property({ type: Boolean })\n disabled = false;\n\n @property({ type: Object, attribute: false })\n rasterIndex: {\n [id: string]: RasterItem;\n } = {};\n\n @property({ type: String, attribute: false })\n rlayerPrimary: ImageLayer | undefined;\n\n @property({ type: String, attribute: false })\n rlayerSecondary: ImageLayer | undefined;\n\n @property({ type: String, attribute: false })\n secondSelected;\n\n @property({ type: Object, attribute: false })\n secondarySelection: RasterItem | undefined | null;\n\n @query('#rasterSelect')\n _rasterSelect;\n\n @property({ type: Boolean })\n showSecondaryRadioButton = false;\n\n api = getCurrentApi();\n\n rasterlist: Array<{\n label: string;\n id: string;\n alias: string;\n group: string;\n href: string;\n description: string;\n meta: {\n attributes: {\n classification: string;\n parameterKey: string;\n display_group: string;\n display_description: string;\n display_order: number;\n };\n parameterKey: string;\n };\n order: Number;\n groupOrder: Number;\n }>;\n\n constructor() {\n super();\n this.rasterlist = [];\n }\n\n async updated(changedProperties) {\n if (changedProperties.has('secondarySelection')) {\n this.createRasterLayer();\n this._renderNext();\n }\n }\n\n async firstUpdated(): Promise {\n const rasterlist = await this.api.getRasterList();\n this.rasterlist = rasterlist.filter(item => item.type === 'resource');\n this._map = await this.map;\n // this._comparemap = await this.comparemap;\n\n this.rasterlist = sortBy(this.rasterlist, [\n 'meta.attributes.display_order',\n ]);\n\n // @ts-expect-error\n this.imageLists = await Promise.all(\n this.rasterlist.map(async raster => {\n let images: Array = [];\n try {\n images = await this.api.getRessource(`/${raster.href}`);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(`error loading raster images for: ${raster.href}`);\n }\n\n images = images\n .map(image => ({\n ...image,\n time: new Date(image.timestamp).getTime(),\n }))\n .sort((a, b) => a.time - b.time);\n\n return {\n ...raster,\n images,\n };\n }),\n );\n\n this.rasterIndex = keyBy(this.imageLists, 'id');\n }\n\n createRasterLayer() {\n if (this.rlayerPrimary) {\n this._map.map.removeLayer(this.rlayerPrimary);\n }\n\n if (this.rlayerSecondary && this.comparemap) {\n this.comparemap.map.removeLayer(this.rlayerSecondary);\n }\n\n this.rlayerPrimary = new ImageLayer({\n opacity: 0.7,\n zIndex: 22,\n // @ts-expect-error\n displayInLayerControl: false,\n group: 'Layers',\n name: 'Radar',\n visible: true,\n });\n this.rlayerSecondary = new ImageLayer({\n opacity: 0.7,\n zIndex: 22,\n // @ts-expect-error\n displayInLayerControl: false,\n group: 'Layers',\n name: 'Radar',\n visible: true,\n });\n\n if (this._map) {\n this._map.map.addLayer(this.rlayerPrimary);\n }\n\n if (this.comparemap) {\n this.comparemap.map.addLayer(this.rlayerSecondary);\n }\n this.rlayerPrimary.setVisible(true);\n this.rlayerSecondary.setVisible(true);\n }\n\n _createPlayer() {\n if (!this.primarySelection) {\n this.dispatchEvent(\n new CustomEvent('playeropen', {\n detail: { value: false },\n bubbles: false,\n composed: true,\n }),\n );\n return html``;\n }\n const legendEntries: Array = [];\n\n const _type = legendType.legendEntries;\n\n let oldTimestamp: any;\n let childrenArray: Array = [];\n\n let fromTime = this._minTime;\n\n const timeSpan = this._maxTime - this._minTime;\n\n const steps = timeSpan / this._stepDuration;\n\n for (\n let time = this._minTime;\n time <= this._maxTime;\n time += this._stepDuration\n ) {\n const newTimestamp = dayjs(time);\n\n if (\n oldTimestamp !== undefined &&\n !newTimestamp.isSame(oldTimestamp, 'day')\n ) {\n const dayUntil = oldTimestamp\n .hour(23)\n .minute(59)\n .second(59)\n .millisecond(999);\n const untilPercentage = (100 * (dayUntil - this._minTime)) / timeSpan;\n\n legendEntries.push(\n getLegendEntry(\n oldTimestamp,\n newTimestamp,\n fromTime,\n untilPercentage,\n childrenArray,\n ),\n );\n\n fromTime = newTimestamp.valueOf();\n childrenArray = [];\n }\n\n childrenArray.push(newTimestamp);\n\n oldTimestamp = newTimestamp;\n }\n\n if (oldTimestamp) {\n const newTimestamp = oldTimestamp.add(1, 'hour');\n legendEntries.push(\n getLegendEntry(\n oldTimestamp,\n newTimestamp,\n fromTime,\n 100,\n childrenArray,\n ),\n );\n }\n\n this.dispatchEvent(\n new CustomEvent('playeropen', {\n detail: { value: true },\n bubbles: false,\n composed: true,\n }),\n );\n\n return html``;\n }\n\n _renderNext(\n e:\n | {\n detail:\n | {\n newTicks: number;\n }\n | undefined;\n }\n | undefined = undefined,\n ) {\n const imageNumber = e?.detail?.newTicks ?? 0;\n\n if (this.rlayerPrimary && this.primarySelection?.images?.length) {\n const image = this.primarySelection?.images[imageNumber].value;\n this.rlayerPrimary.setSource(\n this._getSource(image, this.primarySelection),\n );\n }\n if (this.rlayerSecondary && this.secondarySelection?.images?.length) {\n const secImage = this.secondarySelection?.images[imageNumber].value;\n if (secImage && secImage !== '') {\n this.rlayerSecondary.setSource(\n this._getSource(secImage, this.secondarySelection),\n );\n } else {\n this.rlayerSecondary.setSource(null);\n }\n }\n }\n\n _getSource(image, rasterProduct) {\n const selectedLayer = rasterProduct;\n const bbox = selectedLayer.meta.boundingBox;\n const projection =\n selectedLayer.meta.projectionProj4 ===\n '+proj=tmerc +lon_0=-8 +lat_0=0 +lon_ts=0 +lat_ts=53.5 +a=6377560.00 +b=6356260.00'\n ? 'EPSG:123457'\n : 'EPSG:123456';\n return new Static({\n imageSmoothing: false,\n url: `${this.api.dataPath}/${selectedLayer.href.replace(\n 'index.json',\n image,\n )}`,\n projection: selectedLayer.meta.projectionIdentifier\n ? selectedLayer.meta.projectionIdentifier.toUpperCase()\n : projection,\n imageExtent: [bbox.minX, bbox.minY, bbox.maxX, bbox.maxY],\n // @ts-expect-error\n zIndex: 15,\n });\n }\n\n _stepDuration;\n\n _minTime;\n\n _maxTime;\n\n async _changeSelection(selected, primary = true) {\n this._rasterSelect.close();\n if (selected) {\n try {\n if (primary) {\n this.primarySelection = this.rasterIndex[selected];\n (this.renderRoot.querySelector('ki-player') as any)?.updatePercentage(\n 0,\n );\n } else {\n this.secondarySelection = this.rasterIndex[selected];\n }\n let primaryDuration = 3600000;\n let secondaryDuration: number | undefined;\n if (this.primarySelection?.meta.valueDistance) {\n primaryDuration = dayjs\n .duration(this.primarySelection?.meta.valueDistance)\n .asMilliseconds();\n }\n if (this.secondarySelection?.meta.valueDistance) {\n secondaryDuration = dayjs\n .duration(this.secondarySelection?.meta.valueDistance)\n .asMilliseconds();\n }\n this._stepDuration =\n secondaryDuration && secondaryDuration < primaryDuration\n ? secondaryDuration\n : primaryDuration;\n\n let minTime = 0;\n let maxTime = 0;\n if (this.primarySelection && this.primarySelection.images.length > 0) {\n minTime = this.primarySelection.images[0].time;\n maxTime =\n this.primarySelection.images[\n this.primarySelection.images.length - 1\n ].time;\n }\n\n this._minTime = minTime;\n this._maxTime = maxTime;\n\n if (\n this.secondarySelection &&\n this.secondarySelection.images.length > 0\n ) {\n const secondMin = this.secondarySelection.images[0].time;\n const secondMax =\n this.secondarySelection.images[\n this.secondarySelection.images.length - 1\n ].time;\n if (secondMin < minTime) {\n minTime = secondMin;\n }\n if (secondMax > maxTime) {\n maxTime = secondMax;\n }\n }\n\n if (this.primarySelection) {\n this.primarySelection = fillInMissingImages(\n this.primarySelection,\n minTime,\n maxTime,\n this._stepDuration,\n );\n }\n if (this.secondarySelection) {\n this.secondarySelection = fillInMissingImages(\n this.secondarySelection,\n minTime,\n maxTime,\n this._stepDuration,\n );\n }\n\n this._renderNext();\n } catch (e) {\n this._clearSelection();\n // eslint-disable-next-line no-console\n console.error('could not load raster product', selected);\n }\n }\n this.requestUpdate();\n }\n\n // eslint-disable-next-line class-methods-use-this\n _getCoverage(tsitem) {\n const spacing = tsitem.meta?.valueDistance;\n const dateformat = spacing.includes('PT') ? 'L LT z' : 'L z';\n\n const t0String = tsitem.meta?.selection?.t0;\n let coverage = '-';\n if (t0String) {\n coverage = `t0: ${dayjs(t0String).format(dateformat)}`;\n } else if (tsitem.meta?.coverage?.from && tsitem.meta?.coverage?.until) {\n coverage = `${dayjs(tsitem.meta?.coverage?.from).format(\n dateformat,\n )} - ${dayjs(tsitem.meta?.coverage?.until).format(dateformat)}`;\n }\n return coverage;\n }\n\n _getTsTitle() {\n return this.primarySelection\n ? `${this.primarySelection.group} - ${this.primarySelection.label}${\n this.secondarySelection\n ? ` / ${this.secondarySelection.group} - ${this.secondarySelection.label}`\n : ''\n }`\n : '';\n }\n\n _clearSelection() {\n if (this.rlayerPrimary) {\n this._map.map.removeLayer(this.rlayerPrimary);\n }\n if (this.rlayerSecondary && this.comparemap) {\n this.comparemap.map.removeLayer(this.rlayerSecondary);\n }\n this.dispatchEvent(\n new CustomEvent('playeropen', {\n detail: { value: false },\n bubbles: false,\n composed: true,\n }),\n );\n this.primarySelection = null;\n this.secondarySelection = null;\n this.primarySelection = null;\n this._rasterSelect.close();\n this.dispatchEvent(new CustomEvent('clearselection'));\n }\n\n _getClassification(id) {\n return id ? this.rasterIndex[id]?.meta.attributes.classification : {};\n }\n\n render() {\n let group;\n return html`\n
${this._getTsTitle()}
\n\n ${this.primarySelection ? this._createPlayer() : ''}\n \n \n {\n this._rasterSelect.showAt(e.target);\n }}\n >\n\n \n \n \n \n
Left
\n
Right
\n \n
Raster products
\n
\n Deselect\n this._rasterSelect.close()}\"\n >X\n
\n
\n ${this.rasterlist.map(item => {\n const listitem = html` {\n this.selectItem(e, item.id, item.group);\n }}\"\n style=\"\"\n >\n
\n \n\n \n ${item.label}\n
\n
`;\n if (group !== item.group) {\n group = item.group;\n return html`${item.group}${listitem}`;\n }\n return listitem;\n })}\n \n \n `;\n }\n\n selectItem(e: any, itemId: string, group: string): void {\n this.createRasterLayer();\n if (e.target.getAttribute('group') !== 'secondary') {\n if (this.secondarySelection?.group !== group) {\n this.secondarySelection = null;\n this.dispatchEvent(new CustomEvent('clearselection'));\n }\n this.primarySelection = this.imageLists.find(item => item.id === itemId);\n this._changeSelection(itemId);\n } else if (this.primarySelection !== null) {\n this.dispatchEvent(new CustomEvent('opensecondary'));\n this.secondarySelection = this.imageLists.find(\n item => item.id === itemId,\n );\n this._changeSelection(itemId, false);\n }\n }\n}\n","import { css, html } from 'lit';\nimport { customElement, queryAsync, query, property } from 'lit/decorators.js';\nimport WwpOverview from '@kisters/wiski-web/views/wwp-overview/wwp-overview';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport '../../components/ki-ww-raster/ww-raster-player';\n\n@customElement('ww-raster-overview')\nexport default class WwRasterOverview extends WwpOverview {\n @property({ type: Boolean })\n playeropen = false;\n\n @property({ type: Boolean })\n timelineropen = false;\n\n @property({ type: String })\n selectedView: 'map' | 'table' | 'overview' | 'multigraph' = 'map';\n\n @queryAsync('#map')\n map;\n\n @query('#comparemap')\n comparemap;\n\n @query('#rasterplayer')\n rasterplayer;\n\n @query('#map')\n _map;\n\n @property({ type: Boolean })\n showCompareMap = false;\n\n layersTreeList = true;\n\n static styles = [\n WwpOverview.styles,\n css`\n ww-raster-player {\n position: absolute;\n right: 20px;\n height: 80px;\n max-width: 80%;\n z-index: 111;\n bottom: 0;\n }\n\n ww-raster-player.open {\n left: 20%;\n }\n\n :host(.sm-screen) ww-raster-player {\n display: none !important;\n }\n\n ki-station-map.map {\n width: auto;\n flex: 1;\n }\n\n #comparemap {\n border-right: 2px solid gray;\n }\n\n ki-stack > div.map-container {\n display: flex;\n }\n `,\n ];\n\n updated(changedProperties) {\n if (this._map && changedProperties.has('showCompareMap')) {\n this._map.resize();\n this.rasterplayer.comparemap = this.comparemap;\n setTimeout(() => {\n this.rasterplayer.createRasterLayer();\n this.rasterplayer._renderNext();\n }, 200);\n }\n }\n\n render() {\n // eslint-disable-next-line wc/no-self-class\n this.classList.toggle('table', this.selectedView === 'table');\n // TODO rename ki-station-layer to ki-maker-layer or value layer ?\n // language=html\n if (this.currentLayer !== this.layerName) {\n this.getDataLayer();\n }\n return (\n this._renderLoader() ||\n html`\n ${this.additionalContent()}\n\n {\n this._enableAutoZoom = true;\n this.searchContent = e.detail.value;\n }}\"\n >\n \n ${this.showCsvExport && this.selectedView === 'table'\n ? this.renderExportButton()\n : html``}\n {\n this._enableAutoZoom = true;\n this.filterContent = JSON.stringify(e.detail.value);\n }}\"\n >\n \n {\n this._enableAutoZoom = true;\n this.selectedView = e.detail.value;\n }}\"\n >\n \n
\n ${this.selectedView === 'table' ? this.renderTable() : html``}\n
\n
\n ${this.selectedView === 'map' ? this.renderMap() : html``}\n
\n
\n ${this.showCompareMap\n ? html``\n : html``}\n\n
\n ${this.i18n.t('lastupdated')}:\n ${dayjs.tz(this._dataLayer.creationDateInMillis).format('L LT')}\n ${this.i18n.exists(encodeURIComponent(dayjs().tz().format('zzz')))\n ? this.i18n.t(encodeURIComponent(dayjs().tz().format('zzz')))\n : dayjs().tz().format('zzz')}\n
\n `\n );\n }\n\n renderMap() {\n return html`\n {\n if (this.comparemap) {\n this.comparemap.zoomTo(e.detail.extent, 0, 0);\n }\n }}\n cachePrefix=\"${this.cachePrefix}\"\n >\n ${this._dataLayer.config.popupControl\n ? html``\n : html``}\n ${this.layerName === 'Rainfall'\n ? html` {\n this.timelineropen = !e.detail.active;\n this.refreshTimer = e.detail.active;\n }}\"\n >`\n : ''}\n ${this._dataLayer.config?.timeActive\n ? html` {\n this.timelineropen = !e.detail.active;\n this.refreshTimer = e.detail.active;\n }}\"\n >`\n : ''}\n {\n if (this._enableAutoZoom || this._firstWWVisit !== 'no') {\n this.stationMap.zoomTo(\n e.detail.extent,\n this._enableAutoZoom ? 500 : 0,\n );\n this._firstWWVisit === 'no';\n sessionStorage.setItem('firstWWVisit', 'no');\n }\n }}\"\n >\n \n \n \n \n \n \n \n ${this.showCompareMap\n ? html` {\n this._map.zoomTo(e.detail.extent, 0, 0);\n }}\n >`\n : html``}\n `;\n }\n\n additionalContent() {\n return html` {\n this.showCompareMap = false;\n }}\n @opensecondary=${() => {\n this.showCompareMap = true;\n }}\n @playeropen=${e => {\n this.playeropen = e.detail.value;\n }}\n >`;\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { Mix } from '@kisters/wcp-base/common';\nimport { responsiveMixin, SM, ViewPort } from '@kisters/wcp-base/decorators';\nimport flatten from 'lodash-es/flatten';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\n\n@customElement('ki-legend')\nexport default class KiLegend extends Mix(LitElement, responsiveMixin) {\n // language=CSS\n static styles = css`\n :host {\n display: block;\n position: absolute;\n pointer-events: all;\n }\n\n :host(.sm-screen) {\n box-shadow: none;\n }\n\n :host(.md-screen) div.legends-list {\n background-color: var(\n --ki-legend-background-mdscreen,\n rgba(255, 255, 255, 1)\n );\n }\n\n :host(.hide) .legends-list {\n visibility: hidden;\n transform: scale(0.8);\n transform-origin: left bottom;\n opacity: 0;\n }\n\n .legends-list {\n visibility: visible;\n opacity: 1;\n transform: scale(1);\n transition: transform 0.3s linear 0s, opacity 0.3s linear 0s,\n visibility 0.3s linear 0s;\n background-color: rgba(255, 255, 255, 1);\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n }\n a {\n text-decoration: none;\n }\n\n .name,\n .item {\n padding: 5px 20px;\n color: #4a4a49;\n }\n\n .name {\n font-weight: 600;\n cursor: pointer;\n }\n\n @media screen and (max-height: 800px) {\n .name,\n .item {\n padding: 2px 10px;\n font-size: 0.8;\n }\n }\n\n .item {\n cursor: pointer;\n display: flex;\n }\n\n .item:hover {\n background-color: #e7e7e7;\n }\n\n .item img,\n .item .label {\n flex: 0 0 auto;\n vertical-align: middle;\n object-fit: none;\n }\n\n .item .label {\n padding-left: 10px;\n white-space: nowrap;\n }\n\n .item.disabled {\n color: lightgray;\n }\n\n .item.disabled img {\n opacity: 0.5;\n }\n\n .description {\n font-size: 0.8em;\n padding: 0 0 5px 20px;\n }\n\n .link {\n cursor: pointer;\n }\n\n .tag-group + .tag-group {\n border-top: 1px solid lightgray;\n }\n\n .hide {\n display: none !important;\n }\n\n .show-btn {\n fill: white;\n background: var(--theme-color-primary, #1d1d1b);\n }\n\n .show-btn:hover {\n fill: var(--theme-color-primary, white);\n background: var(--theme-color-secondary, #1d1d1b);\n }\n\n .close-btn {\n padding: 5px 10px;\n float: right;\n cursor: pointer;\n fill: lightgray;\n }\n .close-btn:hover {\n fill: dimgray;\n }\n `;\n\n constructor() {\n super();\n this.value = [];\n this.options = [];\n this.addstyle = '';\n this.disabled = {};\n this.forceFullDisplay = false;\n }\n\n static get properties() {\n return {\n label: { type: String },\n closeable: { type: Boolean },\n forceFullDisplay: { type: Boolean },\n collapsed: { type: Boolean },\n addstyle: { type: String },\n options: { type: Array },\n };\n }\n\n /* eslint-disable-next-line class-methods-use-this */\n getAbsoluteCount(opt) {\n const absoluteCount = {};\n for (const [key, value] of Object.entries(opt.tagCount)) {\n key.split('|').forEach(item => {\n if (absoluteCount[item]) {\n absoluteCount[item] += value;\n } else {\n absoluteCount[item] = value;\n }\n });\n }\n return absoluteCount;\n }\n\n firstUpdated() {\n this.options.forEach(opts => {\n opts.items.forEach(opt => {\n opt.forEach(item => {\n if (item.deactivate) {\n this.toggle(item, opts);\n }\n });\n });\n });\n }\n\n _getCount(name, opt) {\n if (opt.tagCount) {\n const abscnt = this.getAbsoluteCount(opt)[name];\n return abscnt ? `(${abscnt})` : '';\n }\n return '';\n }\n\n _getEntry(option, opt) {\n const tagCount = this._getCount(option.name, opt);\n return opt.hideEmptyClasses && !tagCount\n ? html``\n : html` {\n opt.notInteractive ? null : this.toggle(option, opt);\n }}\"\n >\n \"\"\n
${option.label} ${tagCount}
\n `;\n }\n\n updateTagCount(tagCount: any, index: number) {\n if (index < this.options.length) {\n this.options[index].tagCount = tagCount;\n this.requestUpdate();\n } else {\n console.warn('tried to update tag count for non existing option');\n }\n }\n\n _renderOptions(opt) {\n // TODO\n return html`\n ${opt.items &&\n opt.items.map(\n options =>\n html`
\n ${options.map(option => this._getEntry(option, opt))}\n
`,\n )}\n `;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _renderBtn() {\n return html`\n {\n this.renderRoot.querySelector('#legends').show();\n }}\"\n >\n \n `;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _renderShowBtn() {\n return html`\n {\n this.collapsed = false;\n }}\"\n >\n \n `;\n }\n\n _renderCloseBtn() {\n return html`\n {\n this.collapsed = true;\n }}\"\n >\n \n `;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _renderDescr(opt, mobile) {\n let ret = html``;\n const desc = opt.description;\n if (desc && desc.text && desc.link) {\n ret = html` \n ${desc.text}\n `;\n } else if (desc && desc.text) {\n ret = html`\n \n ${unsafeHTML(mobile ? desc.text.replaceAll('
', '') : desc.text)}\n \n `;\n }\n return ret;\n }\n\n toggleAll(opt) {\n opt.items.forEach(grp => {\n grp.forEach(_opt => {\n this.disabled[_opt.name] = !this.disabled[_opt.name];\n });\n });\n this.toggle(null, opt);\n }\n\n render() {\n // language=html\n return this.options.map(opt => {\n const descr = opt.description;\n if (ViewPort.size === SM && !this.forceFullDisplay) {\n return html`\n ${this._renderBtn()}\n \n
\n ${this._renderOptions(opt)}\n
\n ${descr ? this._renderDescr(opt, true) : ''}\n
\n
\n
\n `;\n }\n this.style.cssText += this.addstyle;\n return html`\n ${(this.closeable && this.collapsed && this._renderShowBtn()) || ''}\n \n ${(this.closeable && !this.collapsed && this._renderCloseBtn()) || ''}\n {\n opt.notInteractive ? null : this.toggleAll(opt);\n }}\"\n >\n ${opt.label}\n \n ${descr && descr.position === 'top' ? this._renderDescr(opt) : ''}\n ${this._renderOptions(opt)}\n ${descr && descr.position !== 'top' ? this._renderDescr(opt) : ''}\n \n `;\n });\n }\n\n toggle(option, opt) {\n if (option) {\n this.disabled[option.name] = !this.disabled[option.name];\n }\n const value = flatten(opt.items)\n .filter(op => !this.disabled[op.name])\n .map(op => op.name);\n if (!value.length) {\n this.toggleAll(opt);\n } else {\n this.dispatchEvent(new CustomEvent('changed', { detail: { value } }));\n this.requestUpdate();\n }\n }\n}\n","import { UpdatingElement } from 'lit';\nimport { Mix, PropertyDefaultValue } from '@kisters/wcp-base/common';\n\n// TODO try out mapping the observable properties to element?\n// export function ttt(layerClaz) {\n// return class extends BaseLayer{\n// static get properties(){\n// return layerClaz.setProperties().keys().map()...\n// }\n// }\n// }\n\nexport default class _AddOn extends Mix(UpdatingElement, PropertyDefaultValue) {\n static get properties() {\n return {\n disabled: { type: Boolean },\n };\n }\n\n connectedCallback() {\n if (super.connectedCallback) super.connectedCallback();\n if (this.zIndex === undefined) {\n this.zIndex = Array.prototype.indexOf.call(\n this.parentElement.children,\n this,\n );\n }\n if (this.parentElement && this.parentElement.map) {\n this.map = this.parentElement.map;\n this._afterMapCreated();\n } else {\n this.mapReadyEvent = () => {\n this.map = this.parentElement.map;\n this._afterMapCreated();\n this.parentElement.removeEventListener(\n 'kistationmapready',\n this.mapReadyEvent,\n );\n };\n this.parentElement.addEventListener(\n 'kistationmapready',\n this.mapReadyEvent,\n );\n }\n }\n\n _afterMapCreated() {\n if (!this.disabled) {\n this._create();\n }\n }\n\n shouldUpdate(_changedProperties) {\n if (_changedProperties.has('disabled') && this.disabled) {\n this.map && this._tear();\n }\n return !this.disabled;\n }\n\n disconnectedCallback() {\n if (super.disconnectedCallback) super.disconnectedCallback();\n this.map && this._tear();\n }\n\n // eslint-disable-next-line class-methods-use-this\n _create() {\n throw new Error('need implement in sub class');\n }\n\n // eslint-disable-next-line class-methods-use-this\n _tear() {\n throw new Error('need implement in sub class');\n }\n}\n","import { customElement } from 'lit/decorators.js';\nimport { flatten } from 'lodash-es';\nimport _AddOn from './_AddOn';\n\n@customElement('ki-base-layers')\nexport default class KiBaseLayers extends _AddOn {\n static get properties() {\n return {\n layers: { type: Array },\n additionalLayers: { type: Array, initial: () => [] },\n defaultLayer: { type: String },\n zIndex: { type: String, attribute: 'z-index' },\n };\n }\n\n _create() {\n this.mapLayers = flatten(this.layers);\n this.map.getLayers().extend(this.mapLayers);\n this.mapLayers.forEach(l => {\n // TODO data update flow is not good\n // maybe layerControl should not change layer visibility directly.\n l.on('change:visible', e => {\n if (e.target.getVisible()) {\n this.dispatchEvent(\n new CustomEvent('changed', {\n detail: { value: e.target.get('label') },\n bubbles: true,\n composed: true,\n }),\n );\n }\n });\n });\n }\n\n _tear() {\n this.mapLayers.forEach(l => this.map.removeLayer(l));\n }\n\n updated(_changedProperties) {\n super.updated(_changedProperties);\n // TODO how to update.\n if (this.map && _changedProperties.size > 0 && this.map) {\n this._tear();\n this._create();\n }\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { Mix } from '@kisters/wcp-base/common';\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport nls from '../../locales/index';\n\n@customElement('ki-catchment-info')\nexport default class KiCatchmentInfo extends Mix(LitElement, [\n i18nMixin,\n { nls },\n]) {\n static styles = css`\n :host {\n display: block;\n }\n .station-name {\n padding-left: 10px;\n padding-top: 10px;\n font-size: 1.2em;\n }\n\n hr {\n margin: 5px 0;\n }\n .table {\n display: table;\n line-height: 1.5em;\n }\n .row {\n display: table-row;\n }\n .cell {\n display: table-cell;\n padding: 0 10px;\n min-width: 50px;\n color: gray;\n }\n .label {\n color: #4a4a49;\n }\n `;\n\n static get properties() {\n return {\n catchment: { type: Object },\n };\n }\n\n constructor() {\n super();\n this.catchment = {};\n }\n\n render() {\n return html`
${this.catchment.catchment_name}
\n
\n
\n
\n
${this.i18n.t('alarm_status')}
\n
${this.catchment.__tag}
\n
\n
\n
${this.i18n.t('message_time')}
\n
${this.catchment.catchmentAlarmTimestamp}
\n
\n
\n
${this.i18n.t('message')}
\n
${this.catchment.catchmentAlarmMessage || '-'}
\n
\n
`;\n }\n}\n","import {\n ImageArcGISRest,\n ImageWMS,\n OSM,\n TileArcGISRest,\n TileImage,\n TileWMS,\n Vector as VectorSource,\n WMTS,\n XYZ,\n ImageStatic,\n VectorTile as VectorTileSource,\n} from 'ol/source';\nimport {\n Image as ImageLayer,\n Tile as TileLayer,\n Vector as VectorLayer,\n} from 'ol/layer';\nimport VectorTileLayer from 'ol/layer/VectorTile';\nimport { optionsFromCapabilities } from 'ol/source/WMTS';\nimport { GeoJSON, WMTSCapabilities, TopoJSON, MVT } from 'ol/format';\nimport { Circle as CircleStyle, Fill, Stroke, Style, Text } from 'ol/style';\nimport TileGrid from 'ol/tilegrid/TileGrid';\n\nimport { applyStyle } from 'ol-mapbox-style';\n\nimport { FontIcon } from '../components/ki-station-map/FontIcon';\n\nconst parserWMTS = new WMTSCapabilities();\n\nconst styleFontIconDefaults = {\n backgroundColor: 'rgba(197, 213, 234, 1)',\n icon: '',\n fontSize: 0.8,\n radius: 9,\n color: 'rgba(29,29,27, 1)',\n border: {\n color: 'rgba(29,29,27, 1)',\n width: 1,\n },\n};\n\nconst styleDefaults = {\n stroke: {\n color: 'rgba(255, 255, 255, 1.0)',\n width: 1,\n },\n fill: {\n color: 'rgba(155, 155, 155, 0.5)',\n },\n};\n\nconst textStyleDefaultPoint = {\n textAlign: 'left',\n textBaseline: 'middle',\n font: '14px -apple-system, BlinkMacSystemFont, sans-serif, Calibri',\n offsetX: 7,\n fill: { color: 'black' },\n stroke: { color: 'black', width: 0.5 },\n};\n\nconst textStyleDefault = {\n textAlign: 'center',\n textBaseline: 'middle',\n font: '24px -apple-system, BlinkMacSystemFont, sans-serif,Calibri',\n fill: new Fill({ color: 'white' }),\n stroke: new Stroke({ color: 'black', width: 1 }),\n};\n\nfunction getTextStyle(type, textStyle) {\n let style = { ...textStyleDefault, ...textStyle };\n switch (type) {\n case 'Point':\n style = { ...textStyleDefaultPoint, ...textStyle };\n break;\n default:\n }\n style.fill = new Fill(style.fill);\n style.zIndex = 1;\n style.stroke = new Stroke(style.stroke);\n style.backgroundFill = style.backgroundFill\n ? new Fill(style.backgroundFill)\n : null;\n style.backgroundStroke = style.backgroundStroke\n ? new Fill(style.backgroundStroke)\n : null;\n return new Text(style);\n}\n\nexport function getStyle(type, style = {}, textStyle = {}) {\n let retStyle;\n const { stroke, fill } = style;\n switch (type) {\n case 'Point':\n retStyle = new Style({\n text: getTextStyle(type, textStyle),\n image: new FontIcon({ ...styleFontIconDefaults, ...style }),\n });\n break;\n case 'LineString':\n case 'MultiLineString':\n retStyle = new Style({\n text: getTextStyle(type, textStyle),\n stroke: new Stroke(stroke || styleDefaults.stroke),\n });\n break;\n case 'Polygon':\n case 'MultiPolygon':\n case 'Circle':\n retStyle = new Style({\n text: getTextStyle(type, textStyle),\n stroke: new Stroke(stroke || styleDefaults.stroke),\n fill: new Fill(fill || styleDefaults.fill),\n });\n break;\n case 'GeometryCollection':\n retStyle = new Style({\n text: getTextStyle(type, textStyle),\n stroke: new Stroke(stroke || styleDefaults.stroke),\n fill: new Fill(fill || styleDefaults.fill),\n image: new CircleStyle({\n radius: 10,\n fill: null,\n stroke: new Stroke({\n color: 'magenta',\n }),\n }),\n });\n break;\n default:\n break;\n }\n return retStyle;\n}\n\nfunction getVectorTileLayer({\n viewFilter,\n label,\n zIndex,\n maxZoom,\n minZoom,\n extent,\n projection,\n url,\n attribution,\n style = {},\n}) {\n const _style = new Style({\n stroke: new Stroke(\n style.stroke ?? {\n color: 'gray',\n width: 1,\n },\n ),\n fill: new Fill(\n style.fill ?? {\n color: 'rgba(20,20,20,0.9)',\n },\n ),\n });\n return new VectorTileLayer({\n maxZoom,\n viewFilter,\n minZoom,\n zIndex,\n name: label,\n extent,\n style: () => _style,\n source: new VectorTileSource({\n format: new MVT(),\n projection,\n attributions: attribution,\n url,\n zIndex,\n }),\n });\n}\n\nfunction getWTMSLayer({\n extent,\n viewFilter,\n attributions,\n maxZoom,\n minZoom,\n label,\n url,\n layer,\n matrixSet,\n opacity = 1,\n}) {\n const tileLayer = new TileLayer({\n opacity,\n maxZoom,\n minZoom,\n extent,\n viewFilter,\n name: label,\n });\n fetch(url)\n .then(response => response.text())\n .then(text => {\n const options = optionsFromCapabilities(parserWMTS.read(text), {\n layer,\n matrixSet,\n });\n options.crossOrigin = 'Anonymous';\n tileLayer.set('name', label || options.title);\n options.attributions = attributions;\n tileLayer.setSource(new WMTS(options));\n });\n return tileLayer;\n}\n\nfunction getWMSLayer({\n viewFilter,\n attributions,\n projection,\n maxZoom,\n zIndex,\n minZoom,\n extent,\n ratio = 1,\n params = {},\n label,\n url,\n opacity = 1,\n tiled = false,\n}) {\n return tiled\n ? new TileLayer({\n opacity,\n maxZoom,\n minZoom,\n viewFilter,\n zIndex,\n extent,\n name: label,\n source: new TileWMS({\n crossOrigin: 'Anonymous',\n projection,\n url,\n params,\n transition: 0,\n attributions,\n }),\n })\n : new ImageLayer({\n opacity: opacity || 1,\n name: label,\n maxZoom,\n minZoom,\n zIndex,\n viewFilter,\n extent,\n source: new ImageWMS({\n serverType: 'mapserver',\n ratio,\n projection,\n crossOrigin: 'Anonymous',\n url,\n params,\n attributions,\n }),\n });\n}\n\nfunction getMapBoxStyleLayer({\n viewFilter,\n label,\n zIndex,\n maxZoom,\n minZoom,\n extent,\n url,\n}) {\n const newLayer = new VectorTileLayer({\n maxZoom,\n viewFilter,\n minZoom,\n zIndex,\n extent,\n name: label,\n declutter: true,\n });\n\n applyStyle(newLayer, url);\n // applyBackground(newLayer, url);\n\n return newLayer;\n}\n\nfunction getOSMLayer({ viewFilter, label, zIndex, maxZoom, minZoom, extent }) {\n return new TileLayer({\n maxZoom,\n viewFilter,\n minZoom,\n zIndex,\n extent,\n name: label,\n source: new OSM(),\n });\n}\n\nfunction getXYZLayer({\n viewFilter,\n projection,\n gridParams,\n zIndex,\n maxZoom,\n minZoom,\n label,\n url,\n attribution,\n params,\n extent,\n}) {\n return new TileLayer({\n name: label,\n maxZoom,\n minZoom,\n extent,\n viewFilter,\n source: new XYZ({\n projection,\n attributions: attribution,\n url,\n zIndex,\n crossOrigin: 'Anonymous',\n params,\n tileGrid: gridParams ? new TileGrid(gridParams) : undefined,\n }),\n });\n}\n\nfunction getCustomLayer({\n viewFilter,\n maxZoom,\n zIndex,\n minZoom,\n label,\n url,\n gridParams,\n projection,\n}) {\n const urlTemplate = `${url}_alllayers/L{z}/R{y}/C{x}.png`;\n return new TileLayer({\n name: label,\n zIndex,\n maxZoom,\n viewFilter,\n minZoom,\n source: new TileImage({\n tileUrlFunction(tileCoord) {\n const z = tileCoord[0];\n const x = tileCoord[1];\n const y = tileCoord[2];\n const _z = `00${z.toString()}`.substr(-2);\n const _r = `00000000${y.toString(16)}`.substr(-8);\n const _c = `00000000${x.toString(16)}`.substr(-8);\n return urlTemplate\n .replace('{z}', _z)\n .replace('{y}', _r)\n .replace('{x}', _c);\n },\n projection,\n tileGrid: new TileGrid(gridParams),\n }),\n });\n}\n\nfunction getTileArcGISRestLayer({\n viewFilter,\n maxZoom,\n zIndex,\n minZoom,\n label,\n url,\n attribution,\n format = 'PNG',\n}) {\n return new TileLayer({\n name: label,\n opacity: 1.0,\n maxZoom,\n minZoom,\n viewFilter,\n zIndex,\n source: new TileArcGISRest({\n attributions: attribution,\n url,\n crossOrigin: 'Anonymous',\n params: { FORMAT: format },\n }),\n });\n}\n\nfunction getStaticImageLayer({\n viewFilter,\n opacity = 1.0,\n imageSmoothing = true,\n maxZoom,\n zIndex,\n minZoom,\n label,\n url,\n projection,\n extent,\n}) {\n return new ImageLayer({\n name: label,\n opacity,\n maxZoom,\n minZoom,\n viewFilter,\n zIndex,\n source: new ImageStatic({\n imageSmoothing,\n url,\n projection,\n imageExtent: extent,\n }),\n });\n}\n\nfunction getImageArcGISRestLayer({\n viewFilter,\n maxZoom,\n zIndex,\n minZoom,\n label,\n url,\n attribution,\n params,\n projection,\n}) {\n return new ImageLayer({\n name: label,\n opacity: 1.0,\n maxZoom,\n minZoom,\n viewFilter,\n zIndex,\n source: new ImageArcGISRest({\n attributions: attribution,\n url,\n projection,\n ratio: 1,\n crossOrigin: 'Anonymous',\n params,\n }),\n });\n}\n\nfunction getJsonLayer({\n featureProjection,\n attribution,\n opacity = 1,\n highlightedStyle,\n idProperty,\n declutter = false,\n type,\n extent,\n label,\n url,\n dataProjection,\n labelProperty,\n style,\n styleProperty,\n zIndex = null,\n maxZoom,\n minZoom,\n hoverStyle,\n textStyle,\n viewFilter,\n haslinks,\n}) {\n const vectorSource = new VectorSource({ attributions: attribution });\n const FeatureParser = type === 'topojson' ? TopoJSON : GeoJSON;\n const layer = new VectorLayer({\n updateWhileInteracting: true,\n updateWhileAnimating: true,\n name: label,\n source: vectorSource,\n type,\n declutter,\n extent,\n maxZoom,\n interactive: !!hoverStyle,\n haslinks: !!haslinks,\n opacity,\n viewFilter,\n minZoom,\n zIndex,\n style(feature) {\n return feature._style;\n },\n });\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url);\n xhr.onload = () => {\n if (xhr.status === 200) {\n const data = JSON.parse(xhr.responseText);\n if (data.bbox) {\n layer.setExtent(data.bbox);\n }\n const features = new FeatureParser({\n dataProjection: dataProjection || 'EPSG:3857',\n }).readFeatures(data, { featureProjection });\n features.forEach(feat => {\n if (idProperty && feat.get(idProperty)) {\n feat.setId(feat.get(idProperty));\n }\n feat._style = getStyle(\n feat.getGeometry().getType(),\n style[feat.get(styleProperty)] || style,\n textStyle,\n );\n\n if (highlightedStyle) {\n feat._highlightedStyle = getStyle(\n feat.getGeometry().getType(),\n highlightedStyle.style[feat.get(styleProperty)] ||\n highlightedStyle.style,\n highlightedStyle.textStyle,\n );\n }\n\n if (hoverStyle) {\n if (hoverStyle.style) {\n feat._hoverStyle = getStyle(\n feat.getGeometry().getType(),\n hoverStyle.style[feat.get(styleProperty)] || hoverStyle.style,\n hoverStyle.textStyle,\n );\n if (hoverStyle.labelProperty) {\n feat._hoverStyle\n .getText()\n .setText(feat.get(hoverStyle.labelProperty));\n }\n }\n if (hoverStyle.tooltipProperty) {\n feat._toolTip = feat.get(hoverStyle.tooltipProperty);\n }\n }\n if (labelProperty) {\n feat._style.getText().setText(feat.get(labelProperty));\n }\n });\n vectorSource.addFeatures(features);\n vectorSource.dispatchEvent('done');\n } else {\n /* eslint-disable-next-line no-throw-literal */\n throw `generate layer ${label} failed`;\n }\n };\n xhr.send();\n return layer;\n}\n\nfunction _getLayer(args) {\n const {\n group = 'Backgrounds',\n selectable = true,\n visible = false,\n type = 'none',\n label = 'none',\n legendColor = null,\n } = args;\n let bglayer;\n switch (type.toLowerCase()) {\n case 'vectortiles':\n bglayer = getVectorTileLayer(args);\n break;\n case 'staticimage':\n bglayer = getStaticImageLayer(args);\n break;\n case 'mapbox':\n bglayer = getMapBoxStyleLayer(args);\n break;\n case 'osm':\n bglayer = getOSMLayer(args);\n break;\n case 'wmts':\n bglayer = getWTMSLayer(args);\n break;\n case 'wms':\n bglayer = getWMSLayer(args);\n break;\n case 'xyz':\n bglayer = getXYZLayer(args);\n break;\n case 'custom':\n bglayer = getCustomLayer(args);\n break;\n case 'tilearcgisrest':\n bglayer = getTileArcGISRestLayer(args);\n break;\n case 'imagearcgisrest':\n bglayer = getImageArcGISRestLayer(args);\n break;\n case 'geojson':\n bglayer = getJsonLayer(args);\n break;\n case 'topojson':\n bglayer = getJsonLayer(args);\n break;\n default:\n bglayer = new VectorLayer({\n name: label,\n vectorSource: new VectorSource({}),\n });\n }\n bglayer.setProperties({\n legendColor,\n displayInLayerControl: selectable,\n group,\n });\n bglayer.setVisible(visible);\n return bglayer;\n}\n\nexport function getLayer(args) {\n const { type, items, visible, label, group, legendColor, attribution } = args;\n if (type === 'layergroup') {\n const ret = items.map((layer, i) => {\n layer.selectable = i === 0;\n layer.group = group;\n layer.label = label;\n layer.visible = visible;\n layer.legendColor = legendColor;\n layer.attribution = attribution;\n return _getLayer(layer);\n });\n ret.forEach(layer => {\n layer.linkedlayers = ret;\n });\n return ret;\n }\n return _getLayer(args);\n}\n","import { customElement } from 'lit/decorators.js';\nimport { getLayer } from '../../common/ki-ol-layer-generator';\nimport _AddOn from './_AddOn';\n\n@customElement('ki-layer-factory')\nexport default class KiLayerFactory extends _AddOn {\n static get properties() {\n return {\n additionalLayers: { type: Array },\n };\n }\n\n constructor() {\n super();\n this.mapLayers = [];\n }\n\n _create() {\n this.mapLayers = this.additionalLayers.map(c => getLayer(c));\n this.map.getLayers().extend(this.mapLayers);\n }\n\n _tear() {\n this.mapLayers.forEach(l => this.map.removeLayer(l));\n this.mapLayers = [];\n }\n\n updated(_changedProperties) {\n super.updated(_changedProperties);\n // // TODO how to update.\n if (_changedProperties.size > 0 && this.map) {\n this._tear();\n this._create();\n }\n }\n}\n","import { css } from 'lit';\n\n// language=CSS\nexport default css`\n :host {\n display: inline-block;\n color: gray;\n font-size: 14px;\n text-align: center;\n padding: 0;\n position: relative;\n background: transparent;\n pointer-events: all;\n z-index: 10;\n --ui5-listitem-selected-border-bottom: none;\n --sapList_SelectionBackgroundColor: white;\n --sapList_AlternatingBackground: white;\n --_ui5-tree-indent-step: 0;\n }\n\n ui5-checkbox {\n display: none;\n }\n\n .toggle-btn {\n line-height: 36px;\n font-size: 20px;\n position: relative;\n }\n\n :host(.list-visible) {\n height: 100%;\n }\n :host(.list-visible) .toggle-btn {\n background: var(--theme-color, #0056a0);\n fill: white;\n\n z-index: 2;\n }\n\n :host(.list-visible) ki-icon::part(icon) {\n fill: white;\n }\n\n .title,\n .basetitle {\n font-weight: bold;\n text-decoration: underline;\n }\n\n .basetitle {\n padding-left: 55px;\n }\n\n .layer-list {\n position: absolute;\n background: white;\n right: 0;\n top: 0;\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12),\n 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n z-index: 1;\n min-width: 200px;\n text-align: left;\n display: block;\n visibility: hidden;\n transform: scale(0.8);\n transform-origin: top right;\n opacity: 0;\n transition: transform 0.3s linear 0s, opacity 0.3s linear 0s,\n visibility 0.3s linear 0s;\n border-radius: 18px;\n padding: 10px;\n }\n\n :host(.list-visible) .layer-list {\n visibility: visible;\n opacity: 1;\n transform: scale(1);\n overflow: auto;\n max-height: calc(100% - 220px);\n }\n\n :host(.sm-screen) .layer-list {\n visibility: visible !important;\n opacity: 1 !important;\n transform: scale(1) !important;\n position: relative;\n top: unset;\n left: unset;\n border-radius: 0;\n }\n\n .layer-item {\n white-space: nowrap;\n height: 40px;\n }\n\n .layer-item.radio {\n white-space: nowrap;\n height: 30px;\n }\n\n ki-checkbox {\n padding: 3px 15px;\n }\n\n .layer-item .label {\n display: inline-block;\n vertical-align: top;\n line-height: 25px;\n background: white;\n padding: 0px 5px;\n }\n\n .layer-item.radio .label {\n line-height: 30px;\n }\n\n hr {\n margin: 10px;\n }\n\n .radiobutton {\n transform: scale(1.5);\n margin-left: 15px;\n margin-right: 20px;\n margin-top: 8px;\n }\n\n .colorlegend {\n display: inline-block;\n vertical-align: middle;\n margin-left: 10px;\n width: 20px;\n height: 3px;\n }\n`;\n","/* eslint-disable wc/no-self-class */\nimport { html, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement } from 'lit/decorators.js';\nimport { Mix } from '@kisters/wcp-base/common';\nimport '@ui5/webcomponents/dist/Button';\n\nimport '@kisters/wcp-base/components';\n\nimport {\n responsiveMixin,\n SM,\n ViewPort,\n i18nMixin,\n} from '@kisters/wcp-base/decorators';\n\nimport '@ui5/webcomponents/dist/Tree';\nimport '@ui5/webcomponents/dist/TreeItem';\n\nimport nls from '../../locales/index';\nimport style from './ki-layers-control-element.css?inline';\n\n// TODO rework to read from map.\nfunction toggleValue(\n array,\n value,\n flag,\n conflictList: Array | undefined = undefined,\n) {\n const i = array.indexOf(value);\n if (conflictList) {\n conflictList.forEach(\n v => array.indexOf(v) >= 0 && array.splice(array.indexOf(v), 1),\n );\n }\n if (flag && !(array.indexOf(value) >= 0)) {\n array.push(value);\n } else if (!flag && i >= 0) {\n array.splice(array.indexOf(value), 1);\n }\n}\n\n// @ts-expect-error\n@customElement('ki-layers-control-element')\nexport default class KiLayersControlElement extends Mix(\n LitElement,\n [i18nMixin, { nls }],\n responsiveMixin,\n) {\n // language=CSS\n static styles = style;\n\n constructor() {\n super();\n this.treeList = false;\n this.values = [];\n this.layers = [];\n this.__maxHeight = null;\n this.toggleAll = false;\n\n // fix for bug fire map dragging\n const stopEvent = e => {\n e.stopPropagation();\n };\n this.onpointerdown = stopEvent;\n this.onpointerup = stopEvent;\n }\n\n static get properties() {\n return {\n layers: {\n type: Array,\n },\n values: {\n type: Object,\n },\n toggleAll: {\n type: Boolean,\n },\n treeList: {\n type: Boolean,\n },\n };\n }\n\n _renderCheckBoxGroup(group: {\n label: string;\n type: string;\n options: Array<{\n value: string;\n label: string;\n legendColor: string;\n }>;\n }) {\n // @ts-expect-error\n const groupId = group.label.replaceAll(' ', '_');\n\n const groupChecked = (): boolean =>\n group.options.every(option => this.values.indexOf(option.value) >= 0);\n\n const groupIntermediate = (): boolean =>\n group.options.some(option => this.values.indexOf(option.value) >= 0);\n\n const toggleGroup = (selected: boolean): void => {\n group.options.forEach(option => {\n toggleValue(this.values, option.value, selected);\n });\n this._emitChange();\n };\n\n return html`\n
\n
\n toggleGroup(e.target.checked)}\"\n ?checked=${groupChecked()}\n ?indeterminate=${groupIntermediate()}\n >\n {\n const checkbox = this.renderRoot.querySelector(`#${groupId}`);\n checkbox.checked = !checkbox.checked;\n toggleGroup(checkbox.checked);\n }}\"\n >\n ${this.i18n.t(group.label)}\n
\n
\n ${group.options.map(\n option => html`\n
\n {\n toggleValue(this.values, option.value, e.target.checked);\n this._emitChange();\n }}\"\n ?checked=\"${this.values.indexOf(option.value) >= 0}\"\n >\n {\n const checkbox = this.renderRoot.querySelector(\n `#${option.value}`,\n );\n checkbox.checked = !checkbox.checked;\n toggleValue(this.values, option.value, checkbox.checked);\n this._emitChange();\n }}\"\n >\n ${option.label}\n ${option.legendColor\n ? html``\n : ''}\n
\n \n `,\n )}\n \n `;\n }\n\n _renderRadioGroup(group) {\n return html`\n
\n
\n
\n ${this.i18n.t(group.label)}\n
\n
\n ${group.options.map(\n option => html`\n
\n {\n toggleValue(\n this.values,\n option.value,\n e.target.checked,\n group.options.map(op => op.value),\n );\n\n this.renderRoot\n .querySelectorAll('.radiobutton')\n .forEach(node => {\n // eslint-disable-next-line no-param-reassign\n node.checked = node === e.target;\n });\n this._emitChange();\n }}\"\n ?checked=\"${this.values.indexOf(option.value) >= 0}\"\n />\n
${option.label}
\n
\n `,\n )}\n
\n `;\n }\n\n _emitChange() {\n this.requestUpdate();\n this.dispatchEvent(\n new CustomEvent('changed', {\n detail: {\n values: this.values,\n },\n }),\n );\n }\n\n _renderLayerList() {\n return html`\n
\n ${this.layers.map((group, index) => {\n if (group.type === 'checkbox') {\n return [\n this._renderCheckBoxGroup(group),\n index === this.layers.length - 1 ? '' : html`
`,\n ];\n }\n if (group.type === 'radio') {\n return [\n this._renderRadioGroup(group),\n index === this.layers.length - 1 ? '' : html`
`,\n ];\n }\n return '';\n })}\n
\n `;\n }\n\n _renderLayerTree() {\n return html`\n
\n ${this.layers.map(\n group => html` {\n this.values = [\n ...this.renderRoot.querySelectorAll('ui5-tree-item'),\n ]\n .filter(item => item.selected)\n .map(item => item.text);\n this._emitChange();\n }}\"\n @item-click=\"${e => {\n if (e.detail.item.classList.contains('toplevel')) {\n e.detail.item.toggleAttribute('expanded');\n this.requestUpdate();\n }\n }}\"\n mode=\"${group.type === 'checkbox'\n ? 'MultiSelect'\n : 'SingleSelectBegin'}\"\n >\n ${group.options.map(\n opt =>\n html``,\n )}\n `,\n )}\n
\n `;\n }\n\n _hideToplevelSelect() {\n const trees = this.renderRoot.querySelectorAll('ui5-tree');\n if (trees) {\n [...trees].forEach(tree => {\n if (tree.shadowRoot?.children[0]?.children[1]?.shadowRoot) {\n const checkboxOrButtons =\n tree.shadowRoot.children[0].children[1].shadowRoot.querySelectorAll(\n 'ui5-checkbox,ui5-radio-button',\n );\n if (checkboxOrButtons.length > 0) {\n checkboxOrButtons[0].style.display = 'none';\n }\n }\n });\n }\n }\n\n firstUpdated() {\n setTimeout(() => {\n this._hideToplevelSelect();\n }, 200);\n }\n\n updateDefaultSelection() {\n const selection: Array = [];\n this.layers.forEach(layer =>\n layer.options.forEach(opt => {\n if (opt.visible) {\n selection.push(opt.label);\n }\n }),\n );\n this.values = selection;\n }\n\n updated(_changedProperties: any) {\n this._hideToplevelSelect();\n if (_changedProperties.has('layers')) {\n this.updateDefaultSelection();\n }\n }\n\n render() {\n let list;\n if (ViewPort.size === SM) {\n list = html`\n {\n this._removeVisible();\n }}\"\n closeable\n >${this._renderLayerList()}\n `;\n } else if (this.treeList) {\n list = this._renderLayerTree();\n } else {\n list = this._renderLayerList();\n }\n // language=html\n return html`\n \n ${list}\n `;\n }\n\n _removeVisible() {\n const layerOptions = this.renderRoot.querySelector('#layers-options');\n if (layerOptions && !layerOptions.visible) {\n this.classList.remove('list-visible');\n }\n }\n\n _toggleList() {\n if (ViewPort.size === SM) {\n this.classList.toggle('list-visible');\n this.renderRoot.querySelector('#layers-options').show();\n } else {\n this.classList.toggle('list-visible');\n this._hideToplevelSelect();\n }\n }\n}\n","import Control from 'ol/control/Control';\nimport { groupBy } from 'lodash-es/collection';\nimport { unByKey } from 'ol/Observable';\nimport { setWithExpiry, getWithExpiry } from '@kisters/wcp-base/common';\n\nexport default class LayersControl extends Control {\n constructor(options) {\n options.element = document.createElement('ki-layers-control-element');\n super(options);\n this.toggleAll = options.toggleAll;\n this.treeList = options.treeList;\n this.i18n = options.i18n;\n this.groups = options.groups;\n this.style = options.style;\n this.context = options.context;\n this.cachePrefix = options.cachePrefix;\n this._listenLanguageChange();\n }\n\n setMap(map) {\n super.setMap(map);\n if (map) {\n this._buildOptions();\n this.element.addEventListener('changed', e => {\n this._setLayersVisible(e.detail.values);\n });\n this.__layerChangeListenerKey = map\n .getLayers()\n .on('change:length', () => {\n this._buildOptions();\n });\n } else {\n unByKey(this.__layerChangeListenerKey);\n }\n }\n\n set style(style) {\n this.element.style = style;\n }\n\n // TODO\n _buildOptions() {\n const items = this._getItems();\n const layerGroups = groupBy(items, l => l.get('group'));\n this.element.toggleAll = this.toggleAll;\n this.element.treeList = this.treeList;\n this.element.layers = this.groups.map(k => {\n const groupName = typeof k === 'string' ? k : k.name;\n const ls = layerGroups[groupName] || [];\n return {\n label: this.i18n?.t(groupName) || groupName,\n type: k.type || 'checkbox',\n options: ls.map(l => ({\n label: this.i18n?.t(l.get('name')),\n value: l.get('name'),\n legendColor: l.get('legendColor'),\n visible: l.get('visible'),\n })),\n };\n });\n\n const values = getWithExpiry(\n `${this.cachePrefix}_LayersControl-visibleLayers`,\n true,\n );\n if (values) {\n this._setLayersVisible(values);\n this.element.values = values;\n } else {\n this.element.values = items\n .filter(l => l.getVisible())\n .map(l => l.get('name'));\n }\n }\n\n _setLayersVisible(values) {\n setWithExpiry(\n `${this.cachePrefix}_LayersControl-visibleLayers`,\n values,\n 24 * 3600 * 1000,\n true,\n );\n this._getItems().forEach(item => {\n const name = item.get('name');\n const viewFilter = item.get('viewFilter');\n\n item.setVisible(values.indexOf(name) >= 0);\n if (item.linkedlayers) {\n item.linkedlayers.forEach(layer =>\n layer.setVisible(values.indexOf(name) >= 0),\n );\n }\n if (viewFilter) {\n item.setVisible(\n viewFilter.length && !viewFilter.includes(this.context),\n );\n }\n });\n }\n\n _getItems() {\n return [\n ...this.getMap().getLayers().getArray(),\n ...this.getMap().getControls().getArray(),\n ]\n .filter(l => {\n const viewFilter = l.get('viewFilter');\n if (\n viewFilter &&\n viewFilter.length &&\n !viewFilter.includes(this.context)\n ) {\n l.setVisible(false);\n return false;\n }\n if (!viewFilter) {\n return true;\n }\n l.setVisible(true);\n return true;\n })\n .filter(l => l.get('displayInLayerControl') || l.displayInLayerControl);\n }\n\n _listenLanguageChange() {\n if (this.i18n) {\n this.i18n.on('initialized', () => {\n this._buildOptions();\n });\n this.i18n.on('languageChanged', () => {\n this._buildOptions();\n });\n }\n }\n}\n","import { customElement } from 'lit/decorators.js';\nimport _AddOn from './_AddOn';\nimport LayersControl from './LayersControl';\nimport './ki-layers-control-element';\n\n@customElement('ki-layers-control')\nexport default class KiLayersControl extends _AddOn {\n // TODO i18n?\n\n constructor() {\n super();\n this.cachePrefix = 'none';\n }\n\n static get properties() {\n return {\n groups: { type: Array },\n i18n: { type: Object },\n style: { type: String },\n context: { type: String },\n cachePrefix: { type: String },\n toggleAll: { type: Boolean },\n treeList: { type: Boolean },\n };\n }\n\n _create() {\n this.controller = new LayersControl({\n toggleAll: this.toggleAll,\n treeList: this.treeList,\n i18n: this.i18n,\n groups: this.groups,\n style: this.style,\n context: this.context,\n cachePrefix: this.cachePrefix,\n });\n this.map.addControl(this.controller);\n }\n\n _tear() {\n this.map.removeControl(this.controller);\n }\n\n updated(_changedProperties) {\n super.updated(_changedProperties);\n // // TODO how to update. for simple component can just recreate.\n if (_changedProperties.size > 0 && this.map) {\n this._tear();\n this._create();\n }\n }\n}\n","// eslint-disable-next-line max-classes-per-file\nimport VectorLayer from 'ol/layer/Vector';\nimport VectorSource from 'ol/source/Vector';\nimport { Cluster } from 'ol/source';\nimport Feature from 'ol/Feature';\nimport Point from 'ol/geom/Point';\nimport CanvasVectorLayerRenderer from 'ol/renderer/canvas/VectorLayer';\nimport { Circle as CircleStyle, Fill, Stroke, Style, Text } from 'ol/style';\nimport Chart from 'ol-ext/style/Chart';\n\n// support hide feature;\nclass _CanvasVectorLayerRenderer extends CanvasVectorLayerRenderer {\n // eslint-disable-next-line consistent-return,camelcase\n renderFeature(feature, squaredTolerance, styles, builderGroup, optTransform) {\n if (feature.hide) {\n return false;\n }\n super.renderFeature(\n feature,\n squaredTolerance,\n styles,\n builderGroup,\n optTransform,\n );\n }\n}\n\n/*\n * support hide features according legends\n * render features for stations with one function\n * */\nexport default class StationsLayer extends VectorLayer {\n tagProperty = '__tag'; // TODO\n\n constructor(options) {\n options = {\n updateWhileInteracting: true,\n updateWhileAnimating: true,\n source: new VectorSource(),\n stations: [],\n ...options,\n };\n super(options);\n this.changeCounter = 0;\n this.setProperties({\n name: options.name,\n displayInLayerControl: options.displayInLayerControl,\n timeActive: options.timeActive || false,\n group: options.group,\n });\n this.selection = [];\n Object.assign(this, options);\n }\n\n set stations(val) {\n this.__stations = val;\n this.reload();\n }\n\n get stations() {\n return this.__stations;\n }\n\n set legends(legends) {\n this._legends = legends.concat(['_default']);\n this.reload();\n }\n\n reload() {\n const { config } = this;\n const source = this.getSource();\n source.clear();\n if (this.stations && this.stations.length) {\n this.changeCounter += 1;\n if (config?.clusterStations?.enabled) {\n const _clusterMarker = config.clusterStations.marker;\n const clusterMarker = {\n backgroundColor: _clusterMarker.backgroundColor || '#aaa',\n color: _clusterMarker.color || '#000',\n fontSize: _clusterMarker.fontSize || 1,\n stroke: {\n color: _clusterMarker.stroke?.color || '#aaa',\n width: _clusterMarker.stroke?.width || 0,\n },\n radius: _clusterMarker.radius || 9,\n border: {\n color: _clusterMarker.border?.color || '#aaa',\n width: _clusterMarker.border?.width || 1,\n },\n };\n const stationSource = new VectorSource({\n features: this._createStationFeatures(this.stations),\n });\n const clusterSource = new Cluster({\n distance: 30,\n minDistance: 40,\n source: stationSource,\n });\n this.setSource(clusterSource);\n const styleCache = {};\n if (config?.clusterStations?.marker?.type === 'pie') {\n this.setStyle(feature => {\n const _features = feature.get('features');\n const size = _features.length;\n if (size === 1) return _features[0].getStyle();\n const colors = _features.map(f =>\n f.getStyle().getImage().getFill().getColor(),\n );\n const count = {};\n colors.forEach(c => {\n count[c] = (count[c] || 0) + 1;\n });\n const iconColors = Object.keys(count);\n const iconData = Object.values(count);\n\n const style = new Style({\n image:\n iconData.length > 1\n ? new Chart({\n type: 'pie',\n radius: clusterMarker.radius,\n data: iconData,\n colors: iconColors,\n stroke: new Stroke({\n color: clusterMarker.border.color,\n width: clusterMarker.border.width,\n }),\n })\n : new CircleStyle({\n radius: clusterMarker.radius,\n stroke: new Stroke({\n color: clusterMarker.border.color,\n width: clusterMarker.border.width,\n }),\n fill: new Fill({\n color: iconColors[0],\n }),\n }),\n text: new Text({\n text: size.toString(),\n fill: new Fill({\n color: clusterMarker.color,\n }),\n scale: clusterMarker.fontSize,\n stroke: new Stroke({\n color: clusterMarker.stroke.color,\n width: clusterMarker.stroke.width,\n }),\n }),\n });\n return style;\n });\n } else {\n this.setStyle(feature => {\n const _features = feature.get('features');\n const size = _features.length;\n if (size === 1) return _features[0].getStyle();\n let style = styleCache[size];\n if (!style) {\n style = new Style({\n image: new CircleStyle({\n radius: clusterMarker.radius,\n stroke: new Stroke({\n color: clusterMarker.border.color,\n width: clusterMarker.border.width,\n }),\n fill: new Fill({\n color: clusterMarker.backgroundColor,\n }),\n }),\n text: new Text({\n text: size.toString(),\n fill: new Fill({\n color: clusterMarker.color,\n }),\n scale: clusterMarker.fontSize,\n stroke: new Stroke({\n color: clusterMarker.stroke.color,\n width: clusterMarker.stroke.width,\n }),\n }),\n });\n styleCache[size] = style;\n }\n return style;\n });\n }\n } else {\n this.setSource(\n new VectorSource({\n features: this._createStationFeatures(this.stations),\n }),\n );\n }\n this._processFeaturesWithLegend();\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n _filterStations(stations) {\n return stations.filter(station => {\n const info = this._getStationInfos(station);\n const longLatMissed =\n (!info.longitude && !info.latitude) ||\n info.longitude > 180 ||\n info.longitude < -180 ||\n info.latitude < -90 ||\n info.latitude > 90;\n return !longLatMissed;\n });\n }\n\n _getStationInfos(station) {\n return {\n longitude: this.isSiteLayer\n ? station.site_longitude\n : station.station_longitude,\n latitude: this.isSiteLayer\n ? station.site_latitude\n : station.station_latitude,\n no: this.isSiteLayer ? station.site_no : station.station_no,\n name: this.isSiteLayer ? station.site_name : station.station_name,\n };\n }\n\n _processFeaturesWithLegend() {\n // why hide it not filter it ? because need keep it map for selection.\n const features = this.getSource().getFeatures();\n features.forEach(f => {\n const tag = f.station[this.tagProperty];\n if (tag && this._legends) {\n f.hide = tag.split('|').some(t => this._legends.indexOf(t) === -1);\n }\n });\n }\n\n _createStationFeatures(stations) {\n const ret = [];\n stations.forEach(station => {\n if (station.point) {\n const f = new Feature(new Point(station.point));\n const style = this._getStationStyle(\n station,\n this.selection.includes(station.station_id),\n );\n if (style) {\n f.setStyle(style);\n }\n f.station = station;\n ret.push(f);\n }\n });\n return ret;\n }\n\n // eslint-disable-next-line no-unused-vars,class-methods-use-this\n _getStationStyle() {\n throw new Error('need implement');\n }\n\n createRenderer() {\n return new _CanvasVectorLayerRenderer(this);\n }\n}\n","import Control from 'ol/control/Control';\nimport StationsLayer from './StationsLayer';\nimport '../ki-legend/ki-legend';\n/*\n * switch legend and set to all layers.\n * */\nexport default class LegendSwitcher extends Control {\n constructor(params = {}) {\n params = { visible: true, ...params };\n params.element = document.createElement('ki-legend');\n params.element.part = 'legend';\n super(params);\n this.options = Array.isArray(params.options)\n ? params.options\n : [params.options];\n this.setVisible(params.visible);\n this.addstyle = params.addstyle;\n this.setProperties({\n name: params.name,\n displayInLayerControl: params.displayInLayerControl,\n group: params.group,\n });\n }\n\n set description(description) {\n this.element.description = description;\n }\n\n set label(label) {\n this.element.label = label;\n }\n\n set options(options) {\n this.element.options = Array.isArray(options) ? options : [options];\n }\n\n set addstyle(style) {\n this.element.addstyle = style;\n }\n\n setMap(map) {\n super.setMap(map);\n // TODO update flow\n this.element.addEventListener('changed', e => {\n this.getMap()\n .getLayers()\n .forEach(l => {\n if (l instanceof StationsLayer) {\n l.legends = e.detail.value;\n }\n });\n });\n }\n\n // move a parent class\n setVisible(flag) {\n this._visible = flag;\n this.element.classList.toggle('hide', !flag);\n }\n\n getVisible() {\n return this._visible;\n }\n}\n","import { isEqual } from 'lodash-es/lang';\nimport { Mix } from '@kisters/wcp-base/common';\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport { customElement } from 'lit/decorators.js';\nimport _AddOn from './_AddOn';\nimport LegendSwitcher from './LegendSwitcher';\nimport nls from '../../locales/index';\n\n@customElement('ki-legend-control')\nexport default class KiLegendControl extends Mix(_AddOn, [i18nMixin, { nls }]) {\n static get properties() {\n return {\n options: {\n type: Object,\n hasChanged(newVal, oldVal) {\n return !isEqual(newVal, oldVal);\n },\n },\n addstyle: { type: String },\n // for all addOn controller ?\n };\n }\n\n _create() {\n this.legendSwitcher = new LegendSwitcher({\n name: this.i18n.t('Legends'),\n displayInLayerControl: true,\n group: 'Information',\n options: this.options,\n addstyle: this.addstyle,\n });\n this.map.addControl(this.legendSwitcher);\n }\n\n _tear() {\n this.map.removeControl(this.legendSwitcher);\n }\n\n updated(_changedProperties) {\n super.updated(_changedProperties);\n if (_changedProperties.has('options') && this.legendSwitcher) {\n this.legendSwitcher.options = this.options;\n }\n if (_changedProperties.has('addstyle') && this.legendSwitcher) {\n this.legendSwitcher.addstyle = this.addstyle;\n }\n if (_changedProperties.has('disabled') && this.legendSwitcher) {\n this.legendSwitcher.disabled = this.disabled;\n }\n }\n}\n","import Control from 'ol/control/Control';\nimport '@kisters/wcp-base/components';\nimport { fromLonLat } from 'ol/proj';\n\nif (!navigator.geolocation) {\n console.warn('Geolocation is not supported for this Browser/OS.');\n}\n\nexport default class LocationControl extends Control {\n constructor(options = {}) {\n options.element = document.createElement('ki-icon-btn');\n options.element.icon = 'ki ki-crosshairs';\n options.element.classList.add('location-btn');\n super(options);\n }\n\n gotoLocation() {\n // TODO timeout\n // need https\n const p = new Promise((resolve, reject) => {\n navigator.geolocation.getCurrentPosition(\n pos => {\n this.getMap()\n .getView()\n .animate({\n center: fromLonLat(\n [pos.coords.longitude, pos.coords.latitude],\n this.getMap().getView().getProjection(),\n ),\n duration: 500,\n });\n resolve();\n },\n e => {\n console.error(e);\n alert(\"Can't get your location\");\n reject(e);\n },\n {\n timeout: 2000,\n },\n );\n });\n\n // TODO show loading?\n console.log(p);\n }\n}\n","import { customElement } from 'lit/decorators.js';\nimport _AddOn from './_AddOn';\nimport LocationControl from './LocationControl';\n\n@customElement('ki-location-control')\nexport default class KiLocationControl extends _AddOn {\n _create() {\n this.locationControl = new LocationControl();\n this.map.addControl(this.locationControl);\n }\n\n _tear() {\n this.map.removeControl(this.locationControl);\n }\n\n updated(_changedProperties) {\n super.updated(_changedProperties);\n // // TODO how to update.\n if (_changedProperties.size > 0 && this.map) {\n this._tear();\n this._create();\n }\n }\n}\n","import Control from 'ol/control/Control';\n/*\n * switch legend and set to all layers.\n * */\nexport default class PopupSwitcher extends Control {\n constructor(params = {}) {\n params = { visible: true, ...params };\n params.element = document.createElement('div');\n params.element.part = 'popup';\n super(params);\n this.setVisible(params.visible);\n this.addstyle = params.addstyle;\n this.setProperties({\n name: params.name,\n displayInLayerControl: params.displayInLayerControl,\n group: params.group,\n });\n }\n\n set description(description) {\n this.element.description = description;\n }\n\n set label(label) {\n this.element.label = label;\n }\n\n set addstyle(style) {\n this.element.addstyle = style;\n }\n\n set displayInLayerControl(visible) {\n this.setProperties({ displayInLayerControl: visible });\n }\n\n setMap(map) {\n super.setMap(map);\n // TODO update flow\n }\n\n // move a parent class\n setVisible(flag) {\n this._visible = flag;\n this.element.classList.toggle('hide', !flag);\n const map = this.getMap();\n if (map) {\n map.disablePopup = !flag;\n }\n }\n\n getVisible() {\n return this._visible;\n }\n}\n","import {\n i18nMixin,\n responsiveMixin,\n SM,\n ViewPort,\n} from '@kisters/wcp-base/decorators';\nimport { customElement } from 'lit/decorators.js';\nimport { Mix } from '@kisters/wcp-base/common';\nimport _AddOn from './_AddOn';\nimport PopupSwitcher from './PopupSwitcher';\nimport nls from '../../locales/index';\n\n@customElement('ki-popup-control')\nexport default class KiPopupControl extends Mix(\n _AddOn,\n [i18nMixin, { nls }],\n responsiveMixin,\n) {\n static get properties() {\n return {\n addstyle: { type: String },\n // for all addOn controller ?\n };\n }\n\n _create() {\n this.popupSwitcher = new PopupSwitcher({\n name: this.i18n.t('PopupSwitcher'),\n displayInLayerControl: ViewPort.size !== SM,\n group: 'Information',\n addstyle: this.addstyle,\n });\n this.map.addControl(this.popupSwitcher);\n }\n\n _tear() {\n this.map.removeControl(this.popupSwitcher);\n }\n\n updated(_changedProperties) {\n super.updated(_changedProperties);\n if (this.popupSwitcher) {\n this.popupSwitcher.displayInLayerControl = ViewPort.size !== SM;\n }\n if (_changedProperties.has('addstyle') && this.popupSwitcher) {\n this.popupSwitcher.addstyle = this.addstyle;\n }\n if (_changedProperties.has('disabled') && this.popupSwitcher) {\n this.popupSwitcher.disabled = this.disabled;\n }\n }\n}\n","import { css } from 'lit';\n\n// language=CSS\nexport default css`\n :host {\n display: block;\n overflow: hidden;\n }\n\n .hide {\n display: none !important;\n }\n\n ki-layers-control-element {\n position: absolute;\n top: 200px;\n right: 20px;\n bottom: unset;\n }\n\n #map {\n height: 100%;\n width: 100%;\n transform-origin: left;\n }\n\n ki-icon-btn[active] {\n background-color: var(--theme-color-primary, #0056a0);\n fill: white;\n }\n\n ki-icon-btn,\n .icon-btn {\n fill: gray;\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12),\n 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n width: 40px;\n height: 40px;\n text-align: center;\n line-height: 40px;\n border-radius: 40px;\n font-size: 20px;\n cursor: pointer;\n position: absolute;\n box-sizing: border-box;\n }\n\n ki-icon-btn ki-icon,\n .icon-btn ki-icon {\n display: block;\n }\n\n ki-icon-btn:hover,\n .icon-btn:hover {\n fill: #4a4a49;\n }\n\n .download-btn {\n top: 15px;\n right: 20px;\n }\n\n ki-icon-switcher {\n position: absolute;\n display: flex;\n top: 250px;\n flex-direction: column;\n right: 20px;\n }\n\n ki-legend {\n bottom: 20px;\n left: 20px;\n transition: 0.6s all;\n }\n\n .legends-btn {\n top: 15px;\n right: 15px;\n display: none;\n }\n\n .dragbox {\n box-sizing: border-box;\n border-radius: 2px;\n border: 2px solid #1093cd;\n background: rgba(16, 147, 205, 0.4);\n }\n\n :host(.sm-screen) ki-layers-control-element {\n height: auto;\n top: unset;\n right: unset;\n left: 5px;\n bottom: 40px;\n z-index: unset;\n }\n\n :host(.sm-screen) ki-legend {\n display: block;\n top: unset;\n bottom: 90px;\n right: 15px;\n left: unset;\n }\n\n :host(.sm-screen) ki-station-map-zoom-button {\n bottom: 40px;\n top: unset;\n }\n\n :host(.sm-screen) .location-btn {\n top: unset;\n right: 15px;\n bottom: 140px;\n padding: 0;\n }\n\n :host(.sm-screen) #scale-info,\n :host(.sm-screen) .download-btn,\n :host(.sm-screen) ki-icon-switcher,\n :host(.sm-screen) .ol-scale-line,\n :host(.sm-screen) #overview-map {\n display: none;\n }\n\n table.datatable {\n margin: 5px 10px;\n border-collapse: collapse;\n }\n\n .datatable td,\n .datatable th {\n padding: 5px 10px;\n }\n\n select.control {\n border-width: 0;\n background: white;\n border-radius: 5px;\n }\n ki-player {\n position: absolute;\n bottom: 0px;\n left: 20%;\n width: 70%;\n pointer-events: all;\n }\n\n .ol-scale-line {\n bottom: 0;\n left: 0;\n position: relative;\n }\n\n div.ol-scale-line,\n .custom-mouse-position {\n background: transparent;\n display: flex;\n position: relative;\n top: unset;\n left: unset;\n right: unset;\n bottom: unset;\n font-size: 10px;\n }\n\n .custom-mouse-position .info-box {\n align-self: center;\n font-size: 1.3em;\n padding: 0 10px;\n }\n\n .custom-mouse-position select {\n border-width: 0;\n color: rgb(74, 74, 73);\n }\n\n div.ol-scale-line-inner {\n color: #4a4a49;\n border: 1px solid #4a4a49;\n border-top: none;\n }\n\n #scale-info {\n display: flex;\n position: absolute;\n left: unset;\n right: 10px;\n bottom: 5px;\n background: white;\n color: #4a4a49;\n opacity: 0.8;\n padding: 2px;\n }\n\n div.ol-attribution.ol-uncollapsible {\n bottom: 5px;\n right: 50%;\n transform: translateX(50%);\n color: rgb(74, 74, 73);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .ol-attribution ul li {\n padding: 0 5px;\n color: rgb(74, 74, 73);\n }\n\n .ol-attribution a {\n text-decoration: revert !important;\n color: revert !important;\n }\n\n #overview-map {\n position: absolute;\n right: 15px;\n bottom: 40px;\n width: 180px;\n height: 150px;\n background-color: rgba(255, 255, 255, 1);\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12),\n 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n }\n\n .ol-popup.default {\n position: fixed !important;\n z-index: 10;\n }\n\n .ol-popup.default div {\n border: none;\n max-height: 90%;\n overflow: auto;\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12),\n 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n padding: 0;\n }\n\n .ol-popup.default .anchor {\n color: rgba(0, 0, 0, 0.14);\n }\n\n .tooltip-content {\n white-space: nowrap;\n }\n\n .ol-overlaycontainer-stopevent {\n z-index: unset !important;\n }\n\n .time-control-btn {\n position: absolute;\n bottom: 75px;\n right: 20px;\n z-index: 10;\n top: unset;\n pointer-events: all;\n }\n`;\n","import { html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { Mix } from '@kisters/wcp-base/common';\n\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport nls from '../../locales/index';\nimport style from './ki-station-map.css?inline';\n\n@customElement('ki-station-download-button')\nexport default class KiStationDownloadButton extends Mix(LitElement, [\n i18nMixin,\n { nls },\n]) {\n // language=CSS\n static styles = style;\n\n static get properties() {\n return {\n selectedStations: { type: Array },\n };\n }\n\n render() {\n // language=html\n return html`\n \n `;\n }\n\n downloadStations() {\n this.dispatchEvent(\n new CustomEvent('downloadstationsmd', {\n bubbles: true,\n }),\n );\n }\n}\n","import Control from 'ol/control/Control';\nimport './ki-station-download-button';\n/*\n * station download layers.\n * */\nexport default class StationDownloadLayer extends Control {\n constructor(options = {}) {\n options = { visible: true, ...options };\n options.element = document.createElement('ki-station-download-button');\n options.element.selectedStations = options.selectedStations;\n super(options);\n this.label = options.label;\n this.setVisible(options.visible);\n this.setProperties({\n name: options.name,\n displayInLayerControl: options.displayInLayerControl,\n group: options.group,\n });\n }\n\n set label(label) {\n this.element.label = label;\n }\n\n set options(options) {\n this.element.options = options;\n }\n\n setMap(map) {\n super.setMap(map);\n }\n\n // move a parent class\n setVisible(flag) {\n this._visible = flag;\n this.element.classList.toggle('hide', !flag);\n }\n\n getVisible() {\n return this._visible;\n }\n}\n","import { customElement } from 'lit/decorators.js';\nimport _AddOn from './_AddOn';\nimport StationDownloadLayer from './StationDownloadLayer';\n\n@customElement('ki-station-download-control')\nexport default class KiStationDownloadControl extends _AddOn {\n static get properties() {\n return {\n label: { type: String },\n selectedStations: { type: Array },\n };\n }\n\n _create() {\n this.stationDownloadLayer = new StationDownloadLayer({\n name: 'Station download',\n displayInLayerControl: false,\n group: 'Information',\n label: this.label,\n selectedStations: this.selectedStations,\n });\n this.map.addControl(this.stationDownloadLayer);\n this.stationDownloadLayer.element.addEventListener(\n 'downloadstationsmd',\n () => {\n this.dispatchEvent(\n new CustomEvent('downloadstationsmd', {\n bubbles: true,\n }),\n );\n },\n );\n }\n\n _tear() {\n this.map.removeControl(this.stationDownloadLayer);\n }\n\n updated(_changedProperties) {\n super.updated(_changedProperties);\n // // TODO how to update.\n if (_changedProperties.size > 0 && this.map) {\n this._tear();\n this._create();\n }\n }\n}\n","import { getCurrentLang } from '../decorators/i18n';\n\ninterface SymbolOptions {\n decimalSymbol: String;\n thousandSymbol: String;\n}\n\nconst formatterMap = new Map();\n\nconst vanillaMap = new Map();\n\nconst customSymbols = {\n decimalSymbol: '.',\n thousandSymbol: ',',\n};\n\nconst decimalPlaceholder = '#';\n\nlet enforceCustomSymbols = false;\n\nconst injectThousandSymbol = (\n formatted: String,\n vanillaSymbol: String | undefined,\n customSymbol: String,\n decimalSymbol: String,\n) => {\n if (vanillaSymbol !== undefined) {\n return formatted.replaceAll(vanillaSymbol, customSymbol);\n }\n const split = formatted.split(decimalSymbol);\n let formatTemp = split.length() > 1 ? `${decimalSymbol}${split[1]}` : '';\n\n const integerFormat = split[0];\n const { length } = integerFormat;\n\n // eslint-disable-next-line no-plusplus\n for (let i = length - 1; i >= 0; i--) {\n formatTemp = `${(length - i) % 3 === 0 ? customSymbol : ''}${\n integerFormat[i]\n }${formatTemp}`;\n }\n\n return formatTemp;\n};\n\nconst getVanillaFormat = (locale: String): SymbolOptions => {\n if (vanillaMap.has(locale)) {\n return vanillaMap.get(locale);\n }\n const numberWithSeperators = 1000.5;\n const vanillaFormat = new Intl.NumberFormat(locale).format(\n numberWithSeperators,\n );\n const { length } = vanillaFormat;\n\n const vanillaDecimalSymbol = vanillaFormat.substring(length - 2, length - 1);\n\n const vanillaThousandSymbol = vanillaFormat.substring(1, 2);\n\n const vanillaSymbols = {\n decimalSymbol: vanillaDecimalSymbol,\n thousandSymbol:\n vanillaThousandSymbol !== '0' ? vanillaThousandSymbol : undefined,\n };\n\n vanillaMap.set(locale, vanillaSymbols);\n\n return vanillaSymbols;\n};\n\nconst getKey = (language: string, options: Intl.NumberFormatOptions): string =>\n `${language}${options.compactDisplay}${options.currency}${options.currencyDisplay}${options.currencySign}${options.localeMatcher}${options.maximumFractionDigits}${options.minimumFractionDigits}${options.maximumSignificantDigits}${options.minimumIntegerDigits}${options.minimumSignificantDigits}${options.notation}${options.signDisplay}${options.style}${options.unit}${options.unitDisplay}${options.useGrouping}`;\n\nexport const setCustomSymbols = (options: {\n decimalSymbol: String | undefined;\n thousandSymbol: String | undefined;\n}) => {\n if (options.decimalSymbol !== undefined) {\n customSymbols.decimalSymbol = options.decimalSymbol;\n enforceCustomSymbols = true;\n }\n if (options.thousandSymbol !== undefined) {\n customSymbols.thousandSymbol = options.thousandSymbol;\n enforceCustomSymbols = true;\n }\n};\n\nexport const formatNumberForLocale = (\n number: number | null | undefined | string,\n locale: string,\n options: Intl.NumberFormatOptions | undefined = undefined,\n): string => {\n if (\n number === undefined ||\n number === null ||\n number === '' ||\n Number.isNaN(number)\n ) {\n return '';\n }\n const key = getKey(locale, options ?? {});\n let formatter: Intl.NumberFormat;\n if (formatterMap.has(key)) {\n formatter = formatterMap.get(key)!;\n } else {\n formatter = new Intl.NumberFormat(locale, options);\n formatterMap.set(key, formatter);\n }\n\n let formatted = formatter.format(number);\n\n if (enforceCustomSymbols) {\n const vanillaSymbols = getVanillaFormat(locale);\n\n formatted = formatted.replace(\n vanillaSymbols.decimalSymbol,\n decimalPlaceholder,\n );\n\n formatted = injectThousandSymbol(\n formatted,\n vanillaSymbols.thousandSymbol,\n customSymbols.thousandSymbol,\n decimalPlaceholder,\n );\n\n formatted = formatted.replace(\n decimalPlaceholder,\n customSymbols.decimalSymbol,\n );\n }\n\n return formatted;\n};\n\nexport const formatNumber = (\n number: number | null | undefined | string,\n options: Intl.NumberFormatOptions,\n): string => formatNumberForLocale(number, getCurrentLang(), options);\n","import { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { Mix } from '@kisters/wcp-base/common';\n\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport { formatNumber } from '@kisters/wcp-base/common/NumberFormatter';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport nls from '../../locales/index';\nimport { ExternalStation } from '../../common';\n\n@customElement('ki-station-info')\nexport default class KiStationInfo extends Mix(LitElement, [\n i18nMixin,\n { nls },\n]) {\n static styles = css`\n :host {\n display: block;\n }\n .station-name {\n padding-right: 5px;\n padding-left: 10px;\n padding-top: 10px;\n font-size: 1.2em;\n }\n\n hr {\n margin: 5px 0;\n }\n .table {\n display: table;\n line-height: 1.5em;\n }\n .row {\n display: table-row;\n }\n .cell {\n display: table-cell;\n padding: 0 10px;\n min-width: 50px;\n color: gray;\n }\n .label {\n color: #4a4a49;\n }\n `;\n\n static get properties() {\n return {\n stations: { type: Array }, // can be one or more stations\n };\n }\n\n constructor() {\n super();\n this.stations = [];\n this.valFormatter = {\n format(val) {\n return val === 0\n ? val\n : formatNumber(val, {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n },\n };\n }\n\n /* eslint-disable-next-line class-methods-use-this */\n _stationExternal(station: ExternalStation) {\n return html`
\n ${station.station_no} | ${station.station_name} | ${station.river_name}\n
\n
\n
\n
\n
${unsafeHTML(station.description)}
\n
\n
`;\n }\n\n _stationTmpl(station) {\n const parameter =\n station.stationparameter_longname || station.stationparameter_name;\n return html`
\n ${station.station_no} | ${station.station_name} | ${station.river_name}\n
\n
\n
\n
\n
${this.i18n.t(parameter)}
\n
\n ${station.ts_value != null\n ? `${this.valFormatter.format(station.ts_value)} ${\n station.ts_unitsymbol\n }`\n : '-'}\n
\n
\n
\n
${this.i18n.t('last_measure')}
\n
\n ${(station.timestamp &&\n dayjs(station.timestamp).tz().format('L LT')) ||\n '-'}\n
\n
\n
`;\n }\n\n render() {\n return html`${this.stations.map(station =>\n station.external\n ? this._stationExternal(station)\n : this._stationTmpl(station),\n )}`;\n }\n}\n","export default function f(claz) {\n return class extends claz {\n constructor(args) {\n super(args);\n this._visible = true;\n this.setProperties({\n name: args.name,\n group: args.group,\n displayInLayerControl: args.displayInLayerControl,\n });\n\n this.__element = args.__element || this.element;\n }\n\n setVisible(flag) {\n this._visible = flag;\n this.__element.classList.toggle('hide', !flag);\n }\n\n getVisible() {\n return this._visible;\n }\n };\n}\n","import Control from 'ol/control/Control';\nimport { SM, ViewPort } from '@kisters/wcp-base/decorators';\nimport Overview from 'ol-ext/control/Overview';\nimport Style from 'ol/style/Style';\nimport Stroke from 'ol/style/Stroke';\nimport Fill from 'ol/style/Fill';\nimport { inAndOut } from 'ol/easing';\nimport Circle from 'ol/style/Circle';\nimport VisibleMixin from './VisibleMixin';\nimport { getLayer } from '../../common/ki-ol-layer-generator';\n/*\n * map overview layers.\n * */\nexport default class stationMapOverviewLayer extends Control {\n constructor(options = {}) {\n options = { visible: true, ...options };\n const se = options.map.getOverlayContainerStopEvent();\n const div = se.ownerDocument.createElement('div');\n options.element = div;\n div.id = 'overview-map';\n div.part = 'overview-map';\n ViewPort.size !== SM && se.appendChild(div);\n\n const _ovmap = new (VisibleMixin(Overview))({\n name: 'Overview',\n group: 'Information',\n displayInLayerControl: options.displayInLayerControl,\n layers: options.layerOptions.layer.map(layer => getLayer(layer)),\n panAnimation: inAndOut,\n maxZoom: options.layerOptions.maxZoom,\n minZoom: options.layerOptions.minZoom,\n projection: options.layerOptions.projection,\n target: div,\n __element: div,\n style: [\n new Style({\n image: new Circle({\n fill: new Fill({\n color: 'rgba(105,105,105,0.8)',\n }),\n stroke: new Stroke({\n width: 7,\n color: 'rgba(105,105,105,0.8)',\n }),\n radius: 5,\n }),\n stroke: new Stroke({\n width: 1,\n color: 'rgba(16,147,205,1)',\n }),\n }),\n ],\n });\n if (options.layerOptions.attributions) {\n const attrs = se.ownerDocument.createElement('div');\n attrs.innerHTML = options.layerOptions.attributions;\n attrs.style.fontSize = '0.8em';\n attrs.style.marginTop = '-2px';\n options.element.appendChild(attrs);\n }\n options.map.addControl(_ovmap);\n super(options);\n this.label = options.label;\n this._ovmap = _ovmap;\n this.setVisible(options.visible);\n this.setProperties({\n name: options.name,\n displayInLayerControl: options.displayInLayerControl,\n group: options.group,\n });\n }\n\n set label(label) {\n this.element.label = label;\n }\n\n set options(options) {\n this.element.options = options;\n }\n\n setMap(map) {\n super.setMap(map);\n }\n\n // move a parent class\n setVisible(flag) {\n this._visible = flag;\n this.element.classList.toggle('hide', !flag);\n }\n\n getVisible() {\n return this._visible;\n }\n}\n","import { customElement } from 'lit/decorators.js';\nimport _AddOn from './_AddOn';\nimport StationMapOverviewLayer from './StationMapOverviewLayer';\n\n@customElement('ki-station-map-overview-control')\nexport default class KiStationMapOverviewControl extends _AddOn {\n constructor() {\n super();\n this.displayInLayerControl = false;\n }\n\n static get properties() {\n return {\n label: { type: String },\n layerOptions: { type: Object },\n displayInLayerControl: { type: Boolean },\n };\n }\n\n _create() {\n if (this.layerOptions && this.layerOptions.layer.length) {\n this.stationMapOverviewLayer = new StationMapOverviewLayer({\n layerOptions: this.layerOptions,\n name: 'Map overview',\n displayInLayerControl: this.displayInLayerControl,\n group: 'Information',\n label: this.label,\n selectedStations: this.selectedStations,\n map: this.map,\n });\n this.map.addControl(this.stationMapOverviewLayer);\n }\n }\n\n _tear() {\n this.map.removeControl(this.stationMapOverviewLayer);\n }\n\n updated(_changedProperties) {\n super.updated(_changedProperties);\n // // TODO how to update.\n if (_changedProperties.size > 0 && this.map) {\n this._tear();\n this._create();\n }\n }\n}\n","import proj4 from 'proj4';\nimport { register } from 'ol/proj/proj4';\n\nconst projections = [\n [\n 'EPSG:31370',\n '+title=Lambert 72 +proj=lcc +lat_1=51.16666723333333 +lat_2=49.8333339 +lat_0=90 +lon_0=4.367486666666666 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +towgs84=-106.869,52.2978,-103.724,0.3366,-0.457,1.8422,-1.2747 +units=m +no_defs',\n ],\n [\n 'EPSG:3812',\n '+title=Lambert 2008 +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=50.797815 +lon_0=4.359215833333333 +x_0=649328 +y_0=665262 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs',\n ],\n [\n 'EPSG:31258',\n '+proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=450000 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m +no_defs',\n ],\n [\n 'EPSG:25832',\n '+title=ETRS89/ UTM 32N +proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs',\n ],\n];\nproj4.defs(projections);\nregister(proj4);\n\nexport default proj4;\n","import MousePosition from 'ol/control/MousePosition';\nimport { format } from 'ol/coordinate';\nimport proj4 from '../../common/projections';\n\nexport default class MultiMousePosition extends MousePosition {\n constructor(options) {\n super(options);\n const self = this;\n this.info = document.createElement('div');\n this.info.className = 'info-box';\n const select = document.createElement('select');\n this.projections = options.projections || ['EPSG:4326'];\n this.projections = options.projections.filter(item => !!proj4(item));\n this.projections.forEach(item =>\n select.appendChild(new Option(proj4(item).oProj.title || item, item)),\n );\n if (this.projections.length < 2) {\n select.style.appearance = 'none';\n }\n [this.currentProj] = this.projections;\n this.element.appendChild(select);\n this.element.appendChild(this.info);\n this.formatter = options.formatter || {\n default: { template: 'x: {x} / y: {y}', decimals: 0 },\n 'EPSG:4326': { template: 'long: {x} / lat: {y}', decimals: 4 },\n };\n select.addEventListener('change', e => {\n self.currentProj = e.target.value;\n });\n }\n\n /* eslint-disable-next-line class-methods-use-this */\n handleMouseOut = function () {};\n\n updateHTML_ = function (pixel) {\n let html = this.undefinedHTML_;\n if (pixel && this.mapProjection_) {\n const map = this.getMap();\n let coordinate = map.getCoordinateFromPixelInternal(pixel);\n if (coordinate) {\n coordinate = proj4(\n this.mapProjection_.getCode(),\n this.currentProj,\n coordinate,\n );\n const template =\n this.formatter[this.currentProj]?.template ||\n this.formatter.default?.template;\n const decimals =\n this.formatter[this.currentProj]?.decimals ||\n this.formatter.default?.decimals;\n if (template) {\n html = format(coordinate, template, decimals);\n this.info.innerHTML = html;\n }\n }\n }\n };\n}\n","import Control from 'ol/control/Control';\nimport ScaleLine from 'ol/control/ScaleLine';\nimport VisibleMixin from './VisibleMixin';\nimport MultiMousePosition from './MultiMousePosition';\n\n/*\n * station may position and scale layers.\n * */\nexport default class MapPositionScaleLayer extends Control {\n constructor(options = {}) {\n options = { visible: true, ...options };\n options.element = document.createElement('div');\n options.element.setAttribute('id', 'scale-info');\n\n options.map.addControl(\n new (VisibleMixin(MultiMousePosition))({\n projection: 'EPSG:4326',\n className: 'custom-mouse-position',\n target: options.element,\n projections: options.projections,\n name: 'Coordinate',\n group: 'Information',\n displayInLayerControl: options.displayInLayerControl, // hide in mobile\n }),\n );\n\n options.map.addControl(\n new (VisibleMixin(ScaleLine))({\n units: 'metric',\n target: options.element,\n name: 'scale_info',\n group: 'Information',\n displayInLayerControl: options.displayInLayerControl, // hide in mobile\n }),\n );\n\n super(options);\n this.label = options.label;\n this.setVisible(options.visible);\n this.setProperties({\n name: options.name,\n displayInLayerControl: options.displayInLayerControl,\n group: options.group,\n });\n }\n\n set label(label) {\n this.element.label = label;\n }\n\n set options(options) {\n this.element.options = options;\n }\n\n setMap(map) {\n super.setMap(map);\n }\n\n // move a parent class\n setVisible(flag) {\n this._visible = flag;\n this.element.classList.toggle('hide', !flag);\n }\n\n getVisible() {\n return this._visible;\n }\n}\n","import { customElement } from 'lit/decorators.js';\nimport _AddOn from './_AddOn';\nimport MapPositionScaleLayer from './MapPositionScaleLayer';\n\n@customElement('ki-station-map-position-scale-control')\nexport default class kiStationMapPositionScaleControl extends _AddOn {\n constructor() {\n super();\n this.displayInLayerControl = false;\n }\n\n static get properties() {\n return {\n label: { type: String },\n displayInLayerControl: { type: Boolean },\n };\n }\n\n _create() {\n if (this.projections) {\n this.mapPositionScaleLayer = new MapPositionScaleLayer({\n name: 'Station position',\n displayInLayerControl: this.displayInLayerControl,\n group: 'Information',\n label: this.label,\n projections: this.projections,\n selectedStations: this.selectedStations,\n map: this.map,\n });\n this.map.addControl(this.mapPositionScaleLayer);\n }\n }\n\n _tear() {\n this.map.removeControl(this.mapPositionScaleLayer);\n }\n\n updated(_changedProperties) {\n super.updated(_changedProperties);\n // // TODO how to update.\n if (_changedProperties.size > 0 && this.map) {\n this._tear();\n this._create();\n }\n }\n}\n","import Control from 'ol/control/Control';\nimport '@kisters/wcp-base/components';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\n/*\n * map zoom in and zoom out layers.\n * */\nexport default class RasterControl extends Control {\n constructor(options = {}) {\n options = { visible: true, ...options };\n const div = document.createElement('ki-player');\n const start = dayjs().tz().subtract(24, 'hours').startOf('hour');\n div.labelFormatter = val =>\n `${dayjs(start).tz().add(val, 'hour').format('L LT')}`;\n options.element = div;\n options.element.map = options.map;\n super(options);\n this.label = options.label;\n this.style = options.style;\n this.setVisible(options.visible);\n this.setProperties({\n name: options.name,\n displayInLayerControl: options.displayInLayerControl,\n group: options.group,\n });\n }\n\n set label(label) {\n this.element.label = label;\n }\n\n set options(options) {\n this.element.options = options;\n }\n\n set style(style) {\n this.element.style = style;\n }\n\n setMap(map) {\n super.setMap(map);\n }\n\n // move a parent class\n setVisible(flag) {\n this._visible = flag;\n this.element.classList.toggle('hide', !flag);\n }\n\n getVisible() {\n return this._visible;\n }\n}\n","import { customElement } from 'lit/decorators.js';\nimport _AddOn from './_AddOn';\nimport RasterControl from './RasterControl';\n\n@customElement('ki-station-map-raster-control')\nexport default class kiStationMapRasterControl extends _AddOn {\n constructor() {\n super();\n this.displayInLayerControl = false;\n }\n\n static get properties() {\n return {\n label: { type: String },\n displayInLayerControl: { type: Boolean },\n };\n }\n\n _create() {\n this.rc = new RasterControl({\n name: 'Raster Control',\n displayInLayerControl: this.displayInLayerControl,\n group: 'Information',\n label: this.label,\n projections: this.projections,\n map: this.map,\n });\n this.map.addControl(this.rc);\n }\n\n _tear() {\n this.map.removeControl(this.rc);\n }\n\n updated(_changedProperties) {\n super.updated(_changedProperties);\n // // TODO how to update.\n if (_changedProperties.size > 0 && this.map) {\n this._tear();\n this._create();\n }\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { Mix } from '@kisters/wcp-base/common';\n\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport nls from '../../locales/index';\n\n@customElement('ki-station-map-zoom-button')\nexport default class KiStationMapZoomButton extends Mix(LitElement, [\n i18nMixin,\n { nls },\n]) {\n static styles = [\n css`\n :host {\n position: absolute;\n top: 70px;\n right: 20px;\n pointer-events: all;\n }\n\n .zoom-btns {\n fill: var(--theme-text-color-tertiary, gray);\n background: var(--theme-color-tertiary, white);\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n width: 40px;\n text-align: center;\n line-height: 40px;\n border-radius: 40px;\n font-size: 20px;\n cursor: pointer;\n overflow: hidden;\n }\n\n .zoom-btns .btn:hover ki-icon::part(icon) {\n fill: #4a4a49;\n }\n `,\n ];\n\n static get properties() {\n return {\n map: { Object },\n };\n }\n\n render() {\n // language=html\n return html`\n
\n \n \n
\n \n \n \n \n \n \n \n `;\n }\n\n zoomIn() {\n this.map.getView().animate({\n zoom: this.map.getView().getZoom() + 1,\n duration: 500,\n });\n }\n\n zoomToHome() {\n this.map.getView().fit(this.homeExtent, { duration: 500 });\n }\n\n zoomOut() {\n this.map.getView().animate({\n zoom: this.map.getView().getZoom() - 1,\n duration: 500,\n });\n }\n}\n","import Control from 'ol/control/Control';\n/*\n * map zoom in and zoom out layers.\n * */\nexport default class StationMapControl extends Control {\n constructor(options = {}) {\n options = { visible: true, ...options };\n options.element.map = options.map;\n super(options);\n this.label = options.label;\n this.style = options.style;\n this.setVisible(options.visible);\n this.setProperties({\n name: options.name,\n displayInLayerControl: options.displayInLayerControl,\n group: options.group,\n });\n }\n\n set label(label) {\n this.element.label = label;\n }\n\n set options(options) {\n this.element.options = options;\n }\n\n set style(style) {\n this.element.style = style;\n }\n\n setMap(map) {\n super.setMap(map);\n }\n\n // move a parent class\n setVisible(flag) {\n this._visible = flag;\n this.element.classList.toggle('hide', !flag);\n }\n\n getVisible() {\n return this._visible;\n }\n}\n","import { i18nMixin } from '@kisters/wcp-base/decorators';\nimport { customElement } from 'lit/decorators.js';\nimport { Mix } from '@kisters/wcp-base/common';\nimport _AddOn from './_AddOn';\nimport StationMapControl from './StationMapControl';\nimport nls from '../../locales/index';\nimport './ki-station-map-zoom-button';\n\n@customElement('ki-station-map-zoom-control')\nexport default class KiStationMapZoomControl extends Mix(_AddOn, [\n i18nMixin,\n { nls },\n]) {\n static get properties() {\n return {\n label: { type: String },\n style: { type: String },\n homeExtent: { type: Array },\n };\n }\n\n _create() {\n const element = document.createElement('ki-station-map-zoom-button');\n element.homeExtent = this.homeExtent;\n this.stationMapZoomControl = new StationMapControl({\n element,\n homeExtent: this.homeExtent,\n name: 'Zoom',\n displayInLayerControl: false,\n group: 'Information',\n label: this.label,\n map: this.map,\n style: this.style,\n });\n this.map.addControl(this.stationMapZoomControl);\n }\n\n _tear() {\n this.map.removeControl(this.stationMapZoomControl);\n }\n\n updated(_changedProperties) {\n super.updated(_changedProperties);\n // // TODO how to update.\n if (_changedProperties.size > 0 && this.map) {\n this._tear();\n this._create();\n }\n }\n}\n","import { LitElement, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { getLayer } from '../../common/ki-ol-layer-generator';\n\n@customElement('ki-ol-layer')\nexport default class KiOlLayer extends LitElement {\n @property()\n type?: string;\n\n @property()\n url?: string;\n\n @property()\n label?: string;\n\n @property({ type: Boolean })\n visible = false;\n\n render() {\n return html``;\n }\n\n getOlLayer() {\n return getLayer({\n type: this.type,\n label: this.label,\n visible: this.visible,\n });\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport popupStyle from 'ol-ext/overlay/Popup.css?inline';\nimport {\n getQueryObject,\n i18nMixin,\n responsiveMixin,\n ViewPort,\n SM,\n} from '@kisters/wcp-base/decorators';\nimport { fromLonLat } from 'ol/proj';\nimport { html, LitElement, unsafeCSS } from 'lit';\nimport { customElement, property, queryAssignedNodes } from 'lit/decorators.js';\nimport { Map, View } from 'ol';\nimport { inAndOut } from 'ol/easing';\nimport {\n Mix,\n LoaderMixin,\n setWithExpiry,\n getWithExpiry,\n} from '@kisters/wcp-base/common';\nimport { flatten, debounce } from 'lodash-es';\nimport olcss from 'ol/ol.css?inline';\nimport ovStyle from 'ol-ext/control/Overview.css?inline';\nimport Popup from 'ol-ext/overlay/Popup';\nimport { Attribution, defaults as defaultControls } from 'ol/control';\nimport { getLayer } from '../../common/ki-ol-layer-generator';\nimport style from './ki-station-map.css?inline';\nimport './ki-ol-layer';\nimport nls from '../../locales/index';\n\nexport interface OLStyle {\n background: String;\n icon: String;\n fontSize: Number;\n radius: Number;\n color: String;\n border: Object;\n}\nexport interface OLLayer {\n type: 'topojson' | 'GeoJSON' | 'osm' | 'layergroup' | 'xyz';\n url: string;\n label: string;\n group: string;\n visible: Boolean;\n opacity: Number;\n projection: string;\n zIndex: Number;\n selectable: Boolean;\n viewFilter: Array;\n maxZoom: Number;\n minZoom: Number;\n getOlLayer: Function;\n}\n\nexport interface VectorOLLayer extends OLLayer {\n style: OLStyle;\n hoverStyle: OLStyle;\n textStyle: Object;\n labelProperty: string;\n}\n\n@customElement('ki-station-map')\nexport default class KiStationMap extends Mix(\n LitElement,\n [i18nMixin, { nls }],\n responsiveMixin,\n LoaderMixin,\n) {\n static styles = [\n style,\n unsafeCSS(olcss),\n unsafeCSS(popupStyle),\n unsafeCSS(ovStyle),\n ];\n\n @property({ type: String })\n cachePrefix = 'none';\n\n @property({ type: Object })\n view = {\n projection: 'EPSG:3857',\n center: [0, 0],\n zoom: 2,\n };\n\n @property({ type: Array })\n olLayers = [];\n\n @property({ type: Array })\n layers = [{ type: 'osm', visible: true, label: 'Openstreetmap' }];\n\n @property({ type: Boolean })\n disableMouseOver = false;\n\n @property({ type: Boolean })\n hideAttributions = false;\n\n @property({ type: Number })\n persistancetimeout = 3600;\n\n @queryAssignedNodes({ slot: 'layer', flatten: true })\n layerElements!: Array;\n\n olLayerList: any = [];\n\n firstUpdated() {\n this._createMap();\n }\n\n get _view() {\n return new View(this.view);\n }\n\n get _layers() {\n return this.layerElements\n .map(layer => layer.getOlLayer())\n .concat(this.layers.map(layer => getLayer(layer)));\n }\n\n get __mapElement() {\n return getQueryObject(this, '#map');\n }\n\n get __infoElement() {\n return getQueryObject(this, '#scale-info');\n }\n\n _createMap() {\n this.map = new Map({\n target: this.__mapElement,\n view: this._view,\n controls: this.hideAttributions\n ? []\n : defaultControls({ zoom: false, attribution: false }).extend([\n new Attribution({\n collapsible: false,\n }),\n ]),\n });\n\n const readyEvent = new CustomEvent('kistationmapready');\n\n // this.map.once('rendercomplete', () => {\n this.dispatchEvent(readyEvent);\n this.setMapEvents();\n // });\n\n this.map.on('precompose', evt => {\n if (evt.context) {\n evt.context.imageSmoothingEnabled = false;\n evt.context.webkitImageSmoothingEnabled = false;\n evt.context.mozImageSmoothingEnabled = false;\n evt.context.msImageSmoothingEnabled = false;\n }\n });\n this.map.once('postrender', () => {\n this.retry = setInterval(() => {\n if (!this.map.isRendered()) {\n this.resize();\n } else {\n clearInterval(this.retry);\n }\n }, 1000);\n });\n\n // This can't be done with once because if the map size is 0,0 then it will zoom to an incredibly close extent.\n // If the first postrender happens while the map is not displayed then the size will be 0,0.\n const loadCacheZoom = () => {\n const size = this.map.getSize();\n // wait until the map is ready\n if (size && size.length > 1 && size[0] !== 0 && size[1] !== 0) {\n this.initExtent();\n // remove the event because it should only happen once at the start\n this.map.un('postrender', loadCacheZoom);\n }\n };\n if (this.persistancetimeout) {\n this.map.on('postrender', loadCacheZoom);\n }\n }\n\n initExtent() {\n const extent = this.persistancetimeout\n ? getWithExpiry(`${this.cachePrefix}-ki-station-map-zoom`, true)\n : null;\n if (extent) {\n this.map.getView().fit(extent, this.map.getSize());\n }\n }\n\n setMapEvents() {\n this._initPopup();\n\n const popupelement = document.createElement('div');\n popupelement.style.padding = '10px';\n let selected = null;\n let tooltip = null;\n\n this.map.on('moveend', evt => {\n const { map } = evt;\n const extent = map.getView().calculateExtent(map.getSize());\n this.dispatchEvent(\n new CustomEvent('extentchange', {\n bubbles: true,\n composed: true,\n detail: {\n extent,\n },\n }),\n );\n if (this.persistancetimeout) {\n setWithExpiry(\n `${this.cachePrefix}-ki-station-map-zoom`,\n extent,\n this.persistancetimeout,\n true,\n );\n }\n });\n\n this.map.on('singleclick', evt => {\n this.map.forEachFeatureAtPixel(\n evt.pixel,\n feature => {\n if (feature.get('url')) {\n window.open(feature.get('url'), '_blank');\n return true;\n }\n return false;\n },\n { layerFilter: layer => layer.get('haslinks') },\n );\n });\n /* eslint-disable-next-line consistent-return */\n this.map.on('pointermove', evt => {\n this.map.getTargetElement().style.cursor = '';\n if (this.disableMouseOver) {\n if (tooltip !== null) {\n this._popup.hide();\n tooltip = null;\n }\n return false;\n }\n if (selected !== null) {\n selected.setStyle(selected._style);\n selected = null;\n }\n if (tooltip !== null) {\n this._popup.hide();\n tooltip = null;\n }\n this.map.forEachFeatureAtPixel(\n evt.pixel,\n feature => {\n if (feature.get('url')) {\n this.map.getTargetElement().style.cursor = 'pointer';\n }\n\n if (feature._toolTip && !this._popup.getVisible()) {\n popupelement.innerHTML = feature._toolTip;\n this._popup.show(\n this.map.getCoordinateFromPixel(evt.pixel),\n popupelement,\n );\n tooltip = true;\n }\n if (feature._hoverStyle) {\n selected = feature;\n feature.setStyle(feature._hoverStyle);\n return true;\n }\n return false;\n },\n {\n layerFilter: layer =>\n layer.get('haslinks') || layer.get('interactive'),\n },\n );\n });\n }\n\n disconnectedCallback() {\n if (super.disconnectedCallback) super.disconnectedCallback();\n this.retry && clearInterval(this.retry);\n }\n\n updated(changedProperties) {\n super.update(changedProperties);\n if (this.map) {\n if (changedProperties.has('view')) {\n this.map.setView(this._view);\n }\n\n if (changedProperties.has('layers')) {\n this.map\n .getLayers()\n .extend(flatten(this._layers).concat(this.olLayers));\n }\n }\n }\n\n render() {\n // language=html\n this.disableMouseOver = this.classList.contains('sm-screen');\n return html`\n \n
\n ${this._renderLoader()}\n `;\n }\n\n gotoLocation() {\n // TODO timeout\n // need https\n const p = new Promise((resolve, reject) => {\n navigator.geolocation.getCurrentPosition(\n pos => {\n this.map.getView().animate({\n center: fromLonLat(\n [pos.coords.longitude, pos.coords.latitude],\n this.map.getView().getProjection(),\n ),\n duration: 500,\n });\n resolve();\n },\n e => {\n console.error(e);\n reject(e);\n },\n {\n timeout: 2000,\n },\n );\n });\n // TODO\n this.promiseLoader(p);\n }\n\n resize() {\n if (this.map) {\n this.__mapElement.style.width = 'auto';\n this.__mapElement.style.transform = '';\n this.map.updateSize();\n }\n }\n\n getView() {\n return this.map.getView();\n }\n\n zoomTo(extent, duration = 0, padding = 100) {\n this.map.getView().fit(extent, {\n nearest: true,\n easing: inAndOut,\n padding:\n ViewPort.size === SM && padding\n ? [20, 20, 20, 20]\n : [padding, padding, padding, padding],\n size: this.map.getSize(),\n duration,\n });\n }\n\n // move to ki-map-popup\n _initPopup() {\n const popup = new Popup({\n positioning: 'top-right',\n closeBox: false,\n });\n this._popup = popup;\n this.map.addOverlay(popup);\n\n const showPopup = e => {\n if (!this.map.disablePopup) {\n const { coordinate, element, stations, layerAlias } = e.detail;\n if (popup.getVisible() && !popup.element.stations) {\n popup.hide();\n }\n const p = this.map.getPixelFromCoordinate(coordinate);\n const s = this.map.getSize();\n const horizontal = p[0] > s[0] / 2 ? 'right' : 'left';\n const vertical = p[1] > s[1] / 2 ? 'bottom' : 'top';\n\n popup.setPositioning(`${vertical}-${horizontal}`);\n element.stations = stations;\n element.layerAlias = layerAlias;\n popup.show(coordinate, element);\n }\n };\n\n const closePopup = e => {\n const { element } = e.detail;\n element.stations = null;\n popup.hide();\n };\n\n this.map.on('show-popup', debounce(showPopup, 100));\n this.map.on('close-popup', debounce(closePopup, 100));\n // show pointer\n }\n}\n","import { Text, Fill, Stroke, Style, Circle as CircleStyle } from 'ol/style';\nimport { template, contrastColor } from '@kisters/wcp-base/common';\nimport StationsLayer from './StationsLayer';\nimport { FontIcon } from './FontIcon';\n\nlet currentStationStyle;\n\nconst defaultMarkerStyle = new Style({\n image: new CircleStyle({\n radius: 6,\n fill: new Fill({\n color: '#0052cc',\n }),\n stroke: new Stroke({\n color: 'white',\n width: 2,\n }),\n }),\n});\n\nexport default class StationsMarkerLayer extends StationsLayer {\n set currentStation(val) {\n this.__currentStation = val;\n // this.reload();\n }\n\n _getStationStyle(station, selected = false) {\n const dynamicMarkerSize = this.get('dynamicMarkerSize');\n currentStationStyle =\n currentStationStyle ||\n new Style({\n image: new FontIcon({\n backgroundColor: 'rgba(0,0,0,0)',\n color: 'red',\n icon: 'ki ki-map-marker',\n }),\n zIndex: 100,\n });\n\n const info = this._getStationInfos(station);\n if (\n this.__currentStation &&\n info.no === this._getStationInfos(this.__currentStation).no\n ) {\n return currentStationStyle;\n }\n\n const iconStyle =\n (this.tagMarkers && this.tagMarkers[station.__tag]) ||\n (this.tagMarkers && this.tagMarkers._default) ||\n defaultMarkerStyle;\n // iconStyle.setZIndex(this.getZIndex()+iconStyle.getZIndex())\n if (dynamicMarkerSize) {\n return (feature, resolution) => {\n iconStyle\n .getImage()\n .setScale(\n resolution > dynamicMarkerSize.maxResolution\n ? dynamicMarkerSize.size\n : 1,\n );\n return iconStyle;\n };\n }\n const image = iconStyle.getImage();\n if (image.getGlyph) {\n const glyph = image.getGlyph();\n if (glyph.iconTemplate) {\n let valueToDisplay = template(glyph.iconTemplate, station);\n if (\n glyph.iconTemplateDecimals !== undefined &&\n glyph.iconTemplateDecimals !== null\n ) {\n valueToDisplay = Number.parseFloat(valueToDisplay).toFixed(\n glyph.iconTemplateDecimals,\n );\n }\n return [\n iconStyle,\n new Style({\n zIndex: iconStyle.getZIndex() + 0.1,\n text: new Text({\n font: 'bold 10px Calibri, \"sans-serif\"',\n text: valueToDisplay,\n fill: new Fill({\n color: contrastColor(image.getFill().getColor(), true),\n }),\n padding: [1, 5, 0, 5],\n offsetX: 0,\n offsetY: 0,\n }),\n }),\n ];\n }\n }\n\n /** Keywords: MultiSelection, MultiTs */\n if (selected) {\n return [\n iconStyle,\n new Style({\n zIndex: iconStyle.getZIndex() + 0.1,\n image: new CircleStyle({\n radius: iconStyle.getImage().getRadius(),\n fill: new Fill({\n color: 'rgba(0,0,0,0)',\n }),\n stroke: new Stroke({\n color: 'rgb(0, 0, 224)',\n width: 3,\n }),\n }),\n }),\n ];\n }\n return iconStyle;\n }\n\n set tagMarkers(val) {\n this.__tagMarkers = val;\n this.reload();\n }\n\n get tagMarkers() {\n return this.__tagMarkers;\n }\n}\n","/* eslint-disable class-methods-use-this */\n/* eslint-disable consistent-return */\n/* eslint-disable array-callback-return */\nimport { Stroke, Style } from 'ol/style';\nimport Chart from 'ol-ext/style/Chart';\nimport dayjs from 'dayjs';\nimport StationsLayer from './StationsLayer';\n\nexport default class StationsChartLayer extends StationsLayer {\n set currentStation(val) {\n this.__currentStation = val;\n // this.reload();\n }\n\n /** Set in layercfg -> chartConfig -> remarkAttribute */\n static hasRemarkOrIsSelected(attr, station, selected) {\n return selected || !!(station[attr] && station[attr] !== '');\n }\n\n /** Border color for MultiTs/piechart icon */\n static getBorderColor(\n remarkAttribute: String,\n station: Object,\n selected: Boolean,\n ): '#000' | 'rgb(0, 0, 224)' | '#333' {\n if (selected) return 'rgb(0, 0, 224)';\n if (\n StationsChartLayer.hasRemarkOrIsSelected(\n remarkAttribute,\n station,\n selected,\n )\n )\n return '#000';\n return '#333';\n }\n\n /** TODO: Apply layerconfig (LANUV-103) */\n static handleThreshold(item, config) {\n return Math.abs(item.ts_value) < config.chartConfig.threshold\n ? 'rgba(155, 229, 100, 1)'\n : 'rgba(209, 60, 38, 1)';\n }\n\n static isOutdated(outdatdedCfg, timestamp) {\n const outdated = dayjs(timestamp)\n .add(outdatdedCfg.time, outdatdedCfg.unit)\n .valueOf();\n const now = dayjs().valueOf();\n return outdated < now;\n }\n\n static getStationStyle(station, config, selected: Boolean) {\n const colors = Object.values(\n station.ts_values[config.chartConfig.parameter],\n ).map(item => {\n /** Inactive > Outdated > Threshold */\n if (config.chartConfig.inactive && station.INTERNET_AKTIV === 'no') {\n return '#ffe4e1';\n }\n if (\n config.chartConfig.outdated &&\n !StationsChartLayer.isOutdated(\n config.chartConfig.outdated,\n item.timestamp,\n ) &&\n !config.chartConfig.threshold\n )\n return 'rgba(52,164,235, 1)';\n if (config.chartConfig.outdated && !config.chartConfig.threshold)\n return 'rgba(209, 60, 38, 1)';\n if (\n config.chartConfig.outdated &&\n StationsChartLayer.isOutdated(\n config.chartConfig.outdated,\n item.timestamp,\n ) &&\n config.chartConfig.threshold\n )\n return `rgba(128, 128, 128, 1)`;\n if (config.chartConfig.threshold) {\n return StationsChartLayer.handleThreshold(item, config);\n }\n if (station.__tag === 'none') {\n return 'rgba(128, 128, 128, 1)';\n }\n });\n\n const remarkAttribute = config?.chartConfig?.remarkAttribute;\n\n const currentStationStyle = new Style({\n image: new Chart({\n colors,\n type: 'pie',\n radius: 10,\n data: colors.map(() => 1),\n rotateWithView: true,\n stroke: new Stroke({\n color: StationsChartLayer.getBorderColor(\n remarkAttribute,\n station,\n selected,\n ), // hasRemarkOrIsSelected(remarkAttribute, station) ? '#000' : '#333',\n width: StationsChartLayer.hasRemarkOrIsSelected(\n remarkAttribute,\n station,\n selected,\n )\n ? 3\n : 1,\n }),\n }),\n zIndex: 100,\n });\n\n currentStationStyle.sortPriority = colors.filter(\n x => x === 'rgba(209, 60, 38, 1)',\n ).length;\n\n return currentStationStyle;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _getStationStyle(station, selected = false) {\n return StationsChartLayer.getStationStyle(station, this.config, selected);\n }\n\n set tagMarkers(val) {\n this.__tagMarkers = val;\n this.reload();\n }\n\n get tagMarkers() {\n return this.__tagMarkers;\n }\n}\n","import Style from 'ol/style/Style';\nimport { get } from 'lodash-es';\nimport Feature from 'ol/Feature';\nimport Point from 'ol/geom/Point';\nimport StationsLayer from './StationsLayer';\nimport { FontIcon } from './FontIcon';\nimport { getTrendArrow } from '../../common/base';\n\nexport default class StationsTrendLayer extends StationsLayer {\n // eslint-disable-next-line class-methods-use-this\n constructor(options) {\n options = {\n ...options,\n };\n super(options);\n }\n\n _createStationFeatures(stations) {\n const ret = [];\n stations.forEach(station => {\n if (station.point) {\n const f = new Feature({\n geometry: new Point(station.point),\n rot: get(station, this.trendkey),\n });\n\n const style = this._getStationStyle(f);\n style && f.setStyle(style);\n f.station = station;\n ret.push(f);\n }\n });\n return ret;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _getStationStyle(feature) {\n return new Style({\n image: new FontIcon({\n backgroundColor: 'rgba(197, 213, 234, 1)',\n icon: 'ki ki-arrow-right',\n fontSize: 0.8,\n radius: 9,\n rotation: getTrendArrow(feature.get('rot'), true),\n shape: 'none',\n color: 'rgba(69,69,67, 1)',\n border: {\n color: 'rgba(29,29,27, 1)',\n width: 1,\n },\n }),\n });\n }\n\n set labelTemplate(val) {\n this.__labelTemplate = val;\n this.reload();\n }\n\n get labelTemplate() {\n /* eslint-disable no-template-curly-in-string */\n return this.__labelTemplate || this.isSiteLayer\n ? '${site_name}'\n : '${station_name}';\n /* eslint-enable no-template-curly-in-string */\n }\n}\n","import { css, html, LitElement } from 'lit';\nimport '../ki-icon/ki-icon';\n\nexport default class KiIconSwitcher extends LitElement {\n // language=CSS\n static styles = css`\n :host {\n display: inline-block;\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n color: gray;\n background: white;\n border-radius: 36px;\n }\n .tab {\n margin: 6px;\n width: 28px;\n height: 28px;\n text-align: center;\n line-height: 28px;\n border-radius: 28px;\n cursor: pointer;\n overflow: hidden;\n transition: background-color 0.4s ease-in-out, color 0.2s ease-in-out;\n }\n .tab:hover ki-icon::part(icon){\n fill: #4a4a49;\n }\n\n .tab.selected ki-icon{\n fill: white;\n }\n\n .tab.selected {\n color: white;\n background: var(--theme-color-primary, #0056a0);\n }\n\n ki-icon{\n fill: gray;\n }\n `;\n\n constructor() {\n super();\n this.content = 'default content';\n }\n\n static get properties() {\n return {\n options: { type: Array }, // icon, value, label\n value: { type: String },\n };\n }\n\n render() {\n this.value = this.value || this.options[0].value;\n // language=html\n return html`\n ${this.options.map((option, index) => html`\n {\n this.switchTo(option.value);\n }}\"\n >\n \n \n `)}\n `;\n }\n\n switchTo(value) {\n if (this.value !== value) {\n this.value = value;\n this.dispatchEvent(new CustomEvent('changed', { detail: { value } }));\n }\n }\n}\n\ncustomElements.define('ki-icon-switcher', KiIconSwitcher);\n","// eslint-disable-next-line max-classes-per-file\nimport Control from 'ol/control/Control';\nimport DragPan from 'ol/interaction/DragPan';\nimport Select from 'ol/interaction/Select';\nimport { always } from 'ol/events/condition';\nimport DragBox from 'ol/interaction/DragBox';\nimport '@kisters/wcp-base/components/ki-switcher/ki-icon-switcher';\n\nexport default class MultiSelectionToggle extends Control {\n constructor(layers, options) {\n const element = document.createElement('ki-icon-switcher');\n element.options = options.options;\n element.value = 'mover';\n options.element = element;\n super(options);\n this.layers = layers;\n this.idProperty = options.idProperty;\n this.onSelection = options.onSelection;\n }\n\n setMap(map) {\n super.setMap(map);\n if (map) {\n this._initDrawingLayer();\n this.element.addEventListener('changed', e => {\n this.switchMode(e.detail.value);\n });\n this.switchMode(this.element.value);\n }\n }\n\n /*\n * @param {('mover','selector'))} mode\n * */\n switchMode(mode) {\n const dragpan = this.getMap()\n .getInteractions()\n .getArray()\n .filter(it => it instanceof DragPan)[0];\n dragpan.setActive(mode === 'mover');\n this.drawInteraction.setActive(mode === 'selector');\n }\n\n _initDrawingLayer() {\n this.__selectionInteraction = new (class extends Select {})();\n\n this.__selectionInteraction.setMap(this.getMap());\n const selectedFeatures = this.__selectionInteraction.getFeatures();\n\n this.drawInteraction = new DragBox({\n className: 'dragbox',\n condition: always,\n });\n this.getMap().addInteraction(this.drawInteraction);\n\n this.drawInteraction.on('boxend', event => {\n selectedFeatures.clear();\n const selectionGeo = event.target.getGeometry();\n selectedFeatures.extend(this._getSelectFeatures(selectionGeo));\n this._fireSelection(selectedFeatures);\n });\n\n // TODO deselect?\n }\n\n _fireSelection(selectedFeatures) {\n this.onSelection(\n selectedFeatures.getArray().map(f => f.station[this.idProperty]),\n );\n }\n\n _getSelectFeatures(selectionGeo) {\n // TODO\n const { layers } = this;\n const features = [];\n\n layers.forEach(layer => {\n if (layer.getVisible()) {\n layer\n .getSource()\n ?.getFeatures?.()\n .forEach(feature => {\n if (\n selectionGeo.intersectsExtent(\n feature?.getGeometry?.()?.getExtent(),\n )\n ) {\n !feature.hide && features.push(feature);\n }\n });\n }\n });\n return features;\n }\n\n clearSelection() {\n // TODO\n this.__selectionInteraction.getFeatures().clear();\n this.__selectionInteraction.getFeatures().forEach(f => {\n this.__selectionInteraction.removeFeature_(f);\n });\n }\n\n set selection(val) {\n const list = this.__selectionInteraction.getFeatures();\n list.clear();\n this.layers.forEach(layer => {\n if (layer.getVisible()) {\n const features = layer\n .getSource()\n ?.getFeatures?.()\n .filter(feature => {\n const { station } = feature;\n return station && val.some(s => s === station[this.idProperty]);\n });\n list.extend(features);\n }\n });\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport { Mix, template } from '@kisters/wcp-base/common';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport { unByKey } from 'ol/Observable';\n\nimport Feature from 'ol/Feature';\nimport Point from 'ol/geom/Point';\nimport VectorLayer from 'ol/layer/Vector';\nimport VectorSource from 'ol/source/Vector';\nimport Style from 'ol/style/Style';\nimport Text from 'ol/style/Text';\nimport Fill from 'ol/style/Fill';\nimport { boundingExtent } from 'ol/extent';\n\nimport _AddOn from './_AddOn';\nimport StationsMarkerLayer from './StationsMarkerLayer';\nimport StationsChartLayer from './StationsChartLayer';\nimport StationsTrendLayer from './StationsTrendLayer';\nimport MultiSelectionToggle from './MultiSelectionToggle';\nimport './ki-station-info';\nimport nls from '../../locales/index';\n// TODO\n@customElement('ki-stations-layer')\nexport default class KiStationsLayer extends Mix(_AddOn, [i18nMixin, { nls }]) {\n static get properties() {\n return {\n zIndex: { type: String, attribute: 'z-index' },\n\n stations: { type: Array },\n labelPositions: { type: String },\n labelTemplate: { type: String },\n tagMarkers: { type: Object },\n tagSelectedMarkers: { type: Object },\n config: { type: Object },\n currentStation: { type: Object },\n infoTag: { type: String }, // tooltip component\n selected: { type: Array },\n multiSelectable: { type: Boolean },\n timeActive: { type: Boolean },\n noAutoZoom: { type: Boolean },\n noDeclutter: { type: Boolean },\n displayStationLabelsOnStart: { type: Boolean },\n displayInLayerControl: { type: Boolean },\n };\n }\n\n @property({ type: Boolean, attribute: true })\n isSiteLayer = false;\n\n @property({ type: String, attribute: false })\n idProperty = this.isSiteLayer ? 'site_id' : 'station_id';\n\n constructor() {\n super();\n this.mapLayers = [];\n this.stations = [];\n this.selected = [];\n this.zIndex = 100;\n this.noAutoZoom = false;\n // eslint-disable-next-line no-template-curly-in-string\n this.labelTemplate = this.isSiteLayer ? '${site_name}' : '${station_name}';\n }\n\n updateSelection() {\n if (this.multiSelectionToggle) {\n this.stationsMarkerLayer.selection = this.selected;\n this.multiSelectionToggle.selection = this.selected;\n }\n }\n\n _afterMapCreated() {\n super._afterMapCreated();\n this._initPopup();\n }\n\n _create() {\n this._createMakerLayer();\n this._createLabelLayer();\n this.disableMouseOver = this.parentElement.classList.contains('sm-screen');\n if (this.trendKey) {\n this._createTrendLayer();\n }\n this.multiSelectable && this._createSelectionControl();\n this.map.getLayers().extend(this.mapLayers);\n }\n\n _createChartLayer() {\n this.stationsMarkerLayer = new StationsChartLayer({\n config: this.config,\n name: this.i18n.t('stations'),\n displayInLayerControl: this.displayInLayerControl,\n dynamicMarkerSize: this.dynamicMarkerSize,\n group: 'Layers',\n tagMarkers: this.tagMarkers,\n zIndex: this.zIndex + 1,\n currentStation: this.currentStation,\n });\n this.mapLayers.push(this.stationsMarkerLayer);\n }\n\n _createLabelLayer() {\n this.stationsLabelLayer = new VectorLayer({\n name: this.i18n.t('Labels'),\n displayInLayerControl: true,\n group: 'Information',\n zIndex: 112,\n labelPositions: this.labelPositions,\n visible: this.displayStationLabelsOnStart || false,\n declutter: !this.noDeclutter,\n source: new VectorSource({\n features: this.stations.map(station => {\n const f = new Feature(new Point(station.point));\n f.setProperties({ station });\n return f;\n }),\n }),\n style: feature => {\n const station = feature.get('station');\n const customPosition = this.labelPositions\n ? this.labelPositions[station?.station_id]\n : {} ?? {};\n const style = new Style({\n text: new Text({\n font: 'bold 12px \"Calibri\", \"sans-serif\"',\n text: this.labelTemplate\n ? template(this.labelTemplate, station)\n : station.station_name,\n textAlign: 'left',\n textBaseline: 'top',\n padding: [3, 3, 3, 3],\n offsetX: 12,\n offsetY: -17 / 2,\n fill: new Fill({ color: 'rgba(29,29,29,1)' }),\n backgroundFill: new Fill({ color: 'rgba(255,255,255,0.8)' }),\n ...customPosition,\n }),\n });\n return style;\n },\n });\n this.mapLayers.push(this.stationsLabelLayer);\n }\n\n _createTrendLayer() {\n this.stationsTrendLayer = new StationsTrendLayer({\n name: this.i18n.t('Trend'),\n displayInLayerControl: true,\n group: 'Information',\n visible: this.displayStationTrendOnStart || false,\n stations: this.stations,\n zIndex: this.zIndex + 2,\n trendKey: this.trendKey,\n timeActive: this.timeActive,\n });\n this.mapLayers.push(this.stationsTrendLayer);\n }\n\n _createMakerLayer() {\n if (this.config?.type === 'piechart') {\n this.stationsMarkerLayer = new StationsChartLayer({\n config: this.config,\n name: this.i18n.t('stations'),\n displayInLayerControl: this.displayInLayerControl,\n dynamicMarkerSize: this.dynamicMarkerSize,\n group: 'Layers',\n tagMarkers: this.tagMarkers,\n zIndex: this.zIndex + 1,\n currentStation: this.currentStation,\n });\n } else {\n this.stationsMarkerLayer = new StationsMarkerLayer({\n name: this.i18n.t('stations'),\n config: this.config,\n displayInLayerControl: this.displayInLayerControl,\n dynamicMarkerSize: this.dynamicMarkerSize,\n group: 'Layers',\n tagMarkers: this.tagMarkers,\n tagSelectedMarkers: this.tagSelectedMarkers,\n zIndex: this.zIndex + 1,\n currentStation: this.currentStation,\n isSiteLayer: this.isSiteLayer,\n timeActive: this.timeActive,\n });\n }\n\n this.stationsMarkerLayer.on('change:source', () => {\n this.dispatchEvent(\n new CustomEvent('sourceChange', {\n detail: { extent: this.stationsMarkerLayer.getSource().getExtent() },\n }),\n );\n });\n this.stationsMarkerLayer.stations = this.stations;\n this.mapLayers.push(this.stationsMarkerLayer);\n\n // eslint-disable-next-line consistent-return\n this.clickEvent = this.map.on('singleclick', evt => {\n const stations = [];\n if (this.config.clusterStations?.enabled) {\n this.map.forEachFeatureAtPixel(\n evt.pixel,\n feature => {\n if (feature) {\n const _features = feature?.getProperties().features;\n if (_features.length > 1) {\n const extent = boundingExtent(\n _features.map(r => r.getGeometry().getCoordinates()),\n );\n this.map.getView().fit(extent, {\n duration: 1000,\n padding: [\n window.screen.height / 4,\n window.screen.width / 4,\n window.screen.height / 4,\n window.screen.width / 4,\n ],\n });\n }\n if (\n _features.length === 1 ||\n this.map.getView().getZoom() === this.map.getView().getMaxZoom()\n ) {\n const { station } = _features[0];\n if (station) {\n stations.push(station);\n }\n }\n }\n },\n { layerFilter: layer => layer === this.stationsMarkerLayer },\n );\n } else {\n this.map.forEachFeatureAtPixel(\n evt.pixel,\n feature => {\n if (feature && feature.station) {\n stations.push(feature.station);\n }\n },\n { layerFilter: layer => layer === this.stationsMarkerLayer },\n );\n }\n\n if (stations.length > 0) {\n this.dispatchEvent(\n new CustomEvent('station-click', {\n detail: {\n value: `${stations[0].site_no}${\n this.isSiteLayer ? '' : `/${stations[0].station_no}`\n }`,\n data: stations[0],\n // TODO station\n },\n }),\n );\n return false; // skip rest listener;\n }\n });\n }\n\n _initPopup() {\n let activePopup = false;\n // eslint-disable-next-line consistent-return\n this.hoverEvent = this.map.on('pointermove', evt => {\n this.map.getTargetElement().style.cursor = '';\n if (!this.stationsMarkerLayer || this.disableMouseOver) {\n return false;\n }\n const stations = [];\n if (this.config?.clusterStations?.enabled) {\n this.map.forEachFeatureAtPixel(\n evt.pixel,\n /* eslint-disable-next-line consistent-return */\n feature => {\n const _features = feature?.getProperties().features;\n if (\n _features.length === 1 ||\n this.map.getView().getZoom() === this.map.getView().getMaxZoom()\n ) {\n this.map.getTargetElement().style.cursor = 'pointer';\n if (_features[0]._hoverStyle) {\n _features[0].setStyle(_features[0]._hoverStyle);\n }\n if (_features[0].station) {\n stations.push(_features[0].station);\n }\n }\n },\n { layerFilter: layer => layer === this.stationsMarkerLayer },\n );\n } else {\n this.map.forEachFeatureAtPixel(\n evt.pixel,\n /* eslint-disable-next-line consistent-return */\n feature => {\n this.map.getTargetElement().style.cursor = 'pointer';\n if (feature && feature._hoverStyle) {\n feature.setStyle(feature._hoverStyle);\n }\n if (feature && feature.station) {\n stations.push(feature.station);\n }\n },\n { layerFilter: layer => layer === this.stationsMarkerLayer },\n );\n }\n\n if (stations.length > 0) {\n activePopup = true;\n this.map.dispatchEvent({\n type: 'show-popup',\n detail: {\n coordinate: this.map.getCoordinateFromPixel(evt.pixel),\n element: this.element,\n stations,\n layerAlias: this.layerAlias,\n },\n });\n return false;\n }\n if (activePopup) {\n activePopup = false;\n this.map.dispatchEvent({\n type: 'close-popup',\n detail: {\n element: this.element,\n },\n });\n }\n // prevent other listener\n });\n }\n\n _createSelectionControl() {\n this.multiSelectionToggle = new MultiSelectionToggle(\n [this.stationsMarkerLayer],\n {\n idProperty: this.idProperty,\n displayInLayerControl: true,\n onSelection: selection => {\n this.dispatchEvent(\n new CustomEvent('selection', { detail: { selection } }),\n );\n },\n options: [\n {\n icon: 'ki ki-mouse-pointer',\n label: this.i18n.t('move_in_map'),\n value: 'mover',\n }, // TODO i18n ?\n {\n icon: 'ki ki-object-group',\n label: this.i18n.t('Select_stations'),\n value: 'selector',\n },\n ],\n },\n );\n this.map.addControl(this.multiSelectionToggle);\n this.multiSelectionToggle.selection = this.selected;\n this.stationsMarkerLayer.selection = this.selected;\n }\n\n _tear() {\n this.mapLayers.forEach(l => this.map.removeLayer(l));\n this.map.removeControl(this.multiSelectionToggle);\n\n this.multiSelectionToggle = null;\n this.stationsLabelLayer = null;\n this.stationsTrendLayer = null;\n this.stationsMarkerLayer = null;\n\n this.mapLayers = [];\n unByKey(this.clickEvent);\n unByKey(this.hoverEvent);\n }\n\n updated(_changedProperties) {\n super.updated(_changedProperties);\n this.element = document.createElement(this.infoTag || 'ki-station-info');\n if (this.map) {\n // TODO how to update. dirty code\n\n if (_changedProperties.has('stations')) {\n if (this.stationsMarkerLayer) this.stationsMarkerLayer._legends = null;\n if (this.stationsLabelLayer) {\n this.stationsLabelLayer.setSource(\n new VectorSource({\n features: this.stations\n .filter(station => station.point !== undefined)\n .map(station => {\n const f = new Feature(new Point(station.point));\n f.setProperties({ station });\n return f;\n }),\n }),\n );\n }\n this.mapLayers.forEach(l => {\n l.selection = this.selected;\n l.stations = this.stations;\n });\n }\n\n if (_changedProperties.has('tagMarkers')) {\n if (this.stationsMarkerLayer) {\n this.stationsMarkerLayer.tagMarkers = this.tagMarkers;\n }\n }\n\n if (_changedProperties.has('tagSelectedMarkers')) {\n if (this.multiSelectionToggle) {\n this.multiSelectionToggle.tagSelectedMarkers =\n this.tagSelectedMarkers;\n }\n }\n }\n }\n}\n","import { Vector as VectorLayer } from 'ol/layer';\nimport VectorSource from 'ol/source/Vector';\nimport { Style } from 'ol/style';\nimport Fill from 'ol/style/Fill';\nimport Stroke from 'ol/style/Stroke';\nimport TopoJSON from 'ol/format/TopoJSON';\n\nconst style = new Style({\n fill: new Fill({\n color: 'rgba(122, 122, 122, 0.2)',\n }),\n stroke: new Stroke({\n color: '#319FD3',\n width: 1,\n }),\n});\n\nexport default class JsonLayer extends VectorLayer {\n constructor(options) {\n const type = options.url\n ? {\n format: new TopoJSON({\n dataProjection: options.projection || 'EPSG:3857',\n }),\n url: options.url,\n }\n : { features: options.features };\n options = {\n source: new VectorSource(type),\n ...options,\n };\n super(options);\n\n this.imageRatio = 2;\n this.style = options.style || style;\n this.setProperties({\n name: options.name,\n displayInLayerControl: options.displayInLayerControl,\n group: options.group,\n });\n }\n}\n","import { customElement } from 'lit/decorators.js';\nimport { unByKey } from 'ol/Observable';\nimport _AddOn from './_AddOn';\nimport JSONLayer from './JSONLayer';\n\n@customElement('ki-json-layer')\nexport default class KiJsonLayer extends _AddOn {\n static get properties() {\n return {\n styles: { type: Object },\n visible: { type: Boolean },\n name: { type: String },\n url: { type: String },\n group: { type: String },\n projection: { type: String },\n };\n }\n\n _create() {\n console.time('_create of catchments layer start');\n this._createLayer();\n console.timeEnd('_create of catchments layer end');\n }\n\n _createLayer() {\n this.catchmentsLayer = new JSONLayer({\n styles: this.styles,\n url: this.url,\n projection: this.projection,\n visible: this.visible,\n name: this.name || 'Catchments',\n displayInLayerControl: true,\n group: this.group || 'Layers',\n });\n\n this.catchmentsLayer.setZIndex(\n Number(this.getAttribute('zindexlayer')) || 50,\n ); // TODO use PropertyDefaultValue, check why atribute not works\n\n this.map.addLayer(this.catchmentsLayer);\n\n this.clickEvent = this.map.on('singleclick', evt => {\n let catchment;\n this.map.forEachFeatureAtPixel(\n evt.pixel,\n (feature, layer) => {\n if (layer === this.catchmentsLayer) {\n if (feature && feature.getId() !== undefined) {\n catchment = feature.catchment;\n // eslint-disable-next-line camelcase\n this.dispatchEvent(\n new CustomEvent('catchment-click', {\n detail: { value: feature.getId() },\n }),\n );\n }\n }\n },\n { layerFilter: layer => layer === this.catchmentsLayer },\n );\n if (catchment) {\n return false; // skip rest listener;\n }\n return true;\n });\n }\n\n _initHover() {\n const element = document.createElement('ki-catchment-info');\n\n this.hoverEvent = this.map.on('pointermove', evt => {\n if (!this.catchmentsLayer) {\n return;\n }\n\n let hovering;\n\n this.map.forEachFeatureAtPixel(\n evt.pixel,\n feature => {\n if (feature && feature.catchment) {\n this.map.getTargetElement().style.cursor = 'pointer';\n element.catchment = feature.catchment;\n\n this.map.dispatchEvent({\n type: 'show-popup',\n detail: {\n coordinate: this.map.getCoordinateFromPixel(evt.pixel),\n element,\n },\n });\n // hovering\n if (!feature.__bak_style) {\n feature.__bak_style = feature.getStyle();\n feature.setStyle(\n this.catchmentsLayer._getHoverStyle(feature.catchment),\n );\n }\n hovering = feature;\n }\n },\n { layerFilter: layer => layer === this.catchmentsLayer },\n );\n\n this.catchmentsLayer\n .getSource()\n .getFeatures()\n .forEach(f => {\n if (f !== hovering && f.__bak_style) {\n f.setStyle(f.__bak_style);\n f.__bak_style = null;\n }\n });\n\n if (hovering) {\n // eslint-disable-next-line consistent-return\n return false;\n }\n });\n }\n\n _tear() {\n this.map.removeLayer(this.catchmentsLayer);\n unByKey(this.clickEvent);\n unByKey(this.hoverEvent);\n }\n\n updated(_changedProperties) {\n super.updated(_changedProperties);\n if (_changedProperties.has('styles') && this.catchmentsLayer) {\n this.catchmentsLayer.styles = this.catchmentsStyles;\n }\n if (_changedProperties.has('url') && this.catchmentsLayer) {\n this.catchmentsLayer.url = this.catchmentFeatures;\n }\n if (_changedProperties.has('name') && this.catchmentsLayer) {\n this.catchmentsLayer.name = this.catchments;\n }\n\n if (this.catchmentsLayer && _changedProperties.has('currentCatchment')) {\n // TODO\n this.catchmentsLayer.highlight(this.currentCatchment);\n }\n }\n}\n","import VectorLayer from 'ol/layer/Vector';\nimport VectorSource from 'ol/source/Vector';\nimport mapKeys from 'lodash-es/mapKeys';\nimport { customElement } from 'lit/decorators.js';\nimport _AddOn from './_AddOn';\n\n// TODO refactor ki-wcp-walhydro\n\n@customElement('ol-vector-layer')\nexport default class OlVectorLayer extends _AddOn {\n static get properties() {\n return {\n features: { type: Array, initial: () => [] }, // Feature list\n zIndex: { type: String, attribute: 'z-index' },\n visible: { type: Boolean, default: true },\n };\n }\n\n _create() {\n // todo override lifecycle?\n\n this.layer = new VectorLayer({\n zIndex: this.zIndex,\n source: new VectorSource(this.source),\n });\n this.map.addLayer(this.layer);\n this._updateProperties();\n }\n\n _tear() {\n this.map.removeLayer(this.layer);\n }\n\n _updateProperties() {\n // TODO\n if (!this.layer) return;\n // TODO move to ol-layer\n mapKeys(this.constructor.properties, (value, key) => {\n const updateFn = `_update${key.replace(/^(.)/, (s0, s1) =>\n s1.toUpperCase(),\n )}`;\n if (this[updateFn]) {\n this[updateFn](this[key]);\n } else {\n this.layer.set(key, this[key]);\n }\n });\n }\n\n _updateFeatures(features) {\n this.layer.getSource().clear();\n this.layer.getSource().addFeatures(features);\n }\n\n updated(_changedProperties) {\n super.updated(_changedProperties);\n this._updateProperties();\n }\n}\n","import { css } from 'lit';\n// language=CSS\nexport default css`\n :host {\n position: relative;\n display: flex;\n height: 100%;\n flex: 1;\n overflow: auto;\n --ui5-listitem-border-bottom: none;\n }\n\n :host .left {\n flex: 1;\n display: flex;\n flex-direction: column;\n border-right: 1px solid lightgray;\n position: relative;\n min-width: 270px;\n max-width: 300px;\n }\n\n .icon-btn.back-btn-mobile {\n height: 30px;\n fill: var(--theme-color-primary, gray);\n margin-left: 10px;\n font-size: 2.5em;\n }\n\n :host(.sm-screen) {\n overflow: hidden;\n }\n\n .hidden {\n display: none;\n }\n\n .map-container {\n height: 200px;\n flex: 0 0 200px;\n }\n\n ki-station-map {\n height: 100%;\n width: 100%;\n display: block;\n pointer-events: none;\n }\n\n .left .list-container {\n flex: 1;\n overflow-y: auto;\n }\n\n .prevenxt-container {\n display: none;\n flex-direction: row;\n }\n\n .prevnext-title-container {\n flex: 1;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n\n :host .main {\n flex: 3;\n position: relative;\n height: 100%;\n overflow: auto;\n }\n\n .header {\n z-index: 1;\n padding: 5px;\n display: flex;\n height: 200px;\n position: absolute;\n width: 100%;\n background: linear-gradient(white, transparent);\n border-bottom: 1px solid lightgray;\n box-sizing: border-box;\n }\n\n .icon-btn {\n cursor: pointer;\n font-size: 3em;\n fill: gray;\n }\n\n .icon-btn:hover {\n color: #3c3c3c;\n }\n\n .back-btn {\n pointer-events: all;\n font-size: 5em;\n position: absolute;\n left: -15px;\n bottom: 0px;\n }\n\n .fav-navbtn {\n display: none;\n }\n\n .title {\n font-size: 1.2em;\n display: inline-block;\n flex: 1;\n color: #3c3c3c;\n }\n\n .title span {\n padding-left: 10px;\n }\n\n .fav {\n position: absolute;\n right: 5px;\n top: 0;\n font-size: 2.3em;\n }\n\n ui5-select {\n width: 250px;\n }\n\n .titleContainer {\n display: flex;\n align-items: center;\n position: absolute;\n width: 85%;\n }\n\n .status-bar {\n padding: 10px;\n color: red;\n border-bottom: 1px solid lightgray;\n }\n\n .status-bar a {\n color: unset;\n }\n\n ki-list {\n border-top: 1px solid gray;\n }\n\n ki-list-item {\n cursor: pointer;\n padding: 12px 16px;\n color: var(--theme-text-color, #1d1d1b);\n padding-left: 15px !important;\n }\n\n ki-list-item.selected {\n background: linear-gradient(\n 90deg,\n var(--theme-color-primary) 5px,\n rgb(255, 255, 255) 0%\n );\n font-weight: 600;\n }\n\n ki-list-item:hover {\n background: linear-gradient(\n 90deg,\n var(--theme-color-primary) 5px,\n var(--theme-color-secondary) 0%\n );\n color: var(--theme-color-tertiary, white);\n }\n\n img {\n max-height: 100%;\n max-width: 100%;\n left: 50%;\n top: 50%;\n position: absolute;\n transform: translate(-50%, -50%);\n }\n\n ui5-list {\n width: 100%;\n border: none;\n }\n\n :host(.sm-screen) .main {\n display: block;\n width: 100%;\n position: absolute;\n left: 0;\n top: 0;\n z-index: 1;\n height: 100%;\n background: white;\n transition: left 0.5s;\n }\n\n :host(.sm-screen) .main.hide {\n left: 100%;\n }\n\n :host .main .graph-title {\n display: none;\n }\n\n :host(.sm-screen) .main .graph-title {\n display: flex;\n position: absolute;\n z-index: 4;\n align-items: center;\n padding: 7px 0px;\n }\n\n :host(.sm-screen) .main.hide .graph-title {\n display: none;\n }\n\n :host(.sm-screen) .left {\n flex: 0 0 100%;\n display: flex;\n padding: 10px 0;\n max-width: initial;\n }\n\n ki-station-map::part(overview-map) {\n width: 30%;\n height: 50%;\n bottom: 5px;\n right: 5px;\n pointer-events: none;\n box-shadow: 0 0 3px 3px #fff;\n opacity: 0.9;\n border-radius: 10px;\n }\n\n :host(.sm-screen.LANDSCAPE) .left {\n flex-direction: row;\n }\n\n :host(.sm-screen.LANDSCAPE) .left .header {\n width: 30vw;\n height: initial;\n }\n\n :host(.sm-screen.LANDSCAPE) .left .list-container {\n height: initial;\n flex: 2;\n }\n\n :host(.sm-screen.LANDSCAPE) .left .map-container {\n height: initial;\n flex: 1;\n }\n\n :host(.sm-screen.LANDSCAPE) .left ki-list {\n border-top: none;\n }\n`;\n","/* eslint-disable max-classes-per-file */\nimport { LoaderMixin, Mix, template } from '@kisters/wcp-base/common';\nimport { getRouteOptionsAndParams } from '@kisters/wcp-base/components';\nimport { css, html, LitElement } from 'lit';\nimport { customElement, query } from 'lit/decorators.js';\nimport { i18nMixin, responsiveMixin } from '@kisters/wcp-base/decorators';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport nls from '@kisters/wcp-water/locales';\n// eslint-disable-next-line import/extensions\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { last, first } from 'lodash-es';\nimport { getCurrentApi } from '../../api/API';\nimport '@ui5/webcomponents/dist/Carousel.js';\n\n@customElement('wwp-station-info')\nexport default class WwpStationInfo extends Mix(\n LitElement,\n LoaderMixin,\n responsiveMixin,\n [i18nMixin, { nls }],\n) {\n static styles = css`\n :host {\n height: 100%;\n width: 100%;\n overflow: auto;\n display: flex;\n flex-wrap: wrap;\n }\n\n .content {\n margin: 15pt;\n height: auto;\n flex: 1;\n }\n\n :host(.sm-screen) .content,\n :host(.md-screen) .content {\n width: 100%;\n margin: 0px;\n margin-right: 20px;\n display: table;\n }\n\n :host(.sm-screen) .content:first-of-type {\n margin-top: 50px;\n }\n\n :host(.md-screen) .content:first-of-type {\n margin-top: 25px;\n }\n\n ui5-carousel {\n }\n\n .images {\n margin: 15pt;\n height: 100%;\n max-height: 95%;\n flex: 1;\n min-width: 200px;\n }\n\n .images img {\n display: block;\n margin: auto;\n max-width: 90%;\n max-height: 90%;\n }\n\n .row {\n display: table-row;\n line-height: 1.5em;\n }\n\n .footer {\n display: table-row;\n line-height: 2em;\n }\n\n .row {\n width: 100%;\n height: 15px;\n }\n\n .cell {\n display: table-cell;\n padding: 5px 10px;\n }\n\n :host(.sm-screen) .cell {\n height: 34px;\n }\n\n .label {\n color: gray;\n padding-left: 30px;\n }\n\n .hidden {\n display: none;\n }\n\n .value {\n overflow-wrap: break-word;\n }\n\n .url {\n text-decoration: none;\n }\n\n :host(.sm-screen) .row {\n height: unset;\n }\n `;\n\n @query('#gallery')\n gallery;\n\n // eslint-disable-next-line class-methods-use-this\n get api() {\n return getCurrentApi();\n }\n\n static get properties() {\n return {\n station: {\n type: Object,\n initial: () => {},\n },\n fields: {\n type: Array,\n initial: () => ['station_no', 'station_name'],\n },\n };\n }\n\n disconnectedCallback() {\n super.connectedCallback();\n clearInterval(this.interval);\n }\n\n getLabel(field) {\n if (field.label) {\n return field.label;\n }\n return this.i18n.exists(`kiwis:${field.field}`)\n ? this.i18n.t(`kiwis:${field.field}`)\n : this.i18n.t(`customer:${field.field}`);\n }\n\n getValue(field) {\n let ret;\n let _skipSubst = false; // Skip string modification after parsing\n const val = this.station[field.field];\n if (!val) {\n ret = '-';\n } else if (field.type === 'number') {\n ret = new Intl.NumberFormat(\n this.i18n.language,\n field.numberFormat || this.numberFormat || {},\n ).format(parseFloat(val));\n } else if (field.type === 'textnumber') {\n ret = new Intl.NumberFormat(\n this.i18n.language,\n field.numberFormat || this.numberFormat || {},\n ).format(parseFloat(val.replace(',', '.')));\n } else if (field.type === 'datetime') {\n if (field.subst) {\n ret = val;\n field.subst.forEach(s => {\n ret = ret.replace(s.token, s.with);\n });\n _skipSubst = false;\n }\n const _dt = dayjs(ret, field.dateFormat?.inputPattern);\n ret = _dt.format(field.dateFormat?.outputFormat);\n } else if (field.type === 'html') {\n ret = unsafeHTML(this.station[field.field].replaceAll('\\r\\n', '
'));\n } else if (field.type === 'url') {\n // Check if URL is provided (either hardcoded or dynamic as station parameter)\n if (\n (field.urlIsStationParameter && this.station[field.url]) ||\n (!field.urlIsStationParameter && field.url)\n ) {\n let _url = ' {\n tmpret = tmpret.replace(item.token, item.with);\n });\n ret = tmpret;\n } else {\n ret = val.replace(field.subst.token, field.subst.with);\n }\n }\n if (ret !== '-' && field.suffix) {\n ret = template(`${ret}${field.suffix}`, this.station);\n }\n return ret;\n }\n\n getSlider() {\n // eslint-disable-next-line lit-a11y/alt-text\n return html`\n ${this.images?.map(i => html`\"station\"`)}\n `;\n }\n\n getTable(fields) {\n return fields.map(field => {\n const val = this.getValue(field);\n return val !== '-'\n ? html`
\n
${this.getLabel(field)}
\n \n ${val}\n
\n `\n : html``;\n });\n }\n\n async onAfterEnter(location) {\n const params = getRouteOptionsAndParams(location, ['stationId']);\n this.stationId = params.stationId;\n this.station = await this.api.getStation(this.stationId);\n Object.assign(this, params.options);\n if (this.tsData) {\n this.fetchTsData();\n }\n if (this.showImages) {\n this.fetchImages();\n let count = 0;\n this.interval = setInterval(() => {\n count += 1;\n this.gallery.navigateTo(count % this.images.length);\n }, 10000000);\n }\n }\n\n render() {\n return html` ${this.tables?.map(\n table => html`
\n ${this.getTable(table.items)}\n ${table.footer\n ? html`
\n
\n ${table.footer &&\n this.tableHasValues(this.getTable(table.items))\n ? unsafeHTML(table.footer)\n : ''}\n
\n
`\n : ``}\n
`,\n )}\n\n
\n ${this.images && this.getSlider()}\n
`;\n }\n\n // TODO: Dirty, LANUV-167\n // eslint-disable-next-line class-methods-use-this\n tableHasValues(templateResultList) {\n let anyValueFound = false;\n templateResultList.forEach(tr => {\n if (tr.values?.length) anyValueFound = true;\n });\n return anyValueFound;\n }\n\n async fetchImages() {\n this.images = await this.api.getImage(this.station.station_no);\n this.requestUpdate();\n return this.images;\n }\n\n async fetchTsData() {\n await Promise.all(\n this.station.timeseries\n .filter(ts => this.tsData.includes(last(ts.href.split('/'))))\n .map(async ts => {\n const tsdata = await this.api.getTsData(ts.href);\n tsdata.forEach(item => {\n this.station[item.ts_shortname] = last(last(item.data));\n const from = first(first(item.data));\n const to = first(last(item.data));\n if (from && to) {\n this.station[`${item.ts_shortname}_from`] = from;\n this.station[`${item.ts_shortname}_to`] = to;\n this.station[`${item.ts_shortname}_coverage`] = `${dayjs(\n from,\n ).format('L LT')} - ${dayjs(to).format('L LT')}`;\n }\n });\n }),\n );\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport './dynMenu.js';\nimport './dynMenuLanuv.js';\n\nimport { LoaderMixin, Mix } from '@kisters/wcp-base/common';\n\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport {\n responsiveMixin,\n queryParamMixin,\n localStorageMixin,\n i18nMixin,\n SM,\n ViewPort,\n} from '@kisters/wcp-base/decorators';\nimport {\n navigateTo,\n getCurrentPath,\n getSearchParamString,\n getRouteOptionsAndParams,\n} from '@kisters/wcp-base/components';\nimport { getConfig } from '@kisters/wcp-base/app';\nimport Feature from 'ol/Feature';\nimport Point from 'ol/geom/Point';\nimport Style from 'ol/style/Style';\nimport { FontIcon } from '@kisters/wcp-water/components';\n/* eslint-disable import/extensions */\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\n/* eslint-enable import/extensions */\nimport { each, findIndex, find, concat, flatten, first } from 'lodash-es';\nimport { DynMenuOption } from './DynMenuOption.js';\n\nimport { getCurrentApi } from '../../api/API';\nimport style from './wwp-station-detail.css?inline';\nimport nls from '../../locales/index';\nimport { reproject, registerProjections } from '../../common/maputils';\n\n/* eslint-enable import/extensions */\n\nimport './wwp-station-info';\n\n/* eslint-disable import/extensions */\nimport '@ui5/webcomponents/dist/Select';\nimport '@ui5/webcomponents/dist/List';\nimport '@ui5/webcomponents/dist/Option';\nimport '@ui5/webcomponents/dist/StandardListItem.js';\nimport '@ui5/webcomponents/dist/CustomListItem.js';\nimport '@ui5/webcomponents/dist/GroupHeaderListItem.js';\n\nconst _getNextItem = (\n // eslint-disable-next-line camelcase\n collection: Array<{ station_id: number }>,\n stationId: number,\n) => {\n let nextItem;\n const index = findIndex(collection, s => s.station_id === stationId);\n\n if (index >= 0 && index < collection.length - 1) {\n nextItem = collection[index + 1];\n } else {\n [nextItem] = collection;\n }\n return nextItem;\n};\n\n// eslint-disable-next-line camelcase\nconst _getPreviousItem = (\n collection: Array<{ station_id: number }>,\n stationId: number,\n) => {\n let nextItem;\n const index = findIndex(collection, s => s.station_id === stationId);\n\n if (index > 0) {\n nextItem = collection[index - 1];\n } else {\n nextItem = collection[collection.length - 1];\n }\n return nextItem;\n};\n\n@customElement('wwp-station-detail')\nexport default class WwpStationDetail extends Mix(\n LitElement,\n LoaderMixin,\n responsiveMixin,\n [\n queryParamMixin,\n { targetProperty: 'viewSelection', selector: 'mode', defaultValue: 'map' },\n ],\n [\n localStorageMixin,\n { targetProperty: '__favouriteStationIds', typeParam: Array },\n ],\n [i18nMixin, { nls }],\n) {\n static styles = style;\n\n @property({ type: String })\n stationId;\n\n @property({ type: Object })\n _station = {};\n\n @property({ type: String })\n detail;\n\n /** Option to hide favorite start in the top-left */\n hideFavorite = false;\n\n /** Option to hide minimap in top-left corner */\n showMiniMap = true;\n\n dynMenu: DynMenuOption | undefined;\n\n /** Path to selected Item\n * @remark Must start with \"/\", e.g. \"/Waterlevel\"\n */\n _selectedMenuItem: string | null = null;\n\n // eslint-disable-next-line class-methods-use-this\n get api() {\n return getCurrentApi();\n }\n\n mobileAutoForward = false;\n\n _appConfig;\n\n get appConfig() {\n if (!this._appConfig) this._appConfig = getConfig();\n return this._appConfig;\n }\n\n set appConfig(value) {\n this._appConfig = value;\n this.requestUpdate();\n }\n\n _currentSubPath;\n\n ___favouriteStationIds = [];\n\n get __favouriteStationIds() {\n return this.___favouriteStationIds;\n }\n\n set __favouriteStationIds(value) {\n this.___favouriteStationIds = value;\n this.requestUpdate();\n }\n\n _viewSelection: 'map' | 'table' | 'overview' = 'map';\n\n get viewSelection() {\n return this._viewSelection;\n }\n\n set viewSelection(value) {\n this._viewSelection = value;\n this.requestUpdate();\n }\n\n // Vaadin Router Method that gets called after this component is called\n // eslint-disable-next-line no-unused-vars\n onAfterEnter(location, options, router) {\n const params = getRouteOptionsAndParams(location, [\n 'layerName',\n 'stationId',\n 'stationLabel',\n ]);\n Object.assign(this, params.options);\n\n this.remarkAttr = this.appConfig.remarkAttr;\n const mainRouteLength = location.route.path.split('/').length;\n this._search = location.search;\n this.currentRoute = location.route;\n\n this.currentRoute.children = this.currentRoute.children.filter(\n item => !(item.isDynamic || item.path?.includes('dyn_')),\n );\n this.currentRoute.__children = this.currentRoute.__children.filter(\n item => !(item.isDynamic || item.path?.includes('dyn_')),\n );\n\n this._mainRoute = location.pathname\n .split('/')\n .slice(0, mainRouteLength)\n .join('/');\n this._menuListRaw =\n location.route.children?.map(item => ({\n filter: item.filter,\n label: item.label,\n customCss: item.customCss,\n detailSelection: item.detailSelection || item.path.slice(1),\n path: item.path,\n })) ?? [];\n if (this._mainRoute !== location.pathname) {\n this._selectedMenuItem = `/${location.pathname\n .split('/')\n .slice(mainRouteLength)\n .join('/')}`;\n } else {\n this._selectedMenuItem =\n location.pathname === router.context.resolver.location.redirectFrom ||\n !router.context.resolver.location.redirectFrom\n ? null\n : `/${router.context.resolver.location.redirectFrom\n .split('/')\n .slice(-1)}`;\n }\n\n this.router = router;\n\n // Switch back to main menu on navigation (mobile)\n this.router.navigationChange = (newRoute, oldRoute) => {\n /** TODO: @Marko Why absolute length? This section is also executed on desktop devices */\n if (newRoute.length < oldRoute.length) {\n this.__selectedItem = this._selectedMenuItem; // Workaround LANUV: Preserve last selected menu item (required for nested LANUV dynMenu)\n this._selectedMenuItem = '';\n this.requestUpdate();\n }\n };\n\n this.stationId = params.stationId;\n this.stationLabel = params.stationLabel;\n this.fetchData(params.layerName);\n }\n\n // eslint-disable-next-line class-methods-use-this\n get localStorageId() {\n return `wwp-favorites-ids`;\n }\n\n _renderLeftMenu() {\n if (this._station && this._menuList) {\n return html`\n ${this._renderListItems()}\n `;\n }\n return html`Loading...`;\n }\n\n _renderListItems() {\n return html`${this._menuList.map(i => {\n if (i.items?.length) {\n return this._renderGroupItem(i);\n }\n return this._renderListItem(i);\n })}`;\n }\n\n /** Render non-clickable group header\n * @remark Selected if item-path is selectedItem\n */\n _renderGroupItem(item) {\n // LANUV DynMenu Workaround\n if (this._selectedMenuItem === '')\n this._selectedMenuItem = this.__selectedItem;\n\n if (\n item.hide ||\n item.subitem ||\n (item.toplevel && item?.items.some(i => !i.hide))\n ) {\n return html``;\n }\n return html`${item.label}${item.items?.map(i => this._renderListItem(i))}`;\n }\n\n /** Render Menu\n * @remark Grouping of parameters\n */\n _renderListItem(item) {\n return !item.hide\n ? html`${item.label}`\n : html``;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _handleChange(evt) {\n /** Remove path and replace by searchParam */\n const item = first(evt.detail.selectedItems);\n const _path = item.path;\n if (_path) {\n this._selectedMenuItem = _path;\n navigateTo(`${this._mainRoute}${_path}`); //\n this._currentSubPath = _path;\n this.requestUpdate();\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n switchStation(to) {\n const query = getSearchParamString();\n const toReplace = `${getCurrentPath().split('/station/')[0]}/station/${\n to.station_id\n }/${to.station_name || to.station_longname}${query}`;\n navigateTo(toReplace);\n }\n\n goToStation(event) {\n const station = find(this._stations, {\n station_id: event.target.selectedOption.value,\n });\n station && this.switchStation(station);\n }\n\n nextFavStation() {\n const favSta = this._stations.filter(s =>\n this.__favouriteStationIds.includes(s.station_id),\n );\n\n const nextItem = _getNextItem(favSta, this.stationId);\n\n nextItem && this.switchStation(nextItem);\n }\n\n prevFavStation() {\n const favSta = this._stations.filter(s =>\n this.__favouriteStationIds.includes(s.station_id),\n );\n\n const prevItem = _getPreviousItem(favSta, this.stationId);\n prevItem && this.switchStation(prevItem);\n }\n\n nextStation() {\n const nextItem = _getNextItem(this._sortedStations, this.stationId);\n nextItem && this.switchStation(nextItem);\n }\n\n prevStation() {\n const prevItem = _getPreviousItem(this._sortedStations, this.stationId);\n prevItem && this.switchStation(prevItem);\n }\n\n isFavorite() {\n return this.__favouriteStationIds.indexOf(this._station?.station_id) >= 0;\n }\n\n isSelected(station) {\n return this._station?.station_id === station.station_id;\n }\n\n getFavoriteList() {\n return this._stations\n ? this._stations.filter(s =>\n this.__favouriteStationIds.includes(s.station_id),\n )\n : [];\n }\n\n getTitle() {\n return this._stations && this.isFavorite()\n ? html`\n ${this.getFavoriteList().map(\n station =>\n html`${station.station_longname || station.station_name}`,\n )}\n `\n : html`${this._station?.station_longname ||\n this._station?.station_name ||\n ''}`;\n }\n\n _goToParent() {\n navigateTo(this._mainRoute.split('/').slice(0, 3).join('/') + this._search);\n }\n\n _goToStationMenu() {\n this._selectedMenuItem = null;\n navigateTo(this._mainRoute + this._search);\n }\n\n render() {\n // language=html\n return html`\n
\n
\n \n
\n \n\n
${this.getTitle()}
\n \n
\n \n
\n
\n \n \n ${this.showMiniMap\n ? html``\n : html``}\n \n
\n
\n
\n \n
\n
\n ${this._station?.station_longname || this._station?.station_name}\n
\n
\n \n
\n
\n ${this._renderStatusBar()}\n
${this._renderLeftMenu()}
\n
\n
\n
\n \n \n \n \n
\n \n
\n `;\n }\n\n _toggleFavourite() {\n if (this.__favouriteStationIds.indexOf(this._station.station_id) === -1) {\n this.__favouriteStationIds = [\n ...this.__favouriteStationIds,\n this._station.station_id,\n ];\n } else {\n this.__favouriteStationIds = this.__favouriteStationIds.filter(\n id => id !== this._station.station_id,\n );\n }\n }\n\n /** Remark Attribute / Additional station info (red text above left menu)\n * @param remarkAttr is defined in app.json (appConfig)\n */\n _renderStatusBar() {\n if (this._station && this._station[this.remarkAttr]) {\n return html`
\n ${unsafeHTML(\n this._station[this.remarkAttr].replace(//gi, ''),\n )}\n
`;\n }\n return '';\n }\n\n get stationPositionMarker() {\n const loc = this._station?.point || [0, 0];\n const marker = new Feature(new Point(loc));\n marker.setStyle(\n new Style({\n image: new FontIcon({\n backgroundColor: 'rgba(0,0,0,0)',\n color: 'red',\n icon: 'ki ki-map-marker',\n }),\n }),\n );\n return marker;\n }\n\n _menuFilter(menu) {\n const station = this._station;\n return menu.filter(menuItem => {\n if (typeof menuItem.filter === 'string') {\n return station.timeseries.some(ts =>\n menuItem.filter ? menuItem.filter === ts.station_parameter : true,\n );\n }\n\n // Filter array is OR - logic (one criterium must match to pass!)\n if (Array.isArray(menuItem.filter)) {\n let ret = true;\n for (const [key, value] of Object.entries(menuItem.filter)) {\n ret =\n (ret && station[key] === value) ||\n (ret && station[key] && value === '*');\n }\n return menuItem.filter.some(filter =>\n station.timeseries.some(ts =>\n filter ? filter === ts.station_parameter : true,\n ),\n );\n }\n\n // Filter object is AND - logic (all criterias must match to pass!)\n if (typeof menuItem.filter === 'object' && menuItem.filter !== null) {\n let ret = true;\n each(menuItem.filter, (val, key) => {\n if (key === 'parameter') {\n ret =\n ret &&\n val.every(item =>\n station._links.some(link => link.station_parameter === item),\n );\n } else if (key === 'anyparameter') {\n ret =\n ret &&\n val.some(item =>\n station._links.some(link => link.station_parameter === item),\n );\n } else if (key === 'href') {\n ret =\n ret &&\n val.some(item =>\n station._links.some(link => link.href.includes(item)),\n );\n } else if (Array.isArray(val)) {\n ret = ret && val.some(cond => station[key] === cond);\n } else if (val.charAt && val.charAt(0) === '!') {\n ret = ret && station[key] && station[key] !== val.substring(1);\n } else {\n ret =\n (ret && station[key] && val === '*') ||\n (ret && station[key] === val) ||\n station._links.some(item => item[key] === val);\n }\n });\n return ret;\n }\n return true;\n });\n }\n\n async loadDynamicMenu() {\n if (!this.dynMenu) {\n return [];\n }\n try {\n let module;\n const className = this.dynMenu?.className || 'dynMenu';\n console.log('Load DynMenu: ', className);\n if (className === 'dynMenu') module = await import(`./dynMenu.js`);\n else if (className === 'dynMenuLanuv')\n module = await import('./dynMenuLanuv.js');\n else console.error('Dynamic menu not found:', className);\n const items = await module.getMenuItems(\n this._station,\n this.dynMenu,\n this.dynMenu?.menuTemplate,\n );\n return items;\n } catch (e) {\n console.error('Error loading dynamic menu', e);\n return [];\n }\n }\n\n async fetchData(layerName) {\n if (this.api && this.stationId) {\n this._stations = await this.api.getStations();\n this._sortedStations = this._stations.sort((a, b) => {\n const aId = parseFloat(a.station_id);\n const bId = parseFloat(b.station_id);\n return aId > bId;\n });\n this._station = await this.api.getStation(this.stationId);\n await this._fetchMapData();\n\n if (\n this.parameterFilterAttribute &&\n this._station[this.parameterFilterAttribute]\n ) {\n try {\n const filterList = JSON.parse(\n this._station[this.parameterFilterAttribute],\n );\n if (filterList.length) {\n this._station.timeseries = this._station.timeseries.filter(ts =>\n filterList.includes(ts.station_parameter),\n );\n this._station._links = this._station._links.filter(ts =>\n filterList.includes(ts.station_parameter),\n );\n }\n } catch (e) {\n console.error('invalid parameterFilterAttribute');\n }\n }\n const dynMenuItems = await this.loadDynamicMenu();\n const dynMenuSubPaths = [];\n dynMenuItems.forEach(item => {\n if (item.items) {\n item.items.forEach(i => dynMenuSubPaths.push(i));\n }\n });\n this.currentRoute.children = this.currentRoute.children.concat(\n dynMenuItems.concat(dynMenuSubPaths),\n );\n this.currentRoute.__children = this.currentRoute.__children.concat(\n dynMenuItems.concat(dynMenuSubPaths),\n );\n this._menuList = this._menuFilter(this._menuListRaw).concat(dynMenuItems);\n\n if (!this._menuList.some(item => item.path === this._selectedMenuItem)) {\n this._selectedMenuItem = null;\n }\n\n if (!this._selectedMenuItem) {\n const _flattenedList: Array = flatten(\n this._menuList.map(i => (i.items ? concat(i, i.items) : i)),\n );\n\n const initialSelection =\n find(_flattenedList, { detailSelection: `${layerName}` })?.path ||\n find(_flattenedList, i => {\n const l = i.aliasKeys || [];\n l.push(i.label);\n l.push(i.path.replace('/', ''));\n return l.includes(layerName);\n })?.path ||\n this.defaultSelection ||\n this._menuList[0]?.path;\n\n this._selectedMenuItem = initialSelection;\n }\n\n if (this.mobileAutoForward || ViewPort.size !== SM) {\n setTimeout(() => {\n navigateTo(`${this._mainRoute}${this._selectedMenuItem}`);\n }, 10);\n } else {\n setTimeout(() => {\n navigateTo(`${this._mainRoute}${this._selectedMenuItem}`);\n }, 10);\n }\n\n this.requestUpdate();\n }\n }\n\n async _fetchMapData() {\n const mapInfo = await this.api.getMapConfig();\n this._mapConfig = mapInfo;\n registerProjections(this._mapConfig);\n reproject([this._station], mapInfo); // check if we can do auto reproject in map.\n this._mapConfig.view.center = this._station.point;\n this._mapConfig.view.zoom =\n this._mapConfig.view.stationDetailZoom || this._mapConfig.view.zoom;\n }\n}\n","// const station = {\n// \"station_no\": [\"nlsLabel\", \"1430\"],\n// ...\n// \"data\": [[\"2021-03-16T00:00:00.000+01:00\", 185], [\"2021-03-16T00:15:00.000+01:00\", 184]]\n// };\n\n/**\n * Download station data as excel\n *\n * @param {object} station - The station data to be download\n * @param {object} [options] - Options to customize the excel content\n * {\n * name: \"excelfilename\",\n * sheetName: \"sheetname\",\n * meta: ['station_name', 'station_no', 'parametertype_name', 'ts_unitsymbol',...]\n * }\n */\nexport async function downloadExcel(station = {}, options = {}) {\n const XLSX = await import('xlsx');\n const wb = XLSX.utils.book_new();\n if (station) {\n const ws = XLSX.utils.aoa_to_sheet(station.metadata);\n // Add ts data\n XLSX.utils.sheet_add_aoa(ws, station.data, { origin: -1 });\n ws['!cols'] = [{ wch: 30 }];\n XLSX.utils.book_append_sheet(wb, ws, options.sheetName || 'Sheet1');\n }\n XLSX.writeFile(wb, `${options.name || 'download'}.xlsx`);\n}\n\n/**\n * Download station data as csv\n * @param {object} station - The station data to be download\n * @param {object} [options] - Options to customize the excel content\n * {\n * name: \"excelfilename\",\n * sheetName: \"sheetname\",\n * meta: ['station_name', 'station_no', 'parametertype_name', 'ts_unitsymbol',...]\n * }\n */\nexport async function downloadCSV(station = {}, options = {}) {\n const XLSX = await import('xlsx');\n const wb = XLSX.utils.book_new();\n if (station) {\n const ws = XLSX.utils.aoa_to_sheet(\n station.metadata.map(item => ['#', ...item]),\n );\n // Add ts data\n XLSX.utils.sheet_add_aoa(ws, station.data, { origin: -1 });\n XLSX.utils.book_append_sheet(wb, ws, options.sheetName || 'Sheet1');\n }\n XLSX.writeFile(wb, `${options.name || 'download'}.csv`, {\n bookType: 'csv',\n FS: '\\t',\n });\n}\n","/* eslint-disable max-classes-per-file */\nimport { css, html, LitElement } from 'lit';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { customElement } from 'lit/decorators.js';\nimport {\n template,\n deUmlaut,\n Mix,\n downloadFile,\n copyTextToClipboard,\n} from '@kisters/wcp-base/common';\n\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport { first, keyBy, last } from 'lodash-es';\nimport { responsiveMixin, i18nMixin } from '@kisters/wcp-base/decorators';\nimport { getCurrentApi } from '@kisters/wiski-web/api';\nimport { getRouteOptionsAndParams } from '@kisters/wcp-base/components';\nimport nls from '@kisters/wcp-water/locales';\n\nimport '@ui5/webcomponents/dist/Toast';\n\nimport { downloadExcel } from '../../common/download';\n\n@customElement('wwp-station-download')\nexport default class WwpStationDownload extends Mix(\n LitElement,\n responsiveMixin,\n [i18nMixin, { nls }],\n) {\n static styles = css`\n :host {\n height: 100%;\n width: 100%;\n overflow: auto;\n display: flex;\n flex-wrap: wrap;\n }\n\n .content {\n margin: 15pt;\n height: auto;\n }\n\n :host(.sm-screen) .content,\n :host(.md-screen) .content {\n width: 100%;\n margin: 15pt 0;\n display: table;\n }\n\n .cellheader {\n hyphens: auto;\n text-align: center;\n }\n\n .cell.iconcell {\n text-align: center;\n white-space: nowrap;\n }\n\n .content {\n padding: 2%;\n }\n\n .dltable {\n display: table;\n width: 100%;\n table-layout: fixed;\n max-width: 800px;\n }\n .header {\n padding: 10px;\n }\n .row {\n display: table-row;\n }\n .cell {\n display: table-cell;\n padding: 10px 2%;\n vertical-align: middle;\n hyphens: auto;\n overflow-x: hidden;\n word-wrap: break-word;\n }\n .innerCell {\n display: inline;\n font-size: 1.5em;\n }\n\n .label,\n ki-icon {\n fill: gray;\n padding: 5px;\n }\n ki-icon:hover {\n cursor: pointer;\n }\n .descr {\n font-weight: 900;\n padding: 30px 10px;\n }\n\n .hidden {\n display: none;\n }\n `;\n\n static get properties() {\n return {\n station: { type: Object },\n };\n }\n\n _showUTCDates = false;\n\n csvSeparator = '\\t';\n\n dataColumn = ['Timestamp', 'Value', 'Quality Code Name'];\n\n dataColumnLabels = ['Zeitpunkt', 'Messwert', 'Status'];\n\n dataColumnLabelsAggr = [\n 'Tag',\n 'Tages Minimum',\n 'Tages Mittel',\n 'Tages Maximum',\n 'Status',\n ];\n\n api = getCurrentApi();\n\n connectedCallback() {\n if (super.connectedCallback) super.connectedCallback();\n this.numberFormatter = new Intl.NumberFormat(\n this.i18n.language,\n this.numberFormat || {},\n );\n }\n\n async onAfterEnter(location) {\n const params = getRouteOptionsAndParams(location, ['stationId']);\n this.station = await this.api.getStation(params.stationId);\n Object.assign(this, params.options);\n }\n\n getFile(\n filename: string,\n param: string,\n mimeType: string = 'application/json',\n ) {\n return this.station.timeseries.filter(\n item =>\n item.station_parameter === param &&\n item.href.includes(filename) &&\n item.mime_type === mimeType,\n );\n }\n\n getParameter(param) {\n return this.parameterMapping[param] || param;\n }\n\n getPeriod(period, resolution = null) {\n if (!period) {\n return resolution;\n }\n let ret = dayjs.duration(period).humanize();\n if (period === 'PoR') {\n ret = this.i18n.t('complete');\n }\n if (resolution) {\n ret += ` ${this.i18n.t('as')} ${resolution}`;\n }\n // Return with Capital letter\n return ret.charAt(0).toUpperCase() + ret.slice(1);\n }\n\n render() {\n return this.station\n ? html`
\n
${unsafeHTML(this.descr)}
\n
\n ${this._renderHeader()}\n ${this.periods.map(per => html`${this._renderRow(per)}`)}\n
\n ${this.additionalDownloads()}\n
\n ${this.i18n.t('copytoclipboard')}`\n : html`
Loading...
`;\n }\n\n // eslint-disable-next-line class-methods-use-this\n additionalDownloads() {\n return html``;\n }\n\n _renderHeader() {\n return html`
\n
\n ${this.params\n .filter(item =>\n this.station.timeseries.some(\n ts => ts.station_parameter === item.parameter,\n ),\n )\n .map(\n field =>\n html`
${field.label}
`,\n )}\n
`;\n }\n\n _checkVisibility(per, parameter) {\n const list =\n per.type === 'file' ? this.station.zips : this.station.timeseries;\n const token = per.file[parameter] || per.file;\n\n if (Array.isArray(token)) {\n return list.some(\n ts =>\n ts.station_parameter === parameter &&\n token.some(t => ts.href.endsWith(t)),\n );\n }\n return list.some(\n ts => ts.station_parameter === parameter && ts.href.endsWith(token),\n );\n }\n\n _getCSVDownloadIcon(per, field) {\n const format = 'csv';\n if (per.type !== 'file') {\n return html`
\n \n
`;\n }\n const filehref = this.getDownloadFileHref(\n per.file,\n field.parameter,\n format,\n );\n if (!filehref) {\n return html``;\n }\n return html`
\n \n \n
\n
\n {\n const link = document.createElement('a');\n link.href = filehref;\n copyTextToClipboard(\n `${link.protocol}//${link.host}${link.pathname}${link.search}${link.hash}`,\n );\n this.renderRoot.querySelector('#wcToastShort').show();\n }}\"\n >\n
`;\n }\n\n _renderRow(per) {\n return html`
\n
${this.getPeriod(per.period, per.resolution)}
\n ${this.params\n .filter(item =>\n this.station.timeseries.some(\n ts => ts.station_parameter === item.parameter,\n ),\n )\n .map(\n field => html`
\n ${this._getCSVDownloadIcon(per, field)}\n
\n \n
\n
`,\n )}\n
`;\n }\n\n _getAggrData(data, minDate) {\n let minTs;\n let meanTs;\n let maxTs;\n data.forEach(ts => {\n if (ts.ts_shortname.includes('Min')) {\n minTs = keyBy(ts.data, o => o[0]);\n } else if (ts.ts_shortname.includes('Max')) {\n maxTs = keyBy(ts.data, o => o[0]);\n } else if (ts.ts_shortname.includes('Mean')) {\n meanTs = keyBy(ts.data, o => o[0]);\n }\n });\n\n const cols = data[0].columns.split(',');\n const releaseStatusIndex = cols.indexOf('Release State');\n const qualityCodeNameIndex = cols.indexOf('Quality Code');\n\n const rows = [];\n Object.keys(meanTs).forEach(k => {\n if (new Date(k).getTime() > minDate) {\n const row = [\n this._showUTCDates\n ? dayjs(k).utc().format('L')\n : dayjs(k).format('L'),\n minTs[k] ? this.numberFormatter.format(minTs[k][1]) : '',\n meanTs[k] ? this.numberFormatter.format(meanTs[k][1]) : '',\n maxTs[k] ? this.numberFormatter.format(maxTs[k][1]) : '',\n ];\n\n if (releaseStatusIndex !== -1) {\n const releaseState =\n this.releaseStates[meanTs[k][releaseStatusIndex]] ||\n this.releaseStates.default;\n row.push(releaseState);\n }\n\n if (qualityCodeNameIndex !== -1) {\n row.push(meanTs[k][qualityCodeNameIndex]);\n }\n\n rows.push(row);\n }\n });\n return rows;\n }\n\n _getData(data, minDate) {\n const cols = data[0].columns.split(',');\n\n const releaseStatusIndex = cols.indexOf('Release State');\n const qualityCodeNameIndex = cols.indexOf('Quality Code');\n\n const rows = [];\n console.time('start download parsing');\n data[0].data.forEach(item => {\n const datems = new Date(item[0]).getTime();\n if (datems > minDate) {\n const row = [\n this._showUTCDates\n ? dayjs(datems).utc().format('L LT')\n : dayjs(datems).format('L LT'),\n item[1] === null ? '' : this.numberFormatter.format(item[1]),\n ];\n\n if (releaseStatusIndex !== -1) {\n const releaseState =\n this.releaseStates[item[releaseStatusIndex]] ||\n this.releaseStates.default;\n row.push(releaseState);\n }\n\n if (qualityCodeNameIndex !== -1) {\n row.push(item[qualityCodeNameIndex]);\n }\n rows.push(row);\n }\n });\n console.timeEnd('start download parsing');\n return rows;\n }\n\n getDownloadFileHref(\n file: string | Array | Object,\n parameter: string,\n format: 'csv' | 'xlsx' | 'xls',\n ): string {\n let dlfiles: Array<{\n href: string;\n mime_type: string;\n period_alias: string;\n purpose: Array;\n station_parameter: string;\n type: string;\n }> = this.station.zips.filter(item => {\n if (item.station_parameter !== parameter) {\n return false;\n }\n const fileParam = file[parameter];\n if (fileParam) {\n return item.href.endsWith(file[parameter]);\n }\n if (Array.isArray(file)) {\n return file\n .map(f => item.href.endsWith(f))\n .reduce((prev, curr) => prev || curr);\n }\n return item.href.endsWith(file);\n });\n\n if (dlfiles.length > 1) {\n dlfiles = dlfiles.filter(file =>\n format === 'xls'\n ? file.href.endsWith('xls') || file.href.endsWith('xlsx')\n : file.href.endsWith(format),\n );\n }\n\n if (dlfiles.length < 1) {\n return null;\n }\n\n return this.api.getLink(`/${dlfiles[0].href}`);\n }\n\n async download(evt) {\n const format = evt.target.fileformat;\n const { period, file, type, resolution } = evt.target.period;\n const { parameter, label } = evt.target.value;\n\n const tsShortname =\n evt.target.period.ts_shortname || evt.target.value.ts_shortname;\n if (type === 'file') {\n const dlfile = this.getDownloadFileHref(file, parameter, format);\n if (dlfile) {\n window.open(dlfile);\n }\n }\n const datafile = first(\n typeof file === 'object'\n ? this.getFile(file[parameter], parameter)\n : this.getFile(file, parameter),\n );\n if (datafile && type !== 'file') {\n let tsdata = await this.api.getTsData(datafile.href);\n if (tsShortname && type !== 'agg') {\n tsdata = tsdata.filter(item => item.ts_shortname === tsShortname);\n }\n if (tsdata[0] && tsdata[0].data[0]) {\n const mdList = { ...this.station, ...tsdata[0] };\n mdList.creation = dayjs().tz().format('L LT');\n mdList.resolution = resolution;\n const minDate =\n period === 'PoR'\n ? -Infinity\n : dayjs().tz().subtract(dayjs.duration(period)).valueOf();\n const data =\n type === 'agg' && tsdata.length > 1\n ? this._getAggrData(tsdata, minDate)\n : this._getData(tsdata, minDate);\n // eslint-disable-next-line prefer-destructuring\n mdList.from = data[0]?.[0];\n mdList.to = last(data)?.[0];\n const filename = this.filename\n ? `${template(this.filename, mdList)}_${this.getPeriod(period)}`\n : `${dayjs().tz().format('L')}_${\n this.station.station_longname\n }_${label}_${this.getPeriod(period)}`;\n const mdfields = this.mdfields.map(item => [\n this.mdlabels[item] || this.i18n.t(`kiwis:${item}`),\n this.mdValues[item] || mdList[item],\n ]);\n\n const header =\n type === 'agg' && tsdata.length > 1\n ? [this.dataColumnLabelsAggr]\n : [this.dataColumnLabels];\n\n if (format === 'xls') {\n downloadExcel(\n {\n metadata: mdfields.concat(header),\n data,\n },\n {\n sheetName:\n type === 'agg' && tsdata.length > 1\n ? this.i18n.t('dailydata')\n : this.i18n.t('complete'),\n name: deUmlaut(filename),\n },\n );\n } else {\n let csvResult = mdfields\n .map(item => `#${item.join(': ')}`)\n .join('\\r\\n');\n csvResult += `\\r\\n${header\n .map(item => `${item.join(this.csvSeparator)}`)\n .join('\\r\\n')}`;\n csvResult += `\\r\\n${data\n .map(item => `${item.join(this.csvSeparator)}`)\n .join('\\r\\n')}`;\n downloadFile(csvResult, deUmlaut(filename));\n }\n }\n }\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport {\n Mix,\n LoaderMixin,\n PropertyDefaultValue,\n} from '@kisters/wcp-base/common';\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport { getRouteOptionsAndParams } from '@kisters/wcp-base/components';\nimport { getCurrentApi } from '../../api/API';\nimport nls from '../../locales/index';\n\n@customElement('wwp-html')\nexport default class WwpHtml extends Mix(\n LitElement,\n LoaderMixin,\n PropertyDefaultValue,\n [i18nMixin, { nls }],\n) {\n api = getCurrentApi();\n\n static styles = css`\n :host {\n display: flex;\n width: 100%;\n height: 100%;\n }\n iframe {\n flex: 1;\n width: 100%;\n height: 100%;\n border: none;\n }\n a {\n font-size: 2em;\n text-align: center;\n display: block;\n margin-top: 20%;\n }\n `;\n\n @property({ type: String })\n content;\n\n @property({ type: String })\n type;\n\n // Vaadin Router Method that gets called after this component is called\n // eslint-disable-next-line no-unused-vars\n onAfterEnter(location) {\n const params = getRouteOptionsAndParams(location, ['content']);\n\n this.content = params.content ?? params.options?.content;\n const { contentFolder } = params.options;\n this.contentFolder =\n contentFolder === undefined ? 'html' : params.options.contentFolder;\n this.type = params.options.type || 'html';\n this.basePath = params.options.basePath || './';\n }\n\n renderHTML() {\n return html``;\n }\n\n /* eslint-disable lit/no-invalid-html */\n renderPDF() {\n this.basePath = this.basePath || '';\n this.contentFolder = this.contentFolder || '';\n\n const fullurl = new URL(\n `${this.basePath}${this.contentFolder}/${this.content}.${this.type}`,\n window.location.origin,\n ).href;\n return html``;\n }\n /* eslint-enable lit/no-invalid-html */\n\n render() {\n // language=html\n return this.type === 'pdf' ? this.renderPDF() : this.renderHTML();\n }\n}\n","import { html, css, LitElement } from 'lit';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { Mix } from '@kisters/wcp-base/common';\nimport { queryParamMixin } from '@kisters/wcp-base/decorators';\nimport { getRouteOptionsAndParams } from '@kisters/wcp-base/components';\nimport { getCurrentApi } from '@kisters/wiski-web/api';\nimport '@ui5/webcomponents/dist/Select';\nimport '@ui5/webcomponents/dist/Option';\nimport { customElement } from 'lit/decorators.js';\nimport { filter, last, orderBy } from 'lodash-es';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\n\n@customElement('ww-report')\nexport default class WwReport extends Mix(LitElement, [\n queryParamMixin,\n { targetProperty: 'selected', selector: 'selected', defaultValue: '' },\n]) {\n // language=css\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n height: calc(100% - 30px);\n }\n iframe {\n width: 100%;\n height: 100%;\n border: none;\n }\n .left-panel {\n text-align: center;\n flex: 0;\n }\n .right-panel {\n flex: 1;\n }\n\n ui5-select {\n width: 350px;\n }\n\n a {\n font-size: 2em;\n text-align: center;\n display: block;\n margin-top: 20%;\n }\n `;\n\n constructor() {\n super();\n this.api = getCurrentApi();\n this.data = [];\n }\n\n static get properties() {\n return {\n data: { type: Array },\n };\n }\n\n _selected = '';\n\n get selected() {\n return this._selected;\n }\n\n set selected(value) {\n this._selected = value;\n this.requestUpdate();\n }\n\n // Vaadin Router Method that gets called after this component is called\n // eslint-disable-next-line no-unused-vars\n async onAfterEnter(location) {\n const params = getRouteOptionsAndParams(location, ['content']);\n this.content = params.content;\n // Usually \"documents\" or \"reports\"\n this.directory = params.options?.directory || 'documents';\n\n this.fetchData();\n }\n\n // Fetch report\n async fetchData() {\n const res = await this.api._requestJson(\n `/${this.directory}/index.json`,\n undefined,\n true,\n );\n\n // Filter reports; only allow visible PDF\n this.data = orderBy(\n filter(res._links, d => {\n if (\n d.mime_type === 'application/pdf' &&\n d.id === this.content &&\n d.visible\n ) {\n const pathArray = d.href.split('/');\n d.date = pathArray[pathArray.length - 2];\n d.filename = last(pathArray);\n d.label = dayjs(d.date, 'YYYYMMDDHHmm').format('L LT'); // `${d.filename} (${d.date})`;\n return true;\n }\n return false;\n }),\n 'date',\n 'desc',\n ); // Newest file on first position\n this.requestUpdate();\n }\n\n updated() {\n // eslint-disable-next-line no-unused-expressions\n this.data?.length > 0 &&\n this._handleChanged({\n target: {\n selectedOption: { value: this.data[0].date },\n },\n });\n }\n\n getUrl(file) {\n return `${this.api.dataPath}/${this.directory}/${this.content}/${file}`;\n }\n\n _handleChanged(e) {\n // http://localhost:3000/data/internet/reports/daily-flood-guidance/202203111336/report.pdf\n // http://localhost:3000/data/internet/reports/daily-flood-guidance/202203171340/report.pdf\n // http://localhost:3000/data/internet/reports/flood-alert/202203111336/report.pdf\n const pdfurl = `${this.api.dataPath}/${this.directory}/${this.content}/${e.target.selectedOption.value}/report.pdf`;\n this.renderRoot.querySelector(\n '#contentframe',\n ).src = `./pdfjs/web/viewer.html?file=${\n new URL(pdfurl, window.location.origin).href\n }`;\n }\n\n render() {\n // language=html\n return this.data\n ? html`\n
\n \n ${this.data.map(\n item =>\n html`${item.label.replace('.pdf', '')}`,\n )}\n \n
\n
\n \n
\n `\n : html`
Loading...
`;\n }\n}\n","import { html, css, LitElement } from 'lit';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { Mix } from '@kisters/wcp-base/common';\nimport { queryParamMixin } from '@kisters/wcp-base/decorators';\nimport { getRouteOptionsAndParams } from '@kisters/wcp-base/components';\nimport { getCurrentApi } from '@kisters/wiski-web/api';\nimport '@ui5/webcomponents/dist/Select';\nimport '@ui5/webcomponents/dist/Option';\nimport { customElement } from 'lit/decorators.js';\nimport { filter } from 'lodash-es';\n\n@customElement('ww-documents')\nexport default class WwDocuments extends Mix(LitElement, [\n queryParamMixin,\n { targetProperty: 'selected', selector: 'selected', defaultValue: '' },\n]) {\n // language=css\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n height: calc(100% - 30px);\n }\n iframe {\n width: 100%;\n height: 100%;\n border: none;\n }\n .left-panel {\n text-align: center;\n flex: 0;\n }\n .right-panel {\n flex: 1;\n }\n\n ui5-select {\n width: 350px;\n }\n\n a {\n font-size: 2em;\n text-align: center;\n display: block;\n margin-top: 20%;\n }\n `;\n\n constructor() {\n super();\n this.api = getCurrentApi();\n this.data = [];\n }\n\n static get properties() {\n return {};\n }\n\n _selected = '';\n\n get selected() {\n return this._selected;\n }\n\n set selected(value) {\n this._selected = value;\n this.requestUpdate();\n }\n\n // Vaadin Router Method that gets called after this component is called\n // eslint-disable-next-line no-unused-vars\n async onAfterEnter(location) {\n const params = getRouteOptionsAndParams(location, ['content']);\n const baseDir = params.options?.directory ?? 'documents';\n this.directory = `${baseDir}/${params.content}`;\n\n this.fetchData();\n }\n\n // Fetch report\n async fetchData() {\n const res = await this.api._requestJson(`/${this.directory}/index.json`);\n this.data = res.data;\n\n // Filter reports; only allow visible PDF\n this.data = filter(\n this.data,\n d => d.mimeType === 'application/pdf',\n ).reverse(); // Newest file on first position\n this._setDocument(this.data[0].name);\n this.requestUpdate();\n }\n\n getUrl(file) {\n return `${this.api.dataPath}/${this.directory}/${file}`;\n }\n\n _setDocument(pdf) {\n const pdfurl = `${this.api.dataPath}/${this.directory}/${pdf}`;\n this.renderRoot.querySelector(\n '#contentframe',\n ).src = `./pdfjs/web/viewer.html?file=${\n new URL(pdfurl, window.location.origin).href\n }`;\n }\n\n _handleChanged(e) {\n this._setDocument(e.target.selectedOption.value);\n }\n\n render() {\n // language=html\n return this.data\n ? html`\n
\n \n ${this.data.map(\n item =>\n html`${item.name.replace('.pdf', '')}`,\n )}\n \n
\n
\n \n
\n `\n : html`
Loading...
`;\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport { html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport {\n KiApp,\n navigateTo,\n getSearchParamString,\n getCurrentPath,\n getNavItems,\n getLogoOptions,\n} from '@kisters/wcp-base/components';\nimport {\n SM,\n ViewPort,\n responsiveMixin,\n i18nMixin,\n} from '@kisters/wcp-base/decorators';\nimport { Mix } from '@kisters/wcp-base/common';\nimport style from './ki-app-wwp.css?inline';\nimport nls from '../../locales/index';\nimport '../ki-menu/ki-menu';\n\nimport '../wwp-station-ts-viewer/wwp-station-ts-viewer';\nimport '../../views/wwp-overview/wwp-overview';\nimport '../../views/wwp-overview/ww-raster-overview';\nimport '../../views/wwp-station-detail/wwp-station-detail';\nimport '../../views/wwp-station-detail/wwp-station-download';\nimport '../../views/wwp-html/wwp-html';\nimport '../../views/ww-report/ww-report';\nimport '../../views/ww-report/ww-documents';\n\nimport { getCurrentApi } from '../../api/API';\n// import '@ui5/webcomponents/dist/Assets';\n// import '@ui5/webcomponents-fiori/dist/Assets';\n// import '@ui5/webcomponents-icons/dist/Assets';\n// import { setLanguage } from '@ui5/webcomponents-base/dist/config/Language.js';\n// setLanguage('de'); // Set language directly in project app (!)\n\n@customElement('ki-app-wwp')\nexport default class KiAppWWP extends Mix(KiApp, responsiveMixin, [\n i18nMixin,\n { nls },\n]) {\n static styles = [KiApp.styles, style];\n\n constructor() {\n super();\n\n dayjs.locale(this.i18n.language.toLowerCase());\n this.basePath = './public';\n this.nls = `${this.basePath}/nls/route.json`;\n this.configSubPath = 'config';\n }\n\n static get properties() {\n return {\n basePath: { type: String },\n configSubPath: { type: String },\n _config: { type: Object },\n };\n }\n\n // eslint-disable-next-line class-methods-use-this\n get api() {\n return getCurrentApi();\n }\n\n // eslint-disable-next-line class-methods-use-this\n getNavigationItems() {\n return getNavItems();\n }\n\n _renderMenu() {\n const menuMode = ViewPort.size === SM ? 'vertical' : 'horizontal';\n // language=html\n return html`\n {\n const currentQuery = getSearchParamString();\n const currentViewType = getCurrentPath().replace(/[^/]+$/, '');\n const newViewType = e.detail.value.replace(/[^/]+$/, '');\n let newUrl = e.detail.value;\n if (currentViewType === newViewType) {\n newUrl = `${newUrl}${\n currentQuery.charAt(0) === '?' ? '' : '?'\n }${currentQuery}`;\n }\n navigateTo(newUrl);\n }}\"\n .items=\"${this.getNavigationItems()}\"\n >\n `;\n }\n\n _renderDrawer() {\n return html`\n
\n
\n ${this._renderMenu()}\n
\n `;\n }\n\n /* TODO make logo as slot ? */\n _renderHeader() {\n const logoOptions = getLogoOptions() || {};\n return html`\n \n
\n \n
\n \n \n
\n
${ViewPort.size === SM ? '' : this._renderMenu()}
\n
\n \n \n
\n
\n `;\n }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('ki-content-slider')\nexport default class KiContentSlider extends LitElement {\n static get styles() {\n return css`\n :host {\n --main-color: #000;\n --slides-bg-color: #fff;\n --slides-border: 10px solid var(--slides-bg-color);\n --slides-border-radius: 0px;\n --slides-padding: 0;\n --slides-width: 820px;\n --slides-height: 620px;\n --hover-arrow-color: #ff0;\n --nav-point-color: #3a3a3a;\n height: 100%;\n overflow-x: hidden;\n text-align: center;\n font: 400 100% 'Raleway', 'Lato';\n background-color: transparent;\n color: var(--main-color);\n padding-bottom: 60px;\n }\n img {\n object-fit: contain;\n height: 100%;\n width: 100%;\n }\n .csslider {\n text-align: center;\n -moz-perspective: 1300px;\n -ms-perspective: 1300px;\n -webkit-perspective: 1300px;\n perspective: 1300px;\n display: inline-block;\n position: relative;\n margin-bottom: 22px;\n }\n .csslider > input {\n display: none;\n }\n .csslider > ul {\n position: absolute;\n bottom: 0;\n top: 0;\n z-index: 1;\n font-size: 0;\n line-height: 0;\n background-color: var(--slides-bg-color);\n border: var(--slides-border);\n border-radius: var(--slides-border-radius);\n margin: 0 auto;\n left: 0;\n right: 0;\n text-align: center;\n padding: 0;\n overflow: hidden;\n white-space: nowrap;\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n }\n .csslider > ul > li {\n position: relative;\n display: inline-block;\n width: 100%;\n height: 100%;\n padding: var(--slides-padding);\n overflow: hidden;\n font-size: initial;\n line-height: normal;\n -moz-transition: all 0.5s cubic-bezier(0.4, 1.3, 0.65, 1);\n -o-transition: all 0.5s ease-out;\n -webkit-transition: all 0.5s cubic-bezier(0.4, 1.3, 0.65, 1);\n transition: all 0.5s cubic-bezier(0.4, 1.3, 0.65, 1);\n vertical-align: top;\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n white-space: normal;\n }\n .csslider > ul > li.scrollable {\n overflow-y: scroll;\n }\n .csslider > .navigation {\n position: absolute;\n bottom: -8px;\n left: 50%;\n z-index: 10;\n margin-bottom: -10px;\n font-size: 0;\n line-height: 0;\n text-align: center;\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n }\n .csslider > .navigation > div {\n margin-left: -100%;\n }\n .csslider > .navigation label {\n position: relative;\n display: inline-block;\n cursor: pointer;\n border-radius: 50%;\n margin: 0 4px;\n padding: 4px;\n background: var(--nav-point-color);\n }\n .csslider > .navigation label:hover:after {\n opacity: 1;\n }\n .csslider > .navigation label:after {\n content: '';\n position: absolute;\n left: 50%;\n top: 50%;\n margin-left: -6px;\n margin-top: -6px;\n background: #71ad37;\n border-radius: 50%;\n padding: 6px;\n opacity: 0;\n }\n .csslider > .arrows {\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n z-index: 5;\n }\n .csslider.inside .navigation {\n bottom: 10px;\n margin-bottom: 10px;\n }\n .csslider.inside .navigation label {\n border: 1px solid #7e7e7e;\n }\n .csslider > .arrows {\n position: absolute;\n left: 10%;\n top: 50%;\n width: 80%;\n height: 26px;\n z-index: 6;\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box;\n box-sizing: content-box;\n }\n .csslider > .arrows label {\n display: none;\n position: absolute;\n top: -50%;\n padding: 13px;\n box-shadow: inset 2px -2px 0 1px var(--main-color);\n cursor: pointer;\n -moz-transition: box-shadow 0.15s, margin 0.15s;\n -o-transition: box-shadow 0.15s, margin 0.15s;\n -webkit-transition: box-shadow 0.15s, margin 0.15s;\n transition: box-shadow 0.15s, margin 0.15s;\n }\n .csslider > .arrows label:hover {\n box-shadow: inset 3px -3px 0 2px var(--hover-arrow-color);\n margin: 0 0px;\n }\n .csslider > .arrows label:before {\n content: '';\n position: absolute;\n top: -100%;\n left: -100%;\n height: 300%;\n width: 300%;\n }\n .noshow {\n visibility: hidden;\n }\n\n ::-webkit-scrollbar {\n width: 2px;\n background: rgba(255, 255, 255, 0.1);\n }\n ::-webkit-scrollbar-track {\n background: none;\n }\n ::-webkit-scrollbar-thumb {\n background: rgba(74, 168, 0, 0.6);\n }\n ul,\n ol {\n padding-left: 40px;\n }\n #theslider {\n height: 100%;\n width: 100%;\n }\n .scrollable p {\n padding: 30px;\n text-align: justify;\n line-height: 140%;\n font-size: 120%;\n }\n\n @-webkit-keyframes sign-anim {\n to {\n background-position: 0 -7140px;\n }\n }\n @-moz-keyframes sign-anim {\n to {\n background-position: 0 -7140px;\n }\n }\n @keyframes sign-anim {\n to {\n background-position: 0 -7140px;\n }\n }\n `;\n }\n\n static get properties() {\n return {\n numslides: { type: Number },\n arrayContent: { type: Array },\n master: { type: Boolean },\n masterId: { type: String, attribute: 'master-id' },\n slideChecked: { type: Number, attribute: 'slide-checked-number' },\n noNavigation: { type: Boolean, attribute: 'no-arrows' },\n noArrows: { type: Boolean, attribute: 'no-nav' },\n };\n }\n\n constructor() {\n super();\n this.master = false;\n this.masterId = '';\n this.slideChecked = 1;\n this.noArrows = false;\n this.noNavigation = false;\n }\n\n connectedCallback() {\n if (super.connectedCallback) super.connectedCallback();\n\n if (this.masterId !== '') {\n this.nextslide &&\n document.addEventListener(\n 'multicarouselnextslide',\n this.nextslide.bind(this),\n );\n }\n\n this.arrayContent = this.children;\n this.numslides = this.arrayContent.length + 1;\n // eslint-disable-next-line prefer-spread\n this.opArr = Array.apply(null, { length: this.numslides }).map(\n Number.call,\n Number,\n );\n this.opArr.shift(); // Delete 0 element\n\n this.cssliderStyles = html`${this.opArr\n .map(\n val =>\n `.csslider > input:nth-of-type(${val}):checked ~ ul li:first-of-type { margin-left: -${\n (val - 1) * 100\n }%; }`,\n )\n .join('\\n')}`;\n this.cssliderInputStyles = html`${this.opArr\n .map(\n val =>\n `.csslider > input:nth-of-type(${val}):checked ~ .navigation label:nth-of-type(${val}):after`,\n )\n .join(', ')}\n { opacity: 1; }`;\n this.cssliderInputCheckedStyles = html`.csslider.infinity >\n input:first-of-type:checked ~ .arrows label.goto-last,\n ${this.opArr\n .map(\n val =>\n `.csslider > input:nth-of-type(${val}):checked ~ .arrows > label:nth-of-type(${\n val - 1\n })`,\n )\n .join(', ')}\n { display: block; left: 0; right: auto; -moz-transform: rotate(45deg);\n -ms-transform: rotate(45deg); -o-transform: rotate(45deg);\n -webkit-transform: rotate(45deg); transform: rotate(45deg); }`;\n\n this.cssliderInfinityStyles = html`.csslider.infinity >\n input:last-of-type:checked ~ .arrows label.goto-first,\n ${this.opArr\n .map(\n val =>\n `.csslider > input:nth-of-type(${val}):checked ~ .arrows > label:nth-of-type(${\n val + 1\n })`,\n )\n .join(', ')}\n { display: block; right: 0; left: auto; -moz-transform: rotate(225deg);\n -ms-transform: rotate(225deg); -o-transform: rotate(225deg);\n -webkit-transform: rotate(225deg); transform: rotate(225deg); }`;\n this.htmlInputs = `${this.opArr.map(\n val => html``,\n )}`;\n }\n\n disconnectedCallback() {\n if (super.disconnectedCallback) super.disconnectedCallback();\n this.nextslide &&\n document.removeEventListener(\n 'multicarouselnextslide',\n this.nextslide.bind(this),\n );\n }\n\n nextslide(ev) {\n const masterId = ev.detail.masterid;\n if (masterId === this.masterId) {\n const { slide } = ev.detail;\n this.shadowRoot.querySelector(`label[for=\"slides_${slide}\"]`).click();\n }\n }\n\n _gotonav(ev) {\n const slideChecked = ev.target.getAttribute('for').split('_')[1];\n if (this.master) {\n const event = new CustomEvent('multicarouselnextslide', {\n detail: {\n masterid: this.id,\n slide: slideChecked,\n },\n });\n document.dispatchEvent(event);\n }\n }\n\n _getNav() {\n const arrowClass = this.masterId !== '' ? 'noshow' : '';\n const arrows = html`
\n ${this.opArr.map(\n val =>\n html``,\n )}\n \n \n
`;\n return arrows;\n }\n\n _getArrows() {\n const nav = html`
\n
\n ${this.opArr.map(\n val =>\n html``,\n )}\n
\n
`;\n return this.masterId !== '' ? '' : nav;\n }\n\n render() {\n return html`\n \n
\n ${this.opArr.map(val => {\n let res;\n if (val !== 1) {\n res = html``;\n } else {\n res = html``;\n }\n return res;\n })}\n
    \n ${this.opArr.map(val => html`
  • ${this.arrayContent[val - 1]}
  • `)}\n
\n\n ${this.noArrows ? '' : this._getArrows()}\n ${this.noNavigation ? '' : this._getNav()}\n
\n `;\n }\n}\n","/* eslint-disable max-classes-per-file */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { Mix } from '@kisters/wcp-base/common';\nimport { responsiveMixin } from '@kisters/wcp-base/decorators';\n\n// @ts-expect-error\n@customElement('ki-wwp-switcher-bottom')\nexport default class KiWwpSwitcherBottom extends Mix(\n LitElement,\n responsiveMixin,\n) {\n static styles = css`\n :host {\n display: flex;\n box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),\n 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);\n border-radius: 30px;\n font-size: 0;\n overflow: visible;\n }\n .tab {\n background: white;\n color: var(--theme-color-primary, #1d1d1b);\n display: flex;\n padding: 8px 10px;\n min-width: 40px;\n text-align: center;\n cursor: pointer;\n user-select: none;\n position: relative;\n font-size: 14px;\n line-height: 24px;\n align-items: center;\n justify-content: center;\n }\n\n ki-icon {\n margin-right: 5px;\n font-size: 1.3em;\n }\n div.tab.selected {\n color: var(--theme-text-color, #ffffff);\n background: linear-gradient(\n 360deg,\n var(--theme-color-primary) 5px,\n rgb(255, 255, 255) 0%\n );\n font-weight: bold;\n transition: all 1s fade;\n }\n div.tab:hover {\n background-position: 10px;\n color: var(--theme-text-color, #ffffff);\n font-weight: bold;\n }\n\n .tab .label {\n font-size: 1.5em;\n }\n :host(.sm-screen) ki-icon {\n font-size: 1.5em;\n margin-right: 0;\n }\n :host(.sm-screen) .tab {\n min-width: initial;\n padding: 9px 10px;\n }\n :host(.sm-screen) .tab span.label {\n display: initial;\n font-size: 1.2em;\n }\n `;\n\n static get properties() {\n return {\n options: { type: Array },\n value: { type: String },\n };\n }\n\n get selected() {\n const preselected = this.options.filter(opt => opt.selected);\n return preselected.length ? preselected[0].value : this.options[0].value;\n }\n\n render() {\n if (!this.options.length) {\n return html``;\n }\n this.value = this.value || this.selected;\n // language=html\n return html`\n ${this.options.map(\n (option, i) => html`\n {\n e.key === 'Enter' && this.switchTo(option);\n }}\"\n @click=\"${() => {\n this.switchTo(option);\n }}\"\n >\n
\n ${option?.badges?.map(\n badge =>\n html`\n ${badge.count}\n
`,\n )}\n \n ${option.icon\n ? ``\n : ``}\n ${option.label}\n \n `,\n )}\n `;\n }\n\n switchTo(option) {\n if (this.value !== option.value) {\n this.value = option.value;\n this.dispatchEvent(\n new CustomEvent('changed', {\n detail: { value: option.value, element: option },\n }),\n );\n }\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport { customElement } from 'lit/decorators.js';\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport {\n BaseTable,\n Export,\n ColumnFormatter,\n LazyRendering,\n ColumnHider,\n} from '@kisters/wcp-base/components';\nimport { Mix } from '@kisters/wcp-base/common';\nimport { css } from 'lit';\nimport nls from '../../locales/index';\n\n@customElement('ki-wwp-ts-table')\nexport default class KiWwpTsTable extends Mix(\n BaseTable,\n ColumnHider,\n LazyRendering,\n ColumnFormatter,\n Export,\n [i18nMixin, { nls }],\n) {\n static get styles() {\n return [\n super.styles,\n css`\n .col-value {\n text-align: right;\n }\n\n .header-cell-hider,\n .col-__options {\n display: none;\n }\n\n .header div.row {\n border-bottom: 1px solid darkgray;\n }\n\n .header .header-content {\n padding: 10px 5px;\n max-width: 140px;\n hyphens: auto;\n word-break: break-word;\n text-align: left;\n white-space: normal;\n border-bottom: none;\n }\n .table {\n font-size: 14px;\n }\n .table .header div.row {\n border-bottom: 2px solid darkgray;\n }\n .table .body .cell {\n padding: 5px 5px;\n }\n .row {\n cursor: default;\n }\n `,\n ];\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n :host {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n }\n\n ui5-button {\n cursor: pointer;\n margin: 0 0 5px 10px;\n }\n\n #nav-node {\n overflow: auto;\n padding: 5px 10px 0 5px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid gray;\n }\n\n #nav-node.hidden {\n display: none;\n }\n\n .hidden {\n display: none;\n }\n\n #nav-node .label {\n font-size: 1.5em;\n }\n\n ki-wwp-switcher-bottom {\n border-radius: 0;\n box-shadow: none;\n align-self: normal;\n }\n\n .actions {\n display: flex;\n }\n\n ki-icon-btn {\n margin: 5px;\n box-shadow: none;\n }\n\n .hideButton {\n display: none;\n }\n\n #chart-node {\n display: table-cell;\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n .contentnode {\n display: flex;\n flex: 1;\n }\n\n #table-wrapper {\n position: relative;\n overflow: auto;\n flex: 0 0 330px;\n }\n\n #table-wrapper.hidden {\n position: relative;\n overflow: auto;\n flex: 0 0 0;\n }\n\n ki-wwp-ts-table {\n position: absolute;\n height: 100%;\n width: 100%;\n }\n\n #chart-wrapper {\n position: relative;\n flex: 1;\n }\n\n :host(.sm-screen) .label {\n display: none;\n }\n\n :host(.sm-screen) ki-wwp-switcher-bottom {\n margin-left: 35pt;\n }\n\n :host(.sm-screen) .clipboard-btn {\n display: none;\n }\n\n :host(.sm-screen) #table-wrapper {\n flex: 1 1 100%;\n background: white;\n }\n\n :host(.sm-screen) #table-wrapper.hidden {\n position: relative;\n overflow: auto;\n flex: 0 0 0;\n }\n\n .highcharts-legend-checkbox {\n transform: translateY(-2px);\n }\n\n ui5-select {\n background: #eee;\n position: absolute;\n left: 50px;\n top: 10px;\n z-index: 1;\n }\n`;\n","import { last, union } from 'lodash-es';\n\nexport class PopupUtil {\n public static fileMatchesRange(tshref, ranges, alarms): boolean {\n const whitelist = union(\n ranges.map(r => r.data),\n alarms?.file,\n );\n const filename = last(tshref.split('/'));\n return whitelist.includes(filename);\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { last, merge, find, orderBy } from 'lodash-es';\nimport {\n i18nMixin,\n responsiveMixin,\n ViewPort,\n SM,\n queryParamMixin,\n localStorageMixin,\n} from '@kisters/wcp-base/decorators';\nimport './ki-wwp-switcher-bottom';\nimport {\n LoaderMixin,\n template,\n copyTextToClipboard,\n Mix,\n} from '@kisters/wcp-base/common';\nimport { getRouteOptionsAndParams } from '@kisters/wcp-base/components';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport './ki-wwp-ts-table.js';\nimport hclocales from '@kisters/wcp-water/common/highcharts-locales.js';\nimport Highcharts from 'highcharts/highstock';\nimport exporting from 'highcharts/modules/exporting';\nimport patternFill from 'highcharts/modules/pattern-fill';\nimport offlineexporting from 'highcharts/modules/offline-exporting';\nimport nodata from 'highcharts/modules/no-data-to-display';\n\nimport { getCsvDelimiter } from '@kisters/wcp-base/components/ki-app/services/ki-app-config-service';\nimport { getCurrentApi } from '../../api/API';\n\nimport nls from '../../locales/index';\nimport style from './ki-wwp-graph-precip.css?inline';\n\nimport '@ui5/webcomponents/dist/Button';\nimport '@ui5/webcomponents/dist/Select';\nimport '@ui5/webcomponents/dist/Option';\nimport { PopupUtil } from './ki-wwp-graph-helper';\n\nexporting(Highcharts);\npatternFill(Highcharts);\nofflineexporting(Highcharts);\nnodata(Highcharts);\n\n@customElement('ki-wwp-graph-precip')\nexport default class KiWwpGraphPrecip extends Mix(\n LitElement,\n LoaderMixin,\n responsiveMixin,\n [i18nMixin, { nls }],\n [\n localStorageMixin,\n { targetProperty: '__favouriteStationIds', typeParam: Array },\n ],\n [\n queryParamMixin,\n {\n targetProperty: '_selectedPeriod',\n selector: 'period',\n defaultValue: '',\n },\n ],\n) {\n highcharts = Highcharts;\n\n miniGraph = false;\n\n imageShareAutoOpen = false;\n\n filterAccuracy = 66;\n\n ignoreAccuracy = false;\n\n sharedTooltip = true;\n\n zoomType = 'x';\n\n // eslint-disable-next-line class-methods-use-this\n get localStorageId() {\n return `wwp-favorites-ids`;\n }\n\n ___favouriteStationIds = [];\n\n get __favouriteStationIds() {\n return this.___favouriteStationIds;\n }\n\n set __favouriteStationIds(value) {\n this.___favouriteStationIds = value;\n this.requestUpdate();\n }\n\n __selectedPeriod;\n\n get _selectedPeriod() {\n return this.__selectedPeriod;\n }\n\n set _selectedPeriod(value) {\n this.__selectedPeriod = value;\n this.requestUpdate();\n }\n\n favButton = false;\n\n static styles = style;\n\n firstUpdated() {\n if (!this.miniGraph) {\n this.refreshInterval = setInterval(() => {\n this.fetchData();\n }, 300000);\n }\n Object.assign(this, this.options);\n if (\n this.renderRoot.host.classList.contains('sm-screen') ||\n this.miniGraph\n ) {\n this.tableOpen = false;\n }\n this.numberFormatter = new Intl.NumberFormat(\n this.i18n.language,\n this.numberFormat || {},\n );\n this.api = getCurrentApi();\n this.fetchData();\n }\n\n async onAfterEnter(location) {\n const params = getRouteOptionsAndParams(location, [\n 'layerName',\n 'stationId',\n 'stationLabel',\n ]);\n\n Object.assign(this, JSON.parse(JSON.stringify(params.options)));\n this.layerName = params.layerName;\n this.apppath = location.route;\n this.stationId = params.stationId;\n }\n\n isFavorite() {\n return this.__favouriteStationIds.indexOf(this.station?.station_id) >= 0;\n }\n\n _toggleFavourite() {\n if (this.__favouriteStationIds.indexOf(this.station.station_id) === -1) {\n this.__favouriteStationIds = [\n ...this.__favouriteStationIds,\n this.station.station_id,\n ];\n } else {\n this.__favouriteStationIds = this.__favouriteStationIds.filter(\n id => id !== this.station.station_id,\n );\n }\n }\n\n getImageShare() {\n return this.api\n ? `${window.location.origin}${window.location.pathname.replace(\n /[^/]*$/,\n '',\n )}graph.html?stationId=${\n this.station.station_id\n }&component=ki-wwp-graph-precip-ext&key=${encodeURIComponent(\n this.apppath?.path,\n )}&period=${this._selectedPeriod}`\n : '';\n }\n\n connectedCallback() {\n if (super.connectedCallback) super.connectedCallback();\n\n let resize;\n window.addEventListener('resize', () => {\n window.clearTimeout(resize);\n resize = setTimeout(() => {\n this.chart && this.chart.reflow();\n }, 220);\n });\n }\n\n formatnum(val) {\n return val === undefined || val === null || val === '' || Number.isNaN(val)\n ? ''\n : this.numberFormatter.format(val);\n }\n\n get tablecolumns() {\n return [\n {\n field: 'timestamp',\n label: this.timestampLabel || this.i18n.t('timestamp'),\n sortable: true,\n hideAble: false,\n },\n {\n field: 'value',\n label: this.yAxisLabel || this.i18n.t('precipmm'),\n sortable: false,\n },\n ];\n }\n\n createChart() {\n if (hclocales[this.i18n.language.substring(0, 2)]) {\n this.highcharts.setOptions({\n lang: hclocales[this.i18n.language.substring(0, 2)],\n });\n }\n this.chart = this.highcharts.chart(\n this.renderRoot.querySelector('#chart-node'),\n this.defaultOptions(),\n this.chartCreated.bind(this),\n );\n }\n\n chartCreated(chart) {\n const e = new CustomEvent('load', {\n detail: chart,\n });\n this.dispatchEvent(e);\n }\n\n updated(changedProperties) {\n if (changedProperties.get('stationId')) {\n this.station = null;\n this.fetchData();\n }\n if (this.chart) {\n this.chart.reflow();\n }\n }\n\n disconnectedCallback() {\n if (this.chart) {\n this.chart.destroy();\n this.chart = null;\n }\n }\n\n static get properties() {\n return {\n favButton: { type: Boolean },\n miniGraph: { type: Boolean },\n stationId: { type: String },\n options: { type: Object },\n };\n }\n\n drawSeries(period, min, max) {\n const cfg = find(this.ranges, { value: period });\n let _min = min;\n let _max = max;\n if (cfg.yearSelector) {\n _min = _min || dayjs().tz().startOf('year').valueOf();\n _max = _max || dayjs(this.coverage.max).tz().valueOf();\n this.renderRoot\n .querySelector('#yearselector')\n .classList.remove('hideButton');\n } else {\n this.renderRoot\n .querySelector('#yearselector')\n .classList.add('hideButton');\n }\n while (this.chart.series.length > 0) {\n this.chart.series[0].remove(false);\n }\n\n if (this.files[cfg.data]) {\n if (period === 'PoR') {\n _min = dayjs(this.files[cfg.data][0].data[0][0]).valueOf();\n _max = dayjs(last(this.files[cfg.data][0].data)[0]).valueOf();\n }\n const minDate =\n _min || dayjs(_max).subtract(dayjs.duration(period)).valueOf();\n const maxDate = _max || dayjs().tz().valueOf();\n const xAxis = this.chart.get('mainXAxis');\n this.chart.zoomOut();\n\n /* // Workaround for year view (avoid plotting of empty next month)\n if (cfg.value === 'P1Y')\n xAxis.setExtremes(\n minDate,\n max || dayjs().startOf('month'),\n false,\n false,\n ); \n else */\n\n xAxis.setExtremes(minDate, maxDate, false, false);\n\n if (cfg.yAxisLabel) {\n this.yAxisLabel = cfg.yAxisLabel;\n this.chart.get('mainYAxis').setTitle({ text: cfg.yAxisLabel }, false);\n }\n\n this.chart.get('sumYAxis').update({ visible: !cfg.sumOnMainAxis }, false);\n\n const timeformat = cfg.dateFormat || '%d.%m.%Y %H:%M';\n let ts = find(this.files[cfg.data], { ts_shortname: cfg.ts });\n ts = ts || this.files[cfg.data][0];\n\n if (\n this.filterAccuracy &&\n ts.columns.indexOf('Aggregation Accuracy %') > -1\n ) {\n const { columns } = ts;\n const valueIndex = columns.indexOf('Value');\n const accIndex = columns.indexOf('Aggregation Accuracy %');\n ts.data.forEach(item => {\n if (item[accIndex] < this.filterAccuracy) {\n item[valueIndex] = null;\n }\n });\n }\n const tsdata = this._formatGraphData(ts.data, minDate, maxDate);\n const accData = tsdata;\n const tableData = orderBy(tsdata, 'x', ['desc']).map(item => ({\n timestamp: dayjs(item.x)\n .tz()\n .format(cfg.dateFormatTable || 'L LT'),\n value: this.formatnum(item.y),\n }));\n const table = this.shadowRoot.getElementById('dataTable');\n table.columns = this.tablecolumns;\n // eslint-disable-next-line no-multi-assign\n this.orderedTableData = table.data = tableData;\n table.data = this.orderedTableData;\n\n // Show Accuracy in tooltip\n if (this.filterAccuracy) {\n this._addAccuracy(accData, timeformat);\n }\n\n // Add bars\n this.chart.addSeries(\n {\n data: tsdata,\n name: cfg.tslabel || this.parameter_label,\n id: 'data',\n color: '#0056a0',\n selected: true,\n marker: { enabled: false },\n tooltip: merge(\n {\n valueDecimals: 1,\n valueSuffix: ` ${ts.ts_unitsymbol}`,\n xDateFormat: timeformat,\n },\n this.tooltipBar,\n ),\n },\n false,\n );\n\n // Add sum line\n if (!cfg.hideSumLine) {\n this.chart.addSeries(\n {\n data: this._formatGraphDataSum(\n ts.data,\n minDate,\n maxDate,\n cfg.resetSumAt,\n ),\n name: cfg.sumLabel || this.sumLabel || this.i18n.t('Sum line'),\n yAxis: cfg.sumOnMainAxis ? 'mainYAxis' : 'sumYAxis',\n type: 'line',\n step: 'left',\n marker: { enabled: false },\n color: 'rgb(170,70,67)',\n selected: true,\n tooltip: merge(\n {\n valueDecimals: 1,\n valueSuffix: ` ${ts.ts_unitsymbol}`,\n xDateFormat: timeformat,\n },\n this.tooltipSum,\n ),\n },\n false,\n );\n }\n this.chart.redraw();\n }\n }\n\n getRangeOptions() {\n return this.ranges || [];\n }\n\n render() {\n const title =\n this.graphTitle && this.station\n ? template(this.graphTitle, this.station)\n : '';\n return html`
\n
${title}
\n {\n this.drawSeries(e.detail.value);\n this._selectedPeriod = e.detail.value;\n }}\"\n .options=\"${this.getRangeOptions()}\"\n .value=${this._selectedPeriod}\n class=\"buttons\"\n >\n \n
\n {\n const popup = this.renderRoot.querySelector('#download-popup');\n this.renderRoot.querySelector(\n '#embeddedgraph',\n ).value = ``;\n if (this.imageShareAutoOpen) {\n window.open(this.getImageShare(), '_blank');\n }\n popup.visible ? popup.hide({}) : popup.show({});\n }}\n >\n \n \n \n ${this.i18n.t('embedGraph')} {\n this.renderRoot.querySelector('#download-popup').hide({});\n }}\"\n style=\"margin:0;height: 20px;width: 20px;line-height: 20px;\"\n icon=\"ki ki-times\"\n >\n
\n \n {\n window.open(this.getImageShare(), '_blank');\n }}\"\n title=\"${this.i18n.t('previewTitle')}\"\n >${this.i18n.t('preview')}\n {\n copyTextToClipboard(\n this.renderRoot.querySelector('#embeddedgraph').value,\n );\n }}\"\n title=\"${this.i18n.t('copyToClipboard')}\"\n >${this.i18n.t('copy')}\n \n \n {\n copyTextToClipboard(\n this.renderRoot\n .querySelector('#dataTable')\n .toCSV(getCsvDelimiter())\n .replace(/(<([^>]+)>)/gi, ''),\n );\n }}\n >\n \n
\n \n
\n
\n \n ${this._years.map(\n year =>\n html`${year.label}`,\n )}\n \n
\n
\n
\n \n \n
\n
`;\n }\n\n // eslint-disable-next-line class-methods-use-this\n\n get _years() {\n if (this.coverage) {\n let max = dayjs(this.coverage.max).tz().get('year');\n const min = dayjs(this.coverage.min).tz().get('year');\n const years = [{ value: 'YTD', label: this.i18n.t('currentYear') }];\n while (max >= min) {\n years.push({ value: max, label: max.toString() });\n max -= 1;\n }\n return years;\n }\n return [{ value: 'YTD', label: this.i18n.t('currentYear') }];\n }\n\n _handleYearChange(e) {\n const { value } = e.target.selectedOption;\n const min =\n value && value !== 'YTD'\n ? dayjs(value, 'YYYY').tz().startOf('year')\n : dayjs().tz().startOf('year');\n const max =\n value && value !== 'YTD'\n ? dayjs(value, 'YYYY').tz().endOf('year')\n : dayjs().tz();\n this.drawSeries('P1Y', min.valueOf(), max.valueOf());\n }\n\n showTable() {\n this.renderRoot.querySelector('#table-wrapper').classList.toggle('hidden');\n this.renderRoot\n .querySelector('#table-clipboard-btn')\n .classList.toggle('hideButton');\n this.tableOpen = !this.tableOpen;\n this.chart && this.chart.reflow();\n }\n\n downloadGraph() {\n this.chart.update(\n {\n exporting: {\n chartOptions: {\n title: {\n text: this.graphTitle\n ? template(this.graphTitle, this.station)\n : '',\n },\n subtitle: {\n text: `${this.i18n.t('station_no')}: ${\n this.station.station_no\n } | ${this.i18n.t('request_at')} ${dayjs()\n .tz()\n .format('LLLL')}
\n ${dayjs(this.chart.xAxis[0].min).format('L')} - ${dayjs(\n this.chart.xAxis[0].max,\n )\n .tz()\n .format('L')}`,\n },\n },\n filename: `${this.parameter_label}_${this.station.station_name}_${\n this.station.station_no\n }_${dayjs().tz().format('YYYYMMDD')}`,\n fallbackToExportServer: false,\n buttons: {\n contextButton: {\n enabled: false,\n },\n },\n sourceWidth: 1600,\n sourceHeight: 800,\n scale: 1,\n },\n },\n false,\n );\n this.chart.exportChartLocal();\n }\n\n async fetchData() {\n this.chart?.destroy();\n this.chart = null;\n const _files = {};\n this.station = this.station || (await this.api.getStation(this.stationId));\n await Promise.all(\n this.station.timeseries\n .filter(\n ts =>\n ts.station_parameter === this.station_parameter &&\n (!this.onlyFetchSpecifiedRanges ||\n PopupUtil.fileMatchesRange(ts.href, this.ranges, this.alarms)),\n )\n .map(async ts => {\n _files[last(ts.href.split('/'))] = await this.api.getTsData(ts.href);\n }),\n );\n this.files = _files;\n const yearcfg = find(this.ranges, { value: 'P1Y' });\n if (yearcfg && this.files[yearcfg.data]) {\n const tsdata = this.files[yearcfg.data][0].data;\n if (tsdata && tsdata[0]) {\n this.coverage = {\n max: last(tsdata)[0],\n min: tsdata[0][0],\n };\n }\n }\n if (this.station) {\n this.createChart();\n let selected =\n find(this.ranges, { layerAlias: this.layerName }) ??\n find(this.ranges, { selected: true });\n selected = this._selectedPeriod || selected.value || this.ranges[0].value;\n\n if (!find(this.ranges, { period: selected })) {\n selected = this.ranges[0].value;\n }\n\n if (!selected) {\n selected = this.ranges[0].value;\n }\n this._selectedPeriod = selected;\n this.drawSeries(selected);\n\n this.requestUpdate();\n }\n return this.files;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _formatGraphData(data, minDate, maxDate) {\n const tsData = [];\n data.forEach(dp => {\n const ts = new Date(dp[0]).getTime();\n if (ts > minDate && ts < maxDate) {\n const _p = {\n x: ts,\n y: dp[1],\n color: '#0056a0',\n acc: undefined,\n };\n\n if (!this.ignoreAccuracy) {\n _p.acc = dp[2] ? Math.floor(dp[2]) : undefined;\n if (_p.acc < 100) {\n _p.color = {\n pattern: {\n path: 'M-1,1 l2,-2 M0,4 l4,-4 M3,5 l2,-2',\n color: '#0056a0',\n width: 4,\n height: 4,\n },\n };\n _p.borderColor = '#0056a0';\n }\n }\n tsData.push(_p);\n }\n });\n return tsData;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _formatGraphDataSum(data, minDate, maxDate, resetSumAt) {\n let sum = 0;\n const tsData = [];\n data.forEach(dp => {\n const ts = dayjs(dp[0]);\n const tsms = ts.valueOf();\n if (tsms >= minDate && tsms <= maxDate) {\n if (resetSumAt && resetSumAt === ts.format('HH:mm')) {\n sum = 0;\n }\n tsData.push([tsms, dp[1] === null ? null : (sum += dp[1])]);\n }\n });\n return tsData;\n }\n\n createGraphOptions() {\n const self = this;\n const graphOptions = {\n chart: {\n animation: false,\n type: 'column',\n pinchType: undefined,\n zoomType: this.zoomType,\n panning: {\n enabled: false,\n },\n },\n\n series: [],\n plotOptions: {\n column: {\n groupPadding: 0,\n dataLabels: {\n enabled: true,\n formatter() {\n // Show data coverage\n const color = this.point.acc < 100 ? 'red' : 'rgba(29,29,29)';\n const val =\n // eslint-disable-next-line no-nested-ternary\n this.point.acc === 0.01\n ? 'k.a.'\n : this.point.acc\n ? `${this.point.acc}%`\n : '';\n return self.showAccuracy\n ? `${val}`\n : '';\n },\n },\n },\n series: {\n animation: false,\n showCheckbox: ViewPort.size !== SM && !this.miniGraph,\n states: {\n inactive: {\n opacity: 1,\n },\n },\n },\n },\n yAxis: [\n merge(\n {\n softMax: 2,\n min: 0,\n allowDecimals: false,\n id: 'mainYAxis',\n minorTicks: !this.miniGraph,\n tickAmount: 8,\n title: {\n text: this.yAxisLabel || `${this.i18n.t('precip')} [mm]`,\n },\n },\n this.yAxisBar,\n ),\n merge(\n {\n softMax: 2,\n min: 0,\n allowDecimals: false,\n id: 'sumYAxis',\n minorTicks: !this.miniGraph,\n tickAmount: 8,\n opposite: true,\n title: {\n text: this.yAxisLabelSum || `${this.i18n.t('Sum line')} [mm]`,\n },\n },\n this.yAxisSum,\n ),\n {\n id: 'accAxis',\n labels: {\n enabled: false,\n },\n title: {\n enabled: false,\n },\n gridLineWidth: 0,\n },\n ],\n xAxis: [\n {\n id: 'mainXAxis',\n type: 'datetime',\n ordinal: false,\n labels: {\n formatter() {\n return this.dateTimeLabelFormat === '%e. %b' &&\n this.tickPositionInfo.unitName === 'hour'\n ? `${this.axis.defaultLabelFormatter.call(this)}`\n : this.axis.defaultLabelFormatter.call(this);\n },\n },\n max: new Date().getTime(),\n },\n {\n visible: false,\n id: 'alarmAxis',\n },\n ],\n };\n return graphOptions;\n }\n\n _addAccuracy(tsdata, timeformat) {\n // Transform Accuracy to Value\n const _data: Array = [];\n tsdata.forEach(d => {\n const newPoint = {};\n newPoint.x = d.x;\n newPoint.y = d.acc;\n if (d.acc) _data.push(newPoint); // Catch periods without accuracy\n });\n\n // Add Accuracy as series to show accuracy in tooltip\n // Hide series in graph and legend\n if (_data.length > 0)\n this.chart.addSeries(\n {\n data: _data,\n yAxis: 'accAxis',\n name: this.i18n.t('accuracy'),\n id: 'acc',\n color: 'black',\n selected: true,\n marker: { enabled: false },\n tooltip: {\n valueDecimals: 0,\n valueSuffix: `%`,\n xDateFormat: timeformat,\n },\n showInLegend: false,\n opacity: 0,\n grouping: false,\n },\n false,\n );\n }\n\n get creditOptions() {\n const credits = this.credits ? { ...this.credits } : { enabled: false };\n if (credits?.text) {\n credits.text = template(credits.text, this.station);\n }\n if (this.credits && ViewPort.size === SM) {\n credits.position = credits.positionMobile || credits.position;\n }\n credits.enabled = !this.miniGraph;\n return credits;\n }\n\n defaultOptions() {\n const timezoneOffset = -dayjs\n .tz(\n dayjs().tz(),\n dayjs.defaultZone ? dayjs.defaultZone.name : dayjs.tz.guess(),\n )\n .utcOffset();\n const conf = merge(\n {\n title: {\n text: '',\n },\n subtitle: {\n text: this.subTitle || '',\n floating: true,\n },\n credits: this.creditOptions,\n exporting: {\n chartOptions: {\n title: {\n text: this.graphTitle\n ? template(this.graphTitle, this.station)\n : '',\n },\n subtitle: {\n text: `${this.i18n.t('station_no')}: ${\n this.station.station_no\n } | ${this.i18n.t('request_at')} ${dayjs().tz().format('LLLL')}`,\n },\n },\n filename: `${this.parameter_label}_${this.station.station_name}_${\n this.station.station_no\n }_${dayjs().tz().format('YYYYMMDD_kkmmss')}`,\n fallbackToExportServer: false,\n sourceWidth: 1600,\n sourceHeight: 800,\n scale: 1,\n buttons: {\n contextButton: {\n enabled: false,\n },\n },\n },\n plotOptions: {\n series: {\n label: {\n enabled: false,\n },\n turboThreshold: 2000,\n showCheckbox: true,\n events: {\n checkboxClick(event) {\n if (event.checked) {\n this.show();\n // this.legendSymbol.hide();\n } else {\n this.hide();\n // this.legendSymbol.hide();\n }\n },\n legendItemClick() {\n if (this.checkbox) {\n this.checkbox.checked = !this.visible;\n }\n },\n hide() {\n this.yAxis.update({\n visible: false,\n });\n },\n show() {\n this.yAxis.update({\n visible: true,\n });\n },\n },\n },\n },\n legend: {\n enabled: this.forceLegend || !this.miniGraph,\n align: 'left',\n symbolPadding: 5,\n symbolRadius: 0,\n itemDistance: 40,\n squareSymbol: true,\n itemCheckboxStyle: {\n marginLeft: '-30px',\n },\n },\n tooltip: {\n shared: this.sharedTooltip,\n split: false,\n },\n time: {\n // eslint-disable-next-line no-unused-vars\n getTimezoneOffset() {\n return timezoneOffset;\n },\n },\n yAxis: {\n id: 'mainYAxis',\n minRange: 3,\n title: {\n text: this.yAxisLabel || this.i18n.t('precipmm'),\n },\n },\n series: [],\n },\n this.createGraphOptions(),\n );\n return conf;\n }\n}\n","// eslint-disable-next-line max-classes-per-file\nimport { customElement, property } from 'lit/decorators.js';\nimport { find } from 'lodash-es';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport { init, getCurrentApi } from '@kisters/wiski-web/api';\nimport { initConfig } from '@kisters/wcp-base/app';\nimport KiWwpGraphPrecip from './ki-wwp-graph-precip';\n\n@customElement('ki-wwp-graph-precip-ext')\nexport class KiWwpGraphPrecipExt extends KiWwpGraphPrecip {\n @property({ type: String })\n key;\n\n @property({ type: String })\n stationId;\n\n @property({ type: String })\n dataPath;\n\n favButton = false;\n\n firstUpdated() {\n this.numberFormatter = new Intl.NumberFormat(\n this.i18n.language,\n this.numberFormat || {},\n );\n this.initAppConfig();\n this.refreshInterval = setInterval(() => {\n this.fetchData();\n }, 300000);\n }\n\n async initAppConfig() {\n this.appcfg = await initConfig('./config/app.json', []);\n init({ dataPath: this.appcfg.apiPath });\n this.api = getCurrentApi();\n this.fetchData();\n }\n\n async fetchData() {\n dayjs.locale(this.i18n.language);\n const stationDetailComp = find(this.appcfg.route[0].children, {\n component: 'wwp-station-detail',\n });\n const configItem = find(stationDetailComp.children, { path: this.key });\n if (configItem) {\n Object.assign(this, configItem.options);\n }\n this._selectedPeriod = this.period;\n this.imageShare = false;\n this.tableOpen = false;\n super.fetchData();\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n :host {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n }\n\n ui5-button {\n cursor: pointer;\n margin: 0 0 5px 10px;\n }\n\n .fav-btn {\n font-size: 1.3em;\n }\n\n #yearselector {\n width: 150px;\n min-width: 150px;\n }\n\n #nav-node {\n padding: 5px 10px 0 5px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid gray;\n overflow: auto;\n }\n\n #nav-node .label {\n font-size: 1.5em;\n }\n\n ki-wwp-switcher-bottom {\n border-radius: 0;\n box-shadow: none;\n align-self: normal;\n }\n\n :host(.sm-screen) ki-wwp-switcher-bottom {\n margin-left: 35pt;\n }\n\n :host(.sm-screen) .clipboard-btn {\n display: none;\n }\n\n .actions {\n display: flex;\n }\n\n ki-icon-btn {\n margin: 5px;\n box-shadow: none;\n }\n\n :host(.sm-screen) ki-icon-btn {\n margin: 2px;\n }\n\n .hideButton {\n display: none;\n }\n\n #chart-node {\n box-sizing: border-box;\n padding-top: 10px;\n display: table-cell;\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n .contentnode {\n display: flex;\n flex: 1;\n }\n\n #table-wrapper {\n position: relative;\n overflow: auto;\n flex: 0 0 320px;\n }\n\n #nav-node.hidden {\n display: none;\n }\n\n .hidden {\n display: none;\n }\n\n #table-wrapper.hidden {\n position: relative;\n overflow: auto;\n flex: 0 0 0;\n }\n\n ki-wwp-ts-table {\n position: absolute;\n height: 100%;\n width: 100%;\n }\n\n #chart-wrapper {\n position: relative;\n flex: 1;\n }\n\n :host(.sm-screen) .label {\n display: none;\n }\n\n :host(.sm-screen) #table-wrapper {\n flex: 1 1 100%;\n background: white;\n }\n\n :host(.sm-screen) #table-clipboard-btn {\n display: none;\n }\n :host(.sm-screen) #table-wrapper.hidden {\n position: relative;\n overflow: auto;\n flex: 0 0 0;\n }\n\n .highcharts-legend-checkbox {\n transform: translate(-30px, -1px);\n }\n\n :host(.sm-screen) .highcharts-legend-checkbox {\n transform: translateX(-5px);\n }\n\n ui5-select {\n background: #eee;\n position: absolute;\n left: 50px;\n top: 10px;\n border: 0;\n z-index: 1;\n }\n\n ki-popup#download-popup {\n width: 250px;\n }\n`;\n","import dayjs from '@kisters/wcp-base/common/dayjsext';\nimport { filter, first } from 'lodash-es';\n\nexport class GraphHelper {\n public static transformForecast(\n data: Array<[string, number]>,\n ): Array<[string, number]> {\n return data.map(i => [dayjs(i[0]).valueOf(), i[1]]);\n }\n\n /** Check if ranges contains at least one matching element */\n public static rangeObjectContains(files: Object, filename: string): boolean {\n if (files[filename] || (Object.keys(files), k => k.includes(filename)))\n return true;\n return false;\n }\n\n /** Return a matching range element\n * @remark Always the returns the first matching element\n * Clarifiy the filename as much as possible, e.g. \"level/year.json\" instead of \"year.json\" to avoid unwanted matches\n */\n public static getFile(files: Object, rangeConfig: Object): Array {\n let result =\n files[rangeConfig.data] ||\n files[\n first(filter(Object.keys(files), k => k.includes(rangeConfig.data)))\n ];\n\n /** Filter for provided setting in rangeConfig */\n if (rangeConfig.ts_shortname) {\n result = filter(result, ts =>\n rangeConfig.ts_shortname.includes(ts.ts_shortname),\n );\n }\n return result;\n }\n}\n","/* eslint-disable no-unused-expressions */\n/* eslint-disable no-nested-ternary */\n/* eslint-disable max-classes-per-file */\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport {\n last,\n merge,\n find,\n head,\n groupBy,\n flatten,\n orderBy,\n compact,\n first,\n} from 'lodash-es';\nimport {\n SM,\n ViewPort,\n responsiveMixin,\n i18nMixin,\n queryParamMixin,\n localStorageMixin,\n} from '@kisters/wcp-base/decorators';\nimport './ki-wwp-switcher-bottom';\nimport {\n LoaderMixin,\n template,\n copyTextToClipboard,\n Mix,\n downloadFile,\n} from '@kisters/wcp-base/common';\n\nimport { getRouteOptionsAndParams } from '@kisters/wcp-base/components';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport './ki-wwp-ts-table';\nimport hclocales from '@kisters/wcp-water/common/highcharts-locales';\nimport Highcharts from 'highcharts/highstock';\nimport nodata from 'highcharts/modules/no-data-to-display';\nimport exporting from 'highcharts/modules/exporting';\nimport boost from 'highcharts/modules/boost';\nimport more from 'highcharts/highcharts-more';\nimport offlineexporting from 'highcharts/modules/offline-exporting';\n\nimport serieslabel from 'highcharts/modules/series-label';\nimport { getCsvDelimiter } from '@kisters/wcp-base/components/ki-app/services/ki-app-config-service';\nimport { getCurrentApi } from '../../api/API';\nimport nls from '../../locales/index';\n\nimport style from './ki-wwp-graph.css?inline';\n\nimport '@ui5/webcomponents/dist/Button';\nimport '@ui5/webcomponents/dist/Select';\nimport '@ui5/webcomponents/dist/Option';\nimport { GraphHelper } from './GraphHelper';\nimport { AttributeThreshold } from './AttributeThreshold';\n\n@customElement('ki-wwp-graph')\nexport default class KiWwpGraph extends Mix(\n LitElement,\n LoaderMixin,\n [i18nMixin, { nls }],\n [\n localStorageMixin,\n { targetProperty: '__favouriteStationIds', typeParam: Array },\n ],\n [\n queryParamMixin,\n {\n targetProperty: '_selectedPeriod',\n selector: 'period',\n defaultValue: '',\n },\n ],\n responsiveMixin,\n) {\n // language=CSS\n\n @property({ type: Object })\n station;\n\n @property({ type: Object })\n options = {};\n\n @property({ type: Boolean })\n miniGraph = false;\n\n /** Reduce loading time for popups; only fetch specified ranges\n * @remark Usually just 'week.json'\n */\n @property({ type: Boolean })\n onlyFetchSpecifiedRanges = false;\n\n @property({ type: Boolean })\n favButton = false;\n\n @property({ type: String })\n stationId;\n\n forcePeriodRange = true;\n\n maincolor = '#0056a0';\n\n qCodeExclude = [];\n\n showUntilEndOfDay = true;\n\n imageShareAutoOpen = false;\n\n zoomType = 'x';\n\n boost = true;\n\n __selectedPeriod;\n\n hydroYearStart = '01-01';\n\n hydroYearEnd = '01-01';\n\n attributeThresholds: Array = [];\n\n // eslint-disable-next-line class-methods-use-this\n get localStorageId() {\n return `wwp-favorites-ids`;\n }\n\n ___favouriteStationIds = [];\n\n get __favouriteStationIds() {\n return this.___favouriteStationIds;\n }\n\n set __favouriteStationIds(value) {\n this.___favouriteStationIds = value;\n this.requestUpdate();\n }\n\n get _selectedPeriod() {\n return this.__selectedPeriod;\n }\n\n set _selectedPeriod(value) {\n this.__selectedPeriod = value;\n this.requestUpdate();\n }\n\n static get styles() {\n return [style];\n }\n\n constructor() {\n super();\n serieslabel(Highcharts);\n exporting(Highcharts);\n offlineexporting(Highcharts);\n nodata(Highcharts);\n more(Highcharts);\n boost(Highcharts);\n }\n\n connectedCallback() {\n if (super.connectedCallback) super.connectedCallback();\n let resize;\n window.addEventListener('resize', () => {\n window.clearTimeout(resize);\n resize = setTimeout(() => {\n if (this.chart) {\n this.chart.update({\n legend: this.legendOptions,\n credits: this.creditOptions,\n });\n this.chart.reflow();\n }\n }, 220);\n });\n }\n\n firstUpdated() {\n if (!this.miniGraph) {\n this.refreshInterval = setInterval(() => {\n this.fetchData();\n }, 300000);\n }\n Object.assign(this, this.options);\n if (\n this.renderRoot.host.classList.contains('sm-screen') ||\n this.miniGraph\n ) {\n this.tableOpen = false;\n }\n this.api = getCurrentApi();\n this.numberFormatter = new Intl.NumberFormat(\n this.i18n.language,\n this.numberFormat || {},\n );\n if (this.api) {\n this.fetchData();\n }\n }\n\n async onAfterEnter(location) {\n const params = getRouteOptionsAndParams(location, [\n 'layerName',\n 'stationId',\n 'stationLabel',\n ]);\n Object.assign(this, JSON.parse(JSON.stringify(params.options)));\n this.layerName = params.layerName;\n this.apppath = location.route;\n this.stationId = params.stationId;\n }\n\n isFavorite() {\n return this.__favouriteStationIds.indexOf(this.station?.station_id) >= 0;\n }\n\n _toggleFavourite() {\n if (this.__favouriteStationIds.indexOf(this.station.station_id) === -1) {\n this.__favouriteStationIds = [\n ...this.__favouriteStationIds,\n this.station.station_id,\n ];\n } else {\n this.__favouriteStationIds = this.__favouriteStationIds.filter(\n id => id !== this.station.station_id,\n );\n }\n }\n\n createChart() {\n if (!this.chart) {\n if (hclocales[this.i18n.language.substring(0, 2)]) {\n Highcharts.setOptions({\n lang: hclocales[this.i18n.language.substring(0, 2)],\n });\n }\n this.chart = new Highcharts.StockChart(\n this.renderRoot.querySelector('#chart-node'),\n this.defaultOptions(),\n this.chartCreated.bind(this),\n );\n }\n }\n\n chartCreated(chart) {\n const e = new CustomEvent('load', {\n detail: chart,\n });\n this.dispatchEvent(e);\n }\n\n updated(changedProperties) {\n if (changedProperties.get('stationId')) {\n // console.log(this.stationId, changedProperties.get('stationId'))\n this.station = null;\n this.fetchData();\n }\n if (this.chart) {\n // console.log(\"resize bfeore\", this.renderRoot.querySelector('#contentnode').clientHeight, this.chart.chartHeight)\n this.chart.reflow();\n // console.log(\"resize\", this.renderRoot.querySelector('#contentnode').clientHeight, this.chart.chartHeight)\n }\n }\n\n disconnectedCallback() {\n if (super.disconnectedCallback) super.disconnectedCallback();\n window.removeEventListener('resize', this.handleResize);\n if (this.chart) {\n this.chart.destroy();\n this.chart = null;\n }\n clearInterval(this.refreshInterval);\n }\n\n handleResize = (): void => {\n this.requestUpdate();\n };\n\n // eslint-disable-next-line class-methods-use-this\n get legendOptions() {\n let legendOptions = {\n layout: 'horizontal',\n align: 'left',\n verticalAlign: 'bottom',\n alignColumns: false,\n itemMarginBottom: 10,\n itemDistance: ViewPort.size === SM ? 15 : 35,\n width: '90%',\n symbolRadius: 0,\n squareSymbol: false,\n enabled: !this.miniGraph,\n };\n\n if (ViewPort.size === SM && ViewPort.landscape) {\n legendOptions = {\n layout: 'vertical',\n align: 'left',\n verticalAlign: 'top',\n alignColumns: false,\n itemMarginBottom: 5,\n enabled: !this.miniGraph,\n symbolPadding: 5,\n itemDistance: ViewPort.size === SM ? 15 : 35,\n width: ViewPort.size === SM ? '20%' : '80%',\n symbolRadius: 0,\n squareSymbol: false,\n };\n }\n return legendOptions;\n }\n\n get creditOptions() {\n const credits = this.credits ? { ...this.credits } : { enabled: false };\n if (credits?.text) {\n credits.text = template(credits.text, this.station);\n }\n if (this.credits && ViewPort.size === SM) {\n credits.position = credits.positionMobile || credits.position;\n }\n credits.enabled = !this.miniGraph;\n return credits;\n }\n\n // eslint-disable-next-line class-methods-use-this\n getTableValuesFromTemplate(cfg, data, minDate, maxDate = Infinity) {\n const tsIndex = {};\n cfg.tableTemplate.forEach(tsshortname => {\n const ts = find(data, { ts_shortname: tsshortname });\n const tsdata = groupBy(ts.data, head);\n tsIndex[ts.ts_shortname] = tsdata;\n });\n\n const firstts = find(data, { ts_shortname: cfg.tableTemplate[0] });\n const tsdata = [];\n firstts.data.forEach(dp => {\n const tzoffset =\n (dayjs().utcOffset() - dayjs().tz().utcOffset()) * 60 * 1000;\n const ts = dp[0];\n const tsms = new Date(ts).getTime() - tzoffset;\n if (tsms >= minDate && tsms <= maxDate) {\n const row = [tsms];\n cfg.tableTemplate.forEach(item => {\n const tempts = tsIndex[item];\n const val = tempts[ts] ? tempts[ts][0][1] : null;\n row.push(val);\n });\n tsdata.push(row);\n }\n });\n return { data: tsdata };\n }\n\n // eslint-disable-next-line consistent-return\n _getSeries(cfg, data, minDate, maxDate = Infinity) {\n const tzoffset =\n (dayjs().utcOffset() - dayjs().tz().utcOffset()) * 60 * 1000;\n const dCommentIndex = data[0].columns\n ? data[0]?.columns.split(',').indexOf('Data Comment')\n : null;\n if (cfg.timeseries) {\n const tslist: any[] = [];\n cfg.timeseries.forEach((tscfg, i) => {\n if (tscfg.ts_shortname_min && tscfg.ts_shortname_max) {\n tscfg.type = 'range';\n const minTs = find(data, {\n ts_shortname: tscfg.ts_shortname_min,\n });\n const maxTs = find(data, {\n ts_shortname: tscfg.ts_shortname_max,\n });\n const minIdx = groupBy(minTs.data, head);\n const tsdata = [];\n\n maxTs.data.forEach(dp => {\n const ts = dp[0];\n const tsms = new Date(ts).getTime() - tzoffset;\n const max = dp[1];\n const min = minIdx[ts] ? minIdx[ts][0][1] : null;\n if (tsms >= minDate && tsms <= maxDate) {\n tsdata.push([tsms, min, max]);\n }\n });\n\n tslist.push(\n merge(\n {\n data: tsdata,\n id: `data_${i}`,\n name: this.parameter_label,\n color: 'rgba(0, 86, 160, 0.3)',\n type: 'arearange',\n fillOpacity: 0.3,\n xAxis: 'mainXAxis',\n\n // gapSize: 2,\n selected: true,\n marker: {\n enabled: false,\n },\n tooltip: {\n valueSuffix: ` ${\n minTs.ts_unitsymbol !== '---' ? minTs.ts_unitsymbol : ''\n }`,\n xDateFormat: this.dateFormat ?? '%d.%m.%Y',\n },\n },\n tscfg.options,\n ),\n );\n } else {\n /** Compare available data with requested data in ranges-option; e.g. CWC with multiple parameters */\n const ts = tscfg.stationparameter_name\n ? find(data, {\n ts_shortname: tscfg.ts_shortname,\n stationparameter_name: tscfg.stationparameter_name,\n })\n : find(data, { ts_shortname: tscfg.ts_shortname });\n if (ts) {\n if (tscfg.minDate) {\n minDate =\n dayjs().tz().subtract(dayjs.duration(tscfg.minDate)).valueOf() -\n tzoffset;\n }\n tslist.push(\n merge(\n {\n columns: ts.columns,\n data: this._formatGraphData(ts.data, minDate, maxDate, ts),\n id: `data_${i}`,\n name: this.parameter_label,\n color: this.maincolor,\n xAxis: 'mainXAxis',\n selected: true,\n marker: {\n radius: 1,\n enabled: true,\n },\n tooltip: {\n pointFormatter() {\n return `${this.series.name}: ${this.y} ${\n ts.ts_unitsymbol !== '---' ? ts.ts_unitsymbol : ''\n }
${\n dCommentIndex && ts.data[this.index][dCommentIndex]\n ? `Data Comment: ${\n ts.data[this.index][dCommentIndex]\n }`\n : ''\n }`;\n },\n },\n },\n tscfg.options,\n ),\n );\n }\n }\n });\n return tslist;\n }\n if (data[0]) {\n const options = cfg.options || {};\n const ts = data[0];\n return [\n merge(\n {\n data: this._formatGraphData(ts.data, minDate, maxDate, ts),\n id: 'data',\n color: '#0056a0',\n name: this.parameter_label,\n xAxis: 'mainXAxis',\n selected: true,\n marker: {\n radius: 1,\n enabled: true,\n },\n tooltip: {\n pointFormatter() {\n return `${this.series.name}: ${this.y} ${\n ts.ts_unitsymbol !== '---' ? ts.ts_unitsymbol : ''\n }
${\n dCommentIndex && ts.data[this.index][dCommentIndex]\n ? `Data Comment: ${\n ts.data[this.index][dCommentIndex]\n }`\n : ''\n }`;\n },\n xDateFormat: this.dateFormat\n ? `${this.dateFormat} %H:%M`\n : '%d.%m.%Y %H:%M',\n },\n },\n options,\n ),\n ];\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n _formatGraphData(\n data = [],\n minDate = -Infinity,\n maxDate = Infinity,\n timeseries = {},\n ) {\n const tsData = [];\n // const start = dayjs().valueOf()\n const tzoffset =\n (dayjs().utcOffset() - dayjs().tz().utcOffset()) * 60 * 1000;\n\n const qCodeIndex = timeseries.columns\n ? timeseries?.columns.split(',').indexOf('Quality Code')\n : null;\n\n data.forEach(dp => {\n const ts = new Date(dp[0]).getTime() - tzoffset;\n if (this.qCodeExclude.length) {\n if (\n ts >= minDate &&\n ts <= maxDate &&\n !this.qCodeExclude.includes(dp[qCodeIndex])\n ) {\n tsData.push([ts, ...dp.slice(1)]);\n }\n } else if (ts >= minDate && ts <= maxDate) {\n tsData.push([ts, ...dp.slice(1)]);\n }\n });\n // console.log(\"duration\", tsData.length, dayjs().valueOf()-start)\n return tsData;\n // return data.map(dp => [new Date(dp[0]).getTime(), dp[1]]);\n }\n\n _formatNumber(val) {\n return val === undefined || val === null || val === '' || Number.isNaN(val)\n ? ''\n : this.numberFormatter.format(val);\n }\n\n drawForecastDeterministic() {\n const ts_list = this.files[this.forecast];\n\n if (!ts_list) {\n return;\n }\n\n const { data } = last(ts_list);\n const firstDataPoint = data[0];\n if (!firstDataPoint) {\n return;\n }\n const t0 = dayjs(firstDataPoint[0]).tz().valueOf(); // this.station[this.progTs] ? dayjs(this.station[this.progTs]+\"Z\").valueOf() : dayjs().valueOf();\n\n const xAxis = this.chart.get('mainXAxis');\n xAxis.addPlotLine({\n id: 'pz',\n zIndex: 2,\n color: 'gray',\n width: 2,\n value: t0,\n label: {\n // rotation:270,\n x: 5,\n y: this.miniGraph ? 80 : 120,\n verticalAlign: 'top',\n text: 't0',\n },\n });\n\n /** Add Vorhersage */\n this.chart.addSeries({\n name: this.i18n.t('FORECAST'),\n selected: true,\n color: 'green',\n id: 'data_forecast',\n data: GraphHelper.transformForecast(data),\n events: {\n hide: () => {\n xAxis.removePlotLine('pz');\n },\n show: () => {\n xAxis.addPlotLine({\n id: 'pz',\n zIndex: 2,\n color: 'gray',\n width: 2,\n value: t0,\n label: {\n // rotation:270,\n x: 5,\n y: this.miniGraph ? 80 : 120,\n verticalAlign: 'top',\n text: 't0',\n },\n });\n },\n },\n });\n }\n\n drawForecast() {\n const ts = this.files[this.forecast];\n if (!ts) {\n return;\n }\n\n this.chart.get('mainXAxis').setExtremes(null, null, false, false);\n\n const { data, columns } = ts[0];\n const colArray = columns.split(',');\n const firstDataPoint = data[0];\n if (!firstDataPoint) {\n return;\n }\n const progTs = dayjs(firstDataPoint[0]).tz().valueOf(); // this.station[this.progTs] ? dayjs(this.station[this.progTs]+\"Z\").valueOf() : dayjs().valueOf();\n\n const trendAb = this.station[this.trendAb]\n ? Number(this.station[this.trendAb])\n : null;\n const progDur = this.station[this.progDuration]\n ? Number(this.station[this.progDuration])\n : null;\n\n const prognoseBisTs = dayjs(progTs).tz().add(progDur, 'minutes').valueOf();\n const trendAbTs = dayjs(progTs).tz().add(trendAb, 'hours').valueOf();\n\n const prognoseBranches = this.station.web_prognose_branches;\n const indexMin = colArray.indexOf('Min');\n const indexMax = colArray.indexOf('Max');\n const indexMittel = colArray.indexOf('Mittel');\n const indexTUMin = colArray.indexOf('TUMin');\n const indexTUMax = colArray.indexOf('TUMax');\n const indexTUMittel = colArray.indexOf('TUMittel');\n\n const dataTrend = [];\n const dataTrendVB = [];\n const dataProg = [];\n const dataProgVB = [];\n\n let actualMin;\n let actualMax;\n let actualMean;\n\n if (prognoseBranches === 'Alle-Ext' || prognoseBranches === 'Min/Max-Ext') {\n actualMin = indexMin;\n actualMax = indexMax;\n } else if (\n prognoseBranches === 'Alle-Int' ||\n prognoseBranches === 'Min/Max-Int'\n ) {\n actualMin = indexTUMin;\n actualMax = indexTUMax;\n }\n if (\n prognoseBranches === 'Alle-Ext' ||\n prognoseBranches === 'Prognose-Ext'\n ) {\n actualMean = indexMittel;\n } else if (\n prognoseBranches === 'Alle-Int' ||\n prognoseBranches === 'Prognose-Int'\n ) {\n actualMean = indexTUMittel;\n }\n\n data.forEach(row => {\n const tsValue = dayjs(row[0]).tz().valueOf();\n if (tsValue < prognoseBisTs) {\n if (trendAb && tsValue >= trendAbTs) {\n dataTrend.push([tsValue, row[actualMean]]);\n dataTrendVB.push([tsValue, row[actualMin], row[actualMax]]);\n } else {\n dataProg.push([tsValue, row[actualMean]]);\n dataProgVB.push([tsValue, row[actualMin], row[actualMax]]);\n }\n }\n });\n\n const xAxis = this.chart.get('mainXAxis');\n if (this.station.web_prognose_publish !== 'no') {\n xAxis.addPlotLine({\n id: 'pz',\n zIndex: 2,\n color: 'gray',\n width: 2,\n value: progTs,\n label: {\n // rotation:270,\n x: 5,\n y: this.miniGraph ? 80 : 120,\n verticalAlign: 'top',\n text: this.miniGraph ? `VHS` : 'Prognosezeitpunkt',\n },\n });\n }\n\n if (\n trendAb &&\n this.station.web_prognose_trendanzeige !== 'no' &&\n this.station.web_prognose_publish !== 'no'\n ) {\n xAxis.addPlotLine({\n id: 'trend',\n zIndex: 2,\n color: 'gray',\n width: 2,\n value: trendAbTs,\n label: {\n // rotation:270,\n x: 5,\n y: this.miniGraph ? 80 : 120,\n verticalAlign: 'top',\n text: this.miniGraph ? `Trend` : `ab >${trendAb}h = Trend`,\n },\n });\n this.chart.addSeries(\n {\n name: 'Trend',\n selected: true,\n color: 'green',\n id: 'data_trend',\n dashStyle: 'dot',\n data: dataTrend,\n events: {\n hide: () => {\n xAxis.removePlotLine('trend');\n },\n show: () => {\n xAxis.addPlotLine({\n id: 'trend',\n zIndex: 2,\n color: 'gray',\n width: 2,\n value: trendAbTs,\n label: {\n // rotation:270,\n x: 5,\n y: this.miniGraph ? 80 : 120,\n verticalAlign: 'top',\n text: this.miniGraph ? `Trend` : `ab >${trendAb}h = Trend`,\n },\n });\n },\n },\n },\n false,\n );\n this.chart.addSeries(\n {\n name: 'Vertrauensbereich Trend',\n type: 'arearange',\n fillOpacity: 0.5,\n linkedTo: 'data_trend',\n id: 'data_trendarea',\n showInLegend: false,\n selected: true,\n dashStyle: 'dot',\n fillColor: 'rgba(124,181,236,0.3)',\n data: dataTrendVB,\n },\n false,\n );\n }\n\n if (this.station.web_prognose_publish !== 'no') {\n this.chart.addSeries(\n {\n name: 'Vertrauensbereich',\n type: 'arearange',\n fillOpacity: 0.5,\n id: 'data_forecastarea',\n selected: true,\n color: 'rgba(124,181,236,1)',\n showInLegend: false,\n fillColor: 'rgba(124,181,236,0.5)',\n data: dataProgVB,\n linkedTo: 'data_forecast',\n },\n false,\n );\n\n this.chart.addSeries({\n name: 'Vorhersage',\n selected: true,\n color: 'green',\n id: 'data_forecast',\n data: dataProg,\n events: {\n hide: () => {\n xAxis.removePlotLine('pz');\n },\n show: () => {\n xAxis.addPlotLine({\n id: 'pz',\n zIndex: 2,\n color: 'gray',\n width: 2,\n value: progTs,\n label: {\n // rotation:270,\n x: 5,\n y: this.miniGraph ? 80 : 120,\n verticalAlign: 'top',\n text: this.miniGraph ? `VHS` : 'Prognosezeitpunkt',\n },\n });\n },\n },\n });\n }\n }\n\n _getTimestampFromDuration(dur) {\n const tzoffset =\n (dayjs().utcOffset() - dayjs().tz().utcOffset()) * 60 * 1000;\n if (!dur) {\n return dayjs().tz().valueOf() - tzoffset;\n }\n if (dur === 'PoR') {\n return dayjs(this.coverage.min).tz().valueOf() - tzoffset;\n }\n if (dur.charAt(0) === '+') {\n return dayjs().add(dayjs.duration(dur)).valueOf() - tzoffset;\n }\n if (dur === 'PT24H') {\n return dayjs().tz().subtract(dayjs.duration(dur)).valueOf() - tzoffset;\n }\n const until = this.showUntilEndOfDay\n ? dayjs().endOf('day').tz()\n : dayjs().tz();\n return until.subtract(dayjs.duration(dur)).valueOf() - tzoffset;\n }\n\n drawSeries(period, min, max) {\n const cfg = find(this.ranges, { value: period }) || this.ranges[0];\n if (cfg.yearSelector) {\n this.renderRoot\n .querySelector('#yearselector')\n .classList.remove('hideButton');\n } else {\n this.renderRoot\n .querySelector('#yearselector')\n .classList.add('hideButton');\n }\n if (\n this.station.BODY_RESPONSIBLE &&\n this.station.BODY_RESPONSIBLE === 'WSV' // TODO: Remove LANUV?! artifact\n ) {\n this.renderRoot\n .querySelector('#yearselector')\n .classList.add('hideButton');\n }\n this.chart.series\n .filter(ser => ser.userOptions.id && ser.userOptions.id.includes('data'))\n .forEach(ser => ser.remove(false));\n const minDate = min || this._getTimestampFromDuration(period);\n let maxDate = max || this._getTimestampFromDuration();\n const xAxis = this.chart.get('mainXAxis');\n this.chart.zoomOut();\n if (cfg.yAxisLabel) {\n this.yAxisLabel = cfg.yAxisLabel;\n this.shadowRoot.getElementById('dataTable').columns = this.tablecolumns;\n }\n cfg.timeseries &&\n cfg.timeseries.forEach(ts => {\n if (ts.maxDate) {\n maxDate = this._getTimestampFromDuration(ts.maxDate);\n }\n });\n\n if (cfg.plotLines) {\n cfg.plotLines.forEach(pl => {\n const _pl = { ...pl };\n _pl.id = `dynamic_${pl.id}`;\n _pl.value = this._getTimestampFromDuration(pl.value);\n xAxis.removePlotBandOrLine(_pl.id);\n if (pl.filter) {\n cfg.timeseries.some(item => item.ts_shortname === pl.filter) &&\n xAxis.addPlotLine(_pl);\n } else {\n xAxis.addPlotLine(_pl);\n }\n });\n } else {\n xAxis.plotLinesAndBands.forEach(\n pl => pl.id.includes('dynamic_') && xAxis.removePlotLine(pl.id),\n );\n }\n\n xAxis.removePlotLine('pz');\n xAxis.removePlotLine('trend');\n if (period === 'PT24H') {\n xAxis.setExtremes(minDate, dayjs(maxDate), false, false);\n } else if (this.forcePeriodRange) {\n xAxis.setExtremes(\n minDate,\n this.showUntilEndOfDay ? dayjs(maxDate).endOf('day') : dayjs(maxDate),\n false,\n false,\n );\n }\n\n /** Legacy variant with confidence interval + trend\n * Keep the \"typo\" in config this for backward compatibility\n * @TODO Choose forecast visualization in config file; e.g. type: \"deterministic\", \"conf_interval\"\n */\n if (cfg.showforcast) {\n this.drawForecast();\n }\n\n /** Deterministic: Single line with t0 */\n if (cfg.showForecastDeterministic) {\n this.drawForecastDeterministic();\n }\n\n this.chart.get('data') && this.chart.get('data').remove(false);\n\n if (GraphHelper.rangeObjectContains(this.files, cfg.data)) {\n const series = this._getSeries(\n cfg,\n GraphHelper.getFile(this.files, cfg),\n minDate,\n maxDate,\n );\n this.tableColumns = cfg.tableColumns ?? this.tableColumns;\n const tabledata = cfg.tableTemplate\n ? this.getTableValuesFromTemplate(\n cfg,\n GraphHelper.getFile(this.files, cfg),\n minDate,\n maxDate,\n )\n : Array.isArray(series)\n ? series[0]\n : series;\n if (tabledata) {\n // Sort and format\n // console.time('start');\n this.orderedTableData = orderBy(tabledata.data, [0], ['desc']).map(\n item => {\n const vals = [];\n item.forEach((_val, i) => {\n if (i > 0 && typeof _val === 'number') {\n vals.push(this._formatNumber(_val));\n }\n });\n // Use separate col for each value\n if (this.separateCol) {\n return {\n timestamp: dayjs(item[0]).format(cfg.dateformat || 'L LT'),\n value: vals, // Return array\n };\n }\n // Show in common value col with \" - \"\n if (vals.length === 3) {\n vals[1] = `${vals[1]}`;\n }\n const val = vals.join(' - ');\n\n if (tabledata.columns) {\n const retObj = {\n timestamp: dayjs(item[0]).format(cfg.dateformat || 'L LT'),\n value: val, // Return single value\n };\n tabledata.columns.split(',').forEach((col, i) => {\n if (i > 1 && item[i] !== undefined) {\n retObj[col] = item[i];\n }\n });\n return retObj;\n }\n\n return {\n timestamp: dayjs(item[0]).format(cfg.dateformat || 'L LT'),\n value: val, // Return single value\n };\n },\n );\n // console.timeEnd('start');\n this.shadowRoot.getElementById('dataTable').data =\n this.orderedTableData;\n }\n series.forEach((ts, i) => {\n this.chart.addSeries(ts, i === series.length - 1);\n });\n }\n }\n\n getRangeOptions() {\n return this.ranges || [];\n }\n\n showDescription() {\n this.descriptionVisible = !this.descriptionVisible;\n this.chart.series.forEach(ser => {\n if (ser.options.description) {\n ser.update(\n {\n name:\n this.descriptionVisible && ser.options.description\n ? `${ser.options.shortName}: ${ser.options.description}`\n : ser.options.shortName,\n selected: ser.options.visible, // Sync checkbox in legend\n },\n false,\n );\n }\n });\n this.chart.redraw();\n }\n\n getImageShare() {\n return this.api\n ? `${window.location.origin}${window.location.pathname.replace(\n /[^/]*$/,\n '',\n )}graph.html?stationId=${\n this.station.station_id\n }&component=ki-wwp-graph-ext&key=${encodeURIComponent(\n this.apppath?.path,\n )}&period=${this._selectedPeriod}`\n : '';\n }\n\n render() {\n // language=html\n const title =\n this.graphTitle && this.station\n ? template(this.graphTitle, this.station)\n : '';\n return html`
\n
${title}
\n {\n if (this.chart) {\n this.drawSeries(e.detail.value);\n }\n this._selectedPeriod = e.detail.value;\n }}\"\n .options=\"${this.getRangeOptions()}\"\n class=\"buttons\"\n .value=${this._selectedPeriod}\n >\n \n
\n {\n this.renderRoot.querySelector(\n '#embeddedgraph',\n ).value = `\"`;\n const popup = this.renderRoot.querySelector('#download-popup');\n if (this.imageShareAutoOpen) {\n window.open(this.getImageShare(), '_blank');\n }\n popup.visible ? popup.hide({}) : popup.show({});\n }}\n >\n \n \n ${this.i18n.t('embedGraph')} {\n this.renderRoot.querySelector('#download-popup').hide({});\n }}\"\n style=\"margin:0;height: 20px;width: 20px;line-height: 20px;\"\n icon=\"ki ki-times\"\n >\n
\n \n \n {\n window.open(this.getImageShare(), '_blank');\n }}\"\n title=\"${this.i18n.t('previewTitle')}\"\n >${this.i18n.t('preview')}\n {\n copyTextToClipboard(\n this.renderRoot.querySelector('#embeddedgraph').value,\n );\n }}\"\n title=\"${this.i18n.t('copyToClipboard')}\"\n >${this.i18n.t('copy')}\n \n \n \n \n {\n copyTextToClipboard(\n this.renderRoot\n .querySelector('#dataTable')\n .toCSV(getCsvDelimiter())\n .replace(/(<([^>]+)>)/gi, ''),\n );\n }}\n >\n {\n downloadFile(\n this.renderRoot\n .querySelector('#dataTable')\n .toCSV(getCsvDelimiter())\n .replace(/(<([^>]+)>)/gi, ''),\n `${this.station.station_no}_${this.station.station_name}_graph_table.csv`,\n );\n }}\n >\n \n
\n \n
\n
\n \n ${this._years.map(\n year =>\n html`${year.label}`,\n )}\n \n
\n
\n
\n \n \n
\n
`;\n }\n\n get _yAxisLabel() {\n return template(this.yAxisLabel, this.station);\n }\n\n get _years() {\n if (this.coverage) {\n let max = dayjs(this.coverage.max).tz().get('year');\n const min = dayjs(this.coverage.min).tz().get('year');\n if (this.hydroYearStart !== '01-01') {\n max -= 1;\n }\n const years = [{ value: 'YTD', label: this.i18n.t('currentYear') }];\n while (max >= min) {\n years.push({ value: max, label: max.toString() });\n max -= 1;\n }\n return years;\n }\n return [{ value: 'YTD', label: this.i18n.t('currentYear') }];\n }\n\n get tablecolumns() {\n return (\n this.tableColumns ?? [\n {\n field: 'timestamp',\n label: this.timestampLabel || this.i18n.t('timestamp'),\n sortable: true,\n hideAble: false,\n },\n {\n field: 'value',\n label: this._yAxisLabel || this.i18n.t('waterlevelcm'),\n sortable: false,\n format: 'html',\n css: 'text-align:right;padding-right:10px;',\n },\n ]\n );\n }\n\n _handleYearChange(e) {\n const { value } = e.target.selectedOption;\n const prevYear = value;\n const nextYear = (parseInt(value, 10) + 1).toString();\n\n const min =\n value && value !== 'YTD'\n ? dayjs(`${prevYear}${this.hydroYearStart}`, `YYYYMM-DD`).tz()\n : dayjs().tz().startOf('year');\n\n const max =\n value && value !== 'YTD'\n ? dayjs(`${nextYear}${this.hydroYearEnd}`, `YYYYMM-DD`).tz()\n : dayjs().tz();\n this.drawSeries('P1Y', min.valueOf(), max.valueOf());\n }\n\n showTable() {\n this.renderRoot.querySelector('#table-wrapper').classList.toggle('hidden');\n this.renderRoot\n .querySelector('#table-clipboard-btn')\n .classList.toggle('hideButton');\n this.renderRoot\n .querySelector('#table-download-csv-btn')\n .classList.toggle('hideButton');\n this.tableOpen = !this.tableOpen;\n this.chart && this.chart.reflow();\n }\n\n downloadGraph() {\n this.chart.update(\n {\n exporting: {\n chartOptions: {\n title: {\n text: this.graphTitle\n ? template(this.graphTitle, this.station)\n : '',\n },\n subtitle: {\n text: `${this.i18n.t('station_no')}: ${\n this.station.station_no\n } | ${this.i18n.t('request_at')} ${dayjs().format('LLLL')}
\n ${dayjs(this.chart.xAxis[0].min + 10000)\n .tz()\n .format('L')} - ${dayjs(this.chart.xAxis[0].max + 10000)\n .tz()\n .format('L')}`,\n },\n },\n filename: `${this.parameter_label}_${this.station.station_name}_${\n this.station.station_no\n }_${dayjs().tz().format('YYYYMMDD')}`,\n fallbackToExportServer: false,\n buttons: {\n contextButton: {\n enabled: false,\n },\n },\n sourceWidth: 1600,\n sourceHeight: 800,\n scale: 1,\n },\n },\n false,\n );\n this.chart.exportChartLocal();\n }\n\n async fetchData() {\n this.chart?.destroy();\n this.chart = null;\n const _files = {};\n this.station = this.station || (await this.api.getStation(this.stationId));\n const dataToFetch = [];\n\n this.station.timeseries.forEach(ts => {\n /**\n * Check if parameters match\n * In case of popup is requesting data: Check if @param href is specified in range */\n if (\n ts.station_parameter === this.station_parameter &&\n this.ranges.some(range => ts.href.includes(range.data))\n ) {\n dataToFetch.push(ts.href);\n }\n if (this.additionalTsFiles) {\n this.additionalTsFiles.forEach(addts => {\n if (ts.href.includes(addts)) {\n dataToFetch.push(ts.href);\n }\n });\n }\n if (this?.alarms?.file) {\n this.alarms.file.forEach(addts => {\n if (ts.href.includes(addts)) {\n dataToFetch.push(ts.href);\n }\n });\n }\n });\n\n await Promise.all(\n dataToFetch.map(async href => {\n const _path = href.split('/').reverse();\n const _id = `${_path[1]}/${_path[0]}`;\n _files[_id] = await this.api.getTsData(href);\n }),\n );\n\n this.files = _files;\n let selected = find(this.ranges, { selected: true });\n const yearcfg = find(this.ranges, range =>\n ['P1Y', 'PoR'].includes(range.value),\n );\n if (yearcfg && GraphHelper.rangeObjectContains(this.files, yearcfg.data)) {\n const tsdata = first(GraphHelper.getFile(this.files, yearcfg))?.data;\n if (tsdata && tsdata[0]) {\n this.coverage = {\n min: first(tsdata)[0],\n max: last(tsdata)[0],\n };\n } else console.warn('Coverage not set!');\n }\n selected = this._selectedPeriod || selected.value || this.ranges[0].value;\n if (!find(this.ranges, { value: selected })) {\n selected = this.ranges[0].value;\n }\n this._selectedPeriod = selected;\n this._setMaxValue(selected);\n if (this.station) {\n this.createChart();\n this.ranges.forEach(range => {\n if (range.timeseries) {\n if (this.additionalTsFiles) {\n this.additionalTsFiles.forEach(addf => {\n if (this.files[range.data]) {\n if (this.files[addf]) {\n this.files[range.data] = this.files[range.data].concat(\n this.files[addf],\n );\n }\n }\n });\n }\n\n /** Filter unwanted timeseries */\n range.timeseries = range.timeseries.filter(\n ts =>\n !ts.ts_shortname ||\n GraphHelper.getFile(this.files, range).some(\n tsfile => ts.ts_shortname === tsfile.ts_shortname,\n ),\n );\n }\n });\n\n this.drawSeries(selected);\n this.requestUpdate();\n }\n return this.files;\n }\n\n _setMaxValue(period) {\n const cfg = find(this.ranges, { value: period });\n if (GraphHelper.rangeObjectContains(this.files, cfg.data)) {\n let currentMax = -Infinity;\n let currentMin = Infinity;\n GraphHelper.getFile(this.files, cfg).forEach(ts => {\n ts.data.forEach(dp => {\n currentMax = Math.max(dp[1], currentMax);\n currentMin = Math.min(dp[1], currentMin);\n });\n });\n this.maxInitalValue = currentMax;\n this.minInitalValue = currentMin;\n }\n }\n\n // eslint-disable-next-line class-methods-use-this\n _getLastValue(data) {\n return data && data[0] ? last(last(data)) : null;\n }\n\n // eslint-disable-next-line class-methods-use-this\n _splitEventValues(data) {\n const artificalTs = [];\n data.forEach(ts => {\n ts.data.forEach(dp =>\n artificalTs.push({\n ts_name: dayjs(dp[0]).tz().format('L'),\n data: [dp],\n }),\n );\n });\n return artificalTs;\n }\n\n _getThreshold(ts, i, key, ploptions) {\n return merge(\n merge(\n {\n id: `${key}_${i}PL`,\n value: this._getLastValue(ts.data),\n width: 2,\n color: 'rgba(19, 19, 19, 1)',\n dashStyle: 'dash',\n zIndex: 111,\n label: {\n text: ts.ts_shortname\n ? ts.ts_shortname.replace('Cmd.', '')\n : ts.ts_name,\n align: 'right',\n y: 12,\n x: 0,\n },\n },\n ploptions,\n ),\n (this.threshholdMappings && this.threshholdMappings[ts.ts_shortname]) ||\n {},\n );\n }\n\n // eslint-disable-next-line class-methods-use-this\n _getLevelData(data) {\n const lastValue = last(data);\n return data.length\n ? [\n [1, lastValue[1]],\n [2, lastValue[1]],\n ]\n : [];\n }\n\n _getThreshholds(\n graphOptions,\n list,\n key,\n label,\n ploptions = null,\n visible = true,\n ) {\n if (visible !== 'auto' && typeof visible === 'string') {\n visible = this.layerName === visible;\n }\n\n let color;\n list.forEach((ts, i) => {\n const al = this._getThreshold(ts, i, key, ploptions);\n color = al.color || 'rgba(255,255,255,0)';\n graphOptions.series.push({\n label: {\n enabled: true,\n connectorAllowed: true,\n style: {\n color: 'rgb(19,19,19)',\n fontWeight: 'normal',\n },\n },\n dashStyle: al.dashStyle,\n width: al.width,\n xAxis: 'alarmAxis',\n marker: { enabled: false },\n enableMouseTracking: false,\n linkedTo: key,\n showInLegend: false,\n data: this._getLevelData(ts.data),\n description: al.label.description,\n shortName: al.label.text,\n name:\n this.descriptionVisible && al.label.description\n ? al.label.description\n : al.label.text,\n color,\n });\n });\n graphOptions.series.push({\n name: label,\n color: list.length === 1 ? color : 'rgba(255,255,255,0)',\n id: key,\n visible,\n selected: visible,\n });\n }\n\n createGraphOptions() {\n const alarmFileName = this.alarms?.file;\n let alarmFile = alarmFileName\n ? compact(flatten(alarmFileName.map(file => this.files[file])))\n : null;\n const graphOptions = {\n chart: {\n // zoomType: \"x\",\n animation: false,\n type: this.chartType,\n pinchType: undefined,\n zoomType: this.zoomType,\n panning: {\n enabled: false,\n },\n },\n boost: {\n enabled: this.boost,\n useGPUTranslations: false,\n allowForce: false,\n },\n series: [],\n plotOptions: {\n area: {\n threshold: -Infinity,\n },\n column: {\n groupPadding: 0,\n },\n series: {\n // boostThreshold:0,\n // turboThreshold:0,\n animation: false,\n gapSize: this.gapSize !== undefined ? this.gapSize : 1,\n label: {\n enabled: false,\n },\n states: {\n inactive: {\n opacity: 1,\n },\n },\n },\n },\n yAxis: merge(\n {\n id: 'mainYAxis',\n plotLines: [],\n },\n this.yAxis,\n ),\n xAxis: [\n {\n id: 'mainXAxis',\n type: 'datetime',\n ordinal: false,\n labels: {\n formatter() {\n return this.dateTimeLabelFormat === '%e. %b' &&\n this.tickPositionInfo.unitName === 'hour'\n ? `${this.axis.defaultLabelFormatter.call(this)}`\n : this.axis.defaultLabelFormatter.call(this);\n },\n },\n },\n {\n visible: false,\n min: 1,\n max: 2,\n id: 'alarmAxis',\n },\n ],\n };\n this.hasAlarms = false;\n\n // Read alarms/thresholds provided as station/timeseries attributes (e.g. Station, week.json, year.json)\n if (this.attributeThresholds.length) {\n this._addAttributeThresholds(graphOptions);\n }\n\n if (this.alarms?.stationAttributes) {\n alarmFile = [];\n this.alarms.items.forEach(item => {\n item.tsList.forEach(ts => {\n if (this.station[ts]) {\n alarmFile.push({\n ts_shortname: ts,\n data: [[new Date().getTime(), parseFloat(this.station[ts])]],\n });\n }\n });\n });\n }\n\n if (alarmFile && alarmFile.some(ts => ts.data.length > 0)) {\n let spare = true;\n this.alarms?.items?.forEach((item, i) => {\n const alarms = alarmFile.filter(ts =>\n item.tsList.includes(ts.ts_shortname),\n );\n if (alarms.some(ts => ts.data.length)) {\n let { active } = item;\n if (item.active === 'auto') {\n if (alarms[0].data[0][1] > this.maxInitalValue) {\n active = false;\n } else {\n active = true;\n }\n\n if (!active && spare) {\n active = true;\n spare = false;\n }\n } else if (item.active === 'automin') {\n if (alarms[0].data[0][1] < this.minInitalValue) {\n active = false;\n } else {\n active = true;\n }\n\n if (!active && spare) {\n active = true;\n spare = false;\n }\n }\n this._getThreshholds(\n graphOptions,\n alarms,\n `alerts${i}_`,\n item.label || this.i18n.t('alarmlevels'),\n null,\n active,\n );\n this.hasAlarms = true;\n }\n });\n }\n\n if (this.files[this.events]) {\n const defaultPlOptions = {\n width: 2,\n color: 'rgba(0, 86, 160, 1)',\n dashStyle: 'DashDot',\n label: {\n align: 'left',\n y: 12,\n x: 0,\n },\n };\n this._getThreshholds(\n graphOptions,\n this._splitEventValues(this.files[this.events]),\n 'events_',\n 'HW-Ereignisse',\n defaultPlOptions,\n false,\n );\n }\n return graphOptions;\n }\n\n // Searches through available data structures for attributes\n _findFile(fielditem) {\n // Check for station attributes (e.g. ww-me)\n if (this.station[fielditem.field]) return this.station;\n // Check for timeseries attributes (e.g. ww-brw))\n // Specify files to look at in app.json -> options -> thresholdFiles[]\n const res = this.thresholdFiles?.map(_file => {\n if (this.files && this.files[_file]) return _file;\n return null;\n });\n if (res) return first(this.files[first(res)]);\n // Nothing found, return undefined\n return res;\n }\n\n _addAttributeThresholds(graphOptions) {\n const _thresholds = [];\n\n this.attributeThresholds.forEach(item => {\n // Find desired field in files\n\n const _file = this._findFile(item);\n if (\n _file &&\n _file[item.field] &&\n _file[item.field] !== '' &&\n !Number.isNaN(_file[item.field])\n ) {\n _thresholds.push({\n ts_shortname: item.field,\n data: [[new Date().toISOString(), parseFloat(_file[item.field])]],\n label: item.label?.text || item.label,\n color: item.color,\n visible: item.visible,\n selected: item.selected,\n description: item.template\n ? template(item.description, _file)\n : item.description,\n shortName: item.label?.text || item.label,\n });\n }\n });\n if (_thresholds) {\n _thresholds.forEach((thres, i) => {\n graphOptions.series.push({\n xAxis: 'alarmAxis',\n marker: { enabled: false },\n enableMouseTracking: false,\n name: thres.label,\n label: {\n text: thres.label,\n enabled: true,\n },\n color: thres.color || 'rgba(255,255,255,0)',\n dashStyle: 'dash',\n id: `thres_${i}`,\n visible: thres.selected ?? true,\n selected: thres.selected ?? true,\n data: this._getLevelData(thres.data),\n description: thres.description,\n shortName: thres.label,\n });\n });\n this.hasAlarms = true;\n }\n }\n\n _getExtremes(attr) {\n if (typeof this[attr] === 'number') {\n return this[attr];\n }\n if (this[attr] && this.station[this[attr]]) {\n return this.station[this[attr]] ? Number(this.station[this[attr]]) : null;\n }\n return null;\n }\n\n defaultOptions() {\n const timezoneOffset = -dayjs\n .tz(\n dayjs().tz(),\n dayjs.defaultZone ? dayjs.defaultZone.name : dayjs.tz.guess(),\n )\n .utcOffset();\n\n const conf = merge(\n {\n title: {\n text: '',\n },\n subtitle: {\n text: this.subTitle || '',\n floating: true,\n },\n credits: this.creditOptions,\n events: {},\n exporting: {\n chartOptions: {\n title: {\n text: this.graphTitle\n ? template(this.graphTitle, this.station)\n : '',\n },\n subtitle: {\n text: `${this.i18n.t('station_no')}: ${\n this.station.station_no\n } | ${this.i18n.t('request_at')} ${dayjs().tz().format('LLLL')}`,\n },\n },\n filename: `${this.parameter_label}_${this.station.station_name}_${\n this.station.station_no\n }_${dayjs().tz().format('YYYYMMDD_kkmmss')}`,\n fallbackToExportServer: false,\n buttons: {\n contextButton: {\n enabled: false,\n },\n },\n sourceWidth: 1600,\n sourceHeight: 800,\n scale: 1,\n },\n navigator: {\n enabled: false,\n },\n rangeSelector: {\n enabled: false,\n },\n scrollbar: {\n enabled: false,\n },\n navigation: {\n enabled: false,\n },\n plotOptions: {\n series: {\n // gapSize: 1,\n // boostThreshold:0,\n // turboThreshold:0,\n dataGrouping: {\n enabled: false,\n },\n showCheckbox: ViewPort.size !== SM,\n events: {\n checkboxClick(event) {\n event.preventDefault();\n if (event.checked) {\n this.show();\n } else {\n this.hide();\n }\n },\n legendItemClick(event) {\n event.preventDefault();\n if (this.visible) {\n if (this.checkbox) {\n this.checkbox.checked = false;\n }\n this.hide();\n } else {\n if (this.checkbox) {\n this.checkbox.checked = true;\n }\n this.show();\n }\n },\n },\n },\n },\n legend: this.legendOptions,\n tooltip: {\n shared: true,\n split: false,\n },\n time: {\n // eslint-disable-next-line no-unused-vars\n getTimezoneOffset() {\n return timezoneOffset;\n },\n // dayjs: dayjs,\n // timezone: dayjs.defaultZone ? dayjs.defaultZone.name : dayjs.guess(),\n // useUTC: false\n },\n yAxis: {\n allowDecimals: !this.yAxisHideDecimals,\n reversed: this.yAxisReverse || false,\n minRange: this._getExtremes('yAxisMinRange'),\n softMax: this._getExtremes('yAxisMax'),\n softMin: this._getExtremes('yAxisMin'),\n opposite: false,\n title: {\n text: this._yAxisLabel || this.i18n.t('waterlevelcm'),\n },\n },\n series: [],\n },\n this.createGraphOptions(),\n );\n return conf;\n }\n}\n","// eslint-disable-next-line max-classes-per-file\nimport { customElement, property } from 'lit/decorators.js';\nimport { find } from 'lodash-es';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport { init, getCurrentApi } from '@kisters/wiski-web/api';\nimport { initConfig } from '@kisters/wcp-base/app';\nimport KiWwpGraph from './ki-wwp-graph';\n\n@customElement('ki-wwp-graph-ext')\nexport class KiWwpGraphExt extends KiWwpGraph {\n @property({ type: String })\n key;\n\n @property({ type: String })\n stationId;\n\n @property({ type: String })\n dataPath;\n\n favButton = false;\n\n firstUpdated() {\n this.numberFormatter = new Intl.NumberFormat(\n this.i18n.language,\n this.numberFormat || {},\n );\n this.initAppConfig();\n this.refreshInterval = setInterval(() => {\n this.fetchData();\n }, 300000);\n }\n\n async initAppConfig() {\n this.appcfg = await initConfig('./config/app.json', []);\n init({ dataPath: this.appcfg.apiPath });\n this.api = getCurrentApi();\n this.fetchData();\n }\n\n async fetchData() {\n dayjs.locale(this.i18n.language);\n const stationDetailComp = find(this.appcfg.route[0].children, {\n component: 'wwp-station-detail',\n });\n const configItem = find(stationDetailComp.children, { path: this.key });\n if (configItem) {\n Object.assign(this, configItem.options);\n }\n this._selectedPeriod = this.period;\n this.imageShare = false;\n this.tableOpen = false;\n super.fetchData();\n }\n}\n","import { html, css, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { first, last, orderBy } from 'lodash-es';\nimport { Mix, template } from '@kisters/wcp-base/common';\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport { getCurrentApi } from '@kisters/wiski-web/api';\nimport Highcharts from 'highcharts';\nimport serieslabel from 'highcharts/modules/series-label';\nimport { getRouteOptionsAndParams } from '@kisters/wcp-base/components';\nimport { AttributeThreshold } from './AttributeThreshold';\nimport nls from '../../locales';\n\nserieslabel(Highcharts);\n@customElement('ki-ww-cross-section')\nexport default class KiWwCrossSection extends Mix(LitElement, [\n i18nMixin,\n { nls },\n]) {\n // language=CSS\n static styles = css`\n :host {\n height: 100%;\n overflow-y: auto;\n width: 100%;\n display: flex;\n }\n #chart-node {\n display: table-cell;\n position: absolute;\n width: 100%;\n height: 100%;\n }\n\n #chart-wrapper {\n display: table-cell;\n position: relative;\n flex: 1;\n }\n `;\n\n @property({ attribute: false }) highcharts = Highcharts;\n\n attributeThresholds: Array = [];\n\n static get properties() {\n return {\n longTermValues: { type: Array, attribute: false },\n crossSection: { type: Object, attribute: false },\n weekData: { type: Object, attribute: false },\n };\n }\n\n connectedCallback() {\n if (super.connectedCallback) super.connectedCallback();\n\n this.longTermValues = [];\n this.numberFormatter = new Intl.NumberFormat(\n this.i18n.language,\n this.numberFormat || {},\n );\n\n window.addEventListener('resize', () =>\n setTimeout(() => {\n this.chart && this.chart.reflow();\n }, 2200),\n );\n }\n\n async onAfterEnter(location) {\n const params = getRouteOptionsAndParams(location, [\n 'layerName',\n 'stationId',\n 'stationLabel',\n ]);\n this.api = getCurrentApi();\n this.stationId = params.stationId;\n Object.assign(this, params.options);\n\n this.station = await this.api.getStation(this.stationId);\n this.fetchData();\n }\n\n createChart() {\n this.chart = this.highcharts.chart(\n this.renderRoot.querySelector('#chart-node'),\n this.chartOptions(),\n this.chartCreated.bind(this),\n );\n }\n\n _formatNumber(val) {\n return val === undefined || val === null || val === '' || Number.isNaN(val)\n ? ''\n : this.numberFormatter.format(val);\n }\n\n // eslint-disable-next-line class-methods-use-this\n chartOptions() {\n const self = this;\n return {\n credits: {\n enabled: false,\n },\n plotOptions: {\n series: {\n label: {\n enabled: true,\n },\n states: {\n inactive: {\n opacity: 1,\n },\n },\n },\n },\n title: {\n text: this.i18n.t('crossSectionView'),\n },\n tooltip: {\n enabled: true,\n valueSuffix: ' m',\n formatter(tooltip) {\n if (self.waterlevelUnit === 'cm') {\n return `${self.i18n.t('distance')} ${\n this.x\n } m
${\n this.series.name\n }: ${parseInt(this.y * 100, 10)} cm `;\n }\n return tooltip.defaultFormatter.call(this, tooltip);\n },\n headerFormat: `${self.i18n.t('distance')} {point.key} m
`,\n valueDecimals: 1,\n },\n yAxis: {\n title: {\n text: this.yAxisLabel || this.i18n.t('height'),\n },\n },\n legend: {\n title: {\n text: '',\n },\n },\n xAxis: {\n title: {\n text: `${this.i18n.t('distance')} [m]`,\n },\n labels: {\n formatter() {\n return `${self._formatNumber(this.value)}`;\n },\n },\n },\n };\n }\n\n // name, data, color, z, show\n addNewLineToChart(newSeries) {\n newSeries.type = 'line';\n newSeries.shortName = newSeries.label;\n newSeries.name = newSeries.template\n ? `${newSeries.ts_name} - ${template(\n newSeries.description,\n newSeries.station,\n )}`\n : `${newSeries.ts_name} - ${newSeries.description}`;\n newSeries.showInLegend = true;\n newSeries.label = {\n enabled: true,\n style: { color: '#000000' },\n };\n newSeries.visible = true; // Add all default visible ts here\n\n newSeries.data = [\n [0, newSeries.ts_value / 100],\n [last(this.chart.series[0].data).x, newSeries.ts_value / 100],\n ];\n newSeries.zIndex = 50;\n\n // Do not show data points\n newSeries.marker = {\n enabled: false,\n states: { hover: { enabled: false }, inactive: { opacity: 1 } },\n };\n // newSeries.states = {\"hover\": {\"enabled\": false, \"opacity\": 1}};\n\n this.chart.addSeries(newSeries);\n }\n\n addNewAreaToChart(name, data, color, z) {\n const newSeries = {};\n newSeries.type = 'area';\n newSeries.id = name;\n newSeries.name = name;\n newSeries.label = {\n enabled: false,\n };\n\n if (Array.isArray(data)) newSeries.data = data;\n else {\n // Span line over whole chart\n const x_max = last(this.chart.series[0].data).x;\n\n const level_data = [];\n level_data.push({ x: 0, y: data });\n level_data.push({ x: x_max, y: data });\n newSeries.data = level_data;\n }\n newSeries.color = color;\n newSeries.fillColor = color;\n newSeries.zIndex = z;\n newSeries.threshold = null;\n\n // Do not show data points\n newSeries.marker = {\n enabled: false,\n states: { hover: { enabled: false }, inactive: { opacity: 1 } },\n };\n // newSeries.states = {\"hover\": {\"enabled\": false, \"opacity\": 1}};\n\n this.chart.addSeries(newSeries);\n }\n\n chartCreated(chart) {\n const e = new CustomEvent('load', {\n detail: chart,\n });\n this.dispatchEvent(e);\n }\n\n updated() {\n if (this.chart) {\n this.chart.reflow();\n }\n }\n\n _fillLineData(level) {\n const crossSectionData = this.crossSection[0].polygon.point;\n return crossSectionData.map(dp => ({ x: dp.x, y: level }));\n }\n\n render() {\n return html`
\n
\n
`;\n }\n\n async fetchData() {\n // Get profile polygon\n const _files = {};\n this.crossSection = await this.api.getTsData(\n `internet/stations/${this.station.site_no}/${this.station.station_no}/cross_section/cross_section.json`,\n );\n\n // Get waterlevel week.json\n await Promise.all(\n this.station.timeseries\n .filter(ts => ts.station_parameter === this.station_parameter)\n .map(async ts => {\n _files[last(ts.href.split('/'))] = await this.api.getTsData(ts.href);\n }),\n );\n this.weekData = first(_files['week.json'])?.data;\n\n this.createChart();\n const crossSectionData = first(this.crossSection)?.polygon?.point;\n // Plot profile\n this.addNewAreaToChart(\n this.i18n.t('terrain'),\n crossSectionData,\n 'rgba(164, 100, 30, 1)',\n 15,\n );\n\n // Add current waterlevel\n const lastlevel = last(this.weekData)[1]; // Access latest data point\n this.addNewAreaToChart(\n this.i18n.t('currentWaterlevel'),\n this._fillLineData(lastlevel / 100),\n 'rgba(10, 67, 119, 0.5)',\n 3,\n ); // cm -> m\n\n // Extract additional timeseries which should be display\n if (this.attributeThresholds) {\n const stationObj = first(_files['week.json']);\n this.attributeThresholds.forEach(at => {\n if (Object.keys(stationObj).includes(at.field)) {\n this.longTermValues.push({\n station: stationObj,\n ts_name: at.field,\n ts_value: parseFloat(stationObj[at.field]),\n ...at,\n });\n }\n });\n }\n\n // Add additional timeseries\n orderBy(this.longTermValues, 'ts_value', ['desc']).forEach(i => {\n this.addNewLineToChart(i); // cm -> m\n });\n }\n}\n","import { TsDataPoint } from '../../common/timeseries';\n\nexport class WaterlevelTable {\n Stations: TsDataPoint[];\n\n NoAlarm: string[];\n\n Alarm1: string[];\n\n Alarm2: string[];\n\n Alarm3: string[];\n\n Unclassified: string[];\n\n constructor() {\n this.Stations = [];\n this.NoAlarm = [];\n this.Alarm1 = [];\n this.Alarm2 = [];\n this.Alarm3 = [];\n this.Unclassified = [];\n }\n}\n","import { css } from 'lit';\n\nexport default css`\n :host {\n overflow: auto;\n display: flex;\n flex-wrap: wrap;\n }\n\n .box {\n margin: 15pt;\n width: 45vw;\n max-width: 450px;\n }\n\n fieldset {\n height: 400px;\n }\n\n .kennzahlen-table {\n margin: 10px;\n width: 100%;\n }\n\n @media screen and (max-width: 1000px) {\n .box {\n width: 95vw;\n max-width: 900px;\n font-size: 0.9em;\n margin: 5px;\n }\n\n fieldset {\n height: auto;\n }\n\n .kennzahlen-table {\n margin: 0px;\n }\n }\n\n h3 {\n color: #383838;\n }\n\n table,\n th,\n td {\n border-bottom: 1px solid #686868;\n border-collapse: collapse;\n color: #383838;\n }\n\n th {\n text-align: left;\n padding: 10px;\n }\n\n th.val {\n text-align: right;\n padding: 10px;\n }\n\n td {\n padding: 10px;\n }\n\n td:nth-child(2) {\n text-align: right;\n }\n\n a:link {\n text-decoration: none;\n color: rgba(0, 158, 224, 1);\n }\n\n a:visited {\n text-decoration: none;\n color: #005596;\n }\n\n a:hover {\n text-decoration: none;\n font-weight: bold;\n color: #005596;\n }\n\n legend {\n color: #686868;\n }\n\n fieldset {\n border: 1px #686868 solid;\n }\n\n a:active {\n text-decoration: none;\n }\n\n .maplink {\n width: 100%;\n float: right;\n }\n`;\n","/* eslint-disable func-names */\n/* eslint-disable array-callback-return */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable no-console */\nimport { html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { getRouteOptionsAndParams } from '@kisters/wcp-base/components';\n// eslint-disable-next-line import/extensions\nimport { property } from 'lit/decorators/property.js';\nimport { i18nMixin } from '@kisters/wcp-base/decorators';\nimport { getCurrentApi } from '@kisters/wiski-web/api';\nimport { Mix } from '@kisters/wcp-base/common';\nimport { WaterlevelTable } from './WaterlevelTable';\nimport style from './ki-ww-start.css?inline';\nimport nls from '../../locales';\n\n@customElement('ki-ww-start')\nexport default class KiWwStart extends Mix(LitElement, [i18nMixin, { nls }]) {\n // language=CSS\n static styles = style;\n\n @property({ type: String })\n htmlPath = './html';\n\n // Waterlevel LayerName for Table\n @property({ type: String })\n layerName;\n\n // HTML-File containing announcement content (do not provide file ending)\n @property({ type: String })\n announcementFilename;\n\n @property({ type: Object })\n waterlevelTable: WaterlevelTable = new WaterlevelTable();\n\n render() {\n return html`\n
\n
\n Water Level\n
\n

Situation Report

\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
AlarmCount
Above Alarm Level 3${this.waterlevelTable.Alarm3.length}
Above Alarm Level 2${this.waterlevelTable.Alarm2.length}
Above Alarm Level 1${this.waterlevelTable.Alarm1.length}
No Alarm Level${this.waterlevelTable.NoAlarm.length}
Unclassified Stations${this.waterlevelTable.Unclassified.length}
\n
\n

\n Show on map\n

\n
\n
\n\n
\n
\n Announcements\n
\n \n
\n
\n
\n `;\n }\n\n onAfterEnter(location) {\n this.api = getCurrentApi();\n const params = getRouteOptionsAndParams(location, ['layerName']);\n this.layerName = params.options?.layerName;\n this.announcementFilename = params.options?.announcementFilename;\n this.fetchData(this.layerName);\n }\n\n async fetchData(layerName) {\n const layers = await this.api.getLayers();\n this.waterlevelTable = new WaterlevelTable();\n this.waterlevelTable.Stations = await this.api.getLayerData(\n layers[layerName],\n );\n this.waterlevelTable.Stations.forEach(e => {\n // Check if Station has AlarmLevels\n if (e.Alarm_Level_1 === '')\n this.waterlevelTable.Unclassified.push(e.station_name);\n else if (this.isSmaller(e.ts_value, e.Alarm_Level_1))\n this.waterlevelTable.NoAlarm.push(e.station_name);\n else if (this.isSmaller(e.ts_value, e.Alarm_Level_2))\n this.waterlevelTable.Alarm1.push(e.station_name);\n else if (this.isSmaller(e.ts_value, e.Alarm_Level_3))\n this.waterlevelTable.Alarm2.push(e.station_name);\n else if (this.isSmaller(e.Alarm_Level_3, e.ts_value))\n this.waterlevelTable.Alarm3.push(e.station_name);\n });\n\n // console.log(this.waterlevelTable);\n\n this.requestUpdate();\n }\n\n /** \n * Compare two strings |\n true: a < b |\n false: a > b or if any parameter is undefined (e.g. station does not habve \"Alarm_Level_*\")\n */\n isSmaller(a: string | undefined, b: string | undefined) {\n if (a && b) return Number(a) < Number(b);\n console.warn('Undefined parameters');\n return false;\n }\n\n getStationNames(stationList) {\n const showMax = 8;\n let result = '';\n stationList.slice(0, showMax).forEach(s => {\n result += `${s}, `;\n });\n // Remove trailing comma\n if (stationList.length < showMax)\n result = result.substring(0, result.length - 2);\n else result += ' ...';\n return result;\n }\n}\n","import { html, css, LitElement } from 'lit';\n// eslint-disable-next-line import/extensions\nimport { customElement, property } from 'lit/decorators.js';\nimport * as echarts from 'echarts/core';\nimport { LineChart, ScatterChart, BarChart } from 'echarts/charts';\nimport { SVGRenderer, CanvasRenderer } from 'echarts/renderers';\nimport { UniversalTransition } from 'echarts/features';\nimport {\n ToolboxComponent,\n TooltipComponent,\n LegendComponent,\n GraphicComponent,\n DataZoomComponent,\n MarkLineComponent,\n TitleComponent,\n GridComponent\n} from 'echarts/components';\n// eslint-disable-next-line import/extensions\nimport dark from './dark.json';\n\nimport { getQueryObject } from '../../decorators/query';\n\necharts.use([\n ToolboxComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n GraphicComponent,\n DataZoomComponent,\n MarkLineComponent,\n GridComponent,\n LineChart,\n BarChart,\n ScatterChart,\n SVGRenderer,\n CanvasRenderer,\n UniversalTransition,\n]);\n\necharts.registerTheme('dark', dark);\n\n@customElement('ki-echart')\nexport default class KiEchart extends LitElement {\n static styles = css`\n :host {\n height: 100%;\n width: 100%;\n display: block;\n overflow: hidden;\n }\n .chart {\n height: 100%;\n width: 100%;\n }\n `;\n\n @property({ type: Object })\n options: any;\n\n @property({ type: Boolean })\n darkMode: boolean = false;\n\n @property({ type: Object, attribute: false })\n chart: any = false;\n\n @property({ type: Boolean })\n svgRenderer: boolean = true;\n\n get chartElement() {\n return getQueryObject(this, '#chart');\n }\n\n initChart() {\n this.chart = echarts.init(this.chartElement, this.darkMode ? 'dark' : '', { renderer: this.svgRenderer ? 'svg' : 'canvas' });\n }\n\n rerenderChart() {\n if (this.chart) {\n echarts.dispose(this.chart);\n }\n this.initChart();\n this.updated();\n }\n\n firstUpdated() {\n this.initChart();\n }\n\n updated() {\n if (this.chart && this.options && ((!this.options.xAxis?.data) || this.options.xAxis.data.length > 0)) {\n this.chart.setOption(this.options);\n }\n }\n\n updateTheme(isDark: boolean) {\n this.darkMode = isDark;\n this.rerenderChart();\n }\n\n resize() {\n this.chart.resize();\n }\n\n render() {\n return html`
`;\n }\n}\n","import { html, css, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport '@kisters/wcp-base/components/ki-echart/ki-echart';\n\nexport const widgetType = {\n default: 1,\n addNew: 2,\n empty: 3,\n};\n\n@customElement('ki-widget')\nexport default class KiWidget extends LitElement {\n static styles = css`\n :host {\n height: 100%;\n width: 100%;\n display: block;\n overflow: hidden;\n }\n .widget-container {\n height: 100%;\n width: 100%;\n }\n `;\n\n type: number = widgetType.empty;\n\n configuration: string = '';\n\n static get properties() {\n return {\n configuration: { type: String },\n type: { type: Number },\n };\n }\n\n renderWidgetContent() {\n switch (this.type) {\n case widgetType.addNew:\n return '+';\n case widgetType.empty:\n return '';\n case widgetType.default:\n case undefined:\n default: {\n const config = JSON.parse(this.configuration ?? '{}');\n if (config) {\n return html``;\n }\n return config.text ?? '';\n }\n }\n }\n\n render() {\n return html`\n
${this.renderWidgetContent()}
\n `;\n }\n}\n","// TODO: store in config\nconst configServerUrl = 'http://localhost:3300';\n\nexport enum rowType {\n fullRow,\n halfRow,\n thirdRow,\n}\n\nexport enum elementType {\n default,\n addNew,\n empty,\n dropTarget,\n}\n\nexport const getLayout = async (\n uuid: string,\n): Promise<{\n layout: {\n rowType: rowType;\n elementType?: elementType;\n configuration?: { text: string };\n }[][];\n name: string;\n description: string;\n}> => {\n const response = await fetch(\n `${configServerUrl}/config/${encodeURIComponent(uuid)}`,\n {\n method: 'GET',\n mode: 'cors',\n cache: 'no-cache',\n headers: {\n Accept: 'application/json',\n },\n },\n );\n return response.json();\n};\n\nexport const saveLayout = async (\n name: string,\n description: string,\n layout: {\n rowType: rowType;\n elementType?: elementType;\n configuration?: { text: string };\n }[][],\n): Promise => {\n const response = await fetch(`${configServerUrl}/config`, {\n method: 'POST',\n mode: 'cors',\n cache: 'no-cache',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n },\n redirect: 'follow',\n referrerPolicy: 'no-referrer',\n body: JSON.stringify({\n name,\n description,\n layout,\n }),\n });\n return (await response.json()).uuid;\n};\n\nexport const getExampleLayout = (): {\n rowType: rowType;\n elementType?: elementType;\n configuration?: Object;\n}[][] => [\n [\n {\n rowType: rowType.thirdRow,\n configuration: {\n xAxis: {\n type: 'category',\n data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n },\n yAxis: {\n type: 'value',\n },\n series: [\n {\n data: [1.5, 2.3, 2.24, 2.18, 1.35, 1.47, 2.6, 1.1],\n type: 'line',\n },\n ],\n },\n },\n {\n rowType: rowType.thirdRow,\n configuration: {\n xAxis: {\n type: 'category',\n data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n },\n yAxis: {\n type: 'value',\n },\n series: [\n {\n data: [1.5, 2.3, 2.24, 2.18, 1.35, 1.47, 2.6, 1.2],\n type: 'line',\n },\n ],\n },\n },\n {\n rowType: rowType.thirdRow,\n configuration: {\n xAxis: {\n type: 'category',\n data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n },\n yAxis: {\n type: 'value',\n },\n series: [\n {\n data: [1.5, 2.3, 2.24, 2.18, 1.35, 1.47, 2.6, 1.3],\n type: 'line',\n },\n ],\n },\n },\n ],\n [\n {\n rowType: rowType.thirdRow,\n configuration: {\n xAxis: {\n type: 'category',\n data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n },\n yAxis: {\n type: 'value',\n },\n series: [\n {\n data: [1.5, 2.3, 2.24, 2.18, 1.35, 1.47, 2.6, 2.1],\n type: 'line',\n },\n ],\n },\n },\n {\n rowType: rowType.thirdRow,\n configuration: {\n xAxis: {\n type: 'category',\n data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n },\n yAxis: {\n type: 'value',\n },\n series: [\n {\n data: [1.5, 2.3, 2.24, 2.18, 1.35, 1.47, 2.6, 3.1],\n type: 'line',\n },\n ],\n },\n },\n ],\n [\n {\n rowType: rowType.thirdRow,\n configuration: {\n xAxis: {\n type: 'category',\n data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n },\n yAxis: {\n type: 'value',\n },\n series: [\n {\n data: [1.5, 2.3, 2.24, 2.18, 1.35, 1.47, 2.6, 3.1],\n type: 'line',\n },\n ],\n },\n },\n ],\n [\n {\n rowType: rowType.halfRow,\n configuration: {\n xAxis: {\n type: 'category',\n data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n },\n yAxis: {\n type: 'value',\n },\n series: [\n {\n data: [1.5, 2.3, 2.24, 2.18, 1.35, 1.47, 2.6, 8],\n type: 'line',\n },\n ],\n },\n },\n {\n rowType: rowType.halfRow,\n configuration: {\n xAxis: {\n type: 'category',\n data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n },\n yAxis: {\n type: 'value',\n },\n series: [\n {\n data: [1.5, 2.3, 2.24, 2.18, 1.35, 1.47, 2.6, 8],\n type: 'line',\n },\n ],\n },\n },\n ],\n [\n {\n rowType: rowType.halfRow,\n configuration: {\n xAxis: {\n type: 'category',\n data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n },\n yAxis: {\n type: 'value',\n },\n series: [\n {\n data: [1.5, 2.3, 2.24, 2.18, 1.35, 1.47, 2.6, 8],\n type: 'line',\n },\n ],\n },\n },\n ],\n [\n {\n rowType: rowType.fullRow,\n configuration: {\n xAxis: {\n type: 'category',\n data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n },\n yAxis: {\n type: 'value',\n },\n series: [\n {\n data: [1.5, 2.3, 2.24, 2.18, 1.35, 1.47, 2.6, 8],\n type: 'line',\n },\n ],\n },\n },\n ],\n [\n {\n rowType: rowType.fullRow,\n configuration: {\n xAxis: {\n type: 'category',\n data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n },\n yAxis: {\n type: 'value',\n },\n series: [\n {\n data: [1.5, 2.3, 2.24, 2.18, 1.35, 1.47, 2.6, 8],\n type: 'line',\n },\n ],\n },\n },\n ],\n [\n {\n rowType: rowType.fullRow,\n configuration: {\n xAxis: {\n type: 'category',\n data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n },\n yAxis: {\n type: 'value',\n },\n series: [\n {\n data: [1.5, 2.3, 2.24, 2.18, 1.35, 1.47, 2.6, 8],\n type: 'line',\n },\n ],\n },\n },\n ],\n [\n {\n rowType: rowType.fullRow,\n configuration: {\n xAxis: {\n type: 'category',\n data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n },\n yAxis: {\n type: 'value',\n },\n series: [\n {\n data: [1.5, 2.3, 2.24, 2.18, 1.35, 1.47, 2.6, 9],\n type: 'line',\n },\n ],\n },\n },\n ],\n];\n","export enum DragAreas {\n Upper,\n Lower,\n Center,\n}\n\nexport const getAreaOfDrag = (e: {\n layerX: number;\n layerY: number;\n target: {\n clientWidth: number;\n clientHeight: number;\n };\n}): DragAreas => {\n const thresholdFactor = 0.1;\n const minThreshold = e.target.clientHeight * thresholdFactor;\n const maxThreshold = e.target.clientHeight - minThreshold;\n\n if (e.layerY < minThreshold) {\n return DragAreas.Upper;\n }\n\n if (e.layerY > maxThreshold) {\n return DragAreas.Lower;\n }\n\n return DragAreas.Center;\n};\n","import { html, css, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport '@kisters/wcp-base/components/ki-icon/ki-icon-btn';\nimport { widgetType } from '../ki-widget/ki-widget.ts';\nimport { elementType, rowType } from './service/layout-service';\nimport { DragAreas, getAreaOfDrag } from './service/layout-helper';\n\nconst renderElementContent = element => {\n let elementWidgetType;\n switch (element.elementType) {\n case elementType.addNew:\n elementWidgetType = widgetType.addNew;\n break;\n case elementType.empty:\n elementWidgetType = widgetType.empty;\n break;\n case elementType.dropTarget:\n case elementType.default:\n case undefined:\n default:\n elementWidgetType = widgetType.default;\n break;\n }\n\n return html`\n \n `;\n};\n\nconst renderNewRowDropTarget = content => html`\n
${content}
\n`;\n\nconst patchRow = rowArray => {\n const currentLength = rowArray.length;\n const patchedArray = [...rowArray];\n const firstElement = rowArray[0];\n const addNewExists = firstElement.elementType === elementType.addNew;\n if (\n (firstElement.rowType === rowType.halfRow && currentLength < 2) ||\n (firstElement.rowType === rowType.thirdRow && currentLength < 3)\n ) {\n patchedArray.push({\n rowType: firstElement.rowType,\n elementType: addNewExists ? elementType.empty : elementType.addNew,\n });\n if (firstElement.rowType === rowType.thirdRow && currentLength < 2) {\n patchedArray.push({\n rowType: firstElement.rowType,\n elementType: elementType.empty,\n });\n }\n }\n return patchedArray;\n};\n\nconst getFirstLayoutElement = elementArray => {\n let foundElement;\n\n elementArray.every(element => {\n foundElement = element;\n return element['data-row'] === undefined;\n });\n\n return foundElement;\n};\n\n@customElement('ki-dynamic-layout')\nexport default class KiDynamicLayout extends LitElement {\n static styles = css`\n :host {\n height: 100%;\n width: 100%;\n display: block;\n overflow: auto;\n }\n .layout-container {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n -webkit-transform: translateZ(\n 0\n ); /* is needed to scroll while dragging in chrome */\n gap: 20px;\n }\n .layout-row {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: 20px;\n width: 100%;\n box-sizing: border-box;\n }\n .layout-element {\n min-width: 200px;\n border: 1px solid green;\n box-sizing: border-box;\n flex: 1;\n position: relative;\n }\n .height-s {\n height: 400px;\n }\n .height-l {\n height: 500px;\n }\n .not-displayed {\n display: none;\n }\n .hidden {\n visibility: hidden;\n }\n .close-button {\n position: absolute;\n margin-top: 5px;\n margin-right: 5px;\n top: 0;\n right: 0;\n }\n .append-button {\n position: absolute;\n margin-right: 5px;\n top: 45%;\n right: 0;\n }\n `;\n\n layout: {\n rowType: rowType;\n elementType?: elementType;\n configuration?: { text: string };\n }[][] = [];\n\n cachedLayout: {\n rowType: rowType;\n elementType?: elementType;\n configuration?: { text: string };\n }[][] = [];\n\n succesfullyDropped: boolean = false;\n\n validTarget: boolean = false;\n\n newRowAfter: number | undefined;\n\n lastDragArea: DragAreas | undefined;\n\n currentDraggedElement: {\n element: {\n rowType: rowType;\n elementType?: elementType;\n configuration?: {\n text: string;\n };\n };\n row: any;\n column: any;\n } | null = null;\n\n static get properties() {\n return {\n layout: { type: Array, attribute: false },\n cachedLayout: { type: Array, attribute: false },\n currentDraggedElement: { type: Object, attribute: false },\n succesfullyDropped: { type: Boolean, attribute: false },\n validTarget: { type: Boolean, attribute: false },\n newRowAfter: { type: Number, attribute: false },\n };\n }\n\n appendElement(row) {\n this.layout[row].forEach(item => {\n // eslint-disable-next-line no-param-reassign\n item.rowType += 1;\n });\n this.cacheCurrentLayout();\n this.rerenderItems();\n }\n\n cacheCurrentLayout() {\n this.cachedLayout = [];\n\n this.layout.forEach(rowArray => this.cachedLayout.push([...rowArray]));\n }\n\n // eslint-disable-next-line class-methods-use-this\n deleteElement(row: number, column: number) {\n if (this.layout[row].length > column) {\n if (this.layout[row].length === 1) {\n this.layout.splice(row, 1);\n } else {\n this.layout[row].splice(column, 1);\n }\n } else {\n this.layout[row].forEach(item => {\n // eslint-disable-next-line no-param-reassign\n item.rowType -= 1;\n });\n }\n this.cacheCurrentLayout();\n this.rerenderItems();\n }\n\n elementDragStart(event) {\n this.cacheCurrentLayout();\n this.succesfullyDropped = false;\n this.validTarget = false;\n\n const { target } = event;\n\n const draggedElementRow = target['data-row'];\n const draggedElementColumn = target['data-column'];\n\n const tempCurrentDraggedElement = {\n element: this.layout[draggedElementRow][draggedElementColumn],\n row: draggedElementRow,\n column: draggedElementColumn,\n };\n\n const currentRowType = tempCurrentDraggedElement.element.rowType;\n\n // this timeout is necessary. https://stackoverflow.com/questions/19639969/html5-dragend-event-firing-immediately\n setTimeout(() => {\n this.currentDraggedElement = tempCurrentDraggedElement;\n this.removeItem(draggedElementRow, draggedElementColumn, currentRowType);\n }, 10);\n }\n\n switchTargetToExistingRow(event, targetDomElement, targetElementRow) {\n const targetElementColumn = targetDomElement['data-column'];\n const targetElement = this.layout[targetElementRow][targetElementColumn];\n const targetElementRowType = this.layout[targetElementRow][0].rowType;\n const targetElementType = targetElement?.elementType ?? elementType.default;\n\n if (targetElementType === elementType.dropTarget) {\n return;\n }\n\n const isFullRowTarget =\n targetElementRowType === rowType.fullRow &&\n this.layout[targetElementRow][0].elementType === elementType.addNew;\n if (\n (targetElementRowType !== rowType.thirdRow ||\n this.layout[targetElementRow].length >= 3) &&\n (targetElementRowType !== rowType.halfRow ||\n this.layout[targetElementRow].length >= 2) &&\n !isFullRowTarget\n ) {\n return;\n }\n\n if (!this.currentDraggedElement) {\n return;\n }\n\n const removeElements = isFullRowTarget ? 1 : 0;\n const targetColumn = targetElement\n ? targetElementColumn\n : this.layout[targetElementRow].length;\n const tempElement = {\n rowType: targetElementRowType,\n configuration: this.currentDraggedElement.element.configuration,\n elementType: elementType.dropTarget,\n };\n this.layout[targetElementRow].splice(\n targetColumn,\n removeElements,\n tempElement,\n );\n this.validTarget = true;\n event.preventDefault();\n this.requestUpdate();\n }\n\n switchTarget(event, dragArea: DragAreas) {\n if (!this.currentDraggedElement) {\n return;\n }\n\n this.removeOldElement();\n\n const targetDomElement = getFirstLayoutElement(event.composedPath());\n\n const targetElementRow = targetDomElement['data-row'];\n\n if (dragArea === DragAreas.Lower) {\n this.newRowAfter = targetElementRow;\n this.validTarget = true;\n event.preventDefault();\n this.requestUpdate();\n } else if (dragArea === DragAreas.Upper && targetElementRow > 0) {\n this.newRowAfter = targetElementRow - 1;\n this.validTarget = true;\n event.preventDefault();\n this.requestUpdate();\n } else {\n this.switchTargetToExistingRow(event, targetDomElement, targetElementRow);\n }\n }\n\n elementDragOver(event) {\n const currentDragArea = getAreaOfDrag(event);\n\n if (currentDragArea !== this.lastDragArea) {\n this.switchTarget(event, currentDragArea);\n } else {\n event.preventDefault();\n }\n\n this.lastDragArea = currentDragArea;\n }\n\n elementDrop() {\n if (this.validTarget) {\n this.succesfullyDropped = true;\n }\n }\n\n removeOldElement() {\n this.newRowAfter = undefined;\n this.restoreCache();\n if (this.currentDraggedElement) {\n const { row } = this.currentDraggedElement;\n const { column } = this.currentDraggedElement;\n const elementRowType = this.currentDraggedElement.element.rowType;\n this.removeItem(row, column, elementRowType);\n this.requestUpdate();\n }\n this.validTarget = false;\n }\n\n elementDragEnd() {\n if (this.newRowAfter !== undefined) {\n this.newRowDragEnd();\n }\n if (!this.succesfullyDropped) {\n this.restoreCache();\n this.requestUpdate();\n } else {\n this.removeEmptyRows();\n this.cacheCurrentLayout();\n }\n this.currentDraggedElement = null;\n this.rerenderItems();\n }\n\n newRowDragEnd() {\n if (\n this.succesfullyDropped &&\n this.newRowAfter !== undefined &&\n this.currentDraggedElement\n ) {\n this.currentDraggedElement.element.rowType = rowType.thirdRow;\n this.layout.splice(this.newRowAfter + 1, 0, [\n this.currentDraggedElement.element,\n ]);\n }\n this.newRowAfter = undefined;\n }\n\n restoreCache() {\n this.layout = [];\n\n this.cachedLayout.forEach(rowArray => this.layout.push([...rowArray]));\n }\n\n removeItem(row, column, currentRowType) {\n this.layout[row].splice(column, 1);\n if (this.layout[row].length === 0) {\n this.layout[row].push({\n rowType: currentRowType,\n elementType: elementType.addNew,\n });\n }\n this.requestUpdate();\n }\n\n removeEmptyRows() {\n this.layout.forEach((row, index) => {\n if (row.length === 0 || row[0].elementType === elementType.addNew) {\n this.layout.splice(index, 1);\n }\n });\n }\n\n rerenderItems() {\n const oldLayout = [...this.layout];\n this.layout = [];\n this.performUpdate();\n this.layout = oldLayout;\n }\n\n renderElement(element, rowIndex, columnIndex) {\n return html`\n \n ${renderElementContent(element)}\n ${!this.currentDraggedElement\n ? html`\n
\n this.deleteElement(rowIndex, columnIndex)}\"\n >\n
\n ${(element.rowType === rowType.halfRow && columnIndex === 1) ||\n element.rowType === rowType.fullRow\n ? html`\n
\n this.appendElement(rowIndex)}\"\n >\n
\n `\n : html``}\n `\n : html``}\n \n `;\n }\n\n renderRow(rowArray, rowIndex) {\n return html`\n \n ${rowArray.map((element, index) =>\n this.renderElement(element, rowIndex, index),\n )}\n \n \n ${this.renderFirstNewRowDropTarget(rowIndex)}\n ${renderNewRowDropTarget('+')} ${renderNewRowDropTarget('+')}\n \n `;\n }\n\n renderFirstNewRowDropTarget(rowIndex) {\n const content =\n this.newRowAfter !== undefined && this.newRowAfter === rowIndex\n ? renderElementContent(this.currentDraggedElement?.element)\n : '+';\n return html` ${renderNewRowDropTarget(content)} `;\n }\n\n render() {\n return html`\n
\n ${this.layout.map((rowArray, index) =>\n this.renderRow(patchRow(rowArray), index),\n )}\n
\n `;\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport { KiWwpGraph } from '@kisters/wiski-web/components';\nimport { customElement } from 'lit/decorators.js';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport {\n last,\n merge,\n find,\n head,\n groupBy,\n flatten,\n orderBy,\n compact,\n first,\n} from 'lodash-es';\nimport {\n SM,\n ViewPort,\n responsiveMixin,\n i18nMixin,\n queryParamMixin,\n} from '@kisters/wcp-base/decorators';\nimport {\n LoaderMixin,\n template,\n copyTextToClipboard,\n Mix,\n} from '@kisters/wcp-base/common';\n\n@customElement('ki-wwp-graph-albg')\nexport default class KiWwpGraphAlbg extends Mix(KiWwpGraph) {\n async fetchData() {\n const _files = {};\n this.station = this.station || (await this.api.getStation(this.stationId));\n\n const dataToFetch = [];\n\n this.station.timeseries.forEach(ts => {\n if (ts.station_parameter === this.station_parameter) {\n dataToFetch.push(ts.href);\n } else if (this.additionalTsFiles) {\n this.additionalTsFiles.forEach(addts => {\n if (ts.href.includes(addts)) {\n dataToFetch.push(ts.href);\n }\n });\n }\n });\n\n await Promise.all(\n dataToFetch.map(async href => {\n _files[last(href.split('/'))] = await this.api.getTsData(href);\n }),\n );\n\n this.files = _files;\n let selected = find(this.ranges, { selected: true });\n const yearcfg = find(this.ranges, range =>\n ['P1Y', 'PoR'].includes(range.value),\n );\n if (yearcfg && this.files[yearcfg.data]) {\n const tsdata = this.files[yearcfg.data][0].data;\n if (tsdata && tsdata[0]) {\n this.coverage = {\n max: last(tsdata)[0],\n min: tsdata[0][0],\n };\n }\n }\n selected = this._selectedPeriod || selected.value || this.ranges[0].value;\n if (!find(this.ranges, { value: selected })) {\n selected = this.ranges[0].value;\n }\n this._selectedPeriod = selected;\n this._setMaxValue(selected);\n this.createChart();\n\n this.ranges.forEach(range => {\n if (range.timeseries) {\n range.timeseries = range.timeseries.filter(\n ts =>\n !ts.ts_shortname ||\n this.files[range.data].some(\n tsfile => ts.ts_shortname === tsfile.ts_shortname,\n ),\n );\n }\n });\n if (this.offset_timeseries) {\n Object.entries(this.files).forEach((file: [string, any]) => {\n file[1].forEach((ts, i) => {\n if (this.offset_timeseries.includes(ts.ts_shortname)) {\n this.files[file[0]][i].data = this.files[file[0]][i].data.map(\n item => {\n let _value;\n if (item[2] !== null) _value = parseFloat((+item[2]).toFixed(2));\n else if (item[1] !== null)\n _value = parseFloat(\n (this.station[this.albg_offset_value] - item[1]).toFixed(2),\n );\n else _value = null;\n return [item[0], _value];\n },\n );\n }\n });\n });\n }\n\n this.drawSeries(selected);\n this.requestUpdate();\n return this.files;\n }\n\n // eslint-disable-next-line consistent-return\n _getSeries(cfg, data, minDate, maxDate = Infinity) {\n if (cfg.timeseries) {\n const tslist = [];\n cfg.timeseries.forEach((tscfg, i) => {\n if (tscfg.ts_shortname_min && tscfg.ts_shortname_max) {\n const minTs = find(data, {\n ts_shortname: tscfg.ts_shortname_min,\n });\n const maxTs = find(data, {\n ts_shortname: tscfg.ts_shortname_max,\n });\n const minIdx = groupBy(minTs.data, head);\n const tsdata = [];\n\n maxTs.data.forEach(dp => {\n const ts = dp[0];\n const tsms = new Date(ts).getTime();\n const max = dp[1];\n const min = minIdx[ts] ? minIdx[ts][0][1] : null;\n if (tsms >= minDate && tsms <= maxDate) {\n tsdata.push([tsms, min, max]);\n }\n });\n\n tslist.push(\n merge(\n {\n data: tsdata,\n id: `data_${i}`,\n name: this.parameter_label,\n color: 'rgba(0, 86, 160, 0.3)',\n type: 'arearange',\n fillOpacity: 0.3,\n xAxis: 'mainXAxis',\n yAxis: 0,\n // gapSize: 2,\n selected: true,\n marker: {\n enabled: false,\n },\n tooltip: {\n valueSuffix: ` ${minTs.ts_unitsymbol}`,\n xDateFormat: '%d.%m.%Y',\n },\n },\n tscfg.options,\n ),\n );\n } else {\n const ts = find(data, { ts_shortname: tscfg.ts_shortname });\n if (ts) {\n // if(tscfg.valueOffset){\n // ts.data = ts.data.map(item=> [item[0], item[1] !== null ? parseFloat((this.station[tscfg.valueOffset]-item[1]).toFixed(2)) : null]);\n // }\n if (tscfg.minDate) {\n minDate = dayjs()\n .tz()\n .subtract(dayjs.duration(tscfg.minDate))\n .valueOf();\n }\n tslist.push(\n merge(\n {\n data: this._formatGraphData(ts.data, minDate, maxDate),\n id: `data_${i}`,\n name: this.parameter_label,\n color: '#0056a0',\n xAxis: 'mainXAxis',\n selected: true,\n marker: {\n radius: 1,\n enabled: false,\n },\n tooltip: {\n valueSuffix: ` ${ts.ts_unitsymbol}`,\n },\n },\n tscfg.options,\n ),\n );\n }\n }\n });\n return tslist;\n }\n if (data[0]) {\n const options = cfg.options || {};\n const ts = data[0];\n return [\n merge(\n {\n data: this._formatGraphData(ts.data, minDate, maxDate),\n id: 'data',\n color: '#0056a0',\n name: this.parameter_label,\n xAxis: 'mainXAxis',\n selected: true,\n marker: {\n radius: 1,\n enabled: true,\n },\n tooltip: {\n valueSuffix: ` ${ts.ts_unitsymbol}`,\n xDateFormat: '%d.%m.%Y %H:%M',\n },\n },\n options,\n ),\n ];\n }\n }\n\n createGraphOptions() {\n let offsetValue: number;\n if (this.albg_offset_value)\n offsetValue = this.station[this.albg_offset_value];\n\n const alarmFileName = this.alarms?.file;\n const alarmFile = alarmFileName\n ? compact(flatten(alarmFileName.map(file => this.files[file])))\n : null;\n const graphOptions = {\n chart: {\n // zoomType: \"x\",\n animation: false,\n type: this.chartType,\n pinchType: undefined,\n zoomType: 'x',\n panning: {\n enabled: false,\n },\n },\n boost: {\n useGPUTranslations: true,\n },\n series: [],\n plotOptions: {\n area: {\n threshold: -Infinity,\n },\n column: {\n groupPadding: 0,\n },\n series: {\n animation: false,\n gapSize: this.gapSize !== undefined ? this.gapSize : 1,\n label: {\n enabled: false,\n },\n states: {\n inactive: {\n opacity: 1,\n },\n },\n },\n },\n yAxis: [\n {\n reversed: this.yAxisReverse || false,\n minRange: this._getExtremes('yAxisMinRange'),\n softMax: this._getExtremes('yAxisMax'),\n softMin: this._getExtremes('yAxisMin'),\n opposite: false,\n title: {\n text: this._yAxisLabel || this.i18n.t('waterlevelcm'),\n },\n },\n {\n opposite: true,\n linkedTo: 0,\n labels: {\n formatter() {\n return offsetValue\n ? parseFloat(offsetValue - this.value).toFixed(2)\n : this.value;\n },\n },\n title: {\n text: this.yAxisLabel_secondary,\n },\n },\n ],\n xAxis: [\n {\n id: 'mainXAxis',\n type: 'datetime',\n ordinal: false,\n labels: {\n formatter() {\n return this.dateTimeLabelFormat === '%e. %b' &&\n this.tickPositionInfo.unitName === 'hour'\n ? `${this.axis.defaultLabelFormatter.call(this)}`\n : this.axis.defaultLabelFormatter.call(this);\n },\n },\n },\n {\n visible: false,\n min: 1,\n max: 2,\n id: 'alarmAxis',\n },\n ],\n };\n this.hasAlarms = false;\n\n // Read alarms/thresholds provided as station/timeseries attributes (e.g. Station, week.json, year.json)\n if (this.attributeThresholds) {\n this._addAttributeThresholds(graphOptions);\n }\n\n if (alarmFile && alarmFile.some(ts => ts.data.length > 0)) {\n let spare = true;\n this.alarms?.items?.forEach((item, i) => {\n const alarms = alarmFile.filter(ts =>\n item.tsList.includes(ts.ts_shortname),\n );\n if (alarms.some(ts => ts.data.length)) {\n let { active } = item;\n if (item.active === 'auto') {\n if (alarms[0].data[0][1] > this.maxInitalValue) {\n active = false;\n } else {\n active = true;\n }\n\n if (!active && spare) {\n active = true;\n spare = false;\n }\n }\n this._getThreshholds(\n graphOptions,\n alarms,\n `alerts${i}_`,\n item.label || this.i18n.t('alarmlevels'),\n null,\n active,\n );\n this.hasAlarms = true;\n }\n });\n }\n\n if (this.files[this.events]) {\n const defaultPlOptions = {\n width: 2,\n color: 'rgba(0, 86, 160, 1)',\n dashStyle: 'DashDot',\n label: {\n align: 'left',\n y: 12,\n x: 0,\n },\n };\n this._getThreshholds(\n graphOptions,\n this._splitEventValues(this.files[this.events]),\n 'events_',\n 'HW-Ereignisse',\n defaultPlOptions,\n false,\n );\n }\n return graphOptions;\n }\n\n drawSeries(period, min, max) {\n const cfg = find(this.ranges, { value: period }) || this.ranges[0];\n\n if (cfg.yearSelector) {\n this.renderRoot\n .querySelector('#yearselector')\n .classList.remove('hideButton');\n } else {\n this.renderRoot\n .querySelector('#yearselector')\n .classList.add('hideButton');\n }\n if (\n this.station.BODY_RESPONSIBLE &&\n this.station.BODY_RESPONSIBLE === 'WSV' // TODO: Remove LANUV?! artifact\n ) {\n this.renderRoot\n .querySelector('#yearselector')\n .classList.add('hideButton');\n }\n this.chart.series\n .filter(ser => ser.userOptions.id && ser.userOptions.id.includes('data'))\n .forEach(ser => ser.remove(false));\n const minDate = min || this._getTimestampFromDuration(period);\n let maxDate = max || this._getTimestampFromDuration();\n const xAxis = this.chart.get('mainXAxis');\n this.chart.zoomOut();\n if (cfg.yAxisLabel) {\n this.yAxisLabel = cfg.yAxisLabel;\n this.shadowRoot.getElementById('dataTable').columns = this.tablecolumns;\n }\n cfg.timeseries &&\n cfg.timeseries.forEach(ts => {\n if (ts.maxDate) {\n maxDate = this._getTimestampFromDuration(ts.maxDate);\n }\n });\n\n if (cfg.plotLines) {\n cfg.plotLines.forEach(pl => {\n const _pl = { ...pl };\n _pl.id = `dynamic_${pl.id}`;\n _pl.value = this._getTimestampFromDuration(pl.value);\n if (pl.filter) {\n cfg.timeseries.some(item => item.ts_shortname === pl.filter) &&\n xAxis.addPlotLine(_pl);\n } else {\n xAxis.addPlotLine(_pl);\n }\n });\n } else {\n xAxis.plotLinesAndBands.forEach(\n pl => pl.id.includes('dynamic_') && xAxis.removePlotLine(pl.id),\n );\n }\n\n xAxis.removePlotLine('pz');\n xAxis.removePlotLine('trend');\n if (cfg.showforcast) {\n xAxis.setExtremes(null, null, false, false);\n this.drawForecast();\n } else {\n xAxis.setExtremes(minDate, maxDate, false, false);\n }\n this.chart.get('data') && this.chart.get('data').remove(false);\n if (this.files[cfg.data]) {\n const series = this._getSeries(\n cfg,\n this.files[cfg.data],\n minDate,\n maxDate,\n );\n // eslint-disable-next-line no-nested-ternary\n const tabledata = cfg.tableTemplate\n ? this.getTableValuesFromTemplate(\n cfg,\n this.files[cfg.data],\n minDate,\n maxDate,\n )\n : Array.isArray(series)\n ? series[0]\n : series;\n if (tabledata) {\n // Sort and format\n console.time('start');\n this.orderedTableData = orderBy(tabledata.data, [0], ['desc']).map(\n item => {\n const vals = [];\n item.forEach((_val, i) => {\n if (i > 0) {\n vals.push(this._formatNumber(_val));\n }\n });\n if (vals.length === 3) {\n vals[1] = `${vals[1]}`;\n }\n const val = vals.join(' - ');\n\n return {\n timestamp: dayjs(item[0]).format(cfg.dateformat || 'L LT'),\n value: val,\n };\n },\n );\n console.timeEnd('start');\n this.shadowRoot.getElementById('dataTable').data =\n this.orderedTableData;\n }\n series.forEach((ts, i) => {\n this.chart.addSeries(ts, i === series.length - 1);\n });\n }\n }\n}\n","// eslint-disable-next-line import/extensions\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { css, html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { getRouteOptionsAndParams } from '@kisters/wcp-base/components';\nimport { getCurrentApi } from '../../api/API';\n\n@customElement('wwp-attribute-html')\nexport default class WwpAttributeHtml extends LitElement {\n static styles = css`\n :host {\n overflow: auto;\n display: flex;\n flex-wrap: wrap;\n margin-top: 20px;\n padding: 20px;\n }\n `;\n\n async onAfterEnter(location) {\n const params = getRouteOptionsAndParams(location, ['stationId']);\n this.api = getCurrentApi();\n this.stationId = params.stationId;\n this.station = await this.api.getStation(this.stationId);\n Object.assign(this, params.options);\n }\n\n static get properties() {\n return {\n content: { type: String },\n station: { type: Object },\n };\n }\n\n render() {\n // language=html\n return html`
\n ${this.station && this.station[this.content]\n ? unsafeHTML(this.station[this.content])\n : ''}\n
`;\n }\n}\n","/* eslint-disable no-return-assign */\nimport { html, css, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { getSearchParam, setSearchParam } from '@kisters/wcp-base/app';\nimport { getQueryObject } from '@kisters/wcp-base/decorators';\nimport '@kisters/wcp-base/components/ki-icon/ki-icon-btn';\nimport '../../components/ki-dynamic-layout/ki-dynamic-layout';\nimport {\n elementType,\n getExampleLayout,\n getLayout,\n rowType,\n saveLayout,\n} from '../../components/ki-dynamic-layout/service/layout-service';\n\n@customElement('ww-dashboard')\nexport default class WwDashboard extends LitElement {\n static styles = css`\n :host {\n display: block;\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n }\n .button-wrapper {\n display: flex;\n flex-direction: row;\n align-items: center;\n height: 100%;\n }\n .dashboard-container {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n padding: 20px;\n gap: 20px;\n height: 100%;\n width: 100%;\n box-sizing: border-box;\n }\n .dashboard-input-container {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n flex-wrap: wrap;\n gap: 20px;\n width: 100%;\n box-sizing: border-box;\n }\n .dashboard-text-input {\n height: 50px;\n padding: 13px 8px;\n border: 1px solid #4d446c;\n box-sizing: border-box;\n border-radius: 4px;\n min-width: 100px;\n width: 100%;\n }\n .input-wrapper {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n flex-wrap: wrap;\n min-width: 100px;\n box-sizing: border-box;\n }\n .input-label {\n margin-bottom: 5px;\n }\n .grow-1 {\n flex-grow: 1;\n }\n .grow-2 {\n flex-grow: 2;\n }\n `;\n\n layout: {\n rowType: rowType;\n elementType?: elementType;\n configuration?: { text: string };\n }[][] = [];\n\n name: string = '';\n\n description: string = '';\n\n static get properties() {\n return {\n layout: { type: Array, attribute: false },\n name: { type: String, attribute: false },\n description: { type: String, attribute: false },\n };\n }\n\n // Vaadin Router Method that gets called after this component is called\n // eslint-disable-next-line no-unused-vars\n async onAfterEnter() {\n const uuidToLoad = getSearchParam('uuid');\n if (uuidToLoad) {\n const loaded = await getLayout(uuidToLoad);\n this.layout = loaded.layout;\n this.name = loaded.name;\n this.description = loaded.description;\n } else {\n this.layout = getExampleLayout();\n this.name = 'Example Layout';\n this.description = 'Example Description';\n }\n }\n\n render() {\n return html`\n
\n
\n
\n Name \n (this.name = e.target.value)}\n />\n
\n
\n Description \n (this.description = e.target.value)}\n />\n
\n
\n \n
\n
\n \n
\n `;\n }\n\n async saveLayout() {\n const newLayout = getQueryObject(this, 'ki-dynamic-layout').layout;\n\n const newUuid = await saveLayout(this.name, this.description, newLayout);\n\n if (newUuid) {\n setSearchParam('uuid', newUuid);\n }\n }\n}\n","/* eslint-disable lit/no-invalid-html */\nimport { html, css, LitElement } from 'lit';\n// eslint-disable-next-line import/no-extraneous-dependencies\n\nimport { getRouteOptionsAndParams } from '@kisters/wcp-base/components';\nimport { getCurrentApi } from '@kisters/wiski-web/api';\nimport '@ui5/webcomponents/dist/Select';\nimport '@ui5/webcomponents/dist/Option';\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('ww-pdf-reports')\nexport default class WwPdfReports extends LitElement {\n // language=css\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n height: calc(100% - 30px);\n }\n iframe {\n width: 100%;\n height: 100%;\n border: none;\n }\n .left-panel {\n text-align: center;\n flex: 0;\n }\n .right-panel {\n flex: 1;\n }\n\n ui5-select {\n width: 350px;\n }\n `;\n\n constructor() {\n super();\n this.api = getCurrentApi();\n }\n\n data = [];\n\n @property({ type: String })\n path = '/documents';\n\n @property({ type: String })\n selectedDoc = '';\n\n async onAfterEnter(location) {\n const params = getRouteOptionsAndParams(location, ['content']);\n console.log(params.content);\n // Usually \"documents\" or \"reports\"\n this.path = params.options?.path;\n\n this.fetchData();\n }\n\n _getFullPath(subpath) {\n return new URL(\n `${window.location.protocol}//${window.location.host}${window.location.pathname}${this.api.dataPath}${this.path}/${subpath}`,\n ).href;\n }\n\n async fetchData() {\n const res = await this.api._requestJson(`/${this.path}/index.json`);\n // Filter reports; only allow visible PDF\n this.data = res.data\n .sort((a, b) => new Date(b.lastModified) - new Date(a.lastModified))\n .map(doc => ({ label: doc.name.replace('.pdf', ''), value: doc.name }));\n if (this.data.length) {\n this.selectedDoc = `${this._getFullPath(this.data[0].value)}`;\n }\n }\n\n render() {\n // language=html\n return this.data && this.selectedDoc\n ? html`
\n {\n this.selectedDoc = `${this._getFullPath(\n e.target.selectedOption.value,\n )}`;\n }}\"\n >\n ${this.data.map(\n item =>\n html`${item.label}`,\n )}\n \n
\n
\n \n
`\n : html`
Loading...
`;\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport { Mix, template } from '@kisters/wcp-base/common';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { WwpStationInfo } from '@kisters/wiski-web/views';\nimport { customElement } from 'lit/decorators.js';\n\n@customElement('wwp-station-info-albg')\nexport default class WwpStationInfoAlbg extends Mix(WwpStationInfo) {\n getValue(field) {\n let ret;\n const val = this.station[field.field];\n if (!val) {\n ret = '-';\n } else if (field.type === 'number') {\n ret = new Intl.NumberFormat(\n this.i18n.language,\n field.numberFormat || this.numberFormat || {},\n ).format(parseFloat(val));\n } else if (field.type === 'textnumber') {\n ret = new Intl.NumberFormat(\n this.i18n.language,\n field.numberFormat || this.numberFormat || {},\n ).format(parseFloat(val.replace(',', '.')));\n } else if (field.type === 'html') {\n ret = unsafeHTML(\n this.station[field.field].replace('./html', './public/html'),\n );\n } else if (field.type === 'ATS') {\n ret = `${this.station[field.ATS[0]]}-${this.station[field.ATS[1]]}-${\n this.station[field.ATS[2]]\n }-${this.station[field.ATS[3]]}-${this.station[field.ATS[4]]}`;\n } else if (field.type === 'link') {\n ret = unsafeHTML(\n `${this.station[field.field]}`,\n );\n } else {\n ret = this.station[field.field];\n }\n\n if (ret !== '-' && field.translate) {\n ret = this.i18n.t(ret);\n }\n\n if (ret !== '-' && field.subst) {\n if (Array.isArray(field.subst)) {\n let tmpret = val;\n field.subst.forEach(item => {\n tmpret = tmpret.replace(item.token, item.with);\n });\n ret = tmpret;\n } else {\n ret = val.replace(field.subst.token, field.subst.with);\n }\n }\n if (ret !== '-' && field.suffix) {\n ret = template(`${ret}${field.suffix}`, this.station);\n }\n return ret;\n }\n}\n","/* eslint-disable max-classes-per-file */\nimport { customElement } from 'lit/decorators.js';\nimport { Mix } from '@kisters/wcp-base/common';\nimport dayjs from '@kisters/wcp-base/common/dayjsext';\nimport { WwpStationDownload } from '@kisters/wiski-web/views';\n\n@customElement('wwp-station-download-albg')\nexport default class WwpStationDownloadAlbg extends Mix(WwpStationDownload) {\n csvSeparator = ',';\n\n dataColumnLabels = ['Time', 'Depth', 'WL Elevation', 'Status'];\n\n dataColumnLabelsAggr = [\n 'Day',\n 'Daily Minimum',\n 'Daily Mean',\n 'Daily Maximum',\n 'Status',\n ];\n\n _getData(data, minDate) {\n const cols = data[0].columns.split(',');\n\n const absoluteValIndex = cols.indexOf('Absolute Value');\n const releaseStatusIndex = cols.indexOf('Release State');\n const qualityCodeNameIndex = cols.indexOf('Quality Code');\n const rows = [];\n console.time('start download parsing');\n const tzoffset =\n (dayjs().utcOffset() - dayjs().tz().utcOffset()) * 60 * 1000;\n data[0].data.forEach(item => {\n const datems = new Date(item[0]).getTime() - tzoffset;\n if (datems > minDate) {\n let value;\n if (this.albg_offset_timeseries?.includes(data[0].ts_shortname)) {\n value =\n item[absoluteValIndex] === null\n ? ''\n : Math.abs(\n item[absoluteValIndex] - this.station[this.albg_offset_value],\n ).toFixed(2);\n } else {\n value = item[1] === null ? '' : item[1].toFixed(2);\n }\n const row = [dayjs(datems).format('L LT'), value];\n\n const absVal =\n item[absoluteValIndex] === null\n ? ''\n : item[absoluteValIndex].toFixed(2);\n row.push(absVal);\n\n if (releaseStatusIndex !== -1) {\n const releaseState =\n this.releaseStates[item[releaseStatusIndex]] ||\n this.releaseStates.default;\n row.push(releaseState);\n }\n\n if (qualityCodeNameIndex !== -1) {\n row.push(item[qualityCodeNameIndex]);\n }\n rows.push(row);\n }\n });\n console.timeEnd('start download parsing');\n return rows;\n }\n}\n","import dayjs from '@kisters/wcp-base/common/dayjsext';\n\nimport {\n Mix,\n} from '@kisters/wcp-base/common';\n\nimport { html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport '@ui5/webcomponents/dist/Toast';\n\nimport '@kisters/wiski-web/components/ki-responsive-table/ki-responsive-table';\n\nimport '@kisters/wiski-web/components/ki-wcp-wwp-filter/ki-wcp-wwp-filter';\nimport '@kisters/wiski-web/components/common/ww-map-popup';\nimport '@kisters/wiski-web/components/common/ww-map-popup-base';\nimport '@kisters/wiski-web/components/common/ww-map-popup-precip';\n\nimport '@kisters/wiski-web/components/ki-wwp-graph/ki-wwp-sparkline';\n\nimport {WwpOverview} from '@kisters/wiski-web/views';\n\n@customElement('wwp-overview-albg')\nexport default class WwpOverviewAlbg extends Mix(WwpOverview\n) {\n \n render() {\n // eslint-disable-next-line wc/no-self-class\n this.classList.toggle('table', this.mapOrTable === 'table');\n // TODO rename ki-station-layer to ki-maker-layer or value layer ?\n // language=html\n if (this.currentLayer !== this.layerName) {\n this.getdataLayer();\n }\n return (\n this._renderLoader() ||\n html`\n ${this.additionalContent()}\n\n {\n this._enableAutoZoom = true;\n this.searchContent = e.detail.value;\n }}\"\n >\n \n ${this.showCsvExport && this.mapOrTable === 'table'\n ? this.renderExportButton()\n : html``}\n\n ${this.mapOrTable === 'table'\n ? html`\n {\n this._enableAutoZoom = true;\n this.filterContent = JSON.stringify(e.detail.value);\n }}\"\n >\n `\n : html``}\n \n {\n this._enableAutoZoom = true;\n this.mapOrTable = e.detail.value;\n }}\"\n >\n \n
\n ${this.mapOrTable === 'table' ? this.renderTable() : html``}\n
\n
\n ${this.mapOrTable === 'map' ? this.renderMap() : html``}\n
\n
\n ${this.mapOrTable === 'table'\n ? html``\n : html`\n \n `\n }\n
\n ${this.i18n.t('lastupdated')}:\n ${dayjs.tz(this._dataLayer.creationDateInMillis).format('L LT')}\n ${this.i18n.exists(encodeURIComponent(dayjs().tz().format('zzz')))\n ? this.i18n.t(encodeURIComponent(dayjs().tz().format('zzz')))\n : dayjs().tz().format('zzz')}\n
\n `\n );\n }\n\n}\n","// Shared modules: @kisters/${name}-common/\n// App specific module: ../\n\nexport default [\n {\n component: 'ww-app',\n importAction: async () => {\n await import('../app/ww-app');\n },\n },\n];\n","/* eslint-disable no-template-curly-in-string */\n/* eslint-disable no-nested-ternary */\nimport { html, css, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { initConfig, getRoutes } from '@kisters/wcp-base/app';\nimport { LoaderMixin } from '@kisters/wcp-base/common';\nimport { init } from '@kisters/wiski-web/api';\n\n// Import common components here\nimport '@kisters/ww-albg-common/components/index';\nimport '@kisters/ww-albg-common/views/index';\n\nimport importActions from './import-actions/import-actions';\n\n// TODO use lib without compile might be better.\n// can consider all ki-wcp project with build version instead import source and recompile it\n\n@customElement('ww-app-index')\nexport default class wwAppIndex extends LoaderMixin(LitElement) {\n static styles = css`\n :host {\n height: 100%;\n width: 100%;\n }\n `;\n\n constructor() {\n super();\n this.configLoaded = false;\n this.configLocation = './config/app.json';\n }\n\n render() {\n if (!this.configLoaded) {\n return this._renderLoader();\n }\n // language=html\n return html` `;\n }\n\n firstUpdated() {\n this.promiseLoader(\n initConfig(this.configLocation, importActions).then(config => {\n init({ dataPath: config.apiPath });\n this._config = config;\n this.configLoaded = true;\n }),\n );\n }\n}\n"],"file":"assets/index.46a05d7f.js"}