{"version":3,"file":"scripts.6bb3286cee714515.js","mappings":"UAMAA,KACA,+DACA,iDACAA,qDACA,EAACC,gBAAsB,aAKvB,eACAC,WACA,YACA,UACA,EAEAA,6BAEA,kBACA,8CACA,SACAC,KACA,sBACAA,OACAC,IACAA,KACAC,mBACAD,KACAE,eAGA,CACA,CACA,iBACA,MACA,kBACA,UACAC,gBACAC,mBAEAF,IAEAG,CACA,CACA,CACA,yDACAC,6CACAC,gDA2IA,UAzIA,QACAC,cACAX,mBACAA,qBACAA,iBACAA,qBACA,CACAY,iBACA,MACAC,aADAC,eAEAC,cACAC,QACAC,kBACAJ,WACAK,oCAEA,CACAC,WACA,aACAC,aAGAA,cACAA,8BACAA,YACAA,gBACAA,YACAA,eAGA,CACAC,sBACA,aACA,QACAD,0BACA,+BACA,OAEA,gBACA,IAEAE,EAFAC,aACAC,KAEA,KAAaD,OAAQA,EACrBD,OACAA,WACAA,sBACAR,qBAEAQ,UACAE,OAEAC,mBACAA,SAGAD,IACAR,SACAI,6BAEAK,WACAX,aACAM,4BACAN,cAEAY,cAEAN,cACA,QACAA,cAEA,CACAO,aACA,qBACA,eACA,WACAb,GACAc,WACAX,WACAQ,SACAI,WACAC,YACAC,cAGAC,YAEAlB,CACA,CACAmB,cACAjC,sCACA,CACAkC,UACAT,cAGAzB,kCACA,CACAmC,OACA,uCACA,CACAC,SACA,6BACAtB,IAGAA,aACAA,mBACAA,4DACAd,gBACA,CACA4B,WACA,kBACA,SAEA,4BACA,wCAIA,CACAS,QACA,4BACA,uBACA,OAEA,gBACA,iBACA,KAAWd,OAAQA,EACnBE,cAEAX,WACAd,uCACA,CACAsC,UACA,6BACA,GAUA,SAAa,qGACbC,qBACAC,aACAC,2BACAC,wBAgCA,cACA,aACA,CACA,2CACA,cACA,yBACA,CACA,eACA,wBACA,CACA,cACA,2BACA,CACA,eACA,wBACA,CACA,gHAgCAC,kHACA,kBACA,0BACAC,0DACA,sBACA,CACA,kBACA,8DACA,sBACA,CACA,kBACA,kBACA,MAMA,IALAC,QACAtB,UACAsB,KACAC,MAEAvB,IAAaA,IAAOA,IACpBwB,YACAA,QAEA,QACA,CACA,cAEA,gBACAC,UACAF,UACAG,kBACAC,kBACAC,UACA,UACA,eACAC,MACAC,yBACAC,SACAN,iBACAC,OACAH,UACAS,SACAD,WAEA,YACA,CACA,oBACA,OACAE,iBACAZ,kBACAA,UACAa,OACA,CACA,kBACA,iBACA,CAOA,cACA,qBACA,CAgDA,UACAC,SACAC,UACAC,OACAC,QACAC,OACAC,WACAC,UACAC,OACAC,OACAC,OACAC,OACAC,UACAC,UACAC,OACAC,aACAC,OACAC,OACAC,OACAC,OACAC,OACAC,UACAC,OACAC,OACAC,SACAC,OACAC,UACAC,QAEAC,IACAC,gBACAC,qBACAC,YACAC,mBACAC,cACAC,eACAC,gBACAC,UACAC,sBACAC,QACAC,iBACAC,cACAC,mBACAC,gBACAC,kBACAC,iBACAC,aACAC,qBACAC,iBACAC,iBACAC,YACAC,SACAC,aACAC,iBACAC,cACAC,YACAC,cACAC,gBACAC,iBACAC,kBACAC,gBACAC,eACAC,aACAC,gBACAC,gBACAC,cACAC,eACAC,eACAC,WACAC,gBACAC,gBACAC,gBACAC,gBACAC,gBACAC,kBACAC,kBACAC,kBACAC,kBACAC,gBACAC,iBACAC,mBACAC,aACAC,gBACAC,aACAC,WACAC,eACAC,aACAC,iBACAC,gBACAC,iBACAC,eACAC,cACAC,eACAC,gBACAC,mBACAC,iBACAC,oBACAC,aACAC,cACAC,eACAC,mBACAC,cACAC,cACAC,cACAC,cACAC,gBACAC,gBACAC,gBACAC,eACAC,eACAC,iBACAC,aACAC,YACAC,iBACAC,aACAC,gBACAC,eACAC,oBACAC,SACAC,eACAC,gBACAC,gBACAC,cACAC,iBACAC,aACAC,kBACAC,oBACAC,iBACAC,kBACAC,iBACAC,oBACAC,UACAC,gBACAC,cACAC,iBACAC,eACAC,iBACAC,cACAC,mBACAC,gBACAC,eACAC,oBACAC,mBACAC,iBACAC,cACAC,aACAC,cACAC,iBACAC,eACAC,qBACAC,YACAC,kBACAC,eACAC,mBACAC,eACAC,mBACAC,eACAC,iBACAC,eACAC,gBACAC,eACAC,aACAC,cACAC,cACAC,cACAC,gBACAC,gBACAC,aACAC,WACAC,eACAC,gBACAC,YACAC,eACAC,aACAC,cACAC,mBACAC,YACAC,gBAkBA,OAcA,mBACA,MACA,WACAC,mDACAA,OACAC,SACAA,SACAA,QACA,CACA,CACA,iBACA,8BAAqCA,EACrC,CACA,cACA,OAAUpL,mBACV,wBACAqL,cACAD,GAAQpL,4BACRqL,aACAD,gBAIAA,QAAsBpL,mBACtBsL,UAEAF,CACA,CACA,eACA,wBA5XA,cACA,mBACA,IACApL,MADAsL,MAEA,KAGA,cACA,cACAA,uBACA,CACA,eACA7L,QACAF,QACAS,oBACAP,oBACAF,oBACA,CACAS,EACAP,IACAF,IACA+L,IACA,CACA,CAsWAC,IA9RA,cACA,mBACA,IACAH,EADAE,MAEA,MACA,OAEAE,WACAF,2BAEA,iBACAG,YACAC,YACA,OACAN,EADA,aAtBA,kBACA,iBACA,CAqBAO,QACG,aArBH,kBACA,iBACA,CAoBAC,QAEAC,SAEA,CACA7L,OACAP,OACAF,OACA+L,IAEA,CAsQAQ,GACA,CACA,SACA1O,eACA,mBACA,SAEA,iBACA,MACA,aACAgO,OACI,eACJA,EAxbA,cACA,IACAW,EADAC,WAEA,mBACA,aACAD,GACA/L,iBACAP,iBACAF,iBACA+L,yBAEI,gBACJS,GACA/L,qBACAP,qBACAF,qBACA+L,kCAIAS,CACA,CAmaAE,KAzDA,eACAC,KACAA,GAnBA,cACA,WACAC,kBACAC,kBACA,cACA,QAAapO,WAAiBA,KAE9B,IADAqO,SACAC,IAAcA,WAAkBA,IAChCC,OACAC,qBAEAD,qBACAE,+BACA,CACA,QACA,CAIAC,GACAR,0BAEA,4BACA,WACAlM,OACAP,OACAF,OACA+L,wBAEA,CA6CAqB,YAEAlQ,YACAA,eACA,CACAmQ,YACA,kBACA,CACApN,UACA,oBACA,WACA4L,YAEAA,CACA,CACA5L,WACA/C,cACA,CACAoQ,YACA,mBAtYA,cACA,WACAzB,QACA,QAAaA,QAAQA,QAAQA,QAAQ0B,UACrC,OAAY1B,QAAQA,QAAQA,OAE5B,CAgYAyB,qBACA,CACAE,YACA,mBAxbA,cACA,MA1BA,cACA,qCACA,CAwBAC,QACA,UACA,4CAEA,CAmbAD,qBACA,CACAE,YACA,mBAlSA,eACA,MACA,OAEA,aACAlN,OACAD,WACAF,WACA,eACA,QAAYG,MAAMD,OAAOF,OAAOkN,UAChC,OAAW/M,MAAMD,OAAOF,KACxB,CAuRAqN,qBACA,CACAC,SACA,aACA,MACA,cACAC,QACA,MACA,mBACA7N,QACAgM,UACA8B,kCACAC,MACAC,uBACAA,uBACAA,uBACAA,oBACAzP,OACA,CACA,QACA,CACA0P,QACA,uBACA,CACAC,SACA,yBACA/Q,IACA,CACAgR,WAEA,OADAhR,UACA6O,OACA7O,IACA,CACAiR,YACA,kBACAC,4BACA,qBACAlR,IACA,CACAmR,WAEA,OADAnR,UACA6O,OACA7O,IACA,CACAoR,SACA,kBACA,mBACAzC,YACAA,YACA3O,IACA,CACAqR,WACA,yBACArR,IACA,CACAsR,UACA,0BACAtR,IACA,CACAuR,YACA,yBACAvR,IACA,CACAwR,cACA,0BACAxR,IACA,CACAyR,UACA,OA9WA,gBACA,WACAnO,eACAA,OACAqL,SACAA,SACAA,QACA,CAuWA8C,cACAzR,IACA,EAEA,eACA,gBACA,CAEA,oEACA,eACA,oBACA,CACA,eACA,aACA0R,EACAC,yCACA,CAEA,eACA,oBACA,QACA,kBACA,UACA,CACA,CALA,GAMA,eACA,6BACA,CACA,eACA,mCACA,SAEA,0CACA,wDAIA,CACA,eACA,sEACA,CACA,oEACA,iBACA,gBACA,CACA,iBACA,uBACA,CACA,gBACA,oCACAC,kBACAF,IACAG,UACA,oCACAD,qBACAF,EACA,mBACA,gCACA,mBAEA,CACA,qBACA,UACA,SAEA,GADAnC,WACAuC,EACA,UAAwBvQ,KAAQA,IAChClB,sBAGA,QAAkBkB,IAASA,IAC3BlB,yBAGI0R,MAGJ,IAFArC,iBACAH,WACAhO,IAAgBA,IAASA,IACzBlB,sBAGA,CACA,iBACA,YACA,+BACA,SAEA,mBAAgCkB,MAAUA,EAG1C,GAFAyQ,OACAC,OACAD,mDACA,SAGA,QACA,CACA,eACA,SACA,iBAEA,UACA,4BACAtC,iBACAwC,WACA,QACA,KAAWpC,MAAUA,EACrBqC,oBAEA,QACA,CACA,QACA,CACA,eACA,6DACA,CACA,qBACA,UACA,OAEA,aACAC,OACAL,aACAM,UAEAF,UAEA,CACA,mBACA,oBACAG,WACA,UACA,SAGA,SADAC,SACAC,WACA,YAAkBjR,MAAUA,GAE5B,OADAkR,QAEA,SAEA,uBACA,uBAAwC3C,MAAUA,EAClD0C,aAEA,CACA,QACA,CACA,iBACA,eAAgCA,WAChC,CACA,mBACA,UACA,OAEA,aACAJ,OACAL,aACAW,QACIC,4CACJR,WAEA,CASA,iBACA,kBAFA,IAEA/P,GACA,uBACA,CACA,iBACA,GAPA,KAOAwQ,EACA,SAEA,QACAC,UACA,aACAC,qBACAC,MACAF,UAEA,QACA,CACA,eACA,2CACA,CACA,yBACAG,2BACAC,WACA,mBACA,SAEA,iBACA,aACA,SAGA,UAGAC,uBACAC,uBACA,iBACA,MACA,SAEA,qBACA,uBAAmC5R,MAAOA,GAC1C,aACA6R,kCACA,CACA,QACA,CACA,mBACA,yBACAf,cAEAA,cACA,CAkFA,WAjFA,SACA1R,eACAX,sBACAA,uCACAA,mCACAA,kBACAA,iBACAA,gEACAA,iBACAA,aACA,YACA,WACA,QACA,aACA,aAEAA,WACAqT,4DACAC,QACAC,eACAC,eACAC,aAEAzT,cACAA,uDACAA,+CACAA,mCACAA,mBACAA,kBACA0T,eACAC,cAEA3T,4BACAA,kBACAA,kBACAA,gBACAA,gBACAA,mBACAA,kBACAA,eACAA,iBACAA,gBACA,CACA4T,SACA,mBACA,CACAC,OACA,iBACA,CACAC,cACA,iBACA,CACAC,cACA,iBACA,CACAC,eACA,mBACAC,aACAC,QACAvB,2BACA/P,KACA8O,WACAyC,aAEAC,KACAC,cACAR,MACA,gBACA1B,OACA,aACAQ,iBAAmCR,KAEnCmC,OACA,EACAV,OACA5T,SACA,IAGA,GAEA,CACAuU,mCACAC,2BACAC,OACAC,yBAEAC,aACAJ,eACAC,iBAIA,iBACAI,QACAC,SACAC,4BACAC,UACAC,QACAC,QACAC,UACAC,cACAC,aACA,eACA,uCACAC,MAEA,OADAA,yBACAC,CACA,CACA,eACA,WACAC,eACA,MACA,QAAchU,IAAUA,IACxBmQ,SACA8D,UACAA,aAGA,kBACAA,UAEAA,yBACAA,CACA,CACA,eACA,wCACA,CACA,mBACA,sBACA,CACA,iBACA,sBACA,qBACA,CACA,mBACA,UACA,mBAAmCjU,IAAUA,IAC7CmQ,UACA+D,WACAtD,wBACAA,wBAGA,CACA,eACA,iBACA,CACA,eACA,iBACA,CACA,eACA,UACA,OAEA,QACAuD,IACA,4BACAC,MACAD,IAEA,QACA,CACA,iBACA,gBACAE,UACAC,qBACA,sBACA,kBACAC,OAEA,CACAA,QACAC,WAEA,CACA,iBACA,yDACA,CACA,iBACA,oBACA,CACA,eACA,kBACA,CACA,qBACA,cACA1S,QACAsS,QACAK,UACAC,UACAC,UACAC,UACA,+BACAH,QACA,CACA,mBACA,gCACA,CACA,eACA,yBACA,CAEA,eACA,mCACA,MAEAI,yBACAA,0BACAA,aACAA,QACA,CACA,uBACA,WACA,WACAC,8BACAC,WAEAD,MACAE,KAEAA,CACA,CACA,qBAEA,OADAC,SACAC,gBACAH,wCACAE,aACAC,YACAH,sBACAE,UAEAE,SACAA,SACA,QACA,iBACA,cACA,QAAcnV,IAAUA,IAExB,GADAoV,OACA,oBACAJ,wBACMK,MACN,mBAAuC/G,IAAUA,IACjDgH,OACA,kBACAN,iBAKAG,YACA,oBACA,gBACA,QAAgBnV,KAAWA,WAC3BkV,QAEAH,cACA,CACA,QACA,CACA,mBACA,kCACAQ,2BACA,8BACA,CACA,kBACAJ,yBACAK,OACAL,mBACAA,kCACAA,WACA,CACA,qBACA,cACA,qBACAM,aACAC,WACA,gBACA,2BACAC,eACA,mEAMA,OALAR,SACAA,iBACAA,YACAA,4DACAA,YAIA,qBAIA,QADAA,cACAnD,WAEAmD,kBACAA,cACA,UACA,WACAA,0CACAS,MACAT,0CACAS,MACAT,0CACAA,cACA,UACA,cACAU,SACA9D,MACA+D,mBACAC,mBACAZ,2BACAA,wBACAA,wBACAA,2BACAA,cACA,UACA,OACA,OACApD,iBACAoD,wBACA,KACA,CACAS,UACA,UACAE,gBACAC,gBACAZ,kBACAA,kBACAA,kBACAA,kBACAA,cACA,UACA,WACAS,UACA,QACAE,gBACAC,gBACAZ,kBACAA,kBACAA,kBACAA,kBACA,UACA,OACAW,gBACAC,gBACAZ,kBACAA,kBACAA,kBACAA,kBACAS,MACAE,gBACAC,gBACAZ,kBACAA,kBACAA,kBACAA,kBACA,UACA,OACAW,gBACAC,gBACAZ,kBACAA,kBACA,UACA,OACAA,cACAA,0CAGAA,SACAnE,iBACAmE,WAEA,CACA,mBACA,eACAa,gCACAA,2BACA,CACA,iBACAb,SACAA,cACAA,mDACAA,QACA,CACA,eACAA,WACA,CACA,uBACA,MACA,yBAEA,iBACA,oBACAA,gBACAA,eACA,KAAI,iBACJA,kBAEAA,kBAEAA,iBACA,CACA,qBACA,MACA,yBAEAA,gBACAc,gBACAA,gBACAA,gBACAA,gBACArF,IACAA,IACA,CACA,4BACA,oBACAsF,sCACA,QAkBA,IAjBAf,SACAgB,eACAhB,+CAEAiB,gBACAjB,qBAEAA,gBACAgB,UACAhB,qBAEAgB,cACAhB,yBAEAgB,iBACAhB,+BAEAnV,IAAcA,aAAkBA,GAYhC,GAXAqW,OACAH,IACAC,gBACAhB,6BAEAiB,oBACAjB,2BAEAA,gCAEAA,6BACAgB,8BACA,yBACAG,4BACAC,6BACAC,+BACAC,gCACAC,gCACAvB,0BACAA,cACAA,iCACAA,eACAA,eACAA,UACA,CACAwB,eACA,CACAxB,WACA,CACA,iBACA,MAAShT,0BAAoByU,EAC7BzB,mDACAA,6BACAA,6DACAA,gCACAA,iEACAA,2BACAA,uDACAA,uBACA,CAEA,mBACA0B,iBACA,IAEAC,EAFAC,aACAC,IAEA,YACAF,SACAD,KACAG,IAEAD,IAGA,OAAUC,UACV,CACA,kBACAC,qBACAC,YACAD,sBACA,mBACA,QACAE,WACA,kBACAtW,IAEA,oBACAsW,IAEA,uBACAC,aACAA,CACA,CACA,mDACA,iBACAC,WACAA,8BAGAjG,oCACAkG,gBACAxE,cACA3C,OACA7P,iBAGAiX,eACA,wBACAC,OACApG,2BACAkG,gBACAxE,cACA3C,YACA,wBACA,wCACA,yBACAsH,aAGAC,CACA,GACK,GAEL,CACA,iBACA,mBACA,MACA,OAEA,oBACAC,gBACA,OACArX,gBAEAA,cAGAiX,sBACAF,cAEAA,WACA,CACA,eACA,gBACA,QACA,mBAAmCrX,MAAUA,EAC7CqS,YAEA,cACA,SAEA,WACA,qBACA4B,YAEAA,CACA,CAEA,eACA,mBACA,iDACA2D,UAEAA,CACA,CACA,mBACA,MACA,0BACAC,kBACA,qBACAA,0BAGAA,IAEAA,CACA,CACA,4CACA,iBACA,gCACA,CACA,yCACA,mBACA,WACAC,aACA,YAAkB9X,IAAOA,KACzB,cACAiU,gCACA,CACA,8BACAA,wBACAA,CACA,CAoBA,iBACA,MAAS8D,oCAAiCtY,EAC1CuS,QACAgG,6BACAC,kBACAC,0BACS/V,eAxBT,iBACA,oBACAgW,YACAjH,sBACSkH,qBAAkBlH,EAC3B,IACA/O,IADAkW,KAEA,GARA,0CAQAC,eACAnW,IACAwU,QACI,CACJ,kCACAxU,mBACAwU,kBACA0B,IACA,CACA,OAAUlW,cACV,CAOoBoW,MACpBzC,qBACAC,mBACA,IAAOyC,oBAAe/Y,EACtB,WACA+Y,oBACAC,uBAEA,CACAtW,iCACAwU,kCAEA,CA0BA,gCACA,qBACA,cACA+B,iBACAC,qCACAC,uCACAC,EA/BA,mBACA,QACA,2BACA,cACA,KAGM,CACN,kCACAC,QACAC,yBACAC,kBACAR,0BACAC,6BACAE,iCACAC,kCACA,MAXAJ,gBACAC,gBAWA,CACA,OACAD,QACAC,SACAE,eACAC,gBAEA,CAOAK,QACA,IAAOT,kBAAeK,EACtB,gCACA,+BACAZ,kBACAO,mBACAC,oBACA,CACA,+BACAA,2CACAD,+BACAC,gCACAD,QACAC,WAEA,CACAD,QACAC,SAEA,CACA,mBACA,aACAS,yBACAC,wBACA1Z,aACAA,YACA,iBAKA,OAJAsY,gDACAA,kBAA6BtY,aAC7BsY,iBAA4BtY,cAE5BA,+BACAsY,cACAA,eACAtY,4BACAsY,WACAA,UACAtY,iCACA,EAGA,CACA,oBACA,SACA,IACA,SACA2Z,cACA,aACA,CACA,GAEA1a,uCACAA,yCAEA,CADA,MACA,CACA,QACA,CAdA,GAeA,iBACA,gBACA2a,kCACA,qBACA,CAEA,iBACA,mBACA,CACAlX,MACAwU,OAGA2C,OACA,CAcA,qBACA,MAASC,+BAA2BC,EACpCC,uBACA,+BACA,+BACA,MACA,gBACM,qBACN,aACAC,+CACA,MACA,mBACAvC,aACA,OAAgBH,gBAChB,CACA,CACA,CACA,OAAUA,mBACV,CACA,uBACA,yCACA7G,OACA,uBAA0CnQ,MAAUA,GACpD,MAAW2X,gBAAagC,MACb3C,WAAQ4C,eACnB,aAAqBtL,QAASA,IAC9B,eACAuL,SACAC,UAEA,CACA,CACA,CAUA,qBACA,WACA,wCAQAC,SALA,gBACAF,sBACA3Z,QAAkB2Z,kCAElB,GACA,GACA3Z,CACA,CACA,uBACA,QAvBA,eACA,4BACA8Z,sBACA,qBACA,8BACAC,wBACA,6CACA,CACA,CAeAC,IACA,+BACAha,KACA,wCAmBA6Z,SAhBA,gBACA,4BACA,OAEA,4BACA,oCACA,OAEA,gBACAvF,MACAtU,IAAgB2Z,mCAChBM,MACM3F,QACNtU,QAAkB2Z,kCAElB,GAEA3Z,CACA,CACA,qBACA,gBACAA,KACAka,SACAC,gCACA,SASA,OA5GA,iBACA,yCACA,UACA,uBAA0Cra,MAAUA,KAC9C2X,gBAAagC,MACnB,uBAAwCrL,MAAUA,EAClDuL,OACAA,QACAC,QAGA,CACA,CAwFAQ,aACAT,cACA3Z,QAAkB2Z,mCAElBA,uBACAU,QAGAvJ,gBACA,GAEA9Q,CACA,CACA,QACAsa,OACA7C,eACA,gBACAyC,cACAla,cACAua,YACAC,eACAC,KACA,iBAGAlb,6CACA,mBACAoa,YACAA,YACAc,QAAyBd,wCAAyC,GAGlEc,GATA,EAUA,EACAC,iBACA,gBACAR,eACA,kBACAK,YACAC,eACA,eACA,0BACAxF,2BACAhV,KACA,YAAwBF,aAAiBA,EACzCE,QAAsB2Z,qCAEtB,CACA,QACA,EACA7D,iBAGAyE,KAFAI,QACA7J,aACA8J,GAEAC,mBAGAL,KAFAG,QACA7J,aACAA,eAEA7O,cACA6O,WACAgK,aAEArE,cACA3F,WACAgK,eAKA,4DACAC,uFACA,iBACA,yBACA,uBACA,aAGA,OADA9K,QACAkJ,UACA,KACA,aACA,IACAlJ,OAGA,UACA,CACA,kBACA,iBACA,WACA+K,QACA/M,qBACAgN,QACAD,EACAE,oBACAA,QACA,MACA,iBACArN,cAEA,QACA,CACA,eACA,aAAmCyI,uCACnC,CACA,eACA,8DACA,CACA,eACA,cACA,8BACAjF,wBACAA,CACA,CACA,iBAGA,UAFAP,SAEAe,MADAsJ,cACAtJ,MACA,qBACAA,kBAEA,0BACAC,uBACAsJ,sDACAtJ,MAEA,SACAF,6BACAG,+CACAF,OACAC,QACAE,6BACAqJ,WAEA,sBACA1G,CACA,CACA,qBACA,IACA7U,MADAwb,KAEA,mBAAoCxb,MAAUA,EAE9C,GADAmQ,YACA,aAGA,8BACAA,OACAqL,WAEA,eACArL,gBACAqL,WAEA,OACA,eACAC,gBAEAtL,CAGA,CACA,iBACA,MAASxO,aAAU+Z,EACnB,OACA/Z,wBACAD,cAEA,CAEA,yCACA,iBACA,6BACA,CACA,iBACA,0DACA,CACA,iBACA,sBACA,cACAgP,QACA,2BACAD,gBACAA,mBAEA,CA+CA,qBACA,8CACA,CACA,iBACAkL,4BACAA,+BACAA,qCACAA,iCACA,CACA,mBACA,cACAA,eACAnL,YACAoL,SACAC,kBAEAD,qCACAC,kBAEAxD,cACAyD,qBAEA,wDACAC,mDACAC,UACAC,UACA,aACAJ,MACAD,aACA,CAAOM,gBACP,CAAOA,eACP,CAaA,iBACA,qBAQA,OAPA,cACA,SAAoB5F,+BACpB,qBACA6F,2BAEAA,CACA,CAEAC,CADAC,EACA,iBACA,iBACA,CACA,mBACA,WACA,gBACA,uBAA8Crc,MAAUA,GACxD4b,OACAvD,QACAA,SACAuD,aACAA,cACAU,oBAEA,MAAWJ,gBAAaK,UACxBC,eACAC,OACApE,YACAqE,SAEA,CACA,sBACA,CACA,mBACA,kBACA,IAEA1c,QAFAmC,MACAwU,MAEA,mBAAmC3W,MAAUA,EAC7C4b,OACAvD,QACAuD,cACAvD,gCACAA,mDACAA,QACAA,oBACAA,uBACA1B,aAEA0B,SACAA,kBACAA,6BACAA,oDACAA,wBACAlW,WAGA0Z,MACAA,KACA,CACAc,iBACAC,SACApG,MACAD,QACAE,SACAH,UAGA,QACAuG,YACApd,UACAA,YAEAM,0BACAA,6BACAA,qBACAA,gCACA,QACA+c,IACA7c,QACAF,SACA,GAEA,EACAN,eACA,EACAsd,eACA,uCACA,OACAtd,mBAEA,EACAud,iBACAjd,sBACAA,sBACAA,iBACA,EACAkd,gBACA,MACA,OAEA,qCACAC,wBACAC,yBACAC,EAtKA,eACA,QA7BA,eACA,WACA,UACA,yBAA2Cpd,MAAUA,EACrDqY,OACAgF,QACA1F,QACAU,MACA7G,eACA6K,4BACAnK,kBAGA,QACA,CAeAoL,IACAC,qCACAjH,sBACAC,oBACAC,qBACAC,qBACA+G,YACAC,YACA,OACAF,WACAG,uBACAC,+CACA9B,4BACA+B,+BACAvB,iCAEA,CAqJAwB,UACAC,aACAC,eACAC,gBACA,oCACA3F,oBAGA,0BACA4F,0DACAC,iBACAC,aACAC,cACAxB,UACAM,iBACAC,kBACAkB,mBACAC,oBAEA3C,mBAAuCiB,GACvCd,YACA,wBACAH,aACAra,IACAS,IACAI,SACAwU,SACKiG,IA9ML,iBACA,UACA,mBAAqC5c,MAAUA,EAC/C4b,OACAA,cACAA,yCACAA,2BAEAA,uBACAA,2CAGA,EAmMA2C,gBACAC,oBACAA,WACAA,YACAA,WApJA,eACA,qBACA,cACA,8BACA,eACAC,CACA,CACA5C,cACAA,eACA6C,WACAA,WACA,CA2IAC,KACAC,sBACA/C,WACAA,WACA+C,0BACAnf,aACA6W,aACAE,WACAD,mBACAE,mBACAgC,YACAD,YAEAwF,oBACA,gBACA5M,8BACAiH,sBAEA,GAGA,SACAwG,qBACAC,kBACA,QACA,CACAC,yBACAC,4BACAC,sBACA,QACA,CACAC,wBACA,gCACAzG,cACA,CACAD,QACAC,uCAEA,CACA0G,cACA,QACA,EAGA,oBACAN,kBACA,gDACA,EAGA,oBACAO,IACAC,uBACAC,sBACAC,mBACAC,0BACAC,wBACAC,wBACAC,oBACAC,wBACAC,uBAEAC,uBAoCAC,UAA6D3G,YAI7D,mBACA3Z,oCACA,CAYA,mBACA,iBAEAoa,EADA9B,UACAA,EACAiI,2BACA,cACAC,cACA,YAAsBjgB,sBAA6BA,KACnD,yBACAkgB,eACAC,WAEA,GACK,GAEL,2BAA8BC,0BAC9BJ,CACA,CACA,mBACA,iBACAK,WACA,MACA,OAEA,iCACAJ,cACA,YAAsBjgB,wBAA+BA,IACrD,0BACAmgB,IACA,KACA,GAEK,GAEL,oBAA+BC,eAC/BJ,CACA,CACA,iBACA,SACA,cACA,gCACAM,SAGAC,KACAC,mBACA/gB,+BACAghB,MAGA,CAaA,mBACA,iBACAJ,WACA,MACA,OAEA,kBACA,sBACAF,OACA7e,iBACA6e,KAEGzhB,QACHshB,yBACA,aACAxH,sBACAC,uBACA,cAGAgI,SAEA,oBAlCA,iBACAD,SACA9hB,qCAEA8hB,WACA,CA8BAE,MACAV,CACA,CACA,mBACAA,GACAA,eAEA,cApCA,eACAQ,aACAA,SACA9hB,uCAEA,CAgCAiiB,GAEA,CACA,mBACA,iBACAC,QACA,cACAT,EAhHA,iBACA,4BACShe,SAAMmX,QACf,OACA3D,OACAlW,QACAohB,SACA1e,oBACAwU,oBAEA,CAsGAmK,QAEGrhB,MACH,aACA,gCAEA,OA5HA,mBACAoS,0BACA,CA0HAkP,QACAH,CACA,CACA,oBACA/B,oBACA,4CACA,wBAtKA,iBACA,gBACAmC,2BACAC,0BAcA,GAbAlJ,OACArY,SACA+Y,SACAD,QACAxG,OACAkP,kBACAzI,gBACAD,iBAIAxG,6BACAA,sCACA8N,OACA,2BACA,QACA/H,UAEA,CACA,SACA,uBACAA,4BACM,CACN,4BACA,QACAA,WAEA,CAGA,CAqIAoJ,MACAC,GAEA,IACA,CACAtC,kBACA,iBACA,UACA,SAEA,sBACA,+BACA,aACA1I,MACA2B,qBAEAA,sBAGA,oBACA,kCACAA,kBAEAA,uBACAA,OACA,CACA,CACAgH,wBACAtgB,+BACAgB,6BAOAkW,IANA,CACA0L,UACAC,UACAb,WAEA9K,QACAlW,MACA,CACAuf,yBACA,oCACA4B,OACAA,KAGA,CACAS,UACAC,UACAb,WAEA9K,QACAlW,OACA8hB,YACA,CACAtC,sBACA,8BACA,CACAC,wBACA,kBACA,CACAC,cACA,cACA,mBACA,EAGA,sBACAqC,eACAC,gBACAC,iBACAC,iBAGA,yBACAC,wDACAC,qDACAC,IACAC,YACAC,kBACAC,wBACAC,2BACA,QACA,iBACAC,qBACAC,6BACAC,4BACA,SACA,kBACAC,uBACAC,kCACAC,4BACA,YACA,oBACAC,yBACAC,iCACAC,4BACA,aACA,sBACAC,+BACAC,8BACAC,wCACAC,2CACAC,2CACAC,8BACA,0BACA,+BACAC,2CACAC,qCACAC,4BACA,wBACA,6BACAC,uCACAC,wCACAC,oBAGAC,QACA3Q,KACA,qBACA,0BAEA4Q,cAEA5Q,wBAEA6Q,gBAEA7Q,8BAEA8Q,iBACA,cACA,gBACA9Q,4BAEA,oCACA,EACA+Q,wCACAC,iBAGAhR,SACA,WAEAA,SACA,2BAEAA,WACA,8BAEA,iCAEAiR,wBACA,wBACA,+BAGAC,iBACAC,IACAC,iBACAC,SAEAC,aACA,kBACA7U,qBACA,kBACAA,uBACA8U,CACA,EACAC,gBACAC,WAGA,SACAllB,qBACA,aACAglB,wBACA,yBACA3lB,gBACAA,oCACAA,qCACAA,gDACAA,kDACAA,oBACAA,eACAA,aACAA,aACAA,WACAA,qBACA,CACA8lB,SACA,mBACA,CACAtH,cACA,aACA,cACApd,cACA,2BACA2kB,aACAC,gBACA5kB,WACAA,+CACAA,YACAA,iBACAA,4BACAA,wBACA,CACA,CACA6kB,SACA,aACA7kB,YACAA,mBACAA,aACAA,cAEA,CACA8kB,QACA,aACAH,aACAI,cACAxJ,UACAkJ,UACAO,UACAT,QACA,MAEA,GADAvkB,2BACAA,UAGA,OAFAA,oBACAA,cAGA2kB,IACA3kB,gBAGAqkB,QACAA,eACAA,uCACArkB,0BACA,CACAilB,OACA,4CACA,2BACAC,QAAqBrN,aAAS,EAE9B,CACArY,WACA,sBACA0lB,qBACA,YAAoB/kB,WAAqBA,IACzC+kB,SAEA,EAKApI,oBACA1d,aACA2lB,aACAI,sBACAlmB,UACAwlB,YACAO,YACAT,UACAzO,cAEA,mCACAgH,yBACAxJ,aACAF,cACAD,8DAEA2J,qBACAsI,QACAtP,aACAuP,WApBA,2CAsBAC,SACAxP,cACAuP,WAzBA,8CA4BAvI,0BACAxJ,wBAEAwJ,sBACA4H,QACAa,WACAR,eAGAnE,QACA2E,WACAR,aAGAS,MACAC,YACAL,QACAX,oBAEAiB,SACA5P,eACAiP,cAIAY,MACAF,YACAL,QACAb,kBAEAmB,SACA5P,eACAqP,gBACAlmB,eAKA,SACAM,iBACAX,cACAA,yBACAA,iBACA,CACAue,aACA,UACA,OAEA,yBACA5L,0CACA,aACA,UACA,OAEA,WACA,kBACAqU,WAEApQ,kDACA+F,mBACAsK,YAEO,EAEP,CACAC,qBACA,kBACA3U,EAwEA,iBACA,MACA,OAEA,gBACA,KAIA,mBACAJ,6BAA+CI,GAAY4U,6BAE3D5U,EANAJ,WAOA,CArFAiV,MACA,MACA,SAEA,oCACA,kBAwDA,iBACA,WACA1X,iBACA,YAAkBnO,WAAiBA,KACnC,gBACA8lB,eACAzlB,gBAEA,CACA,qBACA,CAjEA0lB,oCACAnV,aACO,QAGP0U,CACA,CACAU,uBACA,yBACAV,KACAjlB,oCACA4lB,iBACAC,aACA,MACA,iBAA+BlmB,OAAQA,GACvC,aACA,qBACA,SAEA,kBACAslB,qCACA,QACA,CACA,aACA,WACA,iBACA,KACA,mBACAF,gBACA,QACA,CACAA,WAGAe,eAIA9lB,uBACAilB,WAJA1U,MAKA,CACA,QACA,CACAqM,YACA,6BAEA,YADA7L,mBAGA,oCACA,iBACAgV,sBACA,QAFA,CAIA,EA4BA,iBACA,yBACA7V,YACA5O,qBACAD,qBACA,OACAb,YACAsW,UAEA,CA+BA,iBACA,WACAwC,8BACA,QACA,mBAAsC3Z,MAAUA,EAChDmO,mBAEA,QACA,CACA,qBACA,eACAkY,oBACA,YACA,YAGA,oBAAkCrmB,MAAUA,GAE5C,GADAsmB,QACAA,OACA,SACA,SAEA,KACA,CACAC,cACAC,mCACArW,KAEA,CACA,SACA,CAcA,iBACA,6BACA,sCACA,CAWA,mBACA,wBACA,sBACA,CACA,mBACA,2DACA,mBACA,mBACA,cAEA,CACA,WACA,CACA,iBACA,MAAS1Q,uBAA0B8Z,EACnCkN,6BACShN,2BAAqCiN,EAC9CC,SACAC,SACAvV,EA7BA,mBACA,SAAYwV,QAAiBC,QAAiBJ,iBAC9C,CA2BAK,QACAhW,WACA,MACA,aAAkB/Q,OAAUA,IAC5B,gBACA+B,CAAW4kB,cAAgC5mB,GAE3CinB,GADAjnB,6BACA6mB,cACAI,QACAA,kBACAA,oBACA,CACA,CACA,iBACA,iBACA,sDACA,CAyBA,iBACA,gCACA,KAGA,gBACA,kBACA,kBACA,6CACA,cAEAP,aACA,EACA,CACA,oCACAQ,+BAA+EC,GAC/E,SACA9nB,iBACAX,aACAA,gBACAA,aACAA,wBACAA,gCACAA,iCACAA,oBACAA,iBACAA,kBACAA,wBACAA,2BACAA,uBACAA,uBACAA,4BACAA,qBACAA,kBACAA,iBACA,CACA0oB,aACA,aACAT,gBACA7mB,cACAA,eACA6mB,0BACA7mB,eACA,CACAunB,eACA3oB,gBACA4oB,qBAEA5oB,YACA,CACA6oB,aACA,aACA7nB,UACAinB,gBACA9L,iBACA2M,yCACAC,oCACAC,oCACAC,oCACAC,cACAC,uBACAC,uBACAnB,4BACAA,4BACAA,4BACAA,4BACAA,2BACA,CACAoB,aACA,2CACA,CACAC,UACA,4CACA,CACAC,iBACA,2BACA,CACAC,kBACA,yBACA,oBACAvB,SACAA,QACA,CACAwB,QACAzpB,qBACA,CACA0pB,WACA,yBACA1pB,YACA2pB,oBAEA1B,YACAW,KAEA,CACAgB,aACA,aACAzN,iBACA1F,sBACAoT,UACA,SACAzoB,QA5LA,eACA,uBACA0oB,sBACA,UACA,mBAAkCvoB,MAAUA,EAC5CqR,OACAkX,MACApmB,IACAwU,QAGA,QACA,CAgLA6R,YACMF,OACN,MACAF,QACA,sBACAf,MACAX,YACA,CACAxR,2BACAuT,QAEA5oB,eACAA,SACA,CACA,CACA6oB,cACA,aACAhC,gBACA7mB,eACAA,uBACA6mB,mCAEA,CACAiC,yBACA,aACAjC,gBACA9L,iBACA,SACA/a,eACA,mBACA6mB,0BACAA,oBACAkC,KACAvB,MACAX,iBAEA7mB,sBACA+oB,oBACAC,eAEA,CACA7L,YACA,aACA8L,iBACAC,8BACAC,yCACAnpB,6CACAA,4BACA,CACAopB,WACA,cACWC,uBAAgCrpB,GAChC4Z,qBAAkBiN,EAC7BC,SACA,IAEA3mB,OAFAmpB,iCACAC,sBAEA,mBACA1C,YACAA,aACA2C,SACM,CAENA,GADAhU,SACAxV,0BACQ2Q,SACR3Q,2BAEAA,8BAEA,uCACA,QAAkBG,MAAWA,EAC7B0mB,uBACAyC,IACAG,OACAH,MAEAC,KAGA1C,WACA,CACA6C,GACAV,QAEA,CACAW,4BACA,MAAW/P,mBAAgBiN,EAC3BC,SACAC,SACA6C,gBACAC,QACAL,eACA,YACA,aAA8BrpB,OAAUA,EACxC2X,OACA0R,MACAhoB,yBACAU,uBAGA,QACA,CACA4nB,wBACA,MAAWC,mBAAgBlD,EAC3B2C,eACA,YACA,YAA8BrpB,MAAUA,EACxC2X,MACA5X,OACAspB,MACAlnB,kBACAwU,mBAGA,QACA,CACAkT,yBACA,MAAWD,mBAAgBlD,GAChBoD,+BAAgCrrB,cAC3C4qB,eACA,aACA,YAA8BrpB,MAAUA,EACxC2X,MACA5X,QACAspB,MACAlnB,sBACAwU,uBAGA,QACA,CACAoT,aACA,kCACA,CACAC,kBACA,+BACA,CACAC,kBACA,MACAvD,mBACAvW,YAKA,UAJA,CACAhC,QAJA1P,YAIA,GACA2Y,0BAEAjH,WAAiDgC,QACjD,CACA+X,+BACA,kBACA,qBACA,6BACAlD,OACAA,WACAtN,wBACAA,wBACAvJ,iCAAsEga,UAEtEzQ,wBACAA,uBACA,CACA0Q,eACA,aACA1D,gBACA2D,YACAlB,0BACApY,WACAuZ,sBACAtD,kBAAgD7Y,iCAChDuL,GAAmB/X,4DACRA,aAjVX,eACA,MAASA,uCAAkC4oB,kBAC3C,OACA5oB,iCACAD,iCAEA,CA2UyC8oB,IACzC,gBACA,cACA,gBACAra,cACAoW,eACAC,kBACA,CACA,SAAgBxmB,OAChByqB,OAGA5qB,mCACAspB,MAL0BnpB,IAS1B,KACA,WAAyBA,QAAQA,GACjC,SAGA,mCACA,MAGA,QACA,CACA0qB,sBACA,iCACAtT,KACA,UACA,mBAAsCpX,MAAUA,EAChDmQ,eACAqW,OACApP,UAGA,QACA,CACAuT,iBACA,QACA,CACAC,oBACA,MACAlE,EADAjoB,KACAyqB,YACAzP,WACAoR,WACAxB,EAJA5qB,KAIAsrB,aACA,OACAe,4CACA3a,4CAEA,CACArQ,WACA,aACA4mB,gBACA7mB,cACAA,qBACAA,uBACA6mB,QAjdA,eACA,YACA,cACA7T,QACA7Q,UACAT,WACAK,UAEAiR,UAEA,CACA2D,MACAD,QACAE,SACAH,OAEA,CAicAyU,mBA9dA,mBACA,UACA,SAEA,gBACApU,UACA,OACAH,UACAD,YACAE,eACAH,aAEA,CAkdA0U,wCACA,CACA/N,WACAhd,OACA,aACAkV,SAEAuR,gBACA/L,aACAsQ,EAHAprB,QAGAgc,UACA0I,KACA1jB,kBACAqqB,2BACA,MAIA,IAHAxE,WACAA,wBAEA1mB,IAAoBA,QAAmBA,GACvC,aACA6Z,SACA0K,UAEA1K,WAEA,CACA,QAAgB7Z,aAAmBA,EACnCukB,cAEA,CACA4G,cACA,6BACA,4CACA1sB,qCACAA,sCACA,CACA2sB,kBACA,aACAxQ,iBACA,MACA,sCACA,8BACAwG,eACAvH,WAhYA,mBACA,uCACA0K,UACA8G,YACAhC,cACAiC,WACAzR,UACAlC,QACAxF,eACAwD,aAEA,CAqXA4V,sBACAnK,wBACAA,gBACAA,qBACA,MACAA,eACAvhB,WAlZA,iBACA,sCACA,CACA0kB,UACA3J,eACA0L,eACA3O,QACAxF,eACAwD,gBAGA,CAuYA6V,gCACApK,YACAA,+BAEA,oBACAA,SACAA,CACA,CACAqK,gCACA,gEACA,CACAC,+BACA,+DACA,CACAC,wCACA,aACApH,eACAtP,oBACA2W,UACA1E,OACA2E,+BACA,KACA,eAEA,uBACA9C,uCACA+C,QAAkCC,SAAY,qBAC9C/C,uCACAllB,+BAEAsT,+BADA,sBACA0U,GACA,oBACA1U,aACAnC,8BAEAmC,EACA,CACA4U,0BACA,aACAvsB,UACAwV,oBACA2W,eAAkCK,IAClC/E,OACA,KACA,SAEA,MACA,6BACA,uBACA6B,yCACAC,uCACAhY,0CACA,CACA,kCACA,yBACAiE,uBAEAqQ,CACA,CACA4G,oBACA,aAGA,kEAAyElb,GACzE,CACAmb,oBACA,+CACA,CACAC,uBACAC,MACAjb,mBAEA3S,wCAEA,CACA6tB,2BACAC,WACA9tB,6CAEA,CACA+tB,mBACA3S,WACA,2BACApb,yCACAuS,yCAEA,CACAyb,wBACAhuB,+BACA,CACAiuB,qBACAjuB,+BACA,CACAkuB,2BACA,iCACA9S,GACApb,oCAEA,CACAmuB,wBACA,iCACA/S,GACApb,oCAEA,CACAouB,mBACA,aACA3X,UACAyF,qBACA,+BACA9a,UAEAA,eACA,iBACAitB,WACA5B,gBACAA,GACArrB,aAEAitB,IACAjtB,2BACMitB,KACNjtB,wBAEA,CACAktB,0BACA,aACArG,gBACAxR,SACAiC,MACA,MACA,YAEA,IADA6V,YACAhtB,aAA+BA,KAAUA,IACzCgtB,aAIA,IADAC,KACAjtB,IAAoBA,MAASA,EAC7BkV,2BAEArV,YACAotB,aAEAptB,aACAqtB,GACArtB,+BAEA,CACAstB,yBACAC,qBACA,MACA1G,EADAjoB,KACAyqB,YACA,GAFAzqB,KAEA4uB,UACA,8BACA3G,YACAW,OAEA,CACAX,kBACA,CACA4G,cACA,yBACA7uB,0EACA,CACA8uB,aACA9uB,yEACA,CACA+uB,eACA/uB,4CACA,CACAgvB,mBACAhvB,6CACAA,6DACA,CACAivB,iBACAjvB,2DACA,EAEAkvB,eACAA,qCACAA,kCAEA,SACAvuB,cACAX,cACAA,cACAA,eACAA,oBACAA,uBACA,CACAmvB,mBACA,MAAWzrB,SAAM1D,2BACjB,OAAY0D,QACZ,CACA0rB,WACA,6BACA,CACAC,cACA,aACAvuB,mBACA,UACA,SAEA,WACA,qBACAwO,yCAEAA,CACA,EAEAggB,eACAA,wBAEA,iBAWA,mBACA,OAXA,iBACA/c,QACA,4BACA,gBACA,WACAgd,6BACAC,aAEAD,CACA,CAEAE,eACA,CAEA,UACA9W,UACA/B,aAEA8Y,eACA,SACA,UAEA,kCACA,MACAC,IACA,eACA,sEACAC,kBACAC,gBAEAF,EAmBA,iBACA,6DACA,2CACAA,mBAEAA,CACA,CAzBAG,KACA,CACA,wBACAC,4CACAxd,GAAqBsd,4DACrB,kDACAG,SACA,EACAC,mBACA,SACA,UAEA,yCACA,2BACAC,4BAEA,EACA,GASA,QAAaA,eAwIb,uBACA,gBACAxX,oCACA,IACAyX,MADA1D,IAQA,IANA2D,eACAC,IACAF,MACAC,qBAEAE,IACAA,KACA7D,IACA6D,oBAEA,oBAA+B/uB,IAASA,IACxCA,QACAgvB,aACA9D,IACA6D,oBAGA,CA5JApS,gBACAuE,WACA+N,UACA1e,WACA2e,eACAC,eACAC,QACAC,MACAnO,WACAoO,YACAC,cACAC,mBACAC,aACAC,aACAC,6BACAC,yBACAX,UACAY,cACAC,mBACAC,eAEAC,OACA9O,WACA+O,QACArT,SACApG,MACAC,WAGAyZ,OACAC,cACAC,eACAC,UACAC,kBACAC,mBACA3T,UACAsE,WACAsP,YACAC,kBACAC,cACAC,8BACAC,SACAC,SACAC,eACAC,kBACAC,qBACAC,0CACAC,qBAGAvU,2CACAA,gDACAA,sDACAA,2CACAA,qBACAxJ,aACAH,6FACAC,uDAEA0J,sBACAxJ,oBA+GA,MACAge,gDACA,iBACA,WACAC,aACApjB,WACA,QACA,KAAShO,IAASA,KAClBiU,yBAEA,QACA,CACA,mBACA,uBACAod,kBACAxwB,gBACAsW,cACAma,OACA,IACArC,EADAsC,uBAEA,SAEAtC,EADA,MACAuC,kBACM,OACNjH,2BAEAgH,4BAEAA,YACAA,eAIA,QACA,CAcA,eACA,iCACA,CACA,iBACA,cACA,SAEA,qBACA3U,gBAEA,OADAvH,4BACAR,qBACA,CAcA,mBACA,WACA,0CACA9G,EA5EA,4CA4EA0jB,KAEA1jB,CACA,CAgBA,oBACA3O,eACAsyB,QACAjzB,aACAA,iBACAA,oBACAA,eACAA,mBACAA,gBACAA,mBACAA,iBACAA,kBACAA,kBACAA,mBACAA,eACA6X,OACAC,QACAC,MACAC,UAEAhY,qBACAA,sBACAA,uBACAA,0BACAA,wBACAA,yBACAA,iBACAA,0BACAA,gBACAA,gBACAA,mBACAA,cACAA,yBACAA,sBACAA,sBACAA,eACAA,kBACAA,0BACAA,wBACAA,sBACAA,uBACAA,qBACAA,qBACAA,0BACAA,0BACAA,oBACAA,oBACAA,eACAA,0BACAA,oBACA,CACAkzB,QACA,aACA9xB,uCACAA,cACAA,0BACAA,0BACAA,wCACAA,uCACA,CACAopB,WACA,QACA,CACAuB,gBACA,IAASoH,uDAAkDnzB,KAC3D,wCACAozB,iCACAC,iCACAC,iCACA,CACApwB,YACAD,YACAswB,iBACAC,iBAEA,CACA7H,aACA,aACA,IACA1Q,GADS/X,uCAAkC9B,kBAE3C,QACA,OAAc8B,aAEd,oCACA,uBAAyC3B,MAAUA,EACnD0Z,iCACAsY,IACArwB,qBAEAswB,IACAvwB,qBAGA,OACAC,kBACAD,kBAEA,CACAwwB,aACA,aACA,OACA5b,sBACAE,oBACAD,wBACAE,0BAEA,CACA0b,WACA,iBACA,CACAC,YACA,wBACA,mFACA,CACAC,eACA5zB,eACAA,yBACA,CACA6zB,eACA3B,oCACA,CACA1T,cACA,aACAsV,kBACAC,eACA3yB,iBACAA,aACAA,cACAA,4BACAyW,OACAC,QACAC,MACAC,UACKiC,GACL7Y,aACAA,mBACAA,sBACAA,mBACAA,wBACAA,kBACAA,uBACAA,8BACAA,uBACAA,wBACAA,sBACAA,qBACAA,wBACAA,oBACAA,+BACAA,wBAEAA,qBACAA,2BACAA,oBACA,yBACAA,iDACAA,cACAA,iCACAA,2BACAA,gCACA0yB,6CACA1yB,QA5WA,iBACA,wBACA4yB,mBAwBA,eACA,yBACA/C,gBAGA,2BAFAnF,oBACAA,gBAEA,CA9BAmI,IACAC,kBA6CA,eACA,WACA,QACA,mBAAmC3yB,IAAUA,IAC7CkwB,YACAjc,UAGA,QACA,CAtDA2e,OACAC,WACAC,OACAC,SACA/D,KACA,OACA,OAiDA,qBACA,IAEAhvB,EAFAkrB,IACA6D,OAGA,IADAF,eACA7uB,IAAcA,WAAkBA,IAChCA,QACAgvB,aACA9D,IACA6D,SAGA,CA7DAiE,YACAhE,EAEA,QAqBA,mBACA,QA4DA,eACA,iBACA,QACA,OACA,SAEA,eAA6BhvB,MAASA,EACtC,mBACA,SAGA,QACA,CAxEAizB,IACApE,aACA,MACA,qBAEA,cACA,yBAA6C7uB,IAAUA,KACvD,aACA,OACA,QAEA,CACA,oBACA,CAnCAkzB,QACA,QACA,QACA,yCAEA,IADAC,wBACAnzB,UAA4CA,IAAUA,IACtDmzB,sBAEA,sCACAnE,CACA,CACA,iBACAA,CACA,CAmVAwB,YACA3wB,oBAEAuzB,GACAvzB,iCAEAA,cACAA,QACAA,aACAA,eACA,CACAmd,YACA,aACA,IACAqW,IADAC,oBAEAzzB,kBACAwzB,SACAE,YAEAF,QACAE,WACAD,MAEAzzB,gBACAA,cACAA,mBACAA,cACAA,wCACA,CACA2zB,cACA7C,mCACA,CACA8C,sBACA9C,2CACA,CACA+C,gBACA,aACA7zB,kBACAA,mBACAA,SACAA,kBAEAA,qBACAA,QACAA,mBAEAA,gBACAA,eACAA,iBACAA,iBACA,CACA8zB,qBACAhD,0CACA,CACAiD,cACA,aACA/zB,wCACA8wB,oBACA,CACAkD,mBACAp1B,mCACA,CACAq1B,uBACAC,kBACAt1B,kCACA,CACAu1B,mBACAv1B,mCACA,CACAw1B,aACA,QACA,CACAC,kBACAz1B,kCACA,CACA01B,8BACAxD,mDACA,CACAyD,sBACA,aACA7B,kBACA,UACA,mBAAqCvyB,IAAUA,IAC/C2kB,OACAA,uCAEA,QAAgB3kB,IAAUA,IAC1BoW,iBACA8Z,cACAnf,IACA/Q,IAGA,CACAq0B,6BACA1D,kDACA,CACA2D,+BACA3D,oDACA,CACA4D,yBACA,aACAvjB,YACAuhB,UACAiC,iBACArE,mBACAC,gBACA,IACAT,MADA8E,IAEA,8DAEA,YADA50B,mBAGA,2BACA60B,iBACAC,oBACAhc,oCACAgX,iCACA+E,QACA/E,yBACA/W,yBACA2Z,2CACAqC,uBACAH,cACAjD,8CACAA,6CAEAiD,6BAEA50B,iBACA,CACAg1B,8BACAlE,mDACA,CACAmE,YACAnE,iCACA,CACAoE,MACA,aACAC,GACAxc,QACAC,WAEWhZ,iBAAiBywB,yBAAoDrwB,EAChFqhB,iBACA+T,mBACA,MACA,6BAQA,GAPAA,GACAD,mBACAA,mBAEAA,qBACAA,iBAEAzC,2BACA,MAAeO,oCAA8BjzB,mBAC7Cq1B,eACAC,uBACAC,gBACAC,gBACAJ,EAEAD,wCADAzC,oCACA2C,IAGAF,qCADAzC,oCACA2C,IAEAr1B,8BACA,CACA,CACAA,mBACAo1B,GACAp1B,2DACAA,oBAEAA,gBACAA,6DAEA,CACAy1B,2BACA,cACWpF,OAAQY,mBAAeyE,YAAY11B,UAC9C21B,sBACAC,0BACA,qBACA,oCACAC,8CACA,SACAC,KACAH,EACAC,GACAG,aACAD,gBAEAC,cACAD,cAEQ,YACRA,WACQ,UACRC,YAEAA,aACAD,cAEA91B,uDACAA,uDACA,KAAM,CACN,iBACAg2B,aACA,aACAC,IACAD,YACQ,YACRC,WACAD,KAEAh2B,iBACAA,mBACA,CACA,CACAk2B,iBACA,aACAl2B,aACAA,wDACAA,qDACAA,2DACAA,8DAEA,CACAm2B,WACArF,gCACA,CACAsE,eACA,MAAW7a,mBAAgB3b,aAC3B,sCACA,CACAw3B,aACA,4BACA,CACAC,yBACA,aACAr2B,gCACAA,wBACAA,8BACA,CACAs2B,iBACA,aACA,oBACA,OACA,mCACA,cACA3D,aACAtC,WAEArwB,gDACA,CACA,QACA,CACAu2B,wBACA,MAAWjhB,2BAAgC1W,KAC3C43B,KACAC,KACA,IAEAt2B,6BAFAu2B,IACAC,IAEA,QAAgBx2B,MAAYA,GAO5B,GANA8qB,aACA2L,mCACAthB,oBACAF,iBAA0DC,QAAQH,OAClE9C,iBACAuG,QACApC,cAEA,GACQf,MACR,mBAAyC/G,MAAUA,EACnDooB,SACAtgB,kBACAoC,6BACAC,aAPAD,4BACAC,MAUA4d,WACAC,WACAC,iBACAC,gBACA,EA/fA,iBACAxY,SACA,aACA2Y,aACA,MACA,QACA,QAAkB32B,MAAWA,SAC7BiV,aAEAF,aACA,GAEA,CAofA6hB,MACA,sBACAC,gBACAC,SAA+Bte,iCAC/B,OACAsa,YACAC,aACAgE,cACAF,eACAR,SACAC,UAEA,CACAU,oBACA,QACA,CACAC,sBACA,UACA,CACAC,qBACAC,mBACA,mBACA,yBACA,KAEA14B,iCACA,CACA24B,sBACA,aACAv3B,mBACAw3B,OAEA,kCACA,6CACA,CACAC,sBACA,0CACA,gCACA,CACAC,eACA,iDACA,CACAC,eACA,MAAW71B,aAAUlD,KACrB,kBACAkD,WACA,CACA,CACAypB,cACA,aACA8E,cACA,qBACA,aACA,oBACAvL,WAvhBA,mBACA,uCACAA,OACAhN,QACAhC,aAEA,CAihBA8hB,qBACA,CACA,oBACA53B,WAhiBA,iBACA,uCACA0qB,QACA5U,cAEA,CA2hBA+hB,yBACA,CACAC,YACA,aACAC,kBACAC,sBACAzC,wBACAC,wBACAyC,qBACAlb,uBACAtb,uBACAS,yBACA,wBACAA,gBACAA,eACA,CACAg2B,aACA,6BACA,mBACA7W,EAEAziB,uCACA,CACAu5B,yBACA,aACA5d,SACA3a,UACAuR,aACWqe,mBAAgBre,EAC3Bie,WACAgG,mBAEAgD,EADAp4B,QACA+uB,eACAsJ,QACAh4B,MACAi4B,gCACAC,kCACAC,QACAC,gBACA,kBACA,EACA,gBACAC,wBACA,aACAC,gBACAC,cACAC,SACAC,gBACAC,oBACM,aACNJ,aACAG,SACAC,mBACAH,SACAC,mBACM,WACNF,eACAD,aACAM,SACAC,iBACAC,mBACM,YACNP,cACAM,UACAC,kBACAR,SACAM,oBACM,SACN,gBACAL,qCACQhoB,OACR,2BAEAgoB,0CADAjD,OAEA,CACAoD,SACAC,YACAH,SACAC,OACA,SAAM,SACN,gBACAF,kCACQhoB,OACR,2BAEAgoB,0CADAjD,OAEA,CACAgD,SACAM,QACAC,UACAC,UACA,CACA,SAAgB/4B,OAAiBA,IACjC,wCACAsvB,gBACA0J,YACAnJ,oBACAC,uBACAH,gBACAC,gBACAqJ,yBACAC,2BACA3H,mBACA,SAGA4H,eACAlE,EACAsD,eAEAE,eAEAv4B,SACAq4B,OACAE,OACAI,OACAH,OACAI,MACAH,MACAI,MACAH,MACApgB,SACA2L,SACA0L,cACAC,oBACAH,aACAC,aACAqJ,kBACAC,0BAEA,CACA,wBACAr5B,kBACAK,EACA,CACAk5B,sBACA,aACAhf,SACApJ,aACWukB,oBAA8BvkB,EACzCikB,mBACA/E,WACWY,yCAAoC8G,EAC/CM,cACAmB,QACAC,WACA7jB,wBACAvV,MACA,wCACAq5B,YACA,aACA5iB,eACA6iB,uCACM,aACN7iB,YACA6iB,uCACM,YACN,uCACAA,gBACAr3B,OACA,SAAM,aACN,uCACAq3B,gBACAr3B,OACA,SAAM,SACN,gBACAwU,iCACQnG,OACR,2BAEAmG,uCADA4e,OACA8D,EACA,CACAG,8BACA,SAAM,SACN,gBACAr3B,iCACQqO,OACR,2BAEArO,uCADAozB,MAEA,CACAiE,0CACA,CACA,UACA,YACAD,SACQ,YACRA,cAGA,4BACA,qBAAqCv5B,QAAUA,IAC/C2kB,SACAmG,YACA,wCACA2O,uCACA5kB,iCACA5C,iBACAynB,sBACA,cACAvV,YACAwV,sBACAC,sBA2BA,OACA,GA3BA3E,GACA9yB,MAGA03B,GAFA,UACA,oBACAH,WACY,cACZ5B,6BAEA7lB,uBAGA,mBACAA,KACY,aACZ6lB,0BAEAA,wBAGAzH,IACAwJ,UAGAljB,MACAkjB,gBAGAC,sBACA,gCACArhB,kBACAD,iBACA,oBACAlC,cACA,eACA,SACAE,SACA,UACA,SACAA,OAGA,eACA,SACAF,SACA,UACA,QACAA,OAGAyjB,IACAzjB,QACAE,OACAgC,kBACAC,oBACA0L,uBAEA,CACAjkB,SACAuV,YACAqV,SACAjW,QACAsP,SACAwV,eACAC,eACAC,cACAL,aACAD,gBACAS,oBACAD,aAEA,CACA,SACA,CACAE,0BACA,MACW1E,oBADX92B,KAC4BuS,QAE5B,IADAkpB,GAFAz7B,KAEAg2B,eAEA,+BAEA,eACA,wBACA3D,SACM,kBACNA,WAEAA,CACA,CACAqJ,2BACA,cACW5E,kBAAkBxE,kCAA8BlxB,UAE3Dw5B,MACAtC,EAFAl3B,mBAEAk3B,aACA,MACA50B,EACA,iBACAkuB,GACAmJ,SACAr3B,cAEAA,YACA,WACAq3B,UACU,cACVA,WACAr3B,SAEAq3B,SACAr3B,WAGM,YACNkuB,GACAmJ,UACAr3B,aAEAA,WACA,WACAq3B,SACU,cACVA,WACAr3B,SAEAq3B,UACAr3B,YAIAq3B,UAEA,CAAYA,gBACZ,CACAY,oBACA,aACA,0BACA,OAEA,gBACA7E,qBACA,8BACA,CAAc/e,iDACR,wBACN,CAAcA,qDADR,CAGN,CACA6jB,iBACA,MAAWllB,eAAemlB,mBAAgBhkB,+BAA4B7X,KACtE67B,IACAnlB,SACAA,cACAA,oBACAA,YAEA,CACAolB,wBACA,aACAlL,iBACA,+BACA,SAGA,QADAxvB,QACA26B,0BACA,YACAnL,8BACAC,UAEA,CACA,CACAmL,YACA,aACApL,iBACAla,QACAjV,kEACA,QACA,mBACA8R,oBAGAmD,SACAA,oBACAA,sBACAA,gCACAA,oCACAA,cACAA,kBACAA,kBACAA,WACAA,cAEA,aACA,mBAAuCnV,MAAUA,GACjD,aACAqvB,mBACAqL,EACA,CAAav4B,eACb,CAAaA,eACbpC,GAGAsvB,aACAqL,EACA,CAAav4B,iBACb,CAAaA,iBACb,CACAgiB,kBACA3L,kBACAqX,4BACAC,yCAIA,CAEA,CACAP,aACA,cACW9vB,uBAAsB4vB,SAAOxvB,EACxCs4B,+BACAC,+BACA,MACA,OAEA,gDACAI,iBACA,YACA34B,kBACAi5B,qBACAC,sBACAJ,QAEAA,oBACAC,uBACAE,OAEA3jB,SACAA,0BACAA,4BACAA,cACAA,cACAA,cACAA,WACAA,WACA,CACAwlB,cACA,aAEA,IADA96B,gBACAqhB,QACA,OAEA,cACA+J,wBACAA,GACA2P,QAEA,+DACA,QACA,mBAAqC56B,MAAUA,GAC/C,aACAy2B,SACA3L,UACA/qB,aACAoV,6BACAA,+EAGA0lB,SADA96B,aACA02B,IACA,CACAxL,GACA6P,KAEA,CACAC,YACA,MAAW5lB,eAAeogB,+BAA2B92B,KACrD,cACA,OAEA,mBACAme,gBACAkU,UACA,qBACA,cACA7B,YACA5Z,aACA4Z,oCAGAA,SAEA,MAAW+L,yCAx/BX,qBACA,MAASxkB,+BAA0B+T,EACnC,IACA5R,MADAlD,IAEA,yBACAulB,WACAC,YACAtiB,QAEAqiB,YACAC,WACAxlB,qBAEA,CAAUulB,wCACV,CA0+B+CE,aAC/CL,mBACA1W,cACAxL,WACAlD,WACA+jB,oBACAD,sBACAS,mBAEA,CACA/5B,QACA,cACAJ,iBAGAA,mBACAA,cACAA,eACAA,cACAA,gBACA,CACAs7B,UACA,aACAhlB,YACAilB,wBACAC,sBACA,kDAQA,EACAve,IACA7c,QACAJ,mBACAA,cACAA,aACA,GACK,CACLid,MACA7c,OACAJ,cACA,GACK,CACLid,IACA7c,QACAJ,eACA,IAvBA,EACAid,IACA7c,QACAJ,SACA,GAqBA,CACAy7B,2BACA,aACAC,yCACAC,kBACAvnB,KACA,QACA,mBAAqCjU,MAAUA,GAC/C,aACA0mB,+BACAzS,SAEA,CACA,QACA,CACAwnB,2BAEA,UADAh9B,kDACAoW,KACA,CACA6mB,aACA,aACAC,0CACA,2CACA,EAGA,yCACAC,QACAvgB,qBAEA,SACA,8BACAwgB,cACAC,UACAC,cACA5oB,YACA6oB,aACAxpB,gCAEA,oBACAypB,8BACArrB,YACAA,eACAoY,SACA,GAEA1W,WACA4pB,OACA,IA0LA,qBACA,MACA,iBAEA,GADA/rB,gBACAyrB,MACA,eACAO,YACAhsB,CAGA,CApMAisB,WAEAC,gCACAC,iDAEAC,mBACAD,6BAEA17B,WACA47B,kBAEAC,WACAD,MAEAnqB,eACAzB,8BACAwK,YACAxK,YACAA,SACA,IAGA,CACA,qBACA,SACAirB,cACAa,SACAC,WACAC,YACAC,eACAC,qBACAC,0BACAvqB,qCAEA,oBACAypB,8BACArrB,YACAgQ,MACA,GAEAtO,aACA4pB,OACA,IA8CA,mBACA,MAASQ,gDAAwD9rB,EACjE,WACA,kCACAT,EAUA,qBACA,MAASusB,0CAAqC9rB,EAC9C,YACA,iEAEA,gBACAT,YACA0sB,YACArsB,QACAL,uBAEAA,CACA,CAtBA6sB,WAEA3nB,kBACAlF,EAoBA,qBACA,MAASusB,gDAAwD9rB,EACjE,qBACAT,8BACIK,UACJ,UACAwY,6BACA7Y,KACA,kBACA,oBACAA,yBACA,CACA,CACA,QACA,CAlCA8sB,uBAEAC,UACA/sB,qBAEAA,CACA,CA3DAgtB,SAEAd,gCACAzrB,uBACA0rB,kBAAsCxpB,oCAAsC,EAC5EwpB,sCAEAC,mBACAD,0BAEA17B,WACA07B,iBAEAG,YACAH,mBAEAjqB,cACAuO,cACAhQ,MACA,IAGA,CACA,iBAAyCwsB,6BACzC,MAASpqB,0EAAiG4N,EAC1G,OACAyc,UACAD,aACAE,YACAC,2BACAC,0BAEA,CACA,4BACAN,gCACA,mBACA,WACA,eAGA/sB,MACAyrB,QACAhrB,SAEAT,CACA,CA2CA,mBACA,qBACA,CACA,yBACA,kCACA,qBACA,kBACA,gBACA,MACAkC,SACA,4BACA,uBACA,QAEA,UAAM,oBACN,WAEA,CACA,QACA,CACA,qBACA,sBACAgJ,sBACAoiB,cACAprB,UACAA,SACA,qBAIA,QAHA,UAGAupB,eACAvqB,cACA,YAIAqsB,mBACA,IAQA,mBACA,uBACAtiB,SACAxD,SAEA,aACA,oBACAzH,EAEAS,CACA,CAlBA+sB,QACA,CACA,qBACA,QACAtsB,cAEA,QACA,CAuBA,iBACA,kBACA,MACA,SAEA,aACA,SACA,QAEA,CACA,CACA,eACA,cACA,WACAlD,UAIA,eACA,gBACA,iBACA,4DACAkE,SAGA,YACA,CAZAurB,aAEAzvB,CACA,CAWA,+BACA0vB,uCACAC,sBACA,qBACA,mBACAC,IACAhP,aACAiP,UACAC,UACA,cACAC,UACAC,eACAD,eACA,YACAE,MACA,OACAC,UACAl8B,kBACAwU,mBAEAoY,MACA5sB,kBACAwU,mBAGA,CAoDA,qBACA,cACA2nB,WACAC,mBACAC,WACA,UACAC,UACA,QAAcz+B,MAAeA,EAI7B,GAHA0+B,IACAC,IACAF,YACAE,EAGA,OACA,kBACAJ,0BACA,CACAC,OACAC,EACA5qB,yBACA0qB,eAFAA,OADAA,MArEA,mBACA,iBACA,cACAE,UACA,YAAkBz+B,QAAmBA,EAGrC,GAFA2+B,IACAF,YACAE,KAGA,mBACAH,cACA,QACA,CACAI,YACAC,cACAC,gCACAA,QAGAC,iBACAP,cACAA,iBAEA,EAkDAQ,QAjDA,uBACA,cACAV,WACA,UACAG,UACA,YAAkBz+B,MAAeA,GAIjC,GAHA0+B,IACAC,IACAF,aACAE,EACA,SAEA,aACAM,OACAP,IACAtQ,aACAuQ,QAAyBhX,KAAUuX,IACnCP,QAAyBQ,KAAUF,UAEnCR,IACArQ,aACAuQ,QAAyBhX,KAAUuX,IACnCP,QAAyBQ,KAAUF,SAEnC,CACA,CAyBAG,OACA,CACA,mBACA,gCACA,CAsBA,uBACA,YAIA,GAHApuB,aACAquB,wBAEA,sCACAC,YACI,CACJ,2BACA,mBAAsCt/B,MAAUA,EAChDgW,OACAupB,KACAnW,EACApT,EACAqpB,6BACAruB,WAEAgF,oBACAA,oBACAA,gBACAA,gBACAoT,GAEA,CACApY,mBA7CA,iBACA,cACAwuB,aACA,mBAAoCx/B,MAAUA,EAC9Cy/B,IACAC,IACAF,sBACAE,IAGA1pB,OACAypB,IACAzpB,iCACAA,kCAEAwpB,IACAxpB,iCACAA,kCAGA,CA0BA2pB,KAEA,CAEA,qBACA,OACAx9B,kBACAwU,kBAEA,CACA,qBACA,OACAxU,kBACAwU,4BACA,wBACA9D,YAEA,CACA,qBACA,SAAe1Q,mBACfy9B,GAAez9B,mBACfmL,YACA/L,YACAs+B,YACAh+B,YACAuS,YACA,gBACA,CA0CA,mBACA,SAzCA,cACA,OACAjS,KACA29B,QAEAC,YACAvnB,GACA,EACAghB,aACA,aACA1I,EAEA,2BAEAkP,aACA79B,IAEA89B,kBACA99B,IAGA,CAoBA+9B,MAlBA,CACA/9B,KACAA,EAEA49B,YACA,EACAvG,aACA1I,EAEAkP,aACA79B,IAEA89B,kBACA99B,EAMA,CACA,iBACA,SACA,wBACA6P,iBACAmuB,GACAnuB,gCACAA,oCAEAA,yCACAmD,sBAEA,CACA,sBACA,eACAA,oBACAA,kDAEA,CAEA,eACA,kBACA,CACAirB,WACAC,WACAC,cAGA,CACAF,oDACAC,mBACAC,eAEA,CACA,aAA2Bz/B,uCAC3B,OACAA,UACAsW,QACA0N,qBACA7S,QAEA,CAyBA,mBACA,MACA,UAEA,MAASuuB,0BAA4CpR,EACrDjE,YACSmV,iCAA6BG,OAC7B3/B,+BA/BT,mBACA,MAAS0/B,0BAA4CpR,GAC5CiR,uBAAoBI,MAC7BtV,WACA,IACAlrB,MADOa,sBAAkB4/B,EAEzB,MAGA,IAFA5/B,KACAsW,KACAnX,SAA8BA,MAC9BogC,sBADwCpgC,EAIxCa,IACAsW,IAEAtW,KACAsW,IACA,CACA,aACAA,MAEA,CAAUtW,mCACV,CAQkC6/B,QAClCzsB,MACA,IAEA9D,SAFAwwB,MACAC,QAMA,kBAAoC5gC,QAAUA,GAC9CgW,YACAA,UAGA7F,YACAA,UAGAwwB,aACA,YAZAA,IAFAP,2BAeAQ,sBAEA,aAdAD,IAFA,2BAiBA1sB,YAAoCpT,2CACpC+/B,SAEAxX,MACAyX,QAEA,kBACA5sB,YAAkCpT,0CAElCoT,EACA,CACA,iBACA,WACA6sB,aACA,YAAkB9gC,WAAqBA,KACvC,4BACA+gC,UACA9sB,YAEA,CACA,QACA,CAiDA,iBACA,iBACA+sB,qBACA9V,WACA,MACA,SAEA,mBACSrqB,eAxDT,qBACA,QACAsW,MACA,SACA,sBACAtW,IAGA,qBACAA,IAMA,IAJAA,KACAgkB,IACA1N,MAEAA,kBACAA,IAEA,YACA,CAAUtW,cACV,CAoCqBogC,UACrB,OACAC,IADA,MACA,EAA2BrgC,uBArC3B,qBACA,iBACAoT,KACA,IAEAkD,EAFA4b,IACA3J,OAEA,UAAwBjS,OAAYA,GACpC,eACAgqB,eACA/X,SAEAnV,QAAqBpT,2BADrBgkB,OAEAhkB,oBAGAkyB,IACA3J,SACAvoB,MAGAuoB,GACA,CACA,iBACAnV,QAAiBpT,2BAEjBoT,CACA,CAeAmtB,KAFAjqB,YACAd,6BAH4CgpB,IAK5C,CACA,mBACA,0BAKA,mBACA,iBACAprB,KACA,iBACAjU,IACA,kBACA,QACAopB,SACA,UAAwBppB,SAAkBA,KAC1C,eACAgS,mBAAmD2D,4BACnD0rB,UACAptB,QAAqBpT,sCACrBygC,IACAzgC,OAEAuoB,IACAkY,GACA,CACAzgC,QACAoT,QAAmBpT,sCACnBA,MAEA,CACA,QACA,CA3BA0gC,QAFAT,CAGA,CA2BA,eACA,OACAxG,kCACAkH,gCACA3R,wBACAC,oCACA2R,kCACA1R,0BACA2R,0BAEA,CACA,iBACA,+CACA,CAEA,sBACAlgB,eACAmgB,iBACAxd,SACAyd,iBACAC,QACAC,OACA1rB,iBACAf,WACA7E,YACAuxB,YACAC,mBACAjvB,kBACAkvB,gBACA3xB,eACAqgB,YACA3S,QACAkkB,kBACA3yB,SACA4yB,WACArxB,SACAK,WACAixB,aACAC,YAnwJA,0BACA,OACA/mB,uBACA,8CAEA,EA+vJAgnB,oBACAC,eACA3G,WACAnqB,cACAC,aACA8wB,gBACAC,gBACAC,gBACAC,eACAC,eACAC,aACAC,kBACAlI,YACAE,cACAiI,kBACAC,kBACAnI,cACAoI,sBACAhsB,WACAisB,gBACAhsB,iBACAisB,kBACA1a,qBACAL,uBACAgb,gBACA1F,mBACA2F,kBACAvG,gBACAwG,eACAhE,uBACAiE,8BACAC,kBACArY,YACAtQ,uBACAqE,kBACAukB,eACAC,gCACAC,gBACAC,WApqLA,kBACA,sBACA,EAmqLA/kC,mBACAglC,YACAC,YACAC,qBACA7kC,iBACAC,SACA6kC,gBACAC,yBACAC,wBACAzV,gBACA0V,gBACAC,qBACAC,UACAC,iBACAC,aACAC,UACAC,WACAC,aACAC,MACAtxB,OACAC,SACAC,YACAC,eACAC,WACAC,cACAC,iBACAC,SACAC,QACA+wB,WACAC,cACAC,YACAC,gBACAC,eACAC,sBACA/K,aACAgL,aACAC,kBACAC,qBACAC,yBACAC,cACAC,mBACAC,iBACAC,eACAC,eACAC,iBACAC,yBACAC,wBACAC,iBACAC,kBACAC,sBAGA,SACA5mC,mBACAX,YACAA,aACAA,gBACAA,8BACA,CACAwnC,aACA,2EACA,CACAC,YACA,aACAC,2BACA,OA+DA,eACA,8BACA,EAhEAC,MACAC,iBAEA,gBACAC,OACAC,gBACA,MACA,8CAEA,gBAGArmC,OAyBA,mBACA,gCACAmmC,eACA1pB,UACA5c,aAEA4c,YACA5c,iBAOA,iBACAqR,2BACA,qBACAo1B,UACAC,0BACAC,kBACAC,UACAC,cACAjqB,mBAEA,CAhBAkqB,oBAEA9mC,eACA4c,4BAEA,CArCAmqB,QACAjnC,YACA8c,+BAEA4pB,CACA,CACAj0B,OACA,oBACA,CACAy0B,cACA,mBACAT,OACAC,aACAD,eACApmC,KAEAqmC,uBACA5pB,SACAle,sBACAkT,MAGA,EAsHA,WAvFA,SACAvS,cACAX,0CACAA,oCACAA,sCACAA,gCACAA,kEACA,CACAkC,UACAlC,wBACA,CACAsC,aACAtC,0BACA,CACAuoC,qBACAvoC,yCACA,CACAiqB,kBACAjqB,sCACA,CACAwoC,iBACAxoC,qCACA,CACAyoC,gBACAzoC,oCACA,CACA0oC,iBACA,iDACA,CACAC,cACA,2CACA,CACAC,aACA,yCACA,CACAC,YACA,uCACA,CACAC,wBACA9oC,2CACA,CACA+oC,qBACA/oC,wCACA,CACAgpC,oBACAhpC,uCACA,CACAipC,mBACAjpC,sCACA,CACAkpC,aACA,aACA,mBACA,oCACAC,uCACA/nC,eAEAme,SACA,oCACAne,gBACS,EAGT,CACAgoC,aACA,cACAlX,uBACAmX,QACAnX,qBACA,CACAoX,uBACA,YAAoB/nC,+BAAkCA,KACtD,iCACA,kBACA,QAEA,CACA,mBACA,CACAgoC,YACA,iBACA,cACA,sDAEA,QACA,GAIA,SACA5oC,cACAX,aACA,CACAwpC,gBACA,aACA,mBACApoC,mCACAA,gCAEA,wDACAoU,qBACA,sBACApU,sBACAA,kCAEAoU,CACA,CACA5U,iBACAV,QACA,kBACA,iBAGA,WAFAupC,KACA,gBACAA,iBACA,QAEA,CACA,QACA,CACAC,aACA/xB,kBACA3X,2BACAA,mBAEA,CACAq+B,gBACA,eACA,mBAEA,+CACA,mCACAlrB,CACA,CACAw2B,wBACA,oBACAp3B,sCACAq3B,EAWA,eACA,WACAl6B,gCACA,YAAkBnO,WAAiBA,IACnCqoC,2BAEA,sBACA,YAAkBroC,WAAkBA,KACpC,cACA,kBACAqoC,SAEA,CACA,QACA,CAzBAC,IACA,gBAkCA,qBACA,WACAlnB,iBACA,YAAkBphB,WAAoBA,KACtC,aAEAmW,OADA+xB,MACA/d,GACA,UAGAlW,QACAi0B,SACAl3B,4BAEA,CACA,QACA,CAlDAu3B,YACA,CACAC,uBACA,2BACA52B,cACA62B,4DACAhqC,8BACAA,8BACA,EAiBA,iBACA,kBAGA,MACA,GAEAuS,EALA,IAMA,CAkBA,qBACA,6BACAgY,yBACA,kCAAuDoU,uCACvD,CAEA,iBAGA,QADApsB,gBAAgD2E,QAChDgS,yBAFAhL,oBAEAgL,cACA,CAqBA,iBACA,uBACA2e,EAEAoC,QAZA,eACA,8BACA,IAEA,wBACA,SADA,CAGA,CAKAC,uCACA,CAiCA,eACA,kCACA33B,2BACAA,SAnCA,iBACA,qBAAmD43B,WACnDC,eACAC,eACAC,sBACAH,sBACA,kCACA,aACAxuB,UACA4uB,EA1BA,iBACA,gCACA,CAwBAC,MACAC,eACAH,aACAH,8BAAgDxuB,QAAK+uB,gBAErDrgB,4BACA,uBACAnB,uBAEAuhB,GADAv3B,WACAi3B,WACAx3B,2BACA,SA9CA,iBACA,QACA,oBACAgJ,IACI,gBACJA,mBAEAA,CACA,CAsCAgvB,MACA9C,6BACAsC,iCACAz3B,WAA4BiJ,SAAKyuB,cAC5B,GAELz3B,2BACA,aACAD,qCAEAy3B,CACA,CAIAS,KACA,CACA,eACA,gBACAC,wBACAp0B,sBACAA,CACA,CAOA,iBACAq0B,WACA,iBACA,gBACA,WACAp7B,MACAq7B,YACAD,WAEAp7B,CACA,CACA,mBACA,qBACA,OACAkE,UAGA,SACAjT,eACAX,aAzBA,eACA,gBACAyW,gBACAu0B,MACA3gB,CACA,CAoBA4gB,IACAjrC,yBACAA,2BACA,CACAkX,WACA,wBACA,CACAA,YACAlX,mBACA,CACAyW,WACA,wBACA,CACAA,YACAzW,uBACA,CACAuS,cACA,2BACA,CACAA,eACAvS,sBACA,CACA4pC,cACA,2BACA,CACAprB,SACA,qBACAxe,kBACAgrC,KACA,CACAE,aACAlrC,yBACAA,2BACA,CACAmrC,oBACA,YACA,MACA,YAAoBC,IACpB,KAEA,CACAC,+BACA,aAAyBD,gBAA0B5d,IACnD,KACA,CACA,YAAsB4d,iBAA2B5d,IACjD,eAAyBA,KAEzB,CACA,YAAsB4d,IACtB,KAGA,CACAE,6BACA,aAAyBF,KAAe9d,IACxC,MACA,YAAoB8d,cAAwB9d,IAC5C,YAAoB8d,IACpB,YAAoB9d,IACpB,KAEA,CACAie,mBACA,aAEA,aADAvrC,oBACwC6nC,IACxC,MACA,WAAmBA,OACnB4B,+BAEA,CACA+B,mBACA,yBACA,eACA,gBACAh1B,UACAi1B,YAEAj1B,CACA,CACAk1B,uBACA,MAAWn5B,kBAAevS,KAC1BwW,0BACAiS,WACA,KACA,SAEA,gBACAkjB,cACAC,IACArhB,SACA7a,yBAEAA,wBACAA,4BAAkEkD,IAClElD,yBACAA,2BAEA,eACA,kBACA8G,WAEAoC,CACA,CACAizB,oBACA,MAAWt5B,kBAAevS,KAC1B,OACAuS,EACAW,UACAgL,mBACA,CAAOhH,QACPgH,GACA/K,GAEA,CACA24B,kCACA,SAAoB3kB,aACT4kB,0BAAuBC,4BAClC,SAqCA,iBACA,MAASlN,8BAA2BT,MACpC,iBACA,mBACAU,eACA,SAGA,QACA,EA7CAkN,QACAz2B,aAGAjD,OAFAoQ,cACA3iB,6BAGA,iBACAwV,UAEA,QACA,CACA02B,6BACA,MAAWH,YAAUC,4BACrB,aACApH,iBACAmH,CACA,EAEA,mBACA,eACAv1B,IACAA,UACA21B,YAEA,iBACA,eACA,WAEA1jB,GACAsjB,SAFA9M,QAGAmN,6DAEA51B,YAEAiS,CACA,CAcA,qDACA,iBACA,0DACA,CACA,iBACA,qBACA,mBACA5Z,UACAA,SACA,CACA,CACA,eACA,gBACAw9B,sBACArrC,+BACAkxB,yBACA,CACA,eACA,gBACAma,sBACAna,yBACA,CACA,cACA,6CACA,CACA,eACA,gCACA5wB,6BACIA,cACJA,QAEAA,cACAA,YAEAA,CACA,CACA,YACAgrC,OACA,cACA,wDAEA,SACA3rC,iBACA,aACAX,wBACA,cACAusC,QACA,KACA,gBACA,yGAIA,+DACAvsC,yCACA,mDACAsZ,cACAU,cACAD,aACA/Z,aACAA,WACAA,cACAA,aACAA,cACAA,gBACAA,mCACAA,gBACAA,kBACAA,oBACAA,cACAA,oCACAA,sBACAA,gBACAA,uBACAA,mBACAA,iCACAA,wBACAA,eACAA,kBACAA,qBACAA,iBACAA,uBACAA,iBACAA,gCACAA,qBACAA,8DACAwsC,WACA7pB,MAIAgF,0BACAA,0BACAvmB,gBACAA,YACAA,YAPAyb,kFASA,CACA4vB,kBACA,MAAWl6B,SAAUk6B,qCAAiC1yB,iCAA+B/Z,KACrF,aAGA0sC,KACAC,EAEA3yB,WALAyyB,CAMA,CACAh2B,WACA,uBACA,CACAA,YACAzW,kBACA,CACAuS,cACA,oBACA,CACAA,eACAvS,qBACA,CACA4sC,cACA,aACA,qCACAxrC,qBACAA,WAEA4jC,iCAEA5jC,eACAA,6BACAA,CACA,CACAyrC,yBACA,kBACA,gBACMC,+DACN,OAEA,MACA,CACAC,QACA,gCACA/sC,IACA,CACAqC,OACA,oBACArC,IACA,CACAgiB,YACA2F,gBAGA3nB,wBAAgC+Z,kBAFhC/Z,iBAIA,CACAgtC,aACA,aACAz6B,YAGA06B,4BAFA7rC,SAEA2Y,IADAxH,sCAEA26B,uDACA9rC,gBACAA,kBACAA,6BACA4jC,aAGA5jC,0BAAgCkS,SAChC4e,uBACA9wB,YACAA,eACAA,WAGA,CACA+rC,sBAGA5tB,GAFAvf,aACAmqC,WACA,QACAiD,QAEA,CACAC,sBACA,aACA96B,YACA+6B,WACAnD,WACAoD,gCACAz6B,QACAA,GACK,IACL,SACAw6B,IACA7rC,WACAkR,uBACA,aACAgJ,UACA6xB,UACAhX,UACA,OACAjkB,UACAk7B,0CACAC,6CACA,KAIAnuB,SACA,kBACAsoB,OACAlsB,UACAgyB,2BACA,sDACA1D,wBAEAsD,QACA,WACA1F,sBACA/b,QAGAA,MADAud,eACA,EACAxB,KACA3wB,OACAR,UACA1V,UAEAmpC,WAEAre,cAEAvM,aACAquB,UACAzD,OAGA5qB,SACAsuB,4BACAA,gBAEA,CACAC,kBACA,aACA5yB,cACAmT,yBACA0f,WAEA,GADA7yB,+BACA6yB,KACA,YAA4BxsC,MAAaA,EACzCH,yBAEA8Z,eACA,CACA9Z,sDACA,CACA4sC,8BACA,cACWC,kBAA4BpD,aAAWzpC,EAClD8Z,0BACA9Z,UAEA8Z,kBACA,wCACA9Z,0BAGA,CACA8sC,2BACA,aACAC,KACAtD,kBACA,QAEA,IADAzpC,gCACAG,eAAwCA,IAAUA,KAClD,aACA,0BACA,8BAWA,GAVA0mB,qBACA7mB,yBACA6mB,uBAEAA,SACAA,yCACAA,mBACAA,UACAA,mBACAA,gCACAA,aACAA,4BACAA,8BACQ,CACR,6BACemmB,wCAAqClwB,eACpDvL,2BACA07B,iCACAD,yCAEAnmB,wBACAkmB,oBACA,CACA,CACA,2BACAA,CACA,CACAG,iBACA,aACA/uB,2BACAne,wCACKA,EACL,CACAqoB,QACAzpB,sBACAA,2BACA,CACAwe,UACA,aACA6L,WACAA,WACAjpB,kEACAme,gBACAsuB,oBAEA,mDACAzsC,wBACAA,wBACA,2CACAmtC,4BAMA,KALAt7B,+DACA7R,iBACAA,gBAEAA,yBACiE,IAAjEA,gCAA0CsS,uBAC1C,OAEA,qCACAtS,wCACA,QACA,qCAAoDG,IAAUA,KAC9D,MAAauZ,cAAY1Z,oBACzBqoB,wBACA3O,2BACA0zB,iCACA,CACAptC,gBACAA,mBACAqtC,GACAlvB,SACAzE,YAGA1Z,qBACAA,+BAAqCsS,SACrCtS,+BACAA,cACAA,iCAEAA,UACA,CACAstC,iBACA,aACA,IAA2D,IAA3DttC,gCAA0CutC,gBAC1C,OAEAd,gCACA,oBACAe,0BACAxtC,aACAme,eACAqvB,8BAGAh1B,aACAA,cAEAxY,iCACKA,GACLA,0BACAE,WAEAF,8BACA,CACAytC,mBACA,aACA77B,uBACA,IAAyE,IAAzE5R,wCAAkDsS,uBAGlD,sCAAoDnS,MAAUA,EAC9DH,wBAA8CymB,iBAAgBnU,GAE9DtS,uCAA6CsS,QAAK,CAClD,CACAo7B,oBACA,aACA7mB,sBACA/nB,GAAkB+nB,sCAClB,+CAGAA,wBACA/nB,gBACAkB,wCACA,CACA2tC,SACA,cAC2D,IAA3D3tC,gCAA0CutC,kBAG1ChnB,SACAvmB,2BACAumB,YAGAvmB,SACA4tC,IAA4BhuC,WAE5B,CACAQ,OACA,aACA,MACA,wBACA,MAAauY,kBAAe3Y,oBAC5BA,eACAA,wBACA,CAKA,GAJAA,UACAA,0BAGyD,IAAzDA,8BAAwCutC,gBACxC,OAEA,kBACA,QAAgBptC,wBAAuCA,EACvD0tC,uBAGA,IADA7tC,kBACWG,aAAmBA,EAC9B0tC,uBAEA7tC,4BACA,CACA8tC,0BAEA,QADAlvC,KACAmvC,gBACA35B,KACA,QACA,mBAAwCjU,MAAUA,GAClD,eACA6tC,eACA55B,SAEA,CACA,QACA,CACA65B,+BACA,sCACA,CACAC,gBACA,aACA,IAAiE,IAAjEluC,sCAAgDutC,gBAChD,OAEA,yCACA,qBAAsCptC,OAAQA,EAC9CH,qBAEAA,oCACA,CACAmuC,gBACA,aACA74B,QACA84B,UACAhjB,cACAtsB,GACA+nB,OACA/O,cACAy1B,gBAEA,6CAGAxS,MACAtkB,iCACAC,2CACAC,6BACAC,kDAEAiQ,oBACAoU,MACAn8B,gBACAkB,sCACA,CACAquC,mCACA,oBACA,2BACAC,cAEA,EACA,CACAC,kBACA,MACAxzB,EADAnc,KACAyW,iBACAyE,EAFAlb,KAEAiuC,UACA,2CACA,WACAhmB,GACA/Q,UACAT,QACA0F,aACArB,gBACA80B,YACAC,aACAC,aACAC,oBACA72B,QACA82B,WACApkB,WACAqkB,YAEA/0B,WAEA+M,CACA,CACA0E,aACA,sCAA8C3rB,yBAC9C,CACAkvC,yBACA,iDACA,CACAC,oBACA,8BACA,MACA,SAEA,+BACA,oDACA,CACAC,0BACApwC,uBACA4vC,SACA,CACAS,wBACArwC,8CACA,CACAswC,qBACA,6BACA,CACAC,8BACA,aACA78B,kBACAuU,sBACAnnB,4CACAM,4BACAN,YAAwBgmB,YACxB1lB,wCACA,CACA2lB,QACA/mB,mCACA,CACA4mB,QACA5mB,mCACA,CACAwwC,uBACA,aACAvoB,8BACAA,kBACAA,+BACA7mB,eAEA,CACAqvC,UACA,cACWn3B,gBAAalY,EACxB,QAGA,IAFAA,SACAumB,YACApmB,6BAAgDA,MAAUA,EAC1DH,yBAEAA,sBACAkY,IACAlY,iBACA+iC,QACA/iC,6BACAA,cACAA,YAEAA,kCACAorC,QACA,CACAkE,oBACA,kCACA,CACAC,aACA3wC,sBACAA,wBACAA,4BAEAA,gBAEA,CACA4wC,iBACA,aACA/uC,eACAgvC,aAKAnvB,kBACA/L,YACAA,YACAvU,kBACA,EACAme,uBATA,SACAsxB,0BACAhvC,QAOAivC,MACA,CACAC,uBACA,aACA3vC,yBACAA,2BAEA,+BACAyvC,aACAC,UACAD,0BACAhvC,QAEAmvC,UACAnvC,OACAgvC,oCACAhvC,OAGA6f,UACAtgB,UACAA,eAGA,MACA,aACA4vC,cACA5vC,cACAA,WACA0vC,cACAA,eAEAG,OACA7vC,cACA4vC,cACAF,eAEAD,uBACAK,IAEAD,GAEA,CACAE,eACA,aACA5xB,wBACAne,wCAEAA,gBACAme,kCACAne,wCAEAA,6BACA,CACAgwC,wBACA,yBACA,YAKA,IAJA,gBACAnpB,yCACAA,2CAEA1mB,eAAqCA,MAAUA,GAC/CD,OACA,0DACAwZ,GACAA,mDAEA,CACA,CACAu2B,oBACA,uBACA,CACAC,qBACA,aACAC,gBACAzrB,UAAwC+B,2BACxC,4BACA,MACA,gDAEA,OACAA,eACAzM,kBACAlC,QACA,IAEAuqB,UAEAriC,YACAA,0BAEA,CACAowC,qBACA,uCACA,CACAC,0BACA,aACAC,kBACA1H,qFACA2H,SACAC,aACAD,UACAvwC,gCAEAwwC,kBACAxwC,+BAEA,CACAywC,mBACA,aACA3xC,GAAkB4xC,gCAClBC,8DACA,2CACA,OAEA,4BACA,uBACA3wC,mCACA4c,eACA5c,WAEAA,CACA,CACA4wC,kBACA,cACWC,wBAAmC7wC,EAC9CswC,UAEA,SACA1zB,KACAk0B,OACA,4BACApsB,yCALAqsB,GAMAD,mCAEA9wC,kBACAijC,kCACAnS,yBACA,+DACAA,yBAGAlU,YACAA,QACA5c,YACAA,6BAEAA,eACA4c,CACA,EAEA,yDACA3J,MA0CA,cACA,kGACA,CA3CA1B,4BACAuL,UACA7J,cACA3C,UAEA86B,WACAn4B,cACA3C,UAEAwB,WACAmB,cACA3C,UAEA23B,UACAh1B,cACA3C,UAEA0gC,SACA/9B,cACA3C,MAvxBA,SAyxBA46B,UACAj4B,cACA3C,UAEA+1B,UACApzB,cACA3C,eACA23B,aACAgJ,OAGA/J,YACAj0B,cACA3C,eACA23B,gBACAgJ,SAQA,SACA1xC,eACAX,kBACA,CACAsyC,UACA,WACA,CACA9nB,WACA,WACA,CACA+nB,YACA,WACA,CACArwC,WACA,WACA,CACA8nC,YACA,WACA,CACAwI,eACA,WACA,CACAC,WACA,WACA,EAEAC,wBACA//B,6BACA,EACA,QACAggC,UAcA,eACA,QAZA,eACA,mBACA,yCACA,SACA,uBAAyCpxC,IAAUA,IACnDoX,kDAEAmT,oCACA,CACA,oBACA,CAEA8mB,IACA,IACArxC,QADA2B,YAEA,aACA,wBAGAi6B,QACAj6B,gCAEAynB,MAEA,mBAAoCppB,MAAUA,EAC9CsxC,2BACAC,IAGA,IADAnoB,SACAppB,qBAAyCA,MAAUA,EACnDsxC,uBACAC,IAEA,QACA,CA0DA,qBACA,aAtBA,qBACA,wBACAC,kBACA7vC,gBACAD,gBACA,QACA+vC,IACAjgB,0BACAkgB,IACAD,KAEA1xC,YACAA,WACA2xC,WACAD,SACA5wC,QACAsW,MACAxV,MACAD,MAEA,CAGAiwC,UAEA5xC,uBAEAA,CACA,CACA,qBACA,iBACA8qB,WACApB,gBACAC,QACAL,KACA,YACA,cAAwCrpB,MAAUA,EAClD4xC,OACA7xC,KACAA,6BACAspB,oBAEA,QACA,CACA,eACA,gDACA,CACA,oBACAG,4BACA,kBACA,CACAG,wBACA,kBACA,CACAE,yBACA,MAAWpQ,mBAAgBiN,GAChBoD,+BAAgCrrB,cAC3CozC,mBACAC,mBACAzoB,KACA,eACA,eAA0CrpB,OAAUA,EACpDuR,QACAxR,MACAA,+BACAspB,4BAEA,QACA,CACAa,+BACAwH,qCACA,kBACAqgB,iCACAr4B,4BACAA,4BAEA,CACAkR,oBACA,MACAlE,EADAjoB,KACAyqB,aACWzP,mBAAgBiN,EAC3B2C,EAHA5qB,KAGAsrB,aACAgoB,YACA5hC,QACA,2BACA,iCACA,OACA2a,uCACA3a,QAEA,CACAgX,aACA,aACAtnB,yBACA6xB,mBACA7xB,cACAmnB,0BACA,CACA/J,UACA,MACAyJ,EADAjoB,KACAyqB,YADAzqB,KAEA0uB,wCACA,CACAA,wBACA,aACAjF,cACA2C,uBACArT,mBACA6E,mBACA21B,gBACAC,mCACA1lB,wBACAJ,yBACAtsB,6BACA,aAAwBG,OAAmBA,MAC3C,yBACAkyC,sBAAqE16B,eAAkB3X,+BACvFsyC,oCACAnrB,oBAAyC6D,QACzC3F,IACA7I,aACA7E,aACA46B,gFACAjwC,sBACAwU,sBACA8B,wBACAD,wBAEA2T,KACAjH,iDAEArlB,8BACA,CACA,CACAwyC,gBACA,MAEA54B,EAFAhb,KACAyqB,YACAzP,OACAE,4BAHAlb,KAGA6zC,OACAC,oBACAxhC,WACA0V,KACA,QACA,QAAgBzmB,MAAUA,GAE1B,GADAD,cACAsrB,OACA,kCACAtrB,sCAEA,mBACA,QAEA,CAKA,KAJA,qCACA,0BACA0mB,gBAEA1mB,YACA,KAEA,CACA,iBACA0mB,eAEAA,CACA,CACA+rB,kBACA,uCACA,CACAC,sBACA,6BACA96B,aACA8O,cACA,EACA,aACAA,WACA9O,CACA,CACA+6B,YACA,aACAv8B,YACAuQ,gBACAjN,WACAk5B,KACA,QACA,wBAAyC3yC,MAAUA,EACnD2yC,qDAEA,uBAEA,OACAhxC,IAFAixC,SAGAD,SACA9xC,oBACAsW,gBACA07B,8BACAtoB,QACAuoB,kBACAC,+CAEA,CACAC,4BACA,cACWnoB,qBAAkBhrB,eAClB2X,uBAA+B3X,UAC1CwpB,iBACA0oB,YACAkB,QACA,IAGAC,MAHA/iC,YACAtP,IACA+tB,0BAEAA,QACA/tB,MACA+tB,KAEAqkB,IACA9iC,aACAye,sBACA,8BACA/tB,KAEAA,MAEA,sBACA,8BAEAqyC,GADAz0C,gCACAosB,wBAEArT,GAEAzF,cACA,wBACAA,aACA,QACAyF,UAEA07B,UAEA,cACA,gCACA,sCACAnhC,MACAyF,OACAzF,QACQA,OACRyF,OACAzF,OAEA,CACA,OACAA,QACAyF,QACA07B,QACAC,eAEA,CACAC,8BACA,aACA7oB,UACAvZ,YACAqiC,aACAC,4BACA,QACA,cACA,2CACA55B,0BA9RA,qBACA,iBACA43B,OACA,sBACAviB,2BACA,6BACA,WACA3F,kCAEA,WACA2F,SAEA,gCAEA,OACAwkB,MAFA/hB,kBAEAqhB,EACAE,sBACAlyC,QAEA,CA4QA2yC,UA/SA,qBACA,uBACA,QACA,cACAzhC,6BACAghC,oBAEAhhC,MACAghC,KAEA,CACAQ,UACAR,QACAlyC,sBAEA,CAiSA4yC,UACAC,2DACAP,8BACAphC,6BACA,MACAohC,+CACAphC,4BAEA,OACAyF,WACA07B,WACAC,SACAphC,OAEA,CACA9R,OACA,aACAR,UACAinB,gBACAmE,WACA8oB,SACA5iC,WACA,QAEA,IADA6pB,sBACW56B,MAAUA,EACrB,+BACA2zC,kBAGA7Y,SACA,EAEA8Y,YACAA,aACA/G,sBACAC,sBACA+G,sBACAC,iBACAhB,WACAxtB,YACAH,SACAxP,cACAuP,gDAIA0uB,cACAxgC,aACAjB,cAEAy2B,QACAmL,SACAp+B,gBACAsZ,UACAI,MACAJ,YAGA+kB,SACAr+B,cACAuZ,kBAKA,oBACA/H,aACA1oB,4BACAizB,kBACA,CACA7H,yBACA,MAAWD,mBAAgBlD,GAChBoD,+BAAgCrrB,cAC3C4qB,KACA,UACA,cAA0CrpB,MAAUA,EACpDD,OACAspB,QACAlnB,qBACAwU,qBACAs9B,uBAGA,QACA,CACAtpB,iBACA,MAAWzV,kBAAezW,iBAC1B,QACA,qBAAkCuB,OAAQA,EAC1C0B,yCAEA,aACA,CACAkpB,oBACA,MACAlE,EADAjoB,KACAyqB,aACWU,mBAAgBlD,EAC3B2C,EAHA5qB,KAGAsrB,aACA5nB,0BACAwU,0BACA3U,YACA,OACA8oB,cACA3a,qCAEA,CACA8M,UACA,MACAoiB,EADA5gC,KACAyqB,iBADAzqB,KAEA0uB,8BACA,CACAA,wBACA,aACAjF,eACWzO,mBAAgB5Z,cAC3BoyC,mCACA1lB,wBACAJ,wBACAxF,SACAC,UACA,aAAwB5mB,OAAmBA,MAC3C,eACAqpB,uBACAnE,MACAga,8DACAD,wDACA/Z,6BACAiH,IACAjH,6CACAgD,IACAhD,sBAGArlB,2BACA,CACAA,4BACA,CACA6rB,+BACA,0BACA,2CACAtU,YACAA,mBAA+BA,GAAWwO,cAE1C,iBACA,qBACAxO,YAEAA,6BACAA,CACA,EAEA88B,eACAA,aACArH,sBACAC,wBACAxnB,YACAH,SACAxP,cACAuP,+CAIAgvB,cACAtL,QACAzmC,GACAwT,eAEAgB,GACAhB,gBAGA0yB,SACA8L,SACAC,WACApkB,UACA,OAgCA,oBACA5wB,iBACAsyB,WACAjzB,4BACAA,wBACAA,wBACAA,oBACAA,mBACA,CACA6oB,cACA2B,WACA,+BACAvC,mBACA,QACA,cAA0C1mB,MAAUA,EACpD0mB,kBAEA,CACA2tB,eACA,mCACA,CACAC,oBACA,qCACA,CACAC,sBACA,SACA7yC,MACA,aACA,YAAoB1B,iCAAmCA,EACvD,gCACA,6CACAyV,mBACA++B,wBACA7yC,gBACAD,iBACA,CAEA,OACA+T,WACA++B,kBAEA,CACAv3B,UACA,aACAxd,WACWoc,aAAWpc,EACtBinB,gBACA+tB,SACA5lB,0CACA6lB,+CACAC,qCACAC,6BACWJ,4BAAyB30C,yBACzBg1C,2CA9EX,mBACA,QACAC,IACA18B,IACA28B,IACA,SACA,UACAC,MACAC,cACAC,cACAC,cACAC,cACAC,yDACAC,0DACAC,aACAC,cACAC,cACAC,iBACAb,YACAC,YACA18B,aACA28B,YACA,CACA,OAAUF,sCACV,CAsD6Cc,QAG7CC,sBAFA/5B,eACAA,gBACA,KACAg6B,2BAEAC,OADAtkB,kBACA3xB,kCACAA,gBACAA,gBACA6mB,2BACA7mB,oDACAA,6CACAA,gCACA,CACAk2C,oBACA,aACA5/B,YACAuQ,gBACA8tB,wBACA,2FACA,EAEA30C,2CACA,CACAstB,wBACA,aACAjF,cACAzoB,UACAoc,cAGAm6B,qBACAC,qBACAC,MAJAz2C,UACA2lB,UAGA8wB,aACAC,sBACAN,sBACA5D,oCACA1lB,0BACAJ,0BACA,IACAnsB,GADAo2C,oBAEA,SAAgBp2C,OAAWA,GAC3Bo2C,2BAEA,SAAoBp2C,SAAmBA,IACvC,gCACAq2C,SACAnxB,IACA/iB,cACAwU,cACAy/B,cACApB,eACAR,iBACAqB,eACAM,gBAEAhqB,KACAjH,kDAEAkxB,OACAv2C,2BACA,CACAA,8BACA,CACAy2C,iBACA,yBACAC,SACA,IACAv2C,EADAw2C,IAEA,QAAgBx2C,WAAqBA,KACrC,qBACA,uDACAw2C,eAEA,CACA,QACA,CACAC,0BACA,+BACA,sBACApjC,mBAEA,CACA,CACAuX,oBACA,MAEAnrB,EAFAhB,KAEAgB,MACAgqB,oBACAtZ,KAJA1R,KACAyqB,YAGAmB,6BACA,OACAS,eACA3a,QAEA,CACAumC,qBACA,aACA,QACA,gBACA,cACA,MACA,iCAAqD12C,MAAUA,EAC/D,0BACA0mB,sBACA+tB,SACAl7B,eACAA,OACAA,cAEA,KACA,CAGA,MACA,SAEA,mBAAoCvZ,MAAUA,EAC9CgR,iCACA,0BACAtP,sDAGA,QACA,CACAi1C,gBACA,QACA,uBAAwC32C,MAAUA,GAClD,0CACA0B,0CACA,CACA,QACA,CACAk1C,wBACA,QACA,YAAoB52C,MAAkBA,EACtCvB,iCACAo4C,2BAGA,QACA,CACAC,kBACA,2DACA,CACAC,gCACA,oEACA,EAEAC,iBACAA,aACAnK,sBACAC,sBACA1nB,WACA6xB,iBACAf,iBAEA5wB,YACAH,SACAxP,cACAuP,kHAGAyvB,aACAl/B,WACA++B,kBACA9+B,cACAiS,eAEAqvB,cACA9L,cACA7C,SACA6O,QACAztB,QACA0tB,kBACA,eACA,0CACAjiC,qBAEA,QADAzV,oBACA8Z,uBACA,OACA0W,OACAmnB,4BACAC,0BACA/nB,wBACA+e,+BACA12B,QACA,GAGA,EACA,GAEA2/B,eACAJ,sCACAA,gBACA,GAEA/C,SACAC,WACApkB,UACA,GAEAlF,SACA,cACA,8BACA,cACAysB,YACAA,SAEAA,KAEAA,CACA,MAMA,oBACApwB,aACA1oB,4BACAizB,kBACA,CACAzU,UACA,aACAyJ,iBACW9L,gCAA4C8L,EACvD8wB,8BACA,IAAS32C,iBAyFT,mBACA,iBACA,QACAqqB,IACA,cACA,MAAWzR,oBAAiBiN,EAC5BtM,UACWzY,uCAAkC8X,kBAC7CuY,IACAnxB,cACAqiC,kBACAsU,sCACA,QAGAtsB,EADA+G,EACAwT,YACAvC,oBACAsU,wCACA32C,OAEA42C,GAEA,CACA,OAAU52C,gBACV,CAjHuB62C,QACvB73C,eACAA,eAgHA,eACA,MAAS+pB,kCAA8BlD,EACvCixB,GACAC,WACAC,WACAC,WACAC,YAEA,MACA,yBACA,EAEA,wBACAC,gBACAA,gBACAA,eACA,0BACAv7B,CACA,CAjIAw7B,MACAp3C,IACAqqB,YAEA7U,4BACAA,WACA,0CACAxW,qBACAmR,iBAEAA,4BACAnR,0BACAq4C,YACAlnC,WACKmB,GACLtS,yBACA,CACAstB,wBACA,aACAjF,eACWzO,8BAA0B5Z,cACrCoyC,mCACA1lB,wBACAJ,wBACAxF,UACAC,UACAoa,sBACAmX,sCACAC,8CACA,6BACA,aAAwBp4C,SAAmBA,IAC3C,eACAqpB,mBACAnE,YACAmzB,cACAnZ,wCACAD,sFACA/Z,iCACAA,+BACAA,aACAiH,IACAjH,iDAEAkzB,IACAv4C,4BAEAy4C,KACA,CACAz4C,4BACA,CACA8qB,iBACA,aACAjE,gBACA9L,YACA29B,sCACArjC,aACA,aACA,SAEA,kDACAsjC,8DACA,wBACA,CACAv4C,OACA,yBACAymB,kEACAgL,YACA,EAEA+mB,aACAA,aACA5L,0BACAC,wBACA4L,YACA1X,aAEAyX,cACA7P,QACAmL,SACAp+B,iBAEAq+B,SACAr+B,iBAiDA,oBACAvW,iBACAsyB,WACAjzB,wBACAA,uBACA,CACAmsB,oBACA,MAEAnrB,EAFAhB,KAEAgB,MACAgqB,oBACAtZ,KAJA1R,KACAyqB,YAGAmB,+BACA,OACAS,eACA3a,QAEA,CACA8M,UACA,8BACAxe,qBACAA,mCACA,CACAk6C,gBACA,aACAl5C,UACAoc,cACA1F,YACA6e,0CACA6gB,kBAEAC,KADAtkB,2DACA/xB,2BACAI,0BACAA,6BACA,CACAstB,wBACA,aACAjF,cACAzoB,UACAmb,iBAEAg+B,EADAn5C,UACA2lB,UACAmF,uBACAyrB,YACAC,aACA4C,4BACA,IACA74C,GADAuU,MAEA,sCACA,SAAgBvU,OAAWA,GAC3BuU,6BAEA,SAAoBvU,OAAmBA,MACvC,eACA,UACAg1C,+BACAa,yEACAthC,MACA2T,IACA0wB,iBACA/C,MAEA+C,kBACAxC,WAGA,UACAj0C,IACAwU,KACAw/B,cACAN,eACAO,cACApB,YACAhkC,2CAEAnR,2BACA,CACA,CACAi5C,uBACA,0BAEA,QACA,OAFAr6C,iBAEAyW,sBACAhB,mDACAgX,MAGAA,CACA,CACA6tB,qBACA,uCACA7e,iDACA,CACA,EAEA8e,kBACAA,aACAlM,sBACA1nB,WACA6xB,iBACAf,iBAEA5wB,YACAH,SACAxP,cACAuP,2EAGAyC,cACAyuB,cAEA4C,cACA9N,cACA7C,SACA6O,QACAztB,QACA0tB,kBACA,eACA,0CACAjiC,qBAEA,QADAzV,oBACA8Z,uBACA,OACA0W,OACAmnB,4BACAC,0BACA/nB,wBACA+e,+BACA12B,QACA,GAGA,EACA,GAEA2/B,eACAJ,sCACAA,gBACA,GAEA/C,SACAC,WACApkB,UACA,GAEAlF,SACA1J,0DAKAwnB,QACA5mC,GACA2T,oBACAsjC,YACA/3B,YAEAgO,eACAG,MACA6pB,aAEAC,aACAj4B,YAEAk1B,gBAKA,qBAEAgD,YACAA,aACAzE,SACAl/B,WACA++B,kBACA9+B,eAGA,oBACAkV,oBACA,MACAC,EADApsB,KACAyqB,mBACAG,EAFA5qB,KAEAsrB,aACA,OACAe,uBACA3a,uCAEA,CACA8M,UACA,aACAyJ,gBACArQ,YACAgpB,aACA5V,uBAEA,GADApT,WACA,cACA,0CACAxW,qBACAmR,iBAOAnR,yBALA,CACAw5C,SACAC,8BACAtoC,WAEAmB,EACA,CACAtS,gCACA,CACAstB,wBACA,aACAvS,iBACA2P,uBACArC,cACA,YAAwBloB,MAAmBA,KAC3C,aACAgR,mCACAuoC,0CACAp3C,mBACAwU,mBACAuO,IACA/iB,KACAwU,KACApC,cACA4e,0BACAniB,WAEAnR,yBACA,CACA,EAEA25C,cACAA,aACA3M,0BACAC,wBACAnlB,cACA+wB,YACA/9B,UACAtE,MACAojC,gBAIAD,cACAtO,cACAtC,QACA5mC,GACA2T,uBAKA,qBAEA+jC,gBACAA,aACAhB,YACAe,SAEAC,cACAtmC,aACAjB,cAEAk2B,SACA8L,SACAC,WACApkB,UACA,GAEAlF,SACA,yCAKA8d,QACAzmC,GACAwT,eAEAgB,GACAhB,iBAKA,sBACA6L,eACAoyB,iBACAM,oBACA8C,sBACAyB,kBACAO,uBACAI,iBACAI,mBACAE,uBAGA,mBACA,MAAStD,gEAAyDv8B,EAClE,UACA1E,cACAA,qBACAghC,KACAwD,MACAxkC,yBAEAA,uBAEAA,cACAA,QACA,CAmBA,oBACA,OACAhT,kBACAwU,kBAEA,CACA,oBACA,MAASxU,kDAA2D0X,EACpEg8B,gCACAM,cACA3mC,MAEAoqC,MADApoB,2BACA,EACA4kB,QACApB,SACS6E,qDA9BT,qBACA,QAJA,eACA,8DACA,CAEAC,yBACAC,UACAC,oBACAC,MACA,8BACA,8BAEA,OACAJ,2BACAK,uBACAC,gCACAC,4BAEA,CAgBqDC,cACrDC,QACAC,QACAC,YACAC,YACAC,QACAC,QACAC,YACAC,YAGA,GAFA1lC,cACAA,mBACA+kC,MACA,sBACA/kC,4BACA,CACA,sBAEA,GADAA,oBACAilC,MACA,sBACAjlC,oCACA,CAEA,GADAA,gCACAglC,MACA,sBACAhlC,oCACA,CACA,sBAEA,GADAA,oBACA0kC,MACA,sBACA1kC,4BACA,CACAA,aACA,CA6DA,mBACA/V,eACAsyB,QACAjzB,oBACAA,0BACAA,uBACAA,qBACAA,wBACAA,wBACAA,mBACAA,mBACA0nB,GACA/U,qBAEA,CACA0pC,eACA,oCACWvmC,oBAAiB6wB,MAA4BjjC,WAC7Ci0C,qEAA+D33C,eAC1E,aACA,WACA,cACA,cACA,iBACAqc,GAGA,OAFA05B,mBACAhgC,UAEA,CACAumC,kBACA,MAAW54C,6DAAsD1D,eACjE,IACA,IACA,aACA,WACA,cACA,cACA,iBACAqc,GACAkgC,UACAC,UACA,OACA94C,kBACAwU,kBAEA,CACAiX,mBACA,6BACA,CACA3tB,QACA,cACW+Q,2BAAwBnR,EACnCovB,kBAGA,GAFApvB,4CACAA,sCACA,wCACA,OAEAsV,SACA,QACA,MACA+lC,MACA,oCACA/lC,yCACAtV,sBACAq7C,IAEA,CACA/lC,8BACAA,4BACA,QAlIA,kBACA,MAASgmC,4CAAwCthC,EACjD,iBACA,MACAuhC,cACA,YAAoBp7C,MAAiBA,EACrCmV,SAEAjB,WACA8gC,SACAR,UACAQ,OAGA,CACA,kBACA7/B,SACA6/B,CACA,CAgHAqG,SA5FA,oBACA,MAASrqC,WAAS6I,EAClByhC,2BACAtqC,gBAGAsqC,GACAnmC,4BACAA,qBAEAA,0BACAA,oBAEA0E,eAhCA,kBACA,MAAS1X,kDAA4C0X,EACrDg8B,8BACAM,kBACA,MAMA,IALAmF,GACAC,aAEApmC,cACAA,uBACAnV,IAAcA,MAAiBA,EAC/BmV,WAIA,IAFAA,cACAA,oBACAnV,IAAcA,MAAiBA,EAC/BmV,UAEA,CAeAqmC,QAEAF,GACAC,UAEAH,WACAjmC,WACA,EAwEAoa,UACApa,WACA,EAeA,oBACAA,gDACAA,6CACAA,2DACAA,mDACAA,4CACAA,6CACA,CACA,mBACAA,iBACA,CAUA,sBACA,kBACStU,qBAAoDqd,GACpDrd,eAAsC4/B,EAC/C5/B,gBACAsW,gBAEA,OACA+T,QACArqB,QACAgkB,YACA9T,YALA0qC,oBAKAvwB,UAEA,CACA,qBACA,MAASmU,oBAAiBhpB,GACjB6U,+BAA0BwwB,UACnCC,EA1BA,eACA,iBACA5Y,GAEA/xB,iDACAgyB,GAEA4Y,EACA,CAkBAC,IACA,IACA77C,UADOitB,qBAAsB/O,MAE7B,SAAcle,QAAWA,GACzBgW,yBACAA,UAEMiX,GACN9X,oBACA8X,MAEA0uB,uBAEAvyB,OAEA,WACApT,oBACA2lC,0BAEA92B,CACA,CACA,qBACA,kBACSqG,wBAAoBwwB,WACpBzuB,qBAAsB/O,MAC/B,IAEAle,iBAFA87C,IACAC,IAEA,+BACAC,QACAtG,UACAvgC,eACAA,eACAA,iBAOA,IAJA8X,IACAjX,YACAb,qBAEAnV,IAAcA,OAAWA,GAEzB,GADAgW,YACAA,QACA,SAEA,cACAW,QACAslC,QACAA,SACAtlC,MACA++B,MACQ/+B,QACR6+B,OAEAsG,iBAEAE,KACA7mC,gBACA+mC,MACAH,IACArG,UAEAyG,KACA,CACAH,IACA,CACA,eACA,kBAGA,OADA3lC,oFADAF,kCAEAimC,KACA,CAzHAC,WACAA,YACAC,qBACA5a,mBACA6a,eACAxsB,cACAd,SACA1a,cAEA8nC,iBACA/hB,mCAgJA,mCAQA,oBACAl7B,eACAsyB,QACAjzB,iBACAA,oBACAA,kBACAA,sBACAA,kBACAA,oBACAA,sBACAA,mBACAA,uBACA0nB,GACA/U,qBAEA,CACAorC,yBACA,aACAxrC,aACAA,gFAEAuyB,iBADAvyB,+BACA2W,GACA9nB,oBAEA,CACAw/B,cACA,aACAx/B,mBACAA,mBACAA,QACAA,mBACA,CACAw/B,aACA,mBACA,CACAyB,eACA,qEACA,CACAhO,QACA,sBAEA,iBADAr0B,YACAqiC,WACA,CACA/N,OACA,sBAEA7H,WACA,UAFAzsB,YAEAqiC,WACA,CACA2b,iBACA,aACAzrC,YACAb,OACAkvB,WACAyB,QAAyCP,2BACzC,aACA,OAEA,WACAmc,EAnGA,eACA,iBACAzY,GAEAjzB,iDACAkzB,GAEAF,EACA,CA2FA2Y,IACA,QACA,mBAAwC38C,MAAUA,GAClD,MAAaa,gBAAYigC,KACzBrzB,QACAC,SACA,YACAuG,WACA,QACA,CACA,MACA2oC,WADAprB,kCACAxgB,WACA4rC,WACA3oC,UACA,CACA,0BACA,CACAmoC,mBAEA,OADAS,SACA1nC,WACA,CACA2nC,YACA,aACAhc,aACAic,QACA,cACAl8C,OACAqqB,uBACA,iBACArG,YAA+ChkB,oBAE/C,SACA,CACAZ,cACA,eAEAJ,cACA+uB,UAFA/uB,eAEAkwB,cAGA5a,SA1GA,qBACA6nC,0BAzBA,qBACA,cACAF,IACAA,qBACAzmC,eACAymC,eAGAG,eACA9nC,WACA,CAgBA+nC,UAfA,qBACA,MAASpc,sBAAmBzqB,EAC5B0mC,QACA,iBACAE,eACA9nC,cACA4nC,SAA2Cl8C,qBAC3CsU,cAEAA,UAEA,CAMAgoC,SAEA,CAqGAl9C,UACAkV,YACAtV,aACAA,oBACAA,gBAEA,EAyBA,qBACA,mBACAgT,CAASuH,MAAegjC,kBACxB,yCACA,CA3BAC,aACAA,aACA7b,sBACA3R,cACAC,mBACA2R,wBACA1R,cACA4P,mBACA2d,iCACA7D,QACAzY,YACAuc,WACAC,WAEAH,kBACA/iB,kCACAoH,2BAEA2b,gBACArqC,eACAC,4CAQA,oBACA7T,eACAsyB,QACAjzB,oBACAA,mBACAA,iBACAA,iBACA0nB,GACA/U,qBAEA,CACA0pC,eACA,sBACW34C,SAAM1D,2BACjB,uEACA,CACAg/C,cACA,uBACA,CACAC,cACA,uBACA,CACA3C,kBACA,MAAW54C,SAAM1D,2BACjB,OAAY0D,QACZ,CACA4P,QAEA,OADAf,uBACA0E,UAGA,OAFAA,kCAEA,MADAA,qBAEA,CACAzV,QACA,aACA+Q,YACAnR,sBAGAsV,4BACAA,0BACAA,8BACA0tB,gBACA,CACA8a,WACA,yBACA,2BACA,EAiBA,iBACA,MAASx7C,iCAA2By7C,gDACpC,cACA,qBACAC,MACAvnC,gBACAC,gBACAC,MACAC,QAEAonC,MACAvnC,MACAC,MACAC,gBACAC,iBAEA,CAAUH,8BACV,CACA,eACA,8BACA,WACA,WAGAwnC,eACAC,gCACAA,gCACArmC,SACAA,CACA,CACA,qBACA,UACAomC,EAOA,mBACA,wBACA,CATAE,QACAF,aAEAA,YAEAA,CACA,CAIA,mBACA,iCACA,CACA,qBACA,oCACA,CAsDA,qBACA,iBACAG,WAEA9uB,OADA+uB,OACAC,QACA,WACAD,4BACAD,yBACA,CAIA,iBACA9oC,uBACA,CAlIAipC,cACAA,aACAruB,cACAsuB,YACAC,mBACAC,cACAC,oBACA9oC,SACAD,YAEA2oC,kBACA9jB,kCACAoH,2BAuHA,oBACAtiC,eACAsyB,QACAjzB,oBACAA,uBACAA,iBACAA,kBACAA,mBACA0nB,GACA/U,qBAEA,CACAnR,QACA,sBACWq7C,iBAzDX,eACA,cACA9iC,iBACAC,iBACA8/B,EA7BA,mBACA,8BACAplB,QACAsrB,QACA,OACA5rC,sBACA7Q,0BACAT,4BACAK,wBAEA,CAmBA88C,YACAhpC,EAnBA,mBACA,MAAS08B,sBAAoBwL,mCAC7BztC,yBACAsuC,QACAE,gBACAxrB,QACAyrB,WACA,OACAC,4CACAC,+CACAC,qDACAC,wDAEA,CAMAC,YACA,OACAC,OACA/8C,SACAwU,QACArV,IACAS,IACA2T,UAEA4lC,OACAn5C,aACAwU,YACArV,YACAS,YACA2T,QACAmpC,gDACAC,kDACAC,sDACAC,0DAIA,CA8ByBG,OACzBC,EArBA,eACA,yDACA,CAmBAC,iBACAlqC,UACA+pC,wBACA/pC,cACAiqC,OACAjqC,SACAiqC,OACAjqC,0BACAA,mBAEAA,cACAiqC,OACAjqC,8BACAA,SACAA,WACA,CACA2lC,eACA,qBACA,CACA2C,cACA,wBACA,CACAC,cACA,wBACA,CACA3C,kBACA,MAAW54C,6BAAwB1D,+CACnC,OACA0D,cACAwU,cAEA,CACAgnC,YACA,wCACA,EAEA2B,YACAA,aACAC,sBACAxvB,cACAwsB,eACAnK,sBACAoM,mBAEAc,kBACAhlB,kCACAoH,2BAGA,sBACAlgB,eACA66B,aACAgB,eACAe,gBACAkB,gBAsGA,eACA,iBACA,uBACA1kC,oBACAA,QACAxJ,gCAA4CjB,SAC5C,CACA,CACA,eACA1Q,4BACA+/C,OAEA,CAiBA,QACAlZ,gBACA3pB,UACA8iC,oBACAC,YAEAC,+BACA,cAEA,YADAC,MAGA,gBACAngD,gCACA,MAAa6oB,qBAAkB1N,EAC/B8L,sBACAxR,YAIA,GAHA,mCAGA,gBACA,OAEA,4BAIA,GAHA,oCAGAzV,kBACA,OAEA,IAmBAogD,IAnBWh/C,iBA7CX,iBACA,iBACA,IACAqqB,EADArqB,IAEA,MAAS4Y,UAAQiN,GACR/kB,uCAAkC8X,kBAC3C,WACA5Y,+BAGAqqB,EADA+G,EACAwT,8BAEAgS,IAEA,CAAU52C,gBACV,CA8ByBi/C,MACzB,UACAN,UADA,CAmBA,OAfAppC,QACAwE,iBACAA,OACAxJ,gCACAkG,gBACAxE,cACAR,eACA,sBACA,EACAD,iBACA5T,aACA,KAIAuS,iBACA,OACA6uC,GAnLA,uBACA,qBACA,QACA,sBAEA,WACAE,cACA,QACA,cACA,IACA//C,aADAsN,IAGA,IADAuyC,YACA7/C,IAAcA,MAAiBA,KAC/B,IAEAsO,GAFAwtC,KACAkE,KAEA,iCACAC,uCACAC,SACA,UAA4B5xC,MAAiBA,KAC7CwtC,YACAkE,YAEAlE,OACAkE,OACA,6BACAG,4BACWh+C,WAAwB+S,KAEnC,IADAkrC,SACA9xC,MAAwBA,MAAaA,KACrC2c,gBACAo1B,qBACAA,qBAEAp1B,QACAm1B,MACAE,QACAC,OAGAV,SACAvyC,IACA,CACA,mBACAuyC,CACA,CAsIAW,YACA,UACA,UACAX,GAxIA,qBACA,IAEA7/C,uBAFA87C,IACAC,IAEA,YAEA0E,UAEAC,GADAxrC,EAFArU,OAEAsB,EACAs+C,GACA,QAAkBzgD,QAAmBA,GACrCgW,OACA7T,gBACAwU,MACA,aACA,UACAA,MACA++B,KACAiL,KACQhqC,OACR6+B,KACAoL,KAEA9E,oBACM,CACN,aACA,mBACA,uBACA+E,iBACAC,kBACAjB,YACA3qC,MACA/S,MAGA0+C,kBACAhB,YACA3qC,MACA/S,KAGA,CACAnC,cACA6/C,eAEAA,WACA3D,KACAH,IACArG,QACAiL,QACA,CACA,CACA,SACA,CAoFAI,UACA,cAEA,qDAA6D/vC,gBAE7D4J,eA1BA,CA0BAilC,EACK,EAEL3Q,WACA0Q,KACA,GAuBA,mBACA,QAhBA,eACA,kBACAoB,SACA,wBAIA,YAHA,QACAvH,wBAEA,mBAGA,MACA,SAEAA,EACA,CAEAwH,IACA,SACA,yBAEA,oBACA,kCACA,0BACArwC,SAEAA,mBAGAA,GAEA,iDACA,CAuBA,SACAxR,eACAX,WACAA,WACAA,oBACA,CACA29C,mBACA,MAAWj6C,kBAAc1D,KACzB,OACA0W,aADAga,MAAwBtuB,iBACxBsW,iBACAhB,QACA,CACAsmC,eACA,MAAWt6C,kBAAc1D,KACzB8V,UACA,OACApS,kBACAwU,kBACApC,QAEA,EAuEA,uCAeA,mBACA,WACA,YAAkBjG,WAAuBA,KACzC,cACWwkB,wBAAoBouB,YAC/B,eAGA,KACAC,qBAEA9hB,WACAtM,EACA,KAGA,CACAsM,YACA,CACA,mBACA,2BACA,MACA,SAEA,aACAyB,aACAsgB,WACA,SACAruB,KACA,YAAkB/yB,WAAqBA,KACvC,aACAqhD,gBACAC,cACA,eACAxuB,QACAC,QACA,KACA,CACA,CACA,OAAUD,uBACV,CAeA,iBACA,SACAumB,KACA,cACAA,KACAha,KAEAA,EA7GA,iBACA,MAASl9B,mBAAoBo/C,MAC7BH,WACA/hB,KACA,8BACA,mBACAtM,WACA,UACAsM,QAAmBl9B,YACnBk9B,QAAmBl9B,aACb,WACNk9B,QAAmBl9B,YACnBk9B,QAAmBl9B,YAAa,GAGhCk9B,CACA,CA6FAmiB,MAEAniB,iBACAA,SACAruB,SAAcwsC,WACdnE,QACAC,cACG,IACH,CACA,mBAEA,MADAmI,KACAhI,KACA,YACA,MACA,MACA,SAEA,iCACA,UACA,SAGA,GADA7oC,QACAA,EACA,SAEA,aACA,SAEA8wC,UACAjI,QACA,CACA,QACA,CACA,mBACAtkC,cACAvE,UACAuE,uBACAA,wBACAA,cACAA,QACA,CACA,qBACA,KACA,OAEA,WACAgC,OACA,oBACAtW,QACAsW,SAEA,CAAUopB,yBACV,CACA,qBACA,YACAzhC,aAEAwO,eACA,CAqCA,mBACA,MAASkJ,gBAAa+T,mBACbgW,0BAAsBpR,MAC/B,UACAha,cACAA,oBACAA,SAEA,CACA,qBACA,2BACAwsC,GACAxsC,iBAEA,CACA,iBACA,MAASkB,4CAAsC8P,EAC/C2a,EArDA,mBACA,mBACAzB,WACAuiB,WACAlb,KACA,kBACA,yCACA,gBACAA,QACAx1B,SACAN,SACA/P,iBACAsW,eAEA,QACA,CACA,gBACA,kBACA,yCACA0qC,YACA,kBACAnb,QACAx1B,UACAN,SACA/P,OACAgS,8BAEAsE,KACAtE,6BAIA,CACA,CACA,QACA,CAkBAivC,QACA,UAAc5wC,mCAAsC4vB,GACpD,MAAW9uB,OAAQsoB,qBAAyB,IAAMynB,EAClD5sC,SACAA,cACA6sC,kBACA7sC,cACA,8BACA8sC,GACA9sC,cAEA+sC,YAEA,8BAAuDj1B,qBACvDpI,UACAA,IACAq9B,YAEA/sC,cACAA,+BACAA,WACA,CACA,CAeA,mBACA,QA3KA,eACA,MAAS1V,uBAAmByR,EAC5B,SACA,OAjNA,iBACA,4BAEA,OADAwV,yBACAA,cACA,CA6MAy7B,MAEA,eACA,OA7EA,eACA,MAAS1iD,gCAA2ByR,EACpCmuB,KACAyB,aACAshB,WACAC,EAWA,iBACA,WACA9mB,mCACA,YAAkBv7B,WAAkBA,KACpC,aACA,eACA,MAEAsiD,OACAC,oBAEA,CACA,QACA,CAxBAC,MACAH,WAAsClgD,mBAAyBkU,IAC/D,YAAkBrW,WAAqBA,KACvC,aACA,kBAAgCsO,SAAkBA,IAClDm0C,YAEA,CACA,eAA0BpjB,qBAC1B,CA+DAqjB,IAEA,QAvGA,eAEA,OADAxxC,aACAyxC,yBAhCA,eACA,MAASp4B,gBAAarZ,EACtBF,YACA4d,uBACAhe,KACA/P,wBAEA,UAUA,GARAsP,EADA,YACAtP,EACI,UAJJmQ,sBAMIR,MACJipC,QAEAlvB,iBAEAvZ,gBACA,yCACA,QACA7O,MACAwU,MACAjB,4CAGA,QAAc1V,MAAYA,EAC1B4Q,wCAEA,QACA,CAIAgyC,IA7EA,eACA,MAASr4B,WAAUkvB,QAAQvoC,EAC3B,IACAmL,EADAzL,OAWA,MATA,YACAA,WACI,UACJA,QACIJ,MACJI,8BACI2Z,iBACJ3Z,oBAEA4V,OACAnK,mBACA,CACAla,WACAwU,aAGA,IACA,CA0DAksC,GACA,CAiGAC,IACA,uBACAvB,EAEAwB,OACA,CA8JAC,KACS3sC,uBAAmBnF,EAC5B+xC,YACAjC,SACA78B,qBACS++B,qBAA8BlC,MACvCpwC,qBACAgqB,QAtBA,iBACA,MAASvkB,gDAAyC8P,EAClDoa,yBACAprB,SACA,iBACAguC,cACAC,MAAgB/sC,6CAChBlB,YACAA,SACAguC,kBAEAC,MAAc/sC,6CACdlB,WACA,CAUAkuC,IAAiBhtC,wDACjBykB,MAEA,CACA,QACAwL,YACAgd,2BACA,qCACA7B,KACA,YACA,QAAgBzhD,MAAWA,EAC3B0mB,sBACArQ,YACAnF,OACAmF,gCACAnF,GACAqU,8BACA5N,QACA8hC,eACAh6C,QACA2a,oCACAmQ,eACAlU,SAGAqQ,YACA+6B,UAEA,QAAgBzhD,MAAWA,EAC3BkR,OACAA,iBAGAA,2BAEA,EACAqyC,kBACA,kCACA5pC,mCACAsR,cACA,qBAAsCjrB,OAAQA,GAC9C,sBACAkR,IAGAA,qCACAjR,GACAujD,cAEA,CACA,EACAC,0BACA,qCACA,OAEA,yCACA,qBAAsCzjD,OAAQA,GAC9C,qBACAkR,GACAsyC,uBAEA,CACA,EACAE,yBACA,wBACAxyC,kDAGAsyC,uBACA,EACA7mC,UACAgnC,aACAC,+BAIA,iBACA,IAAOC,4BAA2CC,EAClD,yBACAD,gBACAE,iBAEA,CACAA,WACAF,YACAG,yBACA,EAGA,oBACA5kD,eACAsyB,QACAjzB,eACAA,uBACAA,uBACAA,qBACAA,mBACAA,uBACAA,eACAA,wBACAA,wBACAA,uBACAA,sBACAA,qBACAA,gBACAA,mBACAA,iBACAA,kBACAA,mBACAA,kBACAA,qBACAA,qBACAA,mBACAA,oBACA,CACAwe,cACA,aACApd,aACAA,cACAA,aACAA,kBACAA,gBACAA,OACA,CACA6zB,gBACA,aACA7zB,kBACAA,mBACAA,SACAA,kBAEAA,qBACAA,QACAA,kBAEA,CACAokD,cACA,aACAH,uBACA,2CACAA,WACAI,yCAEAJ,SACAI,2CAEArkD,mBACAqkD,YAEArkD,eACA,CACAk1B,MACA,cACW/jB,iBAAcnR,EACzB,cAEA,YADAA,oBAGA,iBACAskD,aACAxoB,SACAyoB,2BACWL,yBAAsBM,QACjC,QACAlvC,gBACAtV,kBACA2Y,aACAC,2BAEAA,cACAD,0BAEA3Y,2CACAA,6CACA,CACAykD,kBACA,cACWnvC,0BAAyBsU,QAAS7M,aAAW/c,EACxD0kD,sBACAC,mBACAvyC,MACA,QACAkD,mBACAA,wBACA,UACAqB,MACA,uCACA,6CACA,kCACAiuC,KACAD,yBACAhuC,MACAkuC,MAEAH,OAAqBjuC,wCACrBkuC,sBAEAC,CACA,CACAE,kBACA,cACWxvC,2BAA0BsU,QAAS7M,aAAW/c,EACzD0kD,sBACAK,mBACAC,MACA,QACAC,KACAC,KACAzuC,KACAE,KACAwuC,KACA,uCACA,4CACAhlD,mBACAilD,QACAL,QAA0BpsC,qBAC1BlC,SACA0uC,KACAxuC,KACAsuC,SAEAA,mBACAC,QACAR,OAAqBjuC,yCACrBE,UAEAyuC,MACAL,QAAsBpsC,qBACtBysC,CACA,CACAC,iBACA,aACA,sBACA,OAEA,iCACWC,0BAAoCr0B,gBAAgBlU,aAAW/c,EAC1E,wBACA,QACAyW,wCACA,iBACAouC,YACAA,QACApuC,yCAEA8uC,iBACAA,SACA9uC,YAEA,KAAM,CACN,QACAE,kDACA,iBACA4uC,YACAJ,QACAxuC,mDAEA4uC,QACAA,iBACA5uC,aAEA,CACA,CACAye,eACA,qEACA,CACAh1B,OACA,aACA,sBACA,cACA26B,QACA/6B,UACAi7B,KACA,CACA,CACAuqB,QACA,cACWr0C,4CAA6CnR,GAC7CixB,kBAA0B3a,EACrCmvC,WACAC,2BACApB,cACWhgC,mBAA2B2/B,EACtCnoB,UACA6pB,QACA,OACA3lD,cACAsV,gCACAA,wBACAA,eACAA,gBACA,MAAW4uC,wCAAiCM,SAqD5CpvB,oBACAmvB,8BAEAqB,GADAxwB,GACA,CACA9yB,6BACAwU,aACAN,QAGA,CACAlU,WACAwU,uCACAN,QAGAuvB,0BACA,cACA/lC,gCACAsV,8BACAA,4BACA,sCACAqkB,yDACAhhB,cACA,YACA7B,QACA4uC,oBACAtwB,GACAj1B,wBACA2W,YACA8uC,UACAtjD,0CAEQnC,uBACRmC,8BACAsjD,UACA9uC,oDAvFA,mBACA,qCACA,OAEAxB,SACA,4BAQA,GAPAA,+BACAA,gCACAA,yCACAA,mCACAA,eACAA,mCACAA,kCACA2uC,iBACA,UACApuC,uBACA8oC,yBACA/oC,qBACAsa,gBAEAimB,oBAEAnT,WADAlsB,MAEA,KAAQ,CACR,kCACA+uC,uBACAnJ,uBACApnC,cACA/D,mCACA6xB,MACA9gC,KACAwU,KACArV,KACAS,KACA2T,YAGAP,oBAEAA,SACA,QACAA,UAEA,CACAA,WACA,CA6CAwwC,CADAJ,QACA5uC,OACAxU,0BA7CA,mBACA04B,2BACA+qB,wBACApsB,wBAEA,CAyCAqsB,gBACA5wB,GACAwwB,WAEAA,WAGA5f,yBACA,CACA9K,YACA,aACA5kB,YACA2vC,UACAC,aACAC,gBACA,cACA,OAEA,iCACA7wC,QACAogB,aAEA0wB,QADAF,SAEA,MACAzvC,SACAqC,WACA,uBACAA,6BACAhC,UACAL,8BACM,CACN,iEACAK,yEACA,CACA,qBACAxB,8BACAA,wBACAA,sBACAA,oBACAA,gBACA0lB,mBACA,CACAqrB,sBACA,2BACAH,aACAC,gBACA,wCACA,CACAG,sBACA,aACA,UACA,gDAEA,IADAC,mBACApmD,IAAkBA,aAAeA,EAEjC,GADAqmD,OACAlkD,0DACA,wBAIA,WACA,CACAmkD,eACA,aACAnwC,YACA,IAmBA,iBAIA,SAHA,yCAGAA,wCAIA,CA3BAowC,WACA,OAEA,oCACA,yBACA,uBACAC,EA/WA,+EA+WAC,MACApoB,OACA1N,wBAEA9wB,iBACA6mD,OACA/1B,uBAEA,MAAM+1B,GACN/1B,uBAEA,EAWA,QACA2V,YACAqgB,YACA9lD,aACA,yBAA8CsU,8BAC9Cm3B,oBACAA,cACA,EACAxrC,QACAwrC,gCACA7sC,QACA,EACA6yB,oBACA,iBACAga,oBACA4K,WACA,EACA1jB,eACA,iBACA0jB,gBACAA,kBACA,EACA0P,gBACAjoD,UACAc,6BAEA,EACAkd,UACAuE,WACAqU,eACAzE,eACAvT,YACAhN,WACA2B,WACAolC,eACA,uBACAuP,UACAA,uBACAA,UACAC,cAEAD,UACAC,YAEA,EACAC,aACAC,aACAv9B,QACAtF,+BACA4/B,YACAnnC,WACAu6B,kBACA,yBACe1tB,QAASw9B,mDAA8CxnD,iBACtE,0CACA,0CACAswB,oBACA,OACAE,sBACAmnB,4BACA8P,YACA7Y,kBACA8Y,yBACAC,sBACAC,kCACAC,2BACAh4B,+BACA+nB,0BACAmH,2BACA/oC,oBACA+jB,yBACA+iB,eACAj2B,qBACA,EACS7nB,KACT,GAEAuxB,OACA7L,+BACAjD,WACAqU,kBACAtF,UAGAre,aACAoB,mCACAyW,QACAzW,kEAKA,oBACA5T,eACAsyB,QACAjzB,mBACAA,uBACAA,eACAA,qBACAA,gBACAA,mBACAA,iBACAA,kBACAA,kBACAA,mBACAA,qBACAA,mBACAA,oBACA,CACAwe,YACA,aACA9G,YAGA,GAFAtW,SACAA,SACAsW,UAEA,YADAtW,qCAGAA,kBACAA,oBACA,mCACAA,yBACA,kDACAA,iBACAA,WAEAA,SAEA,CACAo1B,eACA,8BACA,6BACA,CACAsyB,aACA,MAAW/wC,yCAAmC/X,KAC9CqyB,UACA,IACAnY,MADAlD,IAEA,4BACAulB,WACAC,MACAtiB,QAEA,qBACAqiB,MACAC,WACAxlB,WAEAulB,MACAC,WACAxlB,SAEAkD,OAEA,CAAYqiB,wCACZ,CACA/6B,OACA,aACAkV,QACAgB,YACA,cACA,OAEA,mBAEA8Y,EADAu4B,aACA,kBACWxsB,yCAAoCn7B,eAC/Cg7B,mBACA1W,cACAxL,WACAlD,WACA+jB,qBACAD,sBACAS,mBAEA,EAYA,QACAsM,WACAqgB,YACA9lD,cAbA,iBACA,gBACAsU,UACAnE,UACAvR,UAEA6sC,oBACAA,eACA7sC,cACA,CAKAgoD,KACA,EACA3mD,QAEAwrC,eADA7sC,qBAEAA,YACA,EACA6yB,oBACA,qBACAga,oBACAtc,WACA,EACArT,UACAmU,eACA5P,WACArM,MACA3C,eAEAqL,YACAX,WACA2Y,eACAtF,QACA/d,YAEAw1C,eACAvjC,eAEAvS,aACAoB,eACAC,gBAIA,UACA00C,WACA,aACA,SAEA,QACAxlD,IACAwU,IACAuU,IACA,mBAAoClrB,MAASA,GAC7C,qBACA,oBACA,4BACAmC,OACAwU,SACAuU,CACA,CACA,CACA,OACA/oB,MACAwU,MAEA,EACAoE,aACA,aACA,SAEA,IAGA/a,MAHAmC,MACAwU,MACAwD,2BAEA,mBAAoCna,MAASA,GAC7C,qBACA,oBACA,MACA6B,OADAu7C,oBAEAv7C,MACAsY,IACAytC,IAEA,CACA,CACA,MACA,4BACAzlD,MACAwU,KACA,CACA,OACAxU,IACAwU,IAEA,GAEA,iBACA,WACAtB,MACApT,gCAEAuV,WAGAA,CACA,CACA,eACA,oEACAqwC,cAEAA,CACA,CACA,iBACA,MAAShuC,kCAA8B9Z,EACvCwZ,kCACSuR,iBAAcvR,sBACvB,OACA9Z,QACAqrB,QACAzB,sBACAiC,+BACAw8B,iBACAltC,uBACAyQ,YACA/E,eACAzM,UAEA,CACA,iBACA,sBACSkuC,yBAAqB5T,GACrB4P,wBAAqB/yC,EAC9Bg3C,iBACAjC,kBACAkC,mBACAC,WACAC,WACAC,YACAxrC,iBACA,iBACApE,KACA6vC,4EACAA,2CACAH,IACAzvC,oBACAyvC,oBACAl3C,qBAEAq3C,KAEA5vC,QADAzH,wDAEAq3C,qBACAA,qBAEAF,IACA1vC,sBACA0vC,gBACAA,sBAEA,SACA,sBACA3vC,0CACA,EACA,gBACArD,gBACA6I,eACA7I,gBACA6I,wCACAsqC,yBACAtqC,UACAA,iBACAA,gBACAA,kBAEAsqC,KACAnzC,gBACA6I,gBACA7I,YACAqD,aACA,CAAUA,mBACV,CAoBA,qBACA,MAASrW,aAAU4P,GACVyG,mBAA+BlC,iBAAc7W,EACtD,eACA,mBACA8oD,4BACIpmD,OACJomD,SACIpmD,WACJomD,WAnBA,qBACA,MAASpmD,aAAU4P,EACnBy2C,6BAIA,GAHA,2BAGA,qBACA,QAEA,CAYAC,YACAF,YAEAA,CACA,CACA,mBACA,kBApCA,iBACA,MAAS5xC,cAAW5E,EACpB,aACA,MACI4E,eACJ,SAEA,QACA,CA4BA+xC,MACA,OACAH,6BACAI,SAEA,CAqBA,qBACA,MAASC,2CAAuC53C,GACvCu3C,mBAAgBM,EACzBC,MACAC,MACA,MAzBA,iBACA,IAAO5mD,aAAU4P,EACjB,kBACA5P,KACI,eACJA,QAEAA,CACA,CAiBA6mD,MACA,QAjBA,mBACA,IAAOryC,cAAW5E,EAClB,gBACA4E,KAEAA,GADI,aACJ8B,IAEAA,IAEA9B,CACA,CAOAsyC,QACA,mBACA,WACA9mD,KACM,cACNA,MAEI,WACJA,KACI,cACJA,MAEA,CACAA,0BACAwU,4BAEA,CACA,mBACA,sBACA,mBACAw9B,cACA,YACAA,oBACAA,UACA,CACA,eACA,mBACA,CAQA,iBACA,qEACA,wBACA,CACA,oBACA/0C,eACAsyB,QACAjzB,eACAA,gBACAA,qBACAA,2BACAA,kBACAA,8BACAA,sBACAA,wBACAA,qBACAA,uBACAA,uBACAA,kBACAA,uBACAA,iBACAA,sBACAA,mBACAA,mBACAA,mBACAA,cACAA,cACAA,mBACAA,kBACAA,mBACAA,mBACAA,wBACAA,6BACAA,2BACA,CACA0oB,cACA1oB,eACAA,8BACAA,oBACA,CACAutB,qBACA,aACA9E,sBACA,KACA,SAEA,iBACAlW,uCACAmF,+CACAmP,qBACA,sBACAzlB,sCAEAylB,CACA,CACA8F,aACA,aACA,oBACAvrB,WAjEA,mBACA,uCACAs0C,UACA+U,eACAvzC,gBAEA,CA2DAwzC,0CACA,CACAC,cACA,cACWhV,aAAWpjC,EACtBq4C,6BACAr5B,uBACAs5B,4BACA,SACA,qBACAC,cACAA,cACAA,CACA,CACAC,mBACA,iDACA,CACAC,aACA,cACWrV,aAAWpjC,EACtB04C,KACA,gBACA,SACAC,UACAJ,SACAK,UAEAC,UACAC,yCACAA,8BACAA,uCACAJ,YAEAA,CACA,CACAK,kBACA,gDACA,CACAC,eACA,cACW5V,aAAWpjC,EACtBi5C,8BACAC,wBACAC,6BACA,SACA,qBACAZ,cACAA,cACAA,CACA,CACAa,gBACA,aACA7lC,YACArP,gBACAm1C,KACAC,KACAC,KACA,IACAvqD,IADAkpD,KAEA,mBAAqClpD,MAASA,EAC9CkpD,0BAEA,kBACAA,0CAEAl4C,aACAk4C,oCAEAlrC,SACA,0BACAqsC,+BACAC,oCACAC,qCAEA1qD,gBACAA,qBACAA,oBACAA,eACAqpD,CACA,CACAjsC,YACA,aACAjM,uCACAuT,YACA,MACA2kC,KACA,YAMM,CACN,kDACAA,oBACArpD,wBACAA,kCACAA,sBACAA,gCACAA,0BACA,wBACA2qD,mBAA8Cj1B,KAC9CszB,mBACA4B,qBACA5qD,kBACAA,kBACAqlB,GACAwlC,UACAvoD,MACAwU,MACA6B,cACAC,gBACAkyC,WACAC,WAEA,MA5BA,gBACA1lC,GACAwlC,YA2BA7qD,kBACAA,kBACAqlB,GACArlB,mCAEA4c,eACAzL,mBAAiCvR,mCAEjC,CACAorD,mBACA,qCACA11C,oBACAA,oBACAA,mBACA,CACA21C,wBACA,MAAWvC,mBAAgB9pD,MAChBoX,4BAAyB7E,GACzB7O,SAAgB4oD,GAChBvyC,kBAAezG,EAC1B,qBACA,oBACA6mB,SACA,YACAE,IACAC,OACAJ,QACAqyB,UAEAlyB,MACAC,OACAJ,QACAqyB,SAEAC,OAGAlyB,GADA,WACAmyB,MACQ,YACRA,QAEAzsD,YAEA,WACAk6B,KACAC,QACAE,OACAmyB,UAEAtyB,OACAC,QACAE,OACAmyB,SAEAD,OAEA,CAAYlyB,mCACZ,CACAiC,iBACA,aACA/K,UACApB,WACA,UACA,MACA,8BAQA,IAPAu8B,yBACAh2C,sCACAA,wBACA4wC,kBACAqF,iBACAj2C,yBACAA,gBACAnV,IAAkBA,MAAYA,EAC9BmV,6CACAg2C,oBACAnrD,UACAmrD,2BAGA,CACA,CACAE,yBACA,aACAhB,mBACAiB,yBACWzH,wBAAqB7yC,EAChCg3C,iBACAuD,iBACAC,UAEAC,QADA5H,qCAEA,oBACA,UACAnuC,uBACA8oC,wBACA/oC,oBACAsa,eAEAimB,0BACAC,UACA9gC,mCACAA,iCACA0tB,eACA1tB,4BACAA,8BACA0tB,cACA,KAAM,CACN1tB,6BACAA,4BACAA,gCACAA,uCACA,4BACAu2C,mCACAnP,sBACAnrC,oCACA+D,cACAA,iCACA8tB,MACA9gC,KACAwU,KACArV,IACAS,IACA2T,YAEAP,SACAA,WACAA,8BACAA,cACA8tB,MACA9gC,KACAwU,OACArV,MACAS,MACA2T,YAEAP,WAEAA,iCACAA,sBACAA,wBACAA,8BACAA,4BAEA,CACAA,gCACA,CACAw2C,gBACA,cACW5D,QAAMloD,GACN+rD,kEAA4D56C,EACvEg3C,iBACA,mBACA6D,KACA,+BACAC,gBACA32C,oCACAg2C,QACA,EACAY,mBACA,yBAUA,IATA52C,cACAA,wBACAA,gBACAg2C,eACAh2C,wBACA6I,oBACA6tC,mBACA,uBACA,EACA7rD,iBAAoCA,QAAUA,IAU9C,IATAgsD,SACAC,yBACA92C,eACA6I,iBACAurC,YACA2C,eACArsD,6BACAssD,4BAEA79C,kBAAuCA,QAAUA,GACjDw9C,WACAK,eAEAnuC,eACA,CACA6tC,KACAM,eACAnuC,mBACAmtC,MACA,CACAiB,kBACA,aACAlC,WACAt7B,WACA,QACA,MACA,8BAQA,IAPAu8B,0BACAA,uBACAh2C,uCACAA,wBACA8yC,mBACA9yC,0BACAA,gBACAnV,IAAkBA,MAAYA,EAC9BmV,6CACAg2C,iCAEA,CACA,CACA9wB,wBACA,MAAWkuB,mBAAgB9pD,MAChB0D,SAAMgpD,GACN3yC,kBAAe6zC,EAC1B32C,iBACAP,8BACAA,4BACAA,0BACAA,cACAA,gBACA,WACA1W,wBAEA0W,kBACAA,kCACA,2BACA1W,wBAEA0W,oBACAA,sCACA,cACA1W,wBAEA0W,kBACAA,kCACA,0BACA1W,wBAEA0W,gBACAA,8BACAA,cACAA,SACAnE,iBACAmE,UAEA,CACAm3C,0BACA,aACA7sD,WACAF,gBACAgtD,SACAC,SACA,SACA,0DACA,MACA,OAEA,wBACAhC,mBAA8Cj1B,WAC9CszB,YACA7yC,eACAu2C,4BACA1sD,kBACAA,kBACAA,gBACAA,kBACAA,aACAA,aACAA,mCAEA,CACA,CACAI,QACA,aACA+Q,uCACA,gBACA,MACA,OAEAnR,4BACA,SACA2Y,cACAC,iBAEA0yC,GACAhpD,MACAwU,OAEA+zC,uBACA,sBAEA15C,YADAnR,2FAEAsV,SACAA,gBACAtV,0BACA+lC,sBACAulB,WACAtrD,mBACAA,kBACAA,oBACAgmC,sBACA1wB,YAEA,CACA26B,oBACA,uBACA,CACAC,uBACA,aACAC,YACAzrB,UAAwC+B,2BACxC,mCACA,MACA,qDAEA,OACAA,eACAzM,kBACAlC,QACA,GAEA8E,WACAgwC,2BACAhwC,QACA5c,YACAA,mBACAA,aAEA,CACAymD,iBACA,aACAt1C,YACAg/B,gBACA,SACAzrB,KACA,sBACAA,mDACAvT,WACAuT,aAGA,gCACA,wBACA9H,IACA5c,aACAmR,yBACAnR,kBACAsC,MACAwU,OAEA9W,iBAGA4c,CACA,CACAiwC,sBACA,MAAW/B,6BAAyBlsD,KACpC82B,gCACA,gCACA,EAEAo3B,kBACA,IA8KAtkB,kBACA7mB,eACAorC,cACAC,UACAC,UACAC,SACAJ,QApLA,CACArmB,aACAqgB,YACAqG,eACAC,iBACAj8C,IACAvR,kBAAmCytD,qBAEnC,EACA56B,oBACA7yB,WACAA,uBAEA,EACAyoB,aACAzoB,WACAA,uBAEA,EACA0tD,aACA,kBACAxuD,GACAw1C,YAEA,6CAGAA,GACAA,cAEA10C,sCACA,EACAmnD,gBACAnnD,WAEAA,8BADAd,YAEAA,aAGA,EACAge,UACA+iC,WACA0N,cACA73B,mBACA+E,kCACA+yB,kBACAtH,WACA7zC,eAEAk5C,eACAkC,oBACAC,kBACAC,iBACA5B,cACA5D,UACA,EACAyF,iBACAC,mBACAC,gBACAC,kBACA3F,YACA/1C,eAEA27C,mBACAjxC,UACAkxC,eACAlF,YACA/yC,eACAguC,iCACAE,gCACAgK,0BACA7B,iBACAxqB,4BACA3R,cACA3K,WACAR,aACAI,uBAEAM,YACAH,SACAxP,cACAuP,yDAEAwlC,SACA1lC,gBACAJ,eAGAwvB,WACAiV,eACAr5B,SACA,eACA,aACAvG,sBACAukC,eACA,qDACA,2BACY,WACZ,eACY,sBACZ,qBAEA,CACA,QACA,EACA1E,cACA2E,cACAC,eACApjC,SACA,qDACA,uDAEA,0BACAA,IACAA,SAEA,yBACA,eACAA,MAEAA,CACA,EACAqjC,cAEA,QADAC,uCACA70C,iCACA,OACAmoB,0BACApH,kCACAvK,0BACAF,wBACAC,oCACAysB,eAEA,EACA8R,iBACA,6BACA,EACA/C,mBAEA,QADA8C,uCACA70C,iCACA,OACAilC,wBACA/oC,oBAEA,EACA64C,cACAC,aACAtE,gBACAC,UACAC,iBAGAzC,eACAM,gBACAC,kBACAlC,kBAEAn0C,aACAoB,4DACAC,cACAmhC,WACAphC,eACAC,eAEAmS,WACAjS,cAEAmS,YACAnS,wBAGAq7C,0CAwBA,oBACApvD,eACAsyB,SACAjzB,wBACAA,kBACA,CACAwqB,WACA,SACA,YAEA,yBACA,MAZA,4CAcAoI,CAFA1Z,0BApBA,mBACA,qBACA,aALA,6BACA8R,YACAvV,gBAIAu6C,QAGA37B,IADArJ,iBACA9R,GACA,CAcA+2C,cACAjlC,WACA,CACAqK,sBACA,cACW9B,2BAAwBnyB,kBACnC,IAAS8B,aAAU9B,gBACnB,6BACAmyB,IACArwB,KAEAswB,IACAvwB,2BAGA7B,QACAA,OACA,CACAo0B,aACA,aACAtyB,QACAD,QACAutB,mBACAiB,KACA,oBACAzG,yCACA5pB,2CACAA,6BACA,YAA0BsQ,KAAcA,IACxC+f,QAAkB/f,UAElB,QACA,CACA6mB,oBAEA,QADAv4B,KACA2zB,YACA,wBACA3I,KAEAtZ,CACA,CACA6M,YACA,aACA0U,kBACA7xB,mBACAA,mCAEA,CACAo3B,oBACA,aACA,2BACA9mB,cAEA,kEACA,CACAgnB,mBACA,MACAjH,EADAzxB,KACAyxB,MACA,yBACA,KAHAzxB,KAKAw4B,4BACA,CACAC,oBACA,aACA,sEACA,CACAK,eACA,kBACA,EA6FA,iBAA+Clb,6BAC/C,cACA02B,oCAEA,oBADA,oBAEA,CAhGA4b,iBACAA,aACAz+B,OACAS,yCA8FA,oBACAvxB,eACAsyB,SACAjzB,kBACAA,gBACAA,wBACAA,sBACAA,kBACA,CACAwqB,WAIA,OAHA7S,QAGA,wDACA,MAEAkV,CACA,CACAsjC,yBACA,cACW1/B,eAAarvB,WACbmyB,2BAAwBnyB,kBACnC,IAAS8B,aAAU9B,EACnB,mBACAgvD,aACA,MACA,cACAC,QACAC,SACAF,KACQE,UACRC,IAEA,CACArtD,QACAktD,OACA3/B,GACA8/B,QAGAnvD,QACAA,OACA,CACAovD,eACA,aACA18B,kBACA,IACA28B,GADSC,4BAAyB58B,EAElC,SACA28B,4CAEAA,uBACAC,SAEAA,IACAD,iBAEAA,CACA,CACAE,mBACA,+BACA,CACAn7B,aACA,aACA9d,YACAoc,UACA,uBACA28B,gBACA,MAcAh/B,EA5KA,iBACA,YAESf,wFAA8EkgC,EACvFC,QACAC,QACS5tD,eAAsB6tD,EAC/Bx9B,UACAC,UACAw9B,UACAC,iBACA,IACAxrC,YADA2K,wBAEA,sBACA,QAAa1e,UAAY,CAAGA,WAE5Bw/C,sCACAA,QACA9gC,uBAEAzY,QACA8N,kBACA2K,wBAEA,aACA+gC,wBACAC,yBAEAD,MACAC,OAEA79B,+BACA29B,wBACA9gC,YACA+gC,KACAC,MACIJ,IACJG,WACAC,WACAF,OACA9gC,gBAEA8gC,cAEAA,GADA5qB,6BACAvT,eAEAA,eAGA,kBACA2T,OACAA,QAEAjhB,2BACA0rC,wBACAC,wBACA,SAcA,IAbA79B,KACA89B,WACA5/B,QAAkB/f,UAClBy/C,MACAthD,KAEAy2B,+CACAz2B,MAEMshD,MACNthD,MAGSA,QAAeA,GACxB4hB,QAAgB/f,qCAEhB,qBACA40B,qCACA7U,sBAEAA,QAAkB/f,YAEd8hB,aACJ/B,QAAgB/f,WAEhB+f,CACA,CAyFA6/B,CAdA,CACAb,WACA//B,gBACAxtB,UACAD,UACAsuD,sBACAC,gBACA/kC,cACAglC,yBACA7zC,4BACA8T,6BACA2/B,oCAEAjwD,aAEA,0BACAolC,gBAEA9uB,WACA+Z,YACArwB,cACAA,cAEAA,cACAA,aAEAqwB,CACA,CACAlT,YACA,aACAkT,UACA,YACA/Y,QAEA,GADAua,kBACA7xB,4BACA,uCACAgB,KACAsW,IACA,CACAtX,gBACAA,cACAA,iBACA,CACAm3B,oBACA,sCACA,EAGA,oBACAlD,sBACA,cACWnyB,aAAU9B,gBACrBA,gBACAA,gBACAA,0BACA,CACAuvD,mBACA,aACA/yC,mBACAuS,qBACAuB,kCACA4iB,oCACAtc,+BACA,+CACA,CACAQ,oBACA,kFACA,CACAC,oBACA,mEACA,EASA,eAEA,OADAi5B,kCACA,CACA,CAVAC,eACAA,aACAlgC,OACAS,iCA8BA,oBACAvxB,eACAsyB,SACAjzB,kBACAA,gBACAA,wBACAA,kBACA,CACAwqB,WACA,6CACA,SAIA,yBAHAxqB,aAIA,CACAq1B,sBACA,cACWnyB,aAAU9B,gBACrBA,+BACAA,+BACAA,wBACAA,YAEAA,0BACA,CACA+uD,yBACA,cACW58B,2BAAwBnyB,kBACnC,YACA6B,QACA,mBACAmtD,aACAwB,0CACA1uD,QACAA,MACAqtD,KACAH,QAEAG,WACAH,YAGAltD,MACAqtD,WAEAttD,MACAmtD,UAEAhvD,kDACAmvD,WAEAnvD,QACAA,OACA,CACAo0B,aACA,aACA9d,YAKA+Z,EApFA,iBACA,8BACAogC,kCACApgC,KACA,mDACAmgC,oBACAE,+BACAP,iCACA,GACA9/B,QAAgB/f,wBAChBogD,EACA,SACAA,MACAF,EACAL,YAEAG,yCACIE,iBACJ,oBACA,eAAclgD,sBACd+f,CACA,CA+DAsgC,CAJA,CACA7uD,eACAD,gBAEA7B,GACA,0BACAolC,gBAEA9uB,WACA+Z,YACArwB,cACAA,cAEAA,cACAA,aAEAqwB,CACA,CACA8G,oBACA,qDACA,CACAha,YACA,aACAnc,QACA6wB,kBACA7xB,oBACAA,6BACA,CACAo3B,oBACA,aAIA,YAHA,gBACA9mB,SAEA,mBACAsgD,IAEA5wD,+BACA,GACA+T,mCACA,CACAsjB,oBACA,aACAG,0BACA,iDACA,EAYA,eACA,gBACA,yBACA,8BACA,oDACA,CACA,QACA,CACA,mBACA,aACA,CACA/1B,iBACAS,cAGA,CACAT,yBACAS,IAEA,CACA,uBACA,oBACA,CACAlB,YACAsW,WAEI5C,SACJ,CACA1T,UACAsW,OAGA,CACAtW,QACAsW,QAEA,CA0EA,eACA,sBACA,SACI5C,MACJ,OAEA,OACA,CACA,mBACA,gBACAghB,YACIhhB,eACJghB,SAEA,CA2BA,qBACA,MAASpgB,OAAKoV,EACd,KACApV,sCACI,CACJ,8BACAA,kBACA,YAAoBnV,IAAgBA,IACpCu5C,0BACApkC,iBAEA,CACA,CAmBA,eACA,gBACA,CAlMAu7C,oBACAA,aACAxgC,OACAS,mCACAE,OACA6uB,cA8LA,oBACAtgD,eACAsyB,SACAjzB,oBACAA,oBACAA,wBACAA,qBACAA,wBACA,CACAi1B,gBACA,aACA7zB,mBACAA,qBACAA,6BACAA,gCACAA,gDACAA,uDACA,CACAi0B,sBACA,cACWnyB,aAAU9B,gBACrBA,2BACAA,2BACAA,0BACA,CACAuvD,mBACA,mDACA,CACAh7B,sBACA,aACAu8B,0CACA9wD,yCACA,mDACA,sBAEA,CACAk1B,MACA,aACA5e,YACAA,iCA3LA,eACA,SACAvU,IACAI,UACA6Q,IACAtR,yBAEAqvD,KACA,UACA,WACAh0C,KACAi0C,uBACA,QAAc7wD,IAAgBA,KAC9B,0DACA4c,eACA28B,2CACA,oBACAhvB,qBACAumC,4CACAh5B,OACA,4BACAvjB,UACAw8C,wBACAC,yBACAD,eACAE,aACAL,QAEAG,aACAE,WACAL,QAEAI,eACAC,aACAL,QAEAI,aACAC,WACAL,OAEA,CACArmC,oCACAA,sBACA,kBACA2mC,QACAC,+DACA,QAAcnxD,IAAgBA,KAC9B,MACAoxD,2BADA,aACAx0C,MACArI,0BACAxC,QACAs/C,aACA,gBACA,OAEA/6C,GADA,YACA86C,KACM,cACNA,YAEAA,UAGA7mC,uBACApoB,OACAwU,OACA6iB,aACAljB,QACAE,SACAD,MAPAD,QAQAG,iBAEA,CACA,CAoHA66C,IAEAzxD,yBAEA,CACA0xD,sBACA,aACA,wBACAC,wCACAC,qBACAC,yDACAC,QACAH,QACAC,QACAC,QACA7xD,oCACA2xB,sBACAA,wBACA3xB,yBACA,CACA+xD,wBACA,aAGAC,kBACAC,wCACAjyD,sBAHAkyD,iBADAlyD,0BAIA,UACAA,gDACA,CACAmyD,iBAGA,aAFA3+C,4BAEA6mB,GADAz7B,4BAEA,CACAwzD,iCACA,aACA,SACA,WAEA,oCACA,0BACApyD,YAEAsQ,UACA,CACA+hD,iCACA,SACA,WAEA,aACAC,kCACA,wCACA,CACAC,sBACA,aACA79C,wBACA,OACApS,0BACAwU,0BACApC,QAEA,CACAouC,8BACA,qEACA,CACA0P,mBACA,8DACA,CACAC,yBACA,MAAWh8C,+BAA0B7X,yBACrC,OACA6X,OACAE,MACAD,QACAE,SAEA,CACA4jB,iBACA,cACWC,wBAAwB4e,aAAWr5C,UAC9C,MACA,cACAsV,SACAA,cACAo9C,0EACAp9C,cACAA,cACAA,SACAA,WACA,CACA,CACAslB,WACA,aACAtlB,QACAgB,aACW8iC,qBAAkB9iC,EAC7B63C,uBACA,UAaA,GAZA73C,uBAtMA,iBACA,MAAShB,eAAegkC,gBAAc5uB,EACtC,cAA+BvqB,KAAQA,KACvC,sCACAwyD,cACWrwD,oDAA2CooB,uBAC3C0G,kBAAe6I,EAC1B,YACA,+BACA3kB,eACAA,0DACA,CACA0lB,GACA1lB,EACAoV,kBACApoB,EACAwU,iBACA67C,EACA,CACAruC,cACAqV,YACAD,uBAGA,CACA,CA8KAk5B,MAEApjC,WACAxvB,wBACA,UACAovB,2CACA,yCAtKA,qBACA,cACAiqB,cACS/0B,qBAAkBuuC,GAC3BxZ,qBAGA/jC,SACAA,gBACAA,cACAA,4BACAA,oCACAA,cACAo9C,YACAp9C,cACAA,WACAA,YACA,CAsJAw9C,SACA,IAGA1Z,WAEA,IADA9jC,SACAnV,yBAA0CA,KAAQA,KAClD,uCACemkB,qBAAkB2V,GACjCxK,QAGAna,cACAA,gBACAA,4BACAA,oCACA8Z,+DACAsG,0BACApgB,cACAA,8BACAA,kBACAA,WACA,CACAA,WACA,CACA,CACAoa,cACAoL,aACA,aACAxlB,QACAgB,YACAoc,UACA,cACA,OAEA,2BACA,QACApd,SACAA,iCACAA,YACAA,qBACAA,wBACAtV,wBACA,qBACA,OAEA,sCACA42B,aAEA,GADAxH,oDACA6K,qBACAthB,+BACArD,4BACA,8BACAA,YACAqD,YACAyW,iBACAzW,UACAie,gBAEA,CACAoE,qBACA1W,eACO,GAEPhP,WACA,CACA4lB,cAEA63B,qBACAA,aACA1xC,WACA2xC,WACAt9B,qBACA0jB,YACA/3B,WACAoO,YACAO,cACAC,oBAEAT,MACA6pB,aAEA9C,aACAlmB,OACAc,qBACAL,gCAEAwoB,aACAloB,qBACAC,kBACAhQ,WACArM,MACA9C,SAEA4e,YACA7F,EAEAlO,YAGAg2C,kBACA,iCACA,4BACA,uBAEAA,gBACA3Z,YACA9lC,mBAIA,UACA2/C,aAAgBC,4BAChBC,QAAWD,6BACXE,QAAWF,6BACXG,MAASH,8BACTI,KAAQJ,+BACRK,MAASL,+BACTM,OAAUN,gCACVO,SAAYP,+BACZQ,MAASR,wBAETS,mBACA,iBACA,UACA,CACA,iBACA,SACA,YAEA,oBACSC,+BAA2BlpC,aACpC,QASA,MARA,uBACApa,QAEAqW,QACArW,qBACAujD,aACAA,YAEA,SACA,MAEAC,IACAxjD,6BAEAujD,eADAA,2BAGAvjD,EACA,CACA,qBACA,kBACA,wBAAuCnQ,QAAcA,GACrD,kBACAkkB,0CACA,4CACA,YAEA,CACA,cACA,CAiBA,mBACA,MACA,GACI0vC,UACJ,MAAW58C,WAAQC,QAEnBiZ,EADA0jC,oBACA,CACA,OALA1jC,OAMA,CAcA,mBACA,WACAhuB,KACA6O,WACA,QACA,QAAc/Q,MAAUA,EACxBmQ,OACAjO,OACAguB,QACA/f,QACA0gB,WAGA,gBA1BA,qBACA,mBACAiC,2BACAC,sBACA,QACA,QAAsBlC,KAAeA,gBACrClZ,OACAA,OACAuY,eAGA,QACA,CAcA2jC,WACA,CACA,oBACAz0D,eACAsyB,SACAjzB,aACAyW,QACAuU,UACAU,QAEA1rB,iBACAA,uBACAA,iBACAA,oBACAA,sBACA,CACAkzB,UACA,4BACA+hC,8CACAviD,iCACA1S,iBACAg1D,gBACAE,cACAG,yBAEApiC,cACAjzB,6BACA,CACAwqB,WACA,kBACA,KAEAA,UACA,CACAoJ,eACAX,qBACAjzB,aACAyW,QACAuU,UACAU,OAEA,CACA2J,sBACA,aACA9iB,YACA0iD,aACApE,qBACA,IAAS3tD,uCAAkC9B,kBAC3C,eACAmyB,mBACArwB,sBAEAswB,mBACAvwB,oBAEA,GACAswB,SACA+hC,wBACA,gDACAA,oBAGApyD,8CACAD,8CACA7B,sBACAA,qBACA,CACAm0D,kBACA,kCACA,+BACAtyD,2BACA,kBACAC,OACAD,iBAEA,CAAYC,YACZ,CACAsyB,aACA,aACAjjB,YACAijD,SACA1hC,UACAqhC,2DACA,+BACA/zD,uBACAA,iCAEA,cAEAqwB,SADArwB,OAEA,mCACAq0D,iDA9IA,uBACA,sBAAiCl0D,iBAA6BA,KAC9D,cACA,6CACA,QAEA,CACA,4BACA,CAuIAm0D,oCACAt0D,+CAvIA,eACA,sCAA6DG,MAAUA,EACvE,oBACA,YAGA,CAkIAo0D,eADA,EAEAv0D,iBACAmR,WACAkf,YAEAmkC,oBACA,CACAC,eACA,aACA,IAEAxhC,IAFAjyB,IACAsW,IAEAtX,6BACAizB,6BAEAjyB,EADA,aACA,KAEAhB,gCAEAkzB,sCAEA5b,EADA,aACA4b,GAEAA,0CAGA,0BACAlyB,YACAsW,YACAtX,YAAmBgB,+BACnB,CACA0zD,YACA,aACAb,aACA/xD,QACAD,QACAsP,YACAijD,SACArjC,mDACA4jC,mBACAC,2BACAC,gBACAxkC,KACA,IACAykC,MADA7hC,IAMA,GAJA4hC,IACA5hC,6BAEAA,0BACA4gC,oBACA,4EAEA,wDACA,cAAkCiB,KAAYA,uBAC9CC,YAEA,4CACAA,YAEAxjD,gDACA,CACA4lB,oBACA,MAEAi9B,EAFAx1D,KAEAuS,aACA,OAHAvS,KACAo2D,SAGA7jB,SADAijB,gBACAA,gBAEAA,0BACA,CACAa,6BACA,aACA9jD,YACA+/B,wBACAue,UACAyF,eAEAC,UACArwC,OAEAmG,2BADAiqC,iBACAC,EAJA1F,UAKAthC,oBACA,8BACA,CACAoG,sBACA,UACA,mBAAqCp0B,MAAUA,EAC/C2kB,OACAA,6CAEA,CACAswC,sBACA,aACA,2CACA,CACAh+B,oBACA,aACAi+B,aACA1jD,0BACA,iDACA,CACA0lB,oBACA,aACAg+B,aACA1jD,yCACA,4BACA,CACA2jD,iBACA,aACAC,kBACAC,6BACA9gD,mDACA+gD,cACAC,cACAC,oCACA,OACAl0D,UACAS,UAEA,CACA0zD,qBACA,aACAxB,iBACAyB,mBACA1kB,2BACA2kB,sDACA5jD,qBACA6jD,0DACA,cACA,CACAC,oBACA,aACA,IACA71D,IADA4zD,oBAEA,YACA,SAEA,oCACA,2BACA,2DAEA,mBAAqC5zD,MAAUA,EAC/C4zD,kDAEA,mCACA,CACAkC,qBACA,aACAlC,sBACA,QACA,YACA,SAEA,sBACA,mBAAsC5zD,MAAUA,EAChD4zD,mBAEA,qDACA,CACAtzB,aACA,qBACA,EAsBA,mBACA,YACA,KACAy1B,gBACAC,eACAC,OACAC,WACI,CACJ,gBACAD,OACAC,OACAH,OACAC,MACA,CACA,YACA,0BACA,CApCAG,aACAA,aACAhnC,cACAinC,YACAzB,MACAlB,UACAnE,QACAqE,SACAG,cACAuC,sBACAX,mBAEAxlC,OACAhf,cACA2f,OACA6uB,cAsBA,oBACAtgD,eACAsyB,SACAjzB,eACAA,qBACA,CACA61D,cACA,aACAV,6BACA/zD,+BACAA,8BACA6xB,oBACA,CACA4kC,oBACA,MACW30D,aADXlD,KAEA,aACA,OACA,CAASk2D,cACT,CAASA,eAGT,YACA,UACA,mBAA0C30D,MAAUA,EACpDsxC,OACAA,UACApxC,UAGA,iBACAA,CACA,CACAq2D,yBACA,aACA,uBACA,YACA,SAEA,8BACAzrC,yBACA,OACA8oC,EADA1+C,mBACArV,yBAEAqV,aAEA0+C,iBACAA,CACA,CACA38B,sBACA,aACAi+B,aACA1jD,uCACAmG,sCACA,iDACA,CACAs9C,sBACA,uCACA,CACA/9B,oBACA,aACAg+B,aACA79B,yCACA,uCACA,EAEAm/B,mBACAA,wBAEA,sBACAh1C,eACAmtC,iBACAyB,eACAM,oBACAkC,qBACAuD,aACAK,qBAGA,gCACAC,eAAiBC,IACjBD,gBACAA,gBACAA,iBACAA,cACAA,oCACAA,wBACAA,cACAA,eACAA,kBACAA,cACAA,gBACAA,YACAA,YACArlD,iCACAqlD,mBACA/3D,aACAA,iBAGA+3D,EAEA,GAAC,SCjoZDj4D,KACA,uDACA,4DACAm4D,8BACA,CD6nZC,CC7nZAl4D,iBAA4B,aAI7B,OACAm4D,aACAC,WACAC,YAEAC,GACA,cACA,YAEA,mBACA,gCACA,KACA,eACA,YACAC,UAEAC,KACA7Z,UAGAA,uBAIA,yBACAA,cAEA,SACA8Z,OAEA9Z,CACA,CACA,cACA+Z,WACA,mCACA,qBACA92C,YACA,CACA,cACA,kCAEA,cACA82C,WACA,mCACA,qBACA92C,YACA,CAPA+2C,IACA,CAQA,cACA,yBACA,KACA,CACA,gBAEA,QADAC,OACAr3D,IAAwBA,WAAuBA,IAC/Co9C,mBAEA,CACA,gBAGA,QAFAka,OACAC,qBACAv3D,IAAwBA,WAAmBA,IAC3C4X,sBAEA,CAQA,cAEA,yBACA4/C,KAEAC,kBACA,IAGAx1D,6BAGA,CACA,cACAm7C,cACAA,2BAEA,CAIA,iCACArvB,mCACAA,oCACA2pC,yCAEA,WACA,yCACA,YAEA,GACA,UACA,SAEAta,+BACA,OAAU,0BACV,WACA,EACA,gBACA,kBACA,CACA,gBACA,kBACA,CAGA,gBAGA,QAFAua,iCACAC,KACA53D,IAAwBA,WAAuBA,IAE/C,QADAqZ,2BACA/K,IAA4BA,WAAoBA,IAChDspD,aAGA,QACA,CA6BA,gDACA,gBACA,eACAC,YAEA,CACA,mBAEAza,WADA,QACA,GAEA,+BACAztC,OAGAA,CAEA,CASA,gBACA,OACA2G,6BACAC,gCACAC,0BACAC,oCAEA,uCACAiB,CAGA,CAgCA,WA2BA,cACA,uBACA8Z,aAEA,CAEA,qBACA,QAAqCU,MACrC,iCACA4lC,oCACAC,qCACAC,mCACAC,sCACAC,sCAEAxgD,IACAogD,aACAC,cACAC,YACAC,eACAE,gBANAC,qCAOAC,gBACAC,kBAEA,OAlDA,aACA,kBACAC,EAIA,aACA,gBACAvmD,OACAujB,oBACA/e,SACAF,OACAiiC,SACA37B,UACA47C,kBACAC,kBAES,eACTC,6BACA,IACAhhD,EADAihD,aACAC,4DACA,YACAlhD,CACA,CArBAmhD,IAEAN,CACA,CA6CAO,wBACAphD,oBAGAA,qBAEAwa,IACAxa,6CACAA,+CACAA,2CACAA,kDAEAA,EACA,CACA,qBACA,QAA0CqhD,MAC1C,WACAC,SACAthD,GACApB,yCACAC,6CACAC,sBACAC,kDAEA,WACAiB,sBACAA,wBACAA,oBACAA,2BAEAA,CACA,CACA,cACA,gCACA,OACApB,+BACAE,6BACAD,iCACAE,mCAEA,CASA,cACA,iCACA,wCACAwiD,yBACAA,2BACA,CAEA,eAEA,QADAC,KACA9b,2BACA,iCACA,wBACA,MAEA,0DACA8b,UAEA9b,cACA,CACA,QACA,CAaA,eACA+b,kBACA,CAGA,qBACA,cACA,oBACAC,GACAt/C,aAEA,CACA,+BACA,WACAuG,0BACA,CACA,CAmBA,QACA,sBACA,iBACA,iBACA,kBACA,iBAeAg5C,+CAOA,iBACA,YACA,eACAC,KACA,CACA,iBACA,YACA,eACAA,KACA,CAKA,iBACA,qCACA,CAUA,iBACA,YACAC,QACA,OACAC,QACAC,SACAC,yBACAC,+DAEA,CAEA,iBACA,cACA,wBACA93D,IAEA,IACA,CACA,iBACA,qBACA2vB,oBAEA,IACA,CAEA,eACA,WACAhkB,mBACAA,gBACAA,gBAEA,CAyCA,qBACA,4BACAosD,QACAF,sBACA,wBACA,CAEA,mBAEA,YAGA,QADA,+BACAG,GACA,CAEA,eACA,OACA3zC,gBACAA,aACAA,YACAA,aACAA,eACAA,eACAA,oBAEA,CACA,eACA,qCACA5Y,wBACA,CACA,eACA,OACA4Y,mBACAA,gBACAA,eACAA,gBACAA,kBACAA,kBACAA,uBAEA,CACA,eAGA,sBACA5Y,iBAEA,gCACA,CAEA,eACA,yBACA,CACA,eACA,iCACA,yBACA,sBACAE,sBACA,CAEA,gDACAssD,8DAEA,iBACA,MACA,yBAaA,eACA,iBACA,MACA,gBACA,OACAN,QACAC,SACAC,kCACAC,qDACA,kCACA,gCACAnsD,2BAGA,CACA,WACA,CA5BAusD,IAEA,sBACAC,MAEA,mBACAA,WAA2C1K,yBAG3C,IAEA,CAkBA,eACA,OACAkK,yBACAC,4BACAC,wBACA,QACAC,4CACA,gCACA,8BACApoD,wCAEA,CACA,eACA,yBACA,CAEA,iBACA,0BACA0oD,qBACAA,iBACAA,+BACA,CAaA,iBACA,OACAT,sBACAC,yBACAC,mBACAC,2CAEA,CAiBA,eACA,kBACA,CAOA,eACA,uBACA,gBACA,aACAO,cACA,CAoBA,iBACA,qBACA,MACA,YACA,OAAyB5K,4BAEzB,YACA,OAAyBA,2BAEzB,aACA,OAAyBA,2BAEzB,KACA,OAAyBA,yBAEzB,CACA,cACA6K,eAGA,CAAqB7K,yBAFrB,CAAyBA,4BAIzB4K,SACA,CAAqB5K,6BAErB4K,QACA,CAAqB5K,2BAErB,CAAiBA,2BACjB,CAoFA,eACA8K,sBACAhd,iBACA,EACA,CA0DA,eACA,IAEAp9C,EACAq6D,EAHAC,KACAC,KAYA,IATA,mBACAA,qBAEA,qBACAA,MAEAt4D,mBACAs4D,KAEAv6D,IAAoBA,WAAmBA,IAEvC,iBADAq6D,QAEAC,yBACA,CAAsBE,+BACtB,CAAsBA,kBAEtB,sBACAF,QAA6BG,SAG7B,QACA,CACA,mBACA,MACA5jD,EACA,QAAoB7W,WAAuBA,IAE3C,GADA6W,eAEA,SAGA,QACA,CACA,mBACA,cACA6jD,YAEAC,2BACAD,WACA,CACA,iBACA,YAGA,SACA,EAEA,QACA,EAEA,uCACAE,mCAEAttD,IAXA,CAYA,CAGA,eACA,2CACA,CACA,iBACA,gBACA,kCACA,CAMA,eACA,aACA,CAGA,mBAIA,GAHA,uBACAutD,OAEAA,GACA,aACA9sD,SACA,QAAwB/N,WAAsBA,IAC9C+N,qBAEA,QACA,CACA,CACA,cAEA,QADApP,KACAm8D,IAAyBA,mBAAuBA,IAChDn8D,kBAEA,YAAwBqB,WAAiBA,IACzC,iBACA,WAGA,CAMA,iBACA,MACArB,EACAyiB,EACA25C,EACA9mD,EACA+mD,cACA,8BACAjoC,KACA/zB,uBAGAA,OACAiV,eACAmN,SAEA,EACA,kBACA,cACAziB,YACAo8D,uBACA/7D,IACAA,oBAEAiV,CACA,CACA,CAGA,0BACA,QAAmC0I,MACnC,SACA,gBACA,WAIAs+C,UAHA,SAEAC,aACA,kCAEAA,EACAA,QAGAC,UAGA,SAEAx+C,KAIAu+C,WACA,GAEAA,yCAIAA,QAHA,IAMA,CACA,KACA,oBACA,WACAE,WAIA,QACA,CAKA,eACA,wBACAn5D,8BAEAqpB,CACA,CAKA,eACA,uCACAzqB,cAEA,OAAiBA,YADjBw6D,QAEA,CAGA,sBACA,QAA2CC,SAC3C,WACAC,OACA,UACAA,YACA,kCAIAC,cACAD,UAEA,CACA,iBACAE,cAEAF,UACAA,YAGA,CAAiB16D,cACjB,CAMA,qBACA,iBACA66D,iCAEA,YACAA,mCAGAC,OAEA,CAkBA,qBACA,iCACA,CAAen6C,wBAAgBvf,qBAAsCJ,gBACrE,cAA8B,kDAC9BA,IACA,EAEA,iBAEA,aAAwBpD,mBADxBm9D,QAEA/5D,qEACA,CAEA,kBACA,qCACA,iCAAqD7B,IAAOA,IAE5D,aADA8B,eACAsP,uDAEA,QACA,EACAyqD,wBACA,EAgCA,qBACA,IACAC,EADAC,yBACAC,oCAEA,kBACAF,aAEAA,CACA,CAIA,iBACA,IACA97D,EACAi8D,EACAC,EACA5tD,EACAqB,GACAsW,GANAk2C,KAOA,KACA,QAAwBn8D,WAAyBA,KAIjD,IAHAi8D,OACAC,KAEA5tD,aAA8CA,KAAQA,IAEtD,oBADAqB,aACAA,GACAusD,2BAEA,QACAC,QACA,KACA,CAGAD,WACAC,WAEA,CAGA,iBAAsCn8D,KAAQA,IAE9C,SADAimB,QAEAg2C,SACAE,YAIA,QACA,CACA,iBACA,SACA,eACA1B,YACA2B,WAGA,QACA,CACA,iBACA,SACA,eACAC,eAEA,QACA,CACA,eAEA,QADAC,KACAxB,QAAkCA,WAAiBA,IAEnDwB,EADAC,OACA,EAEA,QACA,CACA,eACA,SACA,eACAjvD,aAEA,QACA,CAEA,qBAEA,QADAkvD,EAqGA,CAAiBC,QAAQxxB,cApGzB6vB,QAAkDA,WAAyBA,KAC3E,IACA4B,MADAC,KACAC,OACAF,IACAG,QAEA,CACA,QACA,CACA,iBACA,oBAAqCL,EA0FrC,CAAiBC,QAAQxxB,eAzFzBuxB,0BACAE,aACAF,+CAEAA,CACA,CACA,mBACA,gBACAC,uBAKA,aAHAxxB,oBACA,+BACA,GACAwxB,GACA,YACA,oBACA,8DACA73C,4BACAA,KACAA,aACAk4C,6BACAA,6BAEA,mBAAoDhC,aAAsBA,MAC1E,cACAiC,SACAl8D,SACAsW,mBAEA8zB,mBACA,CACA,CACA,CACA,OAAiBwxB,mBACjB,CAIA,iBACA,qBACA,MACA,sBAEAO,mBACA,OAUA,iBACA,gDACA,CAZAC,KACA,GAGA,yBACAD,4BACAA,CACA,CACA,MAqCA,CAAiBP,QAAQxxB,aApCzB,CAeA,iBACA,MACA,KAGA,CACAiyB,KACA,gBAAsDpC,WAAyBA,KAC/E,WACAqC,OACAA,EACAD,UAEA,SACAA,SAEA,CACA,MAdAA,IAeA,QACA,CAIA,iBACA,OACAT,WAA6BW,eAC7BnyB,gBAAkCmyB,yBAElC,CACA,iBACA,mBACAnyB,6BACA,iBACA,GACA,OAAiBwxB,mBACjB,CAEA,iBACA,WACAtlD,OAUA,OATA9J,UACAxM,2BAEAwM,QACA8J,0BAEAtW,OAGAA,UACA,KAEA,CAAiBA,cACjB,CAGA,iBACA,IAEAb,EACAq9D,EAHAC,KACAz8D,UAKA,IADA08D,WACAv9D,IAAoBA,WAAmBA,KACvCq9D,QAEAx8D,SACAy8D,QAAsCz8D,sBAEtCw8D,UACAx8D,SAIA,gBACAy8D,QAAkCz8D,oBAElCy8D,CACA,CACA,iBACA,0CACA,CACA,iBACA,cACAnmD,QACAqmD,OACA,wBAEA38D,EADA,SACA48D,QAGA,mDAGA,cAEAtmD,EADA,SACAsmD,MAGA,kDAGA,2BACAD,GAAyB38D,gBAEzB28D,CACA,CACA,iBACA,0FACA,wEACA,CACA,iBACA,sDACA,4CACA,CACA,iBACA,2DACA,yCACA,CACA,iBACA,qCACA,sBACA,CA2BA,iBACA,IACAx9D,EADAgO,WAEA,gBACA,SAEA,QAAoBhO,IAASA,IAC7B,eACA,SAGA,QACA,CAEA,eACA,MACA0X,EACA,kBACA,+BACA/Y,YACA+Y,2BAEAA,CACA,CACA,CAKA,iBACA,WACA,kBACA,8BACA,qCACAgmD,KAEAA,CACA,CACA,CAEA,QACAtK,OACAuK,YACAC,iBACAC,WACAC,cAEAC,IACAC,eACAC,MACA1K,OACAF,QACAF,MACAsB,UACAvB,OACAD,SACAD,UAEAkL,uBACAC,QACAC,UACAC,aACAC,aACAC,cACA,cACA,SACAC,KACAC,IACA,eACAC,SACAF,UACAC,sBAGAE,UACAD,UACAD,sBAIAhgE,yBACAA,wBACAA,gBACAA,+BACA,CACA,wCACA,kFACA,EACA8/D,wCACA,qDACAK,GA0KA,mBACA,+CACA,EAEAC,0CACA,EAEAA,sCACA,EAEAC,cACA,EAEA,CACA,CAxLAC,qCACA,OACA,wBAEA,UACAC,OACA,0CACA,4CACA,wCACAA,MAEA,wBACAC,oBACA,WACA,UAEA,OAyKA,iBACA,SACA,kBACAC,UACAnB,YACAoB,WAGA,QACA,CAlLAC,OACAC,cACAC,SACAC,SACAC,GA+KA,qBAEA,QADAC,IACAA,aACA,qBACA,UACA,MAMA,IAJA,oBAEAC,YADAD,cAEAE,KACAA,cACA,uBACA,WACA,MAEA,sBAEAC,YADAD,gBAEA,mBACA,OACAhW,SACAC,SAGA,CACA,CACA,WACA,CA3MAiW,cACAlC,mBACA,UACA6B,4BAEAM,QACA,EACAvB,sCACA,2BACA,OACA,OACA,EACA,kBACA,EACA,mBACA,EACA,qBAEA,YAEA,EACAA,CACA,CArEA,GAsEA,mBACA,4BACA,uCACA,YACA,2BACA,EAEA,cACA,YACA,OAmGA,qBACA,SACA,mBACA73B,UAEA,aACAA,cAGAA,uCACAq5B,iBACAr5B,YAEAA,UACA,CAjHAs5B,2DACA,EAIA,mBACArB,QAAuCA,GACvCH,QAAsCA,GAuBtC,iBAGAG,iBACAA,SACAA,kBAEAA,WACAA,qBAIA,0BACAA,wBAGAH,oDACAA,gBAEA,CAzCAyB,MACAtB,iBACA,IACAuB,EADAC,4CAEA,qBACA,YAAuCxB,UACvCyB,SACAF,2CACA,CACA,mBACA,gBASA,OAuBA,uBACA,0BACA,2BACAp+D,EAkCA,iBACA,SACA,iCACA,YACAu+D,CACA,GAEAC,IACAx+D,UAEAA,CACA,CA7CAy+D,8CACA,MACAC,uBAEAhC,eACA18D,2BAEA08D,mBACA18D,wBAIA,eACAA,0BAEA,sBACAA,6BACA,4BACA,GAEA,qBACAA,6BACA,gCACA,GAEA,2BACAA,2BACA,4BACA,KAEAA,qBACA2+D,MAEA,CA3DAC,EAPAR,uBACAA,EAGAC,GAEAnvB,WACA9qB,QACA,CACA,CA1BAy6C,OACA,CAgLA,kBACA,gBACAliE,cACAA,gBACA,CACA,wCACA,8DACA,EACAmiE,wCACA,2DACA,EACAA,CACA,CAZA,GAcAC,cACA,cACApiE,WACA,CACA,wCACA,8BACA,EACAoiE,wCACA,2BACA,EACAA,CACA,CAXA,GAcA,iBACA,6BACA,qBACAxzD,MAAmCswD,aAA6BtwD,IAEhE,WAEA,mBACA,YAEA,qBACA,eADA,CAGA,CA0BA,sBACA,QAAgCyzD,MAChC,kBACAC,cACAC,mBACAC,mBACA,SACAptD,sBAGA,4BAEA,CAEA,qBACA,6BAEA,OACAqS,OACArlB,QACAsW,IAJAA,8BAKA+pD,oBACAC,2BACAxD,YAEA,CACA,iBACA,gCACA,OACAyD,gBACAC,gCACAhqD,QACAk8C,UACAF,WACAF,SACAD,UACAD,YACAD,YACAF,iBAEA,CAEA,kBACA,gBACAr0D,gBACAA,0BACA,CACA,qCACAA,wBACAkX,2BACAinD,4CAEA,EACA0E,+BACA7iE,wBACAkX,2BACA4rD,+CAEA,EACAnwD,wCACAkB,eACA,wCACA,EACAQ,cACAwE,kBAEAlG,yCAEAkB,eACA,wCACA,EACAQ,cACAwE,kBAEAgqD,CACA,CAjCA,GAmCAE,cACA,kBACA/iE,iBACAA,YACAA,sBACA,CAIA,yCACA,QACA,cACA,WACA,2BACAkR,YAEAlR,aACAgjE,oBAA2CC,iBAC1B,GAEjBzF,SACA,aACA,2BACAtsD,YAEA,YACAgyD,GAA2BrnC,iCAE3B,eACAqnC,GAA2BC,sCAG3BC,MAAiC5F,KAAjC0F,EAAiCE,GAEjCpjE,aACAgjE,eAAqCE,OAErC,CACA,EACAH,0CACA,MACA/iE,aACAqjE,oBAAuCJ,WAEvC,EACAF,wCACA,QAAsCxwD,MACtC,6BACAnQ,oBACA,sBACA,2BACAkhE,gCACAC,QACAhxD,qBAGAgxD,MAFAC,kCACAA,8BAGAxjE,aAA8BsjE,0BAC9B,CACA,EACAP,sCACA,QAAsCxwD,MACtC,IACAmG,EADA+qD,yBAEA,cACA/qD,uBAKA1Y,eACA,MACA,qDACAA,aAAkCujE,YAClC,MAEAvjE,aAAkCgjE,eAAiBU,YAGnD,EACAX,0CACA,QAAsCxwD,MACtC,IAGAmG,GAHA+qD,yBACAT,GAAkCW,iBAClCvhE,oBAEA,OAGA,UACAsW,wBAKA1Y,gBACA,6BAGA,eACA4jE,WAEA,sCACA,OACA,qCACA5jE,aAAkCsjE,2CAClC,MAEAN,YACAhjE,aAAkCsjE,+BAElC,CACA,EACAP,kCACA,YACApzC,GACA3vB,aAA8BsjE,cAE9B,EACAP,gCACA,YACApzC,GACA3vB,aAA8BujE,YAE9B,EACAR,kCACA,YACApzC,GACA3vB,aAA8BsjE,yBAE9B,EACAP,yCACA,QAAsCxwD,MACtC,OAAkCoxD,UAClCE,qBACA,UACAA,gDAEA7jE,uBACAgjE,YAEAhjE,aAA0BgjE,iBAC1B,EACAD,oCACA,6BACAzE,iBACA/uC,oDACA,wBACAk0C,2CACAK,gCACAC,8BAIAN,0BACAO,4BAGA,EACAjB,+BACA,gBACAzE,iBACA,MACAt+D,yBACAkX,qBACA+sD,wBACAC,WACAC,aAEA,sCACAnkE,0BACAA,wCACA,CACA,EACA+iE,8BACA/iE,yBACAkX,wBACAktD,uBAEA,EACAzxD,4CACAkB,eACA,yBACA,SACA,4DAEA,IACA,EACAQ,cACAwE,kBAEAlG,2CACAkB,eACA,sBACA7T,0DACA,IACA,EACAqU,cACAwE,kBAEAlG,yCACAkB,eACA,wCACA7T,wDACA,IACA,EACAqU,cACAwE,kBAEAlG,wCAGAkB,eAA+B,2BAC/BQ,cACAwE,kBAEAlG,6CACAkB,eAA+B,0BAC/BQ,cACAwE,kBAEAlG,4CACAkB,eAA+B,yBAC/BQ,cACAwE,kBAEAlG,2CACAkB,eAA+B,wBAC/BQ,cACAwE,kBAEAlG,yCACAkB,eAA+B,sBAC/BQ,cACAwE,kBAEAlG,+CACAkB,eAA+B,4BAC/BQ,cACAwE,kBAEAlG,mDACAkB,eAA+B,mCAC/BQ,cACAwE,kBAEAlG,sDACAkB,eAA+B,sCAC/BQ,cACAwE,kBAEAlG,gDACAkB,eAA+B,0CAC/BQ,cACAwE,kBAEAlG,6CACAkB,eAA+B,6BAC/BQ,cACAwE,kBAEAlG,2CACAkB,eAA+B,qCAC/BQ,cACAwE,kBAEAlG,qDACAkB,eAA+B,qCAC/BQ,cACAwE,kBAEAlG,iDACAkB,eAA+B,iCAC/BQ,cACAwE,kBAEAlG,+CACAkB,eAA+B,+BAC/BQ,cACAwE,kBAEAlG,gDAEAkB,eAA+B,gCAC/BQ,cACAwE,kBAEAlG,mDACAkB,eAA+B,gCAC/BQ,cACAwE,kBAEAkqD,CACA,CAtSA,GA2SA,qBACA,SACAsB,KACAC,KACAC,MACAC,MACAC,gBACA,qBAEA,wBADAC,eACAC,YACAD,YACAE,iBACAN,gBACAA,mBAIAD,UAIA,2BACA,uBAEAnB,OADAwB,qBACAN,OACAS,YACAC,iBACAC,SACAF,GACAG,YACAA,KACA,oCACAN,WACAE,uBAGAP,sBAIA,yCACAK,OACAxB,MACA5E,YACArjD,SACAgqD,0DACAC,oDAIA,CACA,gBAGA,gBADAC,GADAP,MACAQ,GACgE/I,aAA8BA,MAC9F,IACAqI,GAEAH,SACAG,IAHAA,SAIAxB,GAHAA,gBAIA5E,cACArjD,MAPAoqD,OAQAJ,WACAC,UAEA,CAEA,gBAGA,gBADAC,GADAd,MACAe,GACgEnC,aAA8BA,KAE9FsB,SACAG,eACAxB,UACA5E,cACArjD,MALAqqD,OAMAL,WACAC,WAIA,OAAiBK,YACjB,CAIA,mBACAC,qCACAC,uBACA,wCACA,CACA3zB,gEACA4zB,WACAT,kBACAC,cAEAvmB,QACA6mB,UAGA,gBAGAlyB,cACAqyB,UAEA,EACA,IAEA,gBAAwCtJ,WAAoBA,KAC5D,WACAuJ,UACA,CACA,QACA,CACA,iBACAjnB,SACA,CACA,eACA,oBACA,CAEA,iBACA,wBACA,cACA,EACA,CACA,iBACA,SACA,cACAknB,cAEAC,YACAD,mBAEAA,aACAE,KACA,CAGA,qBACA,mBACArI,EA7gCA,CAAiBM,QAAQxxB,cA8gCzB,oBAEAkxB,aADAK,UACAiI,wDAEA,2BACA,uBAEAtI,sBADAA,iBACAsI,gBACA,CACA,QACA,CACA,uBACA,0BAIA,gBACAC,oBACAC,yDACAlD,aAEA,YAA8BmD,KAA6BjD,SAAeiD,aAC1EjC,kBACAkC,sBAA4CA,kCAE5C,kBAAgD/J,aAAwBA,MAExEgK,EADAC,QACAF,OAEA,+CACAA,aAEAA,CACA,CACA,iBAOA,OANA9C,YACAA,QAEAC,YACAA,WAEAD,OAGAiD,yBAGAC,QACA,CACA,gBACAP,OACA,gBACAQ,+CACAC,gDACAN,SAA8BO,GAC9B,WACAP,uBAEAlC,gCACAkC,UACAhkE,yCACAsW,mBAGAguD,GACAN,UACAhkE,qBACAsW,mDAGAwrD,aACA+B,qBACAC,GACAD,iDACAG,UACAhkE,qBACAsW,qCAKAytD,WACAC,UACAhkE,yBACAsW,uBAIA0tD,8BACAA,4DAEAA,EACA,CAEA,uBACA,mBACA,iBACA,OA2CA,yBACA,MACAQ,oBACA,CACA,SA9rCA,mBACA,kCACAC,8BACA,WACAC,WAEAC,IACAD,WAEAA,CACA,CAorCAE,sBACA,WACAC,aAEAC,sBACA,CACA,QACA,CAtDAC,2DACA,aACA,OAqDA,qBACA,WACAF,aAEAC,OACA,CA1DAE,gBACAC,4BACA,eACA,8BACA,WACA,WACA,eACA,gBACA,SACAC,sBAGAvJ,MAEA,kBACA,OA4CA,mBACA,aACAvxB,6BACA,iBACA,gCACA8xB,EAGAlB,MAAkCkB,GAAcrjD,OAChD7Y,+DACAsW,0DACqBorD,6GAErB,GACA,OAAiB9F,mBACjB,CA3DAuJ,+BACA,gBACA,OA0DA,uBACA,cAcA,OACAL,KADAM,OAbArD,EACA,CAAc,IACdhB,iBACAsE,oBACAC,eACAC,aACAC,UACA/rC,mBACAoH,eACAuqB,aACAqa,gBAEAxJ,eACA6F,KAEA,CA3EA4D,4CACA,yBACA,6BACA,mBACA,wBACA,wBACA,GAAiB,IACjB,sBACA,4BACA,2BACA,wBACA,iBACA,GAAiB,IACjB,oBACA,MAhpCA,CAAiB9J,QAAQxxB,cAgpCzB,IACA,eACA,OACAwxB,YACAxxB,uBACA,QAEA,SAEA,CAqDA,iBACA,wBACA,qBACA,EACA,CAEA,iBACA,OACAwxB,YACAxxB,qCACA,sBACA,GAEA,CAIA,iBACA,WAAiCu7B,aAAwB1J,EACzD,CAIA,iBACA,aACA72C,MAA+BwgD,sCAvuC/B,CAAiBhK,QAAQxxB,cAuuCMy7B,8HAAiOC,GAChQ,kDACA,CACA,qBAKA,YAJA,QAAuCC,QACvCC,cAUA,qBACA,kBACAC,kBACAC,SACAC,eACAC,kBACAJ,eACA,CAAc,uBAEdK,IACAD,aAEA,mDACAE,WACAC,gBACAC,yBACA,kBACA,cACAC,YACAC,gBACAC,eAEA,+CACA,SAGA,6BAIA,aAHA,wBACAC,SAEAL,IACA,cAEA,sBAGA,IAFAC,sBAEAj0D,YAGA,gBAGAq0D,kCACA,kBAEA,QAGA,CAEA,0BAAwD3M,aAAgBA,MACxE,IAIA4M,GAJAC,UACAC,SAAiDhB,GAAkBltD,kCACnEmuD,+BASA,GALAH,GADAG,GACA,YAHAhB,4BAMA,cAEAc,8BACA,QAEA,CACA,CACA,QACA,CA9EAG,WAGAjB,kBA8EA,qBACA,mBACAkB,SACAC,cACAC,mBACAC,YACAC,qBAKA,GAJAjB,IACAiB,WAGAC,0CACA,SAGA,8BAIA,aAHA,wBACAX,SAEAO,GACA,aAEA,sBACA,gBAGAP,mCACA,QAGA,CAEA,0BAAsD3M,aAAgBA,MACtE,cACAuN,SAA0CzB,MAC1C,oCACA,QAEA,CACA,QACA,CAtHA0B,UAIA,CAqHA,uBACA,gBAAsDxN,WAA2BA,IAEjF,UADAyN,KACAjB,YACA,SAGA,QACA,CACA,gBACAkB,EACAC,EACA3L,GAEA,0BACA4L,cAEA,mBACAA,oBACA,oBACA,IAEA,sBACAA,cAEA,EACA,CAEA,eACA,kBACAnL,KACA,eACAA,mBAEA,QACA,CAEA,iBACA,gBAAsDzC,WAA2BA,IAEjF,MADA6N,KACAC,GACA,SAGA,QACA,CAkBA,eACA,mCACAC,qBACAA,qBACAA,uBACAA,uBACAA,uBACA,CAGA,eACA,SACA,gBACA,WACA,iBACAC,eAEA,CACA,kBACA,CAaA,eACA,wBACAx9C,EAEA,mBACAA,eAGA,EAEA,CAEA,QACAy9C,iBACAnH,sBACAsE,yBACA8C,gBACA5C,aACA6C,WACArS,aACA0P,cACAniD,aACAmW,uBACAoH,mBACAuqB,kBAEA,mBACA,iBAAqEid,GACrEF,EA3EA,iBACA,wBACAG,cAEA,sBACAA,gBAEA,QACAvO,UAGA,IAEA,CA8DAwO,iBACA,OACAxH,+DACAsE,wEACAC,2BACAC,kBACAC,kCACA/rC,2CACAoH,mCACAuqB,sBACAqa,4CAEA,CACA,qBACA,SACA+C,KACA,iBACA,eACAC,WACAD,QACA,CAIA,GAHA,cACAC,uBAEAJ,EACA,eACAG,OACAH,WAIA,cACA,CACA,QACAtH,mBACAsE,sBACAC,eACAC,aACAC,UACA/rC,mBACAoH,eACAuqB,aACAqa,eAGA,eACA,sBACA,CACA,iBACA,OACA1E,oEACAsE,gFACAC,gDACAC,wDACAC,iCACA/rC,qDACAoH,yCACAuqB,mCACAqa,6CAEA,CAEA,QACAhgC,UACAijC,eACAv5C,aACAw5C,WACApG,iBACAtB,oBAEA2H,IACA5oE,WACAqlB,UACA/O,SACAirD,aAEAtgC,KACA,qBACA,MAkIA,iBACA,WAKA,OAJA86B,IAEAllD,EADAolD,wBACA4M,eAEA,UACAhyD,0BAEAA,CACA,CA5IAiyD,MACAC,KACAC,EA3wDA,uBACA,YAAwB7pE,WAA2BA,KACnD,SACAqpB,qBACA,OACA,gBACA,uBACA,UAEA,OADA+4C,OAGA,OADAA,qBAEAA,OAIAvG,QACA,CACAuG,UACAx9C,qBACAklD,qBACAC,SAEA,CACA,CACA,WACA,CAivDAC,GACAN,mDAEA,KAEA,OADAvG,2CACA8G,cACAF,gBACAD,oBACAllD,qBAEA,CAAqBu+C,sBAGrB,IAGAA,GAHA+G,MACAC,GA0CA,uBACA,IAEAC,GAGAC,GALApkD,EAwDA,iBACA,iBAAmDijD,GACnD,oDACAjjD,OACAA,CACA,CA7DAqkD,MACAlI,WAEAmI,QACApI,MAEAqI,QAEA,GADAJ,uCAEAG,sBAEAE,EACA,YAEA,qBACAJ,sCAEA,UAEAjI,EADA,QACAsH,IAIAU,6BACAC,2BAGAjI,QACAmI,WAEAF,KACAG,aACApI,IACAoI,WAEAD,aACAC,UAGAA,GACArI,MAEAsI,IACAtI,mCACAqI,sBACA1N,6BACAA,8BAEA,CACAsF,SACAD,UACAzoD,OAAqB7Y,iBACrB0hE,oCACAC,kCAEA,CAlGAkI,aACA,UAGA,CAAyBvH,IAFzBA,kCAEyBpG,SADzB4N,yDAIA,IACA,CAMA,uBACA,SACAxH,EAyFA,mBACA,SACAl9C,aAAuD2kD,GACvDjJ,YACA,8BACA17C,KACAA,OACAA,CACA,CAjGA4kD,QACA1H,qBACAA,aACAA,WACAA,WACA,qDAA2ErI,aAAgBA,MAC3F,IACAgQ,OACAC,EAFArJ,QAEAyB,QACA+F,IACA,CACA,iDAEA93D,+BACAA,+BACA+xD,CACA,CACA,qBACA,OACAT,wBACAG,QACAnpD,QACA6oD,uBACAC,qBAEA,CAqFA,QACAwI,kBACAC,gBACAC,uBACA9H,+BACAkD,4BACAiD,0BAKA,iBACA,UAEA,eAEA,cACA,KAEAtnE,iBAEAoL,qBACA,mBACA,GAEA,sBACA,IAGA,IAEAnL,gBACA,aAA8BipE,KAC9B,EAEA,CAvBAC,SACA,CAwBA,wBACA,QAAuCC,MACvC,IACAC,EACAC,EAFAC,KAGA,aACA,MACA,kBAA4D1Q,aAA0BA,KACtF2Q,OACAC,WAEAC,GACAA,aAEAJ,MACA,CACA,CACA,gBACAA,uBACAG,IACAJ,OACAC,YACAK,wBAEA,CACAl0D,gBACAA,cACA,kBAAwDojD,aAA4BA,KACpF+Q,OACAL,oBAEA,SACA,CAEA,mBAEA,YADA,QAAgCM,KAChCC,QAGA9pE,mCAUA,mBAEA,QADA,QAAgC6pE,KAChCE,MACA,SAEA,QACA,uBACA,SAGA,YAAgChsE,WAAeA,IAC/C,sBACA,SAGA,QAEA,CAEA,QAEA,CA9BAisE,UAEA,iDACAC,UAKA,CAuBA,mBAEA,QADA,QAAgCJ,KAChCK,MACA,SAEA,QACA,eACA,aACA,SAGA,eACA,cACA,SAGA,sBACA,QAJA,CAQA,QACA,CAEA,QAEA,CAqBA,OA11DA,CAAiB1P,QAAQxxB,cA21DzBmhC,cACA,aACA3tE,uDACAA,gDACAA,+CACAA,mDACAA,+CACAA,iDACAA,uBACA,CACA,0CACA,WACA4tE,qBACAC,yCACAC,2CACAC,2CACAC,wCACAC,oCACAC,wCACAC,MAIA,cAHAnuE,0CACA,oCACA,GACA4tE,GACA,aACA7P,cAEAoQ,QACAnG,gDACAC,0BACAlK,cACA+H,gBALA9lE,0BAKAwnB,gCACA4mD,kEACArG,uBACAsG,yBAEA,CACA,SACA,EACAV,uCACA,SACA,KAEA,cADA3tE,2BACgDq8D,WAAoBA,IAEpEiS,EADAC,MACAC,EAGA,QACA,EACAb,6CACA,WACA,6BACA,8BACA,EACA,EACAA,2CACA,2BACAc,KACA,eACA,qBAAsDpS,aAAgBA,KAEtEoS,EADA77D,aAEA67D,MA15DA,CAAiBzQ,QAAQxxB,eA45DzBiiC,mBAGA,gBAEA,QADAnQ,SACA8E,oBAA+DA,aAAgBA,MAC/E,OACAqL,EADA77D,aAEA67D,uBAEA,CAEA,QACA,EACAd,6CACA,SACA,eACA,KACA,mBAA0DtR,WAAgBA,KAC1E,YACAqS,QACAA,UAEAA,aACA,CAGA,QACA,EACAf,0CACA,SACA,MACA,0FAGAgB,6CACAC,2CACAC,eACAC,QACAA,OACAC,yBACAC,wBACAC,kBACAC,mBAGA,EACA,gBACAL,MAEA,gBACAA,KAEA,CACA,QACA,EACAlB,CACA,CA1HA,GA2HA,mBACA,SACAwB,GACAC,UAEAC,GACAD,UAEA,OACA,UAEA,UACAhS,QAEAkS,CACA,CAQA,qBACA,IACA7nD,EACAvQ,EACAq4D,GACAC,GAmBA,OAlBAC,kBACAhoD,KAGAA,SACAvQ,SACAq4D,eAEAC,IACA/nD,KAdAioD,UAcAC,aAA4CC,cAC5C14D,eAEA,qBACA24D,IACAC,QAEAA,QAtkBA,eACA,SACA,gBACA,WACA,SACA7nC,wBAEA,CACA,kBACA,CA6jBA8nC,OACAF,SACAN,sBACA,OACA,2CACAM,EACA,OAGA,cACAA,EACA,SAEA,CAKA,qBACA,IAEAG,GACAC,GAHA5R,6CACA6R,MAGA,4BAIAA,iCACA1K,oBACA/B,oDACAyM,0BAGAD,MADAD,kBACA,GACAvoD,KACAyoD,mBAEAzoD,MACAyoD,sBAGAA,qBACA,OACAA,+BAnBAA,2BAuBAA,EACA,CAMA,mBAGA,SACAC,aACAC,IACAA,KACAC,wBAEA,EACAC,aACAF,IACAA,KACAG,GACAA,wBAGA,EACAt3D,SACAA,8BACAA,WAEA,CAEA,kBACA,aACA,CAEA,6BACAjZ,4BACA,EAEAwwE,yBACA,WACA79D,+DACA89D,OACAA,oBAEA,EACA,EAKAD,sBACA,WACA79D,+DACA+9D,6BACA,EACA,EACAF,CACA,CA3BA,GA0CAG,eAEA,aACA,8CACA,CACA,OAJAC,QAIAD,6BACA,8CAA4Dz5D,KAC5DlX,IACA,EAEA2wE,8BACA,oDAAkEz5D,KAClElX,IACA,EACA2wE,8BACA,uBACAE,uBAEA7wE,mBACA6wE,0BAEA7wE,IACA,EACA2wE,gCAEA,QADAzwE,KACAm8D,IAA6BA,mBAAuBA,IACpDn8D,oBAEA,kCACAF,IACA,EACA2wE,wCACA,uBACAG,0BAEA9wE,oBACA8wE,oCACA9wE,sBAEAA,IACA,EACA2wE,oCACA,oEACA3wE,oEACA,EACA2wE,CACA,CA9CA,CA8CKH,IACL,oBACA3S,iBACAkT,OACA,CACA,mBACA11D,EACAwiD,OACAA,6BACA,YACA,WAIAA,IAEA,CAOA,kBACA,oBACA79D,gBACAA,WACAA,oBACAA,iBACA,CAGA,oCACA,IACAgxE,wBADAhxE,cAEAm6D,wBACAn6D,mBACAA,gCAEAA,iBACAA,4BAEA,EAEAixE,2CAGA,QAFAC,KACAC,KACA9U,eAA4CA,WAAgBA,KAC5D,IACAlkD,GADA8qD,KACA9I,wBACA+W,kBACAC,kBACA,CACAnxE,aACAA,aACA,EAEAixE,yCAGA,QAFAG,KACAC,KACAhV,eAA4CA,WAAgBA,KAC5D,IACAlkD,GADA8qD,KACA9I,wBACAiX,iBACAC,mBACA,CACArxE,YACAA,cACA,EAGAixE,oCACA,IAGA1vE,EAHA2vE,aACAC,cACA5hE,WAEA,QAAwBhO,IAASA,IACjC,mBACA,QAGA,EAGA0vE,mCACA,IAGA1vE,EAHA6vE,YACAC,eACA9hE,WAEA,QAAwBhO,IAASA,IACjC,mBACA,QAGA,EAEA0vE,iCACA,mCACA,EAEAA,kCACA,mCACA,EACAA,CACA,CAjFA,GAwFAK,cACA,aACA,CACA,8CACA,oDACA,EACAA,wCACA,kDACA,EACAA,2CACA,+BACA,EACAA,6CACA,gCACA,EACAA,mCACA,4BACA,EACAA,qCACA,iDACA,EACAA,qCACA,6BACA,EACAA,sCACA,mDACA,EACAA,CACA,CA5BA,GA6BAC,eAEA,cACA,yBACA,cACAC,CACA,CACA,OANAZ,QAMAW,oCACA,wBACA,EACAA,qCACA,yBACA,EACAA,qCACAvxE,mBACA,EACAuxE,sCACAvxE,oBACA,EACAuxE,sCACA,0BACA,EACAA,uCACA,2BACA,EACAA,uCACA,2BACA,EACAA,sCACA,0BACA,EACAA,CACA,CAhCA,CAgCKD,IACLG,eAEA,aACA,8CACA,CACA,OAJAb,QAIAa,oCACA,yBACA,EACAA,qCACA,yBACA,EACAA,qCACAxxE,mCACA,EACAwxE,sCACAxxE,mCACA,EACAwxE,sCACA,2CACA,EACAA,uCACA,4CACA,EACAA,uCACA,4CACA,EACAA,sCACA,2CACA,EACAA,CACA,CA9BA,CA8BKH,IAKLI,eAEA,gBACA,4BACAvZ,4BACan4D,KACb,qBACAwxE,cACAA,kBACAA,CACA,CAEA,OAXAZ,QAWAc,6BACA1xE,uBACAA,oBACA,EACA0xE,+BACAC,UACA,EAGAD,qCACAnZ,WACAqZ,yBACAC,0BAEA,EAIAH,qCACA,qBACAG,iBACAC,+BACA,aACAF,YACA5xE,6BACA,mBAEA,aACA6xE,mBACA7xE,2BACA,mBAEAu4D,WAAkCqZ,yBAClC,EACAF,kCACAtY,sBACA,EACAsY,0CACA,iBACA,OACA75D,qBACAC,uBACAE,yBAEA,EACA05D,CACA,CA1DA,CA0DKH,IAELQ,cACA,cACA/xE,uBACAA,0BACA,CACA,kDACAA,yBACAA,mEAEA,EACA+xE,wCACA,MACAC,EACA,0BAEA,SADAC,QAA6CjyE,kBAC7CkyE,EACAD,wCAEAjyE,kBACA,MACA,QACAA,oBAEA,EACA+xE,gDACA,8BACA,6BACA5Z,OAEAA,CACA,EACA4Z,iCACA,0BACA,EACAA,qCACA,0BACA,SACA/xE,yBAEA,EACA,EACA+xE,iDACA,MACA,6CACA5Z,0CAEAn4D,uDAGA,EACA,EACA+xE,CACA,CApDA,GAqDAA,wBACAA,4BACAA,8BACAA,mCAEA,SACAI,cACA,gBAEAC,IACAzvD,aAEA3iB,sBACAA,eACAA,uBACAA,mBACAA,iBACAA,yBACAA,kCACA,CACA,sCACAA,mCAAsDA,+BACtD,EACAmyE,4BACA,8BACA,EACAA,qCACA,MAkBA,mBACA,SACAE,KACA,eACAz/D,sBACA0/D,uBAEAC,WAGAA,UACAF,MAGA,eACA,cACAA,KACA,KACA,CAEA,OAAiBA,0BACjB,CAvCAG,gBAAkDhrD,oDAClDxnB,aACAqyE,GACAryE,cAEA,EACAmyE,+BACA,EAEAA,+BACA,EACAA,CACA,CAjCA,GAkCAA,8BAiCA,mBAEA,kBACA,6BACA,cACAX,CACA,CACA,OANAZ,QAMA6B,+BACAC,+BACAf,UACA,EAmCAc,uCACA,WACA,EAGAA,2CACA,oBACApL,yBACA76B,4BACA,KACA,eACA,gCACA,SAIA,cACA,EACAimC,6CACA,6BACA,YACAE,2BAn5CA,iBACA,WAAiC1K,iBAA8B5J,EAC/D,CAo5CAuU,iBACA,EAIAH,0CAEA,OADAzyE,cACA6yE,oBACA,EACAJ,qDAEA,OADAzyE,cACA8yE,+BACA,EACAL,0CAEA,OADAzyE,cACA+yE,oBACA,EACAN,8CACA,oBACA,6CACA,gBAAgDpW,WAAoBA,KACpE,YACAr8D,mDACA,CACA8xC,yDACA4zB,WACAT,mBACAC,eACAvmB,SACA6mB,YAGA,CAEAnH,uBACAA,+CAEA,EACAoU,gDAEA,QADApU,gBACAhC,QAA4CA,WAAoBA,IAEhEgC,2BADAsH,SACAhnB,IAEA,0CACA,kBAAgDskB,aAAoBA,MACpE,OACAjjE,qCACA,CACA8xC,gBAHA6zB,WAGAqN,uCACAtN,WACA/mB,SACA6mB,YAGA,CAEA,EAGAiN,yCACA,8BACAzyE,yBACAizE,oBACAjzE,uCAGA,EACAyyE,0CACA,8BACA,gDACAQ,kBACAA,sBACAjzE,mBACA,EACAyyE,iCACA,+CACA,EACAA,oCACA,kCACA,EACAA,CACA,CAvJA,CAuJKN,IACLM,qDACAA,8DAEA,SACA,eACA,OACA5qC,gBACAqrC,gBACAC,wBACAC,sCACAC,4DACAC,wDACAC,0DACAC,8CACAC,4CACAC,kBACAC,kDACAC,kCACAC,kDACAC,0DACAC,oDACAC,kDACAC,kDACAC,gDACAC,gCACAC,sCACAC,4BACA/W,oCACAgX,wCACAC,8BACAC,0CACAC,gDAEA,CACA,kBACA,aACAz0E,YACAmzE,YACAC,mBACAC,8BACAC,4BACAC,6BACAC,uBACAC,sBACAC,SACAC,yBACAC,kBACAC,yBACAC,6BACAC,0BACAC,yBACAC,yBACAC,wBACAC,gBACAC,mBACAC,kBACA/W,kBACAgX,wBACAC,eACAC,yBACAC,yBAEAz0E,iBACA,CACA,mCACA,0BACAA,wBACA,qBAAmDq8D,WAAgBA,IAEnEr8D,SADAijE,MAGAjjE,WAKA,iBACA,OACAmzE,uCACAC,4DACAC,6FACAC,uFACAC,0FACAC,wEACAC,qEACAC,YAA8BgB,iBAC9Bf,8EACAC,4CACAC,8EACAC,0FACAC,iFACAC,8EACAE,2EACAD,8EACAE,mBAAqCO,+BACrCN,4DACAC,4CACA/W,yDACAgX,8DACAC,yCACAC,iEACAC,2BAA6CC,+CAE7C,CAhCAC,cACA,CACA,EACAC,CACA,CAzCA,GAwFAC,OACAT,iBAlBA,CACAU,eACAC,sBACA,wBACAloD,EAEArpB,wBACAqpB,SAEA,IACA,EACAmoD,oBACA3E,GACAvJ,8BAEA,MA+BAmO,OACAb,iBA1BA,CACAW,sBACA,2BACAloD,EAEA,4BACAA,SAEA,IACA,EACAmoD,sBACA,yBAEAE,GADAC,mBACAC,WACAhzE,8BACAsW,0BACA28D,oCACAC,gCACA7S,sBACa,YACb4N,GAA0BvJ,aAC1B,EAAayJ,EAEb,MAMA,uBAEA,WACA,SAFA7gC,mBAGAq7B,EA6BA,iBACA,WACA,4BACAwK,KACA,CAjCAC,MAGAlsB,QAEA,yBACAmsB,eACA,WACAA,uEAEAA,oBACA,+BACA,IACA,kCACAC,OAIA,CAHA,MAEAC,2BACA,MAGAA,qBAEA,EACAF,qBACAE,qBACA,EACAF,SACA,CAMA,eACA,SACA,eACAxtC,2DAEA,kBACA,CAEA,IA2BA2tC,OACAxB,iBA5BA,CACAW,sBACA,sBACAloD,GAAwBk+C,gBAExBl+C,8BACA,YAEA,OACAk+C,UACAr7B,uCACAmmC,0BACAC,wBACAC,oBACAC,8BAEA,EACAhB,sBACA,yBACAiB,EAWA,mBACA,IACAH,EACAC,EACAC,EACAE,GAJAzS,YAKAhkD,MACA,OACA,OADAq2D,kBAEAA,uBAGA,OADAC,gBAEAA,qBAGA,OADAC,qBAEAA,0BAKAE,GAFA,iCAEAjuD,gBAIAA,kBAEAm1C,UACA39C,2BACAA,yBACA,uBACAA,kBAEAA,EACA,CA9CA02D,uBACAC,kCACA/F,GAA0BvJ,mBAC1B,EAAa,cACbyJ,GAA0B8F,iBAC1B,EACA,MAiFAC,OACAhZ,gBAxCA,CACA9yC,sBACA,6BAQAhD,OAPA,CACAilD,gBACAF,aACAC,WACA+J,aACAC,YAEA,GAA4D7Z,GAC5D8Z,KACA,gBACA,gBACAA,KACA,KACA,CAEA,SACA,CACAC,8CACAvwD,gCACAwwD,0BACA,KACAtL,YAGA,IACA,EACA9N,uBACA,YAAsEn7D,oCACtE,SAWA,qBAKA,QAJAw0E,eACAC,cACA9K,QACA+K,MACAD,MACA,YAEA,IAEAD,uBAEAG,GADAxK,EACA9I,WAGAoT,EAEAC,aAEAD,SACA,CACA,SACA,CAhCAG,+BAGA,EAEA,MA6BAC,OACAxC,sBACAyC,qBACAC,SACA,EACAC,gBACAxtC,QAiCA,iBACAy0B,oBACA,KAhCA,iBAGA,QAFAgZ,2BACAC,KACAjb,QAA4CA,WAAsBA,KAGlE,QAFAztD,OACA2oE,MACAh2E,KAA4BA,YAA2BA,KACvD,uBACA81E,eACAE,MACA,KACA,CAEAA,IACAD,SAEA,CACA,kBAA4DrU,aAA8BA,KAE1F5E,YACAnnD,2BACAinD,SAHAqZ,OAGArZ,WAGA,kBAAkDiF,aAAyBA,KAE3E/E,iBADAoZ,OAGA,CAMA,IACAC,IACAC,4BACAC,+BACAC,qCACAC,4BAAsCpjB,OACtCqjB,sBACAlb,4BAEAmb,gBACAzD,eACA9nC,iBACAwrC,QACApgE,aACA68B,UACA58B,yBAEAogE,YACAC,eACAC,8BACA9N,YAEA+N,sBACAC,mBACAC,mBACAC,uBAEAC,gBACA3C,mBACAC,eACAC,yBACAvT,iBAGAiW,WACApX,UAIAqX,yBACAC,uBAEAC,uBACAC,cACAC,0BAEAC,gBAEAC,eACAC,0CAGAC,cACAC,0BACAC,kBAA4BzkB,2CAC5B0kB,sBACAC,sBACAC,mBACAC,wBAEAC,IACAzB,QACApgE,uBACA68B,UACA58B,eAEA6hE,aAEAhvD,6BACA2F,4BACAspD,kCACAC,mCAGAC,IACA,SACA,SACA,aACA,eAOAC,IACAlF,GACAI,GACAW,GACAU,GACAW,IAsBA+C,IACAC,UACAtlB,MACAulB,MACAC,OAEAC,UACAC,YACA1vD,YACA2F,YACAspD,qBACAC,qBACA/kB,YACAwlB,cACA1lB,cACAD,YACAD,UACA6lB,aAEAC,cACAC,qBACAC,sBACAC,wCAEA,eAWA,QAVAC,4BACAC,oCACAC,iCACAC,WACAC,MACAC,GAEAC,GACAC,OAEA9e,SAA0DA,YAA6BA,KACvF,aACA6e,aACA,CACA,OACAz3E,MACAm3E,cAEA,CACA,iBACA,2CAOA,iBACA,uBACA/tD,EAGA,iBACA,YAAwBtrB,WAAkBA,IAE1C,QADA0mC,sCACAp4B,WAAuCA,IAAOA,KAC9C,6BACA,QACA,WAEA,CAEA,WACA,CAdAurE,UACA,gBACA,CAPAC,MAHAC,qBAKA,CAkBA,mBACA,uCACAC,OACA,aACA,qBACA,CACAC,UACAC,QACA9mB,OACA+mB,4CACAnpE,UAEA,CAEA,kBACA,cACAvS,qBAAwCkT,GACxClT,yBACAA,cACA,CACA,mCACAo9D,qBACAp9D,cACA,EACA27E,mCACAve,4BACAp9D,cACA,EACA27E,8BACA37E,iBACAA,cACA,EAGA27E,+BAEA,SACA37E,iEACAshE,KACAthE,8DACA47E,QACAC,qCAGAC,UAFAC,GACA/7E,oDACA05E,MACA15E,mBACAA,sBACAA,cAnJA,eACA,eACA,CAiJAg8E,EACAtE,GACAoE,EACAD,EACA77E,eACAA,uBAEA,EACA27E,CACA,CA1CA,GA4CAM,OACA,iBACAA,OACA,CAwBAC,WApBA,WACA,aACA,CACA,6CACA,yBACA,EACAC,uCACA,sBACA,EACAA,qCACA,qBACA,EACAA,sCACA,YACA,EACAA,sCACA,YACA,EACAA,CACA,CAnBA,IAsBA,sCACAC,uCACA,eACA,WACAC,KACAttE,aACAA,KACAstE,SAEAjzB,gBAGAA,sCACA,OACAwZ,EADAvkD,EACA,GAGA,mBACAm8C,oCAEA,EACA,GAAiB,KAGjB,kBACA,aAGA,CACAmI,SACA0Z,oBACAzZ,kBALA,IAOA,CAEA,kBACA,cACA,+BACA0Z,yBACAC,yBACAv8E,mDAEAA,0DACAA,oBApEA,eACA,gBACA,CAkEAw8E,mBACAx8E,qBACAA,+BACAA,+BACA,iCACAA,eACAA,gBAEA,8BACAA,yBAEA,6CACAA,6CAEAA,wEACAA,gCACA,CAEA,4CACA,+BACA,gBACA,KAEAioB,QACA,EACAw0D,uCACA,6BACAz8E,6CAKA66D,gBAEA,EACA4hB,yCACA,sBACA,qBAEA,WAaA,MAZA,mBACA9Z,4BAEA/zD,mBACAA,cACA6G,WACAktD,8BAGAn/D,mBACAm/D,SAEA,gBAGA,CAAqBA,8CAFrB,IAGA,EACA8Z,8BACA,YACA,YACA,YAEA,eACAzY,OACA,iCACAhkE,sBACA2iE,8DAGAqB,oBAGA,CAAqBrB,2DACrB,EAEA8Z,gCACA,2CACA,EACAA,iCACA,4CACA,EAEAA,8BACA,2CACA,qBACA5tE,eACAA,aACAA,qBACA7O,oCACA,EACAy8E,mCACA,2CACA,qBACA5tE,eACAA,aACAA,qBACA7O,oCACA,EACAy8E,mCACA,2CACA,eACAz8E,oCACA,EACAy8E,oCACA,2CACA,eACAz8E,oCACA,EAEAy8E,yCACA,0BACA,sBACAC,uCACAA,0CACAA,sCAEA,IACA,EACAD,0CACA,0BACA,sBACAC,sCACAA,wCACA,2CAEA,IACA,EAEAD,4CACA,+BACA,gBACA,CAAyB5rB,qBAGzB,QADA8rB,6BAEA,CAAyB9rB,sBAGzB,QADA8rB,WAEA,CAAyB9rB,qBAGzB,QADA8rB,WAEA,CAAyB9rB,qBAEzB8rB,EAz7IA,iBACA,oCACA,CAu7IAC,MACAC,MACA,CAAyBhsB,sBAEzB8rB,EA17IA,iBACA,mCACA,CAw7IAG,MACAD,MACA,CAAyBhsB,wBAEzB8rB,EA37IA,iBACA,mCACA,CAy7IAI,MACAF,MACA,CAAyBhsB,uBAEzB,CAAqBA,oDACrB,EACA4rB,kDAEA,MACA,gBAEA,QADAzyC,4BAEAA,EAzuIA,eACA,gBACA,CAuuIAgzC,IAGA55E,UAEA,QADA4mC,6BAEAA,EA5uIA,eACA,eACA,CA0uIAizC,IAGA75E,QAEA,QADA4mC,WAEAA,SAGAkzC,8BACA,EAEAT,kCACA,iBACAz8E,oBAEA,YACAA,qBAEA,WACAA,oBAEA,UACAm9E,MAEA,WAn8IA,eACA,WACApuE,mBACAA,gBACAA,eACAA,iBAEA,CA67IAquE,IAEA,aA97IA,eACA,WACAruE,mBACAA,gBACAA,eACAA,gBACAA,mBAEA,CAu7IAsuE,IAEA,aAx7IA,eACA,WACAtuE,mBACAA,gBACAA,eACAA,gBACAA,kBACAA,mBAEA,CAg7IAuuE,SADA,CAGA,EACAb,oCACA,0CACAz8E,sCAEA,EACAy8E,qCACA,0CACAz8E,qCACAA,uCAEA,EACAy8E,oCACA,0CACAz8E,qCACAA,sCACA+O,iDAEA,EAEA0tE,0CACA,2BACAz8E,oCAt8IA,mBACA,yBACA6C,cACA,OACA,qBAEA,oBACA,YACAkwB,cAEAlwB,CACA,CA87IA06E,6BAEA,EAEAd,mCACA,oBAA0Ce,MAC1CjuD,UACAozC,SACAC,iCACA4a,YACAx9E,yBACaA,KACb,EACAy8E,0CACA,oBAA0Ce,MAC1CA,mBACA9kE,YAEA6W,eACAozC,SACAC,sCACA4a,iBACAx9E,yBACa,CACb2iE,SACAC,oCACA4a,eACAx9E,yBACaA,KACb,EACAy8E,yCACA,QAA2CgB,MAC3C,WACA,8BAEA7a,EADA,kBACA6a,YAGAz9E,yBAzpGA,wBACA,QAAwC09E,MACxC,sBACA,8BACAA,IACAr6E,8BAEAA,cACA,QACAA,oBAEA,QACAA,4BAIAA,CACA,CA2oGAs6E,gBACA,EAEAlB,0CACA,8BACA5hB,oBAEA,8CAIAA,+CAHA,WAKA,EACA4hB,wCACA,+BACAmB,8BAEA,sBACA,EAEA59E,uBACAA,6CAEA,IACA,EAEAy8E,iCACA,8BACAmB,UAEA,sBACA,sBAEA59E,uBAIA,qBACA,qDAJA,4BAOA,EACAy8E,CACA,CAnUA,GAqUAoB,IACAh2C,UACAojC,sBACA6S,4BACAzN,iBACAE,kBAEAwN,KACA,iBAEA,OADA1f,qCACA2f,0BACA,CACA,iBAEA,QADAhgB,uCACAz8D,aAAsCA,KAAQA,KAC9C,IACA0mB,EADA+1C,KACA+W,aACA,MACA,iCAAkF9sD,OAClF,oBACAhP,CACA,CACA,CACA,WACA,CACA,qBACA,SACAuO,aAA4D2jD,GAC5DM,KACAvI,aACA,uBACA17C,mBACAA,kBACAA,4BACAA,wBACAA,gBACAA,SACAA,QACAA,kBACAA,CACA,CAgCA,SAiBA,mBACA,6BACA,OAGA,mBACA,gBAIA62C,wBACA2f,cACAC,4BACAA,wBANAD,eAQA,CAbAE,OACA,GAASD,IACT,CAYA,qBACA,SACA,gBACA,WAEAE,KADAC,KACAC,UAGA5rE,CAEA,CACA,QACA,CACA,mBACA,0DACAm0D,eACA,gBACAoX,cACA3f,WACApjD,SACS,YACT,IAEAqjE,GACAC,GAHAzX,cACA0X,+BAGAR,YACAO,uBAEAC,KACAF,gBAGAjgB,YACAnnD,sBACAinD,oBACAyI,UACAqX,aACAnX,UANAA,aAQA,EAAS,YACT,kCACAjqD,0BACAmhE,WACAA,aAEAS,GACAA,KAEApgB,YACAnnD,2BACAinD,oBACAyI,UACAqX,aACAS,SAEA,GACAthB,MAA0B4gB,GAAiBW,+BAC3C,CAgBA,kBACA,gBACA3+E,gBACAA,uBACAA,uBACAA,gBACAA,qBACA,CAIA,2CACA,mBACA4+E,6CACAC,iBACA,uBACA,EAEAC,oCACA,mBACAC,wCACAF,iBACA,sBACA,EAIAC,kCAEA,MACAxG,EACAC,EACAyG,GACAC,GACAC,GACAC,GACAC,GACA,YATA,QAA2CC,MAS3CC,yBACAA,yBACAD,IACAE,EA1yHA,iBACA,gCACAtkE,QAEA,sBACA,4BAEAwM,CACA,CAkyHA+3D,OAEAR,mCACAC,2CACAC,mEAEAC,GADAD,2BAEAl/E,mCACAm/E,oBAEA7G,2BACAC,2BAEA4G,MADAA,kCACAG,GAGAF,kBACA,CAGAE,aAGAG,sBAEAC,yBACAT,iBAGAE,eAGAD,eAEA5G,UAEAC,UACA6G,WAEAO,mDAGA,EAIAb,uCACA,iEACA,CAAkB18E,oBAClB,EAKA08E,gDACA,IAIAc,GAJAC,+BACA15D,OACA0qC,QACA51C,QAEA,kBAGAA,mCAFAkL,aACA0qC,oBAGA+uB,2BACA/uB,SACA51C,yCAEAA,oCACA41C,8CAIAA,MADA1qC,8BACA0qC,KACA51C,0CAEA,CAAqBkL,4BACrB,EACA24D,2CACA,WAAoCpqB,OACpC,EAGAoqB,8CACA,mBACA18E,UACAsW,QACA,sDAEAonE,UACA19E,QACAA,cAGA09E,UAEApnE,KADAA,SACA,GACAA,eAGA,CAAqBtW,cACrB,EAGA08E,qDACA,IAEAiB,GACAC,GACA59E,GACAsW,GACAO,GANAwqD,eACArZ,6BA8BA,cACAhoD,kBACAsW,eACAO,IAAwB7W,gBACxB,CACA,OA5BAgoD,KACA21B,gCAEAC,UAGA51B,EADA61B,aACAC,oBAGArvB,GAIAzG,KAIA01B,UACA9/E,uBAEAoC,MADAA,+BASA+9E,KAEAngF,0BACAynB,2BACA04D,MAEAlnE,EACA,EAEA6lE,mDACA,IAIApmE,GAHA0nE,6BACAC,IACAj+E,KAEAg+E,IACAh+E,GANApC,aAMAwyC,eAEApwC,UAEAsW,GADAtW,6BAEA,GACAsW,YACA1Y,sBACAqgF,UAEcA,KACd,OAAqBj+E,gBACrB,EAGA08E,gDACA,IACAwB,qCADAtgF,aACAugF,WACA,qCAGAD,EAFA,IAGA,EAIAxB,6CACA,QACA,EAGAA,2CACA,IACAsB,EADAL,6BAEA,SACA9iB,OAEAmjB,8BACAnjB,QAEArgD,GAIAqgD,IAAwChC,QAExC,EAIA6jB,uCAEA,QADA0B,KACAnkB,IAA6BA,mBAAuBA,IACpDmkB,oBAEA,sBACA,6BACAtvE,mBAEAA,IACAA,sBAEAA,IACAA,SAEAA,CACA,EAIA4tE,sCACA,IAGAv9E,EAHAk/E,8BACAC,KACAC,IAKA,KAHA,2BACAF,YAEAl/E,IAAwBA,IAAOA,KAC/Bm/E,yBACAC,IAGA,MACA,sCAEA3gF,sBACA,EAGA8+E,uCACA,cACApmE,QAOA,OANAtW,IACAA,0BAEAsW,IACAA,gCAEA,sBACA,CAAyBtW,eAEzB,IACA,EAGA08E,oCACA,2BACApqB,iBAEA10D,uBACA,EAMA8+E,2CAGA,SAFA,QAAkC8B,UAClC,QAA0CC,MAC1C7gF,mDACAynB,UAEA,QACA,EACAq3D,CACA,CApUA,GA6UA,mBAMA,QALAgC,EAYA,iBACA,MACA,kBADAC,OAEAA,WAEAC,CAEA,CAnBAC,eACA5Z,EAmBA,uBACA,MACA,mBACA,OACA6Z,4CACA,UACA,OACAA,4CACA,UACA,aACArC,gBACAsC,mCACAD,4DAGA,UACA,gBACA,iCACA,MACA,kBACA,6FACA,2CAEAA,qCAIA,WACAA,WACArC,GAzDA,iBACA,wCACAuC,+BACA5a,yBACAA,uBACA,CAoDA6a,MAIAxC,EAHAqC,CAKA,CAtDAI,oCACAlK,EAxdA,qBACA,mBACA,oBACA,OA4BA,qBAEA,QADAvZ,KACAxB,QAA8CA,WAAuBA,KACrE,YACAwB,iBACA,CACA,WACAA,aAEAT,MAA0BmkB,IAC1B,CAtCAC,yCACA,sBACA,OAqCA,iBACA,wBACA,qBACA,EACA,CAzCAC,mBACA,WACA,WACA,eACA,gBACA,SACAC,sBAGAtK,MAEA,0BACA,kBACA,wBACAuK,gBA+GA,iBACA,wBACA,cACA,EACA,CAlHAC,kCACA,qBACA,sBACA,OAkGA,qBACA,MACA5D,OACA,UACApX,oBACAxJ,MAA8BykB,UAAsB1jB,SAA4B6f,GAAiBW,6BAA2C1b,IAE5I4e,CACA,CA1GAC,0CACA,2BACA,iBAEA,SAEA,CA2bAC,uBACAC,QAAmC5Z,GAAW0Y,WAC9CzZ,4RACAhL,sCAAoEA,aAAgBA,KAEpF2lB,KADA/e,QACA+e,OAGA,QACA,CA6CA,mBACA,mBACA,WACA,OACA,4BAIAzC,EAHAlY,yBAKA,eACA,gBACA,sBACA,2CACAA,qBAGA4a,UAGA,SAEA,CACA,mBACA,mBACA,eACA,uBACA,iBACA,oBAEA,SAEA,CACA,iBACA,mBACA,eACA,6BACA,iBACA,iBAEA,SAEA,CACA,qBACA,mBACA,iBACA,cACA,OACAlT,gCACAC,8BACAC,kBACAC,mBACA,IACA,mBACA,oBAEA,SAEA,CACA,qBACA,mBACA,mBACA,cACA,OACAH,gCACAC,8BACAC,kBACAC,mBACA,IACA,qBACA,oBAEA,SAEA,CACA,eACA,QACA,eACAkI,iBACA8K,IAGA,QACA,CAEA,QACA9/E,WACAsW,SACAirD,gBA+EA,mBACA,UAAkC2G,aAAiB,GACnDkE,YACAnQ,GACA,OACAqG,MACAxB,WACA5E,6BACArjD,cACAgqD,WACAC,SAEA,CAaA,qBACA,QACA,YAEA,MAMA,qBACA,WACAid,OACAC,eACA,6BACAD,0BACA,EACAE,cACAC,mBACAA,SACAA,GACAC,UACAA,UAEA,4BAIA,OAHAF,SACAA,aAEAA,GAGA,CACAnrE,OACAsrE,SACAtkE,eAAiCukE,kBAAoCC,gBACrExvE,gBAAkCuvE,mBAAqCN,iBANvE,IAQA,CAjCAQ,UACA,WACA9kB,QAEA+kB,CACA,CA6BA,iBACA,yCACA,gBACA,WAEA,kCACA,QAEA,CACA,QACA,CAEA,eACA,eACA,CACA,QACA1rE,YACAsrE,YAEA,eACA,uBACA5zE,GAAsB4zE,UAEtB,SACAh7D,aAAyDjV,GACzD,OACA+vE,iBACAE,cACAjwE,UAEA,CA6DA,mBAEA,gBACA,2BACA,2DACAi/D,wDACAA,sEACAA,wDACAA,sDACAA,sDACAA,eAA8CrZ,4BAC9CqZ,CACA,CACA,OAZAZ,QAYAiS,+BACAnQ,+BACA1yE,8BACA2xE,UACA,EACAkR,+BACA7iF,6BACAA,2BACAA,yCACAA,oCACAA,kCACAA,iCACA,EACA6iF,qCACA,cACA7iF,yBACAy4D,uCACAA,2CACAA,wCACA,EACAoqB,sCACA7iF,oBACA,EACA6iF,wCACA,WACAC,8BACAC,qBACAC,gBACAC,aAAmD9qB,oBACnD+qB,iCACAC,+BACAC,8BACA,UACAC,qCACA,IAEAC,GAFAC,MACAC,MAmEA,GAjEAC,sCACA,OACA5D,GACA6D,GACAC,GACAtJ,GACAuJ,GACAC,GACAC,GACAC,GACA,cACAR,8BACAC,SAGAQ,YACAN,gBACAM,UACAA,oBAEA,GACAL,qCACAA,yBACAtJ,cAEAwF,YACArO,4BACAkS,cACArlB,iBACA,GACAgc,4BACAsJ,yBACAtJ,0BAEAhc,SACAqlB,cACArlB,QACA,GACAgc,aACAsJ,yBACAtJ,YAGAqJ,KACAG,IACA,mBACAf,sBAEAzI,IACAuJ,UACAG,OAEAJ,KACAC,kCACAG,4BAEAD,KACA,iDACAC,GACA,qBACAzjE,6BACAijE,aAGA,GACAA,aACAD,iCACA,iCACAE,QACAF,qBAEA7qB,SACAwqB,kBACA,MAEAxqB,QAEA,GAEAwqB,EACA,EACAJ,oCACA7iF,mCACA,EACA6iF,mCACA7iF,kCACA,EACA6iF,mCACA7iF,kCACA,EACA6iF,oCACAoB,oCACAC,aACA,EACA,EACArB,2CACA,0CACAoB,wCACAjS,2CACA8R,mBAGAA,qBAEA,EACA,EACAjB,8CACAoB,kDACAH,aACA,EACA,EACAjB,CACA,CAlKA,CAkKK1Q,IAELgS,eAEA,gBACA,2BACA3S,uCACAA,mCACAA,OACA4S,0BAA0EjsB,iCAE1E,QADAkG,aACAhC,mDAAsFA,YAAgBA,KAEtGgoB,EADAphB,OACAuO,eAEA,gCACAA,sBACAA,qCACA,wBACA,GACAA,CACA,CACA,OAnBAZ,QAmBAuT,+BACAnkF,aACAA,sBAEAA,aACAA,sBAEAA,WACAA,oBAEA2xE,kBACA3xE,4BACA0yE,8BACA,EACAyR,2CACA,wBACAG,wBACAC,gCACAC,GACAC,YACAA,SACAA,WAGAA,eACAA,YACAA,YAEA,EACAN,+BACAnkF,oBACA,0DACAA,sFACAA,qBACAA,kBACAA,iBACA,EACAmkF,+CACA,0BACAO,sBACAC,0BACAC,eACAC,oBACAC,oBACAC,IACAxzD,QACAyzD,oBACAC,kDACAC,yBACAC,0BAEAC,IACAplF,cACAA,qDACAokF,2BAEApkF,6BAAoDmd,WAAsB4nE,MAE1E/kF,cACAA,sBACAA,kBAEA0kF,IACA1kF,cACAA,qDACAy4D,2BAEAz4D,6BAAoDmd,WAAsB4nE,MAE1E/kF,cACAA,sBACAA,iBAEA,EACAmkF,qCACA,gBACAtE,sCACAra,kBAaAA,8BAZAA,GACAA,YAEAA,yBACAnH,uBACAmH,UACA/B,qBACAqf,iBACAvwE,mBACiBstE,qBAKjBra,UAYA,QAXA6f,IACAhe,0BACAW,+DACAjK,wBACA+H,4BACAmC,8BACAmG,gCACArG,sBACAsG,2BAGAhS,QADAr8D,uFAC4Dq8D,aAA4BA,KAExFe,MADAkoB,OACAC,qBAEA/f,kBACA,EAGA2e,wCACA,QAAuCqB,MACvC,gBACAA,GACAhgB,8BAEAggB,6BACAxlF,yBAEAwlE,kDACAA,uBACAA,cACA,EACA2e,yCACA,oBACAsB,kBACAC,yBACA1lF,yCAEAA,gBADA,mBACA0lF,EAEA,qBACAA,IAEA,mBACAD,6BAEA,qBACAA,+BAEA,aACAzlF,2DAGA+yB,sCACAA,kCAEA,EACAoxD,2CACA,QACA,qBACAnqE,sBAEAha,cACAga,sBAEAA,CACA,EAGAmqE,oCACA5rB,WACAv+C,4BACA+/C,mBAEA,EACAoqB,kCACA5rB,WACAv+C,UACA+/C,aAEA,EACAoqB,CACA,CAnMA,CAmMKhS,IAIL,iBACA,MAEA,OACAl3D,EADA,0CACAosD,eAGAA,cAEArnE,yDAIA,eACA,yBACA,cACA,OAAqB80D,gBAErB,eACA,OAAqBA,6BAGrB,kDACA,qBAEA,CAAyBA,4CAIzB,CAAyBA,0CAGzB,CAvBA6wB,4BAAgLC,gCAChL,CAyBA,eACA,yBACA,YACA,EACA,CAEA,kBACA,cACA5lF,0BACA,CACA,sCACA,EACA6lF,CACA,CAPA,GAsBAC,MAKAC,eAEA,cACA,2BACAvU,+BACA,mBACA7L,SACA,OACA+J,+BAGA,iCACA3E,0CACA2E,iCACA,CACA/wB,KACA7M,mEACAk0C,UACAxgB,gBAGAuF,0BACA9qE,wBAEA,CACA,EACA,kBACA,uFACAuxE,CACA,CACA,OA7BAZ,QA6BAmV,CACA,CA/BA,CA+BKF,IAMLI,eAEA,cACA,2BAEAzU,kCACA7yB,oBACA6yB,qCAEA,EACAA,+BACA0U,QACAC,yCACA3U,iBACAA,sCAEA,EACAA,+BACAA,iBACA2U,4CACA3U,oBACAA,sCAEA,EACA,kBACA,8BAzgMA,qBACA,MACA,wCACA,UACA4U,IACAC,OACA,oBACAD,OACAE,QACA3rB,sCACA,EAEAA,mCACA,CACA,EACA,CA0/LA4rB,6EACA7W,qDACA8B,CACA,CACA,OA5BAZ,QA4BAqV,+BACAjmF,4BACAA,qEACA,EACAimF,yCACA,qBACAtgB,UACAjL,kCACAgV,qBACA,CACA/wB,KACA7M,6EACAk0C,UACAxgB,cAIA,EACAygB,CACA,CAhDA,CAgDKJ,IAELW,eAEA,aACA,8CACA,CACA,OAJA5V,QAIA4V,CACA,CANA,CAMKzU,IACLyU,sBACAC,qBACAC,gCACAC,kCACAC,8BACAC,qCACAC,gCACAC,iCACAC,mCAEAC,6BACAC,2BAEAC,8BAEAX,qCACAA,0BACAY,kBACAz8D,4BACA2F,6BACAspD,iCACAC,mCAEA2M,8CACAA,mDACAA,2CAEA,kBACA,gBACA,WACAxmF,4BACAA,wBACAA,yBACAA,uBACAA,6DACAA,yDACAA,oCACAA,8BACAA,0BACAA,oBACAA,mBAEAA,sBACAA,0BACAA,oBACAA,2BACAA,iCACAA,4BACAA,sBACAA,uBACAA,wBACAA,UACAA,kCACAA,yBAEAA,+DACAA,iDACAA,8BACAA,eACAA,uEACAyD,gBACA,eACA,EACA,CACA,+CAEA,QADA4jF,EA/9DA,eAEA,QADAz9C,KACAyyB,QAAwDA,WAA4BA,KACpF,WACA,uBACA,2BACAp8D,UAIA2pC,0BAHA/sB,6CAKA,MAEA+sB,SAEA,CACA,mBACA,CA68DA09C,IACAjrB,QAAwDA,WAA0BA,IAElFr8D,sBADAunF,KAGA,EACA50E,0CAEAkB,eACA,8CACA,EACAQ,cACAwE,kBAIA2uE,8BACAxnF,eAMAA,0BALAA,0BAjpKA,CAAiBg+D,QAAQxxB,cAkpKzBxsC,oBACAA,qBAKA,EACAwnF,+BACA,mBACAxnF,sBACAA,yBACAA,oBACA,wCAAiEq8D,WAAgBA,IACjF4G,KACAxyB,UAEAzwC,kCACA,CACA,EAGAwnF,oCACA,WAEAxnF,2EACA,kCACAyvE,qBACA,gBACAgY,yBACA3G,UAEA4G,uCACA,sBACAA,mBAGA,sBACA5G,OAEAtP,eAEA,GACAxxE,gCACAC,2DACAD,4DAEA,EACAwnF,sCACAxnF,6BACAA,yBACAC,4DACAD,4BAEA,EAGAwnF,+BACA,WACAxnF,oCACA,mCACA2nF,qBACA3kC,KACA2kC,GACAC,aAEA,gBAAwDvrB,WAA0BA,KAClF,IACA5pD,MADAo1E,KACA7nF,MACAyS,IACAuwC,UAEA,CACAhjD,+BACAwxE,YAAiCt6D,cACjCs6D,YAAiCt6D,qCACjCs6D,YACAt6D,qBACA4pE,iEAEA,EACA,EACA0G,yCACA,OACA1G,cACAgH,eACAC,0BACAxI,kCACAlY,iBACA+P,gBACArZ,WA3uKA,CAAiBC,QAAQxxB,cA4uKzBy7B,mBACAmG,kBACArG,eACAsG,iBAEA,EACAmZ,iCAEA,GADAxnF,0BACAA,iBACAA,mBAEA,QADAgoF,aACAhoF,yBACAA,iEAEA,iBACAA,oBACAgoF,+BACAhoF,qCAEAgoF,iCACAhoF,qCAEA,2CACAgoF,sDACAA,eACAhoF,0BAGAgoF,yDACAA,kBACAhoF,qCACA,CACAwlE,OACA7mB,WAIA3+C,yBAEAgoF,mDACAA,eACAhoF,4CACA,CACAwlE,OACA7mB,WAIA3+C,uBAEAA,sBACA,CACA,EACAwnF,mCACA,gBACA,EAGAA,6CACA,QAAwCS,MACxCjoF,sBACAA,iDACAA,sBACA,EACAwnF,mCACAxnF,gBACAA,qBACAA,2BACAA,kBAEAA,oBAEA,EACAwnF,uCACAxnF,2BACAg8D,IACAh8D,2BACAA,oBACAA,sBAEA,EAGAwnF,qCACA,6BAEAxnF,sBACAA,0BACAA,oBACAA,wBACAA,oBAEAA,oBACAA,sBAEA,EAIAwnF,wCACA,kCACA1G,aACAjB,oBACAqI,kCACA,MACA,kDAIA,iCACA9f,kEACApoE,0BACAooE,aACA+f,0CACAC,6CACAtiB,4DACAmiB,SACAvY,IACAA,iBACAA,aAEAA,yBACArR,cACAmH,UACA/B,qBACAqf,iBACAvwE,sCACiBvS,UAEjB0vE,qBAA8CtH,GAAWyX,uOACzDqI,IACAxY,0BAEA1vE,qBACAA,sBACAA,2CACA,CACAwlE,YACA7mB,iBAIA3+C,sBACAA,uBACAA,oCACA,CACAwlE,YACA7mB,iBAIA3+C,uBACAA,yBAEAA,iCACA,EAMAwnF,qCACA,WACAa,+CACAC,gCACAC,KACAC,KACAC,MACA,gBACAJ,QACAE,aAGA,gBACAF,MACAI,aAGAD,YAGAxoF,+BAQA,cAxlHA,iBACA,eACA,aACA,SAGA,QACA,CA0kHA0oF,MACAlX,4BAGAA,iBAhmHA,wBACA,QAAgCnE,KAChC,SACA,kBACA1wD,UACAgsE,qBACA1vE,WAGA,QACA,CAslHA2vE,OAGAH,GACAJ,eAEA,EACA,EAIAb,mCACA,WACAa,+CACAG,KACAC,KACA,eACAJ,KACAI,UAGAD,UAGAxoF,+BAGA,cAFAwxE,oBAEAiX,EACAJ,cAEA,EACA,EACAb,yCACA,WACAqB,eACAC,KACAC,KACAC,MACA,gBACA,gDACAD,KAEA,yCAEAC,MACA,kBACAF,OAIA,aACAE,MACAhpF,8BAEA,cACAA,kCAGAA,2BAEAgpF,KACAhpF,iDACAA,0BACAA,+BACA8oF,GACAtX,YACAt6D,uBACA2xE,eAOArX,YACAt6D,qBACA4pE,2BAEA,IAEAiI,GACA/oF,iBAEA,EACAwnF,oCACA,MACAxnF,4BAAwCw9D,kBACxC,EACAgqB,kCACA,sCACA,EACAA,4BACA,sCACA,EACAA,gCACA,yBACA,EACAA,gCACA,kDACA,EAIAA,sCACA,WACAyB,0BACAjpF,iEACAA,+DACAA,gEACAA,8BACA,sCACAA,+BACA,sDACAA,gIACAA,kDAEAA,eApiCA,iBACA,YACAkpF,wBACAC,EApFA,iBACA,IACArI,EADAjjB,KAEA,WACAurB,YAEA,WACAA,YAEA,QACA,CA0EAC,MACA,wBACA,OAGA,mBACA,4BACAzG,qBACAG,6BACAA,qBACA58D,OACAmjE,KACAC,KACAC,MACA,OACArjE,SACA,CACA,oBACAmjE,UACA,eACAC,IACAC,wBAEA,CAEA,oBACA,yBACAC,4BACA,8BACAC,OAEA,iBACAA,WAEA,YACAA,WADA,CAGA,EACA,OACAxyE,YACAsrE,cACAr8D,WACAmjE,eACAC,aACAh3E,cAAgCmlE,4FAChCiS,2CACAC,iBACAhH,uBACAiH,wCACAD,mBACAhH,uBACAgH,QACAhH,OAEA,CApDAkH,OACA,EACA,CA6hCAC,8BAEA/pF,yDACA,2DACA,EACA,EACAwnF,+CACA,4CACA,EACAA,8CACA,0BACA,EACAA,gDACA,oBACAwC,QAAqCA,GAAaC,oBAElDC,kBACA,EAGA1C,0CACA,4BACAxnF,WACA,EACAwnF,0CACA,kBAEA,GADAxnF,2BACAmqF,EACA,sBAEA,EACA3C,qDACA,gCACA4C,wBACA,EACA5C,kDACA,+BACA,eACA,mBAAmEnrB,WAAgBA,IAEnFr8D,uBADAijE,MAIAjjE,2BACA,EAIAwnF,wCACA,iCACA,EACAA,qCACA,WACA6C,IACAA,gBACArqF,gCAAqDsgF,iBACrDtgF,kDAGAynF,gCAGAznF,gBACAA,eACAkX,qBACA4pE,WACA2G,cAEA,EAIAD,iCACA,MAEA8C,iBADAxJ,aAEA9gF,wBACAA,gBAEAA,cADAsqF,EACA,CACApzE,qBACA4pE,gBACA2G,cAIA,CACAvwE,gBACAuwE,cAGA,EAGAD,wCACA,MACAjmF,EACA+oF,EAGA,aADAC,yCACAvqF,eACAuqF,UAEA,QAAwBhpF,WAAsBA,IAE9C,IADA+oF,yBAEAA,iBACA,QAIA,EAGA9C,sCACA,8BAEA,eACAxnF,6BAGAA,aAEA,EACAwnF,4BACAxnF,gBACAA,eAA4BkX,aAC5B,EACAswE,4BACAxnF,gBACAA,eAA4BkX,aAC5B,EACAswE,gCACAxnF,gBACAA,eACAkX,gBACAuwE,6DAEA,EACAD,gCACAxnF,gBACAA,eACAkX,gBACAuwE,4DAEA,EACAD,6BACAxnF,gBACAA,eACAkX,gBACAuwE,0BAEA,EACAD,iCACAxnF,gBACAA,eACAkX,gBACAuwE,yCAEA,EACAD,sCACA,YACA73D,IACA3vB,gBACAA,eACAkX,gBACAuwE,wDAGA,EAEAD,+BACA,kDACA,EAGAA,qCACA,mBACA,wCACA,EAEAA,wCACA,mBACA,mGACA,EACAA,oCACA,mBACA,sCAAgE5X,YAChE,EAGA4X,sCACAxnF,6BACAA,gBACA06D,oBAEA16D,+BACAA,kBACAA,iDACAA,+BAEA,EACAwnF,kCACAxnF,gBACAA,6BAEA,EAGAwnF,uDACA,MA/xBA,iBACA,OACA9X,YACA/wB,QACA6rC,wDAEA,CAyxBAC,MAMAC,EALA,CACA3E,GACAE,IAEA0E,sDACAlnF,iBACA,gBACA,GACAzD,gCACA8lF,WACA,EACA0B,uDACA,4CAAyEnrB,WAAgBA,IACzF4G,KACAxyB,iBAEAzwC,qCACA8lF,SACA,EAKA0B,iCACA,IAkBAhe,EA78CA,mBACA,MAmBA,iBACA,SACAxG,aAA+DyH,GAC/DkB,2CACAC,uCACAjI,WACA,iBACAA,4BACAiI,yBAGAnB,SACAroE,sBACAsW,qBAEA+xD,WACAA,CACA,CApCAmgB,MACA3vE,UACA,YACA,YAEA,WACA,WACA,YAGAA,sBAEA,CACA,QACA,CA87CA4vE,CAjBA,QACA,cACAC,EAGA,CACA1oF,QACAsW,UAKA,CACAtW,QACAsW,OAGA1Y,iBAAyFi7D,UAEzFuO,IACAxpE,eAAgCkX,kCAChClX,0BAEA,EAEAwnF,iCACAxnF,2BACAA,eAAgCkX,wBAChClX,4BAEA,EACAwnF,4CACA,+BACArS,6BACAA,iBACAn1E,kCACA,EACAwnF,4CACAxnF,iCACA,CACAgmF,2BACAxgB,iBAGA,EAEAgiB,+CACA,gCACArS,UACAA,YACAA,SACAn1E,qCACA,EACAwnF,0CAEA,QADAhgE,KACA60C,kDAA+EA,WAAgBA,IAE/Fe,QADA6F,MACAuL,SAEA,YAj7CA,iBACA,OACA/mD,6BACAsjE,mCAA2Dnb,oBAC3DjM,gBAEA,CA26CAqnB,kBACAxjE,CACA,EACAggE,yCAEA,QADAhgE,KACA60C,iDAA8EA,WAAgBA,IAE9Fe,QADA6F,MACAuL,SAEA,YAn8CA,iBACA,OACApsE,8BACAsW,0BACA28D,oCAA4DzF,oBAC5D0F,gCAAwD1F,oBACxDjM,gBAEA,CA27CAsnB,kBACAzjE,CACA,EAIAggE,8BACA,sBAIA,MAHA,uBACA7C,OAEA,QACA3kF,+BAEAA,4BACA,EAKAwnF,6CACA,QACA,UACA9uE,QACAA,uDAGAA,qDAEAA,CACA,EAGA8uE,mCACA,oBACA,aAGA,4CACAxnF,eACAkX,kBACA6mD,eAAwD2G,eALxDwmB,gBAQAA,CACA,CACA,MACA,mBACA/sB,yCAEA,SACA,iCACA,MACA,sEACA,KAGAA,gCAEA,CACA,oBACA,WACAn+D,eACAkX,kBACA6mD,oBAEA,0DAEA,IACA,EAEAypB,qCACA,mDAEA,aADA3/C,YACAm2B,GACA,WACA,mBACA,kBACA,2BAGA,iBACA,aACA,sBACA,wBAEA,CAEA,CACA,CACA,WACA,EACAwpB,iCACA,mDACA2D,KACA,gBACA,WAEAA,mBADAntB,WACAM,GACA,CACA,QACA,EACAkpB,uCACAxnF,eAA4BkX,0BAC5B,EACAswE,sCACAxnF,eAA4BkX,qBAC5B,EAGAswE,uCACA,8BACA4D,KACA,eACAA,0BAEA,QACA,EACA5D,2CACA,8BAEA,aADA3/C,YACAg6C,EACA,qBACA,yBAGA,WACA,EACA2F,uCACA,mBAEA,gEACAxnF,eACAkX,yBACA8rC,kCAGAqoC,EAEA,iBACA,UACArrF,eAAgCkX,uCAChC,gBAEA,IACA,EACAswE,6CACAxnF,eAA4BkX,iCAC5B,EACAswE,qCACAxnF,eAA4BkX,4BAC5B,EACAswE,CACA,CA14BA,GA84BA,2BACA,eACA9K,yBACAja,WACA6oB,oBACAhqB,SACA8W,wBACAmT,WACA/Q,YACAnG,gBAEA,CACA,eAEA,WADAr0E,yDACAwrF,EACA,CACA,eACA,kCACA,iBACAxvB,WAEAA,CACA,CACA,eACA,wBACA,WACA,EACA,CACA,mBACA,OAA6B,MAC7B,gBACA,WACA0I,4BACAoB,mBAEA,CACA,QACA,CAxCA6K,eA0CA,mBAEA,oBACA,8BAA0ExY,0CAAoD,IAC9Hn4D,KACA,kEACAwxE,8FACAA,sGACAA,yEACAA,0GACAA,0FACAA,gGACAA,aACAA,yBACAA,cACAA,0CACAA,iDACAia,oBACAja,eACAA,CACA,CACA,OApBAZ,QAoBA8a,kCACA,EACA/4E,iDAGAkB,eACA,oEACA,EACAQ,cACAwE,kBAEAlG,+CACAkB,eACA,kEACA,EACAQ,cACAwE,kBAEAlG,kDACAkB,eACA,qEACA,EACAQ,cACAwE,kBAEAlG,gDACAkB,eACA,mEACA,EACAQ,cACAwE,kBAIA6yE,+BACA1rF,mCACAA,6CACAA,6CACAA,mCACAA,+CACAA,qCACAA,wCACA,EACA0rF,+BACAhZ,+BACA1yE,8BACA,EAGA0rF,uCACA,qBACAlG,0DAGAxlF,0BAEA,EACA0rF,2CACA,EAGAA,wCACA1rF,oBACAA,gBAA6B2rF,gBAC7B3rF,yBACA,EACA0rF,yCACA1rF,wBACAA,oBACA,EACA0rF,sCACAA,uCAGAA,8CACAA,+CAGAA,gDACAliB,GACAxpE,2BAEA,EACA0rF,kDACAliB,GACAxpE,6BAEA,EACA0rF,8CACAA,gDAGAA,uCACAA,wCAEAA,sCACA,iBACA,qFACA,EAGAA,iDACAznB,GACAjkE,4BAEA,EACA0rF,mDACAznB,GACAjkE,8BAEA,EACA0rF,+CACAA,iDAGAA,4CACAtjB,GACApoE,uBAEA,EACA0rF,8CACAtjB,GACApoE,yBAEA,EACA0rF,0CACAA,4CAGAA,8CACAtjB,GACApoE,yBAEA,EACA0rF,gDACAtjB,GACApoE,2BAEA,EACA0rF,4CACAA,8CAMAA,0CACA,IAEA76B,EACAryC,EACAhe,GAJAgxE,OACA/N,eAIAzjE,2BACA6wD,iCAEAryC,qCACAxe,2CACAA,8CAEAQ,2FAEAR,iDACAwxE,6BACAhzD,IAEAhe,GADA,aACA,IAGA,IAEAgxE,0CACA,EAAqBhxE,IAIrB,EAGAkrF,0CACA1rF,wBACAA,sBAEAA,4BACAA,+FACAA,+BAEA,EAGA0rF,wCACA1rF,8BACAA,6BACAM,yCACAN,iCAEAA,8BACA4rF,2CACA5rF,kCAEAA,4BACAA,+BAEA,EACA0rF,4CAEA,EAEAA,2CAEA,EAEAA,4CAEA,EAGAA,kCACA,gDACAtuB,OACA,EACAsuB,kCACA1rF,0BACAA,sBACA,EACA0rF,0CACA1rF,uCAAoDwlF,EACpD,EACAkG,mCACA,SACA,+BACAtuB,6BAEAyuB,CACA,EACAH,sCACAG,sBACAA,aACA7rF,wBACAo9D,uCAGAp9D,wBACAA,uBAEA,EACA0rF,gDACA,QACA,EACAA,uCACA,QACA,EACAA,wCAEA,EACAA,CACA,CApRA,CAoRKjZ,IACL9B,eACA+a,+BACAA,0CAEA,kBACA,cACA1rF,aACAA,oBACAA,cACA,CACA,4CACAA,oBAGAylE,yBACAzlE,YACAA,qBACAA,oBACAA,2DACA,EACA8rF,mCACA9rF,8DACAA,2BACAA,YACA,EAEA8rF,oCACA,IACAC,EACAC,EAFAz5E,uBAGAvS,kGAEA,OADA+rF,wBAEAA,kCAGA,OADAC,uBAEAA,iCAEAhsF,wBACAA,sBACA,EAGA8rF,uCACA,IACAvqF,EADAm3D,KAEA,aAEA,QAA4Bn3D,WAAiBA,IAC7Cm3D,8BAIAK,2BAEApa,IADA8mB,KAEA9mB,KAEA,GACA8mB,oCACA,CACA,QACA,EAEAqmB,4CACA,OACA,WACAnmB,oCACAA,+BACAglB,mCACA,UACAza,uBAEA+b,GACA/b,uBAEAgc,IACAhc,oBACAgc,cACAhc,sBAEAgc,cACAhc,uBAGAA,CACA,EAMA4b,wCACA,yBACA,8GACA,EACAA,kDACA,4BAOA,OANA,UACAv8D,wBAEA,UACA48D,wBAEAnsF,0BACAmsF,KACA1oB,sBACAK,iBACAC,kBAIAN,eACAO,cAIA,EACA,EACA8nB,8CACA,OACAr3B,eACAD,iBACA2K,kBAEA,EACA2sB,+CACA,QACA,EACAA,8CACA,QACA,EAEAA,mCACA,OACA,qCACA,6BACApmE,kBAEA,EACAomE,sCACA,wCACAM,YACA,4BACA,gBACA,GACAA,kBACA,aACA,EACA,EACAN,sCACAO,sBACArsF,+BAEA,EACA8rF,qCACAO,uBACArsF,+BACAA,oBAEA,EACA8rF,wCACA,EACAA,uCACA,EAEAA,mCACA,KACA,wBAAiDzvB,WAAgBA,KACjE,WACAwB,sCACA8H,+BAEA,CAEA,EACAmmB,mCACA,KACA,wBAAiDzvB,WAAgBA,KACjE,WACAwB,sCACA8H,yBAEA,CAEA,EACAmmB,2CACA,KACA,wBAAiDzvB,WAAgBA,KACjE,WACAsK,wBACAA,qBACAhB,MAEAA,iCAEA,CAEA,EACAmmB,6CACA,KACA,wBAAiDzvB,WAAgBA,KACjE,WACAsJ,MACAA,oCAEA,CAEA,EACAmmB,CACA,CA/MA,GAiNA,eACA,uBACA7wE,8BACA7Y,8BACAsW,0BACA,aAA0BytD,mBAAsCt+B,sBAChEnvB,mDAEA,CAEA,kBACA,cACA1Y,sBACAA,uBACAA,eACAA,2BACAA,kBACA,CACA,6CACA,6BACA,EACAssF,qCACA,MACAC,yBACAC,uBACAA,IACAvpB,+EAEAjjE,qBACA,eACAA,4CAEAA,yBACA,EAEAssF,iCACA,yBACA7mB,IACA,eACAzlE,8CAEAA,qBAEA,EAGAssF,uCACA,IAEA/qF,EAFAiwE,OACA9Y,KAEA,aAEA,QAA4Bn3D,WAAiBA,IAC7Cm3D,8BAIAK,4BAEApa,IADA8mB,MAEA9mB,KAEA,GACA,gBACA8mB,8BAIAA,uBACA,2BACA,EACA,CACA,QACA,EAEA6mB,wCACA,WACAzkB,KACA,6CACA4kB,GACA,qDAGA,kBACA5kB,wCAGAA,OADA,oBACA,aAGA,uBAEA,qBACAA,yCACA4kB,2BACA,yBACA,EACAH,qCACA,iCACAE,IACAA,oBACAxsF,2BAEA,EACAssF,qCACA,8BACAD,4BACArsF,wCAGA,EACAssF,oCACA,8BACAD,4BACArsF,wCAGAA,sBACA,EACAssF,wCACA,EACAA,uCACA,EACAA,CACA,CAlHA,GAwIAI,cACA,cACA1sF,mBACA,CACA,sCACA,EACA0sF,2CAEA,EACAA,6CAEA,EACAA,6CAEA,EACAA,CACA,CAhBA,GA8CA,eACA,oCAEA,aAA8BjqB,+CAA8D8Z,GAAcjb,WAC1G,SACA,CAEA,QACAiL,aACApmD,YACAwmE,eACAxuB,iBAEAyuB,IACAD,WAUA,iBAGA,eACA,CAAqB32B,iBAErB2qB,IACA,CAAqB3qB,6DAGrB,CAAqBA,eAErB,CACA,8BACA,IAMA6Z,GANArK,+CACAqnB,uBACAhlB,IACA,gBACAib,6BAGA,OACAjT,GADA,uCACAt9D,kCAGAu6E,GADA,uCACAv6E,kCAGAkxD,gBAGAspB,EACAllB,aAGAmlB,cAGAnlB,iCAEA,cACAA,kBACAglB,MACA,+BAAiEjd,cAAgB,IACjF,KACAqd,IACA,mBACA,KACAC,GACA,OACA,IACA,KACAL,GAEAM,OAA4C1lE,2BAAmEooD,IAE/GA,IACA,OACA,CAEA,mBAEA,gBACA,2BACA,sBACA4b,4FACAja,kEAIAA,oCACAA,CACA,CACA,OAZAZ,QAYAwc,+BACAzb,UACA,EACAyb,+BACA,uCACAnlD,KACAzgB,mBACAygB,4BAIA,QAFAolD,qCACAC,gBACAjxB,UAA8CA,aAAqBA,KAEnEp0B,UADAslD,OACA/lE,0CAEAxnB,YACAioC,YAEAjoC,8CACA,EACAotF,CACA,CAlCA,CAkCKjb,IAELqb,cACA,gBAMA,QALA/lE,UACA/O,QACA+0E,KACAC,KACAC,MACAlmE,KACAmmE,iBACAH,eAGAE,KACAF,WACAC,WAEAjmE,UAEAznB,aACAA,eACAA,iBACA,CACA,0CACA,oCACA6tF,qCACAC,gBACAC,yBAIA,OAFAD,kBACAC,iBAEA,CACAC,aACAH,YACA5oB,cACAC,aAIA,IAEA,EAMAsoB,wCACA,mBACAS,kCACA,WACAR,OAEAQ,YACAR,gBAGAA,IAEA,EACAD,CACA,CA7DA,GA+DAU,cACA,gBACA,IACAC,EACA5C,EACA6C,EAHAV,UAIA,MAGA,IADAnC,mBACA4C,IAAqCA,YACrCT,qBADgES,KAKhEC,uBACA,MAEAA,IACAD,WAEAnuF,cACAA,cACAA,iBACAA,6BACAA,wCACA,CACA,yCAEA,QADAquF,KACApoC,IAA8BA,cAAmBA,KAEjD,QADAqoC,KACA/nC,IAAkCA,cAAmBA,IACrD+nC,4BAEAD,SACA,CACA,QACA,EACAH,oCACA,OACAzmE,2CAEA,EACAymE,wCAEA,QADAR,KACAnnC,IAA8BA,cAAmBA,IACjDmnC,8BAEA,QACA,EACAQ,mCACA,kBACAK,+BACA9oB,KACA,KAGA,QAFAuoB,6BACA90E,KACAA,QACA,wBACAs1E,0BACA/oB,QACAxf,OACAwoC,cACAC,iBACAzpB,0BACAC,0BAEAhsD,KACA,CAEA,QACA,EACAg1E,CACA,CAxEA,GA0EAS,cACA,aACA3uF,qDACAA,gDACAA,+CACAA,+CACAA,gDACA,CACA,gDAEA,QADA4uF,KACAvyB,IAA6BA,mBAAuBA,IACpDuyB,oBAEA,sBACAC,sEACA,OACAC,uFACAC,uFACAC,kBACAC,kBACAlnB,2EACAsG,iFACAD,gCAEA,EACAugB,kCACAlnE,KAEA,QADAmnE,KACAvyB,IAA6BA,mBAAuBA,IACpDuyB,oBAEA,wCAAsD3zE,OAAS7Y,qBAAkCuhE,WACjG,GACA+L,aACA,EACAif,kDAEA,QADAC,KACAvyB,IAA6BA,mBAAuBA,IACpDuyB,oBAEA,SAGA5uF,oEACA,GACAqnE,EACAxK,EACA6S,iBANA,EAOA,EACAif,iDAEA,QADAC,KACAvyB,KAA6BA,oBAAuBA,KACpDuyB,sBAEA,MACA,kCACA,OACArpB,oCACA2pB,oCAEA,CAEA,OAAyB3pB,YAEzB,EACAopB,kDAEA,QADAC,KACAvyB,KAA6BA,oBAAuBA,KACpDuyB,sBAEA,MACA,YAEA,gDACA,OACAnpB,sCACA0pB,6CACAlgB,kBACAmgB,oBAEA,EACAT,2CAEA,QADAC,KACAvyB,IAA6BA,mBAAuBA,IACpDuyB,oBAEA,MACA,SAIA,QAFA5b,qBACAvN,mDACAxC,WAA4CA,aAAoBA,MAChE,cACA0C,eACAA,eACA,CACA,SACA,EAIAgpB,0CACAC,GAEA,QADAnpB,KACApJ,QAA0DA,WAA2BA,IAErFoJ,oCADA4pB,KACA3f,MAEA,QACA,EAIAif,yCACAC,GAEA,QADAnpB,kDACApJ,QAA4CA,WAAoBA,KAChE,YACAsJ,eACAA,gBACAA,iCACAA,0BACA,CACA,QACA,EACAgpB,CACA,CA9HA,GAoIA,iBACA,oBACA,SACA1zE,EAEA,CACA7Y,yCACAsW,2CAEA,CAMA42E,cACAA,eACAA,mBACAA,aACAA,0BACAA,eACAA,eACAA,cACAA,qBACAA,6BACAA,kBACAA,cACAA,qBACAA,kBACAA,iBACAA,WACAA,oBAreA,cACAtvF,mBACA,EAoeAsvF,mBACAA,qBACAA,sBACAA,YACAA,cACAA,WACAA,UACAA,4BACAA,aACAA,eAz0PA,iBACA,OACAv0B,sBACAC,yBACAC,mBACAC,2CAEA,EAm0PAo0B,WACAA,WA3iQA,gBACA,YACA,iBACAz0B,KACA,EAwiQAy0B,mBAhmPA,eACA3wC,uCACA,EA+lPA2wC,iBA1mPA,eACA3wC,sCACAA,uCACA,EAwmPA2wC,oBACAA,cACAA,+BACAA,eACAA,oBACAA,iBAhzPA,eACA,gBACA,EA+yPAA,eACAA,iBA/yPA,eACA,gBACA,EA8yPAA,yBACAA,wBACAA,2BACAA,qBACAA,wBACAA,yBACAA,iBApiPA,iBACA,UACA,EAmiPAA,mBAxvPA,iBACAxd,QACAvZ,KACAg3B,kBACAC,sBAGA1d,SACAvZ,KACAk3B,mBACAC,uBAGA,EA4uPAJ,sBAnoQA,eACA,aACA7rF,gBACA,WACA,GACAknF,OAlCA,aACA,OACA9yE,wBACAC,8DACAC,uBACAC,gEAEA,CA2BA23E,IACAC,qBACA,gBACA,EACA,EA2nQAN,iBACAA,iCACAA,4BACAA,qBACAA,gBACAA,4BACAA,SA9jIA,GA+jIAA,iBA1xQA,iBACA,OACAz3E,+CACAE,6CAEA,EAsxQAu3E,oBACAA,mBACAA,wBAvoOA,cACA,OAAiBtxB,QAAQxxB,aACzB,EAsoOA8iD,yBACAA,qBACAA,kBACAA,cACAA,cACAA,eACAA,oBACAA,cACAA,aAxxQA,gBACA,OACAz3E,mBACAE,gBAEA,EAoxQAu3E,YAnkQA,iBACA,gBACA,EAkkQAA,mBACAA,oBACAA,gBAzvPA,cACAr1B,6CACA,EAwvPAq1B,mBA/uPA,mBAGA,6BACAO,+BACAC,KACAC,KACAC,MACAC,KACAC,MAGAv0B,0BACA,2BACAw0B,SACAA,OACAL,WACAC,WACAC,0BAIAC,MAEA,GAEAG,IACA1xE,MACA2xE,yBACAR,gCAGAC,0BACA,2BACAK,SAGAA,QACAxxC,gBAFA2xC,OADAN,QAGA,KAEA,EACA,EAusPAV,mBACAA,mBACAA,eAzvPA,cACAr1B,gDACA,EAwvPAq1B,uBACAA,0BACAA,gBACAA,eA13QA,gBAGA,QAFA70B,iCACAtB,KACA53D,IAAwBA,WAAoBA,IAE5C,QADAq3D,gBACA/oD,IAA4BA,WAAuBA,KACnD,cACA0gF,aACAp3B,UAEA,CAEA,QACA,EA82QAm2B,iBACAA,qBACAA,iBA72QA,kBACA9K,EACA7lC,mBAGAA,qBAEA,EAu2QA2wC,aAngBA,sBACA,QAAmC/S,MACnC,YACAhtD,QACAihE,wBACA,SAGA/sB,qBACAO,wBAHA,EAKA,EAyfAsrB,sBAhqNA,eACA,iCACAmB,4BACAA,uBACA,EA6pNAnB,cAzfA,mBAEA,qCACA//D,iCACAo8C,wBACAC,wBACA,YAGAnI,mCACAK,2BACAC,yBACA6hB,kCALA,EAOA,EA4eA0J,eACAA,gBAlpKA,eACA,mDACA,EAipKAA,wBACAA,mBACAA,cACAA,gBAvzQA,cACA,OACAz3E,wBACAE,uBAEA,EAmzQAu3E,uBACAA,oBACAA,iCACAA,iBAztMA,eACA,oEACA,EAwtMAA,gBACAA,kBACAA,qBA/8QA,gBAGA,QAFAz2B,OACAC,sBACAv3D,IAAwBA,WAAmBA,IAC3CmvF,iCAEA,EA08QApB,8BACAA,6BA5tEA,eACA,MACA,aACA/S,mBACAtZ,CACA,EAwtEAqsB,qBACAA,mBACAA,mBACAA,mBAp0FA,iBACA,4BACAqB,qBAIA,iBACA,eACA,8BACAA,YACA,SAMA,eACA,aACA,SAGA,QACA,CAnBAC,KACA,EAi0FAtB,WACAA,wBACAA,kBAv8OA,eACA,YACA,0BACA,EAq8OAA,sBACAA,kBACAA,cAj6PA,eACA,gEACA,EAg6PAA,iBACAA,qBACAA,sBACAA,aACAA,kBAvuPA,eACA,QACA,6BACA,mBACA,6BACA,oBACAuB,MACAC,IAEA,CACA,GACAA,IACAn1B,sBACAhd,oBACA,GACAmyC,CACA,EAwtPAxB,aACAA,mBACAA,sBACAA,sBACAA,mBAv5PA,iBACA,OACAv0B,gBACAC,kBACAC,cACAC,8BAEA,EAi5PAo0B,cACAA,wBACAA,gBA/fA,eACA,SACA9yB,gBACA,yBACAA,CACA,EA2fA8yB,mBACAA,qBACAA,iBACAA,kBA93QA,iBACA,uBACA/3E,gBACAA,cACAA,cACA,EA03QA+3E,qBACAA,qBAvsPA,eACA3wC,oCACA,EAssPA2wC,oBACAA,mBAntPA,eACA3wC,mCACAA,oCACA,EAitPA2wC,0BACAA,yBACAA,wBACAA,iBACAA,qBACAA,iBACAA,kBACAA,cArmOA,iBAGA,QAFAyB,IACAxvF,IACAA,YACAqX,UACAA,cACAm4E,KAGAxvF,IAGA,QACA,EAylOA+tF,oBACAA,iBACAA,qBACAA,gBACAA,wBAjvPA,iBAEA,OACAx4D,oBACAjf,SAEA0gD,OACAA,OACA,oCAEAy4B,GAAgCl6D,qBAChC,cACAyhC,OACAvuB,CACA,EAouPAslD,gBA73QA,kBACA,OACAz3E,cACAC,gBACAC,YACAC,kBAEA,EAu3QAs3E,qBA70PA,eACA/2B,KACAi3B,cACAE,eACAH,mBACAE,qBAEA,EAu0PAH,wBACAA,iBACAA,UAvJA,QAwJAA,qBAnrQA,iBACA,kBACAp9D,KACA++D,uBACAtyC,0BACA,EACA,EACAsyC,uBACAtyC,uBACA,EACA,EA0qQA2wC,uBAt5PA,iBAEA,QADAr2E,OACA1X,IAAwBA,YAA2BA,KACnD,YACA,SACA,gBACA,2BACA,YAEA0X,GACA,SACAi4E,KAEA,WAEA,CACA,QACA,EAu4PAv+E,sCAAmDjB,UAEnD,GAAC,SCjlRD3R,KACA,qFACA,iFACAm4D,qCAAqEn4D,eACrE,CD6kRC,CC7kRAC,mBAAkC,aAkBnC,oBACA,gCACA,CAAe+iB,wBAAgBvf,qBAAsCJ,gBACrE,cAA8B,kDAC9BA,IACA,EAEA,iBAEA,aAAwBpD,mBADxBm9D,OAEA/5D,qEACA,CAEA,iBACA,oCACA,iCAAqD7B,IAAOA,IAE5D,aADA8B,eACAsP,uDAEA,QACA,EACAyqD,uBACA,EAEA+zB,cAEA,aACA,8CACA,CAEA,OALAvgB,QAKAugB,6CACA,IAIAC,EAJA3tB,eACAyb,gDACA98E,UACAsW,QAYA,GATA,2BACAtW,oBAEAgvF,oBACAC,0BACA34E,oBAIA1Y,wBACAA,6BACA,gBACAsxF,kBACA54E,mBACA,CACA,OAAqBtW,cACrB,EACA+uF,CACA,CA/BA,CA+BKG,wBAeLC,aACA,cACA,WACAvxF,iBACAA,eAEAA,mCAEAwxE,gCACAA,QAEA,EACAxxE,cACA,CAEA,mCACAA,gBACAA,SACAA,cAEAA,yBACAA,gBACAA,iBACAA,qBAEA,EAEAuxF,4BACAvxF,gBACAA,6BACAA,iBACAA,qBAEA,EAEAuxF,8BACA,WACAh/E,eACAosC,iCACAwZ,0CACA5kD,OACAwE,QACAF,YAGA,8BACAtF,aAEAA,0BAEA++E,qDACA9f,QACA,GACAj/D,YACA0nD,6DAEA,EAEAs3B,+BACAvxF,YACAA,UACAsxF,yBACAtxF,cAEAi6D,gEACA,EAEAs3B,gCACA,IAKAx5E,EACAF,EANAtF,eACAosC,UACA6yC,4BACAC,gCACAC,oCAIA35E,WAEAF,OADA,WACAtF,YAEA,YACAA,gBAGA,EAGAwF,4CACAA,gCACAF,0CACAA,iCACAy5E,gBACAv5E,YACAF,eAEA,EAKA05E,gCACAvxF,iBACAA,mEAEA,EACAuxF,CACA,CA1GA,GA+GAI,cAEA,aACA,8CACA,CAEA,OALA/gB,QAKA+gB,wCACA,IAWAC,GACAC,GAZAt/E,uBACAygE,eACA7M,QACA2rB,OACAnuB,WAEAouB,8DACAC,kCACA9hB,wBAHA4hB,gBAGAC,SACAE,kCACAC,MAGA,oDAEAvsB,YACAisB,0BAEAM,wDAGAL,GACA,2BACAP,qCACA,UACA,+BACAnrB,MACA,kCACA,KACA8rB,GACA,kBACA,IACA,6BAEA,cACAJ,UACAK,WAEA,UACAH,EACA,kDACA,KACAC,GACA,gDACA,IACA,MACA,EAEAL,8CACA,OACAl9B,eACAD,iBACA2K,kBACAC,kBAEA,EACAuyB,8CACA,QACA,EACAA,CACA,CAnEA,CAmEKL,mBAILa,cAEA,cACA,mCACA,mBACA3gB,CACA,CAEA,OAPAZ,QAOAuhB,qCACA,4CAEAnyF,0CACAoyF,yEACA,GAEAlG,GACAlsF,+BAEA,EAEAmyF,kCAGA,QADAE,EADAC,sBAEAD,WACAf,2BAEAtxF,oBACA,EAIAmyF,sCACA,IACAI,EACAtsC,EAFAqsC,KAKA,IAFAC,uBAEAtsC,IAA0BA,WAAsBA,IAChDqsC,kCAEA,QACA,EAIAH,uCACA,IAQA5wF,GACAixF,GACAjsC,GACAksC,GACA5iF,GACA81D,GACA+sB,EAdAC,eACAC,qBACAC,yBACAC,uBACAC,kCACAC,KACAC,MACAC,MASA,gBACA,aAEAR,sBAEAA,4BAGAA,+BACAD,mBAEAQ,aACAC,aACA3sC,IAEA,CACA,SAAwBhlD,KAAcA,MAStC,GARAixF,SACAjsC,KACAksC,gCACAO,WACAC,YACAC,YAGAV,GACA,SAAgC3iF,aAAsBA,MACtD81D,UACA,oCACAwtB,gCAUA,IATAC,OAEAV,wBAAwDv6B,gCAAiCwN,OACzF0tB,QACAX,kBAGAQ,aAEA3sC,QACA0sC,aACAD,aACAzsC,KAEAksC,iBACA,CAEAW,MACA,uCACAE,KACAX,QACArB,yBAGAA,2BAGAyB,iBACA,CACA,OACA9sC,MACAstC,UACAN,cACAD,YACAH,YACAptB,OAEA,EAGA0sB,uCACA,IAEA5wF,EACAokE,EACA91D,EAJAozD,oCACAuwB,KAOA,IADA/tB,wBACAlkE,IAAwBA,WAAiBA,KAGzC,IAFAokE,OAEA91D,IAA4BA,YAC5B4jF,UAD+C5jF,KAM/C81D,UACAA,qCACAA,uCAEA6tB,wBACA,CAEA,QAAwB3jF,WAAmBA,IAC3C2jF,aAEA,QACA,EAEArB,qCACA,IACA5wF,EADAgxF,KAEA,QAAwBhxF,sBAAyBA,IACjDgxF,WAEA,QAAwBhxF,WAAiBA,IACzCgxF,uBAEA,QACA,EAEAJ,8CACA,8BACA,EACAA,CACA,CAnLA,CAmLKR,GAEL,gBACA,MACA+B,EACA,QAAoBnyF,WAAsBA,IAE1C,IADAmyF,QACAjF,qBACAiF,sBACA,SAGA,QACA,CAEA,gBACA,0BACA,CAEA,kBAEA,aACA,8CACA,CACA,OAJA9iB,QAIA+iB,qCACA,kBACArB,wCAEAtyF,0CACA,IACA4zF,EACAC,EAFAC,2EAIA1E,aACAwE,QAGAA,mDAEAA,iDAGAC,gCACAzB,8BACA0B,mBACAA,mDACA1B,gBACA,EACA,EACAuB,CACA,CA/BA,CA+BKxB,GAEL4B,cAEA,cACA,mCACA,yBACAviB,YACAA,CACA,CACA,OAPAZ,QAOAmjB,qCAEA,gBACAtuB,uBACA,8BACA,IAEAiN,qCACA,EACAqhB,qCACA,IACAxyF,EACAokE,EACAmuB,EAHAn4B,KAIA,QAAwBp6D,WAAiBA,IAEzCuyF,uBADAnuB,QAEA3lE,0CACA27D,UAEA,QACA,EAEAo4B,wCACA,IAMA57B,GACA27B,GACAE,GARArB,eACAC,qBAGAqB,EAFAC,2BAGAC,GAFAD,4BAEA,EAKA/7B,GADA,oBACA,UAGAjhD,gBAKA88E,IAHAF,sFAGAM,8BACAH,KACA3C,qBAEA,kCAEA3rB,iBACAquB,qBACAG,KACA7C,qBAEA,oCAEA,uCACA,YACAqB,QACArB,yBAGAA,2BAGAwC,EACA,EACAC,CACA,CA3EA,CA2EKzC,gBAEL+C,cAEA,gBACA,6BACAC,2BACAC,mDACA,wFACA/iB,0HACAA,oFACAA,sFACA7uD,2CACAg8B,QACA6rC,oBAEAhZ,CACA,CACA,OAfAZ,QAeAyjB,+BACAr0F,yBACAA,8BACAA,4CACAA,2CACAA,8CACA,EACAq0F,+BACA3hB,+BACA1yE,4BACAA,kDACA,EACAq0F,qCACA,iBACA9iE,EADAvxB,aACAuyC,0DAEAvyC,kBACA,iFAEAsxF,gBACA,gCACAxO,8DAEAA,8EAGA9iF,gEACA,EACAq0F,uCACA,sBACA,YACA,OACA3kB,eACAlB,UACA7K,UACA1oD,OAAiC7Y,6BAEjCoyF,cACAr8E,MACAN,OACAE,MACAD,QACAE,UAEAy8E,QAGA,EACAJ,CACA,CAjEA,CAiEK/C,iBACLoD,cAEA,cACA,mCACA,mBACAljB,CACA,CACA,OANAZ,QAMA8jB,mCACA,gBAA4Cr4B,WAAoBA,IAEhEr8D,wCADA20F,KACAh2C,GAEA,EACA+1C,mCACA,gBAA4Cr4B,WAAoBA,IAEhEi1B,gBADAsD,KACAj2C,GAEA,EACA+1C,CACA,CApBA,CAoBK/C,GAELkD,aACA,cACA70F,cACA,CACA,0CACA,SACAwnB,mBACAygB,4BAEA,sBAA+Co0B,WAAgBA,KAC/D,WACAp0B,wDACA,CACA,uBACAA,oFAEA,kCACAA,YAEA,yBACA,EACA4sD,CACA,CAtBA,GAuBA,oBACA,0BACAhI,yCACA3c,yBACA,uDACA,+BACA2c,EACA,8BAA2Djd,cAAgB,IAC3E,KACAsd,EACA,MACA,IACA,QACA,CAEA,yBAAgDx4B,gBAChDogC,qBAAiDngC,iBACjDogC,cAEA,kBACA,6BACAvjB,uBACAA,sBACA,+BACAwjB,0BACAxjB,0BACA,wEACA,6HACAA,8GACAA,qGACAA,iFACAA,0HACAA,kFACAA,wFACAA,gBACAA,CACA,CACA,OAnBAZ,QAmBAmkB,+BACA,cACA/0F,qBACAA,wBACAA,8BACAA,6CACAA,8CACAA,mCACAA,mCACAA,4CACAA,kCACAA,sCACAA,qBACAA,2BAEA,EACA+0F,+BACAriB,+BACA1yE,2BACA,EACA+0F,uCACA,kCAEA,OAAqB3yF,YADrBkvF,eAEA,EACAyD,+CACA,iBACA/0F,kCACAynB,uCACAwtE,2CACA7mB,gCACA8mB,kEACAC,yEAEA,EAGAJ,uCACA,IAGA9uC,GACAM,GAJAif,2BACA4oB,4BACA11B,KAGA,SAA0BzS,KAAcA,KACxCyS,+BAcA,IAZA14D,oBACAA,8CACAA,iEACAA,YACAA,uBAEAA,iEAEAA,uEACA,MAGAimD,KAA0BA,KAAcA,KACxC,SAA8BM,KAAcA,KAC5CvmD,kCACA,CACAynB,8BACAk3B,yBACA6mB,UAKAxlE,wBACA,EACA+0F,sCACA/0F,uBACA,EAGA+0F,2CACA,iBACA7kB,4CACAklB,GACAllB,mBAEA,0BACA,qBACAA,kDAEA4S,6BACAuS,cACA/G,0BACAjnB,mCACAiuB,qDAEA,0DAIAt1F,2BACA,UACAA,2BACA,WACA,IACA,sBAGA,EACA+0F,2CACA,sCACA/0F,yCACAA,sCACA,EACA+0F,8CACA,oBACA,EAGAA,2CACA,qDACA,cAEA/0F,iBACAA,+BACAA,iBACA,OACA,EACA+0F,8CACA,IACAxuC,EADAgvC,KAGA,QAA0BhvC,cAAmBA,IAE7CgvC,iCADAv1F,8BAGA,mBACAu1F,YAEAA,UACA,EAGAR,6CACA,IAIA7kB,EACAslB,EALAhwB,2BACA9M,KACAm0B,8DACA4I,mCAGA,oDAIAvlB,0DACAwlB,sBACA11F,0CACAw1F,aAEA98B,kCACAm0B,EACA,8BAA+Djd,cAAgB,IAC/E,IACA,IACA5vE,6DACA04D,4BAAyDjxC,oBAA0B,CAAI+6D,wBAA2B/e,gBAGlHgyB,IACA/8B,8BAA+D8pB,uBAA0B/e,gBAGzF/K,YApBA,WAsBA,EAGAq8B,mCACA,kEACAvP,4BACAxlF,yBACAA,yBACAA,0BAEAg1F,kBACAV,kBACAqB,kBACAX,iBACAV,iBACAqB,gBACA,EACAZ,yCACA/0F,yBACA,EACA+0F,yCACA/0F,0BACAA,iEACA,EAGA+0F,wCACA,4CACAxuC,mBACAN,kBACA,oBACA,OACAA,MACAM,MACAioB,UACAvzD,6BACA0oD,WAEA6wB,0BACAoB,cACA/9E,gBACAC,kBACAC,cACAC,qBAIA,EAIA+8E,oCACA,oCACA,EAGAA,yCACA3sB,IACApoE,mDACAA,iDAEA,EACA+0F,2CACA3sB,IACApoE,mDACAA,wCAEA,EAGA+0F,2CACA3sB,IACApoE,mDACAA,iDACAA,uCAA6D61F,sCAE7D,EACAd,6CACA3sB,IACApoE,mDACAA,wCACAA,qCAA2D61F,sCAE3D,EAGAd,wCACA/0F,iBACAA,sBAEA,EAGA+0F,kCACA,IACA9uC,EACA6vC,EAFAxD,oCAGA,QAA0BrsC,WAAyBA,IACnDjmD,oBAUA,KALA81F,IAJAC,IAGA,mBACAA,EAGA/1F,gCAGAA,kBAGA,EAIA+0F,6CACA,IAGAxzF,EACAyyF,EAHAgC,EADAh2F,eACAm6D,+BACA87B,2DAIA,QAAwB10F,WAAkBA,IAG1C,IAFAyyF,QACAvP,+BACAuP,mCACA,SAGA,QACA,EAIAe,mCACA,IAKAvC,GACAS,GACAiD,GACA30F,GACAokE,GACAwwB,GACAC,GACAC,GACA3D,EACAr6B,GACAi+B,GACAzmF,GACA0mF,GACAC,GACAC,GAnBAjlB,OACAohB,2BACAP,mCACAqE,KACAnwC,IAiBA6sC,gBACA,YACA+C,yBACAhmE,SACAuiE,aACA+D,4BACAD,kCACA9D,kBACAgE,eAEAnwC,GAEA,EACA,4BAQA,IAPAisC,oBACAS,iBACAiD,uCACAn1F,qBACAqS,8BACA,GAEA7R,KAA4BA,aAAsBA,MAClDokE,UACA,oCACAwtB,gCAKA,IAJAC,OAEAiD,MACAD,KACA7vC,OACA4vC,2BACAE,YACAD,cACA7vC,IAEA,OAKA,IAHA8R,IADAq6B,eACAr6B,WACAi+B,MAEAzmF,KAAoCA,aAAyBA,KAC7D0mF,yBAAgEp+B,sCAEhEs+B,2CADAN,YAGAK,kCACAD,mBACAD,YACAI,WAEAhE,8BACApB,2BACA4E,UACA,CACA,CACA9C,gBACAf,YACAA,eACA,CACA,EAGA0C,mCACA,uCACA1C,YACAA,mCACAA,gBAEAA,eACAA,iCACAsE,gCACA,GACAtE,kBAEA,EAGA0C,2CACA,WACAvvB,2BACA32D,uBAA8CspD,sBAC9C,kDACAtpD,uCACA,gCAEA4Y,oBADA+pD,wBACA/pD,KACAmvE,mBACApC,oBACAqC,sBAEAC,2BACAC,0BACA,wBAEAC,wCACA,CACAvvE,kBACAk8C,UACA6wB,SACAoC,UACAnxB,QACAwxB,cACAjR,UACAxgB,WAIA,eACAgM,4BAEA,qBACAhM,wBAEA,GACA32D,CACA,EAEAkmF,6CACA,IAIAmC,GACA3kF,GALAi/D,OACAvO,6BACAk0B,gCACAX,gBAIAU,GADA,gBACA1xB,KAGAxlE,eAEAuS,IACA4lD,6BAZA8K,QAYAm0B,oBACA3L,cACA1zE,0BACAs/E,YACAr+B,qBACAwY,qCACAA,mDACA,EACAzqD,gBACAyqD,2BACAA,sBACAA,uBACAA,iBACA,GAIAxxE,WACAuS,mCAGAA,iCAEAvS,0BACAA,uBACAq+D,8BACA,EAEA02B,yCAKA,QAFAuC,GAA6Bl1F,MAF7Bm1F,EAE6B7+E,IAD7B44E,UADAiG,EACA,IAEAC,KACAn7B,QAA4CA,WAAoBA,KAChE,WACA2W,gBACAnO,YACAG,2BACAA,IACAwyB,YAA4C7xB,GAASqN,YACrDtO,WACAxB,QAA2C8P,OAAmBvL,sBAC9DnJ,qBACArjD,UACyBgqD,gHAEzB,CACA,QACA,EAEA8vB,wCACA,iCACA,2BACA0C,KAGA,WAEA,EAGA1C,wCAKA,QADApvB,EAHAqtB,6CACA0E,OACAjyB,KAEAiyB,aACA/xB,YAEAF,UAEAiyB,IAEA,QACA,EACA3C,CACA,CA1iBA,CA0iBKzD,iBAELqG,sBAAmDhjC,iBAKnDijC,cAEA,oBACA,iCAIApmB,iCAEA,+BACA,6BAFAA,QAGA4lB,gEAEA9F,iCACA,eAGA,EACA,EAIA9f,8CACA,iBACAqmB,6BACA,+BACA,8BACArmB,4BACA8f,sBACA9f,GAAiC/pD,4CAA+Dg8C,kBAEhG,QAEA,EACA,EAEA+N,sCAEA,+BACA,6BAFAA,QAEA4lB,gEAEA,EACA,EAGA5lB,oCACA,+BACA,+DAEA,EACA,EACAA,sCACAA,sCACAA,0CACA,QAEA,oBACAA,wDACAsmB,yCACA,IAEAC,EAFAC,yBAAwD7/B,0BAGxD,OAFA2/B,iBAEAtmB,qBACAA,gCACAumB,KACAvmB,6BAGAumB,KACAvmB,6BAIAA,2BACAumB,MAEAvmB,6BACAymB,qDACAC,6CACA5C,yCACA6C,8CACAJ,2BAEAvmB,CACA,CACA,OApFAZ,QAoFAgnB,+BACAllB,+BACA1yE,uBACAA,uBACA,EAGA43F,0CACA,iBACA,uBACA9U,8BACA9iF,yBACA,2DAEA8iF,wDAGA,IACA,yCAEAA,0DAIA,EAEA8U,2CACA,kCACA,2CAEA,EACA,EAEAA,oCACA,6BACA,4BACA,EAGAA,uCACAllB,wCACA1yE,0BACA,EAEA43F,2CACA,IAGAQ,EACAtmB,EAJA6gB,eACAxZ,yBACAkf,kCAKA1F,UAOA3yF,6BAEAA,mFAGAA,sBACAq4F,GACA/G,wBAEAqB,qBAEAxZ,uBACAwZ,eAIAyF,gCACAp4F,wBAEAm5E,uBACAwZ,eAEA2F,IACAt4F,6BACA8xE,sCACAj6D,iBACAwgF,GACA/G,wBAGA8G,gCACAp4F,4BAGAA,gCAxCAs4F,IACAF,gCACAp4F,2BAwCA,EAEA43F,8CACA,SACAtG,iDACA,EAEAsG,wCACA53F,uBAEAs4F,IACAt+E,0BAEAs3E,8CAGAgH,EACAhH,0CAGAA,4CAGA,EAGAsG,gDACA,OAAqB7/E,MACrB,EACA6/E,uCACA,OAAqB7/E,iCACrB,EACA6/E,6CACA,WACA53F,iCAEA,EACA43F,CACA,CA1NA,CA0NKtG,QACLsG,wCAEA,mBAEA,gBACA,gCACA,uBACApmB,YACA7uD,2CAAmEg8B,kBACnE6yB,CACA,CACA,OARAZ,QAQA2nB,+BACA7lB,+BACA1yE,kDACA,EACAu4F,+BACA,mBACAlxB,6BACAsrB,oBAA4C3yF,oDAA2FqnE,gDACvI,EACAkxB,mCACA,sCACA,KACA,OACA7oB,uBACAlB,oBACAgmB,cACAr8E,MACAN,yBACAC,2BACAC,uBACAC,8BAEAy8E,QAGA,EACA8D,CACA,CApCA,CAoCKjH,iBACLkH,eAEA,aACA,8CACA,CACA,OAJA5nB,QAIA4nB,qCACA,sBACA,EACAA,CACA,CATA,CASKlH,UAELmH,cAEA,oBACA,iCACA,oCACAjnB,wBACAA,8EAEAA,4CACAA,CACA,CACA,OAVAZ,QAUAgnB,+BACAllB,+BACA1yE,aACAA,sBAEAA,4BACA,EACA43F,+BACAllB,gCACA,6BACAgmB,gBACA14F,gDACAA,aACAA,0BACAqnE,cACAqmB,oBACAX,kCACAuI,2CAGAt1F,iCACAqnE,cACAqxB,WACA1wB,8BACAC,8BACAlK,wBACA+H,4BACAsI,gCACArG,sBACAsG,0BACA+mB,4BACAv4B,wCAEA,EACA+6B,CACA,CA9CA,CA8CKA,GACL,gBACA,uCACA,mEACA,CAEA,uBACArjB,2BACAb,OACAif,UACAgG,YACAzhF,eACAiP,UAA4B80C,SAE5B29B,aACA1hF,eACAiP,UAA4B0yE,UAE5BC,cACA5hF,eACAiP,UAA4B60C,UAC5B+9B,aACAC,sBAKA1J,aACAA,mBACAA,mBACAA,YACAA,wBACAA,gBACAA,uBACAA,aAEA38E,sCAAmDjB,UAEnD,GAAC,SCxlDD3R,KACA,sHACA,yGACAm4D,sCAAsEn4D,qCACtE,CDolDC,CCplDAC,qBAA2C,aAkB5C,qBACA,iCACA,CAAe+iB,wBAAgBvf,qBAAsCJ,gBACrE,cAA8B,kDAC9BA,IACA,EAEA,gBAEA,aAAwBpD,mBADxBm9D,QAEA/5D,qEACA,CAEA,iBACA,oCACA,iCAAqD7B,IAAOA,IAE5D,aADA8B,eACAsP,uDAEA,QACA,EACAyqD,uBACA,EAMA67B,cAEA,cACA,mCACA,oBACAznB,oCACA/c,eACAD,iBACA0K,oDAEAsS,CACA,CAGA,OAbAZ,OAaAqoB,qCAIA,QAHAC,kCAGA3yC,IAA8BA,WAAwBA,IACtD2yC,8BAEAl5F,iBACAA,6DACA,EACAi5F,mCACAxzB,sBACA6rB,qBACA,GACAtxF,mBACA,EACAi5F,wCACA,qCACArG,WAEA,GADAuG,yBACAD,EACA,YAAkC3yC,IAAcA,IAChDvmD,gCAGA,EACAi5F,uCACA,qCACArG,WAEA,GADAuG,wBACAD,EACA,YAAkC3yC,IAAcA,IAChDvmD,uBAGA,EAEAi5F,8CACA,OACAxkC,eACAD,iBACA4K,YAEA,EAEA65B,8CACA,QACA,EAEAA,wCACA,IASArH,GACAwH,GACAC,GAXArmB,eACA7M,QACA2rB,OACAnuB,WAGAquB,8BACA9hB,wBAHA4hB,gBACAnsB,6EAEAqsB,KACAC,kCAMA,GAFA/hB,iCAEAohB,4BAIA,uBACA,eACAgI,SACA1H,8BACAwH,kDACAC,qCACA,OAIAzH,uBACAwH,2CACAC,+BAEA,qCACAlzB,MACA,kCACA,KACA8rB,GACA,kBACA,IACA,6BAEAL,GACA,oCACAN,iCACAA,4BAEAA,iCAEA,KACAnrB,QACA,yBACAmrB,sBACA,SACA,IACA,UAOAU,EACA,gDACA,IACA,MACA,EAIAiH,8CACA,MACAM,EACAh4F,EAGA,GAFAiyF,EAgHA,cACA,IACAjyF,EACAokE,EACA91D,EAHA2jF,KAIA,QAAoBjyF,WAAiBA,KAGrC,IAFAokE,OAEA91D,IAAwBA,YACxB2pF,iBAD2C3pF,KAK3C81D,WACA6tB,wBACA,CACA,QACA,CAjIAiG,IAoIA,cACA,MACA/B,EACA7nF,EACA81D,EACA71D,EACA,QAAoBvO,WAAmBA,IAEvC,IADAm2F,OACA7nF,IAAwBA,WAAkBA,IAG1C,KAFA81D,QACA+zB,eACA5pF,MAAgCA,WAAmBA,IACnD0pF,uBAIA,CAnJAG,IACAJ,QACA,QAA4Bh4F,WAAmBA,IAC/Cq4F,QAEA,QAA4Br4F,WAAmBA,IAC/CvB,oCAEA,CACA,EASAi5F,kDACA,IACA13F,EADAm4F,gBAEA,2BAmBA,IAlBAA,UAMA15F,wBAGAA,uCACA2lE,mCARAA,iBAWAA,gCACAA,mBACAk0B,KAGAt4F,IAA4BA,WAAwBA,IACpDvB,iDAGA,EACAi5F,wCACA,eACAp9B,GAEA,CAAkBE,kCAElB,CAAkBA,gCAClB4uB,0CACA,4BACA,mCACA,GACAyB,kBACA,aACA,EACA,EAGA6M,qCACA,gBAA4C58B,WAAoBA,KAChE,WACAi1B,0CACA3rB,WACAA,+CAIAA,2CACAA,8BAEA,CACA,EAGAszB,uCACA,IAKAphF,EACAC,EANAgiF,wCACAC,kBACAC,iBACAxyE,0CACA0sE,sBAGA,WAEA8F,yBAEA9F,GACAr8E,MACAC,MAGAD,IACAC,OAEA0P,mBACAA,iBACAA,kBACAsyE,uBAEAtyE,oCAEAA,CACA,EACAyxE,CACA,CAtPA,CAsPK3H,mBA0CL,cACA,IAEA/vF,EACA04F,EAHAP,gBACAQ,IAGA,+BACA,QAAwB34F,WAAwBA,IAGhDq4F,EAFAK,QAKAC,kCAEAv0B,mBACA,CACA,CAGA,uBACA,QAAkCw0B,MAClC,YAAwB54F,WAAsBA,IAC9C64F,WACAD,aAGA,QACA,CAEA,gBACA,qCACA,CACA,cACA,8BACA,2CACArnF,gCACAA,CACA,CAEA,kBAEA,aACA,8CACA,CACA,OAJA89D,OAIAypB,qCACAr6F,+CACAA,+EACAA,0BACA,EACAq6F,uCACA,8CACAjL,iBACA,qBACA,8CACA5nE,cACAA,gBACAA,0BACAA,2BACA,CACA,QACA,EACA6yE,CACA,CAvBA,CAuBKpB,GAELqB,cAEA,cACA,mCACA,oBACA9oB,CACA,CACA,OANAZ,OAMA0pB,qCACA,IACA9N,EADA2M,gBAGA,oBACA3M,mBAEA,oBACAA,yBAEA,kBACAA,2BAEA2M,yCACA1zB,kBACA,WACA,EACA,EACA60B,wCACAt6F,oCACA,EACAs6F,uCACAt6F,mCACA,EACAs6F,CACA,CAhCA,CAgCKhJ,gBAMLiJ,GACA,CAAUh4B,SACV,CAAUi4B,YACV,CAAUA,YACV,CAAUC,YACV,CAAUA,aAEVC,cAEA,kBACA,6BACAlpB,sBACAA,qBACAA,iDACA,+BACAwjB,0BACAxjB,0BACA,8EACA,6HACAA,8FACAA,iFACAA,qGACAA,0HACAA,kFACAA,wFACAA,mBACA7yB,YACA,8EAEA6yB,6DACAA,8CACAA,+CACAA,8CACAA,gBACAA,CACA,CAIA,OA/BAZ,OA+BA8pB,sCACA,IAEAC,EACA/rF,EAHAgsF,2BACAC,2BAGAD,sBACAC,0BAEA,QADAF,iCAEAE,IACAF,KAGA36F,oBACAA,oBACAA,oBAGA4O,8BACApL,mBACAoL,iBAEA5O,uCACAy0D,eACAD,iBACA2K,kBACAC,mBAEAxwD,gCACA5O,qBACAsxF,oBACAtxF,4BACA,EAEA06F,6CACA,MACAI,EACAC,EAEA,iBAA4Dx5F,KAAQA,IAGpE,GAFAu5F,yBAEA,QADAC,gCACAA,IACA,SAGA,QACA,EAGAL,+BAEA16F,YADAwnB,QACA2I,OACAnwB,gCACAA,0CACAA,6CACAA,8CACAA,mCACAA,mCACAA,4CACAA,kCACAA,qCACA,EACA06F,+BACAhoB,+BAEA1yE,4BACAA,6BACA,EACA06F,mCACA,kEACAlV,4BACAxlF,0BACAA,2BAEAwlF,2BACAxlF,yBACAA,yBAEAg1F,kBACAV,kBACAqB,kBACAX,iBACAV,iBACAqB,gBACA,EACA+E,qCAEA16F,+BACA,iBAFAA,WAEAo3F,2BACAp3F,0BACA,WACAA,uDACAA,mEAEAA,wBACA,EAEA06F,0CAUA,QAJAM,GACAC,GACAC,GAPAj4B,uCACAvK,KACAyC,oCACAggC,YACAC,sBAKA9J,uCACA0J,cACAC,uDACAC,GACA,gEACAD,GACA,SACA3J,4CACA,UACA,IACA,QACA54B,GACA,iDACAuiC,2BACA,KACA/G,SACA,qDACAA,SACA,QACAiH,sCACAC,sCAEA,QACA,EACAV,yCACA,iBACArF,+BACAr1F,iCACA,8CACAq1F,cACA/G,QACAjnB,cACAiuB,qDAEA,WACAt1F,gEACAA,YACAA,sBAEAA,8DACA,GACAA,6BACAA,uBACA,EACA06F,wCACA16F,8BACA,EAIA06F,6CACA,IACA5G,EADA7rD,KAEAA,2CACA,YAA4B1mC,cAAiBA,IAC7C0mC,iRAUAjoC,YACAioC,YAEA6rD,wFAEA7rD,kCAGAjoC,yDACAA,iEACAA,sFACAA,8DACAA,uEACAA,qEACAA,aACAA,+BACAA,kCACAA,8BACAA,8BACAA,qCACAA,qCAEAA,sBACA,EACA06F,+CACApJ,uCACA,EAEAoJ,uCACA,IACAn5F,EADA23F,KAEA,QAAwB33F,cAAiBA,IACzC23F,WAEA,QAAwB33F,WAAiBA,IACzC23F,uBAEA,QACA,EAGAwB,0CACA,MACAj1B,EACAlkE,EACA,QAA0BglD,cAAmBA,IAE7C,IADAkf,OACAlkE,IAA4BA,WAAiBA,IAC7CirF,yBAGA,EAGAkO,2CACA,cACA,EACAA,6CAEA,wBAGA,KAEAn5F,EAFAwW,yBACAsjF,KAGA,QAAwB95F,WAAiBA,KACzC,6BAAyD42D,qDACzDmjC,mBACAt7F,8CACAq7F,SACA,CAEA,eACA,6BAA0DljC,sDAC1DojC,mBACAv7F,sCACAq7F,SACA,CACAr7F,uBACA,EACA06F,4CACA16F,uBACAA,8CACAA,0BAEA,EAGA06F,0CACA,wCACA,EAGAA,yCACA,WACAc,mBAEAx7F,4CACA,EAEA06F,uCACA,IAGAe,EACAC,EAJAnsF,sBAEAosF,iBADA37F,uBACAs4E,yCAMA,uBACAqjB,gBAGAF,gBAIAC,KAHAD,mBAIAz7F,2BACAA,iCACA,EAEA06F,4CACA,IACAn5F,EACAokE,EACA4xB,EAHAqE,qCAIA,QAAwBr6F,WAAiBA,KACzCokE,QAEA5tD,gCADAw/E,gCAEA5xB,uDAEA,EAGA+0B,2CACA,MACA/0B,EACA,QAAwBpkE,WAAiBA,IAEzC+vF,cADA3rB,QACAhnB,kCAEA,EAEA+7C,+CACA,OACA3iF,UACAC,iBAEA,EAGA0iF,yCACA16F,yBACA,EACA06F,0CACA16F,0BACA,EAGA06F,wCACA,2EACAmB,mBACAJ,kBACA,qBACA,iBACAK,kBAEAC,eADAC,SACArB,GAEApD,4BACArhC,sFAFAulC,SAGAr5F,gBAEA,OACAmkD,MACAioB,UACAvzD,OAAiC7Y,aAJjCqhE,6BAKAE,WAEA6wB,qBACAoB,cACA/9E,gBACAC,kBACAC,OACAC,cAGA,CACA,EAGA0iF,yCACAtyB,IACApoE,mDACAooE,UACApoE,uCAAiEi8F,sCAGjEj8F,iDAGA,EACA06F,2CACAtyB,IACApoE,mDACAA,qCAA2Di8F,sCAC3Dj8F,wCAEA,EAGA06F,2CACAtyB,IACApoE,mDACAA,uCAA6D61F,sCAE7D,EACA6E,6CACAtyB,IACApoE,mDACAA,qCAA2D61F,sCAE3D,EAIA6E,6CACAj1B,IACAzlE,yBACAA,kCAA2Dk8F,iBAG3Dl8F,4CAGA,EACA06F,+CACA16F,gCAAiDk8F,iBACjDl8F,uCACA,EACA06F,CACA,CAjcA,CAicKpJ,iBAEL6K,cAEA,aACA,8CACA,CACA,OAJAvrB,OAIAurB,kCACA,OACAx4B,UACAy4B,SAEA,EACAD,2CACA,gBACA,WAGA,SAEA,EACAA,2CACA,gBAGA7K,oBACA,mBAGA,WANA,SAQA,EACA6K,CACA,CA/BA,CA+BK7K,YAGL+K,qBAAoD1nC,eAKpD2nC,eAEA,oBACA,iCACA9qB,iBAIAA,iCACA,IAGA+qB,GAHAzZ,uBACA7nE,mCACA0lE,+BAEA,6BACA4b,yBACA,qCACAzZ,sDACAwO,sBACA9f,GAAiC/pD,yCAAuD6pE,kBAExF,SAGA,gFAEA,EAIA9f,uCAEA,4BADAA,QACA4lB,yDACA,EAGA5lB,qCACA,uDACA,EAIAA,sCAEA,4BADAA,QAEA4lB,2DAEA9F,mBACA,cAEA,EAGA9f,oCACA,uDACA,EACAA,uCACAA,sCACAA,0CACA,QAEA,oBACAA,wDACAgrB,0CACA,6BAAyDrkC,2BACzD,wBACAqZ,8BACA0mB,8CACA5C,4CAEA9jB,sBACAA,wBACAA,8CACAymB,+CACAC,6CACA5C,yCACA6C,yBACAJ,4BAGAvmB,6EAEAA,CACA,CACA,OAlFAZ,OAkFA0rB,+BACA5pB,+BACA1yE,wBACAA,cACAA,uBAEAA,uBACA,EAKAs8F,0CACA,iBACA,uBACAxZ,8BACA9iF,yBACA,2DAEA8iF,wDAGA,IACA,yCAEAA,kCACA9iF,uBACA,wDACA8iF,kCACA,IACA,4BAIA,EAGAwZ,2CACA,0CACA,EAIAA,4CACAt8F,oCACA,EAGAs8F,uCACA5pB,wCACA1yE,4BACAA,cACAA,0BAEA,EAEAs8F,2CACA,IACAnjB,EACAif,EACAtmB,EAHAN,OAQA,GAHAxxE,qEAGAA,sBAQA,2DACA,gCACA,GAEAA,gDACAA,sBACAy8F,gCAEAz8F,eACAA,iCACAm5E,2BACA,qBACAA,EA9KA,GAgLAA,GACAn5E,2BAGAs4F,IACAF,gCACAp4F,6BACA8xE,sCACAj6D,iBAEA4kF,sBACAnL,uBACA,GAGA8G,gCACAp4F,4BAGAA,8BAGAA,uCACAA,6CAvCA,MALAs4F,IACAF,gCACAp4F,2BA6CA,EAEAs8F,8CACA,SACAhL,iDACA,EAIAgL,gDACA,+CACAvkF,+CAEA,wBAEAA,IAEA,CAAqBA,MACrB,EACAukF,uCACA,OAAqBvkF,iCACrB,EACAukF,6CACA,WACAt8F,iCAEA,EAEAs8F,qCACA,4BACA,qCAEA,EACA,EACAA,CACA,CAvOA,CAuOKhL,QACLgL,+BAEA,kBAEA,gBACA,gCACA,sCACA9qB,gBACAA,aACA7uD,2CACAg8B,mBAEA6yB,CACA,CACA,OAXAZ,OAWA8rB,+BACAhqB,+BACA1yE,kDACA,EACA08F,+BACA,iCACAC,uDACA38F,gCAAkDA,kDAAgFqnE,iCAClI,EACAq1B,2CACA18F,4FACA,EACA08F,mCACA,uCACA,KACA,OACAhtB,wBACAlB,oBACAgmB,cACAr8E,MACAN,yBACAC,2BACAC,uBACAC,8BAEAy8E,QAGA,EACAiI,CACA,CA1CA,CA0CKpL,iBACL,mBAEA,QADAxyB,KACAzC,oBAAoDA,WAAgBA,KACpE,WACAyC,QACA18D,yBACAsW,wBAEA,CACA,QACA,CACA,mBAEA,aACA,8CACA,CACA,OAJAk4D,OAIAgsB,qCAEA,QADAn3B,KACAlf,IAA8BA,WAAwBA,KACtD,gCACAs2C,GACAp3B,QACArjE,cACAsW,UACAusD,8CACAC,wCACA3e,OAGA,CACA,QACA,EACAq2C,CACA,CAtBA,CAsBKtL,UAELwL,cAEA,oBACA,iCACA,oCACAtrB,wBACAA,8EAEAA,6CACAA,YACAA,0DAEAA,CACA,CACA,OAbAZ,OAaA0rB,+BACA5pB,+BACA1yE,aACAA,sBAEAA,8BACAA,oBACAA,4BAEA,EACAs8F,+BACA5pB,gCACA,6BACAgmB,kDACAvqB,8BACAnuE,aACAA,0BACAqnE,cACAqmB,oBACAX,wBACAuI,2CAGAt1F,sCAAwDmuE,SAAyB9G,cACjFqxB,cACA14F,oBACAA,qCAA2DmuE,UAA0B9G,cACrFqxB,+DAEA,EACA4D,2CACAt8F,yCACA,EACAs8F,CACA,CAhDA,CAgDKA,IACL,gBACA,uCACA,2BACA,CAEA,uBACA/nB,2BACAb,OACAylB,UACA3W,QACAua,cACAnC,wBACAoC,qBAEAC,aACA/lF,gBACAiP,UAA4B80C,SAE5BiiC,cACAhmF,gBACAiP,UAA4B0yE,aAK5BvJ,iBACAA,0BACAA,kBACAA,oBACAA,oBACAA,aACAA,aAEA38E,sCAAmDjB,UAEnD,GAAC,SCrzCD3R,KACA,qFACA,iFACAm4D,yCAAyEn4D,eACzE,CDizCC,CCjzCAC,mBAAkC,aAkBnC,sBACA,gCACA,CAAe+iB,wBAAgBvf,sBAAsCJ,iBACrE,eAA8B,uDAC9BA,MACA,EAEA,mBAEA,cAAwBpD,oBADxBm9D,SAEA/5D,2EACA,CAEA,iBACA,qCACA,mCAAqD7B,KAAOA,IAE5D,cADA8B,gBACAsP,6DAEA,SACA,EACAyqD,uBACA,EAEAk0B,kCACA,QACA6L,IACAC,KAcAC,aACA,gBACA,YACAr9F,oBACAA,iBAEAA,iBACAA,uBACAA,yBACAA,0BAEAA,mBACAA,wBACAA,uBAGAA,iCACA,4BAsNA,eACA,iCACA,CAvNAs9F,KACA9rB,gBACA,qCACAA,qCACAA,uBACAA,qBACAvX,0DAEAA,qDACA,CACA,EACAj6D,iCACA,kCACAwxE,oBACAA,oCACA,EACAxxE,+BACAi6D,6DACAA,yDACAuX,2DACAA,YACA,EAGAxxE,kCACA,mBACAwxE,sBACA,qCACAA,qCACAA,uBAGA,gBACAA,qBACAr/D,oDAEAA,kDACAA,qDAIAlS,yDAEA,CACA,EACAD,iCACA,kCACAwxE,oBACAA,oCACA,EACAxxE,gCACA,kBACA,gBACAmS,uDACAA,qDACAA,wDACAlS,6DACAuxE,2DACAA,aACAA,sBA+JA,aACA+rB,IACAC,sBACAD,GACA,EAASjM,8BACT,CAnKAmM,EACA,CACA,EACAz9F,kCACAwxE,oBACA,EACAxxE,8BACA,yBACA,sDACA09F,kDACAlsB,kCACAmsB,YACAC,2BACAC,uBACAC,SACAJ,SACAK,uBACAviF,wBAEA,CACA,EACAxb,oBACAA,gCACAg+F,sDACAA,wDAAgFrjF,aA8IhF,aACAwiF,KACAl9F,uCAAsE0a,YAEtE,CAjJAsjF,EACA,CACA,uCACAj+F,uEACAA,yEAAwF2a,aA8IxF,eACAwiF,GACAl9F,0CAAyE0a,YAEzE,CAjJAujF,EACA,EACAb,mCACA,+BACAc,YACA,aACAn+F,gEACAA,kBACAA,cACAA,mBACAA,uBACA,GAGA,EACAq9F,gCACAD,KACAp9F,mBACAA,oBACAA,iBAEAA,yBACA,EACAq9F,yCACA,qBACA/L,0CAGAtxF,gBAEA,EACAq9F,0CACA,8BACA,EAEAA,0CACAr9F,kBACAo9F,KAEA,EAGAC,0CACAr9F,yBACAA,sBACAC,uDAEA,EACAo9F,uCACAr9F,yBACAA,wBACAA,wBACAA,oCACAA,oCAEA,EACAq9F,2CACAr9F,wBACAC,yDAEA,EAGAo9F,kDACA,QACA7hF,KAEA,WACAxb,wBACAA,0BAGA+9F,0BACAviF,4BAEA,CACAmiF,aACAC,WACAC,yBACAC,eACAJ,eACAK,SACAviF,UAEA,EACA6hF,kDACA,IACAS,GACAJ,GAFAhkF,aAGAqkF,KACAviF,KAGA,oBACAsiF,cACAJ,gBAGAI,YACAJ,aAGAU,IACAp+F,kBACAA,oBAGA+9F,qBACAviF,sBAEA,CACAmiF,aACAC,WACAC,yBACAC,SACAJ,SACAK,UACAviF,UAEA,EACA6hF,EACA,CArOA,GA8PA,eACAD,GACA1iC,mBAEA,CAOA,iBACA,cACA16D,kBACAA,mBACAA,mBACAA,uBAEAA,8BACAA,iBACAA,qBACA,CACA,4CACAA,iBACAA,wDACAA,uCACAA,sCACAA,cACAA,cACAA,uBACA,EACAq+F,wCACAr+F,mDACAA,mDACAA,uBACA,EAEAq+F,uCACA7Z,GACAxkF,iBACAA,gBACAA,gCAEAA,kBACAA,yBAIAA,iBACAA,gBACAA,oCAEAA,kBAGA,EAEAq+F,kCACA,WACAC,cACA9sB,YACAt/C,IACA,EACAqsE,IACAv+F,eACAA,gBACAA,sBACAA,0BAEAA,+CAGAw9F,gBAEA,EACAa,+CACA,oBACAG,yCACAC,mBACA,qBACAC,QACApN,gBACAz5E,aACAE,aAEAu5E,kCACAmN,sBACAvsE,IACA,EACA,EACAmsE,gCACAr+F,gBACAsxF,+BACAtxF,oBAEAA,kBACA,EACAq+F,yCACAr+F,+BACAsxF,iCACAz5E,wCACAE,uCAGA,EACAsmF,oCACA,yBACAI,iBACA,aACAA,8CAGAha,iCACAga,gCACAnN,iBACAx6D,iBACA6nE,mBACAC,cACAC,uBACA9kF,uBACAC,wBACAlC,aACAE,cACA0F,WAEA1d,iCAEAy+F,EACA,EACAJ,EACA,CAvHA,GAiIAS,eAEA,kBACA,2BACA,kCACAttB,gDACAA,kDACAA,uBACA,EACAA,uBACAA,mBACAA,gDACAA,mDACAA,mCACAA,qCACAA,mCACAA,qCACAA,qCACAA,kBACAA,+DAEAA,EACA,CACA,OAtBAZ,UAsBAkuB,gCACA9+F,oBACAA,qEAEA,EACA8+F,qCACA,qBACA,EACAA,sCACA,sBACA,EACAA,uCACA9+F,uCACAA,qBAGAA,+DACAA,0BAEA,EACA8+F,wCACA9+F,wCACAA,qBAGAA,iEACAA,0BAEA,EACA8+F,uCACA,uBACA,EACAA,wCACA,wBACA,EACAA,uCACA,uBACA,EACAA,wCACA,wBACA,EACAA,2CACA,EACAA,EACA,CAnEA,CAmEKxN,oBACLyN,eAEA,kBACA,8DACA,CACA,OAJAnuB,UAIAmuB,uCACA,+BACA,EACAA,0CACA,mDACA,EACAA,EACA,CAZA,CAYKD,GACLE,eAEA,gBACA,0DACA,CACA,OAJApuB,UAIAouB,uCACA,aACA,EACAA,0CACA,OACAnnF,qBACAC,uCACAC,mBACAC,wCAEA,EAGAgnF,2CACAh/F,wCACA,EACAg/F,EACA,CAtBA,CAsBKF,GAKLG,0DAOAC,aACA,cACA,YAEAl/F,kBACAA,yCACAA,sBACAA,qBAEAA,yBACAA,yBACAA,oBACAA,uBAEAA,oBACAA,sBACAA,sBACAA,uBACAA,wBACA,mBACA,qGACA,OACA,UACAwxE,4CACAA,sBACA,MAEAA,iBAEA,CACA,CACA,CACA,0CACAxxE,iBACAA,qCACAA,yBACAA,yBACAA,oBACAA,sBACAA,sBACAA,uBACAA,uBAEA,EACAk/F,wCACA,mBACA,4BACAC,yBACAC,uDACAC,sDACAD,KACAp/F,oBAEAo/F,OACAp/F,uBAEAq/F,KACAr/F,sBAEAq/F,OACAr/F,wBAEAA,sBACAA,uBACAA,mBACAA,oBACAA,2BAEA,CACA,EACAk/F,6BACA,mBACAl/F,oBACA,kCAAyDq8D,aAAgBA,KACzE4G,OACAxyB,UAEAzwC,sBACA,CACA,EACAk/F,2CACAl/F,uBACAs/F,mCACA,EACAJ,wCACA,qBACAK,sBACAC,kBACAC,GACAD,cACAx/F,oBACAoV,KACA,oBACA,OACAA,UAEA,QACAsqF,yCACA,UACA,MACAtqF,UAEA,SACAsqF,uCAGA,EAEAR,6CAGA,QAFAK,qBACAI,QACAtjC,0BAAqDA,aAAgBA,MACrE,cACAlkD,iBACAynF,cACAC,eACAC,aACAC,gBAEAH,6BACAE,6CACAH,sBACAA,IAAqCD,wCAErCK,iDACAJ,sBACAA,IAAqCD,2CAErCE,iDACAD,sBACAA,IAAqCD,yCAErCG,mDACAF,sBACAA,IAAqCD,0CAGrC,CACA,SACA,EACAR,oCACA,8CACA,mBACA,UAGA,YAEA,EACA,EACAA,uCAEA,QADAvjC,MACAU,wBAAoDA,YAAgBA,MACpE,aACA,oBACAV,YAGAA,2EAEA,CACA,SACA,EACAujC,EACA,CApKA,GA4KAc,gBAEA,gBACA,6BAGAxuB,aACAA,gBACAA,wBACAA,uBACAA,mBACAA,gBACAA,kBACAA,yBACAA,sBACAA,6BACAA,eACAA,mBACAA,kBACAA,yBACA8f,kCACAA,oCAIA52B,YACAA,8BAEA8W,oCACAA,6BAEAA,0BACAA,+CACAA,iBACAA,eACAA,+BAIA,EACAA,6BACA,oBAEA,GADAA,qCACAA,uBACA,qBAEAusB,0BACAA,aACAriF,OACA81D,6BAEA,CACAA,eAEA,+BACAA,uCACAA,8CAEAA,iCAEA,CACA,EACAA,2BACAA,kBACAA,mBACA8f,gCACAA,kCACA9f,kCACAA,eACAA,sBACAA,mBAEAA,mBACAlxE,+BACAkxE,uBAGA,EACA,2BACA,oDACAyuB,6CACAA,yCACAzuB,eACAA,qBACAA,CACA,CACA,OArFAZ,UAqFAovB,gCACAhgG,sBACA,EACAggG,qCACA,WACA,4BACAhgG,0CACAwxE,sBACAA,oBACA,EAAiBxxE,YAGjBA,uBAEA,EACAggG,yCACAhgG,qBACAA,qBACA,EACAggG,kDACAhgG,4BACAA,qBACA,EACAggG,uCACAhgG,+CACAA,wDACAA,mBACAA,0BACAA,2CACAA,sCACA,6BACAA,iCAIA,EACAggG,sCAGAhgG,oEAEA,EACAggG,mCACAhgG,mBACAA,kCACA,EAEAggG,wCACAhgG,gCACA,EACAggG,6CACAhgG,4BACA,EACAggG,+CACAhgG,yBACA,EACAggG,+CACAhgG,8BACA,EACAggG,EACA,CAlJA,CAkJK1O,mBAUL4O,aACA,gBACAlgG,gCAEAA,4DACA,mBACA,EACA,CACA,uCACA,kCAAqDq8D,aAAgBA,KACrE4G,OACAxyB,SAEA,EACAyvD,oCAEA,QADAroF,sBACAwkD,yBAAqDA,YAAgBA,MACrE,aACAxkD,wCACA,CACA,SACA,EACAqoF,mCAEA,QADAnoF,qBACAskD,yBAAqDA,YAAgBA,MACrE,aACAtkD,sCACA,CACA,SACA,EACAmoF,8CAEA,QADA3oF,GAA0BM,gBAC1BwkD,0BAAqDA,aAAgBA,MACrE,cACA,8BACAi1B,mCACA,QAEA,CACA,QACA,EACA4O,EACA,CA1CA,GA6CA,gBACA,kBACA,8BACA,CAeA,kBACA,mBACA,WAEAlgG,yBACAA,uBACAA,qBACAA,oBACAA,mBACAA,oCACA,kBACAwxE,kBACAA,iBACAA,gBACAA,gBACAA,wBACAA,iCACA2uB,qBACA3uB,qCAGA2uB,oBAEA,EACAngG,kCACAwxE,kCACAA,mBACA,EACAxxE,iCACAwxE,iCACAA,gBACA,EACAxxE,kCACAwxE,gBACAA,iCACA,EACAxxE,gCACAwxE,aACAA,0CAEAA,uBACAA,iBACAA,+BACA,EACAxxE,uBACAmgG,oDACAA,gDACAA,8CACAA,gDACAA,4CACAngG,iBACAA,+BACA,CAGA,mDACA,IAGAogG,GAHAC,IAA8BxoF,4BAC9ByoF,KACAzC,gBAEAA,gBACAuC,qBACAE,0BAEA,4DACA,OACA,8BACA,oCACAC,KACAD,sBAEA,CACAtgG,mCACA,MAEAA,kBAAqC6X,aAErC,EACA2oF,wCACA,4FACAC,4BACAzgG,iBACAA,0CAEA,EACAwgG,oCACAxgG,+DACA,mBACA,EACA,EACAwgG,oCACA,2BACA,iBACAE,iBAEA1gG,sBACA,EACAwgG,+CACA,kDACAG,QACA,kBACA,wBACAC,UACA,+BACA,wBACAC,mBACAC,SACA9E,SACA+E,eACAhnF,oBACAC,oBACA,GAEA8mF,cACA9E,cACA,gCACAgF,MAGAtxB,sBACA4hB,6EACAqP,yBAEAK,iBACAA,kBACAA,gBACAA,mBACAL,MAEA,CACA,CACA,CACA,SACA,EACAH,EACA,CAvIA,GAwIA,kBACA,gBAGAj6B,2BAGA+qB,2CACA,CAMA,mBAEA,gBACA,6BACA9f,iCACA,kBAEA2uB,mEACA,EAEA3uB,6BACA,mBAEA,IADAA,mBACAyvB,gBACA,qDACAC,kBACAxxB,uEAEA,CACA,EAGA8B,kBAFA+K,aAEA59B,IACA6yB,qCACA,yEACA,wDACA2vB,yCACA3vB,CACA,CACA,OA5BAZ,UA4BAwwB,gCACAphG,uBACA,EACAohG,EACA,CAjCA,CAiCK9P,eAML+P,gBAEA,gBACA,6BACA7vB,qBACAA,iCACA,iCACA8vB,yBACA5xB,0CAEAywB,sBAEAA,oBAwDA,eACA,sCACA,kBACA3/F,6BAEAA,EACA,CA9DA+gG,SACA,EACA/vB,+BACAA,iCACA,EACAA,kCACA,4BACAgwB,QACAC,MACAT,KACAQ,GAqDA,qBACA,kBACAE,eACAC,IACAC,cACAA,YACAF,eACAA,cAEAC,0BAEA,QADAn6E,MACA60C,WAAkFA,aAAyCA,MAC3H,IACApjD,MADA4oF,QACAC,OACA,WACA,YAEA7oF,IACAmkD,QAEA,CACA,iBAAwBh7D,uBACxBolB,mBACAA,EACA,CA7EAu6E,gFACAP,6CACAC,MACAD,UAGAA,GACAnjC,aAAwCnnD,mCAExC8qF,IACA3jC,aAAwCnnD,wBAExCuqF,GAIAnQ,kBAHAA,iBAKA0Q,KACAxwB,mBAEA,EACAA,+BACAA,kBAEAA,2DACAA,qBAEA,EACA,oBACA2uB,4BACAA,yBACAA,8CACAA,+CACA,yEACA,wDACAgB,6CACAA,6CACAA,6CACA3vB,CACA,CACA,OA9DAZ,UA8DAywB,gCACArhG,uBACA,EACAqhG,EACA,CAnEA,CAmEK/P,eAkCL2Q,eAEA,gBACA,6BAEAzwB,kBACAA,gBACAA,kBACAA,sBACAA,yBACAA,qBACAA,6BACAA,iCACA,2BACA9B,6BACA99C,aACAswE,eACAC,yCAEAC,IADA5wB,4BACAlT,oBACAkT,6DACA2uB,2DACAA,SAEAzlC,yCA0SA,eACA,qCACA,kBACAl6D,6BAEAA,EACA,CA/SA6hG,KACA,KACAzwE,oBACAA,+CACA,iCACA0/D,mCACA6O,sBAGA3uB,iBACA9W,+CACA,EACA8W,+BACA,4BACAwB,gBACAovB,0BACA1nC,WAEA0nC,uCACAF,aAAmDhrF,yCAKnDgrF,aAA+ChrF,wBAE/Cs6D,eACA0wB,gBACAA,qCACA,CACAvjD,mBACA7M,4CACAk0C,qBACAxgB,yBAIA,EACAgM,kCACA,gBAGA,yBACA0vB,4BACAgB,wBAEAI,QACAp+B,QACAq+B,QACAd,MACA9sF,IACAo6D,kBACAC,wCACAC,WACAC,sBAEA,OACA,oBAEAgzB,MADAI,iBAEAE,yCACAt+B,GA4MA,qBACA,kBACAw9B,eACAe,iBACAC,kBACA1/B,MACA4+B,uBACA5+B,oBACAA,qDACA0+B,YAGAe,sBAGA,0EACAX,uBACA,MACAnyE,kBACAqzC,cAOA,QALAkB,IACAZ,cACAC,YACAP,kBAEA3G,WAAkDA,aAAyBA,MAE3EsmC,EADAC,QACA1+B,UAEA,SACA,CA3OA2+B,yDACA3+B,KACAq+B,yDACA5tF,oBACA6tF,4BACAf,MACAv9B,QACAq+B,QACA5tF,8CAKA2tF,OAEA,CACA9wB,qBACAiwB,GAIAnQ,kBAHAA,iBAKA0Q,KACAE,SACAY,WACA5+B,SAEAsN,qCAGAA,0EAEAA,uBACAA,mBACAA,4BAEA,EACAA,6BACAA,cACAA,WAEA,EACAA,6BACA,iBACA,4BACAuxB,oBACAT,uBACAn8B,oBACAQ,yBACAsC,4BACA+5B,oBACAT,2BACAU,0BAUA,GATAzxB,cACA0xB,oCACA,CACAvkD,mBACA7M,SACAk0C,qBACAxgB,WAGAgM,iBAEA,YACA0xB,aACAhsF,oBACA6mD,gBAGA,QADAolC,MACA9mC,oDAA8GA,aAAgBA,KAE9He,QADA6F,QACAuO,qBAEApU,MACAze,gBACAhvB,iCACAyzE,YACAtxD,qBACAoxD,0DACAG,kBACAH,aACAhsF,oBACA6mD,eAEA,EACAioB,qBACAxgB,UAEA09B,oCAEA,SACAZ,IACAY,iCACA,CACAI,uBACAxxD,SACA0zB,WAGA09B,aACAhsF,8BACAs1B,8CAEA81D,aACAprF,oBACA6mD,qCAEArD,YACA4nC,aACAprF,oBACAkrF,gCAGA,yCACAmB,0BACAA,wBACAA,qBACAjB,gCACAA,mCACA,CACAgB,uBACAxxD,qBACAwwD,kDACA98B,oBAGA,OAGA09B,kCAEA,CACA1xB,WACA,EACA,mBACA2uB,4BACAA,gCACAA,yBACAA,+CACA,mEACA,6CACAgB,iDACAA,6CACAA,6CACAA,6CACAA,yCACA3vB,CACA,CACA,OA3OAZ,UA2OAqxB,gCACAjiG,uBACA,EAEAiiG,wCACA,IACAuB,0BAEAA,aAIAA,YADAA,KANAxjG,wBAOA,CACAkX,sBACAkxD,OACA2G,gCACAC,wCACAC,WACAC,oBAMA,CAA4Ch4D,0BAG5CusF,IACAA,aAAwCvsF,+BAExC,EACA+qF,kCACA,+BACAK,yBACAA,GACAA,YAA6CprF,0BAG7CgrF,QACAA,aAA2ChrF,yBAE3C,EACA+qF,gCACAjiG,qBACAA,mBACAA,qBACAA,yBACAA,4BACAA,wBACAA,+BACA,EACAiiG,2CACAA,EACA,CAjSA,CAiSK3Q,eAyCLoS,eAEA,gBACA,6BAEAlyB,mBACAA,kBACAA,sBACAA,qBACAA,6BACAA,iCACA,mBACA7L,kBACAqN,8BACAxB,sDAEAA,6EACA9W,sEACA,EACA8W,+BACA,4BACAwB,gBACAxB,2FACAA,6BACAnT,cACAA,uCACA,CACA1f,oBACA7M,4CACAk0C,qBACAxgB,wBAGA,EACAgM,qCACA,4BACAmyB,oBACAzC,4BACAv6B,yBACAzC,QACAq+B,QACAd,MACA9sF,IACAo6D,kBACAC,wCACAC,WACAC,uBAEA8xB,KACA98B,GAwGA,0BAMA,QALAT,wBAGA9zC,eAFAmyE,wBACA8B,wBACAngC,2BACAj8C,MACA60C,WAAoDA,aAA0BA,MAC9E,IACApjD,MADA4qF,QACA/B,OACA,WACA,YAEA7oF,IACAmkD,QAEA,CACA,OACA,4BACA,wBACA51C,WAIAi8C,yBACA,sBACAj8C,GAGA,WACA,CArIAs8E,sHAEA5/B,KACAq+B,yDACA5tF,oBACA68D,qCACAiwB,MACAv9B,QACAq+B,QACA5tF,wBAIA0pD,YADAkkC,GACA,CACArrF,wBACAkxD,UAIA,CAAwClxD,4BAExCuqF,GAIAnQ,kBAHAA,iBAKA0Q,KACA99B,eACAA,SAEAsN,mBACAA,2BAEA,EACAA,6BACA,4BACAhM,oBACAW,oBACAQ,yBACAsC,4BACA06B,oBACApB,2BACAlkC,sCACA,CACA1f,oBACA7M,SACAk0C,qBACAxgB,WAGAgM,iBACAnT,aACAnnD,oBACA6mD,gBAEAM,kCACA,CACA1f,oBACA2kB,2DACAC,uDACAwgC,aACAjyD,qBACAusB,0DACAglC,kBACAhlC,aACAnnD,oBACA6mD,eAEA,EACAioB,qBACAxgB,YAKAnH,qCAGAmT,mBACAA,sBACAA,oBAEA,EACA,oBACA2uB,4BACAA,kCACAA,yBACAA,+CACA,yEACA,wDACAgB,6CACAA,6CACAA,yCACA3vB,CACA,CACA,OAhJAZ,UAgJAqxB,gCACAjiG,uBACA,EACAiiG,mCACA,8EACA,EACAA,EACA,CAxJA,CAwJK3Q,eAgCL0S,aACA,gBACA,YACAhkG,kCACAA,2BACAikG,aACAzyB,gCAEA,EACAxxE,sCACA,yCACAooE,YAEA,uBACA,sBACAoJ,6BACA,CACA,kCACA0yB,gCACAlrB,4CACA3a,eAEA,CACA+J,oBACAkpB,wCAEAjzB,aAA4CnnD,uBAE5C,CACAs6D,+BACA,EACAxxE,iBACA,2CACAmkG,sBACAA,uBACAA,mDAIA9lC,6BACA,CACA,uCACAr+D,0CACAA,8BACA,EACAgkG,EACA,CA9CA,GAqDAI,aACA,mBACA,WACApkG,4BACAA,yBACAA,2BACAA,mBACAA,kCACAwxE,wCACA,EACAxxE,wCACA,8BACAsiG,QACA+B,QACA5C,MACA9sF,IACAo6D,yCACAC,wCACAC,0BACAC,cAEA8xB,IAEAxvB,mCADA8wB,4BAEA+B,GA2GA,qBAEA,QADAC,OAAkCC,kBAClCloC,oDAAiFA,aAAgBA,KAEjGe,OADA6F,QACAuL,QAEA,kGACAnQ,IACAj8D,kBAGAosE,0BACApsE,oCAEA,mBACAi8D,+BACAA,oCAEA,OAAiBqG,gBADjB4sB,gCAA6DlvF,kBAE7D,CA9HAoiG,4BACA7vF,0CACA8sF,mCAEA9sF,2CACA0vF,UAIA7yB,qBAGA2uB,sEACAsB,GAIAnQ,kBAHAA,iBAKA0Q,KACA7B,6BACA3uB,uBACAA,oBAEA,EACAxxE,gCACA,+CAEA,GADAwxE,cACA8wB,QACA,8BACAmC,qBACAF,cACApvB,qCACAA,0BACAA,wBACAA,WACAmtB,gCACAiC,YACAjC,aACAprF,oBACA6mD,qCAEA2mC,YACApC,aACAprF,oBACAkrF,yCAIAE,mCACA,CACAgB,uBACAxxD,4CACA0zB,WAIA,CACAgM,yBACAA,qBACA,EACA,8DACA2vB,qBACAA,gDACAA,gDACAA,4CACAnhG,wBACA,CACA,+CACA,6CACAsxF,uCAEA,yCACAA,2CAwDA,eACA,OAOA,mBACA,+BAEA,gCADAqT,mBACA,EACA,CAXAC,aACA9xF,MACA+xF,eACA,CAAclY,WACd,0BACA,CA3DAmY,IAEA,EACAV,yCACA,6BACAZ,WACAA,YAAwCtsF,0BAExCusF,IACAA,aAAwCvsF,gCAExC,EACAktF,kCACApkG,wBACAA,iCAAkDkX,yBAElD,EACAktF,iDACA,2BACA,2BACAnrB,MAEA,wBACA1S,+BAGA,EACA69B,EACA,CAhIA,GAgKA9S,2BAYA,kBACA,mBACA,gBACA,SAAuC/U,OACvCv8E,oCACA,kBACAijE,mCACAk9B,eADAl9B,iBAIAvI,oDACAylC,SACAzlC,WACA8e,oCACA,CACA,EACAx5E,kCACA06D,YACA8W,kBACA9W,6CACA8W,4DAEA,EACAxxE,iBACA,gCACAmgG,yBACA,wBACAA,qCAEA,oBACAA,kCAEAA,oDACAA,gDACA,sBACA,CACA,uCACAngG,uBACA,EACA+kG,EACA,CAxCA,GAgDAC,gBAEA,gBACA,6BACAxzB,sBACAA,oBACAA,uBACAA,iCACAA,oCACAA,oBAEAA,iCAEA,EACAA,iCACAA,oBACAA,gCAEA,EACAA,+BACAA,kCACAA,oBAEAA,+BAEA,EACA,2BACA,wDACAyuB,iDACAA,6CACAzuB,CACA,CACA,OA/BAZ,UA+BAo0B,gCACAhlG,sBACA,EACAglG,wCACAhlG,wBACA,EACAglG,6CACA,MAGAhlG,uBACAA,yCACAA,+BAGA,CACA,0BACAi6D,4CACA,KACAwkC,IACAz+F,uBACAy+F,4BAEA,CACA,EACAuG,EACA,CA1DA,CA0DK1T,mBAML2T,cACA,mBACA,eAGAC,eACAA,uBACAlH,KACAzhB,WAGAA,UAEA,+BACA,iCACA4jB,oCAEAnC,eACAmC,oCAEA,qCACAA,qCAEA,sBACA,CACA,uCACAngG,uBACA,EACAilG,EACA,CA7BA,GA+BAE,mBACAlxB,iCACAC,yBACAM,yBAGA8a,eACAA,+BACAA,oBACAA,yBACAA,aAEA38E,sCAAmDjB,UAEnD,GCrmEA,4BACAzR,cAEAmlG,yDACAC,KACA,GASAC,iBAGA,oCACAC,IAEAC,eACAC,uCACAC,iFACAC,MACAC,mBACA,uBACA,gDACK,yBACL9pC,qBAEAA,wBAAsCsO,qBAAsBA,sBAE5D,EAEAlzD,iBACA,qEACA,EAEA2uF,kBACA,eACAlzF,gCAAyCjB,YAEzCoB,MACA,EAGAhC,oBACA,qBAGA,OAFAmyC,QAEA/rC,OACA,SACA,sBACA,0BAEA,SAGA,aAFA+rC,qBAEAjD,EACAA,sBACAlvC,2BAIA,aAEA,QACA,0BACAmyC,oBAEAnyC,KACAmyC,qBAEAjD,wBACAlvC,sBACA,GAEAA,GAGA,QACA,GAGAg1F,WACAC,qBACA,mCAEA,eACAC,UAGA,QACA,EAWAC,+BAEA,OADAC,kBACAhkE,GAEA,wBAGA,aAFAikE,eAGAA,sBACAC,WAIA,QACA,CAEA,SAEA,eAEA,wBAEA,QAEA,eAEAD,sBACA72F,WAKAA,SACA,CAIA,iDACAoC,iBACA1R,UAEA,GAEAkmG,MACA,EAGAG,sBAEA,aADApjD,QACAjD,EACAA,sBACA9tB,sBAEA,oDAIA,sDACA+wB,yBACAuiD,8BALAviD,yBACAuiD,gCAQA,GAEA57D,WAEA08D,2BACAd,iCACA,EAEAe,kCACA,OACAr0E,WACAq+D,6GAGAiV,qCAIA,UAFAtpF,6CAEA3a,IAAyB6Z,UACzBoqF,uCAEA,EAEAgB,iCAIA,QAFAC,QAEAttF,yBACAA,eAGAA,IACAstF,iDACAL,kBAIAhrF,yEAEAA,cAIA,aAFAjC,gBAEAutF,YACAvtF,0EAIA,IAEAwtF,GACAvrF,UACAqrF,WACAL,UACAnsB,KANA7+D,eAWA,GAFAoqF,sCAEAmB,mBAOA,OANAA,SACAnB,kCACAmB,6BACAnB,uCAEAA,0BAMA,GAFAA,kCAEAoB,iBACA,6BAEAC,wBACAF,yBAEAnB,+BAEAmB,sCAEAz0E,qBACAszE,iCACAA,yBACA,EAEAqB,8BACAJ,oBACAxsB,YACA6sB,oBAEA,MAEAH,2DAEAnB,+BAEAmB,sCAEAz0E,aAEAszE,iCACAA,yBAEA,EAEAuB,0BACA,OACA9sB,OACAmsB,UACAK,YAEA,wCACAE,sCACAnB,gCACAwB,gDACA,EAEAC,qCACA,cAEA,eACA,6BAIA,SACA,OAGA,WACAC,iCAEA,YAAmBr3F,aAAqBA,GACxC,WACAqyB,WACAilE,iBACAC,aACAC,KACAC,UAEA,yBAEA,iDACAC,yCACA,CAEAA,eAGA,iBAAwChmG,YAAmBwR,sBAE3D,YAEA,qBAEA,OAGA,qBAIA,uBAGA,GAFAw0F,gBACAC,aAEA,MAQA,QALA3hF,4BACAF,sBACA7V,MACA4F,IAEAnG,WAAoCO,4CAAmEA,GAGvG+V,IAFAnQ,qBAGAnU,GACAwR,KAKA,qBACA,SAIA00F,QACAr+C,eACAo+C,UACA,KAAO,CACPD,cAEA,gBACAE,GACA,CAEA,OACA,KACA,MAGA,QACA,CAEAN,IACAE,uBAKA1hF,GAFAE,eACA2hF,kBACAr3E,OAFA,IAGA+6B,eACAC,aAEAjrD,SAEAgrD,MACA3pD,GACAwR,YACA7S,WAGA,yCAaA,GAXAA,UAEAirD,GACAjrD,UAGAsD,kCAEA,MACAgiG,gCAEAkC,EACA,MACA,CACA,EAEA,EAEAC,yBACA,UAEAC,SAEA,MACA,eACAxB,iBAGAA,MACA,CAEA,oCAEAyB,CACA,EAEAC,OACAp8E,OAEAxpB,kBACA,kBAEA4lG,cAEAA,YACA,EAEAC,kBACA,qBAEA,eAIA,cAA2B71E,UAC3BA,IAEA,IAIA80E,+BACAhnG,YACAA,eACAA,aAEAA,6BACAA,eACA,EAsCA,GApCAgnG,6BACA,sBACA,SAGA,4BACA,yBACA,0BACA,GAAGgB,SAGH,OACA9wF,YACA8hD,oCACAivC,WACA/3B,yBACAg4B,cACAzB,WACAttF,UAGA,YACA,uDACA3V,uCACA,CAEAgiG,sBAEA,gDACA,2DAAyE,GACzE,GAAEwC,UAEF,4FAEA,GAEAG,eACA,gCAKA3C,+BAEA2C,6CACA,yBACAnC,aAEAc,mBAEAqB,8BAHA9xB,OAGAmvB,mBACAsB,GACAqB,aAEA,GAAG,IAGHA,YAIA,2FAEA,WACA3C,kBAEAA,2CACA,gCACAvlG,6BACAA,6CAEAA,qCAIAg6D,+DAKAkuC,WAEA,CArhBA,UAuhBAC,6BACAA,6BAIAroG,aACAA,oBAQAulG,wBACA+C,0BACAC,wBACAC,8BACAC,gCACAP,KACAV,iHACAH,UACAllE,QACA+lE,KACAV,0BACArlE,QACAumE,oBACAC,2BAGA,cACAnB,4DACArlE,QACAumE,aACA,KACA,CACAlB,wBACAJ,kBAKAsB,mBACA,aACAlB,oBACArlE,QACAwmE,6BAMAC,4BAGArD,8DACAA,8BAGAA,mCAEA,oBACAqB,6CAAsD,KAEtD,GAEArB,2CACAA,4CACAA,8CACAA,2CAOAA,qBACA+C,2BACAO,QACArB,sCACArlE,QACA2mE,iBAIA99B,qEACAwlB,oCACAzzE,QACAyqF,wDACAH,WAEAtlE,wDACAgnE,4BACAC,6BACAN,wBAGAnD,2DAEAA,yBACAA,6CACA/xF,OACAg0F,kDACAJ,cACAjlE,2BACAolE,qBACAF,aAIA9B,oDACA,cACAiC,qDACArlE,QACA,aACAqlE,qBACArlE,0CAEAumE,oCACA,cACAlB,cACArlE,6BAGAolE,uBAEEhC,6BAOFA,uBACA+C,SACA,CACAd,0CACAJ,eAEA,CACAI,2BACAJ,cACAC,YAGAtqF,QACAyqF,yDACAH,WAEA,cACAG,yGACAJ,cACAjlE,QACAumE,sBAGAO,qHACAxjF,6BACAujF,6BACAnjF,+DACAqjF,mEACAR,6BAQAnD,2DACA0D,sUACApjF,+GAEAmjF,yDACAE,4GAGA3D,qDACA4D,OACA3B,wHACAJ,cACAC,WAGA,qBACAG,gIACAD,kBAEA6B,gCAGA7D,oDACA,mBACAiC,2CACAH,UACAllE,QACAknE,eACA7B,oBACArlE,QACA,6BACAqlE,kBACAD,qBAEAM,YAGA9qF,qBAIAwoF,0GAEAA,wBACAA,6CACA+D,QACA9B,oDACAJ,cACAjlE,kCACAolE,4BACAF,aAKA9B,qDAQAD,iEAIAA,oCAEA,OACAiE,gBACAC,YACAC,UACAC,iBACAC,kBACAC,UACAC,YACAtmG,MACAumG,aAGArmG,2FAKA,QAFAijG,GAFAnjD,6BAEAnqC,IACA6sF,gCACA7sF,yBACAA,eAOA,GAJAA,IACAstF,sCAGAA,IACA,sCACAA,UACA,CAEA,qCACAxsB,2BAEA6vB,iBAEA7vB,8BAEA6vB,iBAEA,yBAEAr0B,mBAEAA,gCACA,kBAEAA,8BACAwE,6BAEAqrB,2BAGArrB,cADAxE,cACA,+DAGA,gDAGA,EAEAA,YACA,GAEA6vB,uBACAA,iEACA,2BACA,gGAGA,mCACAz2F,8BACA,4EACAA,8BACAA,UACAA,EACA,EAGA,EAEAorD,wEAEC,SCp2BDisC,KACA,kDACAkC,mBACA,sCACA2B,aACA,yBACAza,kBAEA4W,WACA,CD21BC,CC31BAlmG,gBACD,mBAEA,SAGA,eAGA,SACA,qBAGA,aACAsvF,WACAznD,MACAmiE,WAIA,2CAGA5B,YAGAA,SACA,CAIA,aAGA6B,MAGAA,OAGAA,IACA,CAxCA,CA0CA,CAEA,gBAEA7B,eAGA,EAEA,gBAEA,aAEA,IAEA8B,IAFAD,MAMAE,IAFAF,OAIAG,QAEAC,OAIAC,IAFAL,OAMAM,IAFAN,OAMAO,IAFAP,OAMAQ,IAFAR,OAMAS,IAFAT,OAMAU,KAFAV,OAMAW,KAFAX,OAMAY,IAFAZ,OAMAa,KAFAb,OAMAc,IAFAd,OAIA,cAAwC,0BAAuCe,WAE/Eb,oBACA,wBACA,iCACA,wBACA,4BACA,yBACA,wBACA,yBACA,0BACA,wBAEA,8BACA,6BACA,+BAGAD,kFAEA9B,mBAEA,EAEA,gBAEA,aACA,YACA6C,OACAC,QACAC,QACAC,QACAC,QACAC,QACAC,QACAC,OACAC,QACAC,QACAC,OACAC,OACAC,GACAC,cACAnf,gBACAof,YACAC,cACAvkE,oBACAwkE,qBACAC,iBACAC,eACAC,gBACAC,iBACAC,gBACAC,iBACAC,eACAC,YACAC,oBACAC,gBACAC,gBACAC,kBAGAl6F,sCAAgDjB,WAChD49E,WAGA,EAEA,gBAEA,aACA,2CACA,gDACA,aAAqBtvF,mBACrBoD,qEACA,EACA0pG,OACAC,OACAnB,OACAoB,cAEA,aACA,oCACA,CACA,OAJAp8B,QAIAo8B,oCACAhtG,oBACA,EACAgtG,8BACA,WACAt6B,8BACA1yE,4BAEA,qEACA,IACA,WACAwxE,iCAOA,CANA,MACAy7B,GACA,iCACA,OAEA,OACA,CACA,EACA,EACAD,mCACA,4BACA,qBAEAhtG,4CACAktG,eACA,EACA,EACAF,qCACA,0CACA,+BACA,iCACA,MAEAE,eACAA,kBAGA,SAEA,EACAF,6CACA,QAAiC9zF,UACjC,QAAkCiX,oBAClC,aACA,oDACA,wBACA,mCACAg9E,UAEAD,iBACAC,kCAEAC,IACA,GACAD,CACA,EACAH,8BACAhtG,kCACAktG,UACA,GACAx6B,6BACA,EACAs6B,uCACAhtG,4CACAktG,mBACA,EACA,EACAF,qCACA,mCACA,KACAE,WAFAjqC,KAEAvxD,SAEA,CACA,+CACA1R,mBACA,CACA,EACAgtG,uCACA,sFACA,qBACA,GACA,+FAEAK,oBACA,EACAL,8BACA,0CACA,mBACA,EAAU,EACV,EACAA,uCACAhtG,kCACAstG,mBACA,EACA,EACAN,gCAEA,GADAt6B,gCACA,yBACA,oCACA,0CACA1yE,oBACAktG,YACA,MAEAltG,aAGA,EACAgtG,oCACA,QAAqCO,MACrC,4CACAz2E,aACA,sBACAA,uBAEA,SACAA,cAEAA,EACA,EACAk2E,oCACAhtG,uBACA,EACAgtG,gCACA76F,gBACAA,qBAEAugE,gCACA,EACAs6B,gCAEA,QADA,QAAiC3gB,OACjCA,GACA,SACA,YACA,qBACA,gBACA,CACA,mBACA,6CACArsF,wDACAktG,eACA/hD,gBACA,GACAA,CACA,EACA6hD,8BACAhtG,yCACAA,aACA,EACAgtG,+BACA,WACAQ,UACAC,sBACAvpC,6CACAspC,6BACAE,+BAEA,GACAA,sBACA,yBACAzzC,8EAIA,iBACA,UAEA,+DACA0zC,WAEA,GACAH,qBACA,8BACA,GAAUI,mBACV,aACA,EACA/+F,8DACA,GAEA,CACA,GAAU9N,oBACV,WACA,sBACA8sG,yBAEA,YACAF,2BACA,gBACAA,wBAEAn8B,oBAEA,EACA,EACAw7B,CACA,CA1MA,CA0MED,WACF,cACA,gBACA,WACA,IACAY,aASA,CARA,MAEAA,2BACA,gDACAA,wBACA,GACAv6F,uCACAu6F,UACA,CAEA,QACA,CACAh7F,sCAAgDjB,WAChD49E,WAGA,EAEA,cAEA,aACA,iBACA,cACAtvF,2BACAA,aACA,CACA,sCAEA,QADAq7F,KACAh/B,IAA0BA,mBAAuBA,IACjDg/B,kBAEAr7F,+BACAq7F,YACAr7F,kCAEA,EACA8tG,kCAEA,QADAprE,oBACAA,OACA,SACA,SAEA,QACA,EACAorE,wCACA16F,SACA,SACAA,cACA,eACA26F,eAEAA,SACAA,gBACA/tG,cAGA,iBACAA,iBACAoT,iBACApT,cAGAoT,cACApT,uBAEAA,cACA,EACA8tG,gCAEA,QADA50F,gBACA,UACA,SACA,SACAA,cACAwpB,QACA,CACA,QACA,EACAorE,iCACA9tG,mBAEA,eACAoT,oBACA,eACAA,oBACAA,gBACApT,kBACAoT,gBACApT,kBACAA,eACA,EACA8tG,kCACA,oBAAmCE,aAEnC,WACA,QACA,iBACAA,UACA1+F,CACA,CACA,EACAw+F,qCACA,QAAqCP,MAErC,QADA7qE,oBACAA,QACA,iBACA,sDACA,YAEAxpB,IACA,CACA,cACA,EACA40F,iCAEA,QADAprE,oBACAA,OACAxQ,IAEA,EACA47E,uCACA,WAIA,QADAprE,EADAugC,eACAgrC,IADAhrC,KACA3yC,gBADA2yC,OAEAvgC,gBACA,iBACAxpB,IACAgZ,2BAGAA,yBAEA+7E,IACA,CACA,EACAH,6BACA,iCACA,oBACAI,CACA,EAAU,GACV,EACAJ,kCAEA,QADAprE,oBACAA,OACAwrE,SAEA,QACA,EACAJ,EACA,CA/HA,GAgIAn7F,sCAAgDjB,WAChD49E,WAGA,EAEA,gBAEA,aACA,YACA6e,aACA,cACAnuG,eACAA,aACA,CACA,oDAEA6T,eACA,uBACA,EACAQ,cACAwE,kBAEAs1F,qBACA,sBACA,+DAEA,MACA,oCACA,qBACAz8F,kBACA8oD,6BACA9oD,gBAIA0B,EADA,mBACA6mD,0CAEAj6D,2BACAi6D,0BAGAA,yCAIA7mD,uCAEApT,gBACAoT,gCAEAA,CACA,EACA+6F,8BACAnuG,2BAA6C2tG,UAC7C,EACAQ,6BACA,+BACA,mBACA,EACAA,8BACA,mBACAnuG,qCACAA,yBACA,EACAmuG,mCACAnuG,kBACAsC,QACA,EACA6rG,uCACA,wBACA,sCACAR,oBAEA,sCACA,oCACAA,UACAS,aACA,CACA,EACAD,qCACA,iDACAE,gBACAruG,6BACA,EACAmuG,qCAKA,GAJA,mBACAnuG,kCAEAsuG,gCACA,QACA,iBAEA,+CACAA,yDAEAtuG,aACA,EACAmuG,kCACA,oBACA,kBACAh8F,CACA,EACAg8F,8BACA,QACA,EAEAA,+BAEA,YADA,QAAgCjI,eAChC,2BACA,EACAlmG,uDACA,EACAmuG,gCAEA,wCACAnuG,mCAEA,EACAmuG,8BACA,+BACAnuG,kDAEAA,aACA,EACAmuG,gCACA,iBAEAh8F,mCACAA,WACA,EACAg8F,sCACA,0CACA,uBACAI,CACA,EACAJ,gCACA,2BACA,EACAA,oCACA,QAAqCV,KAErC,EACAU,+BACA,0CACA,0BACAnuG,sCAEAwuG,oBACAA,CACA,EACAL,CACA,CA9IA,GA+IAA,sBACAx7F,sCAAgDjB,WAChD49E,WAGA,EAEA,cAEA,aACA,0CACA,gDACA,aAAqBtvF,mBACrBoD,qEACA,EACAqrG,eAEA,cACA,MACA,OACAj9B,cADA6E,qBACAr2E,MACAq2E,UACA7E,0BACAA,CACA,CACA,OATAZ,OASA69B,CACA,CAXA,CAWEC,OACFpf,oBACA,IAKAwc,EACAA,EANA5D,KACAh4B,KACAy+B,KACAC,KAsCA,gBAEA,MACA,QAFA,QAA6B9mE,SAE7B,mBACA0/D,qBAEAwE,kBACAxE,iBAEA,mBACAwE,kBACAxE,UAEAwE,qBACAxE,oBAGAwE,0BACA,iDACA,eAEA,GADAxE,UAEA,MAEAA,iBACA,CACA,eACA,KACA1/D,oCACA0/D,EACA,IACA,CApEAlY,qBAEAwc,EAYEA,yBAXFA,iBACAA,sBACAA,8BACAA,oBACAA,uBACAA,sBACAA,gCACAA,iCACAA,yCACAA,2CACAA,kBAYAxc,SATA,gBACA,WACA,WACA,4CAEA,QACAl8E,kCACA,iBACA,EAYAk8E,OAVA,gBAEA,YADA,QAA8Buf,MAC9B,QACA,KACA,oBACAz7F,mBACAy7F,EACA9C,kBACA,IACA,EAkCAzc,UA6CAA,WA5CA,aAEA,QADAwf,KACAzyC,IAAsBA,mBAAuBA,IAC7CyyC,kBAEA,cACA,yBACA,WACA,GAEA,WACA,4DACA,mCAEA,2BACA,+CAGA,GADAF,4BACA,2BACA1G,uBAGA,oBACAh4B,kBAEA,iBAEA6+B,UADAvrG,yBACAurG,0BACA,sBACA,GAGAA,wBAEA,qDACAC,uBACA,iCACAL,OAEA,EACA,CAEA,QACA,CAIA,EAEA,gBAEA,aACA,2CACA,gDACA,aAAqB3uG,mBACrBoD,qEACA,EACAooG,OACAG,OACAsD,OACArD,OACAsD,cAEA,aACA,oCACA,CACA,OAJAt+B,QAIAs+B,sBACA,sCAGA1rG,4BACA2rG,6BADA,EAIA,EACAD,8BACAx8B,8BACA1yE,2CACA,EACAkvG,iCACA,iBACA38D,uBACAvyC,+BAEA0R,GACA,6DACA1R,qBAGA,EACAkvG,+BACA,+BACA38D,qCACA,iBACAD,4BAEAA,CACA,EACA48D,sCACA,6CACA,+BACAX,CACA,EACAW,+BACA,WACAx8B,gCACA+6B,mBACA,kDACA,IACAztG,uBAEA,EACAkvG,+BACA,sCACA,6DACAlvG,wBAEAwuG,CACA,EACAU,CACA,CA3DA,CA2DED,WACFt8F,sCAAgDjB,WAChD49E,WAGA,EAEA,gBAEA,aACA,YACAmd,aACA,uBACA,QAAmCl6F,MACnCvS,gBACAA,eAIAA,WAFA,cAEAuS,uBAHAq5F,iCAMAA,mBAEA,oBACA5rG,2BACA,CACA,0BACA,2CACA,aACA,EACA,EACAysG,8BACA,2BAEAr5F,gCACA,EACA,EACAq5F,iCAEA,aADAb,uDACA,mDAIA,EACAa,+BACAr5F,+BACA,EACAq5F,8BACA,mCACA,4BACA,EACAA,CACA,CA1CA,GA2CA95F,sCAAgDjB,WAChD49E,WAGA,EAEA,gBAEA,aACA,YACAmc,QACAC,QACAE,OACAwD,aACA,cACApvG,mBACAA,eACAA,YACA,CACA,2CACA0R,EACA29F,wBACA,4BACArvG,qCAGAA,8BAKAqvG,8BACArvG,4BAEA,EACAovG,6BACA,WACApvG,mBACA,oCACAkwE,+BACAo/B,+BACApH,0CACA,mCACAqH,0BACA/9B,2BAEA,EACA,EACA49B,6BACA,WACAz8F,iDACA,uCACAR,aACA,EACA,EACAi9F,6BACA,WACApvG,aACA2S,iDACA6+D,iCACA,GACAxxE,kBACA,EACAovG,8BACA,WACA,yDACA,6CACAlH,CACA,EAAU,GACV,EACAkH,CACA,CA1DA,GA2DAz8F,sCAAgDjB,WAChD49E,WAGA,EAEA,gBAEA,aACA,2CACA,gDACA,aAAqBtvF,mBACrBoD,qEACA,EAEA,gBAEA,OADAgQ,6BACAo8F,gCACA,2BACA,EACA,CACA,kBAEA,aACA,oCACA,CACA,OAJA5+B,QAIA6+B,mBACA,iEACA,yCACA,EACA,EACAA,8BACA,2BAEAzvG,eACAoT,qCACA,EACA,EACAq8F,+BACAjI,kBACAzmG,oBACAqS,qBACA,GACA,wBACAA,0BAEA,EACAq8F,8BACA,IACA/9F,GADA81F,0BACAkI,6BACA,4BACA,EACAD,CACA,CAhCA,CAPAxF,KAuCEe,SACFr4F,sCAAgDjB,WAChD49E,WAGA,EAEA,gBAEA,aACA,2CACA,gDACA,aAAqBtvF,mBACrBoD,qEACA,EAEA,cACA,mBACAwkG,6BACA,oCACA,GAAMI,SACN,aACA,CACA,kBAEA,aACA,oCACA,CACA,OAJAp3B,QAIA++B,mBACA,+CAA2DlsG,gBAE3D,OADAiO,aACA,SACA,EACA,EACAi+F,8BACA,2BAEAv8F,4BACA,EACA,EACAu8F,+BACAv8F,4BACAA,yBACAA,0BAEA,EACAu8F,8BACA,+BACA,4BACA,EACAA,CACA,CA5BA,CARA1F,KAoCEe,SACFr4F,sCAAgDjB,WAChD49E,WAGA,EAEA,gBAEA,aACA,2CACA,gDACA,aAAqBtvF,mBACrBoD,qEACA,EACA2pG,OACAnB,OACAgE,cAEA,aACA,oCACA,CACA,OAJAh/B,QAIAg/B,oBACA,QACA,EACAA,gCACA,yBACA,EACA78E,aACA,EACA68E,mCACA,mEACA,aACAp/E,MACA,uBACA,EACAo/E,6BACA,aAAuB5vG,8DACvB,KACA,EACA4vG,CACA,CAxBA,CAwBE7C,WACF6C,4BACAj9F,sCAAgDjB,WAChD49E,WAGA,EAEA,gBAEA,aACA,2CACA,gDACA,aAAqBtvF,mBACrBoD,qEACA,EACA6rG,OACArD,OACAiE,GACA3H,cACA4H,iBACAC,yBACApuF,aACAquF,YAGAC,cAEA,cACA,2BACA,qBACAz+B,4CACAA,WACA,GACAA,gCACAA,CACA,CACA,OAVAZ,QAUAq/B,8BACAv9B,8BACA1yE,0BACA,EACAiwG,mCACAjwG,cACA,yBACAA,kCACAktG,UACA,GAGAx6B,mCAEA,EACAu9B,uCACAjwG,cACA0yE,uCACA,EACAu9B,qCACAjwG,cACA0yE,qCACA,EACAu9B,iCACA,gBACA,QAAqCxC,MACrC/6B,gCAKA,QAHAw9B,6CAGAA,YACAzC,gBAwBA,QAtBA0C,qBACA,QAA0CC,MAC1C,gBAEA,6BAEA,wCACAzC,oCAEAyC,GACAD,YACA,EACAE,cACA,qEAGA1C,wBACAA,sBAEAA,aACA,EACAjsG,IACAH,IAAyBG,WAAsBH,MAC/C,MArEA,IAsEA,mEA4BA,IA1BAG,sBACA,0BACA,UAEAisG,uBACA,sBACAwC,gCACA,0CACA,oBACAA,QACAjD,wBACAA,gCACAiD,QACA,EAEA,IAEA,uBACAA,WAGAA,KACA,GACAnwG,yBAEAkwG,GADAxuG,8CACAguG,QACAQ,YACAzC,eACA,CACA,EACAwC,+BACA,YACAxC,kCAEAhqG,gBACA,0BACA,WAEA,8CACAkqG,oCACAA,IAGAA,wCACA,KAEA,GAAU5sG,oBACV,6CAEA4sG,6CACA,GACA,0CACAj7B,iEAEA1yE,gBACA,EACAiwG,CACA,CAhIA,CAgIEhB,WACFgB,oBACAA,uBACAA,2BACAA,gBACAt9F,sCAAgDjB,WAChD49E,WAGA,EAEA,gBAEA,aACA,2CACA,gDACA,aAAqBtvF,mBACrBoD,qEACA,EACA6nG,OACAW,OAWA0E,cAEA,aACA,oCACA,CACA,OAJA1/B,QAIA0/B,sBACA,yBAEA,6BACA,EACAA,iCACA,WACA9yC,6BAUAkV,mCATA1yE,kCACAktG,yBACAA,yBAEA17B,oBACA,GACAxxE,cAKA,EACAswG,uCACA,sDACAtwG,kBACAuyC,YAGAmgC,uCAEA,EACA49B,gCACA59B,gCACA,qBACA,6BACA,qBAEA,gBACApiD,+BAlDA,gBACA,iDACA,SACA,eACA,eACA,SAEA,QACA,CA0CAigF,kBACAjgF,qBACAA,WAEA,EACAggF,CACA,CA/CA,CA+CErF,WACFqF,oBACAA,4BACAA,iBACA39F,sCAAgDjB,WAChD49E,WAGA,EAEA,gBAEA,aACA,2CACA,gDACA,aAAqBtvF,mBACrBoD,qEACA,EACA6nG,OACAW,OACA4E,cAEA,aACA,oCACA,CACA,OAJA5/B,QAIA4/B,sBACA,kCACA,iBAEA,6BACA,EACAA,iCACA,iCAGAhzC,6BAIAkV,kCAHA1yE,6BAKA,EACAwwG,uCACA,+BACAxwG,iBAGA0yE,uCAEA,EACA89B,qCACA,4CAEA99B,0CAEA,CACA,oBACAi7B,gBACAxiD,0BACA,CACA,EACAqlD,CACA,CA1CA,CA0CEvF,WACFuF,mBACAA,2BACAA,cACA79F,sCAAgDjB,WAChD49E,WAGA,EAEA,gBAEA,aACA,2CACA,gDACA,aAAqBtvF,mBACrBoD,qEACA,EAEAqtG,cAEA,aACA,oCACA,CACA,OAJA7/B,QAIA6/B,sBAEA,EACAA,iCAIA/9B,mDACA,EACA+9B,uCACA,yBACAzwG,iBAGA0yE,uCAEA,EACA+9B,+BACA,yCACA,EACAA,CACA,CA1BA,CADAxG,MA2BEe,SACFr4F,sCAAgDjB,WAChD49E,WAGA,EAEA,gBAEA,aACA,2CACA,gDACA,aAAqBtvF,mBACrBoD,qEACA,EACA8nG,QACAU,OACA8E,cAEA,cACA,2BACA,yCACAl/B,CACA,CACA,OANAZ,QAMA8/B,qBACA,iCACA,EACAA,oBACA,aACA,EACAA,mCACA1wG,qEACA,EACA0wG,gCACA,wBACAlgF,GAEA,CACA,EACAkgF,qCACA,SACA1wG,oDACAA,6BAGA0yE,qCAEA,EACAg+B,8BACA,uBACA,EACAA,gCACAh+B,gCACA1yE,2CACA,qBACAA,cAEAA,gDACAA,+CACAA,mBAEA,EACA0wG,mCACA,oBAAqCnD,MACrC,gBACA,EACAmD,gCAEA,QADA,QAAiCrkB,OACjCA,GACA,SACA,YACA,qBACA,gBACA,CACA,0CACA,6CACArsF,2CACAmrD,CACA,EACAulD,+BACA,WACAjD,mBACA,oDACA,KACAztG,2CAEA,EACA0wG,6BACA,gBACA,EACAA,CACA,CA1EA,CA0EExF,WACFwF,kBACAA,4BACA/9F,sCAAgDjB,WAChD49E,WAGA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,2CAEA,+EAAsG,iBAAqB,YAAmB,qGAE9IqhB,EAA8a,cAA2B,oBAA0B,SAAc,gCAA2C,OAAxf,gBAAiC,SAAeC,KAAeC,MAAgBC,UAAoB,IAAM,qCAA0CF,yBAA4CG,kBAAqBxvG,iBAAlCqvG,MAAmL,CAAjJ,MAAuC3D,IAAc4D,MAAWC,cAAsB,KAAMF,yBAAqD,CAArD,QAAqD,gBAAsB,SAA6HI,MAAuC,6EAEnkBC,aAAkC,gBAA2C,YAAgB1vG,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEAnH,MAEA,IAEAoH,IAFApH,OAMAqH,IAFArH,OAMAsH,IAFAtH,OAMAuH,IAFAvH,OAMAC,IAFAD,MAIAwH,QAEAC,OAIAC,IAFA1H,OAMA2H,IAFA3H,OAMA4H,KAFA5H,OAIA,cAAwC,0BAAuCe,WAE/E,kBAA6C,cAAkBr4F,2BAAkCjB,oDAAgFoB,OAAoBA,EAErM,iBAAmD,qBAA0C,yDAE7F,6BAEAg/F,aA8CA,cACA,WAEAv/F,4DAOA,GALAw/F,WAEA/xG,oBACAA,sCACAA,uEACA,qBACA,4CAEAA,oBACA8xG,4BAEA,sCACA9xG,6CACAA,4BACAA,yCACAA,oCACAA,2BACAA,wCACAgyG,qBACAC,iCAEAjyG,uCACAA,uDACAA,qDACAA,+CACAA,iDACAA,6CACAA,kBACAA,4DACAkX,mCACAg7F,sDAEA,GACAlyG,+DACA,6BACAkZ,qCACAi5F,oBACA,kCACA,EAAQ1/F,GACR,GACA,uFAAgGimD,uBAChG14D,qBACAA,qBACAA,0BACAA,oEAEAA,uBACAA,cAEA,CAEA,OArGAixG,WACAr+F,YACAlB,mBACA,QACA0gG,SAEAR,kBACA,GACI,CACJh/F,aACAlB,kBACA,8BACA2gG,gEAEAryG,eACA,GACI,CACJ4S,eACAlB,oBACA,WAEA4gG,2DAEA,uBACA,8BACA,oBAEAtyG,iCAEA2S,oCACA6+D,sBACA,EAEA,MACA,4BACA6gC,mCAEAryG,mBACAq+C,4EACA6rD,qBAGA,KA2DA+G,MACAr+F,mBACAlB,kBACA,kEAEA,uBACA,SACAkQ,iCACA6iE,gBACA,CACA,wCACA7iE,CACA,GACI,CACJhP,WACAlB,iBACA1R,6BACA,GACI,CACJ4S,iBACAlB,sBACA,YAEA6gG,YAEAC,WAEA,OAIAL,uBACA,gCACA,EAJA1/F,QAFAyG,SAMQ,GALRiX,SAMA,GACI,CACJvd,cACAlB,iBACA1R,eACA,GACI,CACJ4S,aACAlB,iBACA,iEAEA1R,sBACAA,kDACAihD,GACAjhD,WAEA,GACI,CACJ4S,YACAlB,iBACA,wCACA1R,uBACAA,oCACAA,+BACA,GACI,CACJ4S,aACAlB,oBACA,WAEAe,gFAEA,8BACA,0BACAuN,iBACA,YACA,UACW,4CACXA,+CAA0Fw9C,UAC/E,kBACX,+BACAx9C,GAEAA,+CAA0Fw9C,MAE1F,mDACAx9C,EACA,EAAQvN,GACR,GACI,CACJG,iBACAlB,4BACA,IAEA4gC,GAFAmgE,QAIAC,kBAEAC,WAEA,OACAxiF,QACAmiB,SAGA6/D,uBACA,mCACA,EAJA1/F,SAHAyG,QAOQ,EACR,GACI,CACJtG,iBACAlB,4BACA,IAEA4gC,GAFAsgE,QAIAC,kBAEAC,WAEA,OACA3iF,QACAmiB,SAGA6/D,uBACA,mCACA,EAJA1/F,SAHAyG,QAOQ,EACR,GACI,CACJtG,gBACAlB,kBACA,+DAEA,yBACA1R,8BAEAA,0CAEA,GACI,CACJ4S,kBACAlB,iBACA,+DACAye,4EAEA4iF,SAEAC,UAEA,OAGAhzG,wBAHAkZ,QACAiX,QAGA,GACI,CACJvd,gBACAlB,iBACA,iFACAye,2DAEA,yBACAnwB,2BAEAA,uCAEA,GACI,CACJ4S,gBACAlB,iBACA,2BACA,GACI,CACJkB,gBACAlB,kBACA,4BACA,GACI,CACJkB,mBACAlB,iBACA,8DAEA,uBACA1R,cACAA,4BACA,GACI,CACJ4S,cACAlB,iBACA,+DACAye,4EAEA8iF,SAEAC,UAEA,OAGAlzG,oBAHAkZ,QACAiX,QAGA,GACI,CACJvd,eACAlB,iBACA,gCACA,GACI,CACJkB,kBACAlB,sBACA,YAEAe,wEAEA,8BACA,mCACA,EAAQA,KACR,GACI,CACJG,iBACAlB,4BACA,IAEA4gC,GAFA6gE,QAIAC,kBAEAC,WAEA,OACA/gE,SAGA6/D,uBACA,mCACA,EAJA1/F,SAFAyG,QAMQsY,SACR,GACI,CACJ5e,gBACAlB,iBACA,uDACA,GACI,CACJkB,UACAlB,iBACA,qDACA,GACI,CACJkB,SACAlB,iBACA,oDACA,GACI,CACJkB,WACAlB,iBACA,sDACA,GACI,CACJkB,gBACAlB,sBACA1R,0CACA,GACI,CACJ4S,mBACAlB,sBACA,YAEA4hG,YAEAC,WAEA,OACApjF,QAGAgiF,uBACA,kCACA,EAJA1/F,QAFAyG,QAOA,GACI,CACJtG,kBACAlB,kBACA,WAEAe,+EAEA,8BACAkd,mBACA,qBACA6jF,6BACAC,0BACAC,2BAMA,OALA,6EACAC,uCACAF,cAEAD,cAEA,EAAQ/gG,EACR,GACI,CACJG,mBACAlB,sBACA,WACA1R,mDACS,CACT,gBAEA4zG,WAIAnhG,QAEAzS,oCAJAkZ,QACAiX,SAGA1d,EACA,CACAzS,+BACA,GACI,CACJ4S,cACAlB,kBACA,mFAEAie,4BACA,4BACA,GACI,CACJ/c,aACAlB,iBACA,oFAEAsO,wBACA,gCACAA,CACA,GACI,CACJpN,qBACAlB,kBACA,WAEAe,+EAEA,8BACA,0BACAohG,wBACA,EAAQphG,KACR,KAGAq/F,CACA,CA7bA,GAqdA,gBASA,IARAgC,oBACAlyF,YACAmyF,SACAC,aACAC,YACAC,aAEIJ,IACJhxB,mCACA,GAEAgxB,oCACA,cACA,wEAJAA,mBAOA,0BAAmDA,kBACnD,2BACAzpF,0BACA1X,8CACA,qBACA0X,kBAEA,EACA,GACA,IACA8pF,EADAxhG,sDACAi9E,uBACA,+BACA,gBACAyiB,sEAEAhoF,uBAEAA,EACA,EAAI,IAEJ,oFACAypF,mBACAlyF,8BAGAkyF,sBAA8ChC,YAAoBiC,WAAuBK,KACzF,iEACA,yBACAN,oCAEA,GACAA,wDACA,uBACAzpF,sBAEAA,EACA,EAAI,IACJypF,CACA,CAIA,oBACA,sEACA,qBAEA,uCACAO,qBACAr0F,OAUA,GATA,uCACA,mBACA,QACA/E,YACO,QACPA,cAEAjb,+CAEAggB,eACA,OAKAs0F,GAHAp0G,2CACAq0G,4EACA9hG,+BAGA6hG,kCAEA,CACA,SACA,CAEA,sBACA,UACA,0DAEA,oBACA7hG,mCAEA0d,sBAEK,qBACL1d,iBAGA,6CACA6/B,KACA7/B,KACK,qBACL,QACA6/B,QAEA7/B,KAKA,QADAA,2BAEA,CAEA,oBACA,uBACA,aACAiG,UACA,2BACA,mDACA,yDACA,GAEA87F,WAEApyG,QACAsW,QACA,KAAK,CACL,mDACA,mDACAyX,KACApd,KAEAggB,gBAEA,GAEA0hF,WAEAryG,QACAsW,QACA,CACA,0BACA,CAxKAo5F,YACAphF,YACA4hB,aACAyhE,WACAW,eACAC,YACAC,wBACAC,UACA/xB,iBAEAgvB,0BACAA,4BAEAA,kBAEAA,WACAniF,gBACAmlF,oBACA,wBACA,yBAuJAxlB,iBACAA,aACAA,WAEA,EAEA,cAEA,aAEA,IAIAylB,GAJAC,gCACAA,oCACAA,qCAEAD,iCACAE,4CACA,iDACA5oB,EAEA0oB,eAEA,GAIA54C,8BACAA,2CACA,OACAn8D,YADA82B,OACAo+E,eACA,GAGA/4C,4BACAA,yCACA,uBACA,mEACArlC,YAGA,mBADAA,cAEA,mBACA,GAGAtzB,sBACAmP,8CACAjB,kBACA,eACA,wEAEA,wBACA,oDAOA,QAFAA,EAHA6oE,eACApqD,eACAglF,eAGA5zG,IAAuBA,IAAYA,IAEnC,YADAmQ,OACAnQ,KACA,QAIA,IAKA04D,wDACAA,kDACA,EAEA,EAEA,gBAEA,aACAm7C,QACArP,QACAsP,QAGAC,yBAGAC,cAGAv1G,SADAwD,iBACAgyG,EACK,8BACLA,MAEA,EAEA,EAGAD,iCACA,SACA,0BACAE,WACA,uDACAA,gBAEAz1G,aACA,EAEAu1G,+BACA,iBACAv1G,WAAsB01G,UACtB,EAEAH,iCACA,oBACA,OAAiBI,UACjB,8DACAF,gBAEAz1G,YACA,EAEAu1G,6BACA,sBACA7B,gBAEA,GADA+B,UAA0BA,GAC1B,oBACA,wDACA,sBAA+BC,0BAC/B11G,KAIA,8CAGA,iBADA0zG,YADAx6F,MACA,IAEA,2BACAlZ,KAGA,iCACA,wDACA,sBAAiCmmG,0BACjC,uEACAnmG,KACS,wDACT,sBAAiC21G,0BACjC,uEACA31G,IAEA,CACA,CACA,2BACAA,iBAEAA,uBAEAA,IACA,EAEAu1G,+BACA,yBACA,EAEAA,gCACAv1G,mBACA,EAEAu1G,4BACA,sBACA,EAEAA,kCACA,cACA,iCACAK,UACA7kC,OACA,GACA,KACA,EAEAwkC,iCACA,2BACA,EAEAA,4BACA,kCACA,mCACAv1G,eAEAA,IACA,EAEAu1G,8BACA,iCACA,oBACA,EAAI,EACJ,EAEAA,gCACAnzG,OACA,4BAIA,QAHAozG,KACAK,uBACA38F,IACAA,mBACA,MACAA,IACA48F,eAEAA,cACAN,WAEAt8F,cACA,CACA,eACA,EAGAq8F,gCAIA,QAHAQ,uBACAC,oBACArmF,QACAomF,0BACA,2BACApmF,yBACO,wBACPA,qBACO,CACP,8CACAsmF,YACAC,YACA,8BACA,SACA,0BACAT,WAEAA,kBAGA,gFACAvN,oBACAv4E,SAGA,KAAS,sDACTA,SAEA,CAEA,eACA,EAEA4lF,+BACA,8BACA,wBACA5lF,iBACAA,oCAEAA,CACA,EAEA4lF,+BACA,oBACA,aAEA,+BACA,yBACA,kBACA,2CAEA,8BACA,mDACA,GAAMvN,QACN,GACAr4E,QACAwmF,kBACAJ,uBACAC,oBACA,6BAEA,QADA7lF,cACAA,MACA,QACA,kBACA6Z,UACAosE,6BACAzmF,kBACA,WACAqa,UACAosE,6BACAL,UACApmF,YACA,WACAqa,SACAosE,4CACA,gBACAF,aACAd,sBACAzlF,0DAEAA,qBAIAQ,IACA,CACA,GACAR,QACA,EAEA4lF,mCACAc,UAGA,QAFAR,uBACAj+F,QACAi+F,cACA,kCACA,eACAzzG,6BACA8W,4BACA+8F,2BACA/8F,IACAtB,iBACOsB,IACPtB,mBAEAg+F,8BACAh+F,QAEA,CACAA,cACAg+F,OAEA,EAEAL,oCAEA,GADAe,MACA,mBACA,mCAKA,QAHAP,uBACAC,oBACArmF,QACAomF,0BACA,wDACA,GACO,wBACPpmF,qBACO,CACP,8CACAsmF,YACAC,YACA,YAEA,SACSA,SACTvmF,UAGAA,+DAEA,MAhBAA,6BAkBA,eACA,EAEA4lF,4CACAe,MAGA,QAFAP,uBACAvlF,IACAulF,oBACA,qBACAQ,eACAR,SACA,cAGO,0BACP78F,MAEAsX,MALAtX,kBAMA,CACA,QACA,EAGAkvF,WAGA,EAEA,cAiCA,SAaA,kBAEA,QACA,SACA,EAfA,EAeAoO,IAEA,IAIAC,mBACAA,QAIA,cACAC,oBAKAC,KAJAH,kBACAI,mBAIA,gCAKAC,GAwBA,gBACA,MAEA,MAEA,QApEA,EAoEAD,IAGA,MAEA,cAGA,6BACAE,wBACAv1G,iBACA,UAEA,WAjFA,EAiFAw1G,oBACA,CAjFA,EAiFAD,GACA,CAnFA,EAmFAC,4BAEAP,oBACAK,mBAEAA,EAGA,eAGA,cA9FA,EA8FAD,IAIA,OAwOA,gBACA,4BACAE,yBACA,oCACA,YAeA,kBAMA,QADAE,UAHAC,0CACApnG,KACAqnG,MAEA,0BACA,wBACAJ,gBACAK,sBACAL,kBACAI,iBACAA,sBACAJ,oBACAE,sBACAI,oBACAC,uBACAC,qBAEA,CACA,4BACA,KACAD,SAEA,IAEA,CAGA,IAKAE,EAaAC,SAlBAC,UACA1kF,uBAEA2kF,UACA3kF,uBAEA,eAQAwkF,EANKG,GAEAD,IAILA,6BAHAC,GAFAD,GAUAjB,mBACAgB,OACAG,QACAC,OACAC,SAEAD,OACAC,OACAL,OACAG,SAGA,UADAJ,OAvBA,IAyBA,CAxTAO,MACA,OAEA,IACAH,QAEAE,QACAE,QAEAC,IANAT,MAEAA,OAKAU,SAEA,kBA7GA,EA6GAF,MACA,CAEA,OAaA,gBAWA,QATAG,WACAC,YACAC,sBACAC,KACAC,OACArmG,gBACAsmG,gBAGA70G,KAAmBA,MAAcA,KACjCuO,SACAsmG,SAEAtmG,UACAsmG,UAWA,QAVA5oF,OAGA6oF,SAGAC,IACAC,IACAC,IACAC,IACAx1G,IAAmBA,IAAWA,KAE9B,eAAiCy1G,OAAiBA,MASlD,IARA,WAOA3+E,GAJAG,EADAw+E,2BACA5mG,OAEAA,UAEA4mG,EACAx+E,WACAm8E,0BACAn8E,IACAH,IAGA,GADAjoB,OACAooB,IAEAq+E,aACSx+E,KAETu+E,aACSD,IACTM,YACA,qBAGAz+E,IADAC,YAGA,iBAIA,CAGA,gBAAiCy+E,QAAiBA,OASlD,IARA,IACAz+E,GADAw+E,SAOA3+E,IAJAG,GADAy+E,+BACAR,QAEAA,WAEAQ,GACAz+E,aACAk8E,kBACAI,mBACAt8E,KACAH,KAGA,GADAo+E,SACAj+E,KAEAs+E,aACSz+E,MAETw+E,cACSH,GAGT,MADA,IADAQ,YACA,kBAKA,GAHA9+E,MADAG,QACA2+E,EAGA3+E,IADAC,SAGA,iBAGA,CACA,CACA,CAGA,cArOA,EAqOAs8E,GACA,CArHAqC,KACA,CA3EAC,CAJA1C,6BACAI,8BAMA,UACAC,YA1CA,EA0CAH,IAEAyC,IACAtC,SA7CA,EA6CAsC,KAEAC,MACA,UACAvC,GA0iBA,gBACA,MA9CA,gBACA,SACA,OAhjBA,EAgjBAA,GAEA,iBAAoCt1G,YAAkBA,MACtD,YACA,aApjBA,IAojBA6B,MACA,qBACA,UACA,eACS,SAETyzG,YAEA,WACAwC,0BACAC,wBACA,0BACA,QACA,CACAC,IAEA,CACA,CACA,+CACA,CAqBAC,MACAC,QACAC,OACAt2G,SACAu2G,WAEA,YAGA,SACK,GAtmBL,IAsmBKv2G,MAGL,SAEA,uCAGA,4BACAw2G,UACO,uCAKPH,uCACA,gCACA,mBACAA,2BAEAG,SACA,CAEA,QAIA,CAhlBAC,QAEAhD,EACA,CA6LA,qBACA,uBACAiD,qBACAC,kBACAC,kBAGAnD,UACAoD,WAEA,mBACA,CAUA,gBAEA,oCACA,SAQA,QAJAC,IACAC,+BACAC,KACAC,KACAH,KACA1D,mBACAI,kBAEAyD,GADAH,IAGAC,KAEAC,yBAEA,QACA,CASA,gBAEA,WACA5D,2CACA,SAQA,QAJA0D,IACAC,+BACAC,KACAE,KACAJ,KACA1D,qCACAI,oCAEA0D,GADAJ,IAGAC,KAEAC,yBAEA,QACA,CAqGA,cACAvD,QAlaA,EAkaA,KAOA,QADAF,GALA1W,IACAsa,IACAC,KACAC,KACAC,MAEAza,YACA,qBA3aA,EA6aAua,KACAE,YACAza,IACA,WACA0a,EACAJ,IACAE,WACAxa,IACA,WApbA,EAubAsa,QACA,gBAGA,KADA5D,cAEA1W,UA5bA,GA6bA4W,eAEAA,gBACA6D,oBAEA7D,cAlcA,EAmcA6D,qBACAza,KAEAya,oBACAD,mBAIA,KADA9D,cAEAE,+BACAF,YACA+D,4BACA/D,IACA8D,yBACA9D,MAIA,MACAE,cACA0D,MAxdA,EAwdAG,KACa,OACb7D,aACA0D,YAEA1D,gBACA0D,WACA,CA/dA,EA+dAG,KAEAza,UACAsa,mBACW,OAleX,GAkeW1D,WAEXA,mBACAA,eAEA5W,IAEAua,KACAD,IACAE,KACAC,MAIA,uBACA7D,QAMA,SAGA,IAFA5W,IAEAA,cA1fA,GA2fA4W,WA3fA,GA4fAA,YAEAA,iCACAA,8BAEAA,kBACAA,mCACAA,kBACAA,8BACAA,gBACA+D,MACS/D,uCACTA,YAEAA,qBACAA,QACAA,oCACAA,UACAA,gBACA+D,OAGA3a,IAGA2a,GACAxB,IAEA,CAGA,QAiHA,kBAEA,iBAAoC73G,eAA0BA,KAC9D,kBACA,YACAs5G,WACAC,cACAjE,gCAEA,CAEA,QACA,CA5HA7sE,SA7hBA,EA8hBAA,WACAA,QA9hBA,EAgiBAo+D,WA2HA,EAEA,gBAEA,6BACA2S,QACAC,QAEAC,4BAGA,OAFAvjG,UAEAwjG,QAGKA,qCACLA,2BAIKA,8CACLxjG,oBA0BA,kBACA,QAIA,GAHAyjG,YAGAtsG,mCAGA,QACA,eAGAA,aACA/L,aACAm4G,UAEA,SAIA,IAHAG,MAGAvsG,6BACA,QAAiBtN,WAAcA,IAC/B,wBAEA,QACA,CACA,IACA,WACA85G,MAGA,CAFA,MACA,QACA,CAGA,sBACA,SAKA,IAHAC,SACAD,SAEA95G,aAA2BA,KAAQA,IACnC,cACA,SAIA,iBAA2BA,KAAQA,IAEnC,QADAqR,QACA9P,iBAEA,yBACA,CApEAy4G,QAEA,EAEA,cACA,cACA,CAEA,cAKA,SAJA73G,kDACA,uDAGAA,kCAEA,CAwDA,EAEA,cAMA,eACA,SACA,0BACA,QACA,EARA0kG,yCACAz1F,eAEA6oG,MAQA,EAEA,cAEA,MAEE,sBAFF,WACA,gDACA,CAFA,GAOA,eACA,6DACA,CAGA,cACA,UACA,oBACA,2BACA7oG,mDACAA,yDACA,CACA,EAfA28E,oBAEAmsB,aAKAnsB,eAWA,EAEA,cAEA,aAEA,sCACAosB,6BAEA9kG,cACA,uCACApT,iBAGA,6BACA,EAEAm4G,cACA,sCACA,SAGA,IASA/oG,EATAgpG,0BACAC,0FAEA,yBACA,SAMA,YAEA,gCACA,EAEAzT,uBACA,gBACAj2F,eACA5Q,IACA4uB,mBACA2rF,KAYA,IATA,qBACAA,IACA3pG,mBAEA5Q,MACI,qDACJ4Q,MAGS5Q,MAAYA,EAGrB,UAFAgR,gBAIA,WACA+wC,OAIAnxC,KAHAi0D,UAKA01C,wBACAC,GACAA,KACAjrG,gBAEAA,eAIAqB,sBAGQi0D,QACRj0D,SAQA,QACA,CAIA,EAEA,gBAEA,aACA4zF,QAGAiW,GACA9T,YACA+T,wBACA,2BACA,2BACA,cAAuCn5G,GASvC,aARAo5G,IACAhU,sCACA,oBACA9hC,WAEAA,CACA,EAAU,KAEVv3D,OACA,0BACAq5F,WAGA,uCACA,EAEAl+D,mBACA,2BACA,2BACA,iEACA,uBACAk+D,8BAEAA,CACA,EAAQ,IACR,uCACA,EAEA3iB,0BACA,+BACA,sBACA,gBACA,0CACA,kCACA2iB,CACA,EAAQ,IACR,wCACA,GAGAiU,qBACA,eACA,EAEAhsF,mBACA,gCACAklF,SACO,0BACPA,SAEA,2CAEA,GAIA,cACAr1G,WACAA,aACAA,aACA,CAEAo8G,+BACA,4BACA,EAEAA,6BACAjsF,WACA,2BACA,MACA,kBACAimF,cAQA,GAPAjmF,QACAA,MACAnwB,cACAA,eAEAA,eAEA,0BACA,OAAgB01G,UAEhB,SACA,sBACA2G,2BAEA,0BACAA,WAEAA,SADS,0BACTvG,qBAGAA,SAEAuG,CAEA,CACA,OAAc1G,WAEd,EAEAyG,4BACA,2BACA,EAEAA,kCACA,4BAEAJ,2CAEA,GAEA,EAEAI,gCACA,4BACA,6CACA,SACO,6CACP,SAEA,SAGA,QACA,EAGAhU,WAGA,EAEA,gBAEA,aAEAz1F,sCACAjB,WAGA,+EAAsG,iBAAqB,YAAmB,qGAE9Ii/F,EAA8a,cAA2B,oBAA0B,SAAc,gCAA2C,OAAxf,gBAAiC,SAAeC,KAAeC,KAAgBC,SAAoB,IAAM,oCAA0CF,wBAA4CG,kBAAqBxvG,iBAAlCqvG,MAAmL,CAAjJ,MAAuC3D,IAAc4D,KAAWC,aAAsB,KAAMF,uBAAqD,CAArD,QAAqD,cAAsB,SAA6HI,MAAuC,6EAEnkBC,aAAkC,gBAA2C,YAAgB1vG,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAIAC,IAFApH,OAMAqS,IAFArS,OAMAC,IAFAD,MAMAsS,IAFAtS,OAMAO,IAFAP,OAIAG,QAEAC,OAIAmS,IAFAvS,OAMAwS,IAFAxS,OAMA0H,KAFA1H,OAIA,cAAwC,0BAAuCe,WAM/E,iBACA,eAHA,iBAAmD,qBAA0C,0DAI7F+G,SAEA/xG,cACAA,0BACA,CAEA,aACA4S,iBACAlB,kBACA,WAEAgrG,KACA18G,qBACA,2BACA,4BACA2vB,EAsQA,cACA,8BACA,iBACA,kCACA,sBACAA,UAA6BgtF,0BAA4BzU,EACzD,CAUA,GATA,0EACAmN,oBACAnN,gBACAmN,6BAEAA,kCACAA,sBAGA,2BACA,yDACA,+BACA,CACA,gBACA,EAAI,cACJ,CA5RAuH,IACAjtF,uBACA,8CACAu4E,oBACA,mBACA,8BACA,gBACA12E,uBACAkrF,KACAlrF,mBAEAtY,2BACAwjG,MAEAlrC,wBAEA,wBACAqrC,WACAjlG,SACA4Y,SAEA8hB,wBAAmD83D,sBACnD,4BACA,uCACA0S,UAGAxqE,yCAFAwqE,OAGA,CACA5U,uCACA,SAAa,yBACb,gCACA,qBACA12B,oCACA,CACAurC,KACA,CACA,4CACAvrC,iCACA,GACAt4D,IACA,EAAQ,GACRyW,uBACA,iCACA6hD,8BACAt4D,GAEAA,gCACA,EAAQ,GACRlZ,qBACAA,uBACAA,cACA,GACI,CACJ4S,iBACAlB,oBACA,iCACA1R,gDACA,GACI,CACJ4S,iBACAlB,oBACA,WAEA4gC,4DAEA,4BACA3/B,mCACA,sCACAqqG,KACAlyD,uBACA,mBACA,2BAEa,CACb,6BACAmyD,+BACArlG,yBACA,MALAA,kBAMAolG,MACA,EACA,GACAh9G,uBACAA,iEACA,GACI,CACJ4S,iBACAlB,oBACA,WAEA4gC,4DAEA,0CACA4qE,6BACA,GACAl9G,iEACA,GACI,CACJ4S,kBACAlB,oBACA,8BACA,GACI,CACJkB,eACAlB,iBACA,gDACA,0BACA,EAAQ,cACR,GACI,CACJkB,gBACAlB,kBACA,+DAEAo5C,KACAqyD,KACA,MACAn9G,wCACA,IACA2tG,GADAgD,OACA,GAEAhD,wBACA7iD,WACa6iD,8BACbwP,UAEA,IAEAryD,yBACAqyD,+CAEA,4BACA,yBAEA,QADA7qE,kCACA3/B,2BACA,iBACA,sBACA2/B,gCACA,CACA,SACA,GACA,qCACA,GACI,CACJ1/B,cACAlB,oBACA,gDACA,+BACA,GAAQjO,gBACR,eACA,GAAQukG,QACR,GACI,CACJp1F,kBACAlB,sBACA,mCACA1R,6CAjLA,kBAA6C,cAAkB2S,2BAAkCjB,oDAAgFoB,OAAoBA,EAiLrMsqG,IAA4FC,MAC5F,GACI,CACJzqG,iBACAlB,oBACA,WAEA4gC,4DAEA,qDACAtyC,0BACA2S,mCACA2qG,oCACA,GACAt9G,iEACA,GACI,CACJ4S,cACAlB,iBACA,2CACA,0CACA,gCACA,wDACA,GACI,CACJkB,mBACAlB,oBACA,wBAEA6rG,wBACAC,SACA5lG,OACA4Y,QAEA2mF,KACA99F,iBACA,UAIA89F,GAHAv/F,uBAGAA,wBAFAA,cAIAyB,6CAEA,IACA2wB,GADAhqC,yBACAgqC,2CACAra,wCACA,0BACA,GACI,CACJ/c,aACAlB,kBACA,IASA+rG,EACAnrE,GACAp5B,GACAwkG,GACAC,GACAC,GAdAnL,OAEAhF,4DACAoQ,gEAEAxJ,aACA,+EAGAoJ,8BACAnrE,0BACAp5B,sBACAwkG,gDACAC,8BACAC,qCAEA59F,GADA,gDACA4vE,uBACA,iBACAjgE,wBAEAA,WAEA,EAAY,eACZ8iF,uBAGAzyG,6BACAggB,8CACAA,yBAGAA,CACA,KAGA89F,CACA,CArQA,GAuQA,gBACA,2CACA,oBACAC,YACAxiC,UACO/3E,oBACPu6G,uBACAxiC,0BAGAA,kBAEAA,CACA,EAAI,GACJ,CA0BA+T,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,wBAEA,OAA8a,eAA2B,qBAA0B,UAAc,iCAA2C,OAAxf,kBAAiC,SAAeshB,MAAeC,KAAgBC,SAAoB,IAAM,oCAA0CF,wBAA4CG,iBAAqBxvG,iBAAlCqvG,OAAmL,CAAjJ,MAAuC3D,GAAc4D,KAAWC,YAAsB,KAAMF,wBAAqD,CAArD,QAAqD,cAAsB,SAA6HI,OAAuC,6EAEnkBC,aAAkC,kBAA2C,YAAgB1vG,WAAkBA,KAAO,YAA2B2vG,gCAAwDA,mBAAgC,+BAAuDv+F,qCAA+D,wBAAyD,6BAAqEw+F,YAA6DC,IAA1hB,GAEA7nE,sBAAuD,mCAAkD,6CAA8D,gBAA0B,gCAA4C,qBAAuB,EAA2B11B,UAA4C,gBAA4B,gBAA4B,aAAuB,uBAA4B,EAAoBmqG,WAI1c3M,IAFApH,OAMAC,IAFAD,MAMAI,IAFAJ,OAMAS,IAFAT,OAMAW,IAFAX,OAIA,eAAwC,6BAAuCe,YAE/E,kBAAmD,uBAA0C,yDAE7F,kBAAmD,OAAa,sFAAyF,4DAEzJ,kBAA4C,oCAA+D,0FAAuGiT,6CAAyEt9G,aAAe+Q,sDAA6EwsG,yEAEvX,oBAGA,cACA,kBAEAC,uEACA,CAEA,OARAC,SAQAC,EACA,CAVA,CAUE3T,WAEF2T,mBACAA,kBAEA,mBAGA,cACA,kBAEAF,uEACA,CAEA,OARAC,SAQAnN,OACAr+F,YACAlB,iBACA,WAEA8f,4BACA,2BAEAA,mBAEAA,oCACA,2CACA,EAAQ,cACR,GACI,CACJ5e,aACAlB,qBACA,kCAEA,kDAEA8f,EADAm/E,QACA,GAGAn/E,4BAEA+X,6FACA,GACI,CACJ32B,eACAlB,yBACA,WACA,oHAGA,4BACA,mBACA,iCACA4sG,QACA3Q,oBACAr9E,SACAq9E,cACAr9E,iBACAA,4BAEA,GACI,CACJ1d,eACAlB,uBACA,WAEA,oCACA6sG,UACAA,KAGAC,SAFAD,KAEA7sG,IACA,GACI,CACJkB,aACAlB,iBACA,sCACA,+CAGAye,EAFAA,GAGA,GACI,CACJvd,mBACAlB,kBACA,+DAEA,MAIA,6DAHA,sDACA,kBAIA,GACI,CACJkB,eACAlB,iBACA1R,yCACAA,gDAEAupC,0FACA,gBACA,wIACAjZ,aACAA,qBACAA,WAEA,GACI,CACJ1d,cACAlB,kBACA63B,2FACA,uEACA,yBACA,QACAn2B,8BACWu6F,6BACXA,WAEAA,UAEA,EACA,IACI,EACJ/6F,aACAlB,kBACA,6EACA,wCACAy9F,EACA,GACI,CACJv8F,cACAlB,iBACA,QACA,KAGA+sG,EACA,CApIA,CAoIEpU,WAEFoU,wBACAA,gBACAA,WAEAnvB,UACAA,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,8CAEA,kBAAkC,gBAA2C,YAAgB/tF,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,2CAA8D,eAA0B,+BAA4C,qBAAuB,EAA2B11B,SAA4C,eAA4B,eAA4B,YAAuB,uBAA4B,EAAoBmqG,WAI1crM,IAFA1H,OAMAoH,IAFApH,OAMAC,IAFAD,MAMAK,IAFAL,OAMAQ,IAFAR,OAMAS,IAFAT,OAMAW,IAFAX,OAIA,cAAwC,0BAAuCe,WAE/E,iBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAEzJ,iBAA4C,kCAA+D,yFAAuGiT,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAEvX,IAEAQ,cAGA,aACA,kBAEAP,qEACA,CAEA,OARAC,QAQAnN,OACAr+F,aACAlB,iBACA63B,sFACAvpC,4DACA,GACI,CACJ4S,YACAlB,iBACA,iGACA,GACI,CACJkB,aACAlB,oBACA,yDACA,SACA1R,8BAEA,GACI,CACJ4S,eACAlB,wBACA1R,gBACA,GACI,CACJ4S,eACAlB,sBACA,yCACA,mCACA1R,iDACA2+G,2BACA,MACAp1E,6FAEA,KAGAm1E,CACA,CA/CA,CA+CEjU,WAEFiU,mCAIA,kBAGA,cACA3M,WAEA,mEAEA,kBACAG,CACA,CAEA,OAXAkM,QAWAnN,OACAr+F,YACAlB,iBACA,gCACA1R,uEACA,sBACA2vB,EAEAA,yBAEA,EAAU,sCAEV3vB,gBACA,GACI,CACJ4S,eACAlB,oBACA63B,4FACAvpC,aACA,GACI,CACJ4S,eACAlB,wBACAye,OACA+5E,yCACAhxF,qBACAlZ,iBAGAupC,4HAEAvpC,cACA,GACI,CACJ4S,eACAlB,sBACA,gHACA,gBACA,qBACA8f,YACAA,aACAtY,4CACAqwB,sHAEAvpC,2DAEAA,eAEA,WACA8qD,uBACA,wBACA0zD,cACA5mG,QACA,EAAQsB,YACR,GACI,CACJtG,mBACAlB,oBACA,yBACA63B,gGACAkL,wBACAA,WAEAz0C,aACA,GACI,CACJ4S,aACAlB,iBACA,iCACA1R,wGAxIA,GA0IAA,iBACA,GACI,CACJ4S,mBACAlB,oBACA63B,gGACAvpC,aACA,GACI,CACJ4S,eACAlB,iBACA63B,wFACAvpC,aACA,GACI,CACJ4S,WACAlB,kBACA,+FACA,GACI,CACJkB,kBACAlB,kBACA63B,6FACAvpC,aACA,GACI,CACJ4S,YACAlB,kBACA,8DAEA,+BAxKA,GAwKA,CACA,mBACA,cACA1R,iCACAA,OAEAA,sCACA8Q,EAEA,CACA,+FACA,qBACAwf,CAEA,KAGAg8E,CACA,CAnIA,CAmIEpC,iBAOF,eACA,gEAMA,OAJA,UACA,+BACA53D,gCAEA,uFACAA,EAEAssE,cACA,CAhBAtS,mBACAA,cACAA,uBACAA,kDAeAhd,mBACAA,eACAA,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAGA,kBAAkC,gBAA2C,YAAgBnQ,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,2CAA8D,eAA0B,+BAA4C,qBAAuB,EAA2B11B,SAA4C,eAA4B,eAA4B,YAAuB,uBAA4B,EAAoBmqG,WAQ1c,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAIzJ,kBAGA,aACA,iBAEAG,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQAnN,OACAr+F,iBACAlB,oBACA,sBACA63B,8FAEAvpC,aAEA,GACI,CACJ4S,aACAlB,iBACA,QACA,GACI,CACJkB,YACAlB,iBACA,QACA,IACI,EACJkB,YACAlB,iBAEA,KAGAmtG,CACA,CApCA,CARA,cAAwC,0BAAuC7T,WAF/E8T,CAFA7U,OAgDEe,SAEF6T,mBACAA,eAEAvvB,WAEA,EAEA,gBAEA,aAYA,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAZzJ38E,sCACAjB,WAeA,kBAGA,aACA,iBAEAysG,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQAhS,CACA,CAVA,CARA,cAAwC,0BAAuCpB,WAF/E8T,CAFA7U,MAsBEe,eAEF1b,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAGA,kBAAkC,gBAA2C,YAAgBnQ,WAAkBA,KAAO,YAA2B2vG,gCAAwDA,mBAAgC,+BAAuDv+F,oCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,4CAA8D,gBAA0B,+BAA4C,qBAAuB,EAA2B11B,SAA4C,gBAA4B,gBAA4B,cAAuB,wBAA4B,EAAoBmqG,YAI1cvT,IAFAR,OAMAW,IAFAX,OAMAC,IAFAD,MAIA,cAAwC,0BAAuCe,WAE/E,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAIzJ,kBAGA,aACA,iBAEAmT,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQAnN,OACAr+F,eACAlB,0BACA,kFACA,0BACAA,IACAi8F,aAEA,MACApkE,iGAEA,GACI,CACJ32B,eACAlB,iBAEA,GADA63B,wFACAvpC,2FACA,uDACAA,qBACAmZ,YACA,CACA,IACI,EACJvG,cACAlB,qBACA,yBACAqtG,uBACA,mBACAC,KACS3Z,OACT,EACSA,MACT,EAEA,CAEA,KAGAkH,CACA,CAjDA,CAiDErC,kBAEFqC,0CAEAA,2BACA,6DAGAjd,WAEA,EAEA,gBAEA,aAYA,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAZzJ38E,sCACAjB,WAeA,kBAGA,aACA,iBAEAysG,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQA1N,CACA,CAVA,CARA,cAAwC,0BAAuC1F,WAF/E8T,CAFA7U,MAsBEe,cAEF1b,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAGA,IAEA63B,sBAAuD,mCAAkD,6CAA8D,gBAA0B,gCAA4C,qBAAuB,EAA2B11B,UAA4C,gBAA4B,gBAA4B,aAAuB,uBAA4B,EAAoBmqG,YAE1c/M,aAAkC,iBAA2C,aAAgB1vG,YAAkBA,MAAO,aAA2B2vG,gCAAwDA,mBAAgC,+BAAuDv+F,qCAA+D,yBAAyD,4BAAqEw+F,aAA6DC,IAA1hB,GAIAlH,IAFAD,MAMAQ,IAFAR,OAMAW,IAFAX,OAMAqK,IAFArK,OAIA,cAAwC,0BAAuCe,WAQ/E,kBAUA,mBAhBA,iBAAmD,sBAA0C,yDAiB7F+G,UAEA,OAjBA,iBAAmD,MAAa,sFAAyF,2DAiBzJoM,8DAEA,uBACA3sC,iDACAA,oCACAA,aACAA,EACA,CAEA,OAxBA,iBAA4C,oCAA+D,0FAAuGysC,4CAAyEt9G,aAAe+Q,qDAA6EwsG,uEAGvXE,OAEAnN,YACAr+F,YACAlB,iBAEA,KAeAu/F,OACAr+F,aACAlB,iBAEA,gDACA,GACI,CACJkB,aACAlB,sBACA,oBACA,qGAIA,QAFAS,OACA+G,IACA,uDACAA,sBACA/G,WAEA,UACAnS,gCACAmS,aACAA,uCACAnS,eAEA,GACI,CACJ4S,YACAlB,sBACA,4BACA63B,4FACA,GACI,CACJ32B,aACAlB,iBACA,mBACA,GACI,CACJkB,eACAlB,iBACA,+CACA,GACI,CACJkB,aACAlB,iBACA63B,wFACAvpC,gBACA,GACI,CACJ4S,cACAlB,iBACA,YAEA,8BACA,kBACA,sBACAuJ,kCACAgkG,SACA78G,UACAsW,SACA,gDACA,uCACAumG,OACA78G,QACAsW,MACA,CAEA,2EACA1Y,0EAEA,qCACA,qDACAA,gCACAi/G,oBACAj/G,wBACAA,iCAEAA,qBACAA,+DACAA,mDACAA,wCAEA,CACAA,cACA,UACAA,wEACA,IAIAw0G,EA7I8a,eAA2B,qBAA0B,UAAc,iCAA2C,OAAxf,iBAAiC,UAAe5D,MAAeC,KAAgBC,SAAoB,IAAM,qCAA0CF,yBAA4CG,kBAAqBxvG,kBAAlCqvG,OAAmL,CAAjJ,MAAuC3D,GAAc4D,KAAWC,YAAsB,KAAMF,0BAAqD,CAArD,QAAqD,cAAsB,UAA6HI,OAAuC,4EA6InkBL,CAJA,uBACA,8CACA,GAEA,GAKAuB,8BAHA9vG,QAGA68G,EAFAvmG,OAGA,EAAQ,CACR,GACI,CACJ9F,aACAlB,mBACA,YAEA+7F,uBACA,kDACAyP,YAEA,EACA,GACI,CACJtqG,YACAlB,iBACA,QACA,KAGAwtG,EACA,CA1IA,CA0IEzU,WAEFyU,oBACAA,wBACAA,iBACAA,oBAGA5vB,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAGA,kBAAkC,gBAA2C,YAAgBnQ,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,2CAA8D,eAA0B,gCAA4C,sBAAuB,EAA2B11B,UAA4C,eAA4B,eAA4B,YAAuB,uBAA4B,EAAoBmqG,WAI1cmB,IAFAlV,OAQA,cAAwC,0BAAuCe,WAQ/E,SAVA8T,EAFA7U,OAYAe,yBAEAoU,cAGA,cAXA,gBAAmD,qBAA0C,yDAY7FrN,SAEA,MAZA,gBAAmD,MAAa,sFAAyF,uDAYzJoM,0DAEA,6BACA3sC,CACA,CAEA,OAhBA,gBAA4C,kCAA+D,yFAAuGysC,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAKvXE,MAWAnN,OACAr+F,WACAlB,iBACA2gG,yBACA9oE,8FACA,KAGA61E,CACA,CArBA,CAqBED,WAEFC,UACAC,8BACAC,4CACAC,kCACAC,8BACAC,oCACAC,2BAEAN,WACAO,UACAC,gBACAC,aAGAvwB,WAEA,EAEA,cAEA,aAEA,sCACAqV,OASA,cA4BA,kBACA3kG,UACAA,eACAA,eACA,CASA,aACAA,mBACAA,mBACA,CAnCA2S,gBACAmtG,iCAMA,2BAqCAC,kCACA,IACA7oC,EACA1Z,EAFAn4D,KAIA,kCAEA,wBACAlD,qCAGA,oCACAkD,0CAGAA,CACA,EAUA06G,oCACA,IACAnkC,eADA+oB,WAGA,eACA,eACA,qBAEA,sCAA4DpjG,IAAOA,IACnEy+G,aAGA,QACA,EASAD,uCACA,gBAEA,6BAEA,IAEA7/G,EACAqB,EAHAM,kBACA0N,mBAIA,SAGA,OAFA1N,8CAEA0N,QACA,sCACA,wCACA,0CACA,4CACA,8CACA,2CAGA,yBAA2ChO,IAASA,IACpDrB,oBAGA2B,uBACA,KAAK,CACL,IACAgO,GADAsgB,WAGA,QAAiB5uB,IAAYA,IAG7B,OAFAM,oDAEA0N,QACA,6BAA6D,WAC7D,+BAAiE,WACjE,iCAAqE,WACrE,mCAAyE,cAEzE,gCAA4DM,KAASA,KACrE3P,sBAGA2B,8BAGA,CAEA,QACA,EAWAk+G,+BACA,uBACAE,YAEA,uBACAjgH,mBACAA,oCADAA,yBADAA,uCAIAA,IACA,EAWA+/G,iCACA,0BACAE,YAEA,uBACAjgH,mBACAA,oCADAA,yBADAA,uCAIAA,IACA,EAYA+/G,6CACA,gBAEA,gCACA,MACA,wDACA//G,gBACAA,KAGA,sBAEA,QAEA6B,YACAq+G,cACAv9F,oBAEA,iDACA3iB,qBAEK,CACL,4BAA6DuB,IAAYA,KAEzEM,aACAq+G,eACAv9F,sBAEAu0D,aAOAA,6CACA,iDACAl3E,eACA,CAEA,WACA,EASA+/G,2CACA,MAEA,SAEA//G,aADAigH,eAEA,iDACAjgH,kBAGAA,mBACAA,qBAGAA,IACA,EAKA+/G,2CACAA,uCAKAA,uCACA,WACA,EAKAA,cAKAA,wBAKA3X,QACAA,YAIA,EAEA,cAEA,aAEAz1F,sCACAjB,WAEA,oCACAgmF,UAEA,cACA,gCACA,kDAAwFyoB,IAAaA,IACrGjgH,oBAGA2c,2BACA,CACA,CAEA,cACA,8BACA,gCACAujG,CACA,EAAI,GACJ,CAEA/N,4BACA3a,IACA,EAEApI,WAEA,EAEA,cAEA,iBACA,aAEA,OASA+wB,EAOAC,EAfA,IACAC,MAKA,CAJA,MAGAA,eACA,CAGA,IACAF,KAGA,CAFA,MACAA,cACA,CAGA,IACAC,SAGA,CAFA,MACAA,cACA,CAuBA,sBACA,qBACAjzC,UACAmzC,cACAC,yBACAhmE,cAIA,SACAimE,KAEAC,oBA8IA,cA5IAlmE,QACAA,aAEA4yB,QACAA,OAGA,kBAEA,YACA,YAEA,UACA,SAEA,OACA3lC,EACA,sBACA,SAGA,mBACAwlE,kBACO/zF,eACP+zF,iBACO/zF,eACP+zF,yBACA/zF,oBACA6sB,eACA,EAAU,aACV46E,eACA,EACA,QAAQ,GACD9vG,eACPo8F,cACOp8F,gBACPo8F,6BACA/zF,gDACOrI,cACPo8F,6BACO,0BACP,+BACA/zF,WACA+zF,GACO/zF,mBACP+zF,2BAEAsT,OACA94E,2BACAwlE,sBAGAA,oBACAxlE,KAIA,MACA,mBAEA,SACA,YAEAm5E,UACAH,UACA,CAEA,mBAEA,QADAI,cAEAxwF,aACAguE,MAFA,CAKA,uBACAyiB,0BACA7T,WACA,CAEA,kBAEA,QADAiP,aACA,CACA,MACA,IADA7rF,YACAguE,KACA,MAEA,uBACA4O,SACA,CAGA,gBACA,MACAxlE,IACAooC,0CAGAA,kBAGAo9B,oBACA,CAEA,gCAEA,KADA8T,kCACA,QAAuBz/G,WAAoBA,KAG3C,YACA2vG,0CACAA,mBAGAhE,oBACAgE,cACAv+F,4BACA0B,gBAGA,CAdA,CAiBA,KAEA,KADA4sG,gCACA,QAAuB1/G,WAA6BA,KACpD,IACA2vG,EADAgQ,SACAhQ,0CACAA,eAGAhE,sBACAv6F,6BACA0B,gBAEA,CAVA,CAaA,SACA,CAEA8sG,KACA,CAoBA,cACA,wCACA,CAkBA,cACA,SACA,0BACAC,uBACAA,sBACAC,CACA,CACA,OAtCAvwG,6BACA,YACA,YAEA,mBACA,qBACA,KACA,EAOAA,eAKAA,WAHA,cACA,gDACA,EAMAA,YAHA,cACA,iDACA,EAMAA,aAHA,cACA,kDACA,EAUAA,qBAEAA,CACA,CA5PA,GA8PA,gCACAs3F,YAIA,EAEA,cAEA,aAMA,gBAAmD,qBAA0C,yDAJ7Fz1F,sCACAjB,WAKA,qBACA,gEAEAqgG,UAEA/xG,aACAA,cACA,EAEAshH,eAEAhyB,YAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,yBAEA,OAA8a,eAA2B,qBAA0B,UAAc,iCAA2C,OAAxf,kBAAiC,SAAeshB,MAAeC,KAAgBC,SAAoB,IAAM,oCAA0CF,wBAA4CG,iBAAqBxvG,iBAAlCqvG,OAAmL,CAAjJ,MAAuC3D,GAAc4D,KAAWC,YAAsB,KAAMF,wBAAqD,CAArD,QAAqD,cAAsB,SAA6HI,OAAuC,6EAEnkBC,aAAkC,kBAA2C,YAAgB1vG,WAAkBA,KAAO,YAA2B2vG,gCAAwDA,mBAAgC,+BAAuDv+F,qCAA+D,wBAAyD,6BAAqEw+F,YAA6DC,IAA1hB,GAIAlH,IAFAD,MAMAuS,IAFAvS,OAMAwS,IAFAxS,OAMAsH,IAFAtH,OAQA,eAAwC,6BAAuCe,YAE/E,eAAoC,sBAA0B,gCAA0CzpG,aAAgBA,KAAOggH,aAAoB,SAAsB,sBAEzK,kBAAmD,uBAA0C,yDAE7F,SARAzC,EAFA7U,OAUAe,4BAEAwW,kBACA,+DAEAzP,WAEA/xG,cACAA,aACA,EAEAyhH,cACA,kBACA,WAEA1P,WAEA/xG,eACAA,eACAA,kBACAA,8BACAA,yDACAwxE,cACA,GACAxxE,uDACAwxE,cACA,GACAxxE,4CAEAA,0CACA,6FACAwxE,sCAGAgsB,uDACA,EACA,GACAx9F,8DACAkX,iDACAs6D,kCAEA,GACAxxE,iEACA,0BACA,UACAoiB,mCAEAovD,yDACA,IACAA,yEACW,CAAX,MAAW,CACX,EACA,GACAxxE,qCACA,CAEA,cACA4S,YACAlB,iBACA1R,kBACAA,kBACAA,+BACA,GACI,CACJ4S,aACAlB,oBACA,yDACA,sBACA,6BACA,4EACA,0CACA,uCACA,kBAEA,gCACA,+BACAi8F,oCACA,MACAA,0CAEA3tG,oBACA,CACAA,wBACAA,uBACAA,2EACAA,eACA,GACI,CACJ4S,gBACAlB,kBACA,+DAEAqrG,wBACA7jG,mBACAiX,uBACA,aACA/c,SACAsuG,sBACAC,UACAC,OACApxF,OACA,uBAEA,uBAEAqxF,UAEAzuG,OACAod,OAEA,6BACA,QACAvV,gBAEA,4BAEA6mG,UAKA,UAHAF,QAGA,YAEA,kBAJApxF,QAIA,GAEAuxF,YAKA9mG,SAHA7H,QACAod,SAGAE,2BACA,KAAS,CACT,cACAvY,UACA/E,mBACAod,iBACAvV,gBACAA,kBAEAA,kBACAA,cACA+mG,YAEA7pG,+BAEAA,qCACAqY,mBAEAE,GACA1W,iBACAnC,YACAkC,QACAhC,WAEA,CACA,oDACA,OACAF,oBACAC,6BACAC,iBACAC,6BACAgC,gBACAD,cAEA,GACI,CACJnH,qBACAlB,iBACA,8BACA,wCACA,sBAEA,GADA,UACAuwG,0EACA,YAEA,QACA7/G,OAAkBgR,4CAClBsF,KAAgBtF,wCAChBgP,UAEA,4CAGA,QAFAhP,SACAod,aACApd,2CACA,yBACAA,kBACAod,YACapd,wBAIb,MAFAod,GADApd,yBACAo5F,wCAEA,CAGA11E,mBACA,GACAu7E,4BACAp3F,EACA,GACI,CACJrI,eACAlB,iBACA,WAEAuJ,wBACA,6BACA,uCACAA,oBACAinG,mCAEA,yBACA,cACA9uG,OACAod,OAEAm9E,uBACAz0F,qBACA,aACAA,EACWy0F,iCACXz0F,aAEAA,cAEA,GACA9W,4BACAsW,4BACA,4CACA,gBACA,GACI,CACJ9F,eACAlB,iBACA,yCACA,GACI,CACJkB,qBACAlB,iBACA,4EAEA,WACA,wCACA,WACA,oCACA,2EACAmrG,WACAjlG,OAEA5X,qFACA,SAAS0wB,SACT,iEACA8sF,UACA2E,OAEAniH,uCACA,EACA,GACI,CACJ4S,qBACAlB,oBACA,gEACA0wG,2DACA/1B,0DAGA,GADAgmB,kCACA,6EAGA,+BACA,WACA,YACAryG,mCACA,kCAAkDoiB,OAClD,8FACA,6BACAnH,gBACAA,eACAuuD,oBACAA,aACA,CACA,MACAA,oBACAxpE,iBACAi6D,sBAEA,GACI,CACJrnD,eACAlB,kBACA,IAYA2wG,EACAniH,EACA68G,EAdAG,OAEA7wB,2DACA55E,+EAEA,sBACAA,KACA45E,OAEAgmB,qBACA,SAEAgQ,mDACAniH,KACA68G,oBACAsF,wBACAnpG,kBACA,IACAopG,mBACAC,UAEA/xF,OACAgyF,GAFAD,KAEAzrF,kBAEA2rF,YAKAviH,OAHAuiH,MACAjyF,QAGA,GACAtwB,aACAA,eAEAg9G,6CAGAl9G,0BAEAA,cACA,GACI,CACJ4S,aACAlB,iBACA,oFAEAgxG,SACAC,kBAEAC,kBAEAC,UAQA,GANA7iH,oBACA0iH,OAEA,uBACA1iH,kCAEA,iCACA,OAEAA,kFACAA,sBAEA,IAGAs0G,EAHAp0G,yFACAq0G,yEACA9hG,+BAGA6hG,+BAEA,CACA,KAGAmN,EACA,CApWA,GAsWA,kBASA,4BACAqB,kBAEA3pG,eACA,CAEAm2E,UACAA,YAEA,EAEA,cAEA,aAEA38E,sCACAjB,WAGA,iBAAkC,gBAA2C,YAAgBnQ,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAIAr/B,aACA,iBAHA,iBAAmD,qBAA0C,0DAI7FggC,SAEA/xG,aACAA,eACAA,eACA,CAEA,aACA4S,WACAlB,iBACA,WAEAiB,sDACA,oBACA6+D,cAEA,EACA,GACI,CACJ5+D,gBACAlB,kBACA,kDACA,qEACA1R,eACA,KAGA+xE,CACA,CA9BA,GAgCAA,YACAgiC,YAEAhiC,UACAi5B,WAGA1b,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAGA,IAEAw4F,IAFAD,MAIAG,QAEAC,OAEA,cAAwC,0BAAuCW,WAE/E,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAIzJ,kBAGA,aACA,iBAEAmT,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQAnS,CACA,CAVA,CAUE/B,qBAEF+B,6CAEA3c,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAGA,OAA8a,eAA2B,oBAA0B,SAAc,gCAA2C,OAAxf,iBAAiC,SAAek/F,KAAeC,KAAgBC,SAAoB,IAAM,mCAA0CF,uBAA4CG,iBAAqBxvG,mBAAlCqvG,MAAmL,CAAjJ,MAAuC3D,GAAc4D,KAAWC,YAAsB,KAAMF,uBAAqD,CAArD,QAAqD,cAAsB,SAA6HI,OAAuC,6EAEnkBC,aAAkC,iBAA2C,YAAgB1vG,YAAkBA,KAAO,YAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,wBAAyD,6BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,qBAAuD,iCAAkD,4CAA8D,eAA0B,+BAA4C,qBAAuB,EAA2B11B,UAA4C,eAA4B,eAA4B,YAAuB,uBAA4B,EAAoBmqG,WAI1c9T,IAFAD,MAMAqK,IAFArK,OAIAG,QAEAC,OAIAC,IAFAL,OAMAM,IAFAN,OAMAsS,IAFAtS,OAIA,cAAwC,0BAAuCe,WAQ/E,eACA,wDACA,CAEA,mBAGA,kBAbA,gBAAmD,qBAA0C,yDAc7F+G,SAEA,MAdA,iBAAmD,MAAa,sFAAyF,uDAczJoM,6DAEA,2BACA36G,6BACAguE,6CACA,eACAygC,CACA,EAAQ,KAERzgC,aACAA,WACAA,CACA,CAEA,OA1BA,gBAA4C,kCAA+D,yFAAuGysC,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAOvXE,MAmBAnN,MACAr+F,eACAlB,oBACA,mBACAqxG,UACA1uF,OACA7D,OAEAwyF,iBAEA1uF,EADAq8E,QACA,GAEApnE,8FACA,6EACAjV,wBACAA,2BAGAD,iBADAC,2DAEAD,YAEAr0B,eACA,GACI,CACJ4S,aACAlB,iBACA,iEAEA1R,8CACA,GACI,CACJ4S,eACAlB,wBACA,2CACA63B,gGACAvpC,gBACA,GACI,CACJ4S,eACAlB,sBACA,oDACA,qBACA,4DACA,kDACA1R,oBACA,4BACA0R,iBAEAi8F,iBACA,KAAW,CACX,4BACA3tG,mBACA,MAEAupC,8FAEAvpC,gBACA,GACI,CACJ4S,mBACAlB,oBACA,kDACA,kDACA88F,iBACAb,GACA,CACApkE,+FACA,GACI,CACJ32B,WACAlB,kBACA,oCACA,GACI,CACJkB,WACAlB,kBACA,yBACA1R,eAEAA,qBACA,GACI,CACJ4S,YACAlB,iBACA,+DACAye,0EAEA8yF,oBACA,SACA7V,IACA,iDACA8V,MACAp4D,UACaoiD,mCACbpiD,sBAEAsiD,KACA,GACAtiD,CACA,EACA,kBACA,GACI,CACJl4C,eACAlB,iBACA,iEAEA,iBACA63B,0FACAkkE,YACAztG,sDAEA,GACI,CACJ4S,WACAlB,kBACA,qGACA,GACI,CACJkB,aACAlB,kBACA,mBACA,8BACA,qBACAe,KAEAjP,mBACAiqG,+BAEAA,YACAztG,6DAEAupC,mGACAkkE,YACAztG,sDAEA,KAGAqsG,CACA,CAhKA,CAgKEnC,kBAEFmC,qBACAA,yBACAA,iBACAA,wBACAA,sDAEA/c,YAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,yFAEA,OAA8a,gBAA2B,qBAA0B,UAAc,iCAA2C,OAAxf,kBAAiC,UAAeshB,MAAeC,MAAgBC,UAAoB,IAAM,sCAA0CF,0BAA4CG,mBAAqBxvG,oBAAlCqvG,OAAmL,CAAjJ,MAAuC3D,IAAc4D,MAAWC,cAAsB,KAAMF,0BAAqD,CAArD,QAAqD,gBAAsB,UAA6HI,QAAuC,6EAEnkBC,aAAkC,kBAA2C,aAAgB1vG,aAAkBA,MAAO,cAA2B2vG,gCAAwDA,mBAAgC,+BAAuDv+F,qCAA+D,0BAAyD,8BAAqEw+F,aAA6DC,IAA1hB,GAIAC,IAFApH,OAMAC,IAFAD,MAMAE,IAFAF,OAMA2H,IAFA3H,OAMAuH,IAFAvH,OAIAkZ,QAEAC,QAEAC,QAEAC,QAEAC,QAEAC,SAEA,cAAwC,0BAAuCxY,WAE/E,qBAA6C,eAAkBr4F,4BAAkCjB,qDAAgFoB,SAAoBA,EAUrM,uCAEA2wG,iBAEAC,6BA6NA,kBACA,mBACA/zF,gBAEAA,EACA,GAlOA,+GAyPA,kBACA,UACApc,eACA,iDACA++B,cAEA/+B,0CACA++B,YAEA3/B,2BACAgd,uDAEA/d,iCAEA+d,4CAEAA,EACA,GA1QA,yDAoOA,cACA,oBACA,IApOAg0F,gEACA,wBACAzV,CACA,EAAE,IAEF0V,gHACA,wBACA1V,CACA,EAAE,IAEF2V,cAGA,oBAzBA,iBAAmD,sBAA0C,yDA0B7F9R,UAEA,OA1BA,iBAAmD,MAAa,sFAAyF,2DA0BzJoM,kEAEA,mEACA3sC,mDACAA,gDACAA,yCACAA,eACAkyC,mDACAlyC,uBAtCA,eAAoC,qBAA0B,gCAA0CjwE,YAAgBA,KAAOggH,aAAoB,UAAsB,qBAsCzKuC,KACA,GACAtyC,EACA,CAEA,OArCA,kBAA4C,oCAA+D,0FAAuGysC,4CAAyEt9G,aAAe+Q,qDAA6EwsG,uEAmBvXE,OAkBAnN,OACAr+F,iBACAlB,sBACA1R,2BACA,GACI,CACJ4S,cACAlB,mBACA,sBACA1R,6BAGA,8BACA+jH,YAIAp0F,oBAHAo0F,MACAA,OAIA,8DACAp0F,gEAEA0iF,6CACAryG,4BACA2vB,EACA,GACI,CACJ/c,2BACAlB,sBACA,oFAEA,uBACA,mDAEA,wBACA,0EAEA,GACI,CACJkB,cACAlB,mBACA,YAEA,gDACA,kCACAie,oCACAq0F,2CACAhkH,uBACAw9F,sBACA0U,oDACAviF,6CACAuiF,mDAEAA,sEACAA,yCACAA,mCACA,EAAQ,GACR,GACI,CACJt/F,sBACAlB,iBACA,YAEAuyG,MACAC,MACA,0CACA,gBACA3zB,SACA4zB,SAEA,gBACAC,eACAF,YACA,WACAE,kBACAH,YACA,cAEA,+DAEA7wG,gBACAA,cACA,GAGA,GACA,OACA,KAGAywG,EACA,CA9GA,CA8GErS,WAMF,cACA,2CACA,6BACA,gDACA,CAEA,iBAEA,QADA6S,MACA9iH,kBAAsCA,6BAAwCA,IAC9E,iBACA,oCACA8iH,eACA,CACA,kCACA,CAEA,cACA,oCACA,YACA,kDACA,CAEA,oBAEA,gCACAH,0BACA,eACA,EAAM,eACD9wG,4BACL,gDACA,mBACA,sCACAkxG,6BACA,gBACA,EAAUA,IACVA,sCACA,gBACA,EAAUA,KAEV30F,aACA,EAAM,eAEN,aAEA,CAEA,oBACA,2DAA4F4iB,OAC5F,CAEA,kBACA,8CACA29B,sCACAo/B,sCACAh9D,MACA,qDACA,qDACA,WACAA,4BACAA,mBAEA,cAEAA,IADAi9D,UACAgV,uBAEA,cAEAjyE,IADAi9D,UACAgV,uBAEA,GACA5xG,2BACAgd,uDAEAA,EACA,CAEA,kBACA,0BACA,sBACA,4CACA,UACAje,eACA,WACA2rG,mBACA1tF,4CAEA,SAAK,+BACL,aAAqC63E,2BACrC73E,qDACA,CACA,SACA,CAaA,kBACA,0BACAA,gBAEAA,EACA,CAEA,kBACA,oDACA,+EACAvc,mDACAuc,eAEA,CACA,SACA,CAqBA,kBACA,cAEA,gCACA,4BAEA,kDAEA,uBACA,uCACAQ,mBACA,EAEAqB,IADAA,+CACA44C,kCACA,2FACA54C,uCAEA,+EACAA,qCAEA,CACA,oBACA,CAtKAqyF,YACAW,aAuKAl1B,YACAA,qBACAA,eACAA,kBACAA,kBACAA,cAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,kDAEA,IAEA4a,EAEA,cAAwC,0BAAuCc,WAF/E8T,CAFA7U,MAMA5/E,GACAyd,4BACAmqE,wCAGAwS,wDACAC,uDACAC,yDAEAr1B,mBACAA,eACAA,cAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,2CAEA,IAEA4a,EAIA,cAAwC,0BAAuCc,WAJ/E8T,CAFA7U,MAIAoZ,QAIAuB,uDACA98E,+BAEA+8E,yDACA/8E,+BAGAwnD,oBACAA,mBAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,mDAEA,kBAAkC,gBAA2C,YAAgB/tF,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,2CAA8D,eAA0B,+BAA4C,qBAAuB,EAA2B11B,SAA4C,eAA4B,eAA4B,aAAuB,wBAA4B,EAAoBmqG,YAI1c9T,EAEA,cAAwC,0BAAuCc,WAF/E8T,CAFA7U,MAMA,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAIzJ,kBAGA,aACA,iBAEAkU,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQAnN,OACAr+F,YACAlB,kBACA,6FACA,4BAEA,KADAA,iDACA89F,2BACA,+CACA,GAAQxH,SAJRt2F,CAKA,KAGAozG,CACA,CAtBA,CAsBE5a,4BAEF6a,qDACAj9E,+BAEAk9E,yBACAl9E,+BAGAwnD,oBACAA,eACAA,cAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,8DAEA,IAEA4a,EAEA,cAAwC,0BAAuCc,WAF/E8T,CAFA7U,MAMA5/E,GACAyd,4BACAmqE,mBAGAgT,0DACAC,+DACAC,4DAEA71B,uBACAA,mBACAA,kBAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,+BAEA,kBAAkC,gBAA2C,YAAgB/tF,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,2CAA8D,eAA0B,gCAA4C,sBAAuB,EAA2B11B,UAA4C,eAA4B,eAA4B,YAAuB,uBAA4B,EAAoBmqG,WAI1c9T,EAEA,cAAwC,0BAAuCc,WAF/E8T,CAFA7U,MAMA,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAIzJ,OACAniE,6BACAmqE,iCAGAmT,qDAEAC,cAGA,aACA,iBAEAlH,qEACA,CAEA,OAlBA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAUvXE,MAQAnN,OACAr+F,YACAlB,kBACA,iHACA,KAGA2zG,CACA,CAjBA,CAiBEnb,4BAEFob,gCAEAh2B,cACAA,aAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,+BAEA,IAEA4a,EAEA,cAAwC,0BAAuCc,WAF/E8T,CAFA7U,MAMAsb,mDACAz9E,6BACAmqE,qCAEAuT,qDACA19E,6BACAmqE,mCAGA3iB,cACAA,aAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,sCAEA,kBAAkC,gBAA2C,aAAgB/tF,YAAkBA,MAAO,YAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,wBAAyD,2BAAqEw+F,YAA6DC,GAA1hB,GAIAlH,IAFAD,MAMAE,IAFAF,OAQA,cAAwC,0BAAuCe,WAQ/E,kBAGA,kBATA,gBAAmD,qBAA0C,yDAU7F+G,SAEA,MAVA,gBAAmD,MAAa,sFAAyF,uDAUzJoM,+DAEA,wBACA3sC,kBACAA,UACAA,8DACAi0C,oDACAj0C,+CAGAA,gBAFAA,eAIA,GACAA,6BAAuC5+D,qBAA0B4+D,gBACjEA,6BAAuC5+D,iCAA0C4+D,gBACjF,iCACAA,6BAAyC5+D,qBAA0B4+D,gBAEnEA,CACA,CAEA,OA7BA,gBAA4C,kCAA+D,yFAAuGysC,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MA0BAnN,OACAr+F,aACAlB,qBACA,6BACA,6BACA1R,oBACAA,qBACAA,yDACAA,qBACA,iBACAA,4BACAA,sCACAA,uBACA,GACI,CACJ4S,YACAlB,iBACA1R,YAAsB0lH,gBACtB,GACI,CACJ9yG,aACAlB,qBACA,qBACA,oBACA,wCACA4qD,cACA,sEACA,4BACAqpD,sBACAC,qBACA,MACA5lH,qBAEAA,sBACA6lH,QACAH,UAEA1lH,8CACAA,wBAEA,GACI,CACJ4S,WACAlB,iBACA1R,0BACA,GACI,CACJ4S,gBACAlB,mBACA1R,oCACAggB,+BACAA,8BACA,GACAhgB,oCACAggB,+BACAA,8BACA,EACA,GACI,CACJpN,WACAlB,iBACA1R,0BACA,KAGA8lH,CACA,CA7FA,CAVAhH,EAFA7U,OAyGEe,SAsBF,cACA,8BACA,uBAEA,EAAI,GACJ+a,eACA,OApBA,cACA,4BACA,iBACA,eACA,mDAEA,oBACApzG,2CACA,qDACA,GAGA,CAQAqzG,MACAD,MAEAA,CACA,CA9BAD,YACAtlH,UACAylH,aACAC,aA6BA52B,YACAA,sBAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAGA,+EAAsG,iBAAqB,YAAmB,qGAE9Ii/F,EAA8a,eAA2B,oBAA0B,SAAc,gCAA2C,OAAxf,iBAAiC,UAAeC,MAAeC,MAAgBC,UAAoB,IAAM,qCAA0CF,0BAA4CG,mBAAqBxvG,oBAAlCqvG,OAAmL,CAAjJ,MAAuC3D,IAAc4D,MAAWC,cAAsB,KAAMF,0BAAqD,CAArD,QAAqD,gBAAsB,UAA6HI,OAAuC,6EAEnkBC,aAAkC,iBAA2C,aAAgB1vG,aAAkBA,MAAO,cAA2B2vG,gCAAwDA,mBAAgC,+BAAuDv+F,oCAA+D,yBAAyD,6BAAqEw+F,YAA6DC,GAA1hB,GAIAoL,KAFAvS,OAMAwS,KAFAxS,OAMA0H,KAFA1H,OAMAqS,KAFArS,OAMAC,KAFAD,MAMAE,KAFAF,OAMA2H,KAFA3H,OAMAuH,KAFAvH,OAIA,eAAwC,0BAAuCe,WAQ/E,uCAEAmb,sDAEAC,cAiBA,mBA3BA,iBAAmD,qBAA0C,yDA4B7FrU,SAEA,OA5BA,gBAAmD,MAAa,sFAAyF,uDA4BzJoM,gEAEA,sBACAxrG,sDACA6+D,yBACAA,sCAEA,GACAA,eAAwB5+D,gCAA0CyzG,GAClE70C,eAAwB5+D,wDAAsE,cAC9F,oCAEA4+D,eAA0B5+D,sBAA8B,CAAI0zG,cAAiBC,GAC7E/0C,eAA0B5+D,mBAA2B,CAAI0zG,cAAiBE,KAE1Eh1C,eAA0B5+D,sBAA8B,CAAI0zG,4BAAiCC,GAC7F/0C,eAA0B5+D,mBAA2B,CAAI0zG,4BAAiCE,IAE1Fh1C,eAAwB5+D,sBAA8B,CAAI0zG,cAAkBG,GAC5Ej1C,eAAwB5+D,mBAA2B,CAAI0zG,cAAkBG,GACzE,uCACAj1C,eAA0B5+D,kCAA8C2zG,GACxE/0C,eAA0B5+D,+BAA2C4zG,IAErEh1C,YACAA,EACA,CAEA,OAtDA,gBAA4C,kCAA+D,yFAAuGysC,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAOvXE,MAEAnN,WACAr+F,YACAlB,sBAGA,WAFAg1G,UACAC,sCACA,4DACA,8CACA,KAGAD,+BACA,KAkCAzV,MACAr+F,iBACAlB,mBACA,iEACA2J,6DAEAqrG,SACA,0BACA,+DAEA,wBACA/jG,IAAqBtH,aAErB,wBACAA,IAAqBA,aAErBqrG,2BACA1mH,gDACAA,8BACA,GACI,CACJ4S,aACAlB,iBACA,YAEA1R,wDACA,wBACA,KACA4mH,gBADA3G,uBACA,wBACA,qBACA,GACA,iBACA,gCACA,iCAEA,uCACA4G,WACAjvG,QACA4Y,SAEAs2F,kCACAC,WACAC,SACAC,SAEAC,kEACAC,WACAC,SACAC,SAEAC,0DACAC,wDACAC,IACAlB,wBACAmB,mCACAl1E,8BACA/hB,UACAm0E,UACAtrF,WAEAutG,qBAGA,GAFA,iDACA,qCACA,gDACA,6BAEA,gCACA,0BACA,GACA,iBAEa,2BAEbj0G,0CACA,8CACA,yCACA8pG,uCACA,GACA,SAIA,QADA,6CACA,+CACA,6BACA,IAEAwD,sBAEA,EACA,KAGAmG,CACA,CA7IA,CA6IE5U,WAkIF,gBACA,eAEA,wCACAkW,WAGAp1E,MACA,iBACA,OAJAo1E,MAIAp1E,UACAq1E,qCACAr1E,uCACA,CACAtyC,0DACA2S,0BACA3S,6DAEAA,sCACA,CAEA,cACAib,mCACAjb,uDACA,CAEA,cACAA,gDACAA,0DACAA,qCACA,CAEA,gBACA,YAEAib,YACAjb,6CAEA,oDACA,iFACA4nH,qBAEAA,EACA,EAAI,IACJ5nH,8DACAA,sCACA2S,2CACA,eACAnP,6BACA,aACA05G,wDACA,EACA,CAEA,cACA,OACAtqG,eACAi1G,YACAt1E,QAAe,iBACfl3B,qBACA,qCACAnC,YACAiX,aAEA23F,uCACAC,WACApJ,SACAnuF,SAEA,YACA,oCACApuB,4BACAsW,4BACAoyC,mDACAt6B,KACAs6B,2BACAk9D,GACArJ,0BACAnuF,kBACA,OACAtX,kBAEAiX,mBAEWvY,wBACX+mG,iCACAnuF,kBACA,OACAtX,kBAEAiX,mBAGAK,eACA,GACAxwB,0CACAA,wDACA,EAEA,CAEA,cACA,OACA4S,uBACA+zG,YACAtrG,wBACArb,yDACA,EAEA,CAEA,cACA,0CACA,UAAwB4S,QAKxB,GAHA,8CACA8zG,uBAEA,uBACA,qCACAA,0CACO,iBAGP,YAFAA,uCAEA,CAGA,QACA,CA/PAN,QACA6B,YACAC,MACAC,SACAC,UACAC,QACAC,MACAC,SACAC,QACAC,WAGArC,YACAQ,UACA8B,eACAC,mBACAC,yBACAZ,QAEAp1G,eACA2/B,sCACAl3B,uBACA,wCACArb,uDACA,GAEA6oH,SACAj2G,eACAi1G,YACAt1E,sCAEAl3B,uBACA,wCACArb,uDACA,GAEA,qBACA4S,qBACA0zG,aACA/zE,sCACA/hB,SACAnV,uBACA,uBACArb,wDACW,2BACXA,0DACW,sBACXA,mDAEA,GAEA,0BACA,2BACA,cACA4S,eACAi1G,YACAvB,aACA3hB,aACAtpF,oBACArb,yDACA,GAEA8oH,KACAl2G,eACAyI,uBACAsH,cACA3iB,6CAEAA,2DACAA,2DACA,GAEA,oBACA4S,iBACA0zG,aACA/zE,gBACAk1E,SACApsG,uBACArb,oDACA2iB,kBACA3iB,qDAEA,GAEA,mBACA4S,iBACA0zG,aACA/zE,QAAiBgoC,gBACjBl/D,oBACArb,yCAEA,yCACA2wG,QACA,GAEAp+D,2BACAvyC,0CACAA,4DACAA,qCACA,GAEA,gBACA4S,iBACA0zG,aACA/zE,kBACAl5B,YACAgC,oBACArb,yCACAA,sEACAA,4DACAA,qCACA,GAEA,iBACA4S,QACA0zG,aACA/zE,QAAiBgoC,SACjBoqB,mBACAtpF,uBACA,wBACArb,0CACAA,4FACAA,4DACA,KAsIAsvF,WAEA,EAEA,gBAEA,aAEA,IAEAy5B,KAFA9e,MAIAkZ,QAEAG,QAEA0F,QAIAC,KAFAhf,OAMAif,KAFAjf,OAIAkf,QAEAC,QAEAhG,QAEAC,QAEAE,QAEAC,QAIA6F,KAFApf,OAMAqf,KAFArf,OAMAsf,MAFAtf,OAMAuf,KAFAvf,OAMAwf,KAFAxf,OAMAyf,KAFAzf,OAMA0f,KAFA1f,OAMA2f,KAFA3f,OAIA4f,QAEAtN,QAIAuN,KAFA7f,OAMA8f,MAFA9f,OAMA+f,MAFA/f,OAMAggB,MAFAhgB,OAMAigB,MAFAjgB,QAMAkgB,MAFAlgB,QAMAmgB,MAFAngB,QAMAogB,MAFApgB,QAMAqgB,MAFArgB,QAMAsgB,MAFAtgB,QAIA,gBAAwC,6BAAuCe,YAE/E+d,oBACA,uDAEA,uCACA,iDACA,uCACA,+CACA,qCACA,qCAEA,uCACA,iDACA,uCACA,+CACA,qCACA,uCACE,GAEFA,oBACA,6BACA,qCACA,+BAEA,uCACA,6BACA,2BACA,2BAEA,+BACA,+BACA,2BACA,yBAEA,yBACA,sBACA,2BACA,0BACA,2BACA,2BACA,8BAEA,0BACA,0BAEA,+BAEA,4BACA,4BACA,6BAEA,2BACA,yBAEA,sBACA,uBACA,4BACA,6BACA,0BACE,GAEF3gB,mBAEA,EAEA,gBAEA,aAEAz1F,sCACAjB,WAEA49E,qBAEA,kBAAkC,gBAA2C,YAAgB/tF,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,2CAA8D,eAA0B,+BAA4C,qBAAuB,EAA2B11B,SAA4C,eAA4B,eAA4B,YAAuB,uBAA4B,EAAoBmqG,WAI1c9T,EAEA,cAAwC,0BAAuCc,WAF/E8T,CAFA7U,MAMA,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAIzJ,kBAGA,aACA,iBAEAkU,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQAnN,OACAr+F,UACAlB,oBACA,uBACA,uBACAA,kBACA,CACA,cACA1R,gBACA,GAEAupC,sFAEA,GACI,CACJ32B,aACAlB,oBACA,qMACA,GACI,CACJkB,YACAlB,kBACA,+GACA,KAGA84G,CACA,CApCA,CAoCEtgB,4BAEFugB,8BACA3iF,4BACAmqE,8BAGA3iB,eAEA,EAEA,gBAEA,aAYA,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAZzJ38E,sCACAjB,WAeA,kBAGA,aACA,iBAEAysG,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQAsM,CACA,CAVA,CARA,cAAwC,0BAAuC1f,WAF/E8T,CAFA7U,OAsBEe,SAEF0f,wBACAA,uBAEAp7B,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAGA,kBAAkC,gBAA2C,YAAgBnQ,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAQA,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAIzJ,kBAGA,aACA,iBAEA+M,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQAnN,YACAr+F,cACAlB,kBACA,wCACA,KAGAi5G,CACA,CAjBA,CARA,cAAwC,0BAAuC3f,WAF/E8T,CAFA7U,OA6BEe,SAEF2f,oBACAA,0CAEAr7B,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,4BAEA,kBAAkC,iBAA2C,YAAgB/tF,YAAkBA,KAAO,aAA2B2vG,gCAAwDA,mBAAgC,+BAAuDv+F,oCAA+D,wBAAyD,6BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,qBAAuD,iCAAkD,6CAA8D,gBAA0B,gCAA4C,sBAAuB,EAA2B11B,WAA4C,gBAA4B,gBAA4B,aAAuB,uBAA4B,EAAoBmqG,WAI1c9T,IAFAD,MAMAI,IAFAJ,OAMAM,IAFAN,OAIA,cAAwC,0BAAuCe,WAI/E,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAEzJ,gBAA4C,kCAA+D,yFAAuGiT,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAEvX,kBAGA,aACA,iBAEAC,qEACA,CAEA,OARAC,OAQAnN,OACAr+F,aACAlB,qBACA8rD,mBAGAj0B,2FAFAvpC,sDAIA,GACI,CACJ4S,aACAlB,iBACA,iCACA1R,qBAEAupC,qFAEA,GACI,CACJ32B,kBACAlB,qBAEA,OADA1R,4DACAw9D,kCACAx9D,8BACAA,OAEAA,qBACAupC,gGAEA,IACI,EACJ32B,cACAlB,kBACA,2GACA,KAGAk5G,CACA,CA/CA,CA+CEvgB,WAEFugB,uBACAA,eAEA,kBAGA,aACA,iBAEAzM,qEACA,CAEA,OARAC,OAQAnN,OACAr+F,aACAlB,qBACA1R,wBACAA,+BAEA,GACI,CACJ4S,cACAlB,iBAEA,OAhFA,mBAA6C,cAAkBiB,2BAAkCjB,qDAAgFoB,QAAoBA,EAgFrMsqG,IAAgCp9G,yDAChC,GACI,CACJ4S,mBACAlB,qBACA,kBACA63B,qGACS,CACT,8CACA4hB,iBACAA,0BACA,CACA,GACI,CACJv4C,eACAlB,iBACA63B,wFACA,gBACA,mMACAjZ,qBACAA,WAEA,GACI,CACJ1d,cACAlB,kBACA,+CACA,mDACAS,mBACAnS,oBACA,CACAupC,wFACA,IACI,EACJ32B,aACAlB,kBACA,+BACA0B,wEACA,wCACAA,8CAEAA,EACA,GACI,CACJR,cACAlB,kBACA,iCACA,iBACAy9F,+BACA,8DAEA,cAJA,CAQA,KAGA0b,CACA,CA/EA,CA+EEtgB,WAEFsgB,kBACAA,mCACAA,sBACAA,2BACAA,sBAEAv7B,aACAA,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAGA,kBAAkC,gBAA2C,YAAgBnQ,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,2CAA8D,eAA0B,+BAA4C,qBAAuB,EAA2B11B,SAA4C,eAA4B,eAA4B,YAAuB,uBAA4B,EAAoBmqG,WAQ1c,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAIzJ,kBAGA,aACA,iBAEAG,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQAnN,OACAr+F,eACAlB,iBACA63B,wFACAvpC,gDACAA,uCAEA,IACI,EACJ4S,aACAlB,iBACA,wEACA,GACI,CACJkB,cACAlB,iBACA,QACA,KAGAo5G,CACA,CA9BA,CARA,cAAwC,0BAAuC9f,WAF/E8T,CAFA7U,OA0CEe,SAEF8f,kBACAA,yBAEAx7B,WAEA,EAEA,gBAEA,aAYA,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAZzJ38E,sCACAjB,WAeA,kBAGA,aACA,iBAEAysG,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQA2M,CACA,CAVA,CARA,cAAwC,0BAAuC/f,WAF/E8T,CAFA7U,OAsBEe,SAEF+f,oBACAA,qBAEAz7B,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,4BAEA,kBAAkC,gBAA2C,YAAgB/tF,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,2CAA8D,eAA0B,+BAA4C,qBAAuB,EAA2B11B,SAA4C,eAA4B,eAA4B,YAAuB,uBAA4B,EAAoBmqG,WAQ1c,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAIzJ,kBAGA,aACA,iBAEAG,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQAnN,OACAr+F,aACAlB,oBACA,kIACAA,+BACA1R,mCACA,IACI,EACJ4S,aACAlB,kBACA,0EACA,0BACA0B,yBACAA,kCACAA,CACA,GACI,CACJR,cACAlB,kBACA,6BACA,GACI,CACJkB,eACAlB,kBACA,0DACA,KAGAs5G,CACA,CAtCA,CARA,cAAwC,0BAAuChgB,WAF/E8T,CAFA7U,OAkDEe,SAMF,gBACA,kCACAigB,SACA,0CACA,sBACA,CATAD,kBACAA,cACAA,8BASA17B,YACAA,YAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAGA,kBAAkC,gBAA2C,YAAgBnQ,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,2CAA8D,eAA0B,+BAA4C,qBAAuB,EAA2B11B,SAA4C,eAA4B,eAA4B,YAAuB,uBAA4B,EAAoBmqG,WAQ1c,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAIzJ,kBAGA,aACA,iBAEAG,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQAnN,YACAr+F,aACAlB,kBACA,kBACAuoD,8BACS,UACTA,8BAEA1wB,mEAEA,GACI,CACJ32B,cACAlB,kBACA,8BACA,gCAEA,KAGAw5G,CACA,CA9BA,CARA,cAAwC,0BAAuClgB,WAF/E8T,CAFA7U,OA0CEe,SAEFkgB,oBACAA,wBAEA57B,WAEA,EAEA,gBAEA,aAYA,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAZzJ38E,sCACAjB,WAeA,kBAGA,aACA,iBAEAysG,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQA+M,CACA,CAVA,CARA,cAAwC,0BAAuCngB,WAF/E8T,CAFA7U,OAsBEe,SAEFmgB,oBACAA,cAEA77B,WAEA,EAEA,gBAEA,aAYA,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAZzJ38E,sCACAjB,WAeA,kBAGA,aACA,iBAEAysG,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQAgN,CACA,CAVA,CARA,cAAwC,0BAAuCpgB,WAF/E8T,CAFA7U,OAsBEe,SAEFogB,uBACAA,cAEA97B,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAGA,kBAAkC,gBAA2C,YAAgBnQ,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,2CAA8D,eAA0B,+BAA4C,qBAAuB,EAA2B11B,SAA4C,eAA4B,eAA4B,aAAuB,wBAA4B,EAAoBmqG,YAI1cvT,EAIA,cAAwC,0BAAuCO,WAJ/E8T,CAFA7U,OAIAohB,QAIA,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAIzJ,+BAEAC,cAGA,aACA,iBAEAnN,qEACA,CAEA,OAbA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAKvXE,MAQAnN,OACAr+F,aACAlB,oBACA65G,gBACA75G,EACA1R,+BAEAA,gCAGAupC,yFAEA,IACI,EACJ32B,aACAlB,kBACA,0EACA,0BACA0B,uCAEAA,CACA,GACI,CACJR,cACAlB,kBACA,8BACA,2BACA4gC,wBAEAA,CACA,EAAQ,GACR,GACI,CACJ1/B,YACAlB,kBACA,6DAAkE85G,OAElE,GACI,CACJ54G,eACAlB,kBACA,wDACA,GACI,CACJkB,YACAlB,kBACA,4BACA,KAGA45G,CACA,CA5DA,CA4DE7gB,WAEF6gB,mBACAA,gBAEAh8B,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAGA,kBAAkC,gBAA2C,YAAgBnQ,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,2CAA8D,eAA0B,+BAA4C,qBAAuB,EAA2B11B,SAA4C,eAA4B,eAA4B,aAAuB,wBAA4B,EAAoBmqG,YAE1c5T,QAIAmf,EAEA,cAAwC,0BAAuCve,WAF/E8T,CAFA7U,OAMA,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAIzJ,yBAEAwhB,cAGA,aACA,iBAEAtN,qEACA,CAEA,OAbA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAKvXE,MAQAnN,OACAr+F,aACAlB,oBACA65G,gBACA75G,EACA1R,+BAEAA,gCAGAupC,yFAEA,IACI,EACJ32B,aACAlB,kBACA,0EACA,yCACA0B,qCACAA,uCACAA,CACA,GACI,CACJR,cACAlB,kBACA,8BACA,2BACA4gC,wBAEAA,CACA,EAAQ,GACR,GACI,CACJ1/B,eACAlB,kBACA,4BACA,GACI,CACJkB,YACAlB,kBACA,4BACA,KAGA+5G,CACA,CAtDA,CAsDErhB,cAEFqhB,mBACAA,uBACAA,mBAEAn8B,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,+BAEA,kBAAkC,gBAA2C,YAAgB/tF,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,2CAA8D,eAA0B,gCAA4C,sBAAuB,EAA2B11B,UAA4C,eAA4B,eAA4B,YAAuB,uBAA4B,EAAoBmqG,WAI1cvT,IAFAR,OAMAE,IAFAF,OAIA,cAAwC,0BAAuCe,WAE/E,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAIzJ,kBAGA,aACA,iBAEAmT,qEACA,CAEA,OAXA,gBAA4C,kCAA+D,yFAAuGF,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAQAnN,OACAr+F,YACAlB,iBACA,QACA,IACI,EACJkB,aACAlB,kBACA,0EACA,2BACAzR,yBACAmT,gCAEAA,qCACAA,CACA,GACI,CACJR,YACAlB,kBACA,mCACA,KAGAg6G,CACA,CAjCA,CAiCEjhB,WAEFihB,qBACAA,yBACAA,iBASAp8B,gBACAA,UARA,aACA,sBACA,kDAEA6a,wBACA,CAKA,EAEA,gBAEA,aAEAx3F,sCACAjB,WAEA49E,yCAEA,kBAAkC,kBAA2C,aAAgB/tF,aAAkBA,MAAO,aAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,yBAAyD,8BAAqEw+F,aAA6DC,GAA1hB,GAEA7nE,uBAAuD,iCAAkD,4CAA8D,eAA0B,+BAA4C,qBAAuB,EAA2B11B,YAA4C,eAA4B,eAA4B,aAAuB,wBAA4B,EAAoBmqG,aAI1c9T,IAFAD,MAMAE,IAFAF,OAMAuH,IAFAvH,OAQA,eAAwC,6BAAuCe,YAE/E,iBAAmD,sBAA0C,yDAE7F,iBAAmD,OAAa,sFAAyF,wDAEzJ,iBAA4C,kCAA+D,yFAAuGiT,2CAAyEt9G,aAAe+Q,sDAA6EwsG,sEAEvX,mBAGA,aACA,iBAEAC,qEACA,CAEA,OARAC,QAQAnN,OACAr+F,kBACAlB,mBACA1R,kDACAA,cACAupC,6FACA,GACI,CACJ32B,gBACAlB,mBACA,6CACA,gCACA8f,4CACAxxB,6BACAA,eAEAA,sCACA,CACA,KAGA2rH,CACA,CA/BA,CAVA7M,EAFA7U,OA2CEe,SAEF2gB,wBAEA,qDACA7jF,+BAGA8jF,eAGA,kBACA7Z,UAEA,uEAEA,0CACA,6GAEA5H,yBACAA,yBACA,WACA,8DACA,UACA0hB,wBACA3Z,cACA2Z,MACA,EAAQ,KACR,GACA3Z,cACAA,CACA,CAEA,OAxBAkM,QAwBAnN,OACAr+F,gBACAlB,iBACA,YAEA,mCACA,iCACA1R,qDACAi6E,iCACA,GACAj6E,4CACA,SACAA,oDAEA,KAGA4rH,CACA,CA3CA,CA2CEpa,WAEFoa,YACA7kB,UACA,uBACA,aAEA,OADA9mG,8BACAyR,KACA,GAIA49E,cACAA,cACAA,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,+BAEA,OAA8a,eAA2B,qBAA0B,UAAc,iCAA2C,OAAxf,iBAAiC,SAAeshB,KAAeC,KAAgBC,SAAoB,IAAM,oCAA0CF,uBAA4CG,iBAAqBxvG,iBAAlCqvG,MAAmL,CAAjJ,MAAuC3D,GAAc4D,KAAWC,YAAsB,KAAMF,uBAAqD,CAArD,QAAqD,cAAsB,SAA6HI,OAAuC,6EAEnkBC,aAAkC,iBAA2C,YAAgB1vG,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,mCAA+D,wBAAyD,4BAAqEw+F,WAA6DC,IAA1hB,GAIAC,IAFApH,OAMAC,IAFAD,MAMAE,IAFAF,OAMA2H,IAFA3H,OAMAuH,IAFAvH,OAIA,cAAwC,0BAAuCe,WAM/E,iBAAmD,MAAa,sFAAyF,2DAIzJ,sCAEAnoB,cAGA,kBAXA,iBAAmD,sBAA0C,yDAY7FkvB,UAEA,IAaA+Z,EAbAt6C,mEAEA,uCACA,oCACAu6C,0BACAC,mDACAx6C,aACA,MACAA,YADO,qCACPvX,4CAEAuX,oBAEA,2CAKAA,wCACAA,cACAA,cACA7+D,oDACA6+D,qCACA,GACA,2EACAA,WACA,GACAA,wDACAt6D,uCACAs6D,WAEA,GACAA,uDACA,mCACAy6C,UAIAz6C,SAHAy6C,KAIA,GACAz6C,IAxBAs6C,8DAyBA,CAEA,OApDA,iBAA4C,oCAA+D,0FAAuG7N,4CAAyEt9G,aAAe+Q,qDAA6EwsG,uEAKvXE,OA+CAnN,OACAr+F,iBACAlB,oBACA1R,kBACA,GACI,CACJ4S,aACAlB,kBACA,WAEA6gC,uCACA,2BACA,GACA,KAKA,IAJAA,aACA,sBACA3jC,gCAEA,wBACA,2EAEA,YADAyjG,qDAGA,4BAEA,YADAA,uDAGA,CAEAzjG,mBADA,sCACA,YACA,aACA,yBACA,4BACA,iCAEA8C,GADAw6G,6BAGAA,YAEA,MAEAx6G,GADA9C,oCAGAA,mCAEA+G,mBAEAu8F,gBAEA,mCAEAj3F,EADA01F,QACA,GAEA,uBACAuB,gCACWhI,yDAEX,KADAx4F,sBACA,OACAwgG,+EApHA,mBAA6C,eAAkBv/F,4BAAkCjB,oDAAgFoB,QAAoBA,EAoHrMsqG,IAAoI7qE,6BACpI,MACA2/D,2CAEAA,WACA,GAEAlyG,0BACA,GACI,CACJ4S,aACAlB,kBACA,iBAAwC1R,wBACxCA,kCACA,cACAuyC,OACA3jC,OAEA,yBACA,aACA,WACAu9G,eACa,WACbA,+CACa3oH,qBACb,WACA,qBACAkO,0BAEAy6G,0CACA,CACA,SACAv9G,WACAA,oBAEAu9G,aAEA,SACA,QACAv9G,wCACaA,yBAGb,kIACAA,iCACA,MACAA,0CAGA,EACA,KAGAi0E,EACA,CAhKA,CAgKE2uB,WAIF,oBACA,uCACA5iG,gCACAA,0BACA,UACAA,WAEAgT,gBACA,CAEA,kBACApe,uBACA4oH,SAEAA,uBACA,qCACAC,8BACAC,sBACA,sBACAC,YACS,CACT,wBACA76G,OACAlO,iBAWA,mBACA,uCACAoL,0BACA+J,sBACA,wCACA,MACAwzG,0BAEAA,sCAEAv9G,gBACA,GACAgT,gBACA,CAvBA4qG,QAEAD,SAEA,CACA,GACA3qG,gBACA,EACA,CAlCAihE,cAmDAA,YACAjhE,eACA6qG,UACAC,iBACA,YAEAzxG,4BACA,WACA,gBACA,6BACAtI,mCAEA,iDACAuqG,qBAEA,EACA,MACAl9G,iDAEA,EACAg6D,uBACA,mCACA,oBACAh6D,2DACS0R,iBACT1R,qDAEAA,wDACA,EACA2sH,mBACA,SACAj7G,8BAEA1R,mDACA,EACAgoH,oBACA,gCACA11E,0BACA01E,wBACA,yBACA,qBACA,6BACAhoH,sDACA,CACA,IAIAsvF,YACAA,gBAEA,EAEA,gBAEA,aAEA8Y,WACA/1E,OACA,SACAqiB,aACA58B,YACA80G,eAEAC,iBACAC,iBACApE,WACAgE,YACAzyC,WACA,mBACAv0D,YACAs0C,WACA,SACA+yD,WAEAC,OACAt4E,aACAu4E,WACAp1G,WACAC,aAEAo1G,cACAj1C,QACA,QACA,SAEA0wC,aACAhM,YACAqL,QACA,WACA,YAEA2E,WACApyC,MACA4yC,cACAC,aACAC,iBAEAhkB,QACA/mE,UACArP,aAEAq6F,aACA1E,iBACA2E,aAGA,EAEA,cAEAnlB,sMAEA,EAEA,cAEAA,uMAEA,EAEA,cAEAA,uMAEA,EAEA,cAEAA,uMAEA,EAEA,cAEAA,w7EAEA,EAEA,cAEAA,8TAEA,EAEA,cAEAA,yRAEA,EAEA,cAEAA,8UAEA,EAEA,cAEAA,+OAEA,EAEA,cAEAA,4PAEA,EAEA,cAEAA,2VAEA,EAEA,cAEAA,0VAEA,EAEA,cAEAA,6OAEA,EAEA,cAEAA,2OAEA,EAEA,cAEAA,kXAEA,EAEA,cAEAA,qZAEA,EAEA,cAEAA,k4CAEA,EAEA,cAEAA,2cAEA,EAEA,cAEAA,wTAEA,EAEA,cAEAA,wMAEA,EAEA,cAEAA,kPAEA,EAEA,cAEAA,iRAEA,EAEA,cAEAA,uQAEA,EAEA,cAEAA,uaAEA,EAEA,cAEAA,4sBAEA,EAEA,cAEAA,+VAEA,EAEA,cAEAA,qYAEA,EAEA,cAEAA,grBAEA,EAEA,cAEAA,yjBAEA,EAEA,cAEAA,qhBAEA,EAEA,cAEAA,wMAEA,EAEA,cAEAA,urBAEA,EAEA,gBAEA,aAEAz1F,sCACAjB,WAGA,+EAAsG,iBAAqB,YAAmB,qGAE9Iu/F,aAAkC,gBAA2C,YAAgB1vG,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAIAoc,EAEA,cAAwC,0BAAuCxiB,WAF/E8T,CAFA7U,QAQAwjB,aACA,cACA,YAJA,gBAAmD,qBAA0C,0DAM7F1b,SAEA/xG,cACAA,8CACAA,mBACAA,iCACAA,gEACAA,+CACAwxE,2CACA,GACAxxE,6DACA,CAEA,aACA4S,gBACAlB,kBACA,WAEApQ,iCACA,yCACA6qH,yBACA7qH,qDAEA6qH,eACA7qH,2CAEAA,sCACA4wG,kBACA,GACA5wG,CACA,GACI,CACJsR,iBACAlB,iBACA,qCACA,0CACA2a,sBACArsB,8BACAqsB,CACA,GACI,CACJzZ,mBACAlB,iBACA,WAEAa,iCACAA,qCACA,uDACA,qBACAA,iBACA45G,4BACAjP,eAEA,GACAl9G,6BACA,GACI,CACJ4S,kBACAlB,iBACA,WAEA,0DACA4rG,wCACA,GACAt9G,0CACAA,6BACAA,mBACA,GACI,CACJ4S,YACAlB,iBACA1R,8CACA,GACI,CACJ4S,iBACAlB,kBACA,8DAEAw6G,+CACA,WAEAA,mCAEA,UACA5qH,+BACAtB,mEACAsB,6BACAtB,mEAEAA,yCAEAsB,6BACAtB,mEAEAA,yCAEA0tH,KACA,4BACA1tH,uDACW,qDAEX,oCACA8xC,4BACA9xC,4BACA,CACAA,YACA,CACA,GACI,CACJ4S,aACAlB,iBACA,aACA,iCACA,6FACAy6G,iDACAnsH,kBACA,MACAA,sBAEA,iEACAA,0CACA,KAGAytH,CACA,CAjIA,GAmIAn+B,WAEA,EAEA,cAEA8Y,4KAEA,EAEA,gBAEA,aAEAz1F,sCACAjB,WAGA,kBAAkC,gBAA2C,YAAgBnQ,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,2CAA8D,eAA0B,+BAA4C,qBAAuB,EAA2B11B,SAA4C,eAA4B,eAA4B,YAAuB,uBAA4B,EAAoBmqG,WAc1c2P,cAGA,iBATA,gBAAmD,qBAA0C,yDAU7F5b,SAEA,MAVA,gBAAmD,MAAa,sFAAyF,uDAUzJoM,4DAEA,2BACA3sC,6CACA,uFACAlwE,6BACA,GACAkwE,CACA,CAEA,OAlBA,gBAA4C,kCAA+D,yFAAuGysC,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAeAnN,OACAr+F,gBACAlB,kBACA,iGACA,2DACApQ,CACA,GACI,CACJsR,iBACAlB,oBACA63B,8FACA,kDACA73B,sCACAk8G,IACA,mBACAA,iBAEAA,eAGA,KAGAD,CACA,CAxCA,CARA,cAAwC,0BAAuC3iB,WAF/E8T,CAFA7U,QAoDEe,SAEF1b,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAGA,kBAAkC,gBAA2C,YAAgBnQ,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAEA7nE,oBAAuD,iCAAkD,2CAA8D,eAA0B,+BAA4C,qBAAuB,EAA2B11B,SAA4C,eAA4B,eAA4B,YAAuB,uBAA4B,EAAoBmqG,WAc1c6P,cAGA,iBATA,gBAAmD,qBAA0C,yDAU7F9b,SAEA,MAVA,gBAAmD,MAAa,sFAAyF,uDAUzJoM,4DAEA,mDACA,4EACA78G,+CACA,GACAkwE,wDACAA,4BACAA,CACA,CAEA,OAnBA,gBAA4C,kCAA+D,yFAAuGysC,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAGvXE,MAgBAnN,OACAr+F,iBACAlB,oBACA63B,8FAEAvpC,sBADAsB,uBACAwsH,SACA,KAGAD,CACA,CA3BA,CARA,cAAwC,0BAAuC7iB,WAF/E8T,CAFA7U,QAuCEe,SAEF1b,WAEA,EAEA,cAEA,aAEA38E,sCACAjB,WAGA,iBAAkC,gBAA2C,YAAgBnQ,WAAkBA,KAAO,WAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,uBAAyD,2BAAqEw+F,UAA6DC,GAA1hB,GAIAljD,aACA,gBACA,YAJA,iBAAmD,qBAA0C,0DAM7F6jD,SAEA/xG,aACAA,sCACAA,uCACAA,8CACA,6DACAA,qDACAwxE,wDACAA,eACA,GACAxxE,WACA,CAEA,aACA4S,kBACAlB,iBACA1R,gEACAA,4CACAA,oHACA,GACI,CACJ4S,WACAlB,iBACA1R,oCACA,GACI,CACJ4S,eACAlB,kBACA,+CACAqG,qCACA/X,4BACAA,2BACA,mDACA+tH,oCACAC,IACA,yBAEAhuH,wBADAguH,mBACA,MAEAD,gBAEA/tH,wBADAguH,iBACA,MAEAhuH,mBACAguH,CACA,GACI,CACJp7G,WACAlB,iBACA1R,yCACAA,uCACA,KAGAkuD,CACA,CA5DA,GA8DAohC,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,iCAEA,2BAAuD,mCAAkD,6CAA8D,eAA0B,iCAA4C,sBAAuB,EAA2Bz7E,WAA4C,eAA4B,eAA4B,YAAuB,uBAA4B,EAAoBmqG,WAE1c/M,aAAkC,kBAA2C,YAAgB1vG,YAAkBA,KAAO,YAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,mCAA+D,yBAAyD,8BAAqEw+F,WAA6DC,IAA1hB,GAIAO,IAFA1H,OAMAqK,IAFArK,OAIAgkB,SAEAC,OAEAzc,QAIAwY,IAFAhgB,OAIA,cAAwC,0BAAuCe,WAE/E,iBAAmD,sBAA0C,yDAE7F,iBAAmD,MAAa,sFAAyF,2DAEzJ,iBAA4C,oCAA+D,0FAAuGiT,4CAAyEt9G,aAAe+Q,qDAA6EwsG,uEAEvX,kCAAsDjmC,UAAW,CAAIA,UAAW,eAEhFk2C,cAGA,kBACApc,WAEA,6DACAx/F,+BAGA,wEAEA,oDACAi/D,CACA,CAEA,OAfA4sC,QAeAnN,OACAr+F,oBACAlB,kBACA1R,oDACAA,2CACAA,mFACAA,kFACA,KAGAmuH,EACA,CA3BA,CA2BED,WAEFC,+BAAsDD,oBACtDna,SACAqa,SACA3B,UACAE,kBACAj7G,GAGA1R,gCAFAA,4BAIA,OAMA,mBAGA,kBACA+xG,WAEA,wEAEA,gEACA,0CACA,wBACAG,SAEAA,wBACAA,sBACAA,2CACA,6CACA,gBACAA,qCACW,CACX,oBACAh5F,2BACAiX,4CACAk+F,sCACAnc,aACA,CACA,MAASj4C,wDACTi4C,QAEA,GACAA,CACA,CAEA,OAhCAkM,QAgCAnN,OACAr+F,aACAlB,iBACA,WAEA63B,yFACAvpC,yEACAk9G,qCACA,GACAl9G,0DAEAw9F,sBACA,2CACA,8BACA,SACA0f,iCAEA,EAAU,EACV,EACA,GACI,CACJtqG,aACAlB,iBACA1R,WACA,GACI,CACJ4S,eACAlB,kBACA,mGACA48G,gDAEA,GADAA,uBACA,eACAA,8CACA,KAGAC,EACA,CAtEA,CAsEEN,eAEFM,iOAEAj/B,mBACAA,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAEA49E,+BAEA,kBAAkC,gBAA2C,aAAgB/tF,YAAkBA,MAAO,aAA2B2vG,gCAAwDA,mBAAgC,+BAAuDv+F,oCAA+D,wBAAyD,2BAAqEw+F,YAA6DC,GAA1hB,GAEA7nE,qBAAuD,iCAAkD,4CAA8D,gBAA0B,gCAA4C,sBAAuB,EAA2B11B,WAA4C,gBAA4B,gBAA4B,cAAuB,wBAA4B,EAAoBmqG,aAI1crM,KAFA1H,OAMAoH,KAFApH,OAMAqK,KAFArK,OAMAc,KAFAd,OAMA4H,KAFA5H,OAMAkgB,KAFAlgB,QAMAmgB,KAFAngB,QAMAigB,MAFAjgB,QAMAogB,MAFApgB,QAIA,eAAwC,0BAAuCe,WAE/E,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAEzJ,iBAA4C,kCAA+D,yFAAuGiT,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAEvX,sCAEAsQ,kWAEAC,2BAEAC,mBAEAC,8BAEAC,cAGA,iBACA7c,UAEA,uEAiBA,8CAfA,gBACA,mCACA,qDAEA,2HACAvgC,kBAEA,kBACAA,gCACAq9C,kCACAA,UAEA,EAEA,GAEAr9C,EACA,CAEA,OA1BA4sC,QA0BAnN,OACAr+F,gBACAlB,mBACA,mGACA,sBACA1R,uBAEAooG,EACA,GACI,CACJx1F,mBACAlB,sBACAo9G,yBACAjoC,8BACA2oB,kCACA,0BACAhyC,eACA,cACA,oBACAqpB,2CACa,wBACbA,wBACa,CACb,oBACA,uBACAA,wBAEA,CACA,EACA,EACA,GACI,CACJj0E,mBACAlB,sBACA,YAEA1R,iCACA,qCACA,yCACA+uH,QAEA,2BACW,8EACX,mEACA,yCACAA,8CAEA,wBACA,CACA,0CACAC,iCACAD,QACeC,mCACfD,QACeC,kCACfD,SAGA,kBAEA,GACA,kBACA7c,gCACA2c,WACA,EACA,EACA7uH,2FACA,KAGA4uH,CACA,CAlGA,CAkGE/c,WAEF+c,+BAAoD/c,oBACpDkC,SACAqa,SACA3B,UACAS,mBACAltH,wCACA,EACA28G,iBACA,WAEAsS,4DACA,WACAA,mCACAC,4BACAD,oGACAA,4BACAA,uCACA,oCACA,sBACAE,uBACA,gCACAjS,kFAA4HP,yBAAwBrI,wBACpJ2a,UACA,EACAE,4BACA,CACA,GACAnvH,+BAEAivH,SACA,EACA1B,iBACAvtH,sCACA,OAMA,kBAGA,iBACA+xG,UAEA,uEAEA,8DACAuL,YACAA,EACA,CAEA,OAZAc,QAYAnN,OACAr+F,aACAlB,iBACA,YAEA1R,qDACA+qG,6BACA0H,UACA3gE,qBACWi5D,+BACX0H,YACA3gE,oBAEA,EACA,GACI,CACJl/B,aACAlB,iBACA1R,WACA,GACI,CACJ4S,WACAlB,iBACA,qEACA09G,+DAEApvH,wCACAA,sCACA,SACAA,sBACS0T,2CACT1T,uBAEAA,qEACAA,sBACAA,mFACAA,sCACA,GACI,CACJ4S,mBACAlB,iBACA,iCACA1R,mBACAA,4BACA,GACI,CACJ4S,WACAlB,iBACA,0BACA,gDACA,OAEA,iCACA1R,gBACAA,8EACAA,iBAEAA,oBACAA,qDAEAA,6BACA,MACA,IACA,QAEA,gJACAwnG,GACA91F,0DACe81F,0DAEf91F,iDAEA,IACA,UAEA,mCACAwH,sBACA,WACAlZ,yFACA,iDACAA,uDAEAA,sDAMAA,sBACAA,WACA,KAGAqvH,CACA,CA3GA,CA2GEhF,YAEF,gBACA,8DAEA1xG,uBACA,wCACAjH,OACAy6G,uCAEAA,4BAEA6C,iBACA,EACA,CAEA1/B,gBACAA,WAEA,EAEA,gBAEA,aAEA38E,sCACAjB,WAGA,IAEA63B,qBAAuD,iCAAkD,4CAA8D,eAA0B,+BAA4C,qBAAuB,EAA2B11B,UAA4C,eAA4B,eAA4B,YAAuB,uBAA4B,EAAoBmqG,WAE1c/M,aAAkC,iBAA2C,YAAgB1vG,YAAkBA,KAAO,YAA2B2vG,8BAAwDA,kBAAgC,6BAAuDv+F,kCAA+D,wBAAyD,6BAAqEw+F,UAA6DC,GAA1hB,GAIAO,IAFA1H,OAMAqK,IAFArK,OAIAgkB,SAEAC,OAIA3E,IAFAtf,OAIAwH,QAIAwY,IAFAhgB,OAIA,cAAwC,0BAAuCe,WAE/E,gBAAmD,qBAA0C,yDAE7F,gBAAmD,MAAa,sFAAyF,uDAEzJ,iBAA4C,kCAA+D,yFAAuGiT,0CAAyEt9G,aAAe+Q,qDAA6EwsG,oEAEvX,SAA0BjmC,0BAAgC,uCAA+CsC,gBAAiB,CAAIA,gBAAgB,WAE9I+0C,eAGA,iBACAvd,UAEA,6DACAx/F,+BAGA,sEAEA,kDACAi/D,CACA,CAEA,OAfA4sC,QAeAnN,MACAr+F,oBACAlB,kBACA08G,qCACApuH,mFACAA,mFACAA,oDACAouH,uCACApuH,gCAA0C4S,qBAA0B,cACpEw7G,sCACA,EAEA,KAGAkB,CACA,CAhCA,CAgCEpB,WAEFoB,gCAAoDpB,oBACpDna,SACAqa,SACA3B,UACAE,iBACA,MACA,iCACA,iCACA,6BACA,qDACAyC,eAEApvH,yBACAuvH,cACA,MACAvvH,4BAEA,OAMA,mBAGA,iBACA+xG,UAEA,sEAEA,sDACAG,CACA,CAEA,OAXAkM,QAWAnN,MACAr+F,aACAlB,iBACA,WAEA63B,sFACAvpC,4EACAk9G,wCACAA,SAEAA,qCAEAprE,kBACA,GACA9xC,4EACA,oBACAk9G,iBACAA,wEACAA,aAEAprE,mBACAorE,QACA,GACAl9G,4DACA,WACA,kBACA,IACA+nH,EAtI8a,eAA2B,oBAA0B,SAAc,gCAA2C,OAAxf,iBAAiC,SAAenX,KAAeC,KAAgBC,SAAoB,IAAM,mCAA0CF,uBAA4CG,iBAAqBxvG,mBAAlCqvG,MAAmL,CAAjJ,MAAuC3D,GAAc4D,KAAWC,YAAsB,KAAMF,uBAAqD,CAArD,QAAqD,cAAsB,SAA6HI,OAAuC,4EAsInkBL,CADAuM,6CACA,GACAyP,OAGA,YACAzP,gCAHA6K,KAGA4E,YACA,mCAKA,OAJAzP,wBACAA,iCACAA,cACAA,0CAEA,CACA,aACAA,YAEAA,SACA,EACA,GACI,CACJtqG,WACAlB,iBACA63B,oFACAvpC,sCACA,KAGAwvH,CACA,CAnEA,CAmEEvB,eAEFuB,0OAEAlgC,YAEA,GAEA","names":["global","this","window","args","ticking","requestAnimFrame","fn","clearTimeout","timeout","delay","_alignStartEnd","_textX","constructor","_notify","numSteps","anims","forEach","chart","initial","currentStep","_refresh","me","_update","item","i","draw","items","remaining","_getAnims","running","listeners","complete","progress","charts","listen","add","has","start","stop","remove","hex","h1","h2","eq","HUE_RE","f","w","b","rgb","g","max","min","l","d","s","h","r","Array","map","x","Z","Y","X","W","V","U","A","T","S","B","C","D","R","Q","E","P","O","N","M","L","F","K","G","H","I","J","names","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","tmp","v","input","a","rgbParse","m","p1","p2","hwb2rgb","hsv2rgb","hsl2rgb","hueParse","ret","len","hexParse","names$1","keys","tkeys","ok","j","k","nk","unpacked","unpack","nameParse","valid","rgbString","b2n","hexString","isShort","hslString","mix","c2","w1","w2","c1","clone","alpha","clearer","greyscale","val","opaquer","negate","lighten","darken","saturate","desaturate","rotate","value","index_esm","parseFloat","toDimension","reverse","isObject","v0","v1","klen","target","sval","merge","ilen","options","merger","source","mergeIf","Object","key","idx","obj","pos","isFunction","setsEqual","overrides","descriptors","node","family","size","style","lineHeight","weight","mode","intersect","set","get","describe","override","route","targetScopeObject","privateName","writable","t","enumerable","valueOrDefault","_scriptable","_indexable","hover","_fallback","interaction","TAU","PITAU","INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","fraction","niceRange","sqrt","result","isNaN","p","e","distanceFromYCenter","radialDistanceFromCenter","angle","distance","angleToStart","angleToEnd","startToAngle","endToAngle","font","textWidth","gc","longest","cache","data","ctx","thing","isArray","nestedThing","halfWidth","save","rotation","radius","type","rad","cornerRadius","xOffset","yOffset","point","flip","stroke","opts","isNullOrUndef","line","left","right","top","bottom","yDecoration","y","rect","cmp","mid","hi","lo","_lookup","_rlookupByKey","end","values","array","configurable","arrayEvents","base","object","res","index","parent","valueInPixels","suffix","canvas","borderBox","paddings","borders","touches","offsetX","box","useOffsetPos","getCanvasPosition","width","height","margins","maxWidth","maxHeight","containerSize","containerStyle","containerBorder","containerPadding","getContainerSize","deviceHeight","deviceWidth","passive","matches","getRelativePosition$1","controller","metaset","iScale","range","metasets","binarySearch","element","handler","optimizedEvaluateItems","useY","deltaY","getDistanceMetricForAxis","minDistance","axis","rangeMethod","evaluateAllVisibleItems","intersectsItem","modes","getIntersectItems","getNearestItems","elements","dataset","getRelativePosition","useFinalPosition","nearest","getAxisItems","FONT_STYLE","objProps","read","prop","fallback","console","string","cacheable","info","minmax","maxPadding","layout","chartArea","updateMaxPadding","newHeight","widthChanged","heightChanged","same","margin","marginForPositions","horizontal","getMargins","updateDims","refit","changed","refitBoxes","defaults","padding","addBox","z","removeBox","configure","update","availableWidth","availableHeight","boxes","layoutBoxes","wrapBoxes","fullSize","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","buildLayoutBoxes","verticalBoxes","horizontalBoxes","each","wrap","params","outerWidth","outerHeight","vBoxMaxWidth","hBoxMaxHeight","setLayoutDims","fitBoxes","change","updatePos","handleMaxPadding","placeBoxes","acquireContext","releaseContext","addEventListener","removeEventListener","getDevicePixelRatio","getMaximumSize","isAttached","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","eventListenerOptions","observer","entries","added","listener","childList","container","dpr","oldDevicePixelRatio","drpListeningCharts","resize","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","proxy","native","fromNativeEvent","addListener","renderHeight","renderWidth","display","initCanvas","context","attach","detach","proxies","__proto__","BasePlatform","BasicPlatform","DomPlatform","elasticIn","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","atEdge","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","transparent","interpolators","boolean","factor","color","to","number","from","active","elapsed","remain","cancel","tick","duration","loop","wait","promises","easing","colors","properties","numbers","animation","show","animations","visible","hide","resolved","animatedProps","_animateOptions","$shared","resolveTargetOptions","anim","awaitAll","_createAnimations","props","date","cfg","animator","singleMode","datasetIndex","otherValue","isNumberFinite","stacks","meta","iAxis","vAxis","indexScale","valueScale","getStackKey","stack","cloneIfNotShared","cached","initialize","updateIndex","clearStacks","linkScales","chooseId","xid","yid","rid","indexAxis","iid","vid","getDataset","getMeta","getScaleForId","_getOtherScale","reset","_destroy","unlistenArrayEvents","_dataCheck","_data","adata","convertObjectDataToArray","listenArrayEvents","addElements","buildOrUpdateElements","stackChanged","updateStacks","config","scopeKeys","scopes","parse","_cachedMeta","sorted","prev","parsed","isNotInOrderComparedToPrev","_stacked","parsePrimitiveData","labels","singleScale","parseArrayData","xScale","parseObjectData","xAxisKey","getParsed","getDataElement","applyStack","updateRangeFromParsed","all","getMinMax","_parsed","otherScale","scale","getUserBounds","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","vScale","label","toClip","defaultClip","area","count","getStyle","getContext","dataIndex","raw","createDataContext","createDatasetContext","resolveDatasetElementOptions","resolveDataElementOptions","_resolveElementOptions","cacheKey","sharing","prefixes","elementType","_resolveAnimations","transition","getSharedOptions","includeOptions","updateElement","isDirectUpdateMode","updateSharedOptions","sharedOptions","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","_resyncElements","numData","_insertElements","arr","move","resetNewElements","updateElements","_removeElements","_parsing","_onDataPush","_onDataPop","_onDataShift","_onDataSplice","_onDataUnshift","DatasetController","tooltipPosition","hasValue","getProps","Element","formatter","intlCache","getNumberFormat","numeric","delta","maxTick","notation","calculateDelta","numDecimal","formatNumber","logarithmic","formatters","length","spacing","majorEnd","next","newTicks","offset","beginAtZero","bounds","grace","grid","lineWidth","drawBorder","drawOnChartArea","drawTicks","tickLength","tickWidth","tickColor","borderDash","borderDashOffset","borderWidth","title","text","ticks","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","callback","minor","major","align","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","offsetFromEdge","increment","validIndex","epsilon","lineValue","Math","reverseAlign","super","init","_userMin","_userMax","_suggestedMin","_suggestedMax","minDefined","maxDefined","getPadding","getTicks","getLabels","beforeLayout","beforeUpdate","tickOpts","sampleSize","ticksLimit","determineMaxTicks","majorIndices","getMajorIndices","numMajorIndices","first","last","skipMajors","getEvenSpacing","calculateSpacing","skip","samplingEnabled","startPixel","reversePixels","endPixel","afterUpdate","beforeSetDimensions","setDimensions","afterSetDimensions","_callHooks","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","beforeCalculateLabelRotation","calculateLabelRotation","numTicks","labelRotation","maxLabelWidth","maxLabelHeight","maxLabelDiagonal","afterCalculateLabelRotation","beforeFit","fit","minSize","isHorizontal","tickPadding","angleRadians","cos","sin","_calculatePadding","position","isRotated","labelsBelowTicks","offsetRight","paddingRight","paddingLeft","paddingBottom","paddingTop","_handleMargins","afterFit","isFullSize","_convertTicksToLabels","_getLabelSizes","_computeLabelSizes","widths","heights","widestLabelSize","highestLabelSize","tickFont","nestedLabel","gcLen","garbageCollect","highest","valueAt","widest","getLabelForValue","getPixelForValue","getValueForPixel","getPixelForTick","getPixelForDecimal","decimal","getDecimalForPixel","getBasePixel","getBaseValue","createTickContext","createScaleContext","_tickSize","optionTicks","rot","labelSizes","_isVisible","_computeGridLineItems","ticksLength","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","tx1","borderValue","ty1","ty2","y1","y2","tx2","x1","x2","lineColor","tickBorderDash","tickBorderDashOffset","alignedLineValue","_computeLabelItems","tickAndPadding","hTickAndPadding","textBaseline","textAlign","pixel","lineCount","strokeColor","strokeWidth","textOffset","optsAtIndex","backdrop","translation","_getXAxisLabelAlignment","toRadians","_getYAxisLabelAlignment","_computeLabelArea","drawBackground","backgroundColor","getLineWidthForValue","findIndex","drawGrid","drawLine","drawLabels","clipArea","renderText","unclipArea","drawTitle","titleX","titleY","titleArgs","_layers","tz","gz","getMatchingVisibleMetas","metas","axisID","_resolveTickFontOptions","_maxDigits","fontSize","defined","_cacheable","_scopes","_rootScopes","_getTarget","deleteProperty","_cached","createSubResolver","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","_proxy","_context","_subProxy","_stack","_descriptors","setContext","_resolveScriptable","_resolveArray","needsSubResolver","_resolveWithContext","scriptable","allKeys","indexable","isScriptable","isIndexable","allScopes","_createResolver","subGetTarget","resolveKeysFromAllScopes","getPoint","getValueAxis","current","d01","d12","s12","s01","fb","previous","pointsLen","deltaK","mK","pointAfter","pointBefore","pointCurrent","alphaK","betaK","squaredMagnitude","tauK","monotoneAdjust","vPixel","iPixel","valueAxis","monotoneCompute","points","splineCurveMonotone","controlPoints","inAreaNext","inAreaPrev","inArea","capBezierPoints","cp2","c","rectX","setWidth","xPlus","leftForLtr","getRightToLeftAdapter","original","between","compare","normalize","property","propertyFn","segment","getSegment","inside","subStart","prevValue","segments","sub","spanGaps","findStartAndEnd","splitByStyles","cur","solidSegments","styleChanged","prevStyle","doSplitByStyles","borderCapStyle","borderJoinStyle","borderColor","easingEffects","getHoverColor","noop","uid","isFinite","finiteOrDefault","toPercentage","_elementsEqual","_merger","_mergerIf","_deprecated","resolveObjectKey","_capitalize","toFontString","_measureText","_longestText","_alignPixel","clearCanvas","drawPoint","_isPointInArea","_steppedLineTo","_bezierCurveTo","addRoundedRectPath","_lookupByKey","_filterBetween","_arrayUnique","_attachContext","splineCurve","_updateBezierControlPoints","_getParentNode","retinaScale","supportsEventListenerOptions","readUsedSize","fontString","throttled","debounce","_toLeftRightCenter","_pointInLine","_steppedInterpolation","_bezierInterpolation","toLineHeight","_readValueToProps","toTRBL","toTRBLCorners","toPadding","toFont","resolve","_addGrace","PI","niceNum","_factorize","isNumber","almostEquals","almostWhole","_setMinAndMaxByKey","toDegrees","_decimalPlaces","getAngleFromPoint","distanceBetweenPoints","_angleDiff","_normalizeAngle","_angleBetween","_limitValue","_int16Range","getRtlAdapter","overrideTextDirection","restoreTextDirection","_boundSegment","_boundSegments","_computeSegments","isForType","register","proto","isIChartComponent","parentScope","id","scope","sourceName","sourceScope","parts","targetName","targetScope","routeDefaults","registerDefaults","unregister","addControllers","addPlugins","addScales","getController","getElement","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","_each","typedRegistry","_exec","registry","_getRegistryForType","_get","notify","plugin","invalidate","_createDescriptors","plugins","allPlugins","createDescriptors","_notifyStateChanges","diff","scaleOptions","axisFromPosition","scales","configScales","chartIndexAxis","firstIDs","defaultId","getDefaultScaleIDFromAxis","defaultScaleOptions","scaleConf","getAxisFromDefaultScaleID","mergeScaleConfig","datasets","keysCached","keyCache","initOptions","initConfig","clearCache","datasetScopeKeys","datasetType","datasetAnimationScopeKeys","datasetElementScopeKeys","pluginScopeKeys","_cachedScopes","_scopeCache","getOptionScopes","keyLists","mainScope","chartOptionScopes","resolveNamedOptions","resolver","getResolver","needContext","createResolver","resolverCache","subPrefixes","animationOptions","getChart","existingChart","instances","aspectRatio","maintainAspectRatio","_aspectRatio","_initialize","_initializePlatform","isDomSupported","clear","_resize","newSize","newRatio","ensureScalesHaveIDs","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","hasUpdated","layouts","_updateMetasets","numMeta","_removeUnreferencedMetasets","_metasets","buildOrUpdateControllers","newControllers","datasetElementType","dataElementType","_resetElements","newEvents","minPadding","animsDisabled","_updateLayout","cancelable","noArea","_updateDatasets","_updateDataset","render","onAnimationsComplete","layers","_getSortedDatasetMetas","_sortedMetasets","filterVisible","getSortedVisibleDatasetMetas","_drawDatasets","_drawDataset","clip","getElementsAtEventForMode","method","getDatasetMeta","hidden","xAxisID","yAxisID","order","_dataset","_sorted","getVisibleDatasetCount","isDatasetVisible","setDatasetVisibility","toggleDataVisibility","getDataVisibility","_updateDatasetVisibility","_destroyDatasetMeta","destroy","toBase64Image","bindEvents","bindUserEvents","platform","_add","bindResponsiveEvents","_remove","detached","attached","unbindEvents","updateHoverStyle","getActiveElements","setActiveElements","lastActive","notifyPlugins","_updateHoverStyles","hoverOptions","deactivated","activated","_eventHandler","event","eventFilter","_handleEvent","_active","lastEvent","replay","version","invalidatePlugins","formats","format","startOf","endOf","DateAdapter","_date","getAllScaleValues","curr","updateMinAndPrev","endValue","barEnd","barStart","parseFloatBar","entry","iAxisKey","vAxisKey","custom","ruler","firstOpts","vpixels","ipixels","enableBorderRadius","_getStacks","_type","stacked","_getStackCount","_getStackIndex","_getRuler","pixels","barThickness","stackCount","grouped","ratio","_calculateBarValuePixels","floating","head","center","_calculateBarIndexPixels","skipNull","maxBarThickness","chunk","computeFlexCategoryTraits","computeFitCategoryTraits","stackIndex","rects","BarController","categoryPercentage","barPercentage","_index_","_value_","_custom","BubbleController","tooltip","callbacks","_getRotation","_getCircumference","_getRotationExtents","circumference","arcs","maxSize","cutout","chartWeight","ratioX","ratioY","offsetY","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","getRatioAndOffset","maxRadius","outerRadius","radiusLength","_circumference","centerX","centerY","animateScale","innerRadius","startAngle","arc","calculateTotal","metaData","total","calculateCircumference","getMaxBorderWidth","getMaxOffset","_getRingWeightOffset","ringWeightOffset","_getRingWeight","_getVisibleDatasetWeightTotal","DoughnutController","animateRotate","legend","generateLabels","fillStyle","strokeStyle","onClick","dataLabel","animationsDisabled","pointCount","getStartAndCountOfVisiblePoints","newRanges","xmin","xmax","ymin","ymax","_scaleRanges","scaleRangesChanged","animated","maxGapLength","directUpdate","nullData","prevParsed","border","lastPoint","LineController","showLine","_updateRadius","animationOpts","datasetStartAngle","countVisibleElements","_computeAngle","PolarAreaController","angleLines","circular","pointLabels","PieController","_loop","_fullLoop","pointPosition","RadarController","fill","ScatterController","angleMargin","angleOffset","outerStart","toRadiusCorners","halfThickness","innerLimit","computeOuterLimit","outerEnd","innerStart","innerEnd","parseBorderRadius$1","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","inRange","getCenterPoint","halfAngle","halfRadius","radiusOffset","fullCircles","pathArc","drawArc","inner","clipArc","drawFullCircleBorders","paramsStart","pathVars","lineMethod","lineTo","getLineMethod","avgX","countX","drawX","truncX","prevX","lastY","pathSegment","ArcElement","borderAlign","borderRadius","updateControlPoints","interpolate","_interpolate","_getInterpolationMethod","interpolated","_getSegmentMethod","path","segmentMethod","usePath2D","setStyle","strokePathWithCache","strokePathDirect","el","LineElement","cubicInterpolationMode","stepped","tension","inXRange","inYRange","getRange","bar","half","edge","parseEdge","swap","skipY","skipX","getBarBounds","PointElement","hitRadius","hoverBorderWidth","hoverRadius","pointStyle","o","parseBorderWidth","maxR","enableBorder","topLeft","topRight","bottomLeft","bottomRight","parseBorderRadius","outer","boundingRects","addRectPath","hasRadius","BarElement","borderSkipped","cleanDecimatedDataset","algorithm","enabled","beforeElementsUpdate","cleanDecimatedData","decimated","getStartAndCountOfVisiblePointsSimplified","bucketWidth","avgY","avgRangeEnd","avgRangeLength","rangeTo","maxArea","pointAx","maxAreaPoint","nextA","lttbDecimation","xMin","dx","minIndex","maxIndex","intermediateIndex2","intermediateIndex1","minMaxDecimation","fillOption","parseFillOption","findPoint","postponed","linePoints","firstValue","lastValue","boundary","pointsFromSegments","sources","visited","interpolatedPoint","tpoints","fillSources","_segments","src","clipBounds","lineLoop","interpolatedLineTo","getLineByIndex","sourcePoints","linesBelow","isLineAndNotInHideAnimation","below","getLinesBelow","addPointsBelow","buildStackLine","getPointPositionForValue","computeCircularBoundary","computeLinearBoundary","computeBoundary","createBoundaryLine","getTarget","lineOpts","above","_clip","_fill","doFill","afterDatasetsUpdate","beforeDraw","drawfill","beforeDatasetsDraw","beforeDatasetDraw","propagate","drawTime","boxHeight","labelOpts","boxWidth","itemHeight","buildLabels","legendItems","labelFont","titleHeight","getBoxSize","_fitRows","hitboxes","lineWidths","totalHeight","row","_fitCols","columnSizes","heightLimit","currentColWidth","currentColHeight","col","totalWidth","adjustHitBoxes","legendHitBoxes","hitbox","_draw","defaultColor","rtlHelper","halfFontSize","cursor","xBoxLeft","drawLegendBox","strikethrough","fillText","titleOpts","titleFont","titlePadding","topPaddingPlusHalfFontSize","_computeTitleHeight","_getLegendItemAt","lh","hitBox","handleEvent","isListened","sameItem","itemsEqual","hoveredItem","_element","afterEvent","ci","legendItem","onHover","onLeave","usePointStyle","fontColor","lineCap","lineDash","lineDashOffset","lineJoin","_drawArgs","fontOpts","createTitle","defaultRoutes","average","nearestElement","str","formattedValue","body","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","widthPadding","xAlign","caret","doesNotFitWithAlign","determineYAlign","yAlign","caretSize","alignment","paddingAndSize","radiusAndPadding","alignX","alignY","tooltipItems","createTooltipContext","getTitle","beforeTitle","afterTitle","lines","getBeforeBody","getBody","bodyItems","before","after","scoped","pushOrConcat","getAfterBody","getFooter","beforeFooter","footer","afterFooter","_createItems","labelColors","labelPointStyles","labelTextColors","positionAndSize","backgroundPoint","opacity","caretX","caretY","drawCaret","getCaretPosition","tooltipPoint","y3","x3","ptX","pt","titleSpacing","_drawColorBox","labelPointStyle","colorX","rtlColorX","colorY","innerX","drawBody","bodySpacing","xLinePadding","fillLineOfText","bodyAlignForCalculation","bodyItem","textColor","displayColors","bodyLineHeight","drawFooter","tooltipSize","_updateAnimationTarget","animX","animY","positionChanged","_positionChanged","Tooltip","Decimation","Filler","Legend","Title","positioners","afterInit","_chart","afterDraw","external","titleColor","titleMarginBottom","titleAlign","bodyColor","bodyAlign","footerColor","footerSpacing","footerMarginTop","footerAlign","caretPadding","multiKeyBackground","labelCount","beforeBody","beforeLabel","labelColor","tooltipItem","labelTextColor","afterLabel","afterBody","additionalOptionScopes","addIfString","findOrAddLabel","CategoryScale","handleTickRangeOptions","setMax","maxSign","minSign","setMin","getTickLimit","maxTicks","maxTicksLimit","computeTickLimit","generationOptions","unit","maxSpaces","dataRange","countDefined","minSpacing","numSpaces","niceMin","niceMax","includeBounds","generateTicks$1","precision","step","maxDigits","tickVal","LinearScale","exp","endSignificand","significand","generateTicks","NaN","LogarithmicScale","LinearScaleBase","furthestAngles","valueCount","textSize","hLimits","vLimits","furthestLimits","tickBackdropHeight","outerDistance","pointLabelPosition","adjustPointPositionForLabelHeight","fitWithPointLabels","_setReductions","radiusReductionRight","radiusReductionTop","radiusReductionBottom","radiusReductionLeft","setCenterPoint","maxTop","maxBottom","leftMovement","getIndexAngle","getDistanceFromCenterForValue","getValueForDistanceFromCenter","scaledDistance","getPointPosition","getBasePosition","getPointLabelPosition","pathRadiusLine","plFont","drawPointLabels","gridLineOpts","drawRadiusLine","RadialLinearScale","animate","millisecond","common","second","minute","hour","day","week","month","quarter","year","UNITS","parser","adapter","round","timestamps","setMajorTicks","isoWeekday","_applyBounds","_getLabelBounds","timeOpts","determineUnitForAutoTicks","determineUnitForFormatting","determineMajorUnit","ticksFromTimestamps","initOffsets","_generate","stepSize","weekday","hasWeekday","time","addTick","_adapter","_tickFormatFunction","majorUnit","majorFormat","getDecimalForValue","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","_getLabelCapacity","displayFormats","exampleLabel","capacity","getDataTimestamps","getLabelTimestamps","prevSource","nextSource","prevTarget","nextTarget","TimeScale","adapters","minUnit","buildLookupTable","_getTimestampsForTable","TimeSeriesScale","Chart","helpers","factory","className","colSpan","rowSpan","containerTagHash","applyStyle","elementPropHash","appendToElement","html","htmlToNodeList","childNodes","newEls","afterEl","htmlToElements","content","closestMethod","containers","allMatches","applyStyleProp","borderLeft","borderRight","borderTop","borderBottom","scrollbarLeftRight","scrollbarBottom","sanitizeScrollbarWidth","scrollbarLeft","scrollbarRight","isRtlScrollbarOnLeft","overflow","direction","document","outerEl","getBoundingClientRect","computeIsRtlScrollbarOnLeft","getIsRtlScrollbarOnLeft","goWithinPadding","edges","parseInt","parents","ev","matchedChild","DAY_IDS","arrayToUtcDate","m1day","years","months","days","milliseconds","dayStart","fwd","PARSE_RE","parseString","normalizeObject","d0","dur","dontReturnWeeks","els","token","specs","tokens","field","func","fieldSpec","flexibleCompare","String","functions","_i","timestamp","later","refined","processor","rawProps","leftoverProps","addDays","nextDayThreshold","endDay","endTimeMS","startDay","createDuration","diffDayAndTime","extendStatics","__assign","markers","recurringTypes","expand","name","complexObjs","dest","filtered","newHash","hash","a_1","eventStore","defs","tuple","rawEvents_1","sourceId","eventTupleToStore","calendar","instance","newStore","isEventDefsGrouped","refinedEvents","refinedEvent","store0","dateRange","invertedRanges","ranges","newRange","range1","cachedRes","separator","omitZeroMinute","meridiem","omitCommas","STANDARD_DATE_PROP_SEVERITIES","timeZoneName","era","MERIDIEM_RE","COMMA_RE","MULTI_SPACE_RE","LTR_RE","UTC_RE","NativeFormatter","extendedSettings","severity","name_1","standardDateProps","diffSeverity","ca","timeAsMs","computeMarkerDiffSeverity","biggestUnitForPartial","full1","name_2","partialOptions","computePartialFormattingOptions","partialFormattingFunc","partial0","partial1","insertion","i0","after0","i1","after1","findCommonInsertion","full0","locale","formatWeekNumber","sanitizeSettings","zeroFormat","normalFormat","zeroProps","tzoStr","replaced","injectTzoStr","formatTimeZoneOffset","trim","postProcess","buildNativeFormattingFunc","CmdFormatter","FuncFormatter","doIso","abs","hours","mins","timeZone","localeCodes","marker","timeZoneOffset","EventSourceApi","sourceIds","EventApi","standardProps","_a","ui","startEditable","_b","extendedProps","startDelta","endDelta","diffDates","dateEnv","hasEnd","allDay","instanceRange","maintainDuration","forcedStartTzo","forcedEndTzo","forcedTzo","instanceId","mutation","fromApi","defId","inverseBgByDefId","defByGroupId","bgRanges","fgRanges","eventUis","def","rendering","inverseBgByGroupId","origRange","normalRange","computeVisibleDayRange","slicedRange","isStart","isEnd","invertRanges","framingRange","invertedRanges_1","invertedRanges_2","bg","view","segs","isMirror","seg","setElSeg","uis","eventUiBases","combineEventUis","eventConfigs","eventConfig","willDeltasAffectDuration","eventDef","copy","applier","appliers_1","Boolean","durationsEqual","forceAllDay","clearEnd","eventInstance","fetchId","sourceEachTransform","rawEvents","calEachTransform","transformRawEvents","subset","mergeEventStores","receiveRawEvents","addEvent","dateProfile","expandRecurring","rezoneDates","relevant","durationEditable","constraints","overlap","allows","classNames","applyMutationToRelated","eventDrag","businessHours","dateSelection","newProps","dateSpanMeta","state","subjectEventStore","subjectDefs","subjectInstances","subjectConfigs","filterConfig","otherDefs","otherInstances","otherConfigs","subjectRange","subjectConfig","subjectDef","overlapFunc","eventApi","subjectAllow","subjectDateSpan","origDef","isInteractionPropsValid","relevantDefs","relevantInstances","selection","selectionRange","selectionConfig","allConstraintsPass","fullDateSpan","isDateSelectionPropsValid","constraints_1","otherEventStore","businessHoursUnexpanded","eventStoreToRanges","outerRanges_1","innerRange","replace","statements","editable","constraint","allow","leftovers","parseEvents","normalizeConstraint","wasFound","rawUnscoped","groupId","url","DATE_PROPS","allDayDefault","computeIsAllDayDefault","leftovers0","recurringRes","typeData","typeId","parseRecurring","recurringDef","leftovers1","singleRes","startMeta","endMeta","pluckDateProps","startMarker","endMarker","allowOpenRange","parseSingle","createEventInstance","preLeftovers","pluckNonDateProps","newLeftovers","eventDefParser","startTime","endTime","daysOfWeek","DEF_DEFAULTS","refineInputs","dependencies","thisContext","prevArgs","dependents","dependents_1","unrender","unrenderFunc","renderFunc","dependencies_1","depth","val0","a0","isArraysSimilar","isObjectsSimilar","obj0","Splitter","keyInfos","defKeys","dateSelections","individualUi","eventStores","eventDrags","eventResizes","splitProps","eventSelection","eventResize","dateSpans","keys_1","dateSpan","splitStores","splitHashes","mutatedKeysByDefId","mutatedStores_1","populate","splitStates","affectedEvents","mutatedEvents","isEvent","origSeg","allUi","baseParts","eventUiForKey","stuff","forceOff","finalOptions","gotoOptions","component","formatIso","omitTime","innerHtml","attrs","attrsToStr","todayStart","todayEnd","classes","wrappedSuccess","isResolved","success","wrappedFailure","failure","Mixin","destObj","destClass","EmitterMixin","__extends","removeFromHash","applyAll","push","originClientRect","PositionCache","lefts","rights","tops","bottoms","ScrollController","ElementScrollController","_this","WindowScrollController","ScrollComponent","removeElement","overflowX","overflowY","scrollbarWidths","Theme","buttonName","iconClassesCopy","iconOverrideHash","Component","isView","anyChanges","equalityFuncs","comboProps","recycleProps","DateComponent","_super","rangeContainsRange","isDateSelectionValid","publiclyTrigger","publiclyTriggerAfterSizing","hasPublicHandlers","eventRange","elementClosest","deps","reducers","eventDefParsers","eventDragMutationMassagers","eventDefMutationAppliers","dateSelectionTransformers","datePointTransforms","dateSpanTransforms","views","viewPropsTransformers","isPropsValid","externalDefTransforms","eventResizeJoinTransforms","viewContainerModifiers","eventDropTransformers","componentInteractions","calendarInteractions","themeClasses","eventSourceDefs","cmdFormatter","namedTimeZonedImpl","defaultView","elementDraggingImpl","optionChangeHandlers","hooks0","combineHooks","PluginSystem","ArrayEventSourcePlugin","ignoreRange","parseMeta","fetch","FuncEventSourcePlugin","unpromisify","arg","bind","startStr","endStr","encodeParams","injectQueryStringParams","xhr","successCallback","failureCallback","JsonFeedEventSourcePlugin","extraParams","startParam","endParam","timeZoneParam","requestParams","customRequestParams","buildRequestParams","requestJson","message","SimpleRecurrencePlugin","startRecur","endRecur","anyValid","allDayGuess","subtractDurations","dowHash","dayMarker","instanceStarts","instanceStart","expandRanges","DefaultOptionChangeHandlers","events","handleEventSources","eventSources","unfoundSources","newInputs","inputFound","unfoundSources_1","newInputs_1","globalDefaults","defaultRangeSeparator","titleRangeSeparator","defaultTimedEventDuration","defaultAllDayEventDuration","forceEventDuration","columnHeader","header","weekends","weekNumbers","weekNumberCalculation","scrollTime","minTime","maxTime","showNonCurrentDates","lazyFetching","locales","timeGridEventMinHeight","themeSystem","dragRevertDuration","dragScroll","allDayMaintainDuration","unselectAuto","dropAccept","eventOrder","eventLimit","eventLimitClick","dayPopoverFormat","handleWindowResize","windowResizeDelay","longPressDelay","eventDragMinDistance","rtlDefaults","buttonIcons","prevYear","nextYear","complexOptions","INTERNAL_PLUGINS","RAW_EN_LOCALE","code","dow","doy","dir","buttonText","today","list","weekLabel","allDayText","eventLimitText","noEventsMessage","defaultCode","globalArray","globalObject","allRawLocales","hashValuesToArray","explicitRawLocales","rawLocaleMap","en","queryRawLocale","queryLocale","parseLocale","merged","codeArg","codes","simpleNumberFormat","OptionsManager","available","localeDefaults","dirDefaults","firstDefined","mergeOptions","calendarSystemClassMap","registerCalendarSystem","GregorianCalendarSystem","ISO_TZO_RE","isTimeUnspecified","isNamedTimeZone","settings","createCalendarSystem","DateEnv","calendarSystem","n","diffHours","isInt","diffMinutes","diffSeconds","asRoughYears","asRoughMonths","m1","startOfDay","startOfHour","startOfMinute","startOfSecond","weekOfYear","dateOptions","extraOptions","stripZeroTime","buildIsoString","arrayToLocalDate","SIMPLE_SOURCE_PROPS","eventDataTransform","uid$2","eventSource","fetchRange","isSourceDirty","nextSources","sourceIdHash","fetchSource","calSuccessRes","sourceSuccessRes","calSuccess","callFailure","error","isFetching","prevDate","currentDateProfile","DateProfileGenerator","nextDate","currentInfo","isRangeAllDay","renderRange","activeRange","isValid","forceToValid","validRange","currentDate","constrainMarkerToRange","currentRange","currentRangeUnit","dateIncrement","dayCount","viewSpec","asRoughDays","dateIncrementInput","dateIncrementDuration","asRoughMs","greatestDurationDenominator","computeRes","customAlignment","runningCount","visibleRange","toDate","otherArgs","hiddenDays","isHiddenDayHash","dayCnt","inc","isExclusive","viewType","action","currentViewType","reduceViewType","newDateProfile","rangeContainsMarker","rangesEqual","isDateProfilesEqual","reduceDateProfile","eventSourceHash","addSources","removeSource","fetchDirtySources","arrayToHash","excludeStaticSources","sourceHash","receiveResponse","reduceEventSources","nextState","newDate","cnt","overrideConfig","queryProp","theClass","superType","findViewNameBySubclass","class","superDef","defaultConfig","buildViewDef","viewDef","Toolbar","theme","optionsManager","viewSpecs","sectionEl","calendarCustomButtons","calendarButtonTextOverrides","calendarButtonText","buttonStr","groupEl","groupChildren","isOnlyButtons","buttonGroupStr","buttonClick","buttonIcon","buttonInnerHtml","buttonClasses","buttonEl","buttonAriaAttr","customButtonProps","findElements","titleEl","CalendarComponent","prependToElement","modifyViewContainer","dirClassName","themeClassName","bool","classList","footerLayout","now","todayInfo","prevInfo","nextInfo","toolbarProps","activeButton","isTodayEnabled","isPrevEnabled","isNextEnabled","headerLayout","viewProps","transformers_1","transform","isResize","heightInput","contentHeightInput","computeTitleFormat","isEndExclusive","Interaction","interactionSettingsStore","EventClicking","jsEvent","EventHovering","getElSeg","segEl","currentMatchedChild","onMouseEnter","onMouseLeave","listenToHoverBySelector","StandardTheme","widget","widgetHeader","widgetContent","buttonGroup","button","buttonActive","popoverHeader","popoverContent","headerRow","dayRow","listView","close","pluginDefs","refinePluginDefs","pluginDefs_1","Calendar","dateMarker","customAction","singleRawSource","rawSources","rawSources_1","loadingLevel","eventSourceLoadingLevel","oldState","needsFull","savedScroll","eventUiSingleBase","eventUiBySource","changeHandlers","oldOptions","oldNormalOptions","normalOptions","specialOptions","anyKeysRemoved","isValuesSimilar","computeChangedProps","oldDateEnv","isTimeZoneDirty","isSizeDirty","anyDifficultOptions","pluginHooks","overrideConfigs","viewDefs","ensureViewDef","compileViewDefs","durationUnit","singleUnit","singleUnitOverrides","buttonTextKey","buttonTextMap","buttonTextOverride","queryButtonText","buttonTextDefault","buildViewSpec","buildViewSpecs","rawOpts","eventEditable","processScopedUiProps","optHandler","afterSizingTriggers","dateOrRange","spec","viewTypes","useEventCenter","parseInteractionSettings","interactions","concat","parseOpenDateSpan","parseDateSpan","dateOrObj","dateStr","buildDatePointApi","buildDateSpanApi","eventInput","eventApis","sourceApis","sourceInput","namedTimeZoneImpl","firstDay","calendarOptions","parentEl","View","isDateInit","clearInterval","scroll","FgEventRenderer","displayEventTime","displayEventEnd","isResizable","mirrorInfo","displayEnd","objs","force","FillRenderer","renderedSegs","containerEls","css","ElementDragging","create","DRAG_META_DEFAULTS","isDateValid","htmlEscape","datesRepDistinctDays","getDayClasses","colspan","otherAttrs","buildGotoAnchorHtml","DayHeader","colHeadFormat","computeFallbackHeaderFormat","dates_1","DaySeries","indices","dates","dayIndex","dateProfileGenerator","lastIndex","clippedFirstIndex","clippedLastIndex","firstIndex","dayOffset","DayTable","daysPerRow","rowCnt","rows","cells","seriesSeg","nextIndex","firstCol","lastCol","Slicer","extraArgs","eventSegs","dateSelectionSegs","businessHourSegs","fgEventSegs","bgEventSegs","fg","affectedInstances","sourceSeg","eventRanges_1","exports","borderLeftWidth","marginLeft","borderRightWidth","marginRight","computeViewportRect","reduce","minOffset2","flexEls","flexOffsets","flexHeights","usedHeight","undistributeHeight","naturalOffset","shouldRedistribute","minOffset1","minOffset","selector","dateMeta","padStart","refEl","span0","isSpanPropsEqual","innerWidth_1","maxInnerWidth","removeCnt","resetStyleProps","transitionEventNames","numerator","DayGridDateProfileGenerator","endOfWeek","valueOf","core","Popover","elDims","origin","clippingRect","SimpleDayGridEventRenderer","timeText","titleHtml","eventUi","isResizableFromStart","isResizableFromEnd","skinCss","timeHtml","DayGridEventRenderer","rowNode","rowStruct","rowStructs","segRows","levelSegs","tr","td","dayGrid","colCnt","segLevels","levelCnt","tbody","segMatrix","cellMatrix","loneCellMatrix","rightCol","emptyCellsUntil","leftCol","introHtml","tbodyEl","levels","isDaySegCollision","otherSeg","DayGridMirrorRenderer","skeletonTopEl","skeletonTop","skeletonEl","DayGridFillRenderer","trEl","startCol","isRtl","endCol","getElementsByTagName","DayTile","eventRenderer","renderFrame","dayEl","layer","DayTileEventRenderer","segs_1","segs_2","DayBgRow","WEEK_NUM_FORMAT","DayGrid","fillRenderer","fgSegs","eventDragInstances","eventResizeInstances","isRigid","bgRow","renderIntroHtml","htmls","weekCalcFirstDow","isDayNumberVisible","unshift","mirrorRenderer","relativeRect","isResizing","rowLevelLimit","levelLimit","rowBottom","trEls","limitedNodes","segsBelow","totalSegsBelow","colSegsBelow","segMoreNodes","moreTd","moreWrap","moreLink","moreNodes","limitedEl","moreEl","allSegs","reslicedAllSegs","reslicedHiddenSegs","clickOption","hiddenSegs","topEl","_col","getClass","autoHide","dayRange","dayDate","newSegs","opt","level","WEEK_NUM_FORMAT$1","DayGridView","weekStart","dayGridContainerEl","cellWeekNumbersVisible","dayGridEl","renderNumberIntroHtml","renderBgIntroHtml","colWeekNumbersVisible","scrollerHeight","headRowEl","isAuto","SimpleDayGrid","DayGridSlicer","DayGridView$1","dayTable","dayGridDay","dayGridWeek","weeks","dayGridMonth","monthMode","fixedWeekCount","TimeGridEventRenderer","segsByCol","timeGrid","fullTimeText","startTimeText","unzonedEnd","level0","computeSlotSegCollisions","buildSlotSegLevels","forwardSegs","computeForwardSlotSegs","computeSlotSegPressures","seriesBackwardPressure","shouldOverlap","backwardCoord","forwardCoord","forwardSeg","forwardPressure","results","isSlotSegCollision","TimeGridMirrorRenderer","TimeGridFillRenderer","AGENDA_STOCK_SUB_DURATIONS","minutes","seconds","TimeGrid","snapsPerSlot","slotDuration","snapDuration","labelInterval","slotsPerLabel","slotDate","isLabeled","axisHtml","slotTime","slotIterator","nodes","lineEl","arrowEl","startOfDayDate","slatIndex","slatRemainder","slatCoverage","eventMinHeight","colIndex","slatHeight","localSnapIndex","positionTop","isDragging","isSelecting","AllDaySplitter","timed","WEEK_HEADER_FORMAT","TimeGridView","weekText","timeGridWrapEl","noScrollRowEls","SimpleTimeGrid","dayRanges","TimeGridSlicer","segRange","TimeGridView$1","allDaySlot","slotEventOverlap","timeGridDay","timeGridWeek","listenerCnt","isWindowTouchMoveCancelled","PointerDragging","isPrimaryMouseButton","ignoreMouseDepth","setTimeout","startIgnoringMouse","pageY","origEvent","isTouch","subjectEl","pageX","deltaX","containerEl","listenerCreated","listenerDestroyed","downEl","isFirst","ElementMirror","done","needsRevertAnimation","finalSourceElRect","mirrorEl","revertDuration","zIndex","visibility","boxSizing","ScrollGeomCache","ElementScrollGeomCache","WindowScrollGeomCache","getTime","AutoScroller","pointerScreenY","yDelta","xDelta","requestAnimationFrame","edgeThreshold","invDistance","velocity","scrollCache","bestSide","leftDist","rightDist","topDist","bottomDist","FeaturefulElementDragging","pointer","OffsetTracker","dragging","subjectRect","origPoint","adjustedPoint","slicedSubjectRect","HitDragging","forceHandle","offsetTrackers","bestHit","offsetTracker","originTop","positionLeft","origRect","hit","wasTouchScroll","initialHit","hitDragging","DateClicking","DateSelecting","canSelect","getComponentTouchDelay","dragSelection","isInvalid","dateSpan1","ms","dateSpan0","dateSelectionTransformers_1","hit0","joinHitsIntoSelection","isFinal","EventDragging","initialCalendar","subjectSeg","eventInstanceId","getComponentTouchDelay$1","receivingCalendar","mutatedRelevantEvents","receivingComponent","date0","date1","massager","massagers_1","computeEventMutation","isHitsEqual","initialView","relevantEvents_1","finalHit","initialCalendar_1","eventDropArg","oldEvent","revert","draggedEl","dropArg","prevCalendar","nextCalendar","EventDragging$1","relevantEvents","hit1","transforms_1","computeMutation","prevEvent","UnselectAuto","selectInfo","unselectCancel","documentPointer","ExternalElementDragging","droppableEvent","defProps","dragMeta","computeEventForDateSpan","finalView","pev","prefix","getEmbeddedElData","JSON","getDragMetaFromEl","ExternalDraggable","InferredElementDragging","ThirdPartyDraggable","containerOrSettings","main","WorkerGlobalScope","self","Prism","uniqueId","_","manual","disableWorkerMessageHandler","util","encode","objId","languages","extend","lang","insertBefore","root","insert","grammar","DFS","highlightAll","highlightAllUnder","highlightElement","language","nodeName","env","async","worker","immediateClose","highlight","Token","matchGrammar","patterns","lookbehind","greedy","lookbehindLength","alias","pattern","match","delNum","oneshot","tokenize","rest","strarr","hooks","run","join","tag","attributes","_self","module","comment","prolog","doctype","cdata","punctuation","namespace","entity","atrule","rule","important","function","keyword","operator","regex","constant","interpolation","script","js","py","rb","ps1","psm1","sh","bat","tex","pre","define","loaded","__webpack_require__","_parchment2","_quill2","_block","_block2","_break2","_container2","_cursor2","_embed2","_inline2","_scroll2","_text2","_clipboard2","_history2","_keyboard2","default","format_1","leaf_1","scroll_1","inline_1","block_1","embed_1","text_1","attributor_1","class_1","style_1","store_1","Registry","Parchment","Scope","find","query","Container","Format","Leaf","Embed","Scroll","Block","Inline","Text","Attributor","Attribute","Class","Style","Store","linked_list_1","shadow_1","ContainerBlot","err","child","descendants","lengthLeft","childBlot","targetParent","inclusive","addedNodes","mutations","removedNodes","blot","sort","refBlot","LinkedList","refNode","curNode","curIndex","memo","ShadowBlot","parent_1","ref","parentBlot","replacement","wrapper","ParchmentError","Error","tags","types","bubble","Definitions","Definition","tagNames","container_1","FormatBlot","domNode","AttributorStore","attribute","styles","attr","split","ClassAttributor","slice","StyleAttributor","LeafBlot","OBSERVER_CONFIG","characterData","characterDataOldValue","subtree","ScrollBlot","records","mark","markParent","optimize","InlineBlot","isEqual","BlockBlot","EmbedBlot","TextBlot","_slicedToArray","_n","_d","_e","_arr","sliceIterator","_createClass","descriptor","staticProps","Constructor","_quillDelta2","_editor2","_emitter4","_module2","_selection","_selection2","_extend2","_logger2","_theme2","Quill","_classCallCheck","emitter","whitelist","_this2","modify","limit","debug","overwrite","_overload","_overload2","_this5","_overload3","_overload4","_this6","_overload5","_overload6","_overload7","_overload8","_overload9","_overload10","_this8","_overload11","_overload12","_overload13","_overload14","deleted","applied","lastOp","_this10","_overload16","_this11","userConfig","modules","clipboard","keyboard","history","moduleConfig","themeConfig","oldDelta","_emitter2","_emitter","_map2","_map4","placeholder","readOnly","scrollingContainer","strict","parchment","_toggle","elem","DOMTokenList","searchString","thisArg","equal","op","NULL_CHARACTER","Delta","ops","newOp","delete","retain","predicate","iter","nextOp","thisIter","otherIter","thisOp","otherOp","diffResult","opLength","newline","priority","nextType","text1","cursor_pos","commonprefix","commonlength","text2","diffs","shorttext","longtext","best_longtext_a","seed","best_common","suffixLength","best_longtext_b","best_shorttext_a","best_shorttext_b","hm","text1_a","hm1","hm2","text1_b","text2_a","text2_b","diff_halfMatch_","mid_common","diffs_a","diffs_b","text1_length","text2_length","max_d","v_offset","v_length","v2","front","k1start","k1end","k2start","k2end","k1","k2_offset","k2","k1_offset","diff_bisect_","diff_compute_","commonsuffix","diff_cleanupMerge","d_left","d_right","current_pos","cursor_normalize_diff","ndiffs","cursor_pointer","d_next","merge_tuples","fix_cursor","text2a","text1b","text2b","diffsb","pointermin","pointermax","pointermid","pointerstart","pointerend","count_delete","count_insert","text_delete","text_insert","DIFF_DELETE","changes","right_d","left_d","objectKeys","isArguments","deepEqual","actual","isUndefinedOrNull","isBuffer","kb","ka","objEquiv","shim","supported","toStr","isPlainObject","hasOwnConstructor","hasIsPrototypeOf","deep","copyIsArray","lib","compose","keepNull","iterator","Iterator","retOp","_op2","_code2","_clone2","_deepEqual2","consumeNextNewline","image","normalizeDelta","_scroll$line2","_line$descendant2","scrollLength","lengthRemaining","codeLength","_this3","leaves","_defineProperty","embed","_this4","_scroll$line3","_scroll$line4","textBlot","oldValue","oldText","newText","cursorIndex","Editor","combined","getter","subClass","superClass","_possibleConstructorReturn","_inherits","Code","isolateLength","_descendant4","insertAt","CodeBlock","BlockEmbed","block","bubbleFormats","Break","_interopRequireDefault","otherIndex","selfIndex","restoreText","Cursor","_eventemitter2","Emitter","EDITOR_CHANGE","SCROLL_BEFORE_UPDATE","SCROLL_OPTIMIZE","SCROLL_UPDATE","SELECTION_CHANGE","TEXT_CHANGE","API","SILENT","USER","Events","EventEmitter","ee","evt","once","_key","logger","nativeSet","nativePromise","nativeMap","prototype","includeNonEnumerable","allChildren","useBuffer","reject","allParents","keyIterator","valueChild","symbols","allPropertyNames","propertyName","_clone","re","flags","Module","arr2","Range","Selection","_scroll$leaf","_scroll$leaf2","leaf","_leaf$position2","_scroll$leaf4","_leaf$position4","side","contains","positions","_line","endOffset","indexes","_scroll$leaf5","_scroll$leaf6","_leaf$position5","_leaf$position6","nativeRange","oldRange","_getRange","_getRange2","descendant","_line2","_line3","getLines","isLine","_align","_background","_color","_direction","_font","_size","DOM_KEY","CLIPBOARD_CONFIG","ATTRIBUTE_ATTRIBUTORS","STYLE_ATTRIBUTORS","Clipboard","_toConsumableArray","_prepareMatching2","scrollTop","elementMatchers","textMatchers","matcher","Node","endText","childrenDelta","attrName","matchers","AlignAttribute","AlignClass","AlignStyle","BackgroundClass","BackgroundStyle","ColorAttributor","ColorClass","ColorStyle","DirectionAttribute","DirectionClass","DirectionStyle","FontClass","FontStyleAttributor","FontStyle","SizeClass","SizeStyle","eventName","undo","undoDelta","changeDelta","redo","History","changeIndex","endsWithNewlineChange","maxStack","userOnly","SHORTKEY","Keyboard","handleEnter","collapsed","handleBackspace","handleDelete","handleDeleteRange","binding","shortKey","bindings","_quill$scroll$line2","_quill$scroll$leaf","_quill$scroll$leaf2","leafStart","offsetStart","_ref","_ref2","leafEnd","offsetEnd","prefixText","suffixText","curContext","empty","_quill$scroll$line6","prevFormats","lineFormats","shiftKey","_quill$scroll$descend","_quill$scroll$descend2","indent","BACKSPACE","TAB","ENTER","ESCAPE","LEFT","UP","RIGHT","DOWN","DELETE","bold","italic","underline","outdent","tab","_core2","_indent","_blockquote2","_header2","_list","_list2","_bold2","_italic2","_link2","_script2","_strike2","_underline2","_image2","_video2","_code","_formula2","_syntax2","_toolbar2","_icons2","_picker2","_colorPicker2","_iconPicker2","_tooltip2","_bubble2","_snow2","IdentAttributor","IndentClass","Blockquote","Header","ListItem","List","Bold","Italic","Link","anchor","Script","Strike","Underline","_link","Image","ATTRIBUTES","test","Video","FormulaBlot","SyntaxCodeBlock","Syntax","timer","_ret","addControls","quill","_this$quill$selection2","selected","option","groups","group","controls","addButton","addSelect","handlers","clean","link","justify","background","blockquote","rtl","float","full","formula","ordered","bullet","unchecked","strike","video","_dropdown2","Picker","trigger","ColorPicker","colorLabel","IconPicker","innerHTML","rootBounds","shift","_base","_base2","BubbleTheme","toolbar","_bounds","arrow","BubbleTooltip","COLORS","FONTS","HEADERS","SIZES","BaseTheme","picker","buttons","fillSelect","select","fileInput","setAttribute","reader","preview","BaseTooltip","SnowTheme","edit","SnowTooltip"],"sourceRoot":"webpack:///","sources":["..\\..\\node_modules\\chart.js\\dist\\Chart.js","..\\..\\node_modules\\@fullcalendar\\core\\main.js","..\\..\\node_modules\\@fullcalendar\\daygrid\\main.js","..\\..\\node_modules\\@fullcalendar\\timegrid\\main.js","..\\..\\node_modules\\@fullcalendar\\interaction\\main.js","..\\..\\node_modules\\prismjs\\prism.js","..\\..\\node_modules\\quill\\dist\\quill.js"],"sourcesContent":["/*!\n * Chart.js v3.3.2\n * https://www.chartjs.org\n * (c) 2021 Chart.js Contributors\n * Released under the MIT License\n */\n(function (global, factory) {\ntypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\ntypeof define === 'function' && define.amd ? define(factory) :\n(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Chart = factory());\n}(this, (function () { 'use strict';\n\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\nconst requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\nfunction throttled(fn, thisArg, updateFn) {\n const updateArgs = updateFn || ((args) => Array.prototype.slice.call(args));\n let ticking = false;\n let args = [];\n return function(...rest) {\n args = updateArgs(rest);\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, args);\n });\n }\n };\n}\nfunction debounce(fn, delay) {\n let timeout;\n return function() {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay);\n } else {\n fn();\n }\n return delay;\n };\n}\nconst _toLeftRightCenter = (align) => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\nconst _alignStartEnd = (align, start, end) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\nconst _textX = (align, left, right) => align === 'right' ? right : align === 'center' ? (left + right) / 2 : left;\n\nclass Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n _refresh() {\n const me = this;\n if (me._request) {\n return;\n }\n me._running = true;\n me._request = requestAnimFrame.call(window, () => {\n me._update();\n me._request = null;\n if (me._running) {\n me._refresh();\n }\n });\n }\n _update(date = Date.now()) {\n const me = this;\n let remaining = 0;\n me._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n for (; i >= 0; --i) {\n item = items[i];\n if (item._active) {\n if (item._total > anims.duration) {\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n if (draw) {\n chart.draw();\n me._notify(chart, anims, date, 'progress');\n }\n if (!items.length) {\n anims.running = false;\n me._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n remaining += items.length;\n });\n me._lastDate = date;\n if (remaining === 0) {\n me._running = false;\n }\n }\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\nvar animator = new Animator();\n\n/*!\n * @kurkle/color v0.1.9\n * https://github.com/kurkle/color#readme\n * (c) 2020 Jukka Kurkela\n * Released under the MIT License\n */\nconst map = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = '0123456789ABCDEF';\nconst h1 = (b) => hex[b & 0xF];\nconst h2 = (b) => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = (b) => (((b & 0xF0) >> 4) === (b & 0xF));\nfunction isShort(v) {\n\treturn eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\n}\nfunction hexParse(str) {\n\tvar len = str.length;\n\tvar ret;\n\tif (str[0] === '#') {\n\t\tif (len === 4 || len === 5) {\n\t\t\tret = {\n\t\t\t\tr: 255 & map[str[1]] * 17,\n\t\t\t\tg: 255 & map[str[2]] * 17,\n\t\t\t\tb: 255 & map[str[3]] * 17,\n\t\t\t\ta: len === 5 ? map[str[4]] * 17 : 255\n\t\t\t};\n\t\t} else if (len === 7 || len === 9) {\n\t\t\tret = {\n\t\t\t\tr: map[str[1]] << 4 | map[str[2]],\n\t\t\t\tg: map[str[3]] << 4 | map[str[4]],\n\t\t\t\tb: map[str[5]] << 4 | map[str[6]],\n\t\t\t\ta: len === 9 ? (map[str[7]] << 4 | map[str[8]]) : 255\n\t\t\t};\n\t\t}\n\t}\n\treturn ret;\n}\nfunction hexString(v) {\n\tvar f = isShort(v) ? h1 : h2;\n\treturn v\n\t\t? '#' + f(v.r) + f(v.g) + f(v.b) + (v.a < 255 ? f(v.a) : '')\n\t\t: v;\n}\nfunction round(v) {\n\treturn v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n\treturn lim(round(v * 2.55), 0, 255);\n}\nfunction n2b(v) {\n\treturn lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n\treturn lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n\treturn lim(round(v * 100), 0, 100);\n}\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n\tconst m = RGB_RE.exec(str);\n\tlet a = 255;\n\tlet r, g, b;\n\tif (!m) {\n\t\treturn;\n\t}\n\tif (m[7] !== r) {\n\t\tconst v = +m[7];\n\t\ta = 255 & (m[8] ? p2b(v) : v * 255);\n\t}\n\tr = +m[1];\n\tg = +m[3];\n\tb = +m[5];\n\tr = 255 & (m[2] ? p2b(r) : r);\n\tg = 255 & (m[4] ? p2b(g) : g);\n\tb = 255 & (m[6] ? p2b(b) : b);\n\treturn {\n\t\tr: r,\n\t\tg: g,\n\t\tb: b,\n\t\ta: a\n\t};\n}\nfunction rgbString(v) {\n\treturn v && (\n\t\tv.a < 255\n\t\t\t? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n\t\t\t: `rgb(${v.r}, ${v.g}, ${v.b})`\n\t);\n}\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n\tconst a = s * Math.min(l, 1 - l);\n\tconst f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n\treturn [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n\tconst f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n\treturn [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n\tconst rgb = hsl2rgbn(h, 1, 0.5);\n\tlet i;\n\tif (w + b > 1) {\n\t\ti = 1 / (w + b);\n\t\tw *= i;\n\t\tb *= i;\n\t}\n\tfor (i = 0; i < 3; i++) {\n\t\trgb[i] *= 1 - w - b;\n\t\trgb[i] += w;\n\t}\n\treturn rgb;\n}\nfunction rgb2hsl(v) {\n\tconst range = 255;\n\tconst r = v.r / range;\n\tconst g = v.g / range;\n\tconst b = v.b / range;\n\tconst max = Math.max(r, g, b);\n\tconst min = Math.min(r, g, b);\n\tconst l = (max + min) / 2;\n\tlet h, s, d;\n\tif (max !== min) {\n\t\td = max - min;\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\th = max === r\n\t\t\t? ((g - b) / d) + (g < b ? 6 : 0)\n\t\t\t: max === g\n\t\t\t\t? (b - r) / d + 2\n\t\t\t\t: (r - g) / d + 4;\n\t\th = h * 60 + 0.5;\n\t}\n\treturn [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n\treturn (\n\t\tArray.isArray(a)\n\t\t\t? f(a[0], a[1], a[2])\n\t\t\t: f(a, b, c)\n\t).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n\treturn calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n\treturn calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n\treturn calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n\treturn (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n\tconst m = HUE_RE.exec(str);\n\tlet a = 255;\n\tlet v;\n\tif (!m) {\n\t\treturn;\n\t}\n\tif (m[5] !== v) {\n\t\ta = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n\t}\n\tconst h = hue(+m[2]);\n\tconst p1 = +m[3] / 100;\n\tconst p2 = +m[4] / 100;\n\tif (m[1] === 'hwb') {\n\t\tv = hwb2rgb(h, p1, p2);\n\t} else if (m[1] === 'hsv') {\n\t\tv = hsv2rgb(h, p1, p2);\n\t} else {\n\t\tv = hsl2rgb(h, p1, p2);\n\t}\n\treturn {\n\t\tr: v[0],\n\t\tg: v[1],\n\t\tb: v[2],\n\t\ta: a\n\t};\n}\nfunction rotate(v, deg) {\n\tvar h = rgb2hsl(v);\n\th[0] = hue(h[0] + deg);\n\th = hsl2rgb(h);\n\tv.r = h[0];\n\tv.g = h[1];\n\tv.b = h[2];\n}\nfunction hslString(v) {\n\tif (!v) {\n\t\treturn;\n\t}\n\tconst a = rgb2hsl(v);\n\tconst h = a[0];\n\tconst s = n2p(a[1]);\n\tconst l = n2p(a[2]);\n\treturn v.a < 255\n\t\t? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n\t\t: `hsl(${h}, ${s}%, ${l}%)`;\n}\nconst map$1 = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n\tconst unpacked = {};\n\tconst keys = Object.keys(names);\n\tconst tkeys = Object.keys(map$1);\n\tlet i, j, k, ok, nk;\n\tfor (i = 0; i < keys.length; i++) {\n\t\tok = nk = keys[i];\n\t\tfor (j = 0; j < tkeys.length; j++) {\n\t\t\tk = tkeys[j];\n\t\t\tnk = nk.replace(k, map$1[k]);\n\t\t}\n\t\tk = parseInt(names[ok], 16);\n\t\tunpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n\t}\n\treturn unpacked;\n}\nlet names$1;\nfunction nameParse(str) {\n\tif (!names$1) {\n\t\tnames$1 = unpack();\n\t\tnames$1.transparent = [0, 0, 0, 0];\n\t}\n\tconst a = names$1[str.toLowerCase()];\n\treturn a && {\n\t\tr: a[0],\n\t\tg: a[1],\n\t\tb: a[2],\n\t\ta: a.length === 4 ? a[3] : 255\n\t};\n}\nfunction modHSL(v, i, ratio) {\n\tif (v) {\n\t\tlet tmp = rgb2hsl(v);\n\t\ttmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n\t\ttmp = hsl2rgb(tmp);\n\t\tv.r = tmp[0];\n\t\tv.g = tmp[1];\n\t\tv.b = tmp[2];\n\t}\n}\nfunction clone$1(v, proto) {\n\treturn v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n\tvar v = {r: 0, g: 0, b: 0, a: 255};\n\tif (Array.isArray(input)) {\n\t\tif (input.length >= 3) {\n\t\t\tv = {r: input[0], g: input[1], b: input[2], a: 255};\n\t\t\tif (input.length > 3) {\n\t\t\t\tv.a = n2b(input[3]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tv = clone$1(input, {r: 0, g: 0, b: 0, a: 1});\n\t\tv.a = n2b(v.a);\n\t}\n\treturn v;\n}\nfunction functionParse(str) {\n\tif (str.charAt(0) === 'r') {\n\t\treturn rgbParse(str);\n\t}\n\treturn hueParse(str);\n}\nclass Color {\n\tconstructor(input) {\n\t\tif (input instanceof Color) {\n\t\t\treturn input;\n\t\t}\n\t\tconst type = typeof input;\n\t\tlet v;\n\t\tif (type === 'object') {\n\t\t\tv = fromObject(input);\n\t\t} else if (type === 'string') {\n\t\t\tv = hexParse(input) || nameParse(input) || functionParse(input);\n\t\t}\n\t\tthis._rgb = v;\n\t\tthis._valid = !!v;\n\t}\n\tget valid() {\n\t\treturn this._valid;\n\t}\n\tget rgb() {\n\t\tvar v = clone$1(this._rgb);\n\t\tif (v) {\n\t\t\tv.a = b2n(v.a);\n\t\t}\n\t\treturn v;\n\t}\n\tset rgb(obj) {\n\t\tthis._rgb = fromObject(obj);\n\t}\n\trgbString() {\n\t\treturn this._valid ? rgbString(this._rgb) : this._rgb;\n\t}\n\thexString() {\n\t\treturn this._valid ? hexString(this._rgb) : this._rgb;\n\t}\n\thslString() {\n\t\treturn this._valid ? hslString(this._rgb) : this._rgb;\n\t}\n\tmix(color, weight) {\n\t\tconst me = this;\n\t\tif (color) {\n\t\t\tconst c1 = me.rgb;\n\t\t\tconst c2 = color.rgb;\n\t\t\tlet w2;\n\t\t\tconst p = weight === w2 ? 0.5 : weight;\n\t\t\tconst w = 2 * p - 1;\n\t\t\tconst a = c1.a - c2.a;\n\t\t\tconst w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\t\tw2 = 1 - w1;\n\t\t\tc1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n\t\t\tc1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n\t\t\tc1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n\t\t\tc1.a = p * c1.a + (1 - p) * c2.a;\n\t\t\tme.rgb = c1;\n\t\t}\n\t\treturn me;\n\t}\n\tclone() {\n\t\treturn new Color(this.rgb);\n\t}\n\talpha(a) {\n\t\tthis._rgb.a = n2b(a);\n\t\treturn this;\n\t}\n\tclearer(ratio) {\n\t\tconst rgb = this._rgb;\n\t\trgb.a *= 1 - ratio;\n\t\treturn this;\n\t}\n\tgreyscale() {\n\t\tconst rgb = this._rgb;\n\t\tconst val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n\t\trgb.r = rgb.g = rgb.b = val;\n\t\treturn this;\n\t}\n\topaquer(ratio) {\n\t\tconst rgb = this._rgb;\n\t\trgb.a *= 1 + ratio;\n\t\treturn this;\n\t}\n\tnegate() {\n\t\tconst v = this._rgb;\n\t\tv.r = 255 - v.r;\n\t\tv.g = 255 - v.g;\n\t\tv.b = 255 - v.b;\n\t\treturn this;\n\t}\n\tlighten(ratio) {\n\t\tmodHSL(this._rgb, 2, ratio);\n\t\treturn this;\n\t}\n\tdarken(ratio) {\n\t\tmodHSL(this._rgb, 2, -ratio);\n\t\treturn this;\n\t}\n\tsaturate(ratio) {\n\t\tmodHSL(this._rgb, 1, ratio);\n\t\treturn this;\n\t}\n\tdesaturate(ratio) {\n\t\tmodHSL(this._rgb, 1, -ratio);\n\t\treturn this;\n\t}\n\trotate(deg) {\n\t\trotate(this._rgb, deg);\n\t\treturn this;\n\t}\n}\nfunction index_esm(input) {\n\treturn new Color(input);\n}\n\nconst isPatternOrGradient = (value) => value instanceof CanvasGradient || value instanceof CanvasPattern;\nfunction color(value) {\n return isPatternOrGradient(value) ? value : index_esm(value);\n}\nfunction getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : index_esm(value).saturate(0.5).darken(0.1).hexString();\n}\n\nfunction noop() {}\nconst uid = (function() {\n let id = 0;\n return function() {\n return id++;\n };\n}());\nfunction isNullOrUndef(value) {\n return value === null || typeof value === 'undefined';\n}\nfunction isArray(value) {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {\n return true;\n }\n return false;\n}\nfunction isObject(value) {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\nconst isNumberFinite = (value) => (typeof value === 'number' || value instanceof Number) && isFinite(+value);\nfunction finiteOrDefault(value, defaultValue) {\n return isNumberFinite(value) ? value : defaultValue;\n}\nfunction valueOrDefault(value, defaultValue) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : value / dimension;\nconst toDimension = (value, dimension) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\nfunction callback(fn, args, thisArg) {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n let i, len, keys;\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\nfunction _elementsEqual(a0, a1) {\n let i, ilen, v0, v1;\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n return true;\n}\nfunction clone(source) {\n if (isArray(source)) {\n return source.map(clone);\n }\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n return target;\n }\n return source;\n}\nfunction isValidKey(key) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\nfunction _merger(key, target, source, options) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\nfunction merge(target, source, options) {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n if (!isObject(target)) {\n return target;\n }\n options = options || {};\n const merger = options.merger || _merger;\n for (let i = 0; i < ilen; ++i) {\n source = sources[i];\n if (!isObject(source)) {\n continue;\n }\n const keys = Object.keys(source);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, source, options);\n }\n }\n return target;\n}\nfunction mergeIf(target, source) {\n return merge(target, source, {merger: _mergerIf});\n}\nfunction _mergerIf(key, target, source) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\nfunction _deprecated(scope, value, previous, current) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n\t\t\t'\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\nconst emptyString = '';\nconst dot = '.';\nfunction indexOfDotOrLength(key, start) {\n const idx = key.indexOf(dot, start);\n return idx === -1 ? key.length : idx;\n}\nfunction resolveObjectKey(obj, key) {\n if (key === emptyString) {\n return obj;\n }\n let pos = 0;\n let idx = indexOfDotOrLength(key, pos);\n while (obj && idx > pos) {\n obj = obj[key.substr(pos, idx - pos)];\n pos = idx + 1;\n idx = indexOfDotOrLength(key, pos);\n }\n return obj;\n}\nfunction _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value) => typeof value !== 'undefined';\nconst isFunction = (value) => typeof value === 'function';\nconst setsEqual = (a, b) => {\n if (a.size !== b.size) {\n return false;\n }\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n return true;\n};\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\nfunction getScope$1(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope$1(root, scope), values);\n }\n return merge(getScope$1(root, ''), scope);\n}\nclass Defaults {\n constructor(_descriptors) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.describe(_descriptors);\n }\n set(scope, values) {\n return set(this, scope, values);\n }\n get(scope) {\n return getScope$1(this, scope);\n }\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n override(scope, values) {\n return set(overrides, scope, values);\n }\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope$1(this, scope);\n const targetScopeObject = getScope$1(this, targetScope);\n const privateName = '_' + name;\n Object.defineProperties(scopeObject, {\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n}\nvar defaults = new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n});\n\nconst PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction niceNum(range) {\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\nfunction _factorize(value) {\n const result = [];\n const sqrt = Math.sqrt(value);\n let i;\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) {\n result.push(sqrt);\n }\n result.sort((a, b) => a - b).pop();\n return result;\n}\nfunction isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostEquals(x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n}\nfunction almostWhole(x, epsilon) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\nfunction _setMinAndMaxByKey(array, target, property) {\n let i, ilen, value;\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\nfunction toRadians(degrees) {\n return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n return radians * (180 / PI);\n}\nfunction _decimalPlaces(x) {\n if (!isNumberFinite(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n if (angle < (-0.5 * PI)) {\n angle += TAU;\n }\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\nfunction _angleDiff(a, b) {\n return (a - b + PITAU) % TAU - PI;\n}\nfunction _normalizeAngle(a) {\n return (a % TAU + TAU) % TAU;\n}\nfunction _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\nfunction _limitValue(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\nfunction _int16Range(value) {\n return _limitValue(value, -32768, 32767);\n}\n\nfunction toFontString(font) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\nfunction _measureText(ctx, data, gc, longest, string) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n ctx.save();\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i, j, jlen, thing, nestedThing;\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n if (thing !== undefined && thing !== null && isArray(thing) !== true) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n ctx.restore();\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\nfunction _alignPixel(chart, pixel, width) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\nfunction clearCanvas(canvas, ctx) {\n ctx = ctx || canvas.getContext('2d');\n ctx.save();\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n let type, xOffset, yOffset, size, cornerRadius;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n ctx.beginPath();\n switch (style) {\n default:\n ctx.arc(x, y, radius, 0, TAU);\n ctx.closePath();\n break;\n case 'triangle':\n ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n ctx.rect(x - size, y - size, 2 * size, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n case 'rectRot':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + yOffset, y - xOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n case 'cross':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n break;\n case 'star':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n rad += QUARTER_PI;\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n break;\n case 'line':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);\n break;\n }\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\nfunction _isPointInArea(point, area, margin) {\n margin = margin || 0.5;\n return point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin;\n}\nfunction clipArea(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\nfunction unclipArea(ctx) {\n ctx.restore();\n}\nfunction _steppedLineTo(ctx, previous, target, flip, mode) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\nfunction _bezierCurveTo(ctx, previous, target, flip) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\nfunction renderText(ctx, text, x, y, font, opts = {}) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i, line;\n ctx.save();\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n ctx.font = font.string;\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n ctx.fillText(line, x, y, opts.maxWidth);\n if (opts.strikethrough || opts.underline) {\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n y += font.lineHeight;\n }\n ctx.restore();\n}\nfunction addRoundedRectPath(ctx, rect) {\n const {x, y, w, h, radius} = rect;\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, -HALF_PI, PI, true);\n ctx.lineTo(x, y + h - radius.bottomLeft);\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n ctx.lineTo(x + w, y + radius.topRight);\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n ctx.lineTo(x + radius.topLeft, y);\n}\n\nfunction _lookup(table, value, cmp) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid;\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return {lo, hi};\n}\nconst _lookupByKey = (table, key, value) =>\n _lookup(table, value, index => table[index][key] < value);\nconst _rlookupByKey = (table, key, value) =>\n _lookup(table, value, index => table[index][key] >= value);\nfunction _filterBetween(values, min, max) {\n let start = 0;\n let end = values.length;\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\nfunction listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n return res;\n }\n });\n });\n}\nfunction unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n if (listeners.length > 0) {\n return;\n }\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n delete array._chartjs;\n}\nfunction _arrayUnique(items) {\n const set = new Set();\n let i, ilen;\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n set.add(items[i]);\n }\n if (set.size === ilen) {\n return items;\n }\n const result = [];\n set.forEach(item => {\n result.push(item);\n });\n return result;\n}\n\nfunction _getParentNode(domNode) {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = parent.host;\n }\n return parent;\n}\nfunction parseMaxStyle(styleValue, node, parentProperty) {\n let valueInPixels;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n if (styleValue.indexOf('%') !== -1) {\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n return valueInPixels;\n}\nconst getComputedStyle = (element) => window.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles, style, suffix) {\n const result = {};\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\nconst useOffsetPos = (x, y, target) => (x > 0 || y > 0) && (!target || !target.shadowRoot);\nfunction getCanvasPosition(evt, canvas) {\n const e = evt.native || evt;\n const touches = e.touches;\n const source = touches && touches.length ? touches[0] : e;\n const {offsetX, offsetY} = source;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\nfunction getRelativePosition$1(evt, chart) {\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(evt, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\nfunction getContainerSize(canvas, width, height) {\n let maxWidth, maxHeight;\n if (width === undefined || height === undefined) {\n const container = _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect();\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\nconst round1 = v => Math.round(v * 10) / 10;\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n height = round1(width / 2);\n }\n return {\n width,\n height\n };\n}\nfunction retinaScale(chart, forceRatio, forceStyle) {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = Math.floor(chart.height * pixelRatio);\n const deviceWidth = Math.floor(chart.width * pixelRatio);\n chart.height = deviceHeight / pixelRatio;\n chart.width = deviceWidth / pixelRatio;\n const canvas = chart.canvas;\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n chart.currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\nconst supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() {\n passiveSupported = true;\n return false;\n }\n };\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n }\n return passiveSupported;\n}());\nfunction readUsedSize(element, property) {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n\nfunction getRelativePosition(e, chart) {\n if ('native' in e) {\n return {\n x: e.x,\n y: e.y\n };\n }\n return getRelativePosition$1(e, chart);\n}\nfunction evaluateAllVisibleItems(chart, handler) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n let index, data, element;\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n ({index, data} = metasets[i]);\n for (let j = 0, jlen = data.length; j < jlen; ++j) {\n element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n if (iScale && axis === iScale.axis && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n return lookupMethod(data, axis, value);\n } else if (controller._sharedOptions) {\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n return {lo: 0, hi: data.length - 1};\n}\nfunction optimizedEvaluateItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\nfunction getIntersectItems(chart, position, axis, useFinalPosition) {\n const items = [];\n if (!_isPointInArea(position, chart.chartArea, chart._minPadding)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n optimizedEvaluateItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition) {\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n let items = [];\n if (!_isPointInArea(position, chart.chartArea, chart._minPadding)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (intersect && !element.inRange(position.x, position.y, useFinalPosition)) {\n return;\n }\n const center = element.getCenterPoint(useFinalPosition);\n if (!_isPointInArea(center, chart.chartArea, chart._minPadding)) {\n return;\n }\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n items.push({element, datasetIndex, index});\n }\n };\n optimizedEvaluateItems(chart, axis, position, evaluationFunc);\n return items;\n}\nfunction getAxisItems(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const items = [];\n const axis = options.axis;\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n evaluateAllVisibleItems(chart, (element, datasetIndex, index) => {\n if (element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n intersectsItem = true;\n }\n });\n if (options.intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\nvar Interaction = {\n modes: {\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'x';\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition)\n : getNearestItems(chart, position, axis, false, useFinalPosition);\n const elements = [];\n if (!items.length) {\n return [];\n }\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n return elements;\n },\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition) :\n getNearestItems(chart, position, axis, false, useFinalPosition);\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n return items;\n },\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n return getIntersectItems(chart, position, axis, useFinalPosition);\n },\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition);\n },\n x(chart, e, options, useFinalPosition) {\n options.axis = 'x';\n return getAxisItems(chart, e, options, useFinalPosition);\n },\n y(chart, e, options, useFinalPosition) {\n options.axis = 'y';\n return getAxisItems(chart, e, options, useFinalPosition);\n }\n }\n};\n\nconst LINE_HEIGHT = new RegExp(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\nconst FONT_STYLE = new RegExp(/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/);\nfunction toLineHeight(value, size) {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n value = +matches[2];\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n }\n return size * value;\n}\nconst numberOrZero$1 = v => +v || 0;\nfunction _readValueToProps(value, props) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n for (const prop of keys) {\n ret[prop] = numberOrZero$1(read(prop));\n }\n return ret;\n}\nfunction toTRBL(value) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\nfunction toTRBLCorners(value) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\nfunction toPadding(value) {\n const obj = toTRBL(value);\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n return obj;\n}\nfunction toFont(options, fallback) {\n options = options || {};\n fallback = fallback || defaults.font;\n let size = valueOrDefault(options.size, fallback.size);\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = '';\n }\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n font.string = toFontString(font);\n return font;\n}\nfunction resolve(inputs, context, index, info) {\n let cacheable = true;\n let i, ilen, value;\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\nfunction _addGrace(minmax, grace) {\n const {min, max} = minmax;\n return {\n min: min - Math.abs(toDimension(grace, min)),\n max: max + toDimension(grace, max)\n };\n}\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box;\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n layoutBoxes.push({\n index: i,\n box,\n pos: box.position,\n horizontal: box.isHorizontal(),\n weight: box.weight\n });\n }\n return layoutBoxes;\n}\nfunction setLayoutDims(layouts, params) {\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n if (layout.horizontal) {\n layout.width = layout.box.fullSize && params.availableWidth;\n layout.height = params.hBoxMaxHeight;\n } else {\n layout.width = params.vBoxMaxWidth;\n layout.height = layout.box.fullSize && params.availableHeight;\n }\n }\n}\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout) {\n const box = layout.box;\n const maxPadding = chartArea.maxPadding;\n if (!isObject(layout.pos)) {\n if (layout.size) {\n chartArea[layout.pos] -= layout.size;\n }\n layout.size = layout.horizontal ? box.height : box.width;\n chartArea[layout.pos] += layout.size;\n }\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\nfunction fitBoxes(boxes, chartArea, params) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout);\n refit |= same && refitBoxes.length;\n changed = changed || other;\n if (!box.fullSize) {\n refitBoxes.push(layout);\n }\n }\n return refit && fitBoxes(refitBoxes, chartArea, params) || changed;\n}\nfunction placeBoxes(boxes, chartArea, params) {\n const userPadding = params.padding;\n let x = chartArea.x;\n let y = chartArea.y;\n let i, ilen, layout, box;\n for (i = 0, ilen = boxes.length; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n if (layout.horizontal) {\n box.left = box.fullSize ? userPadding.left : chartArea.left;\n box.right = box.fullSize ? params.outerWidth - userPadding.right : chartArea.left + chartArea.w;\n box.top = y;\n box.bottom = y + box.height;\n box.width = box.right - box.left;\n y = box.bottom;\n } else {\n box.left = x;\n box.right = x + box.width;\n box.top = box.fullSize ? userPadding.top : chartArea.top;\n box.bottom = box.fullSize ? params.outerHeight - userPadding.right : chartArea.top + chartArea.h;\n box.height = box.bottom - box.top;\n x = box.right;\n }\n }\n chartArea.x = x;\n chartArea.y = y;\n}\ndefaults.set('layout', {\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n});\nvar layouts = {\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n chart.boxes.push(item);\n },\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n fitBoxes(boxes.fullSize, chartArea, params);\n fitBoxes(verticalBoxes, chartArea, params);\n if (fitBoxes(horizontalBoxes, chartArea, params)) {\n fitBoxes(verticalBoxes, chartArea, params);\n }\n handleMaxPadding(chartArea);\n placeBoxes(boxes.leftAndTop, chartArea, params);\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n placeBoxes(boxes.rightAndBottom, chartArea, params);\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h);\n });\n }\n};\n\nclass BasePlatform {\n acquireContext(canvas, aspectRatio) {}\n releaseContext(context) {\n return false;\n }\n addEventListener(chart, type, listener) {}\n removeEventListener(chart, type, listener) {}\n getDevicePixelRatio() {\n return 1;\n }\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n isAttached(canvas) {\n return true;\n }\n}\n\nclass BasicPlatform extends BasePlatform {\n acquireContext(item) {\n return item && item.getContext && item.getContext('2d') || null;\n }\n}\n\nconst EXPANDO_KEY = '$chartjs';\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\nconst isNullOrEmpty = value => value === null || value === '';\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n style.display = style.display || 'block';\n style.boxSizing = style.boxSizing || 'border-box';\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\nfunction addListener(node, type, listener) {\n node.addEventListener(type, listener, eventListenerOptions);\n}\nfunction removeListener(chart, type, listener) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n}\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition$1(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n const element = container || canvas;\n const observer = new MutationObserver(entries => {\n const parent = _getParentNode(element);\n entries.forEach(entry => {\n for (let i = 0; i < entry.addedNodes.length; i++) {\n const added = entry.addedNodes[i];\n if (added === element || added === parent) {\n listener(entry.target);\n }\n }\n });\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const observer = new MutationObserver(entries => {\n entries.forEach(entry => {\n for (let i = 0; i < entry.removedNodes.length; i++) {\n if (entry.removedNodes[i] === canvas) {\n listener();\n break;\n }\n }\n });\n });\n observer.observe(container, {childList: true});\n return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n listener();\n }\n }, window);\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart, (args) => {\n const event = args[0];\n return [event, event.offsetX, event.offsetY];\n });\n addListener(canvas, type, proxy);\n return proxy;\n}\nclass DomPlatform extends BasePlatform {\n acquireContext(canvas, aspectRatio) {\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n if (context && context.canvas === canvas) {\n initCanvas(canvas, aspectRatio);\n return context;\n }\n return null;\n }\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n canvas.width = canvas.width;\n delete canvas[EXPANDO_KEY];\n return true;\n }\n addEventListener(chart, type, listener) {\n this.removeEventListener(chart, type);\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n if (!proxy) {\n return;\n }\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n isAttached(canvas) {\n const container = _getParentNode(canvas);\n return !!(container && _getParentNode(container));\n }\n}\n\nvar platforms = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBasePlatform: BasePlatform,\nBasicPlatform: BasicPlatform,\nDomPlatform: DomPlatform\n});\n\nconst atEdge = (t) => t === 0 || t === 1;\nconst elasticIn = (t, s, p) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\nconst effects = {\n linear: t => t,\n easeInQuad: t => t * t,\n easeOutQuad: t => -t * (t - 2),\n easeInOutQuad: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n easeInCubic: t => t * t * t,\n easeOutCubic: t => (t -= 1) * t * t + 1,\n easeInOutCubic: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n easeInQuart: t => t * t * t * t,\n easeOutQuart: t => -((t -= 1) * t * t * t - 1),\n easeInOutQuart: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n easeInQuint: t => t * t * t * t * t,\n easeOutQuint: t => (t -= 1) * t * t * t * t + 1,\n easeInOutQuint: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n easeInSine: t => -Math.cos(t * HALF_PI) + 1,\n easeOutSine: t => Math.sin(t * HALF_PI),\n easeInOutSine: t => -0.5 * (Math.cos(PI * t) - 1),\n easeInExpo: t => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n easeOutExpo: t => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n easeInOutExpo: t => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n easeInCirc: t => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n easeOutCirc: t => Math.sqrt(1 - (t -= 1) * t),\n easeInOutCirc: t => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n easeInElastic: t => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n easeOutElastic: t => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n easeInOutElastic(t) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n easeInBack(t) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n easeOutBack(t) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n easeInOutBack(t) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n easeInBounce: t => 1 - effects.easeOutBounce(1 - t),\n easeOutBounce(t) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n easeInOutBounce: t => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n};\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n color(from, to, factor) {\n const c0 = color(from || transparent);\n const c1 = c0.valid && color(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\nclass Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n active() {\n return this._active;\n }\n update(cfg, to, date) {\n const me = this;\n if (me._active) {\n me._notify(false);\n const currentValue = me._target[me._prop];\n const elapsed = date - me._start;\n const remain = me._duration - elapsed;\n me._start = date;\n me._duration = Math.floor(Math.max(remain, cfg.duration));\n me._total += elapsed;\n me._loop = !!cfg.loop;\n me._to = resolve([cfg.to, to, currentValue, cfg.from]);\n me._from = resolve([cfg.from, currentValue, to]);\n }\n }\n cancel() {\n const me = this;\n if (me._active) {\n me.tick(Date.now());\n me._active = false;\n me._notify(false);\n }\n }\n tick(date) {\n const me = this;\n const elapsed = date - me._start;\n const duration = me._duration;\n const prop = me._prop;\n const from = me._from;\n const loop = me._loop;\n const to = me._to;\n let factor;\n me._active = from !== to && (loop || (elapsed < duration));\n if (!me._active) {\n me._target[prop] = to;\n me._notify(true);\n return;\n }\n if (elapsed < 0) {\n me._target[prop] = from;\n return;\n }\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = me._easing(Math.min(1, Math.max(0, factor)));\n me._target[prop] = me._fn(from, to, factor);\n }\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n\nconst numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\ndefaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n});\nconst animationOptions = Object.keys(defaults.animation);\ndefaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n});\ndefaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n});\ndefaults.describe('animations', {\n _fallback: 'animation',\n});\ndefaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0\n },\n }\n }\n});\nclass Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n const animatedProps = this._properties;\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n });\n }\n return animations;\n }\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n if (animation) {\n if (cfg && animation.active()) {\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n target[prop] = value;\n continue;\n }\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n update(target, values) {\n if (this._properties.size === 0) {\n Object.assign(target, values);\n return;\n }\n const animations = this._createAnimations(target, values);\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\nfunction toClip(value) {\n let t, r, b, l;\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n return {\n top: t,\n right: r,\n bottom: b,\n left: l\n };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\nfunction applyStack(stack, value, dsIndex, options) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n if (value === null) {\n return;\n }\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isNumberFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n return value;\n}\nfunction convertObjectDataToArray(data) {\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n x: key,\n y: data[key]\n };\n }\n return adata;\n}\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive) {\n for (const meta of vScale.getMatchingVisibleMetas('bar').reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n return null;\n}\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {});\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n stack._top = getLastIndexInStack(stack, vScale, true);\n stack._bottom = getLastIndexInStack(stack, vScale, false);\n }\n}\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n return Object.assign(Object.create(parent),\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\nfunction createDataContext(parent, index, element) {\n return Object.assign(Object.create(parent), {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\nfunction clearStacks(meta, items) {\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][meta.index] === undefined) {\n return;\n }\n delete stacks[axis][meta.index];\n }\n}\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nclass DatasetController {\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.$context = undefined;\n this._syncList = [];\n this.initialize();\n }\n initialize() {\n const me = this;\n const meta = me._cachedMeta;\n me.configure();\n me.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n me.addElements();\n }\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n linkScales() {\n const me = this;\n const chart = me.chart;\n const meta = me._cachedMeta;\n const dataset = me.getDataset();\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = me.getScaleForId(xid);\n meta.yScale = me.getScaleForId(yid);\n meta.rScale = me.getScaleForId(rid);\n meta.iScale = me.getScaleForId(iid);\n meta.vScale = me.getScaleForId(vid);\n }\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n reset() {\n this._update('reset');\n }\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n _dataCheck() {\n const me = this;\n const dataset = me.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = me._data;\n if (isObject(data)) {\n me._data = convertObjectDataToArray(data);\n } else if (_data !== data) {\n if (_data) {\n unlistenArrayEvents(_data, me);\n const meta = me._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, me);\n }\n me._syncList = [];\n me._data = data;\n }\n }\n addElements() {\n const me = this;\n const meta = me._cachedMeta;\n me._dataCheck();\n if (me.datasetElementType) {\n meta.dataset = new me.datasetElementType();\n }\n }\n buildOrUpdateElements(resetNewElements) {\n const me = this;\n const meta = me._cachedMeta;\n const dataset = me.getDataset();\n let stackChanged = false;\n me._dataCheck();\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n me._resyncElements(resetNewElements);\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(me, meta._parsed);\n }\n }\n configure() {\n const me = this;\n const config = me.chart.config;\n const scopeKeys = config.datasetScopeKeys(me._type);\n const scopes = config.getOptionScopes(me.getDataset(), scopeKeys, true);\n me.options = config.createResolver(scopes, me.getContext());\n me._parsing = me.options.parsing;\n }\n parse(start, count) {\n const me = this;\n const {_cachedMeta: meta, _data: data} = me;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n if (me._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = me.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = me.parseObjectData(meta, data, start, count);\n } else {\n parsed = me.parsePrimitiveData(meta, data, start, count);\n }\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n if (_stacked) {\n updateStacks(me, parsed);\n }\n }\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n value = applyStack(stack, parsedValue, this._cachedMeta.index, {all: true});\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n getMinMax(scale, canStack) {\n const me = this;\n const meta = me._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = me._getOtherScale(scale);\n const stack = canStack && meta._stacked && {keys: getSortedDatasetIndices(me.chart, true), values: null};\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, value, parsed, otherValue;\n function _skip() {\n parsed = _parsed[i];\n value = parsed[scale.axis];\n otherValue = parsed[otherScale.axis];\n return !isNumberFinite(value) || otherMin > otherValue || otherMax < otherValue;\n }\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n me.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n break;\n }\n }\n if (sorted) {\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n me.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isNumberFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n getMaxOverflow() {\n return false;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = me.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n _update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n me.configure();\n me._cachedDataOpts = {};\n me.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(me.options.clip, defaultClip(meta.xScale, meta.yScale, me.getMaxOverflow())));\n }\n update(mode) {}\n draw() {\n const me = this;\n const ctx = me._ctx;\n const chart = me.chart;\n const meta = me._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = me._drawStart || 0;\n const count = me._drawCount || (elements.length - start);\n let i;\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.active) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n getContext(index, active, mode) {\n const me = this;\n const dataset = me.getDataset();\n let context;\n if (index >= 0 && index < me._cachedMeta.data.length) {\n const element = me._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(me.getContext(), index, element));\n context.parsed = me.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = me.$context ||\n (me.$context = createDatasetContext(me.chart.getContext(), me.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = me.index;\n }\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n _resolveElementOptions(elementType, mode = 'default', index) {\n const me = this;\n const active = mode === 'active';\n const cache = me._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = me.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = me.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(me._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(me.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n const context = () => me.getContext(index, active);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n if (values.$shared) {\n values.$shared = sharing;\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n return values;\n }\n _resolveAnimations(index, transition, active) {\n const me = this;\n const chart = me.chart;\n const cache = me._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = me.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(me._type, transition);\n const scopes = config.getOptionScopes(me.getDataset(), scopeKeys);\n options = config.createResolver(scopes, me.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n _resyncElements(resetNewElements) {\n const me = this;\n const data = me._data;\n const elements = me._cachedMeta.data;\n for (const [method, arg1, arg2] of me._syncList) {\n me[method](arg1, arg2);\n }\n me._syncList = [];\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n if (count) {\n me.parse(0, count);\n }\n if (numData > numMeta) {\n me._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n me._removeElements(numData, numMeta - numData);\n }\n }\n _insertElements(start, count, resetNewElements = true) {\n const me = this;\n const meta = me._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n for (i = start; i < end; ++i) {\n data[i] = new me.dataElementType();\n }\n if (me._parsing) {\n move(meta._parsed);\n }\n me.parse(start, count);\n if (resetNewElements) {\n me.updateElements(data, start, count, 'reset');\n }\n }\n updateElements(element, start, count, mode) {}\n _removeElements(start, count) {\n const me = this;\n const meta = me._cachedMeta;\n if (me._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n _onDataPush() {\n const count = arguments.length;\n this._syncList.push(['_insertElements', this.getDataset().data.length - count, count]);\n }\n _onDataPop() {\n this._syncList.push(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n _onDataShift() {\n this._syncList.push(['_removeElements', 0, 1]);\n }\n _onDataSplice(start, count) {\n this._syncList.push(['_removeElements', start, count]);\n this._syncList.push(['_insertElements', start, arguments.length - 2]);\n }\n _onDataUnshift() {\n this._syncList.push(['_insertElements', 0, arguments.length]);\n }\n}\nDatasetController.defaults = {};\nDatasetController.prototype.datasetElementType = null;\nDatasetController.prototype.dataElementType = null;\n\nclass Element {\n constructor() {\n this.x = undefined;\n this.y = undefined;\n this.active = false;\n this.options = undefined;\n this.$animations = undefined;\n }\n tooltipPosition(useFinalPosition) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n getProps(props, final) {\n const me = this;\n const anims = this.$animations;\n if (!final || !anims) {\n return me;\n }\n const ret = {};\n props.forEach(prop => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : me[prop];\n });\n return ret;\n }\n}\nElement.defaults = {};\nElement.defaultRoutes = undefined;\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\nfunction formatNumber(num, locale, options) {\n return getNumberFormat(locale, options).format(num);\n}\n\nconst formatters = {\n values(value) {\n return isArray(value) ? value : '' + value;\n },\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue;\n if (ticks.length > 1) {\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n delta = calculateDelta(tickValue, ticks);\n }\n const logDelta = log10(Math.abs(delta));\n const numDecimal = Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n return formatNumber(tickValue, locale, options);\n },\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = tickValue / (Math.pow(10, Math.floor(log10(tickValue))));\n if (remain === 1 || remain === 2 || remain === 5) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n};\nfunction calculateDelta(tickValue, ticks) {\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\nvar Ticks = {formatters};\n\ndefaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n bounds: 'ticks',\n grace: 0,\n grid: {\n display: true,\n lineWidth: 1,\n drawBorder: true,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n borderDash: [],\n borderDashOffset: 0.0,\n borderWidth: 1\n },\n title: {\n display: false,\n text: '',\n padding: {\n top: 4,\n bottom: 4\n }\n },\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n});\ndefaults.route('scale.ticks', 'color', '', 'color');\ndefaults.route('scale.grid', 'color', '', 'borderColor');\ndefaults.route('scale.grid', 'borderColor', '', 'borderColor');\ndefaults.route('scale.title', 'color', '', 'color');\ndefaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash',\n});\ndefaults.describe('scales', {\n _fallback: 'scale',\n});\n\nfunction autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const ticksLimit = tickOpts.maxTicksLimit || determineMaxTicks(scale);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n next = start;\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n if (len < 2) {\n return false;\n }\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6;\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n return (lines * font.lineHeight) + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n return Object.assign(Object.create(parent), {\n scale,\n type: 'scale'\n });\n}\nfunction createTickContext(parent, index, tick) {\n return Object.assign(Object.create(parent), {\n tick,\n index,\n type: 'tick'\n });\n}\nfunction titleAlign(align, position, reverse) {\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right} = scale;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n titleY = offsetFromEdge(scale, position, offset);\n maxWidth = right - left;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\nclass Scale extends Element {\n constructor(cfg) {\n super();\n this.id = cfg.id;\n this.type = cfg.type;\n this.options = undefined;\n this.ctx = cfg.ctx;\n this.chart = cfg.chart;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n this.maxWidth = undefined;\n this.maxHeight = undefined;\n this.paddingTop = undefined;\n this.paddingBottom = undefined;\n this.paddingLeft = undefined;\n this.paddingRight = undefined;\n this.axis = undefined;\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n this.ticks = [];\n this._gridLineItems = null;\n this._labelItems = null;\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n this._startPixel = undefined;\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n init(options) {\n const me = this;\n me.options = options.setContext(me.getContext());\n me.axis = options.axis;\n me._userMin = me.parse(options.min);\n me._userMax = me.parse(options.max);\n me._suggestedMin = me.parse(options.suggestedMin);\n me._suggestedMax = me.parse(options.suggestedMax);\n }\n parse(raw, index) {\n return raw;\n }\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isNumberFinite(_userMin),\n maxDefined: isNumberFinite(_userMax)\n };\n }\n getMinMax(canStack) {\n const me = this;\n let {min, max, minDefined, maxDefined} = me.getUserBounds();\n let range;\n if (minDefined && maxDefined) {\n return {min, max};\n }\n const metas = me.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(me, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n getPadding() {\n const me = this;\n return {\n left: me.paddingLeft || 0,\n top: me.paddingTop || 0,\n right: me.paddingRight || 0,\n bottom: me.paddingBottom || 0\n };\n }\n getTicks() {\n return this.ticks;\n }\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n beforeUpdate() {\n callback(this.options.beforeUpdate, [this]);\n }\n update(maxWidth, maxHeight, margins) {\n const me = this;\n const tickOpts = me.options.ticks;\n const sampleSize = tickOpts.sampleSize;\n me.beforeUpdate();\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n me.ticks = null;\n me._labelSizes = null;\n me._gridLineItems = null;\n me._labelItems = null;\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n me._maxLength = me.isHorizontal()\n ? me.width + margins.left + margins.right\n : me.height + margins.top + margins.bottom;\n if (!me._dataLimitsCached) {\n me.beforeDataLimits();\n me.determineDataLimits();\n me.afterDataLimits();\n me._range = _addGrace(me, me.options.grace);\n me._dataLimitsCached = true;\n }\n me.beforeBuildTicks();\n me.ticks = me.buildTicks() || [];\n me.afterBuildTicks();\n const samplingEnabled = sampleSize < me.ticks.length;\n me._convertTicksToLabels(samplingEnabled ? sample(me.ticks, sampleSize) : me.ticks);\n me.configure();\n me.beforeCalculateLabelRotation();\n me.calculateLabelRotation();\n me.afterCalculateLabelRotation();\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n me.ticks = autoSkip(me, me.ticks);\n me._labelSizes = null;\n }\n if (samplingEnabled) {\n me._convertTicksToLabels(me.ticks);\n }\n me.beforeFit();\n me.fit();\n me.afterFit();\n me.afterUpdate();\n }\n configure() {\n const me = this;\n let reversePixels = me.options.reverse;\n let startPixel, endPixel;\n if (me.isHorizontal()) {\n startPixel = me.left;\n endPixel = me.right;\n } else {\n startPixel = me.top;\n endPixel = me.bottom;\n reversePixels = !reversePixels;\n }\n me._startPixel = startPixel;\n me._endPixel = endPixel;\n me._reversePixels = reversePixels;\n me._length = endPixel - startPixel;\n me._alignToPixels = me.options.alignToPixels;\n }\n afterUpdate() {\n callback(this.options.afterUpdate, [this]);\n }\n beforeSetDimensions() {\n callback(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n const me = this;\n if (me.isHorizontal()) {\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n me.top = 0;\n me.bottom = me.height;\n }\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n }\n afterSetDimensions() {\n callback(this.options.afterSetDimensions, [this]);\n }\n _callHooks(name) {\n const me = this;\n me.chart.notifyPlugins(name, me.getContext());\n callback(me.options[name], [me]);\n }\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n beforeTickToLabelConversion() {\n callback(this.options.beforeTickToLabelConversion, [this]);\n }\n generateTickLabels(ticks) {\n const me = this;\n const tickOpts = me.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = callback(tickOpts.callback, [tick.value, i, ticks], me);\n }\n for (i = 0; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n }\n afterTickToLabelConversion() {\n callback(this.options.afterTickToLabelConversion, [this]);\n }\n beforeCalculateLabelRotation() {\n callback(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const me = this;\n const options = me.options;\n const tickOpts = options.ticks;\n const numTicks = me.ticks.length;\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n if (!me._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !me.isHorizontal()) {\n me.labelRotation = minRotation;\n return;\n }\n const labelSizes = me._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n const maxWidth = _limitValue(me.chart.width - maxLabelWidth, 0, me.maxWidth);\n tickWidth = options.offset ? me.maxWidth / numTicks : maxWidth / (numTicks - 1);\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = me.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, me.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(Math.min((labelSizes.highest.height + 6) / tickWidth, 1)),\n Math.asin(Math.min(maxHeight / maxLabelDiagonal, 1)) - Math.asin(maxLabelHeight / maxLabelDiagonal)\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n me.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n callback(this.options.afterCalculateLabelRotation, [this]);\n }\n beforeFit() {\n callback(this.options.beforeFit, [this]);\n }\n fit() {\n const me = this;\n const minSize = {\n width: 0,\n height: 0\n };\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = me;\n const display = me._isVisible();\n const isHorizontal = me.isHorizontal();\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = me.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = me.maxHeight;\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n if (tickOpts.display && me.ticks.length) {\n const {first, last, widest, highest} = me._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(me.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n if (isHorizontal) {\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n minSize.width = Math.min(me.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n me._calculatePadding(first, last, sin, cos);\n }\n }\n me._handleMargins();\n if (isHorizontal) {\n me.width = me._length = chart.width - me._margins.left - me._margins.right;\n me.height = minSize.height;\n } else {\n me.width = minSize.width;\n me.height = me._length = chart.height - me._margins.top - me._margins.bottom;\n }\n }\n _calculatePadding(first, last, sin, cos) {\n const me = this;\n const {ticks: {align, padding}, position} = me.options;\n const isRotated = me.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && me.axis === 'x';\n if (me.isHorizontal()) {\n const offsetLeft = me.getPixelForTick(0) - me.left;\n const offsetRight = me.right - me.getPixelForTick(me.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n me.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * me.width / (me.width - offsetLeft), 0);\n me.paddingRight = Math.max((paddingRight - offsetRight + padding) * me.width / (me.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n me.paddingTop = paddingTop + padding;\n me.paddingBottom = paddingBottom + padding;\n }\n }\n _handleMargins() {\n const me = this;\n if (me._margins) {\n me._margins.left = Math.max(me.paddingLeft, me._margins.left);\n me._margins.top = Math.max(me.paddingTop, me._margins.top);\n me._margins.right = Math.max(me.paddingRight, me._margins.right);\n me._margins.bottom = Math.max(me.paddingBottom, me._margins.bottom);\n }\n }\n afterFit() {\n callback(this.options.afterFit, [this]);\n }\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n isFullSize() {\n return this.options.fullSize;\n }\n _convertTicksToLabels(ticks) {\n const me = this;\n me.beforeTickToLabelConversion();\n me.generateTickLabels(ticks);\n me.afterTickToLabelConversion();\n }\n _getLabelSizes() {\n const me = this;\n let labelSizes = me._labelSizes;\n if (!labelSizes) {\n const sampleSize = me.options.ticks.sampleSize;\n let ticks = me.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n me._labelSizes = labelSizes = me._computeLabelSizes(ticks, ticks.length);\n }\n return labelSizes;\n }\n _computeLabelSizes(ticks, length) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n for (i = 0; i < length; ++i) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = label[j];\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n getLabelForValue(value) {\n return value;\n }\n getPixelForValue(value, index) {\n return NaN;\n }\n getValueForPixel(pixel) {}\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getPixelForDecimal(decimal) {\n const me = this;\n if (me._reversePixels) {\n decimal = 1 - decimal;\n }\n const pixel = me._startPixel + decimal * me._length;\n return _int16Range(me._alignToPixels ? _alignPixel(me.chart, pixel, 0) : pixel);\n }\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n getBaseValue() {\n const {min, max} = this;\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n getContext(index) {\n const me = this;\n const ticks = me.ticks || [];\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(me.getContext(), index, tick));\n }\n return me.$context ||\n\t\t\t(me.$context = createScaleContext(me.chart.getContext(), me));\n }\n _tickSize() {\n const me = this;\n const optionTicks = me.options.ticks;\n const rot = toRadians(me.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n const labelSizes = me._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n return me.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n _isVisible() {\n const display = this.options.display;\n if (display !== 'auto') {\n return !!display;\n }\n return this.getMatchingVisibleMetas().length > 0;\n }\n _computeGridLineItems(chartArea) {\n const me = this;\n const axis = me.axis;\n const chart = me.chart;\n const options = me.options;\n const {grid, position} = options;\n const offset = grid.offset;\n const isHorizontal = me.isHorizontal();\n const ticks = me.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n const borderOpts = grid.setContext(me.getContext());\n const axisWidth = borderOpts.drawBorder ? borderOpts.borderWidth : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n if (position === 'top') {\n borderValue = alignBorderValue(me.bottom);\n ty1 = me.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(me.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = me.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(me.right);\n tx1 = me.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(me.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = me.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(me.chart.scales[positionAxisID].getPixelForValue(value));\n }\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(me.chart.scales[positionAxisID].getPixelForValue(value));\n }\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n for (i = 0; i < ticksLength; ++i) {\n const optsAtIndex = grid.setContext(me.getContext(i));\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = grid.borderDash || [];\n const borderDashOffset = optsAtIndex.borderDashOffset;\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n lineValue = getPixelForGridLine(me, i, offset);\n if (lineValue === undefined) {\n continue;\n }\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n me._ticksLength = ticksLength;\n me._borderValue = borderValue;\n return items;\n }\n _computeLabelItems(chartArea) {\n const me = this;\n const axis = me.axis;\n const options = me.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = me.isHorizontal();\n const ticks = me.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(me.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n if (position === 'top') {\n y = me.bottom - hTickAndPadding;\n textAlign = me._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = me.top + hTickAndPadding;\n textAlign = me._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = me._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = me._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = me.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = me._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = me.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = me._getYAxisLabelAlignment(tl).textAlign;\n }\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n const labelSizes = me._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n const optsAtIndex = optionTicks.setContext(me.getContext(i));\n pixel = me.getPixelForTick(i) + optionTicks.labelOffset;\n font = me._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n if (isHorizontal) {\n x = pixel;\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n let backdrop;\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n let top = y + textOffset - labelPadding.top;\n let left = x - labelPadding.left;\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n }\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n }\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n color: optsAtIndex.backdropColor,\n };\n }\n items.push({\n rotation,\n label,\n font,\n color,\n strokeColor,\n strokeWidth,\n textOffset,\n textAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n });\n }\n return items;\n }\n _getXAxisLabelAlignment() {\n const me = this;\n const {position, ticks} = me.options;\n const rotation = -toRadians(me.labelRotation);\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n let align = 'center';\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n }\n return align;\n }\n _getYAxisLabelAlignment(tl) {\n const me = this;\n const {position, ticks: {crossAlign, mirror, padding}} = me.options;\n const labelSizes = me._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n let textAlign;\n let x;\n if (position === 'left') {\n if (mirror) {\n textAlign = 'left';\n x = me.right + padding;\n } else {\n x = me.right - tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = me.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n textAlign = 'right';\n x = me.left + padding;\n } else {\n x = me.left + tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = me.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n return {textAlign, x};\n }\n _computeLabelArea() {\n const me = this;\n if (me.options.ticks.mirror) {\n return;\n }\n const chart = me.chart;\n const position = me.options.position;\n if (position === 'left' || position === 'right') {\n return {top: 0, left: me.left, bottom: chart.height, right: me.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: me.top, left: 0, bottom: me.bottom, right: chart.width};\n }\n }\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n getLineWidthForValue(value) {\n const me = this;\n const grid = me.options.grid;\n if (!me._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = me.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(me.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n drawGrid(chartArea) {\n const me = this;\n const grid = me.options.grid;\n const ctx = me.ctx;\n const items = me._gridLineItems || (me._gridLineItems = me._computeGridLineItems(chartArea));\n let i, ilen;\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n drawBorder() {\n const me = this;\n const {chart, ctx, options: {grid}} = me;\n const borderOpts = grid.setContext(me.getContext());\n const axisWidth = grid.drawBorder ? borderOpts.borderWidth : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(me.getContext(0)).lineWidth;\n const borderValue = me._borderValue;\n let x1, x2, y1, y2;\n if (me.isHorizontal()) {\n x1 = _alignPixel(chart, me.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, me.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.borderWidth;\n ctx.strokeStyle = borderOpts.borderColor;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.restore();\n }\n drawLabels(chartArea) {\n const me = this;\n const optionTicks = me.options.ticks;\n if (!optionTicks.display) {\n return;\n }\n const ctx = me.ctx;\n const area = me._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n const items = me._labelItems || (me._labelItems = me._computeLabelItems(chartArea));\n let i, ilen;\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n const tickFont = item.font;\n const label = item.label;\n if (item.backdrop) {\n ctx.fillStyle = item.backdrop.color;\n ctx.fillRect(item.backdrop.left, item.backdrop.top, item.backdrop.width, item.backdrop.height);\n }\n let y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, item);\n }\n if (area) {\n unclipArea(ctx);\n }\n }\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n if (!title.display) {\n return;\n }\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n if (position === 'bottom') {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n draw(chartArea) {\n const me = this;\n if (!me._isVisible()) {\n return;\n }\n me.drawBackground();\n me.drawGrid(chartArea);\n me.drawBorder();\n me.drawTitle();\n me.drawLabels(chartArea);\n }\n _layers() {\n const me = this;\n const opts = me.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = opts.grid && opts.grid.z || 0;\n if (!me._isVisible() || me.draw !== Scale.prototype.draw) {\n return [{\n z: tz,\n draw(chartArea) {\n me.draw(chartArea);\n }\n }];\n }\n return [{\n z: gz,\n draw(chartArea) {\n me.drawBackground();\n me.drawGrid(chartArea);\n me.drawTitle();\n }\n }, {\n z: gz + 1,\n draw() {\n me.drawBorder();\n }\n }, {\n z: tz,\n draw(chartArea) {\n me.drawLabels(chartArea);\n }\n }];\n }\n getMatchingVisibleMetas(type) {\n const me = this;\n const metas = me.chart.getSortedVisibleDatasetMetas();\n const axisID = me.axis + 'AxisID';\n const result = [];\n let i, ilen;\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === me.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n _maxDigits() {\n const me = this;\n const fontSize = me._resolveTickFontOptions(0).lineHeight;\n return (me.isHorizontal() ? me.width : me.height) / fontSize;\n }\n}\n\nfunction _createResolver(scopes, prefixes = [''], rootScopes = scopes, fallback, getTarget = () => scopes[0]) {\n if (!defined(fallback)) {\n fallback = _resolve('_fallback', scopes);\n }\n const cache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: rootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope) => _createResolver([scope, ...scopes], prefixes, rootScopes, fallback),\n };\n return new Proxy(cache, {\n deleteProperty(target, prop) {\n delete target[prop];\n delete target._keys;\n delete scopes[0][prop];\n return true;\n },\n get(target, prop) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n has(target, prop) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n set(target, prop, value) {\n const storage = target._storage || (target._storage = getTarget());\n storage[prop] = value;\n delete target[prop];\n delete target._keys;\n return true;\n }\n });\n}\nfunction _attachContext(proxy, context, subProxy, descriptorDefaults) {\n const cache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n deleteProperty(target, prop) {\n delete target[prop];\n delete proxy[prop];\n return true;\n },\n get(target, prop, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n set(target, prop, value) {\n proxy[prop] = value;\n delete target[prop];\n return true;\n }\n });\n}\nfunction _descriptors(proxy, defaults = {scriptable: true, indexable: true}) {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\nconst readKey = (prefix, name) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value) => isObject(value) && prop !== 'adapters';\nfunction _cached(target, prop, resolve) {\n let value = target[prop];\n if (defined(value)) {\n return value;\n }\n value = resolve();\n if (defined(value)) {\n target[prop] = value;\n }\n return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop];\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\nfunction _resolveScriptable(prop, value, target, receiver) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + [..._stack].join('->') + '->' + prop);\n }\n _stack.add(prop);\n value = value(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (isObject(value)) {\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n if (defined(_context.index) && isIndexable(prop)) {\n value = value[_context.index % value.length];\n } else if (isObject(value[0])) {\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, scope);\n if (defined(fallback) && fallback !== key && fallback !== parentFallback) {\n return fallback;\n }\n } else if (scope === false && defined(parentFallback) && key !== parentFallback) {\n return null;\n }\n }\n return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop);\n if (key === null) {\n return false;\n }\n if (defined(fallback) && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key);\n if (key === null) {\n return false;\n }\n }\n return _createResolver([...set], [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback);\n }\n return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n return value;\n }\n return target;\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n let value;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (defined(value)) {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\nfunction _resolve(key, scopes) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (defined(value)) {\n return value;\n }\n }\n}\nfunction getKeysFromAllScopes(target) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return [...set];\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i) => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis) => indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n const fa = t * s01;\n const fb = t * s12;\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\nfunction monotoneAdjust(points, deltaK, mK) {\n const pointsLen = points.length;\n let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\nfunction splineCurveMonotone(points, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK = Array(pointsLen).fill(0);\n const mK = Array(pointsLen);\n let i, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n monotoneAdjust(points, deltaK, mK);\n monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\nfunction _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n let i, ilen, point, controlPoints;\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n\nfunction _pointInLine(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\nfunction _steppedInterpolation(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\nfunction _bezierInterpolation(p1, p2, t, mode) {\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\nconst getLeftToRightAdapter = function() {\n return {\n x(x) {\n return x;\n },\n setWidth(w) {\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) {\n return x;\n },\n };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n let style, original;\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n style.setProperty('direction', direction, 'important');\n ctx.prevTextDirection = original;\n }\n}\nfunction restoreTextDirection(ctx, original) {\n if (original !== undefined) {\n delete ctx.prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: (n, s, e) => n >= Math.min(s, e) && n <= Math.max(e, s),\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n let {start, end, loop} = segment;\n let i, ilen;\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\nfunction _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n if (point.skip) {\n continue;\n }\n value = normalize(point[property]);\n if (value === prevValue) {\n continue;\n }\n inside = between(value, startBound, endBound);\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n return result;\n}\nfunction _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n if (loop && !spanGaps) {\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n while (start < count && points[start].skip) {\n start++;\n }\n start %= count;\n if (loop) {\n end += start;\n }\n while (end > start && points[end % count].skip) {\n end--;\n }\n end %= count;\n return {start, end};\n}\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n return result;\n}\nfunction _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n if (!count) {\n return [];\n }\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n if (spanGaps === true) {\n return splitByStyles([{start, end, loop}], points, segmentOptions);\n }\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\nfunction splitByStyles(segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(segments, points, segmentOptions);\n}\nfunction doSplitByStyles(segments, points, segmentOptions) {\n const count = points.length;\n const result = [];\n let start = segments[0].start;\n let i = start;\n for (const segment of segments) {\n let prevStyle, style;\n let prev = points[start % count];\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext({type: 'segment', p0: prev, p1: pt}));\n if (styleChanged(style, prevStyle)) {\n result.push({start: start, end: i - 1, loop: segment.loop, style: prevStyle});\n prevStyle = style;\n start = i - 1;\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n result.push({start, end: i - 1, loop: segment.loop, style});\n start = i - 1;\n }\n }\n return result;\n}\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\nfunction styleChanged(style, prevStyle) {\n return prevStyle && JSON.stringify(style) !== JSON.stringify(prevStyle);\n}\n\nvar helpers = /*#__PURE__*/Object.freeze({\n__proto__: null,\neasingEffects: effects,\ncolor: color,\ngetHoverColor: getHoverColor,\nnoop: noop,\nuid: uid,\nisNullOrUndef: isNullOrUndef,\nisArray: isArray,\nisObject: isObject,\nisFinite: isNumberFinite,\nfiniteOrDefault: finiteOrDefault,\nvalueOrDefault: valueOrDefault,\ntoPercentage: toPercentage,\ntoDimension: toDimension,\ncallback: callback,\neach: each,\n_elementsEqual: _elementsEqual,\nclone: clone,\n_merger: _merger,\nmerge: merge,\nmergeIf: mergeIf,\n_mergerIf: _mergerIf,\n_deprecated: _deprecated,\nresolveObjectKey: resolveObjectKey,\n_capitalize: _capitalize,\ndefined: defined,\nisFunction: isFunction,\nsetsEqual: setsEqual,\ntoFontString: toFontString,\n_measureText: _measureText,\n_longestText: _longestText,\n_alignPixel: _alignPixel,\nclearCanvas: clearCanvas,\ndrawPoint: drawPoint,\n_isPointInArea: _isPointInArea,\nclipArea: clipArea,\nunclipArea: unclipArea,\n_steppedLineTo: _steppedLineTo,\n_bezierCurveTo: _bezierCurveTo,\nrenderText: renderText,\naddRoundedRectPath: addRoundedRectPath,\n_lookup: _lookup,\n_lookupByKey: _lookupByKey,\n_rlookupByKey: _rlookupByKey,\n_filterBetween: _filterBetween,\nlistenArrayEvents: listenArrayEvents,\nunlistenArrayEvents: unlistenArrayEvents,\n_arrayUnique: _arrayUnique,\n_createResolver: _createResolver,\n_attachContext: _attachContext,\n_descriptors: _descriptors,\nsplineCurve: splineCurve,\nsplineCurveMonotone: splineCurveMonotone,\n_updateBezierControlPoints: _updateBezierControlPoints,\n_getParentNode: _getParentNode,\ngetStyle: getStyle,\ngetRelativePosition: getRelativePosition$1,\ngetMaximumSize: getMaximumSize,\nretinaScale: retinaScale,\nsupportsEventListenerOptions: supportsEventListenerOptions,\nreadUsedSize: readUsedSize,\nfontString: fontString,\nrequestAnimFrame: requestAnimFrame,\nthrottled: throttled,\ndebounce: debounce,\n_toLeftRightCenter: _toLeftRightCenter,\n_alignStartEnd: _alignStartEnd,\n_textX: _textX,\n_pointInLine: _pointInLine,\n_steppedInterpolation: _steppedInterpolation,\n_bezierInterpolation: _bezierInterpolation,\nformatNumber: formatNumber,\ntoLineHeight: toLineHeight,\n_readValueToProps: _readValueToProps,\ntoTRBL: toTRBL,\ntoTRBLCorners: toTRBLCorners,\ntoPadding: toPadding,\ntoFont: toFont,\nresolve: resolve,\n_addGrace: _addGrace,\nPI: PI,\nTAU: TAU,\nPITAU: PITAU,\nINFINITY: INFINITY,\nRAD_PER_DEG: RAD_PER_DEG,\nHALF_PI: HALF_PI,\nQUARTER_PI: QUARTER_PI,\nTWO_THIRDS_PI: TWO_THIRDS_PI,\nlog10: log10,\nsign: sign,\nniceNum: niceNum,\n_factorize: _factorize,\nisNumber: isNumber,\nalmostEquals: almostEquals,\nalmostWhole: almostWhole,\n_setMinAndMaxByKey: _setMinAndMaxByKey,\ntoRadians: toRadians,\ntoDegrees: toDegrees,\n_decimalPlaces: _decimalPlaces,\ngetAngleFromPoint: getAngleFromPoint,\ndistanceBetweenPoints: distanceBetweenPoints,\n_angleDiff: _angleDiff,\n_normalizeAngle: _normalizeAngle,\n_angleBetween: _angleBetween,\n_limitValue: _limitValue,\n_int16Range: _int16Range,\ngetRtlAdapter: getRtlAdapter,\noverrideTextDirection: overrideTextDirection,\nrestoreTextDirection: restoreTextDirection,\n_boundSegment: _boundSegment,\n_boundSegments: _boundSegments,\n_computeSegments: _computeSegments\n});\n\nclass TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n register(item) {\n const me = this;\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n if (isIChartComponent(proto)) {\n parentScope = me.register(proto);\n }\n const items = me.items;\n const id = item.id;\n const scope = me.scope + '.' + id;\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n if (id in items) {\n return scope;\n }\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (me.override) {\n defaults.override(item.id, item.overrides);\n }\n return scope;\n }\n get(id) {\n return this.items[id];\n }\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n if (id in items) {\n delete items[id];\n }\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\nfunction registerDefaults(item, scope, parentScope) {\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n defaults.set(scope, itemDefaults);\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n add(...args) {\n this._each('register', args);\n }\n remove(...args) {\n this._each('unregister', args);\n }\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n _each(method, args, typedRegistry) {\n const me = this;\n [...args].forEach(arg => {\n const reg = typedRegistry || me._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === me.plugins && arg.id)) {\n me._exec(method, reg, arg);\n } else {\n each(arg, item => {\n const itemReg = typedRegistry || me._getRegistryForType(item);\n me._exec(method, itemReg, item);\n });\n }\n });\n }\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n callback(component['before' + camelMethod], [], component);\n registry[method](component);\n callback(component['after' + camelMethod], [], component);\n }\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n return this.plugins;\n }\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n}\nvar registry = new Registry();\n\nclass PluginService {\n constructor() {\n this._init = [];\n }\n notify(chart, hook, args, filter) {\n const me = this;\n if (hook === 'beforeInit') {\n me._init = me._createDescriptors(chart, true);\n me._notify(me._init, chart, 'install');\n }\n const descriptors = filter ? me._descriptors(chart).filter(filter) : me._descriptors(chart);\n const result = me._notify(descriptors, chart, hook, args);\n if (hook === 'destroy') {\n me._notify(descriptors, chart, 'stop');\n me._notify(me._init, chart, 'uninstall');\n }\n return result;\n }\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n return true;\n }\n invalidate() {\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n const descriptors = this._cache = this._createDescriptors(chart);\n this._notifyStateChanges(chart);\n return descriptors;\n }\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\nfunction allPlugins(config) {\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n }\n }\n return plugins;\n}\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\nfunction createDescriptors(chart, plugins, options, all) {\n const result = [];\n const context = chart.getContext();\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, plugin, opts, context)\n });\n }\n return result;\n}\nfunction pluginOpts(config, plugin, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n return config.createResolver(scopes, context, [''], {scriptable: false, indexable: false, allKeys: true});\n}\n\nfunction getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\nfunction determineAxis(id, scaleOptions) {\n if (id === 'x' || id === 'y') {\n return id;\n }\n return scaleOptions.axis || axisFromPosition(scaleOptions.position) || id.charAt(0).toLowerCase();\n}\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const firstIDs = Object.create(null);\n const scales = Object.create(null);\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n const axis = determineAxis(id, scaleConf);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n firstIDs[axis] = firstIDs[axis] || id;\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || firstIDs[axis] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n return scales;\n}\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n initOptions(config);\n return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\nclass Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n get type() {\n return this._config.type;\n }\n set type(type) {\n this._config.type = type;\n }\n get data() {\n return this._config.data;\n }\n set data(data) {\n this._config.data = initData(data);\n }\n get options() {\n return this._config.options;\n }\n set options(options) {\n this._config.options = options;\n }\n get plugins() {\n return this._config.plugins;\n }\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n const scopes = new Set();\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n const array = [...scopes];\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n chartOptionScopes() {\n const {options, type} = this;\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {},\n {type},\n defaults,\n descriptors\n ];\n }\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n for (const prop of names) {\n if ((isScriptable(prop) && isFunction(proxy[prop]))\n || (isIndexable(prop) && isArray(proxy[prop]))) {\n return true;\n }\n }\n return false;\n}\n\nvar version = \"3.3.2\";\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n chart.notifyPlugins('afterRender');\n callback(animationOptions && animationOptions.onComplete, [context], chart);\n}\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callback(animationOptions && animationOptions.onProgress, [context], chart);\n}\nfunction isDomSupported() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\nfunction getCanvas(item) {\n if (isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n item = item[0];\n }\n if (item && item.canvas) {\n item = item.canvas;\n }\n return item;\n}\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\nclass Chart {\n constructor(item, config) {\n const me = this;\n this.config = config = new Config(config);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas can be reused.'\n );\n }\n const options = config.createResolver(config.chartOptionScopes(), me.getContext());\n this.platform = me._initializePlatform(initialCanvas, config);\n const context = me.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this.scale = undefined;\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(() => this.update('resize'), options.resizeDelay || 0);\n instances[me.id] = me;\n if (!context || !canvas) {\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n animator.listen(me, 'complete', onAnimationsComplete);\n animator.listen(me, 'progress', onAnimationProgress);\n me._initialize();\n if (me.attached) {\n me.update();\n }\n }\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n return aspectRatio;\n }\n if (maintainAspectRatio && _aspectRatio) {\n return _aspectRatio;\n }\n return height ? width / height : null;\n }\n get data() {\n return this.config.data;\n }\n set data(data) {\n this.config.data = data;\n }\n get options() {\n return this._options;\n }\n set options(options) {\n this.config.options = options;\n }\n _initialize() {\n const me = this;\n me.notifyPlugins('beforeInit');\n if (me.options.responsive) {\n me.resize();\n } else {\n retinaScale(me, me.options.devicePixelRatio);\n }\n me.bindEvents();\n me.notifyPlugins('afterInit');\n return me;\n }\n _initializePlatform(canvas, config) {\n if (config.platform) {\n return new config.platform();\n } else if (!isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return new BasicPlatform();\n }\n return new DomPlatform();\n }\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n stop() {\n animator.stop(this);\n return this;\n }\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n _resize(width, height) {\n const me = this;\n const options = me.options;\n const canvas = me.canvas;\n const aspectRatio = options.maintainAspectRatio && me.aspectRatio;\n const newSize = me.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || me.platform.getDevicePixelRatio();\n me.width = newSize.width;\n me.height = newSize.height;\n me._aspectRatio = me.aspectRatio;\n if (!retinaScale(me, newRatio, true)) {\n return;\n }\n me.notifyPlugins('resize', {size: newSize});\n callback(options.onResize, [me, newSize], me);\n if (me.attached) {\n if (me._doResize()) {\n me.render();\n }\n }\n }\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n buildOrUpdateScales() {\n const me = this;\n const options = me.options;\n const scaleOpts = options.scales;\n const scales = me.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: me.ctx,\n chart: me\n });\n scales[scale.id] = scale;\n }\n scale.init(scaleOptions, options);\n });\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n each(scales, (scale) => {\n layouts.configure(me, scale, scale.options);\n layouts.addBox(me, scale);\n });\n }\n _updateMetasets() {\n const me = this;\n const metasets = me._metasets;\n const numData = me.data.datasets.length;\n const numMeta = metasets.length;\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n me._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n me._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n _removeUnreferencedMetasets() {\n const me = this;\n const {_metasets: metasets, data: {datasets}} = me;\n if (metasets.length > datasets.length) {\n delete me._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n me._destroyDatasetMeta(index);\n }\n });\n }\n buildOrUpdateControllers() {\n const me = this;\n const newControllers = [];\n const datasets = me.data.datasets;\n let i, ilen;\n me._removeUnreferencedMetasets();\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = me.getDatasetMeta(i);\n const type = dataset.type || me.config.type;\n if (meta.type && meta.type !== type) {\n me._destroyDatasetMeta(i);\n meta = me.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, me.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = me.isDatasetVisible(i);\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass.prototype, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(me, i);\n newControllers.push(meta.controller);\n }\n }\n me._updateMetasets();\n return newControllers;\n }\n _resetElements() {\n const me = this;\n each(me.data.datasets, (dataset, datasetIndex) => {\n me.getDatasetMeta(datasetIndex).controller.reset();\n }, me);\n }\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n update(mode) {\n const me = this;\n const config = me.config;\n config.update();\n me._options = config.createResolver(config.chartOptionScopes(), me.getContext());\n each(me.scales, (scale) => {\n layouts.removeBox(me, scale);\n });\n const animsDisabled = me._animationsDisabled = !me.options.animation;\n me.ensureScalesHaveIDs();\n me.buildOrUpdateScales();\n const existingEvents = new Set(Object.keys(me._listeners));\n const newEvents = new Set(me.options.events);\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== me.options.responsive) {\n me.unbindEvents();\n me.bindEvents();\n }\n me._plugins.invalidate();\n if (me.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n const newControllers = me.buildOrUpdateControllers();\n me.notifyPlugins('beforeElementsUpdate');\n let minPadding = 0;\n for (let i = 0, ilen = me.data.datasets.length; i < ilen; i++) {\n const {controller} = me.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n me._minPadding = minPadding;\n me._updateLayout(minPadding);\n if (!animsDisabled) {\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n me._updateDatasets(mode);\n me.notifyPlugins('afterUpdate', {mode});\n me._layers.sort(compare2Level('z', '_idx'));\n if (me._lastEvent) {\n me._eventHandler(me._lastEvent, true);\n }\n me.render();\n }\n _updateLayout(minPadding) {\n const me = this;\n if (me.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n layouts.update(me, me.width, me.height, minPadding);\n const area = me.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n me._layers = [];\n each(me.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n return;\n }\n if (box.configure) {\n box.configure();\n }\n me._layers.push(...box._layers());\n }, me);\n me._layers.forEach((item, index) => {\n item._idx = index;\n });\n me.notifyPlugins('afterLayout');\n }\n _updateDatasets(mode) {\n const me = this;\n const isFunction = typeof mode === 'function';\n if (me.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n for (let i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me._updateDataset(i, isFunction ? mode({datasetIndex: i}) : mode);\n }\n me.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n _updateDataset(index, mode) {\n const me = this;\n const meta = me.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n if (me.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n meta.controller._update(mode);\n args.cancelable = false;\n me.notifyPlugins('afterDatasetUpdate', args);\n }\n render() {\n const me = this;\n if (me.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n if (animator.has(me)) {\n if (me.attached && !animator.running(me)) {\n animator.start(me);\n }\n } else {\n me.draw();\n onAnimationsComplete({chart: me});\n }\n }\n draw() {\n const me = this;\n let i;\n if (me._resizeBeforeDraw) {\n const {width, height} = me._resizeBeforeDraw;\n me._resize(width, height);\n me._resizeBeforeDraw = null;\n }\n me.clear();\n if (me.width <= 0 || me.height <= 0) {\n return;\n }\n if (me.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n const layers = me._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(me.chartArea);\n }\n me._drawDatasets();\n for (; i < layers.length; ++i) {\n layers[i].draw(me.chartArea);\n }\n me.notifyPlugins('afterDraw');\n }\n _getSortedDatasetMetas(filterVisible) {\n const me = this;\n const metasets = me._sortedMetasets;\n const result = [];\n let i, ilen;\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n return result;\n }\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n _drawDatasets() {\n const me = this;\n if (me.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n const metasets = me.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n me._drawDataset(metasets[i]);\n }\n me.notifyPlugins('afterDatasetsDraw');\n }\n _drawDataset(meta) {\n const me = this;\n const ctx = me.ctx;\n const clip = meta._clip;\n const area = me.chartArea;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n if (me.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n clipArea(ctx, {\n left: clip.left === false ? 0 : area.left - clip.left,\n right: clip.right === false ? me.width : area.right + clip.right,\n top: clip.top === false ? 0 : area.top - clip.top,\n bottom: clip.bottom === false ? me.height : area.bottom + clip.bottom\n });\n meta.controller.draw();\n unclipArea(ctx);\n args.cancelable = false;\n me.notifyPlugins('afterDatasetDraw', args);\n }\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n return [];\n }\n getDatasetMeta(datasetIndex) {\n const me = this;\n const dataset = me.data.datasets[datasetIndex];\n const metasets = me._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n return meta;\n }\n getContext() {\n return this.$context || (this.$context = {chart: this, type: 'chart'});\n }\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n const meta = this.getDatasetMeta(datasetIndex);\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n _updateDatasetVisibility(datasetIndex, visible) {\n const me = this;\n const mode = visible ? 'show' : 'hide';\n const meta = me.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n me.setDatasetVisibility(datasetIndex, visible);\n anims.update(meta, {visible});\n me.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n hide(datasetIndex) {\n this._updateDatasetVisibility(datasetIndex, false);\n }\n show(datasetIndex) {\n this._updateDatasetVisibility(datasetIndex, true);\n }\n _destroyDatasetMeta(datasetIndex) {\n const me = this;\n const meta = me._metasets && me._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n delete me._metasets[datasetIndex];\n }\n }\n destroy() {\n const me = this;\n const {canvas, ctx} = me;\n let i, ilen;\n me.stop();\n animator.remove(me);\n for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me._destroyDatasetMeta(i);\n }\n me.config.clearCache();\n if (canvas) {\n me.unbindEvents();\n clearCanvas(canvas, ctx);\n me.platform.releaseContext(ctx);\n me.canvas = null;\n me.ctx = null;\n }\n me.notifyPlugins('destroy');\n delete instances[me.id];\n }\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n bindUserEvents() {\n const me = this;\n const listeners = me._listeners;\n const platform = me.platform;\n const _add = (type, listener) => {\n platform.addEventListener(me, type, listener);\n listeners[type] = listener;\n };\n const listener = function(e, x, y) {\n e.offsetX = x;\n e.offsetY = y;\n me._eventHandler(e);\n };\n each(me.options.events, (type) => _add(type, listener));\n }\n bindResponsiveEvents() {\n const me = this;\n if (!me._responsiveListeners) {\n me._responsiveListeners = {};\n }\n const listeners = me._responsiveListeners;\n const platform = me.platform;\n const _add = (type, listener) => {\n platform.addEventListener(me, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(me, type, listener);\n delete listeners[type];\n }\n };\n const listener = (width, height) => {\n if (me.canvas) {\n me.resize(width, height);\n }\n };\n let detached;\n const attached = () => {\n _remove('attach', attached);\n me.attached = true;\n me.resize();\n _add('resize', listener);\n _add('detach', detached);\n };\n detached = () => {\n me.attached = false;\n _remove('resize', listener);\n _add('attach', attached);\n };\n if (platform.isAttached(me.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n unbindEvents() {\n const me = this;\n each(me._listeners, (listener, type) => {\n me.platform.removeEventListener(me, type, listener);\n });\n me._listeners = {};\n each(me._responsiveListeners, (listener, type) => {\n me.platform.removeEventListener(me, type, listener);\n });\n me._responsiveListeners = undefined;\n }\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements) {\n const me = this;\n const lastActive = me._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = me.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n if (changed) {\n me._active = active;\n me._updateHoverStyles(active, lastActive);\n }\n }\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n _updateHoverStyles(active, lastActive, replay) {\n const me = this;\n const hoverOptions = me.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n if (deactivated.length) {\n me.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n if (activated.length && hoverOptions.mode) {\n me.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n _eventHandler(e, replay) {\n const me = this;\n const args = {event: e, replay, cancelable: true};\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.type);\n if (me.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n const changed = me._handleEvent(e, replay);\n args.cancelable = false;\n me.notifyPlugins('afterEvent', args, eventFilter);\n if (changed || args.changed) {\n me.render();\n }\n return me;\n }\n _handleEvent(e, replay) {\n const me = this;\n const {_active: lastActive = [], options} = me;\n const hoverOptions = options.hover;\n const useFinalPosition = replay;\n let active = [];\n let changed = false;\n let lastEvent = null;\n if (e.type !== 'mouseout') {\n active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n lastEvent = e.type === 'click' ? me._lastEvent : e;\n }\n me._lastEvent = null;\n if (_isPointInArea(e, me.chartArea, me._minPadding)) {\n callback(options.onHover, [e, active, me], me);\n if (e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu') {\n callback(options.onClick, [e, active, me], me);\n }\n }\n changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n me._active = active;\n me._updateHoverStyles(active, lastActive, replay);\n }\n me._lastEvent = lastEvent;\n return changed;\n }\n}\nconst invalidatePlugins = () => each(Chart.instances, (chart) => chart._plugins.invalidate());\nconst enumerable = true;\nObject.defineProperties(Chart, {\n defaults: {\n enumerable,\n value: defaults\n },\n instances: {\n enumerable,\n value: instances\n },\n overrides: {\n enumerable,\n value: overrides\n },\n registry: {\n enumerable,\n value: registry\n },\n version: {\n enumerable,\n value: version\n },\n getChart: {\n enumerable,\n value: getChart\n },\n register: {\n enumerable,\n value: (...items) => {\n registry.add(...items);\n invalidatePlugins();\n }\n },\n unregister: {\n enumerable,\n value: (...items) => {\n registry.remove(...items);\n invalidatePlugins();\n }\n }\n});\n\nfunction abstract() {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\nclass DateAdapter {\n constructor(options) {\n this.options = options || {};\n }\n formats() {\n return abstract();\n }\n parse(value, format) {\n return abstract();\n }\n format(timestamp, format) {\n return abstract();\n }\n add(timestamp, amount, unit) {\n return abstract();\n }\n diff(a, b, unit) {\n return abstract();\n }\n startOf(timestamp, unit, weekday) {\n return abstract();\n }\n endOf(timestamp, unit) {\n return abstract();\n }\n}\nDateAdapter.override = function(members) {\n Object.assign(DateAdapter.prototype, members);\n};\nvar _adapters = {\n _date: DateAdapter\n};\n\nfunction getAllScaleValues(scale) {\n if (!scale._cache.$bar) {\n const metas = scale.getMatchingVisibleMetas('bar');\n let values = [];\n for (let i = 0, ilen = metas.length; i < ilen; i++) {\n values = values.concat(metas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\nfunction computeMinSampleSize(scale) {\n const values = getAllScaleValues(scale);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n return;\n }\n if (defined(prev)) {\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n return min;\n}\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n size = thickness * stackCount;\n ratio = 1;\n }\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n if (prev === null) {\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n if (next === null) {\n next = curr + curr - prev;\n }\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n item[vScale.axis] = barEnd;\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nclass BarController extends DatasetController {\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = me.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n initialize() {\n const me = this;\n me.enableOptionSharing = true;\n super.initialize();\n const meta = me._cachedMeta;\n meta.stack = me.getDataset().stack;\n }\n update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n me.updateElements(meta.data, 0, meta.data.length, mode);\n }\n updateElements(bars, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const vScale = me._cachedMeta.vScale;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = me._getRuler();\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n for (let i = start; i < start + count; i++) {\n const parsed = me.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : me._calculateBarValuePixels(i);\n const ipixels = me._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (me.index === stack._top || me.index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : undefined,\n width: horizontal ? undefined : ipixels.size\n };\n if (includeOptions) {\n properties.options = sharedOptions || me.resolveDataElementOptions(i, mode);\n }\n me.updateElement(bars[i], i, properties, mode);\n }\n }\n _getStacks(last, dataIndex) {\n const me = this;\n const meta = me._cachedMeta;\n const iScale = meta.iScale;\n const metasets = iScale.getMatchingVisibleMetas(me._type);\n const stacked = iScale.options.stacked;\n const ilen = metasets.length;\n const stacks = [];\n let i, item;\n for (i = 0; i < ilen; ++i) {\n item = metasets[i];\n if (typeof dataIndex !== 'undefined') {\n const val = item.controller.getParsed(dataIndex)[\n item.controller._cachedMeta.vScale.axis\n ];\n if (isNullOrUndef(val) || isNaN(val)) {\n continue;\n }\n }\n if (stacked === false || stacks.indexOf(item.stack) === -1 ||\n\t\t\t\t(stacked === undefined && item.stack === undefined)) {\n stacks.push(item.stack);\n }\n if (item.index === last) {\n break;\n }\n }\n if (!stacks.length) {\n stacks.push(undefined);\n }\n return stacks;\n }\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1;\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n _getRuler() {\n const me = this;\n const opts = me.options;\n const meta = me._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(me.getParsed(i)[iScale.axis], i));\n }\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(iScale);\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: me._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n _calculateBarValuePixels(index) {\n const me = this;\n const {vScale, _stacked} = me._cachedMeta;\n const {base: baseValue, minBarLength} = me.options;\n const parsed = me.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? me.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n if (length !== value) {\n start = length - value;\n length = value;\n }\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n head = base;\n }\n size = head - base;\n if (minBarLength !== undefined && Math.abs(size) < minBarLength) {\n size = size < 0 ? -minBarLength : minBarLength;\n if (value === 0) {\n base -= size / 2;\n }\n head = base + size;\n }\n const actualBase = baseValue || 0;\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = vScale.getLineWidthForValue(actualBase) / 2;\n if (size > 0) {\n base += halfGrid;\n size -= halfGrid;\n } else if (size < 0) {\n base -= halfGrid;\n size += halfGrid;\n }\n }\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n _calculateBarIndexPixels(index, ruler) {\n const me = this;\n const scale = ruler.scale;\n const options = me.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n if (ruler.grouped) {\n const stackCount = skipNull ? me._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount);\n const stackIndex = me._getStackIndex(me.index, me._cachedMeta.stack, skipNull ? index : undefined);\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n center = scale.getPixelForValue(me.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n draw() {\n const me = this;\n const chart = me.chart;\n const meta = me._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n clipArea(chart.ctx, chart.chartArea);\n for (; i < ilen; ++i) {\n if (me.getParsed(i)[vScale.axis] !== null) {\n rects[i].draw(me._ctx);\n }\n }\n unclipArea(chart.ctx);\n }\n}\nBarController.id = 'bar';\nBarController.defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n};\nBarController.overrides = {\n interaction: {\n mode: 'index'\n },\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n};\n\nclass BubbleController extends DatasetController {\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = [];\n let i, ilen, item;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n item = data[i];\n parsed.push({\n x: xScale.parse(resolveObjectKey(item, xAxisKey), i),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), i),\n _custom: item && item.r && +item.r\n });\n }\n return parsed;\n }\n getMaxOverflow() {\n const {data, _parsed} = this._cachedMeta;\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size() / 2, _parsed[i]._custom);\n }\n return max > 0 && max;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const {xScale, yScale} = meta;\n const parsed = me.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n return {\n label: meta.label,\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n update(mode) {\n const me = this;\n const points = me._cachedMeta.data;\n me.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const {iScale, vScale} = me._cachedMeta;\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && me.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n if (includeOptions) {\n properties.options = me.resolveDataElementOptions(i, mode);\n if (reset) {\n properties.options.radius = 0;\n }\n }\n me.updateElement(point, i, properties, mode);\n }\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n return values;\n }\n}\nBubbleController.id = 'bubble';\nBubbleController.defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n};\nBubbleController.overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n },\n plugins: {\n tooltip: {\n callbacks: {\n title() {\n return '';\n }\n }\n }\n }\n};\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\nclass DoughnutController extends DatasetController {\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n linkScales() {}\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = +data[i];\n }\n }\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n const me = this;\n for (let i = 0; i < me.chart.data.datasets.length; ++i) {\n if (me.chart.isDatasetVisible(i)) {\n const controller = me.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n update(mode) {\n const me = this;\n const chart = me.chart;\n const {chartArea} = chart;\n const meta = me._cachedMeta;\n const arcs = meta.data;\n const spacing = me.getMaxBorderWidth() + me.getMaxOffset(arcs);\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(me.options.cutout, maxSize), 1);\n const chartWeight = me._getRingWeight(me.index);\n const {circumference, rotation} = me._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(me.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / me._getVisibleDatasetWeightTotal();\n me.offsetX = offsetX * outerRadius;\n me.offsetY = offsetY * outerRadius;\n meta.total = me.calculateTotal();\n me.outerRadius = outerRadius - radiusLength * me._getRingWeightOffset(me.index);\n me.innerRadius = Math.max(me.outerRadius - radiusLength * chartWeight, 0);\n me.updateElements(arcs, 0, arcs.length, mode);\n }\n _circumference(i, reset) {\n const me = this;\n const opts = me.options;\n const meta = me._cachedMeta;\n const circumference = me._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null) {\n return 0;\n }\n return me.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n updateElements(arcs, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const chart = me.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : me.innerRadius;\n const outerRadius = animateScale ? 0 : me.outerRadius;\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n let startAngle = me._getRotation();\n let i;\n for (i = 0; i < start; ++i) {\n startAngle += me._circumference(i, reset);\n }\n for (i = start; i < start + count; ++i) {\n const circumference = me._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + me.offsetX,\n y: centerY + me.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || me.resolveDataElementOptions(i, mode);\n }\n startAngle += circumference;\n me.updateElement(arc, i, properties, mode);\n }\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i)) {\n total += Math.abs(value);\n }\n }\n return total;\n }\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const chart = me.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n return {\n label: labels[index] || '',\n value,\n };\n }\n getMaxBorderWidth(arcs) {\n const me = this;\n let max = 0;\n const chart = me.chart;\n let i, ilen, meta, controller, options;\n if (!arcs) {\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n if (controller !== me) {\n controller.configure();\n }\n break;\n }\n }\n }\n if (!arcs) {\n return 0;\n }\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n getMaxOffset(arcs) {\n let max = 0;\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n return ringWeightOffset;\n }\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\nDoughnutController.id = 'doughnut';\nDoughnutController.defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth']\n },\n },\n cutout: '50%',\n rotation: 0,\n circumference: 360,\n radius: '100%',\n indexAxis: 'r',\n};\nDoughnutController.overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n lineWidth: style.borderWidth,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n },\n tooltip: {\n callbacks: {\n title() {\n return '';\n },\n label(tooltipItem) {\n let dataLabel = tooltipItem.label;\n const value = ': ' + tooltipItem.formattedValue;\n if (isArray(dataLabel)) {\n dataLabel = dataLabel.slice();\n dataLabel[0] += value;\n } else {\n dataLabel += value;\n }\n return dataLabel;\n }\n }\n }\n }\n};\n\nclass LineController extends DatasetController {\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n const animationsDisabled = me.chart._animationsDisabled;\n let {start, count} = getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n me._drawStart = start;\n me._drawCount = count;\n if (scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = me.resolveDatasetElementOptions(mode);\n if (!me.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = me.options.segment;\n me.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n me.updateElements(points, start, count, mode);\n }\n updateElements(points, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked} = me._cachedMeta;\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const spanGaps = me.options.spanGaps;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = me.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && me.getParsed(start - 1);\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = me.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? me.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n properties.parsed = parsed;\n if (includeOptions) {\n properties.options = sharedOptions || me.resolveDataElementOptions(i, mode);\n }\n if (!directUpdate) {\n me.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n getMaxOverflow() {\n const me = this;\n const meta = me._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(me.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(me.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\nLineController.id = 'line';\nLineController.defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n showLine: true,\n spanGaps: false,\n};\nLineController.overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n};\nfunction getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n const pointCount = points.length;\n let start = 0;\n let count = pointCount;\n if (meta._sorted) {\n const {iScale, _parsed} = meta;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(Math.min(\n _lookupByKey(_parsed, iScale.axis, min).lo,\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo),\n 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(Math.max(\n _lookupByKey(_parsed, iScale.axis, max).hi + 1,\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max)).hi + 1),\n start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n return {start, count};\n}\nfunction scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n\nclass PolarAreaController extends DatasetController {\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const chart = me.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n return {\n label: labels[index] || '',\n value,\n };\n }\n update(mode) {\n const arcs = this._cachedMeta.data;\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n _updateRadius() {\n const me = this;\n const chart = me.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n me.outerRadius = outerRadius - (radiusLength * me.index);\n me.innerRadius = me.outerRadius - radiusLength;\n }\n updateElements(arcs, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const chart = me.chart;\n const dataset = me.getDataset();\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = me._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n const defaultAngle = 360 / me.countVisibleElements();\n for (i = 0; i < start; ++i) {\n angle += me._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + me._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(dataset.data[i]) : 0;\n angle = endAngle;\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: me.resolveDataElementOptions(i, mode)\n };\n me.updateElement(arc, i, properties, mode);\n }\n }\n countVisibleElements() {\n const dataset = this.getDataset();\n const meta = this._cachedMeta;\n let count = 0;\n meta.data.forEach((element, index) => {\n if (!isNaN(dataset.data[index]) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n return count;\n }\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\nPolarAreaController.id = 'polarArea';\nPolarAreaController.defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n};\nPolarAreaController.overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n lineWidth: style.borderWidth,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n },\n tooltip: {\n callbacks: {\n title() {\n return '';\n },\n label(context) {\n return context.chart.data.labels[context.dataIndex] + ': ' + context.formattedValue;\n }\n }\n }\n },\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n};\n\nclass PieController extends DoughnutController {\n}\nPieController.id = 'pie';\nPieController.defaults = {\n cutout: 0,\n rotation: 0,\n circumference: 360,\n radius: '100%'\n};\n\nclass RadarController extends DatasetController {\n getLabelAndValue(index) {\n const me = this;\n const vScale = me._cachedMeta.vScale;\n const parsed = me.getParsed(index);\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n line.points = points;\n if (mode !== 'resize') {\n const options = me.resolveDatasetElementOptions(mode);\n if (!me.options.showLine) {\n options.borderWidth = 0;\n }\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n me.updateElement(line, undefined, properties, mode);\n }\n me.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const me = this;\n const dataset = me.getDataset();\n const scale = me._cachedMeta.rScale;\n const reset = mode === 'reset';\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = me.resolveDataElementOptions(i, mode);\n const pointPosition = scale.getPointPositionForValue(i, dataset.data[i]);\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n me.updateElement(point, i, properties, mode);\n }\n }\n}\nRadarController.id = 'radar';\nRadarController.defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n};\nRadarController.overrides = {\n aspectRatio: 1,\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n};\n\nclass ScatterController extends LineController {\n}\nScatterController.id = 'scatter';\nScatterController.defaults = {\n showLine: false,\n fill: false\n};\nScatterController.overrides = {\n interaction: {\n mode: 'point'\n },\n plugins: {\n tooltip: {\n callbacks: {\n title() {\n return '';\n },\n label(item) {\n return '(' + item.label + ', ' + item.formattedValue + ')';\n }\n }\n }\n },\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n};\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPolarAreaController: PolarAreaController,\nPieController: PieController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\nfunction clipArc(ctx, element, endAngle) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\nfunction parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\nfunction rThetaToXY(r, theta, x, y) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\nfunction pathArc(ctx, element, offset, end) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n const outerRadius = Math.max(element.outerRadius + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + offset + pixelMargin : 0;\n const alpha = end - start;\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset;\n const endAngle = end - angleOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerEndAdjustedAngle);\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), startAngle + (innerStart / innerRadius), true);\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n ctx.closePath();\n}\nfunction drawArc(ctx, element, offset) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, startAngle + TAU);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + circumference % TAU;\n if (circumference % TAU === 0) {\n endAngle += TAU;\n }\n }\n }\n pathArc(ctx, element, offset, endAngle);\n ctx.fill();\n return endAngle;\n}\nfunction drawFullCircleBorders(ctx, element, inner) {\n const {x, y, startAngle, pixelMargin, fullCircles} = element;\n const outerRadius = Math.max(element.outerRadius - pixelMargin, 0);\n const innerRadius = element.innerRadius + pixelMargin;\n let i;\n if (inner) {\n clipArc(ctx, element, startAngle + TAU);\n }\n ctx.beginPath();\n ctx.arc(x, y, innerRadius, startAngle + TAU, startAngle, true);\n for (i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle, startAngle + TAU);\n for (i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n}\nfunction drawBorder(ctx, element, offset, endAngle) {\n const {options} = element;\n const inner = options.borderAlign === 'inner';\n if (!options.borderWidth) {\n return;\n }\n if (inner) {\n ctx.lineWidth = options.borderWidth * 2;\n ctx.lineJoin = 'round';\n } else {\n ctx.lineWidth = options.borderWidth;\n ctx.lineJoin = 'bevel';\n }\n if (element.fullCircles) {\n drawFullCircleBorders(ctx, element, inner);\n }\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n pathArc(ctx, element, offset, endAngle);\n ctx.stroke();\n}\nclass ArcElement extends Element {\n constructor(cfg) {\n super();\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(chartX, chartY, useFinalPosition) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const betweenAngles = circumference >= TAU || _angleBetween(angle, startAngle, endAngle);\n const withinRadius = (distance >= innerRadius && distance <= outerRadius);\n return (betweenAngles && withinRadius);\n }\n getCenterPoint(useFinalPosition) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n tooltipPosition(useFinalPosition) {\n return this.getCenterPoint(useFinalPosition);\n }\n draw(ctx) {\n const me = this;\n const {options, circumference} = me;\n const offset = (options.offset || 0) / 2;\n me.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n me.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n if (circumference === 0 || me.innerRadius < 0 || me.outerRadius < 0) {\n return;\n }\n ctx.save();\n let radiusOffset = 0;\n if (offset) {\n radiusOffset = offset / 2;\n const halfAngle = (me.startAngle + me.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * radiusOffset, Math.sin(halfAngle) * radiusOffset);\n if (me.circumference >= PI) {\n radiusOffset = offset;\n }\n }\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n const endAngle = drawArc(ctx, me, radiusOffset);\n drawBorder(ctx, me, radiusOffset, endAngle);\n ctx.restore();\n }\n}\nArcElement.id = 'arc';\nArcElement.defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n angle: undefined,\n};\nArcElement.defaultRoutes = {\n backgroundColor: 'backgroundColor'\n};\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n let {move = true, reverse} = params || {};\n let i, point, prev;\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n if (point.skip) {\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n prev = point;\n }\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n return !!loop;\n}\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n ctx.lineTo(avgX, lastY);\n }\n };\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n if (point.skip) {\n continue;\n }\n const x = point.x;\n const y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n ctx.lineTo(x, y);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n lastY = y;\n }\n drawX();\n}\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n if (usePath2D && line.segments.length === 1) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\nclass LineElement extends Element {\n constructor(cfg) {\n super();\n this.animated = true;\n this.options = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n updateControlPoints(chartArea, indexAxis) {\n const me = this;\n const options = me.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !me._pointsUpdated) {\n const loop = options.spanGaps ? me._loop : me._fullLoop;\n _updateBezierControlPoints(me._points, options, chartArea, loop, indexAxis);\n me._pointsUpdated = true;\n }\n }\n set points(points) {\n const me = this;\n me._points = points;\n delete me._segments;\n delete me._path;\n me._pointsUpdated = false;\n }\n get points() {\n return this._points;\n }\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n interpolate(point, property) {\n const me = this;\n const options = me.options;\n const value = point[property];\n const points = me.points;\n const segments = _boundSegments(me, {property, start: value, end: value});\n if (!segments.length) {\n return;\n }\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n path(ctx, start, count) {\n const me = this;\n const segments = me.segments;\n const segmentMethod = _getSegmentMethod(me);\n let loop = me._loop;\n start = start || 0;\n count = count || (me.points.length - start);\n for (const segment of segments) {\n loop &= segmentMethod(ctx, me, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n draw(ctx, chartArea, start, count) {\n const me = this;\n const options = me.options || {};\n const points = me.points || [];\n if (!points.length || !options.borderWidth) {\n return;\n }\n ctx.save();\n draw(ctx, me, start, count);\n ctx.restore();\n if (me.animated) {\n me._pointsUpdated = false;\n me._path = undefined;\n }\n }\n}\nLineElement.id = 'line';\nLineElement.defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n};\nLineElement.defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n};\nLineElement.descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n};\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\nclass PointElement extends Element {\n constructor(cfg) {\n super();\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange$1(this, mouseX, 'x', useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange$1(this, mouseY, 'y', useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n size(options) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n draw(ctx) {\n const me = this;\n const options = me.options;\n if (me.skip || options.radius < 0.1) {\n return;\n }\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, me.x, me.y);\n }\n getRange() {\n const options = this.options || {};\n return options.radius + options.hitRadius;\n }\n}\nPointElement.id = 'point';\nPointElement.defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n};\nPointElement.defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n};\n\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition);\n let left, right, top, bottom, half;\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n return {left, top, right, bottom};\n}\nfunction parseBorderSkipped(bar) {\n let edge = bar.options.borderSkipped;\n const res = {};\n if (!edge) {\n return res;\n }\n edge = bar.horizontal\n ? parseEdge(edge, 'left', 'right', bar.base > bar.x)\n : parseEdge(edge, 'bottom', 'top', bar.base < bar.y);\n res[edge] = true;\n return res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : Math.max(Math.min(value, max), min);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = parseBorderSkipped(bar);\n const o = toTRBL(value);\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = parseBorderSkipped(bar);\n const enableBorder = enableBorderRadius || isObject(value);\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n return bounds\n\t\t&& (skipX || x >= bounds.left && x <= bounds.right)\n\t\t&& (skipY || y >= bounds.top && y <= bounds.bottom);\n}\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nclass BarElement extends Element {\n constructor(cfg) {\n super();\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n draw(ctx) {\n const options = this.options;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n ctx.save();\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, outer);\n ctx.clip();\n addRectPath(ctx, inner);\n ctx.fillStyle = options.borderColor;\n ctx.fill('evenodd');\n }\n ctx.beginPath();\n addRectPath(ctx, inner);\n ctx.fillStyle = options.backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition);\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\nBarElement.id = 'bar';\nBarElement.defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n enableBorderRadius: true,\n pointStyle: undefined\n};\nBarElement.defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n};\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nLineElement: LineElement,\nPointElement: PointElement,\nBarElement: BarElement\n});\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n const samples = options.samples || availableWidth;\n if (samples >= count) {\n return data.slice(start, start + count);\n }\n const decimated = [];\n const bucketWidth = (count - 2) / (samples - 2);\n let sampledIndex = 0;\n const endIndex = start + count - 1;\n let a = start;\n let i, maxAreaPoint, maxArea, area, nextA;\n decimated[sampledIndex++] = data[a];\n for (i = 0; i < samples - 2; i++) {\n let avgX = 0;\n let avgY = 0;\n let j;\n const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n for (j = avgRangeStart; j < avgRangeEnd; j++) {\n avgX += data[j].x;\n avgY += data[j].y;\n }\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n const rangeTo = Math.floor((i + 1) * bucketWidth) + 1 + start;\n const {x: pointAx, y: pointAy} = data[a];\n maxArea = area = -1;\n for (j = rangeOffs; j < rangeTo; j++) {\n area = 0.5 * Math.abs(\n (pointAx - avgX) * (data[j].y - pointAy) -\n (pointAx - data[j].x) * (avgY - pointAy)\n );\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n decimated[sampledIndex++] = maxAreaPoint;\n a = nextA;\n }\n decimated[sampledIndex++] = data[endIndex];\n return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n let avgX = 0;\n let countX = 0;\n let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n const decimated = [];\n const endIndex = start + count - 1;\n const xMin = data[start].x;\n const xMax = data[endIndex].x;\n const dx = xMax - xMin;\n for (i = start; i < start + count; ++i) {\n point = data[i];\n x = (point.x - xMin) / dx * availableWidth;\n y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n minIndex = i;\n } else if (y > maxY) {\n maxY = y;\n maxIndex = i;\n }\n avgX = (countX * avgX + point.x) / ++countX;\n } else {\n const lastIndex = i - 1;\n if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n const intermediateIndex1 = Math.min(minIndex, maxIndex);\n const intermediateIndex2 = Math.max(minIndex, maxIndex);\n if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex1],\n x: avgX,\n });\n }\n if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex2],\n x: avgX\n });\n }\n }\n if (i > 0 && lastIndex !== startIndex) {\n decimated.push(data[lastIndex]);\n }\n decimated.push(point);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n minIndex = maxIndex = startIndex = i;\n }\n }\n return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n if (dataset._decimated) {\n const data = dataset._data;\n delete dataset._decimated;\n delete dataset._data;\n Object.defineProperty(dataset, 'data', {value: data});\n }\n}\nfunction cleanDecimatedData(chart) {\n chart.data.datasets.forEach((dataset) => {\n cleanDecimatedDataset(dataset);\n });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n const pointCount = points.length;\n let start = 0;\n let count;\n const {iScale} = meta;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n return {start, count};\n}\nvar plugin_decimation = {\n id: 'decimation',\n defaults: {\n algorithm: 'min-max',\n enabled: false,\n },\n beforeElementsUpdate: (chart, args, options) => {\n if (!options.enabled) {\n cleanDecimatedData(chart);\n return;\n }\n const availableWidth = chart.width;\n chart.data.datasets.forEach((dataset, datasetIndex) => {\n const {_data, indexAxis} = dataset;\n const meta = chart.getDatasetMeta(datasetIndex);\n const data = _data || dataset.data;\n if (resolve([indexAxis, chart.options.indexAxis]) === 'y') {\n return;\n }\n if (meta.type !== 'line') {\n return;\n }\n const xAxis = chart.scales[meta.xAxisID];\n if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n return;\n }\n if (chart.options.parsing) {\n return;\n }\n let {start, count} = getStartAndCountOfVisiblePointsSimplified(meta, data);\n if (count <= 4 * availableWidth) {\n cleanDecimatedDataset(dataset);\n return;\n }\n if (isNullOrUndef(_data)) {\n dataset._data = data;\n delete dataset.data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this._decimated;\n },\n set: function(d) {\n this._data = d;\n }\n });\n }\n let decimated;\n switch (options.algorithm) {\n case 'lttb':\n decimated = lttbDecimation(data, start, count, availableWidth, options);\n break;\n case 'min-max':\n decimated = minMaxDecimation(data, start, count, availableWidth);\n break;\n default:\n throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n }\n dataset._decimated = decimated;\n });\n },\n destroy(chart) {\n cleanDecimatedData(chart);\n }\n};\n\nfunction getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\nfunction parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n if (fill === false || fill === null) {\n return false;\n }\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\nfunction decodeFill(line, index, count) {\n const fill = parseFillOption(line);\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n let target = parseFloat(fill);\n if (isNumberFinite(target) && Math.floor(target) === target) {\n if (fill[0] === '-' || fill[0] === '+') {\n target = index + target;\n }\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n return target;\n }\n return ['origin', 'start', 'end', 'stack'].indexOf(fill) >= 0 && fill;\n}\nfunction computeLinearBoundary(source) {\n const {scale = {}, fill} = source;\n let target = null;\n let horizontal;\n if (fill === 'start') {\n target = scale.bottom;\n } else if (fill === 'end') {\n target = scale.top;\n } else if (isObject(fill)) {\n target = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n target = scale.getBasePixel();\n }\n if (isNumberFinite(target)) {\n horizontal = scale.isHorizontal();\n return {\n x: horizontal ? target : null,\n y: horizontal ? null : target\n };\n }\n return null;\n}\nclass simpleArc {\n constructor(opts) {\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n pathSegment(ctx, bounds, opts) {\n const {x, y, radius} = this;\n bounds = bounds || {start: 0, end: TAU};\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n interpolate(point) {\n const {x, y, radius} = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\nfunction computeCircularBoundary(source) {\n const {scale, fill} = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const target = [];\n const start = options.reverse ? scale.max : scale.min;\n const end = options.reverse ? scale.min : scale.max;\n let i, center, value;\n if (fill === 'start') {\n value = start;\n } else if (fill === 'end') {\n value = end;\n } else if (isObject(fill)) {\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n if (options.grid.circular) {\n center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n for (i = 0; i < length; ++i) {\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\nfunction pointsFromSegments(boundary, line) {\n const {x = null, y = null} = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach((segment) => {\n const first = linePoints[segment.start];\n const last = linePoints[segment.end];\n if (y !== null) {\n points.push({x: first.x, y});\n points.push({x: last.x, y});\n } else if (x !== null) {\n points.push({x, y: first.y});\n points.push({x, y: last.y});\n }\n });\n return points;\n}\nfunction buildStackLine(source) {\n const {chart, scale, index, line} = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(chart, index);\n linesBelow.push(createBoundaryLine({x: null, y: scale.bottom}, line));\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n for (let j = segment.start; j <= segment.end; j++) {\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({points, options: {}});\n}\nconst isLineAndNotInHideAnimation = (meta) => meta.type === 'line' && !meta.hidden;\nfunction getLinesBelow(chart, index) {\n const below = [];\n const metas = chart.getSortedVisibleDatasetMetas();\n for (let i = 0; i < metas.length; i++) {\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (isLineAndNotInHideAnimation(meta)) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for (let j = 0; j < linesBelow.length; j++) {\n const line = linesBelow[j];\n const {first, last, point} = findPoint(line, sourcePoint, 'x');\n if (!point || (first && last)) {\n continue;\n }\n if (first) {\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n break;\n }\n }\n }\n points.push(...postponed);\n}\nfunction findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (pointValue >= firstValue && pointValue <= lastValue) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {first, last, point};\n}\nfunction getTarget(source) {\n const {chart, fill, line} = source;\n if (isNumberFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n if (fill === 'stack') {\n return buildStackLine(source);\n }\n const boundary = computeBoundary(source);\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n return createBoundaryLine(boundary, line);\n}\nfunction createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n if (isArray(boundary)) {\n _loop = true;\n points = boundary;\n } else {\n points = pointsFromSegments(boundary, line);\n }\n return points.length ? new LineElement({\n points,\n options: {tension: 0},\n _loop,\n _fullLoop: _loop\n }) : null;\n}\nfunction resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [index];\n let target;\n if (!propagate) {\n return fill;\n }\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isNumberFinite(fill)) {\n return fill;\n }\n target = sources[fill];\n if (!target) {\n return false;\n }\n if (target.visible) {\n return fill;\n }\n visited.push(fill);\n fill = target.fill;\n }\n return false;\n}\nfunction _clip(ctx, target, clipY) {\n ctx.beginPath();\n target.path(ctx);\n ctx.lineTo(target.last().x, clipY);\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\nfunction getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {property, start, end};\n}\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\nfunction _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n for (const segment of segments) {\n const bounds = getBounds(property, points[segment.start], points[segment.end], segment.loop);\n if (!target.segments) {\n parts.push({\n source: segment,\n target: bounds,\n start: points[segment.start],\n end: points[segment.end]\n });\n continue;\n }\n const targetSegments = _boundSegments(target, bounds);\n for (const tgt of targetSegments) {\n const subBounds = getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n for (const fillSource of fillSources) {\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\nfunction clipBounds(ctx, scale, bounds) {\n const {top, bottom} = scale.chart.chartArea;\n const {property, start, end} = bounds || {};\n if (property === 'x') {\n ctx.beginPath();\n ctx.rect(start, top, end - start, bottom - top);\n ctx.clip();\n }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\nfunction _fill(ctx, cfg) {\n const {line, target, property, color, scale} = cfg;\n const segments = _segments(line, target, property);\n for (const {source: src, target: tgt, start, end} of segments) {\n const {style: {backgroundColor = color} = {}} = src;\n ctx.save();\n ctx.fillStyle = backgroundColor;\n clipBounds(ctx, scale, getBounds(property, start, end));\n ctx.beginPath();\n const lineLoop = !!line.pathSegment(ctx, src);\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n const loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n ctx.restore();\n }\n}\nfunction doFill(ctx, cfg) {\n const {line, target, above, below, area, scale} = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n ctx.save();\n if (property === 'x' && below !== above) {\n _clip(ctx, target, area.top);\n _fill(ctx, {line, target, color: above, scale, property});\n ctx.restore();\n ctx.save();\n _clip(ctx, target, area.bottom);\n }\n _fill(ctx, {line, target, color: below, scale, property});\n ctx.restore();\n}\nfunction drawfill(ctx, source, area) {\n const target = getTarget(source);\n const {line, scale, axis} = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const {above = color, below = color} = fillOption || {};\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {line, target, above, below, area, scale, axis});\n unclipArea(ctx);\n }\n}\nvar plugin_filler = {\n id: 'filler',\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line,\n };\n }\n meta.$filler = source;\n sources.push(source);\n }\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n source.fill = resolveTarget(sources, i, options.propagate);\n }\n },\n beforeDraw(chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n source.line.updateControlPoints(area, source.axis);\n if (draw) {\n drawfill(chart.ctx, source, area);\n }\n }\n },\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (source) {\n drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n if (!source || source.fill === false || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n drawfill(chart.ctx, source, chart.chartArea);\n },\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = Math.min(boxWidth, fontSize);\n }\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n constructor(config) {\n super();\n this._added = false;\n this.legendHitBoxes = [];\n this._hoveredItem = null;\n this.doughnutMode = false;\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight, margins) {\n const me = this;\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me._margins = margins;\n me.setDimensions();\n me.buildLabels();\n me.fit();\n }\n setDimensions() {\n const me = this;\n if (me.isHorizontal()) {\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n me.top = 0;\n me.bottom = me.height;\n }\n }\n buildLabels() {\n const me = this;\n const labelOpts = me.options.labels || {};\n let legendItems = callback(labelOpts.generateLabels, [me.chart], me) || [];\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, me.chart.data));\n }\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, me.chart.data));\n }\n if (me.options.reverse) {\n legendItems.reverse();\n }\n me.legendItems = legendItems;\n }\n fit() {\n const me = this;\n const {options, ctx} = me;\n if (!options.display) {\n me.width = me.height = 0;\n return;\n }\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = me._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n let width, height;\n ctx.font = labelFont.string;\n if (me.isHorizontal()) {\n width = me.maxWidth;\n height = me._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = me.maxHeight;\n width = me._fitCols(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n }\n me.width = Math.min(width, options.maxWidth || me.maxWidth);\n me.height = Math.min(height, options.maxHeight || me.maxHeight);\n }\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const me = this;\n const {ctx, maxWidth, options: {labels: {padding}}} = me;\n const hitboxes = me.legendHitBoxes = [];\n const lineWidths = me.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n let row = -1;\n let top = -lineHeight;\n me.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n return totalHeight;\n }\n _fitCols(titleHeight, fontSize, boxWidth, itemHeight) {\n const me = this;\n const {ctx, maxHeight, options: {labels: {padding}}} = me;\n const hitboxes = me.legendHitBoxes = [];\n const columnSizes = me.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n let left = 0;\n let top = 0;\n let col = 0;\n me.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n if (i > 0 && currentColHeight + fontSize + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight});\n left += currentColWidth + padding;\n col++;\n top = 0;\n currentColWidth = currentColHeight = 0;\n }\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += fontSize + padding;\n hitboxes[i] = {left, top, col, width: itemWidth, height: itemHeight};\n top += itemHeight + padding;\n });\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight});\n return totalWidth;\n }\n adjustHitBoxes() {\n const me = this;\n if (!me.options.display) {\n return;\n }\n const titleHeight = me._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}}} = me;\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, me.left + padding, me.right - me.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, me.left + padding, me.right - me.lineWidths[row]);\n }\n hitbox.top += me.top + titleHeight + padding;\n hitbox.left = left;\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - me.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - me.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += me.left + padding;\n top += hitbox.height + padding;\n }\n }\n }\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n draw() {\n const me = this;\n if (me.options.display) {\n const ctx = me.ctx;\n clipArea(ctx, me);\n me._draw();\n unclipArea(ctx);\n }\n }\n _draw() {\n const me = this;\n const {options: opts, columnSizes, lineWidths, ctx} = me;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, me.left, me.width);\n const labelFont = toFont(labelOpts.font);\n const {color: fontColor, padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n me.drawTitle();\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n ctx.save();\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n if (labelOpts.usePointStyle) {\n const drawOptions = {\n radius: boxWidth * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n ctx.beginPath();\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n ctx.restore();\n };\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: legendItem.textAlign\n });\n };\n const isHorizontal = me.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, me.left + padding, me.right - lineWidths[0]),\n y: me.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: me.left + padding,\n y: _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - columnSizes[0].height),\n line: 0\n };\n }\n overrideTextDirection(me.ctx, opts.textDirection);\n const lineHeight = itemHeight + padding;\n me.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor || fontColor;\n ctx.fillStyle = legendItem.fontColor || fontColor;\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + (fontSize / 2) + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n rtlHelper.setWidth(me.width);\n if (isHorizontal) {\n if (i > 0 && x + width + padding > me.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, me.left + padding, me.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > me.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - columnSizes[cursor.line].height);\n }\n const realX = rtlHelper.x(x);\n drawLegendBox(realX, y, legendItem);\n x = _textX(textAlign, x + boxWidth + halfFontSize, me.right);\n fillText(rtlHelper.x(x), y, legendItem);\n if (isHorizontal) {\n cursor.x += width + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n restoreTextDirection(me.ctx, opts.textDirection);\n }\n drawTitle() {\n const me = this;\n const opts = me.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n if (!titleOpts.display) {\n return;\n }\n const rtlHelper = getRtlAdapter(opts.rtl, me.left, me.width);\n const ctx = me.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n let left = me.left;\n let maxWidth = me.width;\n if (this.isHorizontal()) {\n maxWidth = Math.max(...me.lineWidths);\n y = me.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, me.right - maxWidth);\n } else {\n const maxHeight = me.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, me.top, me.bottom - maxHeight - opts.labels.padding - me._computeTitleHeight());\n }\n const x = _alignStartEnd(position, left, left + maxWidth);\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n _getLegendItemAt(x, y) {\n const me = this;\n let i, hitBox, lh;\n if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n lh = me.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n return me.legendItems[i];\n }\n }\n }\n return null;\n }\n handleEvent(e) {\n const me = this;\n const opts = me.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n const hoveredItem = me._getLegendItemAt(e.x, e.y);\n if (e.type === 'mousemove') {\n const previous = me._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n callback(opts.onLeave, [e, previous, me], me);\n }\n me._hoveredItem = hoveredItem;\n if (hoveredItem && !sameItem) {\n callback(opts.onHover, [e, hoveredItem, me], me);\n }\n } else if (hoveredItem) {\n callback(opts.onClick, [e, hoveredItem, me], me);\n }\n }\n}\nfunction isListened(type, opts) {\n if (type === 'mousemove' && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\nvar plugin_legend = {\n id: 'legend',\n _element: Legend,\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n onHover: null,\n onLeave: null,\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color}} = chart.legend.options;\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: 0,\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n\nclass Title extends Element {\n constructor(config) {\n super();\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this._padding = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight) {\n const me = this;\n const opts = me.options;\n me.left = 0;\n me.top = 0;\n if (!opts.display) {\n me.width = me.height = me.right = me.bottom = 0;\n return;\n }\n me.width = me.right = maxWidth;\n me.height = me.bottom = maxHeight;\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n me._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + me._padding.height;\n if (me.isHorizontal()) {\n me.height = textSize;\n } else {\n me.width = textSize;\n }\n }\n isHorizontal() {\n const pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n }\n _drawArgs(offset) {\n const {top, left, bottom, right, options} = this;\n const align = options.align;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n if (this.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n if (options.position === 'left') {\n titleX = left + offset;\n titleY = _alignStartEnd(align, bottom, top);\n rotation = PI * -0.5;\n } else {\n titleX = right - offset;\n titleY = _alignStartEnd(align, top, bottom);\n rotation = PI * 0.5;\n }\n maxWidth = bottom - top;\n }\n return {titleX, titleY, maxWidth, rotation};\n }\n draw() {\n const me = this;\n const ctx = me.ctx;\n const opts = me.options;\n if (!opts.display) {\n return;\n }\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + me._padding.top;\n const {titleX, titleY, maxWidth, rotation} = me._drawArgs(offset);\n renderText(ctx, opts.text, 0, 0, fontOpts, {\n color: opts.color,\n maxWidth,\n rotation,\n textAlign: _toLeftRightCenter(opts.align),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n}\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\nvar plugin_title = {\n id: 'title',\n _element: Title,\n start(chart, _args, options) {\n createTitle(chart, options);\n },\n stop(chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n beforeUpdate(chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'bold',\n },\n fullSize: true,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n\nconst positioners = {\n average(items) {\n if (!items.length) {\n return false;\n }\n let i, len;\n let x = 0;\n let y = 0;\n let count = 0;\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n x += pos.x;\n y += pos.y;\n ++count;\n }\n }\n return {\n x: x / count,\n y: y / count\n };\n },\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n return {\n x,\n y\n };\n }\n};\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n return base;\n}\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip._chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n ctx.save();\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n widthPadding = options.displayColors ? (boxWidth + 2) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n widthPadding = 0;\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n ctx.restore();\n width += padding.width;\n return {width, height};\n}\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n return xAlign;\n}\nfunction determineAlignment(chart, options, size) {\n const yAlign = options.yAlign || determineYAlign(chart, size);\n return {\n xAlign: options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const radiusAndPadding = cornerRadius + caretPadding;\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= radiusAndPadding;\n } else if (xAlign === 'right') {\n x += radiusAndPadding;\n }\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return Object.assign(Object.create(parent), {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\nclass Tooltip extends Element {\n constructor(config) {\n super();\n this.opacity = 0;\n this._active = [];\n this._chart = config._chart;\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n _resolveAnimations() {\n const me = this;\n const cached = me._cachedAnimations;\n if (cached) {\n return cached;\n }\n const chart = me._chart;\n const options = me.options.setContext(me.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(me._chart, opts);\n if (opts._cacheable) {\n me._cachedAnimations = Object.freeze(animations);\n }\n return animations;\n }\n getContext() {\n const me = this;\n return me.$context ||\n\t\t\t(me.$context = createTooltipContext(me._chart.getContext(), me, me._tooltipItems));\n }\n getTitle(context, options) {\n const me = this;\n const {callbacks} = options;\n const beforeTitle = callbacks.beforeTitle.apply(me, [context]);\n const title = callbacks.title.apply(me, [context]);\n const afterTitle = callbacks.afterTitle.apply(me, [context]);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n return lines;\n }\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(options.callbacks.beforeBody.apply(this, [tooltipItems]));\n }\n getBody(tooltipItems, options) {\n const me = this;\n const {callbacks} = options;\n const bodyItems = [];\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(scoped.beforeLabel.call(me, context)));\n pushOrConcat(bodyItem.lines, scoped.label.call(me, context));\n pushOrConcat(bodyItem.after, splitNewlines(scoped.afterLabel.call(me, context)));\n bodyItems.push(bodyItem);\n });\n return bodyItems;\n }\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(options.callbacks.afterBody.apply(this, [tooltipItems]));\n }\n getFooter(tooltipItems, options) {\n const me = this;\n const {callbacks} = options;\n const beforeFooter = callbacks.beforeFooter.apply(me, [tooltipItems]);\n const footer = callbacks.footer.apply(me, [tooltipItems]);\n const afterFooter = callbacks.afterFooter.apply(me, [tooltipItems]);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n return lines;\n }\n _createItems(options) {\n const me = this;\n const active = me._active;\n const data = me._chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(me._chart, active[i]));\n }\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(scoped.labelColor.call(me, context));\n labelPointStyles.push(scoped.labelPointStyle.call(me, context));\n labelTextColors.push(scoped.labelTextColor.call(me, context));\n });\n me.labelColors = labelColors;\n me.labelPointStyles = labelPointStyles;\n me.labelTextColors = labelTextColors;\n me.dataPoints = tooltipItems;\n return tooltipItems;\n }\n update(changed, replay) {\n const me = this;\n const options = me.options.setContext(me.getContext());\n const active = me._active;\n let properties;\n let tooltipItems = [];\n if (!active.length) {\n if (me.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(me, active, me._eventPosition);\n tooltipItems = me._createItems(options);\n me.title = me.getTitle(tooltipItems, options);\n me.beforeBody = me.getBeforeBody(tooltipItems, options);\n me.body = me.getBody(tooltipItems, options);\n me.afterBody = me.getAfterBody(tooltipItems, options);\n me.footer = me.getFooter(tooltipItems, options);\n const size = me._size = getTooltipSize(me, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(me._chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, me._chart);\n me.xAlign = alignment.xAlign;\n me.yAlign = alignment.yAlign;\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n me._tooltipItems = tooltipItems;\n me.$context = undefined;\n if (properties) {\n me._resolveAnimations().update(me, properties);\n }\n if (changed && options.external) {\n options.external.call(me, {chart: me._chart, tooltip: me, replay});\n }\n }\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {cornerRadius, caretSize} = options;\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + cornerRadius + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - cornerRadius - caretSize;\n } else {\n x2 = this.caretX;\n }\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n drawTitle(pt, ctx, options) {\n const me = this;\n const title = me.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, me.x, me.width);\n pt.x = getAlignedX(me, options.titleAlign, options);\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing;\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing;\n }\n }\n }\n }\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const me = this;\n const labelColors = me.labelColors[i];\n const labelPointStyle = me.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(me, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2,\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n ctx.strokeStyle = labelColors.borderColor;\n ctx.fillStyle = labelColors.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n ctx.lineWidth = labelColors.borderWidth || 1;\n ctx.strokeStyle = labelColors.borderColor;\n ctx.setLineDash(labelColors.borderDash || []);\n ctx.lineDashOffset = labelColors.borderDashOffset || 0;\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColors.borderRadius);\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = labelColors.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n ctx.fillStyle = labelColors.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n ctx.fillStyle = me.labelTextColors[i];\n }\n drawBody(pt, ctx, options) {\n const me = this;\n const {body} = me;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n const rtlHelper = getRtlAdapter(options.rtl, me.x, me.width);\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n pt.x = getAlignedX(me, bodyAlignForCalculation, options);\n ctx.fillStyle = options.bodyColor;\n each(me.beforeBody, fillLineOfText);\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + 1) : (boxWidth + 2)\n : 0;\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = me.labelTextColors[i];\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n lines = bodyItem.lines;\n if (displayColors && lines.length) {\n me._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n bodyLineHeight = bodyFont.lineHeight;\n }\n each(bodyItem.after, fillLineOfText);\n }\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n each(me.afterBody, fillLineOfText);\n pt.y -= bodySpacing;\n }\n drawFooter(pt, ctx, options) {\n const me = this;\n const footer = me.footer;\n const length = footer.length;\n let footerFont, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, me.x, me.width);\n pt.x = getAlignedX(me, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n footerFont = toFont(options.footerFont);\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const radius = options.cornerRadius;\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - radius, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - radius);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + radius, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n _updateAnimationTarget(options) {\n const me = this;\n const chart = me._chart;\n const anims = me.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(me, me._active, me._eventPosition);\n if (!position) {\n return;\n }\n const size = me._size = getTooltipSize(me, options);\n const positionAndSize = Object.assign({}, position, me._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n me.xAlign = alignment.xAlign;\n me.yAlign = alignment.yAlign;\n me.width = size.width;\n me.height = size.height;\n me.caretX = position.x;\n me.caretY = position.y;\n me._resolveAnimations().update(me, point);\n }\n }\n }\n draw(ctx) {\n const me = this;\n const options = me.options.setContext(me.getContext());\n let opacity = me.opacity;\n if (!opacity) {\n return;\n }\n me._updateAnimationTarget(options);\n const tooltipSize = {\n width: me.width,\n height: me.height\n };\n const pt = {\n x: me.x,\n y: me.y\n };\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n const padding = toPadding(options.padding);\n const hasTooltipContent = me.title.length || me.beforeBody.length || me.body.length || me.afterBody.length || me.footer.length;\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n me.drawBackground(pt, ctx, tooltipSize, options);\n overrideTextDirection(ctx, options.textDirection);\n pt.y += padding.top;\n me.drawTitle(pt, ctx, options);\n me.drawBody(pt, ctx, options);\n me.drawFooter(pt, ctx, options);\n restoreTextDirection(ctx, options.textDirection);\n ctx.restore();\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements, eventPosition) {\n const me = this;\n const lastActive = me._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = me._chart.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = me._positionChanged(active, eventPosition);\n if (changed || positionChanged) {\n me._active = active;\n me._eventPosition = eventPosition;\n me.update(true);\n }\n }\n handleEvent(e, replay) {\n const me = this;\n const options = me.options;\n const lastActive = me._active || [];\n let changed = false;\n let active = [];\n if (e.type !== 'mouseout') {\n active = me._chart.getElementsAtEventForMode(e, options.mode, options, replay);\n if (options.reverse) {\n active.reverse();\n }\n }\n const positionChanged = me._positionChanged(active, e);\n changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n if (changed) {\n me._active = active;\n if (options.enabled || options.external) {\n me._eventPosition = {\n x: e.x,\n y: e.y\n };\n me.update(true, replay);\n }\n }\n return changed;\n }\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\nTooltip.positioners = positioners;\nvar plugin_tooltip = {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({_chart: chart, options});\n }\n },\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n const args = {\n tooltip\n };\n if (chart.notifyPlugins('beforeTooltipDraw', args) === false) {\n return;\n }\n if (tooltip) {\n tooltip.draw(chart.ctx);\n }\n chart.notifyPlugins('afterTooltipDraw', args);\n },\n afterEvent(chart, args) {\n if (chart.tooltip) {\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition)) {\n args.changed = true;\n }\n }\n },\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: {\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n return '';\n },\n afterTitle: noop,\n beforeBody: noop,\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n let label = tooltipItem.dataset.label || '';\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n afterBody: noop,\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n }\n },\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n additionalOptionScopes: ['interaction']\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nDecimation: plugin_decimation,\nFiller: plugin_filler,\nLegend: plugin_legend,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index) => typeof raw === 'string'\n ? labels.push(raw) - 1\n : isNaN(raw) ? null : index;\nfunction findOrAddLabel(labels, raw, index) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\nclass CategoryScale extends Scale {\n constructor(cfg) {\n super(cfg);\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw));\n return validIndex(index, labels.length - 1);\n }\n determineDataLimits() {\n const me = this;\n const {minDefined, maxDefined} = me.getUserBounds();\n let {min, max} = me.getMinMax(true);\n if (me.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = me.getLabels().length - 1;\n }\n }\n me.min = min;\n me.max = max;\n }\n buildTicks() {\n const me = this;\n const min = me.min;\n const max = me.max;\n const offset = me.options.offset;\n const ticks = [];\n let labels = me.getLabels();\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n me._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n me._startValue = me.min - (offset ? 0.5 : 0);\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n getLabelForValue(value) {\n const me = this;\n const labels = me.getLabels();\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n }\n configure() {\n const me = this;\n super.configure();\n if (!me.isHorizontal()) {\n me._reversePixels = !me._reversePixels;\n }\n }\n getPixelForValue(value) {\n const me = this;\n if (typeof value !== 'number') {\n value = me.parse(value);\n }\n return value === null ? NaN : me.getPixelForDecimal((value - me._startValue) / me._valueRange);\n }\n getPixelForTick(index) {\n const me = this;\n const ticks = me.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return me.getPixelForValue(ticks[index].value);\n }\n getValueForPixel(pixel) {\n const me = this;\n return Math.round(me._startValue + me.getDecimalForPixel(pixel) * me._valueRange);\n }\n getBasePixel() {\n return this.bottom;\n }\n}\nCategoryScale.id = 'category';\nCategoryScale.defaults = {\n ticks: {\n callback: CategoryScale.prototype.getLabelForValue\n }\n};\n\nfunction generateTicks$1(generationOptions, dataRange) {\n const ticks = [];\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n if (!isNullOrUndef(precision)) {\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n numSpaces = Math.min((max - min) / spacing, maxTicks);\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n numSpaces = (niceMax - niceMin) / spacing;\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin),\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n if (niceMin < min) {\n j++;\n }\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n for (; j < numSpaces; ++j) {\n ticks.push({value: Math.round((niceMin + j * spacing) * factor) / factor});\n }\n if (maxDefined && includeBounds && niceMax !== max) {\n if (almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n constructor(cfg) {\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._endValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n return +raw;\n }\n handleTickRangeOptions() {\n const me = this;\n const {beginAtZero} = me.options;\n const {minDefined, maxDefined} = me.getUserBounds();\n let {min, max} = me;\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n if (min === max) {\n setMax(max + 1);\n if (!beginAtZero) {\n setMin(min - 1);\n }\n }\n me.min = min;\n me.max = max;\n }\n getTickLimit() {\n const me = this;\n const tickOpts = me.options.ticks;\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n if (stepSize) {\n maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1;\n } else {\n maxTicks = me.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n return maxTicks;\n }\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n buildTicks() {\n const me = this;\n const opts = me.options;\n const tickOpts = opts.ticks;\n let maxTicks = me.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: me._maxDigits(),\n horizontal: me.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = me._range || me;\n const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, me, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n return ticks;\n }\n configure() {\n const me = this;\n const ticks = me.ticks;\n let start = me.min;\n let end = me.max;\n super.configure();\n if (me.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n me._startValue = start;\n me._endValue = end;\n me._valueRange = end - start;\n }\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale);\n }\n}\n\nclass LinearScale extends LinearScaleBase {\n determineDataLimits() {\n const me = this;\n const {min, max} = me.getMinMax(true);\n me.min = isNumberFinite(min) ? min : 0;\n me.max = isNumberFinite(max) ? max : 1;\n me.handleTickRangeOptions();\n }\n computeTickLimit() {\n const me = this;\n const horizontal = me.isHorizontal();\n const length = horizontal ? me.width : me.height;\n const minRotation = toRadians(me.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = me._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\nLinearScale.id = 'linear';\nLinearScale.defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n};\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, Math.floor(log10(tickVal))));\n return remain === 1;\n}\nfunction generateTicks(generationOptions, dataRange) {\n const endExp = Math.floor(log10(dataRange.max));\n const endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n const ticks = [];\n let tickVal = finiteOrDefault(generationOptions.min, Math.pow(10, Math.floor(log10(dataRange.min))));\n let exp = Math.floor(log10(tickVal));\n let significand = Math.floor(tickVal / Math.pow(10, exp));\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n do {\n ticks.push({value: tickVal, major: isMajor(tickVal)});\n ++significand;\n if (significand === 10) {\n significand = 1;\n ++exp;\n precision = exp >= 0 ? 1 : precision;\n }\n tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;\n } while (exp < endExp || (exp === endExp && significand < endSignificand));\n const lastTick = finiteOrDefault(generationOptions.max, tickVal);\n ticks.push({value: lastTick, major: isMajor(tickVal)});\n return ticks;\n}\nclass LogarithmicScale extends Scale {\n constructor(cfg) {\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isNumberFinite(value) && value > 0 ? value : null;\n }\n determineDataLimits() {\n const me = this;\n const {min, max} = me.getMinMax(true);\n me.min = isNumberFinite(min) ? Math.max(0, min) : null;\n me.max = isNumberFinite(max) ? Math.max(0, max) : null;\n if (me.options.beginAtZero) {\n me._zero = true;\n }\n me.handleTickRangeOptions();\n }\n handleTickRangeOptions() {\n const me = this;\n const {minDefined, maxDefined} = me.getUserBounds();\n let min = me.min;\n let max = me.max;\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n const exp = (v, m) => Math.pow(10, Math.floor(log10(v)) + m);\n if (min === max) {\n if (min <= 0) {\n setMin(1);\n setMax(10);\n } else {\n setMin(exp(min, -1));\n setMax(exp(max, +1));\n }\n }\n if (min <= 0) {\n setMin(exp(max, -1));\n }\n if (max <= 0) {\n setMax(exp(min, +1));\n }\n if (me._zero && me.min !== me._suggestedMin && min === exp(me.min, 0)) {\n setMin(exp(min, -1));\n }\n me.min = min;\n me.max = max;\n }\n buildTicks() {\n const me = this;\n const opts = me.options;\n const generationOptions = {\n min: me._userMin,\n max: me._userMax\n };\n const ticks = generateTicks(generationOptions, me);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, me, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n return ticks;\n }\n getLabelForValue(value) {\n return value === undefined ? '0' : formatNumber(value, this.chart.options.locale);\n }\n configure() {\n const me = this;\n const start = me.min;\n super.configure();\n me._startValue = log10(start);\n me._valueRange = log10(me.max) - log10(start);\n }\n getPixelForValue(value) {\n const me = this;\n if (value === undefined || value === 0) {\n value = me.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return me.getPixelForDecimal(value === me.min\n ? 0\n : (log10(value) - me._startValue) / me._valueRange);\n }\n getValueForPixel(pixel) {\n const me = this;\n const decimal = me.getDecimalForPixel(pixel);\n return Math.pow(10, me._startValue + decimal * me._valueRange);\n }\n}\nLogarithmicScale.id = 'logarithmic';\nLogarithmicScale.defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n};\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\nfunction measureLabelSize(ctx, lineHeight, label) {\n if (isArray(label)) {\n return {\n w: _longestText(ctx, ctx.font, label),\n h: label.length * lineHeight\n };\n }\n return {\n w: ctx.measureText(label).width,\n h: lineHeight\n };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n return {\n start: pos,\n end: pos + size\n };\n}\nfunction fitWithPointLabels(scale) {\n const furthestLimits = {\n l: 0,\n r: scale.width,\n t: 0,\n b: scale.height - scale.paddingTop\n };\n const furthestAngles = {};\n let i, textSize, pointPosition;\n const labelSizes = [];\n const padding = [];\n const valueCount = scale.getLabels().length;\n for (i = 0; i < valueCount; i++) {\n const opts = scale.options.pointLabels.setContext(scale.getContext(i));\n padding[i] = opts.padding;\n pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i]);\n const plFont = toFont(opts.font);\n scale.ctx.font = plFont.string;\n textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n const angleRadians = scale.getIndexAngle(i);\n const angle = toDegrees(angleRadians);\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n if (hLimits.start < furthestLimits.l) {\n furthestLimits.l = hLimits.start;\n furthestAngles.l = angleRadians;\n }\n if (hLimits.end > furthestLimits.r) {\n furthestLimits.r = hLimits.end;\n furthestAngles.r = angleRadians;\n }\n if (vLimits.start < furthestLimits.t) {\n furthestLimits.t = vLimits.start;\n furthestAngles.t = angleRadians;\n }\n if (vLimits.end > furthestLimits.b) {\n furthestLimits.b = vLimits.end;\n furthestAngles.b = angleRadians;\n }\n }\n scale._setReductions(scale.drawingArea, furthestLimits, furthestAngles);\n scale._pointLabelItems = [];\n const opts = scale.options;\n const tickBackdropHeight = getTickBackdropHeight(opts);\n const outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n for (i = 0; i < valueCount; i++) {\n const extra = (i === 0 ? tickBackdropHeight / 2 : 0);\n const pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + padding[i]);\n const angle = toDegrees(scale.getIndexAngle(i));\n const size = labelSizes[i];\n adjustPointPositionForLabelHeight(angle, size, pointLabelPosition);\n const textAlign = getTextAlignForAngle(angle);\n let left;\n if (textAlign === 'left') {\n left = pointLabelPosition.x;\n } else if (textAlign === 'center') {\n left = pointLabelPosition.x - (size.w / 2);\n } else {\n left = pointLabelPosition.x - size.w;\n }\n const right = left + size.w;\n scale._pointLabelItems[i] = {\n x: pointLabelPosition.x,\n y: pointLabelPosition.y,\n textAlign,\n left,\n top: pointLabelPosition.y,\n right,\n bottom: pointLabelPosition.y + size.h,\n };\n }\n}\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n return 'right';\n}\nfunction adjustPointPositionForLabelHeight(angle, textSize, position) {\n if (angle === 90 || angle === 270) {\n position.y -= (textSize.h / 2);\n } else if (angle > 270 || angle < 90) {\n position.y -= textSize.h;\n }\n}\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n for (let i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = pointLabels.setContext(scale.getContext(i));\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign, left, top, right, bottom} = scale._pointLabelItems[i];\n const {backdropColor} = optsAtIndex;\n if (!isNullOrUndef(backdropColor)) {\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillStyle = backdropColor;\n ctx.fillRect(left - padding.left, top - padding.top, right - left + padding.width, bottom - top + padding.height);\n }\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n const {color, lineWidth} = gridLineOpts;\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(gridLineOpts.borderDash);\n ctx.lineDashOffset = gridLineOpts.borderDashOffset;\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\nfunction numberOrZero(param) {\n return isNumber(param) ? param : 0;\n}\nclass RadialLinearScale extends LinearScaleBase {\n constructor(cfg) {\n super(cfg);\n this.xCenter = undefined;\n this.yCenter = undefined;\n this.drawingArea = undefined;\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n setDimensions() {\n const me = this;\n me.width = me.maxWidth;\n me.height = me.maxHeight;\n me.paddingTop = getTickBackdropHeight(me.options) / 2;\n me.xCenter = Math.floor(me.width / 2);\n me.yCenter = Math.floor((me.height - me.paddingTop) / 2);\n me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2;\n }\n determineDataLimits() {\n const me = this;\n const {min, max} = me.getMinMax(false);\n me.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n me.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n me.handleTickRangeOptions();\n }\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n generateTickLabels(ticks) {\n const me = this;\n LinearScaleBase.prototype.generateTickLabels.call(me, ticks);\n me._pointLabels = me.getLabels().map((value, index) => {\n const label = callback(me.options.pointLabels.callback, [value, index], me);\n return label || label === 0 ? label : '';\n });\n }\n fit() {\n const me = this;\n const opts = me.options;\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(me);\n } else {\n me.setCenterPoint(0, 0, 0, 0);\n }\n }\n _setReductions(largestPossibleRadius, furthestLimits, furthestAngles) {\n const me = this;\n let radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n let radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n let radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n let radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b);\n radiusReductionLeft = numberOrZero(radiusReductionLeft);\n radiusReductionRight = numberOrZero(radiusReductionRight);\n radiusReductionTop = numberOrZero(radiusReductionTop);\n radiusReductionBottom = numberOrZero(radiusReductionBottom);\n me.drawingArea = Math.max(largestPossibleRadius / 2, Math.min(\n Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\n Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)));\n me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n }\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n const me = this;\n const maxRight = me.width - rightMovement - me.drawingArea;\n const maxLeft = leftMovement + me.drawingArea;\n const maxTop = topMovement + me.drawingArea;\n const maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea;\n me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left);\n me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop);\n }\n getIndexAngle(index) {\n const angleMultiplier = TAU / this.getLabels().length;\n const startAngle = this.options.startAngle || 0;\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n getDistanceFromCenterForValue(value) {\n const me = this;\n if (isNullOrUndef(value)) {\n return NaN;\n }\n const scalingFactor = me.drawingArea / (me.max - me.min);\n if (me.options.reverse) {\n return (me.max - value) * scalingFactor;\n }\n return (value - me.min) * scalingFactor;\n }\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n const me = this;\n const scaledDistance = distance / (me.drawingArea / (me.max - me.min));\n return me.options.reverse ? me.max - scaledDistance : me.min + scaledDistance;\n }\n getPointPosition(index, distanceFromCenter) {\n const me = this;\n const angle = me.getIndexAngle(index) - HALF_PI;\n return {\n x: Math.cos(angle) * distanceFromCenter + me.xCenter,\n y: Math.sin(angle) * distanceFromCenter + me.yCenter,\n angle\n };\n }\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n drawBackground() {\n const me = this;\n const {backgroundColor, grid: {circular}} = me.options;\n if (backgroundColor) {\n const ctx = me.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(me, me.getDistanceFromCenterForValue(me._endValue), circular, me.getLabels().length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n drawGrid() {\n const me = this;\n const ctx = me.ctx;\n const opts = me.options;\n const {angleLines, grid} = opts;\n const labelCount = me.getLabels().length;\n let i, offset, position;\n if (opts.pointLabels.display) {\n drawPointLabels(me, labelCount);\n }\n if (grid.display) {\n me.ticks.forEach((tick, index) => {\n if (index !== 0) {\n offset = me.getDistanceFromCenterForValue(tick.value);\n const optsAtIndex = grid.setContext(me.getContext(index - 1));\n drawRadiusLine(me, optsAtIndex, offset, labelCount);\n }\n });\n }\n if (angleLines.display) {\n ctx.save();\n for (i = me.getLabels().length - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(me.getContext(i));\n const {color, lineWidth} = optsAtIndex;\n if (!lineWidth || !color) {\n continue;\n }\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n offset = me.getDistanceFromCenterForValue(opts.ticks.reverse ? me.min : me.max);\n position = me.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(me.xCenter, me.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n ctx.restore();\n }\n }\n drawBorder() {}\n drawLabels() {\n const me = this;\n const ctx = me.ctx;\n const opts = me.options;\n const tickOpts = opts.ticks;\n if (!tickOpts.display) {\n return;\n }\n const startAngle = me.getIndexAngle(0);\n let offset, width;\n ctx.save();\n ctx.translate(me.xCenter, me.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n me.ticks.forEach((tick, index) => {\n if (index === 0 && !opts.reverse) {\n return;\n }\n const optsAtIndex = tickOpts.setContext(me.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = me.getDistanceFromCenterForValue(me.ticks[index].value);\n if (optsAtIndex.showLabelBackdrop) {\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n });\n });\n ctx.restore();\n }\n drawTitle() {}\n}\nRadialLinearScale.id = 'radialLinear';\nRadialLinearScale.defaults = {\n display: true,\n animate: true,\n position: 'chartArea',\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n grid: {\n circular: false\n },\n startAngle: 0,\n ticks: {\n showLabelBackdrop: true,\n callback: Ticks.formatters.numeric\n },\n pointLabels: {\n backdropColor: undefined,\n backdropPadding: 2,\n display: true,\n font: {\n size: 10\n },\n callback(label) {\n return label;\n },\n padding: 5\n }\n};\nRadialLinearScale.defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n};\nRadialLinearScale.descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n};\n\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\nconst UNITS = (Object.keys(INTERVALS));\nfunction sorter(a, b) {\n return a - b;\n}\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n if (typeof parser === 'function') {\n value = parser(value);\n }\n if (!isNumberFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n if (value === null) {\n return null;\n }\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n return +value;\n}\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n return UNITS[ilen - 1];\n}\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n const map = {};\n const ilen = values.length;\n let i, value;\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n ticks.push({\n value,\n major: false\n });\n }\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n constructor(props) {\n super(props);\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n this._unit = 'day';\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n init(scaleOpts, opts) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n const adapter = this._adapter = new _adapters._date(scaleOpts.adapters.date);\n mergeIf(time.displayFormats, adapter.formats());\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n super.init(scaleOpts);\n this._normalized = opts.normalized;\n }\n parse(raw, index) {\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n determineDataLimits() {\n const me = this;\n const options = me.options;\n const adapter = me._adapter;\n const unit = options.time.unit || 'day';\n let {min, max, minDefined, maxDefined} = me.getUserBounds();\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n if (!minDefined || !maxDefined) {\n _applyBounds(me._getLabelBounds());\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(me.getMinMax(false));\n }\n }\n min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n me.min = Math.min(min, max - 1);\n me.max = Math.max(min + 1, max);\n }\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n buildTicks() {\n const me = this;\n const options = me.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? me.getLabelTimestamps() : me._generate();\n if (options.bounds === 'ticks' && timestamps.length) {\n me.min = me._userMin || timestamps[0];\n me.max = me._userMax || timestamps[timestamps.length - 1];\n }\n const min = me.min;\n const max = me.max;\n const ticks = _filterBetween(timestamps, min, max);\n me._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, me.min, me.max, me._getLabelCapacity(min))\n : determineUnitForFormatting(me, ticks.length, timeOpts.minUnit, me.min, me.max));\n me._majorUnit = !tickOpts.major.enabled || me._unit === 'year' ? undefined\n : determineMajorUnit(me._unit);\n me.initOffsets(timestamps);\n if (options.reverse) {\n ticks.reverse();\n }\n return ticksFromTimestamps(me, ticks, me._majorUnit);\n }\n initOffsets(timestamps) {\n const me = this;\n let start = 0;\n let end = 0;\n let first, last;\n if (me.options.offset && timestamps.length) {\n first = me.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (me.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = me.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - me.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n me._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n _generate() {\n const me = this;\n const adapter = me._adapter;\n const min = me.min;\n const max = me.max;\n const options = me.options;\n const timeOpts = options.time;\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, me._getLabelCapacity(min));\n const stepSize = valueOrDefault(timeOpts.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n const timestamps = options.ticks.source === 'data' && me.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n return Object.keys(ticks).sort((a, b) => a - b).map(x => +x);\n }\n getLabelForValue(value) {\n const me = this;\n const adapter = me._adapter;\n const timeOpts = me.options.time;\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n _tickFormatFunction(time, index, ticks, format) {\n const me = this;\n const options = me.options;\n const formats = options.time.displayFormats;\n const unit = me._unit;\n const majorUnit = me._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n const label = me._adapter.format(time, format || (major ? majorFormat : minorFormat));\n const formatter = options.ticks.callback;\n return formatter ? callback(formatter, [label, index, ticks], me) : label;\n }\n generateTickLabels(ticks) {\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n getDecimalForValue(value) {\n const me = this;\n return value === null ? NaN : (value - me.min) / (me.max - me.min);\n }\n getPixelForValue(value) {\n const me = this;\n const offsets = me._offsets;\n const pos = me.getDecimalForValue(value);\n return me.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n getValueForPixel(pixel) {\n const me = this;\n const offsets = me._offsets;\n const pos = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return me.min + pos * (me.max - me.min);\n }\n _getLabelSize(label) {\n const me = this;\n const ticksOpts = me.options.ticks;\n const tickLabelWidth = me.ctx.measureText(label).width;\n const angle = toRadians(me.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = me._resolveTickFontOptions(0).size;\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n _getLabelCapacity(exampleTime) {\n const me = this;\n const timeOpts = me.options.time;\n const displayFormats = timeOpts.displayFormats;\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = me._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(me, [exampleTime], me._majorUnit), format);\n const size = me._getLabelSize(exampleLabel);\n const capacity = Math.floor(me.isHorizontal() ? me.width / size.w : me.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n getDataTimestamps() {\n const me = this;\n let timestamps = me._cache.data || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const metas = me.getMatchingVisibleMetas();\n if (me._normalized && metas.length) {\n return (me._cache.data = metas[0].controller.getAllParsedValues(me));\n }\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(me));\n }\n return (me._cache.data = me.normalize(timestamps));\n }\n getLabelTimestamps() {\n const me = this;\n const timestamps = me._cache.labels || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const labels = me.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(me, labels[i]));\n }\n return (me._cache.labels = me._normalized ? timestamps : me.normalize(timestamps));\n }\n normalize(values) {\n return _arrayUnique(values.sort(sorter));\n }\n}\nTimeScale.id = 'time';\nTimeScale.defaults = {\n bounds: 'data',\n adapters: {},\n time: {\n parser: false,\n unit: false,\n round: false,\n isoWeekday: false,\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n source: 'auto',\n major: {\n enabled: false\n }\n }\n};\n\nfunction interpolate(table, val, reverse) {\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n prevSource = Math.floor(val);\n nextSource = Math.ceil(val);\n prevTarget = table[prevSource];\n nextTarget = table[nextSource];\n } else {\n const result = _lookup(table, val);\n prevTarget = result.lo;\n nextTarget = result.hi;\n prevSource = table[prevTarget];\n nextSource = table[nextTarget];\n }\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n constructor(props) {\n super(props);\n this._table = [];\n this._maxIndex = undefined;\n }\n initOffsets() {\n const me = this;\n const timestamps = me._getTimestampsForTable();\n me._table = me.buildLookupTable(timestamps);\n me._maxIndex = me._table.length - 1;\n super.initOffsets(timestamps);\n }\n buildLookupTable(timestamps) {\n const me = this;\n const {min, max} = me;\n if (!timestamps.length) {\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n const items = [min];\n let i, ilen, curr;\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr > min && curr < max) {\n items.push(curr);\n }\n }\n items.push(max);\n return items;\n }\n _getTimestampsForTable() {\n const me = this;\n let timestamps = me._cache.all || [];\n if (timestamps.length) {\n return timestamps;\n }\n const data = me.getDataTimestamps();\n const label = me.getLabelTimestamps();\n if (data.length && label.length) {\n timestamps = me.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = me._cache.all = timestamps;\n return timestamps;\n }\n getPixelForValue(value, index) {\n const me = this;\n const offsets = me._offsets;\n const pos = me._normalized && me._maxIndex > 0 && !isNullOrUndef(index)\n ? index / me._maxIndex : me.getDecimalForValue(value);\n return me.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n getDecimalForValue(value) {\n return interpolate(this._table, value) / this._maxIndex;\n }\n getValueForPixel(pixel) {\n const me = this;\n const offsets = me._offsets;\n const decimal = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(me._table, decimal * this._maxIndex, true);\n }\n}\nTimeSeriesScale.id = 'timeseries';\nTimeSeriesScale.defaults = TimeScale.defaults;\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nChart.register(controllers, scales, elements, plugins);\nChart.helpers = {...helpers};\nChart._adapters = _adapters;\nChart.Animation = Animation;\nChart.Animations = Animations;\nChart.animator = animator;\nChart.controllers = registry.controllers.items;\nChart.DatasetController = DatasetController;\nChart.Element = Element;\nChart.elements = elements;\nChart.Interaction = Interaction;\nChart.layouts = layouts;\nChart.platforms = platforms;\nChart.Scale = Scale;\nChart.Ticks = Ticks;\nObject.assign(Chart, controllers, scales, elements, plugins, platforms);\nChart.Chart = Chart;\nif (typeof window !== 'undefined') {\n window.Chart = Chart;\n}\n\nreturn Chart;\n\n})));\n","/*!\nFullCalendar Core Package v4.0.2\nDocs & License: https://fullcalendar.io/\n(c) 2019 Adam Shaw\n*/\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = global || self, factory(global.FullCalendar = {}));\n}(this, function (exports) { 'use strict';\n\n // Creating\n // ----------------------------------------------------------------------------------------------------------------\n var elementPropHash = {\n className: true,\n colSpan: true,\n rowSpan: true\n };\n var containerTagHash = {\n '= rect.left &&\n point.left < rect.right &&\n point.top >= rect.top &&\n point.top < rect.bottom;\n }\n // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false\n function intersectRects(rect1, rect2) {\n var res = {\n left: Math.max(rect1.left, rect2.left),\n right: Math.min(rect1.right, rect2.right),\n top: Math.max(rect1.top, rect2.top),\n bottom: Math.min(rect1.bottom, rect2.bottom)\n };\n if (res.left < res.right && res.top < res.bottom) {\n return res;\n }\n return false;\n }\n function translateRect(rect, deltaX, deltaY) {\n return {\n left: rect.left + deltaX,\n right: rect.right + deltaX,\n top: rect.top + deltaY,\n bottom: rect.bottom + deltaY\n };\n }\n // Returns a new point that will have been moved to reside within the given rectangle\n function constrainPoint(point, rect) {\n return {\n left: Math.min(Math.max(point.left, rect.left), rect.right),\n top: Math.min(Math.max(point.top, rect.top), rect.bottom)\n };\n }\n // Returns a point that is the center of the given rectangle\n function getRectCenter(rect) {\n return {\n left: (rect.left + rect.right) / 2,\n top: (rect.top + rect.bottom) / 2\n };\n }\n // Subtracts point2's coordinates from point1's coordinates, returning a delta\n function diffPoints(point1, point2) {\n return {\n left: point1.left - point2.left,\n top: point1.top - point2.top\n };\n }\n\n // Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side\n var isRtlScrollbarOnLeft = null;\n function getIsRtlScrollbarOnLeft() {\n if (isRtlScrollbarOnLeft === null) {\n isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft();\n }\n return isRtlScrollbarOnLeft;\n }\n function computeIsRtlScrollbarOnLeft() {\n var outerEl = createElement('div', {\n style: {\n position: 'absolute',\n top: -1000,\n left: 0,\n border: 0,\n padding: 0,\n overflow: 'scroll',\n direction: 'rtl'\n }\n }, '
');\n document.body.appendChild(outerEl);\n var innerEl = outerEl.firstChild;\n var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left;\n removeElement(outerEl);\n return res;\n }\n // The scrollbar width computations in computeEdges are sometimes flawed when it comes to\n // retina displays, rounding, and IE11. Massage them into a usable value.\n function sanitizeScrollbarWidth(width) {\n width = Math.max(0, width); // no negatives\n width = Math.round(width);\n return width;\n }\n\n function computeEdges(el, getPadding) {\n if (getPadding === void 0) { getPadding = false; }\n var computedStyle = window.getComputedStyle(el);\n var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0;\n var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0;\n var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0;\n var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;\n var scrollbarLeftRight = sanitizeScrollbarWidth(el.offsetWidth - el.clientWidth - borderLeft - borderRight);\n var scrollbarBottom = sanitizeScrollbarWidth(el.offsetHeight - el.clientHeight - borderTop - borderBottom);\n var res = {\n borderLeft: borderLeft,\n borderRight: borderRight,\n borderTop: borderTop,\n borderBottom: borderBottom,\n scrollbarBottom: scrollbarBottom,\n scrollbarLeft: 0,\n scrollbarRight: 0\n };\n if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side?\n res.scrollbarLeft = scrollbarLeftRight;\n }\n else {\n res.scrollbarRight = scrollbarLeftRight;\n }\n if (getPadding) {\n res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;\n res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;\n res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;\n res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0;\n }\n return res;\n }\n function computeInnerRect(el, goWithinPadding) {\n if (goWithinPadding === void 0) { goWithinPadding = false; }\n var outerRect = computeRect(el);\n var edges = computeEdges(el, goWithinPadding);\n var res = {\n left: outerRect.left + edges.borderLeft + edges.scrollbarLeft,\n right: outerRect.right - edges.borderRight - edges.scrollbarRight,\n top: outerRect.top + edges.borderTop,\n bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom\n };\n if (goWithinPadding) {\n res.left += edges.paddingLeft;\n res.right -= edges.paddingRight;\n res.top += edges.paddingTop;\n res.bottom -= edges.paddingBottom;\n }\n return res;\n }\n function computeRect(el) {\n var rect = el.getBoundingClientRect();\n return {\n left: rect.left + window.pageXOffset,\n top: rect.top + window.pageYOffset,\n right: rect.right + window.pageXOffset,\n bottom: rect.bottom + window.pageYOffset\n };\n }\n function computeViewportRect() {\n return {\n left: window.pageXOffset,\n right: window.pageXOffset + document.documentElement.clientWidth,\n top: window.pageYOffset,\n bottom: window.pageYOffset + document.documentElement.clientHeight\n };\n }\n function computeHeightAndMargins(el) {\n var computed = window.getComputedStyle(el);\n return el.getBoundingClientRect().height +\n parseInt(computed.marginTop, 10) +\n parseInt(computed.marginBottom, 10);\n }\n // does not return window\n function getClippingParents(el) {\n var parents = [];\n while (el instanceof HTMLElement) { // will stop when gets to document or null\n var computedStyle = window.getComputedStyle(el);\n if (computedStyle.position === 'fixed') {\n break;\n }\n if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) {\n parents.push(el);\n }\n el = el.parentNode;\n }\n return parents;\n }\n function computeClippingRect(el) {\n return getClippingParents(el)\n .map(function (el) {\n return computeInnerRect(el);\n })\n .concat(computeViewportRect())\n .reduce(function (rect0, rect1) {\n return intersectRects(rect0, rect1) || rect1; // should always intersect\n });\n }\n\n // Stops a mouse/touch event from doing it's native browser action\n function preventDefault(ev) {\n ev.preventDefault();\n }\n // Event Delegation\n // ----------------------------------------------------------------------------------------------------------------\n function listenBySelector(container, eventType, selector, handler) {\n function realHandler(ev) {\n var matchedChild = elementClosest(ev.target, selector);\n if (matchedChild) {\n handler.call(matchedChild, ev, matchedChild);\n }\n }\n container.addEventListener(eventType, realHandler);\n return function () {\n container.removeEventListener(eventType, realHandler);\n };\n }\n function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) {\n var currentMatchedChild;\n return listenBySelector(container, 'mouseover', selector, function (ev, matchedChild) {\n if (matchedChild !== currentMatchedChild) {\n currentMatchedChild = matchedChild;\n onMouseEnter(ev, matchedChild);\n var realOnMouseLeave_1 = function (ev) {\n currentMatchedChild = null;\n onMouseLeave(ev, matchedChild);\n matchedChild.removeEventListener('mouseleave', realOnMouseLeave_1);\n };\n // listen to the next mouseleave, and then unattach\n matchedChild.addEventListener('mouseleave', realOnMouseLeave_1);\n }\n });\n }\n // Animation\n // ----------------------------------------------------------------------------------------------------------------\n var transitionEventNames = [\n 'webkitTransitionEnd',\n 'otransitionend',\n 'oTransitionEnd',\n 'msTransitionEnd',\n 'transitionend'\n ];\n // triggered only when the next single subsequent transition finishes\n function whenTransitionDone(el, callback) {\n var realCallback = function (ev) {\n callback(ev);\n transitionEventNames.forEach(function (eventName) {\n el.removeEventListener(eventName, realCallback);\n });\n };\n transitionEventNames.forEach(function (eventName) {\n el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes\n });\n }\n\n var DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];\n // Adding\n function addWeeks(m, n) {\n var a = dateToUtcArray(m);\n a[2] += n * 7;\n return arrayToUtcDate(a);\n }\n function addDays(m, n) {\n var a = dateToUtcArray(m);\n a[2] += n;\n return arrayToUtcDate(a);\n }\n function addMs(m, n) {\n var a = dateToUtcArray(m);\n a[6] += n;\n return arrayToUtcDate(a);\n }\n // Diffing (all return floats)\n function diffWeeks(m0, m1) {\n return diffDays(m0, m1) / 7;\n }\n function diffDays(m0, m1) {\n return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24);\n }\n function diffHours(m0, m1) {\n return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60);\n }\n function diffMinutes(m0, m1) {\n return (m1.valueOf() - m0.valueOf()) / (1000 * 60);\n }\n function diffSeconds(m0, m1) {\n return (m1.valueOf() - m0.valueOf()) / 1000;\n }\n function diffDayAndTime(m0, m1) {\n var m0day = startOfDay(m0);\n var m1day = startOfDay(m1);\n return {\n years: 0,\n months: 0,\n days: Math.round(diffDays(m0day, m1day)),\n milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf())\n };\n }\n // Diffing Whole Units\n function diffWholeWeeks(m0, m1) {\n var d = diffWholeDays(m0, m1);\n if (d !== null && d % 7 === 0) {\n return d / 7;\n }\n return null;\n }\n function diffWholeDays(m0, m1) {\n if (timeAsMs(m0) === timeAsMs(m1)) {\n return Math.round(diffDays(m0, m1));\n }\n return null;\n }\n // Start-Of\n function startOfDay(m) {\n return arrayToUtcDate([\n m.getUTCFullYear(),\n m.getUTCMonth(),\n m.getUTCDate()\n ]);\n }\n function startOfHour(m) {\n return arrayToUtcDate([\n m.getUTCFullYear(),\n m.getUTCMonth(),\n m.getUTCDate(),\n m.getUTCHours()\n ]);\n }\n function startOfMinute(m) {\n return arrayToUtcDate([\n m.getUTCFullYear(),\n m.getUTCMonth(),\n m.getUTCDate(),\n m.getUTCHours(),\n m.getUTCMinutes()\n ]);\n }\n function startOfSecond(m) {\n return arrayToUtcDate([\n m.getUTCFullYear(),\n m.getUTCMonth(),\n m.getUTCDate(),\n m.getUTCHours(),\n m.getUTCMinutes(),\n m.getUTCSeconds()\n ]);\n }\n // Week Computation\n function weekOfYear(marker, dow, doy) {\n var y = marker.getUTCFullYear();\n var w = weekOfGivenYear(marker, y, dow, doy);\n if (w < 1) {\n return weekOfGivenYear(marker, y - 1, dow, doy);\n }\n var nextW = weekOfGivenYear(marker, y + 1, dow, doy);\n if (nextW >= 1) {\n return Math.min(w, nextW);\n }\n return w;\n }\n function weekOfGivenYear(marker, year, dow, doy) {\n var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]);\n var dayStart = startOfDay(marker);\n var days = Math.round(diffDays(firstWeekStart, dayStart));\n return Math.floor(days / 7) + 1; // zero-indexed\n }\n // start-of-first-week - start-of-year\n function firstWeekOffset(year, dow, doy) {\n // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n var fwd = 7 + dow - doy;\n // first-week day local weekday -- which local weekday is fwd\n var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7;\n return -fwdlw + fwd - 1;\n }\n // Array Conversion\n function dateToLocalArray(date) {\n return [\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds()\n ];\n }\n function arrayToLocalDate(a) {\n return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month\n a[3] || 0, a[4] || 0, a[5] || 0);\n }\n function dateToUtcArray(date) {\n return [\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes(),\n date.getUTCSeconds(),\n date.getUTCMilliseconds()\n ];\n }\n function arrayToUtcDate(a) {\n // according to web standards (and Safari), a month index is required.\n // massage if only given a year.\n if (a.length === 1) {\n a = a.concat([0]);\n }\n return new Date(Date.UTC.apply(Date, a));\n }\n // Other Utils\n function isValidDate(m) {\n return !isNaN(m.valueOf());\n }\n function timeAsMs(m) {\n return m.getUTCHours() * 1000 * 60 * 60 +\n m.getUTCMinutes() * 1000 * 60 +\n m.getUTCSeconds() * 1000 +\n m.getUTCMilliseconds();\n }\n\n var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds'];\n var PARSE_RE = /^(-?)(?:(\\d+)\\.)?(\\d+):(\\d\\d)(?::(\\d\\d)(?:\\.(\\d\\d\\d))?)?/;\n // Parsing and Creation\n function createDuration(input, unit) {\n var _a;\n if (typeof input === 'string') {\n return parseString(input);\n }\n else if (typeof input === 'object' && input) { // non-null object\n return normalizeObject(input);\n }\n else if (typeof input === 'number') {\n return normalizeObject((_a = {}, _a[unit || 'milliseconds'] = input, _a));\n }\n else {\n return null;\n }\n }\n function parseString(s) {\n var m = PARSE_RE.exec(s);\n if (m) {\n var sign = m[1] ? -1 : 1;\n return {\n years: 0,\n months: 0,\n days: sign * (m[2] ? parseInt(m[2], 10) : 0),\n milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours\n (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes\n (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds\n (m[6] ? parseInt(m[6], 10) : 0) // ms\n )\n };\n }\n return null;\n }\n function normalizeObject(obj) {\n return {\n years: obj.years || obj.year || 0,\n months: obj.months || obj.month || 0,\n days: (obj.days || obj.day || 0) +\n getWeeksFromInput(obj) * 7,\n milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours\n (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes\n (obj.seconds || obj.second || 0) * 1000 + // seconds\n (obj.milliseconds || obj.millisecond || obj.ms || 0) // ms\n };\n }\n function getWeeksFromInput(obj) {\n return obj.weeks || obj.week || 0;\n }\n // Equality\n function durationsEqual(d0, d1) {\n return d0.years === d1.years &&\n d0.months === d1.months &&\n d0.days === d1.days &&\n d0.milliseconds === d1.milliseconds;\n }\n function isSingleDay(dur) {\n return dur.years === 0 && dur.months === 0 && dur.days === 1 && dur.milliseconds === 0;\n }\n // Simple Math\n function addDurations(d0, d1) {\n return {\n years: d0.years + d1.years,\n months: d0.months + d1.months,\n days: d0.days + d1.days,\n milliseconds: d0.milliseconds + d1.milliseconds\n };\n }\n function subtractDurations(d1, d0) {\n return {\n years: d1.years - d0.years,\n months: d1.months - d0.months,\n days: d1.days - d0.days,\n milliseconds: d1.milliseconds - d0.milliseconds\n };\n }\n function multiplyDuration(d, n) {\n return {\n years: d.years * n,\n months: d.months * n,\n days: d.days * n,\n milliseconds: d.milliseconds * n\n };\n }\n // Conversions\n // \"Rough\" because they are based on average-case Gregorian months/years\n function asRoughYears(dur) {\n return asRoughDays(dur) / 365;\n }\n function asRoughMonths(dur) {\n return asRoughDays(dur) / 30;\n }\n function asRoughDays(dur) {\n return asRoughMs(dur) / 864e5;\n }\n function asRoughMinutes(dur) {\n return asRoughMs(dur) / (1000 * 60);\n }\n function asRoughSeconds(dur) {\n return asRoughMs(dur) / 1000;\n }\n function asRoughMs(dur) {\n return dur.years * (365 * 864e5) +\n dur.months * (30 * 864e5) +\n dur.days * 864e5 +\n dur.milliseconds;\n }\n // Advanced Math\n function wholeDivideDurations(numerator, denominator) {\n var res = null;\n for (var i = 0; i < INTERNAL_UNITS.length; i++) {\n var unit = INTERNAL_UNITS[i];\n if (denominator[unit]) {\n var localRes = numerator[unit] / denominator[unit];\n if (!isInt(localRes) || (res !== null && res !== localRes)) {\n return null;\n }\n res = localRes;\n }\n else if (numerator[unit]) {\n // needs to divide by something but can't!\n return null;\n }\n }\n return res;\n }\n function greatestDurationDenominator(dur, dontReturnWeeks) {\n var ms = dur.milliseconds;\n if (ms) {\n if (ms % 1000 !== 0) {\n return { unit: 'millisecond', value: ms };\n }\n if (ms % (1000 * 60) !== 0) {\n return { unit: 'second', value: ms / 1000 };\n }\n if (ms % (1000 * 60 * 60) !== 0) {\n return { unit: 'minute', value: ms / (1000 * 60) };\n }\n if (ms) {\n return { unit: 'hour', value: ms / (1000 * 60 * 60) };\n }\n }\n if (dur.days) {\n if (!dontReturnWeeks && dur.days % 7 === 0) {\n return { unit: 'week', value: dur.days / 7 };\n }\n return { unit: 'day', value: dur.days };\n }\n if (dur.months) {\n return { unit: 'month', value: dur.months };\n }\n if (dur.years) {\n return { unit: 'year', value: dur.years };\n }\n return { unit: 'millisecond', value: 0 };\n }\n\n /* FullCalendar-specific DOM Utilities\n ----------------------------------------------------------------------------------------------------------------------*/\n // Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left\n // and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.\n function compensateScroll(rowEl, scrollbarWidths) {\n if (scrollbarWidths.left) {\n applyStyle(rowEl, {\n borderLeftWidth: 1,\n marginLeft: scrollbarWidths.left - 1\n });\n }\n if (scrollbarWidths.right) {\n applyStyle(rowEl, {\n borderRightWidth: 1,\n marginRight: scrollbarWidths.right - 1\n });\n }\n }\n // Undoes compensateScroll and restores all borders/margins\n function uncompensateScroll(rowEl) {\n applyStyle(rowEl, {\n marginLeft: '',\n marginRight: '',\n borderLeftWidth: '',\n borderRightWidth: ''\n });\n }\n // Make the mouse cursor express that an event is not allowed in the current area\n function disableCursor() {\n document.body.classList.add('fc-not-allowed');\n }\n // Returns the mouse cursor to its original look\n function enableCursor() {\n document.body.classList.remove('fc-not-allowed');\n }\n // Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.\n // By default, all elements that are shorter than the recommended height are expanded uniformly, not considering\n // any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and\n // reduces the available height.\n function distributeHeight(els, availableHeight, shouldRedistribute) {\n // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,\n // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.\n var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element\n var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*\n var flexEls = []; // elements that are allowed to expand. array of DOM nodes\n var flexOffsets = []; // amount of vertical space it takes up\n var flexHeights = []; // actual css height\n var usedHeight = 0;\n undistributeHeight(els); // give all elements their natural height\n // find elements that are below the recommended height (expandable).\n // important to query for heights in a single first pass (to avoid reflow oscillation).\n els.forEach(function (el, i) {\n var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;\n var naturalOffset = computeHeightAndMargins(el);\n if (naturalOffset < minOffset) {\n flexEls.push(el);\n flexOffsets.push(naturalOffset);\n flexHeights.push(el.offsetHeight);\n }\n else {\n // this element stretches past recommended height (non-expandable). mark the space as occupied.\n usedHeight += naturalOffset;\n }\n });\n // readjust the recommended height to only consider the height available to non-maxed-out rows.\n if (shouldRedistribute) {\n availableHeight -= usedHeight;\n minOffset1 = Math.floor(availableHeight / flexEls.length);\n minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*\n }\n // assign heights to all expandable elements\n flexEls.forEach(function (el, i) {\n var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;\n var naturalOffset = flexOffsets[i];\n var naturalHeight = flexHeights[i];\n var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding\n if (naturalOffset < minOffset) { // we check this again because redistribution might have changed things\n el.style.height = newHeight + 'px';\n }\n });\n }\n // Undoes distrubuteHeight, restoring all els to their natural height\n function undistributeHeight(els) {\n els.forEach(function (el) {\n el.style.height = '';\n });\n }\n // Given `els`, a set of cells, find the cell with the largest natural width and set the widths of all the\n // cells to be that width.\n // PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline\n function matchCellWidths(els) {\n var maxInnerWidth = 0;\n els.forEach(function (el) {\n var innerEl = el.firstChild; // hopefully an element\n if (innerEl instanceof HTMLElement) {\n var innerWidth_1 = innerEl.offsetWidth;\n if (innerWidth_1 > maxInnerWidth) {\n maxInnerWidth = innerWidth_1;\n }\n }\n });\n maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance\n els.forEach(function (el) {\n el.style.width = maxInnerWidth + 'px';\n });\n return maxInnerWidth;\n }\n // Given one element that resides inside another,\n // Subtracts the height of the inner element from the outer element.\n function subtractInnerElHeight(outerEl, innerEl) {\n // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked\n var reflowStyleProps = {\n position: 'relative',\n left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll\n };\n applyStyle(outerEl, reflowStyleProps);\n applyStyle(innerEl, reflowStyleProps);\n var diff = outerEl.offsetHeight - innerEl.offsetHeight; // grab the dimensions\n // undo hack\n var resetStyleProps = { position: '', left: '' };\n applyStyle(outerEl, resetStyleProps);\n applyStyle(innerEl, resetStyleProps);\n return diff;\n }\n /* Selection\n ----------------------------------------------------------------------------------------------------------------------*/\n function preventSelection(el) {\n el.classList.add('fc-unselectable');\n el.addEventListener('selectstart', preventDefault);\n }\n function allowSelection(el) {\n el.classList.remove('fc-unselectable');\n el.removeEventListener('selectstart', preventDefault);\n }\n /* Context Menu\n ----------------------------------------------------------------------------------------------------------------------*/\n function preventContextMenu(el) {\n el.addEventListener('contextmenu', preventDefault);\n }\n function allowContextMenu(el) {\n el.removeEventListener('contextmenu', preventDefault);\n }\n /* Object Ordering by Field\n ----------------------------------------------------------------------------------------------------------------------*/\n function parseFieldSpecs(input) {\n var specs = [];\n var tokens = [];\n var i;\n var token;\n if (typeof input === 'string') {\n tokens = input.split(/\\s*,\\s*/);\n }\n else if (typeof input === 'function') {\n tokens = [input];\n }\n else if (Array.isArray(input)) {\n tokens = input;\n }\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n if (typeof token === 'string') {\n specs.push(token.charAt(0) === '-' ?\n { field: token.substring(1), order: -1 } :\n { field: token, order: 1 });\n }\n else if (typeof token === 'function') {\n specs.push({ func: token });\n }\n }\n return specs;\n }\n function compareByFieldSpecs(obj0, obj1, fieldSpecs) {\n var i;\n var cmp;\n for (i = 0; i < fieldSpecs.length; i++) {\n cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]);\n if (cmp) {\n return cmp;\n }\n }\n return 0;\n }\n function compareByFieldSpec(obj0, obj1, fieldSpec) {\n if (fieldSpec.func) {\n return fieldSpec.func(obj0, obj1);\n }\n return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field])\n * (fieldSpec.order || 1);\n }\n function flexibleCompare(a, b) {\n if (!a && !b) {\n return 0;\n }\n if (b == null) {\n return -1;\n }\n if (a == null) {\n return 1;\n }\n if (typeof a === 'string' || typeof b === 'string') {\n return String(a).localeCompare(String(b));\n }\n return a - b;\n }\n /* String Utilities\n ----------------------------------------------------------------------------------------------------------------------*/\n function capitaliseFirstLetter(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n function padStart(val, len) {\n var s = String(val);\n return '000'.substr(0, len - s.length) + s;\n }\n /* Number Utilities\n ----------------------------------------------------------------------------------------------------------------------*/\n function compareNumbers(a, b) {\n return a - b;\n }\n function isInt(n) {\n return n % 1 === 0;\n }\n /* Weird Utilities\n ----------------------------------------------------------------------------------------------------------------------*/\n function applyAll(functions, thisObj, args) {\n if (typeof functions === 'function') { // supplied a single function\n functions = [functions];\n }\n if (functions) {\n var i = void 0;\n var ret = void 0;\n for (i = 0; i < functions.length; i++) {\n ret = functions[i].apply(thisObj, args) || ret;\n }\n return ret;\n }\n }\n function firstDefined() {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n for (var i = 0; i < args.length; i++) {\n if (args[i] !== undefined) {\n return args[i];\n }\n }\n }\n // Returns a function, that, as long as it continues to be invoked, will not\n // be triggered. The function will be called after it stops being called for\n // N milliseconds. If `immediate` is passed, trigger the function on the\n // leading edge, instead of the trailing.\n // https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714\n function debounce(func, wait) {\n var timeout;\n var args;\n var context;\n var timestamp;\n var result;\n var later = function () {\n var last = new Date().valueOf() - timestamp;\n if (last < wait) {\n timeout = setTimeout(later, wait - last);\n }\n else {\n timeout = null;\n result = func.apply(context, args);\n context = args = null;\n }\n };\n return function () {\n context = this;\n args = arguments;\n timestamp = new Date().valueOf();\n if (!timeout) {\n timeout = setTimeout(later, wait);\n }\n return result;\n };\n }\n // Number and Boolean are only types that defaults or not computed for\n // TODO: write more comments\n function refineProps(rawProps, processors, defaults, leftoverProps) {\n if (defaults === void 0) { defaults = {}; }\n var refined = {};\n for (var key in processors) {\n var processor = processors[key];\n if (rawProps[key] !== undefined) {\n // found\n if (processor === Function) {\n refined[key] = typeof rawProps[key] === 'function' ? rawProps[key] : null;\n }\n else if (processor) { // a refining function?\n refined[key] = processor(rawProps[key]);\n }\n else {\n refined[key] = rawProps[key];\n }\n }\n else if (defaults[key] !== undefined) {\n // there's an explicit default\n refined[key] = defaults[key];\n }\n else {\n // must compute a default\n if (processor === String) {\n refined[key] = ''; // empty string is default for String\n }\n else if (!processor || processor === Number || processor === Boolean || processor === Function) {\n refined[key] = null; // assign null for other non-custom processor funcs\n }\n else {\n refined[key] = processor(null); // run the custom processor func\n }\n }\n }\n if (leftoverProps) {\n for (var key in rawProps) {\n if (processors[key] === undefined) {\n leftoverProps[key] = rawProps[key];\n }\n }\n }\n return refined;\n }\n /*\n Get a snapshot of an object, so we can compare it to later revisions.\n Intentionally only works with arrays, jaja\n */\n function freezeRaw(raw) {\n if (Array.isArray(raw)) {\n return Array.prototype.slice.call(raw);\n }\n return raw;\n }\n /* Date stuff that doesn't belong in datelib core\n ----------------------------------------------------------------------------------------------------------------------*/\n // given a timed range, computes an all-day range that has the same exact duration,\n // but whose start time is aligned with the start of the day.\n function computeAlignedDayRange(timedRange) {\n var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1;\n var start = startOfDay(timedRange.start);\n var end = addDays(start, dayCnt);\n return { start: start, end: end };\n }\n // given a timed range, computes an all-day range based on how for the end date bleeds into the next day\n // TODO: give nextDayThreshold a default arg\n function computeVisibleDayRange(timedRange, nextDayThreshold) {\n if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); }\n var startDay = null;\n var endDay = null;\n if (timedRange.end) {\n endDay = startOfDay(timedRange.end);\n var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay`\n // If the end time is actually inclusively part of the next day and is equal to or\n // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.\n // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.\n if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) {\n endDay = addDays(endDay, 1);\n }\n }\n if (timedRange.start) {\n startDay = startOfDay(timedRange.start); // the beginning of the day the range starts\n // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.\n if (endDay && endDay <= startDay) {\n endDay = addDays(startDay, 1);\n }\n }\n return { start: startDay, end: endDay };\n }\n // spans from one day into another?\n function isMultiDayRange(range) {\n var visibleRange = computeVisibleDayRange(range);\n return diffDays(visibleRange.start, visibleRange.end) > 1;\n }\n function diffDates(date0, date1, dateEnv, largeUnit) {\n if (largeUnit === 'year') {\n return createDuration(dateEnv.diffWholeYears(date0, date1), 'year');\n }\n else if (largeUnit === 'month') {\n return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month');\n }\n else {\n return diffDayAndTime(date0, date1); // returns a duration\n }\n }\n\n /*! *****************************************************************************\r\n Copyright (c) Microsoft Corporation. All rights reserved.\r\n Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\n this file except in compliance with the License. You may obtain a copy of the\r\n License at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\n WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\n MERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\n See the Apache Version 2.0 License for specific language governing permissions\r\n and limitations under the License.\r\n ***************************************************************************** */\r\n /* global Reflect, Promise */\r\n\r\n var extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n };\r\n\r\n function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n }\r\n\r\n var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n };\n\n function parseRecurring(eventInput, allDayDefault, dateEnv, recurringTypes, leftovers) {\n for (var i = 0; i < recurringTypes.length; i++) {\n var localLeftovers = {};\n var parsed = recurringTypes[i].parse(eventInput, localLeftovers, dateEnv);\n if (parsed) {\n var allDay = localLeftovers.allDay;\n delete localLeftovers.allDay; // remove from leftovers\n if (allDay == null) {\n allDay = allDayDefault;\n if (allDay == null) {\n allDay = parsed.allDayGuess;\n if (allDay == null) {\n allDay = false;\n }\n }\n }\n __assign(leftovers, localLeftovers);\n return {\n allDay: allDay,\n duration: parsed.duration,\n typeData: parsed.typeData,\n typeId: i\n };\n }\n }\n return null;\n }\n /*\n Event MUST have a recurringDef\n */\n function expandRecurringRanges(eventDef, framingRange, dateEnv, recurringTypes) {\n var typeDef = recurringTypes[eventDef.recurringDef.typeId];\n var markers = typeDef.expand(eventDef.recurringDef.typeData, framingRange, dateEnv);\n // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to\n if (eventDef.allDay) {\n markers = markers.map(startOfDay);\n }\n return markers;\n }\n\n // Merges an array of objects into a single object.\n // The second argument allows for an array of property names who's object values will be merged together.\n function mergeProps(propObjs, complexProps) {\n var dest = {};\n var i;\n var name;\n var complexObjs;\n var j;\n var val;\n var props;\n if (complexProps) {\n for (i = 0; i < complexProps.length; i++) {\n name = complexProps[i];\n complexObjs = [];\n // collect the trailing object values, stopping when a non-object is discovered\n for (j = propObjs.length - 1; j >= 0; j--) {\n val = propObjs[j][name];\n if (typeof val === 'object' && val) { // non-null object\n complexObjs.unshift(val);\n }\n else if (val !== undefined) {\n dest[name] = val; // if there were no objects, this value will be used\n break;\n }\n }\n // if the trailing values were objects, use the merged value\n if (complexObjs.length) {\n dest[name] = mergeProps(complexObjs);\n }\n }\n }\n // copy values into the destination, going from last to first\n for (i = propObjs.length - 1; i >= 0; i--) {\n props = propObjs[i];\n for (name in props) {\n if (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign\n dest[name] = props[name];\n }\n }\n }\n return dest;\n }\n function filterHash(hash, func) {\n var filtered = {};\n for (var key in hash) {\n if (func(hash[key], key)) {\n filtered[key] = hash[key];\n }\n }\n return filtered;\n }\n function mapHash(hash, func) {\n var newHash = {};\n for (var key in hash) {\n newHash[key] = func(hash[key], key);\n }\n return newHash;\n }\n function arrayToHash(a) {\n var hash = {};\n for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {\n var item = a_1[_i];\n hash[item] = true;\n }\n return hash;\n }\n function hashValuesToArray(obj) {\n var a = [];\n for (var key in obj) {\n a.push(obj[key]);\n }\n return a;\n }\n\n function parseEvents(rawEvents, sourceId, calendar, allowOpenRange) {\n var eventStore = createEmptyEventStore();\n for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) {\n var rawEvent = rawEvents_1[_i];\n var tuple = parseEvent(rawEvent, sourceId, calendar, allowOpenRange);\n if (tuple) {\n eventTupleToStore(tuple, eventStore);\n }\n }\n return eventStore;\n }\n function eventTupleToStore(tuple, eventStore) {\n if (eventStore === void 0) { eventStore = createEmptyEventStore(); }\n eventStore.defs[tuple.def.defId] = tuple.def;\n if (tuple.instance) {\n eventStore.instances[tuple.instance.instanceId] = tuple.instance;\n }\n return eventStore;\n }\n function expandRecurring(eventStore, framingRange, calendar) {\n var dateEnv = calendar.dateEnv;\n var defs = eventStore.defs, instances = eventStore.instances;\n // remove existing recurring instances\n instances = filterHash(instances, function (instance) {\n return !defs[instance.defId].recurringDef;\n });\n for (var defId in defs) {\n var def = defs[defId];\n if (def.recurringDef) {\n var starts = expandRecurringRanges(def, framingRange, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes);\n var duration = def.recurringDef.duration;\n if (!duration) {\n duration = def.allDay ?\n calendar.defaultAllDayEventDuration :\n calendar.defaultTimedEventDuration;\n }\n for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) {\n var start = starts_1[_i];\n var instance = createEventInstance(defId, {\n start: start,\n end: dateEnv.add(start, duration)\n });\n instances[instance.instanceId] = instance;\n }\n }\n }\n return { defs: defs, instances: instances };\n }\n // retrieves events that have the same groupId as the instance specified by `instanceId`\n // or they are the same as the instance.\n // why might instanceId not be in the store? an event from another calendar?\n function getRelevantEvents(eventStore, instanceId) {\n var instance = eventStore.instances[instanceId];\n if (instance) {\n var def_1 = eventStore.defs[instance.defId];\n // get events/instances with same group\n var newStore = filterEventStoreDefs(eventStore, function (lookDef) {\n return isEventDefsGrouped(def_1, lookDef);\n });\n // add the original\n // TODO: wish we could use eventTupleToStore or something like it\n newStore.defs[def_1.defId] = def_1;\n newStore.instances[instance.instanceId] = instance;\n return newStore;\n }\n return createEmptyEventStore();\n }\n function isEventDefsGrouped(def0, def1) {\n return Boolean(def0.groupId && def0.groupId === def1.groupId);\n }\n function transformRawEvents(rawEvents, eventSource, calendar) {\n var calEachTransform = calendar.opt('eventDataTransform');\n var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;\n if (sourceEachTransform) {\n rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);\n }\n if (calEachTransform) {\n rawEvents = transformEachRawEvent(rawEvents, calEachTransform);\n }\n return rawEvents;\n }\n function transformEachRawEvent(rawEvents, func) {\n var refinedEvents;\n if (!func) {\n refinedEvents = rawEvents;\n }\n else {\n refinedEvents = [];\n for (var _i = 0, rawEvents_2 = rawEvents; _i < rawEvents_2.length; _i++) {\n var rawEvent = rawEvents_2[_i];\n var refinedEvent = func(rawEvent);\n if (refinedEvent) {\n refinedEvents.push(refinedEvent);\n }\n else if (refinedEvent == null) {\n refinedEvents.push(rawEvent);\n } // if a different falsy value, do nothing\n }\n }\n return refinedEvents;\n }\n function createEmptyEventStore() {\n return { defs: {}, instances: {} };\n }\n function mergeEventStores(store0, store1) {\n return {\n defs: __assign({}, store0.defs, store1.defs),\n instances: __assign({}, store0.instances, store1.instances)\n };\n }\n function filterEventStoreDefs(eventStore, filterFunc) {\n var defs = filterHash(eventStore.defs, filterFunc);\n var instances = filterHash(eventStore.instances, function (instance) {\n return defs[instance.defId]; // still exists?\n });\n return { defs: defs, instances: instances };\n }\n\n function parseRange(input, dateEnv) {\n var start = null;\n var end = null;\n if (input.start) {\n start = dateEnv.createMarker(input.start);\n }\n if (input.end) {\n end = dateEnv.createMarker(input.end);\n }\n if (!start && !end) {\n return null;\n }\n if (start && end && end < start) {\n return null;\n }\n return { start: start, end: end };\n }\n // SIDE-EFFECT: will mutate ranges.\n // Will return a new array result.\n function invertRanges(ranges, constraintRange) {\n var invertedRanges = [];\n var start = constraintRange.start; // the end of the previous range. the start of the new range\n var i;\n var dateRange;\n // ranges need to be in order. required for our date-walking algorithm\n ranges.sort(compareRanges);\n for (i = 0; i < ranges.length; i++) {\n dateRange = ranges[i];\n // add the span of time before the event (if there is any)\n if (dateRange.start > start) { // compare millisecond time (skip any ambig logic)\n invertedRanges.push({ start: start, end: dateRange.start });\n }\n if (dateRange.end > start) {\n start = dateRange.end;\n }\n }\n // add the span of time after the last event (if there is any)\n if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic)\n invertedRanges.push({ start: start, end: constraintRange.end });\n }\n return invertedRanges;\n }\n function compareRanges(range0, range1) {\n return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first\n }\n function intersectRanges(range0, range1) {\n var start = range0.start;\n var end = range0.end;\n var newRange = null;\n if (range1.start !== null) {\n if (start === null) {\n start = range1.start;\n }\n else {\n start = new Date(Math.max(start.valueOf(), range1.start.valueOf()));\n }\n }\n if (range1.end != null) {\n if (end === null) {\n end = range1.end;\n }\n else {\n end = new Date(Math.min(end.valueOf(), range1.end.valueOf()));\n }\n }\n if (start === null || end === null || start < end) {\n newRange = { start: start, end: end };\n }\n return newRange;\n }\n function rangesEqual(range0, range1) {\n return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) &&\n (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf());\n }\n function rangesIntersect(range0, range1) {\n return (range0.end === null || range1.start === null || range0.end > range1.start) &&\n (range0.start === null || range1.end === null || range0.start < range1.end);\n }\n function rangeContainsRange(outerRange, innerRange) {\n return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) &&\n (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end));\n }\n function rangeContainsMarker(range, date) {\n return (range.start === null || date >= range.start) &&\n (range.end === null || date < range.end);\n }\n // If the given date is not within the given range, move it inside.\n // (If it's past the end, make it one millisecond before the end).\n function constrainMarkerToRange(date, range) {\n if (range.start != null && date < range.start) {\n return range.start;\n }\n if (range.end != null && date >= range.end) {\n return new Date(range.end.valueOf() - 1);\n }\n return date;\n }\n\n function removeExact(array, exactVal) {\n var removeCnt = 0;\n var i = 0;\n while (i < array.length) {\n if (array[i] === exactVal) {\n array.splice(i, 1);\n removeCnt++;\n }\n else {\n i++;\n }\n }\n return removeCnt;\n }\n function isArraysEqual(a0, a1) {\n var len = a0.length;\n var i;\n if (len !== a1.length) { // not array? or not same length?\n return false;\n }\n for (i = 0; i < len; i++) {\n if (a0[i] !== a1[i]) {\n return false;\n }\n }\n return true;\n }\n\n function memoize(workerFunc) {\n var args;\n var res;\n return function () {\n if (!args || !isArraysEqual(args, arguments)) {\n args = arguments;\n res = workerFunc.apply(this, arguments);\n }\n return res;\n };\n }\n /*\n always executes the workerFunc, but if the result is equal to the previous result,\n return the previous result instead.\n */\n function memoizeOutput(workerFunc, equalityFunc) {\n var cachedRes = null;\n return function () {\n var newRes = workerFunc.apply(this, arguments);\n if (cachedRes === null || !(cachedRes === newRes || equalityFunc(cachedRes, newRes))) {\n cachedRes = newRes;\n }\n return cachedRes;\n };\n }\n\n var EXTENDED_SETTINGS_AND_SEVERITIES = {\n week: 3,\n separator: 0,\n omitZeroMinute: 0,\n meridiem: 0,\n omitCommas: 0\n };\n var STANDARD_DATE_PROP_SEVERITIES = {\n timeZoneName: 7,\n era: 6,\n year: 5,\n month: 4,\n day: 2,\n weekday: 2,\n hour: 1,\n minute: 1,\n second: 1\n };\n var MERIDIEM_RE = /\\s*([ap])\\.?m\\.?/i; // eats up leading spaces too\n var COMMA_RE = /,/g; // we need re for globalness\n var MULTI_SPACE_RE = /\\s+/g;\n var LTR_RE = /\\u200e/g; // control character\n var UTC_RE = /UTC|GMT/;\n var NativeFormatter = /** @class */ (function () {\n function NativeFormatter(formatSettings) {\n var standardDateProps = {};\n var extendedSettings = {};\n var severity = 0;\n for (var name_1 in formatSettings) {\n if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) {\n extendedSettings[name_1] = formatSettings[name_1];\n severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity);\n }\n else {\n standardDateProps[name_1] = formatSettings[name_1];\n if (name_1 in STANDARD_DATE_PROP_SEVERITIES) {\n severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity);\n }\n }\n }\n this.standardDateProps = standardDateProps;\n this.extendedSettings = extendedSettings;\n this.severity = severity;\n this.buildFormattingFunc = memoize(buildFormattingFunc);\n }\n NativeFormatter.prototype.format = function (date, context) {\n return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date);\n };\n NativeFormatter.prototype.formatRange = function (start, end, context) {\n var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings;\n var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem);\n if (!diffSeverity) {\n return this.format(start, context);\n }\n var biggestUnitForPartial = diffSeverity;\n if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time\n (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') &&\n (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') &&\n (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) {\n biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time\n }\n var full0 = this.format(start, context);\n var full1 = this.format(end, context);\n if (full0 === full1) {\n return full0;\n }\n var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial);\n var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context);\n var partial0 = partialFormattingFunc(start);\n var partial1 = partialFormattingFunc(end);\n var insertion = findCommonInsertion(full0, partial0, full1, partial1);\n var separator = extendedSettings.separator || '';\n if (insertion) {\n return insertion.before + partial0 + separator + partial1 + insertion.after;\n }\n return full0 + separator + full1;\n };\n NativeFormatter.prototype.getLargestUnit = function () {\n switch (this.severity) {\n case 7:\n case 6:\n case 5:\n return 'year';\n case 4:\n return 'month';\n case 3:\n return 'week';\n default:\n return 'day';\n }\n };\n return NativeFormatter;\n }());\n function buildFormattingFunc(standardDateProps, extendedSettings, context) {\n var standardDatePropCnt = Object.keys(standardDateProps).length;\n if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') {\n return function (date) {\n return formatTimeZoneOffset(date.timeZoneOffset);\n };\n }\n if (standardDatePropCnt === 0 && extendedSettings.week) {\n return function (date) {\n return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekLabel, context.locale, extendedSettings.week);\n };\n }\n return buildNativeFormattingFunc(standardDateProps, extendedSettings, context);\n }\n function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) {\n standardDateProps = __assign({}, standardDateProps); // copy\n extendedSettings = __assign({}, extendedSettings); // copy\n sanitizeSettings(standardDateProps, extendedSettings);\n standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers\n var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps);\n var zeroFormat; // needed?\n if (extendedSettings.omitZeroMinute) {\n var zeroProps = __assign({}, standardDateProps);\n delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings\n zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps);\n }\n return function (date) {\n var marker = date.marker;\n var format;\n if (zeroFormat && !marker.getUTCMinutes()) {\n format = zeroFormat;\n }\n else {\n format = normalFormat;\n }\n var s = format.format(marker);\n return postProcess(s, date, standardDateProps, extendedSettings, context);\n };\n }\n function sanitizeSettings(standardDateProps, extendedSettings) {\n // deal with a browser inconsistency where formatting the timezone\n // requires that the hour/minute be present.\n if (standardDateProps.timeZoneName) {\n if (!standardDateProps.hour) {\n standardDateProps.hour = '2-digit';\n }\n if (!standardDateProps.minute) {\n standardDateProps.minute = '2-digit';\n }\n }\n // only support short timezone names\n if (standardDateProps.timeZoneName === 'long') {\n standardDateProps.timeZoneName = 'short';\n }\n // if requesting to display seconds, MUST display minutes\n if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) {\n delete extendedSettings.omitZeroMinute;\n }\n }\n function postProcess(s, date, standardDateProps, extendedSettings, context) {\n s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes\n if (standardDateProps.timeZoneName === 'short') {\n s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ?\n 'UTC' : // important to normalize for IE, which does \"GMT\"\n formatTimeZoneOffset(date.timeZoneOffset));\n }\n if (extendedSettings.omitCommas) {\n s = s.replace(COMMA_RE, '').trim();\n }\n if (extendedSettings.omitZeroMinute) {\n s = s.replace(':00', ''); // zeroFormat doesn't always achieve this\n }\n // ^ do anything that might create adjacent spaces before this point,\n // because MERIDIEM_RE likes to eat up loading spaces\n if (extendedSettings.meridiem === false) {\n s = s.replace(MERIDIEM_RE, '').trim();\n }\n else if (extendedSettings.meridiem === 'narrow') { // a/p\n s = s.replace(MERIDIEM_RE, function (m0, m1) {\n return m1.toLocaleLowerCase();\n });\n }\n else if (extendedSettings.meridiem === 'short') { // am/pm\n s = s.replace(MERIDIEM_RE, function (m0, m1) {\n return m1.toLocaleLowerCase() + 'm';\n });\n }\n else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase\n s = s.replace(MERIDIEM_RE, function (m0) {\n return m0.toLocaleLowerCase();\n });\n }\n s = s.replace(MULTI_SPACE_RE, ' ');\n s = s.trim();\n return s;\n }\n function injectTzoStr(s, tzoStr) {\n var replaced = false;\n s = s.replace(UTC_RE, function () {\n replaced = true;\n return tzoStr;\n });\n // IE11 doesn't include UTC/GMT in the original string, so append to end\n if (!replaced) {\n s += ' ' + tzoStr;\n }\n return s;\n }\n function formatWeekNumber(num, weekLabel, locale, display) {\n var parts = [];\n if (display === 'narrow') {\n parts.push(weekLabel);\n }\n else if (display === 'short') {\n parts.push(weekLabel, ' ');\n }\n // otherwise, considered 'numeric'\n parts.push(locale.simpleNumberFormat.format(num));\n if (locale.options.isRtl) { // TODO: use control characters instead?\n parts.reverse();\n }\n return parts.join('');\n }\n // Range Formatting Utils\n // 0 = exactly the same\n // 1 = different by time\n // and bigger\n function computeMarkerDiffSeverity(d0, d1, ca) {\n if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) {\n return 5;\n }\n if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) {\n return 4;\n }\n if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) {\n return 2;\n }\n if (timeAsMs(d0) !== timeAsMs(d1)) {\n return 1;\n }\n return 0;\n }\n function computePartialFormattingOptions(options, biggestUnit) {\n var partialOptions = {};\n for (var name_2 in options) {\n if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone)\n STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) {\n partialOptions[name_2] = options[name_2];\n }\n }\n return partialOptions;\n }\n function findCommonInsertion(full0, partial0, full1, partial1) {\n var i0 = 0;\n while (i0 < full0.length) {\n var found0 = full0.indexOf(partial0, i0);\n if (found0 === -1) {\n break;\n }\n var before0 = full0.substr(0, found0);\n i0 = found0 + partial0.length;\n var after0 = full0.substr(i0);\n var i1 = 0;\n while (i1 < full1.length) {\n var found1 = full1.indexOf(partial1, i1);\n if (found1 === -1) {\n break;\n }\n var before1 = full1.substr(0, found1);\n i1 = found1 + partial1.length;\n var after1 = full1.substr(i1);\n if (before0 === before1 && after0 === after1) {\n return {\n before: before0,\n after: after0\n };\n }\n }\n }\n return null;\n }\n\n /*\n TODO: fix the terminology of \"formatter\" vs \"formatting func\"\n */\n /*\n At the time of instantiation, this object does not know which cmd-formatting system it will use.\n It receives this at the time of formatting, as a setting.\n */\n var CmdFormatter = /** @class */ (function () {\n function CmdFormatter(cmdStr, separator) {\n this.cmdStr = cmdStr;\n this.separator = separator;\n }\n CmdFormatter.prototype.format = function (date, context) {\n return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, this.separator));\n };\n CmdFormatter.prototype.formatRange = function (start, end, context) {\n return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, this.separator));\n };\n return CmdFormatter;\n }());\n\n var FuncFormatter = /** @class */ (function () {\n function FuncFormatter(func) {\n this.func = func;\n }\n FuncFormatter.prototype.format = function (date, context) {\n return this.func(createVerboseFormattingArg(date, null, context));\n };\n FuncFormatter.prototype.formatRange = function (start, end, context) {\n return this.func(createVerboseFormattingArg(start, end, context));\n };\n return FuncFormatter;\n }());\n\n // Formatter Object Creation\n function createFormatter(input, defaultSeparator) {\n if (typeof input === 'object' && input) { // non-null object\n if (typeof defaultSeparator === 'string') {\n input = __assign({ separator: defaultSeparator }, input);\n }\n return new NativeFormatter(input);\n }\n else if (typeof input === 'string') {\n return new CmdFormatter(input, defaultSeparator);\n }\n else if (typeof input === 'function') {\n return new FuncFormatter(input);\n }\n }\n // String Utils\n // timeZoneOffset is in minutes\n function buildIsoString(marker, timeZoneOffset, stripZeroTime) {\n if (stripZeroTime === void 0) { stripZeroTime = false; }\n var s = marker.toISOString();\n s = s.replace('.000', '');\n if (stripZeroTime) {\n s = s.replace('T00:00:00Z', '');\n }\n if (s.length > 10) { // time part wasn't stripped, can add timezone info\n if (timeZoneOffset == null) {\n s = s.replace('Z', '');\n }\n else if (timeZoneOffset !== 0) {\n s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true));\n }\n // otherwise, its UTC-0 and we want to keep the Z\n }\n return s;\n }\n function formatIsoTimeString(marker) {\n return padStart(marker.getUTCHours(), 2) + ':' +\n padStart(marker.getUTCMinutes(), 2) + ':' +\n padStart(marker.getUTCSeconds(), 2);\n }\n function formatTimeZoneOffset(minutes, doIso) {\n if (doIso === void 0) { doIso = false; }\n var sign = minutes < 0 ? '-' : '+';\n var abs = Math.abs(minutes);\n var hours = Math.floor(abs / 60);\n var mins = Math.round(abs % 60);\n if (doIso) {\n return sign + padStart(hours, 2) + ':' + padStart(mins, 2);\n }\n else {\n return 'GMT' + sign + hours + (mins ? ':' + padStart(mins, 2) : '');\n }\n }\n // Arg Utils\n function createVerboseFormattingArg(start, end, context, separator) {\n var startInfo = expandZonedMarker(start, context.calendarSystem);\n var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null;\n return {\n date: startInfo,\n start: startInfo,\n end: endInfo,\n timeZone: context.timeZone,\n localeCodes: context.locale.codes,\n separator: separator\n };\n }\n function expandZonedMarker(dateInfo, calendarSystem) {\n var a = calendarSystem.markerToArray(dateInfo.marker);\n return {\n marker: dateInfo.marker,\n timeZoneOffset: dateInfo.timeZoneOffset,\n array: a,\n year: a[0],\n month: a[1],\n day: a[2],\n hour: a[3],\n minute: a[4],\n second: a[5],\n millisecond: a[6]\n };\n }\n\n var EventSourceApi = /** @class */ (function () {\n function EventSourceApi(calendar, internalEventSource) {\n this.calendar = calendar;\n this.internalEventSource = internalEventSource;\n }\n EventSourceApi.prototype.remove = function () {\n this.calendar.dispatch({\n type: 'REMOVE_EVENT_SOURCE',\n sourceId: this.internalEventSource.sourceId\n });\n };\n EventSourceApi.prototype.refetch = function () {\n this.calendar.dispatch({\n type: 'FETCH_EVENT_SOURCES',\n sourceIds: [this.internalEventSource.sourceId]\n });\n };\n Object.defineProperty(EventSourceApi.prototype, \"id\", {\n get: function () {\n return this.internalEventSource.publicId;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventSourceApi.prototype, \"url\", {\n // only relevant to json-feed event sources\n get: function () {\n return this.internalEventSource.meta.url;\n },\n enumerable: true,\n configurable: true\n });\n return EventSourceApi;\n }());\n\n var EventApi = /** @class */ (function () {\n function EventApi(calendar, def, instance) {\n this._calendar = calendar;\n this._def = def;\n this._instance = instance || null;\n }\n /*\n TODO: make event struct more responsible for this\n */\n EventApi.prototype.setProp = function (name, val) {\n var _a, _b;\n if (name in DATE_PROPS) ;\n else if (name in NON_DATE_PROPS) {\n if (typeof NON_DATE_PROPS[name] === 'function') {\n val = NON_DATE_PROPS[name](val);\n }\n this.mutate({\n standardProps: (_a = {}, _a[name] = val, _a)\n });\n }\n else if (name in UNSCOPED_EVENT_UI_PROPS) {\n var ui = void 0;\n if (typeof UNSCOPED_EVENT_UI_PROPS[name] === 'function') {\n val = UNSCOPED_EVENT_UI_PROPS[name](val);\n }\n if (name === 'color') {\n ui = { backgroundColor: val, borderColor: val };\n }\n else if (name === 'editable') {\n ui = { startEditable: val, durationEditable: val };\n }\n else {\n ui = (_b = {}, _b[name] = val, _b);\n }\n this.mutate({\n standardProps: { ui: ui }\n });\n }\n };\n EventApi.prototype.setExtendedProp = function (name, val) {\n var _a;\n this.mutate({\n extendedProps: (_a = {}, _a[name] = val, _a)\n });\n };\n EventApi.prototype.setStart = function (startInput, options) {\n if (options === void 0) { options = {}; }\n var dateEnv = this._calendar.dateEnv;\n var start = dateEnv.createMarker(startInput);\n if (start && this._instance) { // TODO: warning if parsed bad\n var instanceRange = this._instance.range;\n var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!?\n var endDelta = null;\n if (options.maintainDuration) {\n var origDuration = diffDates(instanceRange.start, instanceRange.end, dateEnv, options.granularity);\n var newDuration = diffDates(start, instanceRange.end, dateEnv, options.granularity);\n endDelta = subtractDurations(origDuration, newDuration);\n }\n this.mutate({ startDelta: startDelta, endDelta: endDelta });\n }\n };\n EventApi.prototype.setEnd = function (endInput, options) {\n if (options === void 0) { options = {}; }\n var dateEnv = this._calendar.dateEnv;\n var end;\n if (endInput != null) {\n end = dateEnv.createMarker(endInput);\n if (!end) {\n return; // TODO: warning if parsed bad\n }\n }\n if (this._instance) {\n if (end) {\n var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity);\n this.mutate({ endDelta: endDelta });\n }\n else {\n this.mutate({ standardProps: { hasEnd: false } });\n }\n }\n };\n EventApi.prototype.setDates = function (startInput, endInput, options) {\n if (options === void 0) { options = {}; }\n var dateEnv = this._calendar.dateEnv;\n var standardProps = { allDay: options.allDay };\n var start = dateEnv.createMarker(startInput);\n var end;\n if (!start) {\n return; // TODO: warning if parsed bad\n }\n if (endInput != null) {\n end = dateEnv.createMarker(endInput);\n if (!end) { // TODO: warning if parsed bad\n return;\n }\n }\n if (this._instance) {\n var instanceRange = this._instance.range;\n // when computing the diff for an event being converted to all-day,\n // compute diff off of the all-day values the way event-mutation does.\n if (options.allDay === true) {\n instanceRange = computeAlignedDayRange(instanceRange);\n }\n var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);\n if (end) {\n var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity);\n this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps });\n }\n else {\n standardProps.hasEnd = false;\n this.mutate({ startDelta: startDelta, standardProps: standardProps });\n }\n }\n };\n EventApi.prototype.moveStart = function (deltaInput) {\n var delta = createDuration(deltaInput);\n if (delta) { // TODO: warning if parsed bad\n this.mutate({ startDelta: delta });\n }\n };\n EventApi.prototype.moveEnd = function (deltaInput) {\n var delta = createDuration(deltaInput);\n if (delta) { // TODO: warning if parsed bad\n this.mutate({ endDelta: delta });\n }\n };\n EventApi.prototype.moveDates = function (deltaInput) {\n var delta = createDuration(deltaInput);\n if (delta) { // TODO: warning if parsed bad\n this.mutate({ startDelta: delta, endDelta: delta });\n }\n };\n EventApi.prototype.setAllDay = function (allDay, options) {\n if (options === void 0) { options = {}; }\n var standardProps = { allDay: allDay };\n var maintainDuration = options.maintainDuration;\n if (maintainDuration == null) {\n maintainDuration = this._calendar.opt('allDayMaintainDuration');\n }\n if (this._def.allDay !== allDay) {\n standardProps.hasEnd = maintainDuration;\n }\n this.mutate({ standardProps: standardProps });\n };\n EventApi.prototype.formatRange = function (formatInput) {\n var dateEnv = this._calendar.dateEnv;\n var instance = this._instance;\n var formatter = createFormatter(formatInput, this._calendar.opt('defaultRangeSeparator'));\n if (this._def.hasEnd) {\n return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, {\n forcedStartTzo: instance.forcedStartTzo,\n forcedEndTzo: instance.forcedEndTzo\n });\n }\n else {\n return dateEnv.format(instance.range.start, formatter, {\n forcedTzo: instance.forcedStartTzo\n });\n }\n };\n EventApi.prototype.mutate = function (mutation) {\n var def = this._def;\n var instance = this._instance;\n if (instance) {\n this._calendar.dispatch({\n type: 'MUTATE_EVENTS',\n instanceId: instance.instanceId,\n mutation: mutation,\n fromApi: true\n });\n var eventStore = this._calendar.state.eventStore;\n this._def = eventStore.defs[def.defId];\n this._instance = eventStore.instances[instance.instanceId];\n }\n };\n EventApi.prototype.remove = function () {\n this._calendar.dispatch({\n type: 'REMOVE_EVENT_DEF',\n defId: this._def.defId\n });\n };\n Object.defineProperty(EventApi.prototype, \"source\", {\n get: function () {\n var sourceId = this._def.sourceId;\n if (sourceId) {\n return new EventSourceApi(this._calendar, this._calendar.state.eventSources[sourceId]);\n }\n return null;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"start\", {\n get: function () {\n return this._instance ?\n this._calendar.dateEnv.toDate(this._instance.range.start) :\n null;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"end\", {\n get: function () {\n return (this._instance && this._def.hasEnd) ?\n this._calendar.dateEnv.toDate(this._instance.range.end) :\n null;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"id\", {\n // computable props that all access the def\n // TODO: find a TypeScript-compatible way to do this at scale\n get: function () { return this._def.publicId; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"groupId\", {\n get: function () { return this._def.groupId; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"allDay\", {\n get: function () { return this._def.allDay; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"title\", {\n get: function () { return this._def.title; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"url\", {\n get: function () { return this._def.url; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"rendering\", {\n get: function () { return this._def.rendering; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"startEditable\", {\n get: function () { return this._def.ui.startEditable; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"durationEditable\", {\n get: function () { return this._def.ui.durationEditable; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"constraint\", {\n get: function () { return this._def.ui.constraints[0] || null; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"overlap\", {\n get: function () { return this._def.ui.overlap; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"allow\", {\n get: function () { return this._def.ui.allows[0] || null; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"backgroundColor\", {\n get: function () { return this._def.ui.backgroundColor; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"borderColor\", {\n get: function () { return this._def.ui.borderColor; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"textColor\", {\n get: function () { return this._def.ui.textColor; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"classNames\", {\n // NOTE: user can't modify these because Object.freeze was called in event-def parsing\n get: function () { return this._def.ui.classNames; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(EventApi.prototype, \"extendedProps\", {\n get: function () { return this._def.extendedProps; },\n enumerable: true,\n configurable: true\n });\n return EventApi;\n }());\n\n /*\n Specifying nextDayThreshold signals that all-day ranges should be sliced.\n */\n function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) {\n var inverseBgByGroupId = {};\n var inverseBgByDefId = {};\n var defByGroupId = {};\n var bgRanges = [];\n var fgRanges = [];\n var eventUis = compileEventUis(eventStore.defs, eventUiBases);\n for (var defId in eventStore.defs) {\n var def = eventStore.defs[defId];\n if (def.rendering === 'inverse-background') {\n if (def.groupId) {\n inverseBgByGroupId[def.groupId] = [];\n if (!defByGroupId[def.groupId]) {\n defByGroupId[def.groupId] = def;\n }\n }\n else {\n inverseBgByDefId[defId] = [];\n }\n }\n }\n for (var instanceId in eventStore.instances) {\n var instance = eventStore.instances[instanceId];\n var def = eventStore.defs[instance.defId];\n var ui = eventUis[def.defId];\n var origRange = instance.range;\n var normalRange = (!def.allDay && nextDayThreshold) ?\n computeVisibleDayRange(origRange, nextDayThreshold) :\n origRange;\n var slicedRange = intersectRanges(normalRange, framingRange);\n if (slicedRange) {\n if (def.rendering === 'inverse-background') {\n if (def.groupId) {\n inverseBgByGroupId[def.groupId].push(slicedRange);\n }\n else {\n inverseBgByDefId[instance.defId].push(slicedRange);\n }\n }\n else {\n (def.rendering === 'background' ? bgRanges : fgRanges).push({\n def: def,\n ui: ui,\n instance: instance,\n range: slicedRange,\n isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(),\n isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf()\n });\n }\n }\n }\n for (var groupId in inverseBgByGroupId) { // BY GROUP\n var ranges = inverseBgByGroupId[groupId];\n var invertedRanges = invertRanges(ranges, framingRange);\n for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) {\n var invertedRange = invertedRanges_1[_i];\n var def = defByGroupId[groupId];\n var ui = eventUis[def.defId];\n bgRanges.push({\n def: def,\n ui: ui,\n instance: null,\n range: invertedRange,\n isStart: false,\n isEnd: false\n });\n }\n }\n for (var defId in inverseBgByDefId) {\n var ranges = inverseBgByDefId[defId];\n var invertedRanges = invertRanges(ranges, framingRange);\n for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) {\n var invertedRange = invertedRanges_2[_a];\n bgRanges.push({\n def: eventStore.defs[defId],\n ui: eventUis[defId],\n instance: null,\n range: invertedRange,\n isStart: false,\n isEnd: false\n });\n }\n }\n return { bg: bgRanges, fg: fgRanges };\n }\n function hasBgRendering(def) {\n return def.rendering === 'background' || def.rendering === 'inverse-background';\n }\n function filterSegsViaEls(view, segs, isMirror) {\n if (view.hasPublicHandlers('eventRender')) {\n segs = segs.filter(function (seg) {\n var custom = view.publiclyTrigger('eventRender', [\n {\n event: new EventApi(view.calendar, seg.eventRange.def, seg.eventRange.instance),\n isMirror: isMirror,\n isStart: seg.isStart,\n isEnd: seg.isEnd,\n // TODO: include seg.range once all components consistently generate it\n el: seg.el,\n view: view\n }\n ]);\n if (custom === false) { // means don't render at all\n return false;\n }\n else if (custom && custom !== true) {\n seg.el = custom;\n }\n return true;\n });\n }\n for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {\n var seg = segs_1[_i];\n setElSeg(seg.el, seg);\n }\n return segs;\n }\n function setElSeg(el, seg) {\n el.fcSeg = seg;\n }\n function getElSeg(el) {\n return el.fcSeg || null;\n }\n // event ui computation\n function compileEventUis(eventDefs, eventUiBases) {\n return mapHash(eventDefs, function (eventDef) {\n return compileEventUi(eventDef, eventUiBases);\n });\n }\n function compileEventUi(eventDef, eventUiBases) {\n var uis = [];\n if (eventUiBases['']) {\n uis.push(eventUiBases['']);\n }\n if (eventUiBases[eventDef.defId]) {\n uis.push(eventUiBases[eventDef.defId]);\n }\n uis.push(eventDef.ui);\n return combineEventUis(uis);\n }\n\n // applies the mutation to ALL defs/instances within the event store\n function applyMutationToEventStore(eventStore, eventConfigBase, mutation, calendar) {\n var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase);\n var dest = createEmptyEventStore();\n for (var defId in eventStore.defs) {\n var def = eventStore.defs[defId];\n dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, calendar.pluginSystem.hooks.eventDefMutationAppliers, calendar);\n }\n for (var instanceId in eventStore.instances) {\n var instance = eventStore.instances[instanceId];\n var def = dest.defs[instance.defId]; // important to grab the newly modified def\n dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, calendar);\n }\n return dest;\n }\n function applyMutationToEventDef(eventDef, eventConfig, mutation, appliers, calendar) {\n var standardProps = mutation.standardProps || {};\n // if hasEnd has not been specified, guess a good value based on deltas.\n // if duration will change, there's no way the default duration will persist,\n // and thus, we need to mark the event as having a real end\n if (standardProps.hasEnd == null &&\n eventConfig.durationEditable &&\n willDeltasAffectDuration(eventConfig.startEditable ? mutation.startDelta : null, mutation.endDelta || null)) {\n standardProps.hasEnd = true; // TODO: is this mutation okay?\n }\n var copy = __assign({}, eventDef, standardProps, { ui: __assign({}, eventDef.ui, standardProps.ui) });\n if (mutation.extendedProps) {\n copy.extendedProps = __assign({}, copy.extendedProps, mutation.extendedProps);\n }\n for (var _i = 0, appliers_1 = appliers; _i < appliers_1.length; _i++) {\n var applier = appliers_1[_i];\n applier(copy, mutation, calendar);\n }\n if (!copy.hasEnd && calendar.opt('forceEventDuration')) {\n copy.hasEnd = true;\n }\n return copy;\n }\n function willDeltasAffectDuration(startDelta, endDelta) {\n if (startDelta && !asRoughMs(startDelta)) {\n startDelta = null;\n }\n if (endDelta && !asRoughMs(endDelta)) {\n endDelta = null;\n }\n if (!startDelta && !endDelta) {\n return false;\n }\n if (Boolean(startDelta) !== Boolean(endDelta)) {\n return true;\n }\n return !durationsEqual(startDelta, endDelta);\n }\n function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef\n eventConfig, mutation, calendar) {\n var dateEnv = calendar.dateEnv;\n var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true;\n var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false;\n var copy = __assign({}, eventInstance);\n if (forceAllDay) {\n copy.range = computeAlignedDayRange(copy.range);\n }\n if (mutation.startDelta && eventConfig.startEditable) {\n copy.range = {\n start: dateEnv.add(copy.range.start, mutation.startDelta),\n end: copy.range.end\n };\n }\n if (clearEnd) {\n copy.range = {\n start: copy.range.start,\n end: calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start)\n };\n }\n else if (mutation.endDelta &&\n (eventConfig.durationEditable ||\n !willDeltasAffectDuration(// TODO: nonDRY logic above\n eventConfig.startEditable ? mutation.startDelta : null, mutation.endDelta))) {\n copy.range = {\n start: copy.range.start,\n end: dateEnv.add(copy.range.end, mutation.endDelta)\n };\n }\n // in case event was all-day but the supplied deltas were not\n // better util for this?\n if (eventDef.allDay) {\n copy.range = {\n start: startOfDay(copy.range.start),\n end: startOfDay(copy.range.end)\n };\n }\n // handle invalid durations\n if (copy.range.end < copy.range.start) {\n copy.range.end = calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start);\n }\n return copy;\n }\n\n function reduceEventStore (eventStore, action, eventSources, dateProfile, calendar) {\n switch (action.type) {\n case 'RECEIVE_EVENTS': // raw\n return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, calendar);\n case 'ADD_EVENTS': // already parsed, but not expanded\n return addEvent(eventStore, action.eventStore, // new ones\n dateProfile ? dateProfile.activeRange : null, calendar);\n case 'MERGE_EVENTS': // already parsed and expanded\n return mergeEventStores(eventStore, action.eventStore);\n case 'PREV': // TODO: how do we track all actions that affect dateProfile :(\n case 'NEXT':\n case 'SET_DATE':\n case 'SET_VIEW_TYPE':\n if (dateProfile) {\n return expandRecurring(eventStore, dateProfile.activeRange, calendar);\n }\n else {\n return eventStore;\n }\n case 'CHANGE_TIMEZONE':\n return rezoneDates(eventStore, action.oldDateEnv, calendar.dateEnv);\n case 'MUTATE_EVENTS':\n return applyMutationToRelated(eventStore, action.instanceId, action.mutation, action.fromApi, calendar);\n case 'REMOVE_EVENT_INSTANCES':\n return excludeInstances(eventStore, action.instances);\n case 'REMOVE_EVENT_DEF':\n return filterEventStoreDefs(eventStore, function (eventDef) {\n return eventDef.defId !== action.defId;\n });\n case 'REMOVE_EVENT_SOURCE':\n return excludeEventsBySourceId(eventStore, action.sourceId);\n case 'REMOVE_ALL_EVENT_SOURCES':\n return filterEventStoreDefs(eventStore, function (eventDef) {\n return !eventDef.sourceId; // only keep events with no source id\n });\n case 'REMOVE_ALL_EVENTS':\n return createEmptyEventStore();\n case 'RESET_EVENTS':\n return {\n defs: eventStore.defs,\n instances: eventStore.instances\n };\n default:\n return eventStore;\n }\n }\n function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, calendar) {\n if (eventSource && // not already removed\n fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources\n ) {\n var subset = parseEvents(transformRawEvents(rawEvents, eventSource, calendar), eventSource.sourceId, calendar);\n if (fetchRange) {\n subset = expandRecurring(subset, fetchRange, calendar);\n }\n return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);\n }\n return eventStore;\n }\n function addEvent(eventStore, subset, expandRange, calendar) {\n if (expandRange) {\n subset = expandRecurring(subset, expandRange, calendar);\n }\n return mergeEventStores(eventStore, subset);\n }\n function rezoneDates(eventStore, oldDateEnv, newDateEnv) {\n var defs = eventStore.defs;\n var instances = mapHash(eventStore.instances, function (instance) {\n var def = defs[instance.defId];\n if (def.allDay || def.recurringDef) {\n return instance; // isn't dependent on timezone\n }\n else {\n return __assign({}, instance, { range: {\n start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)),\n end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo))\n }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo });\n }\n });\n return { defs: defs, instances: instances };\n }\n function applyMutationToRelated(eventStore, instanceId, mutation, fromApi, calendar) {\n var relevant = getRelevantEvents(eventStore, instanceId);\n var eventConfigBase = fromApi ?\n { '': {\n startEditable: true,\n durationEditable: true,\n constraints: [],\n overlap: null,\n allows: [],\n backgroundColor: '',\n borderColor: '',\n textColor: '',\n classNames: []\n } } :\n calendar.eventUiBases;\n relevant = applyMutationToEventStore(relevant, eventConfigBase, mutation, calendar);\n return mergeEventStores(eventStore, relevant);\n }\n function excludeEventsBySourceId(eventStore, sourceId) {\n return filterEventStoreDefs(eventStore, function (eventDef) {\n return eventDef.sourceId !== sourceId;\n });\n }\n // QUESTION: why not just return instances? do a general object-property-exclusion util\n function excludeInstances(eventStore, removals) {\n return {\n defs: eventStore.defs,\n instances: filterHash(eventStore.instances, function (instance) {\n return !removals[instance.instanceId];\n })\n };\n }\n\n // high-level segmenting-aware tester functions\n // ------------------------------------------------------------------------------------------------------------------------\n function isInteractionValid(interaction, calendar) {\n return isNewPropsValid({ eventDrag: interaction }, calendar); // HACK: the eventDrag props is used for ALL interactions\n }\n function isDateSelectionValid(dateSelection, calendar) {\n return isNewPropsValid({ dateSelection: dateSelection }, calendar);\n }\n function isNewPropsValid(newProps, calendar) {\n var view = calendar.view;\n var props = __assign({ businessHours: view ? view.props.businessHours : createEmptyEventStore(), dateSelection: '', eventStore: calendar.state.eventStore, eventUiBases: calendar.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps);\n return (calendar.pluginSystem.hooks.isPropsValid || isPropsValid)(props, calendar);\n }\n function isPropsValid(state, calendar, dateSpanMeta, filterConfig) {\n if (dateSpanMeta === void 0) { dateSpanMeta = {}; }\n if (state.eventDrag && !isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {\n return false;\n }\n if (state.dateSelection && !isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {\n return false;\n }\n return true;\n }\n // Moving Event Validation\n // ------------------------------------------------------------------------------------------------------------------------\n function isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig) {\n var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions\n var subjectEventStore = interaction.mutatedEvents;\n var subjectDefs = subjectEventStore.defs;\n var subjectInstances = subjectEventStore.instances;\n var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ?\n state.eventUiBases :\n { '': calendar.selectionConfig } // if not a real event, validate as a selection\n );\n if (filterConfig) {\n subjectConfigs = mapHash(subjectConfigs, filterConfig);\n }\n var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); // exclude the subject events. TODO: exclude defs too?\n var otherDefs = otherEventStore.defs;\n var otherInstances = otherEventStore.instances;\n var otherConfigs = compileEventUis(otherDefs, state.eventUiBases);\n for (var subjectInstanceId in subjectInstances) {\n var subjectInstance = subjectInstances[subjectInstanceId];\n var subjectRange = subjectInstance.range;\n var subjectConfig = subjectConfigs[subjectInstance.defId];\n var subjectDef = subjectDefs[subjectInstance.defId];\n // constraint\n if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, calendar)) {\n return false;\n }\n // overlap\n var overlapFunc = calendar.opt('eventOverlap');\n if (typeof overlapFunc !== 'function') {\n overlapFunc = null;\n }\n for (var otherInstanceId in otherInstances) {\n var otherInstance = otherInstances[otherInstanceId];\n // intersect! evaluate\n if (rangesIntersect(subjectRange, otherInstance.range)) {\n var otherOverlap = otherConfigs[otherInstance.defId].overlap;\n // consider the other event's overlap. only do this if the subject event is a \"real\" event\n if (otherOverlap === false && interaction.isEvent) {\n return false;\n }\n if (subjectConfig.overlap === false) {\n return false;\n }\n if (overlapFunc && !overlapFunc(new EventApi(calendar, otherDefs[otherInstance.defId], otherInstance), // still event\n new EventApi(calendar, subjectDef, subjectInstance) // moving event\n )) {\n return false;\n }\n }\n }\n // allow (a function)\n for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) {\n var subjectAllow = _a[_i];\n var subjectDateSpan = __assign({}, dateSpanMeta, { range: subjectInstance.range, allDay: subjectDef.allDay });\n var origDef = state.eventStore.defs[subjectDef.defId];\n var origInstance = state.eventStore.instances[subjectInstanceId];\n var eventApi = void 0;\n if (origDef) { // was previously in the calendar\n eventApi = new EventApi(calendar, origDef, origInstance);\n }\n else { // was an external event\n eventApi = new EventApi(calendar, subjectDef); // no instance, because had no dates\n }\n if (!subjectAllow(calendar.buildDateSpanApi(subjectDateSpan), eventApi)) {\n return false;\n }\n }\n }\n return true;\n }\n // Date Selection Validation\n // ------------------------------------------------------------------------------------------------------------------------\n function isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig) {\n var relevantEventStore = state.eventStore;\n var relevantDefs = relevantEventStore.defs;\n var relevantInstances = relevantEventStore.instances;\n var selection = state.dateSelection;\n var selectionRange = selection.range;\n var selectionConfig = calendar.selectionConfig;\n if (filterConfig) {\n selectionConfig = filterConfig(selectionConfig);\n }\n // constraint\n if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, calendar)) {\n return false;\n }\n // overlap\n var overlapFunc = calendar.opt('selectOverlap');\n if (typeof overlapFunc !== 'function') {\n overlapFunc = null;\n }\n for (var relevantInstanceId in relevantInstances) {\n var relevantInstance = relevantInstances[relevantInstanceId];\n // intersect! evaluate\n if (rangesIntersect(selectionRange, relevantInstance.range)) {\n if (selectionConfig.overlap === false) {\n return false;\n }\n if (overlapFunc && !overlapFunc(new EventApi(calendar, relevantDefs[relevantInstance.defId], relevantInstance))) {\n return false;\n }\n }\n }\n // allow (a function)\n for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) {\n var selectionAllow = _a[_i];\n var fullDateSpan = __assign({}, dateSpanMeta, selection);\n if (!selectionAllow(calendar.buildDateSpanApi(fullDateSpan), null)) {\n return false;\n }\n }\n return true;\n }\n // Constraint Utils\n // ------------------------------------------------------------------------------------------------------------------------\n function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, calendar) {\n for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) {\n var constraint = constraints_1[_i];\n if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, calendar), subjectRange)) {\n return false;\n }\n }\n return true;\n }\n function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours\n otherEventStore, // for if constraint is an even group ID\n businessHoursUnexpanded, // for if constraint is 'businessHours'\n calendar // for expanding businesshours\n ) {\n if (constraint === 'businessHours') {\n return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, calendar));\n }\n else if (typeof constraint === 'string') { // an group ID\n return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) {\n return eventDef.groupId === constraint;\n }));\n }\n else if (typeof constraint === 'object' && constraint) { // non-null object\n return eventStoreToRanges(expandRecurring(constraint, subjectRange, calendar));\n }\n return []; // if it's false\n }\n // TODO: move to event-store file?\n function eventStoreToRanges(eventStore) {\n var instances = eventStore.instances;\n var ranges = [];\n for (var instanceId in instances) {\n ranges.push(instances[instanceId].range);\n }\n return ranges;\n }\n // TODO: move to geom file?\n function anyRangesContainRange(outerRanges, innerRange) {\n for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) {\n var outerRange = outerRanges_1[_i];\n if (rangeContainsRange(outerRange, innerRange)) {\n return true;\n }\n }\n return false;\n }\n // Parsing\n // ------------------------------------------------------------------------------------------------------------------------\n function normalizeConstraint(input, calendar) {\n if (Array.isArray(input)) {\n return parseEvents(input, '', calendar, true); // allowOpenRange=true\n }\n else if (typeof input === 'object' && input) { // non-null object\n return parseEvents([input], '', calendar, true); // allowOpenRange=true\n }\n else if (input != null) {\n return String(input);\n }\n else {\n return null;\n }\n }\n\n function htmlEscape(s) {\n return (s + '').replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/'/g, ''')\n .replace(/\"/g, '"')\n .replace(/\\n/g, '
');\n }\n // Given a hash of CSS properties, returns a string of CSS.\n // Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.\n function cssToStr(cssProps) {\n var statements = [];\n for (var name_1 in cssProps) {\n var val = cssProps[name_1];\n if (val != null && val !== '') {\n statements.push(name_1 + ':' + val);\n }\n }\n return statements.join(';');\n }\n // Given an object hash of HTML attribute names to values,\n // generates a string that can be injected between < > in HTML\n function attrsToStr(attrs) {\n var parts = [];\n for (var name_2 in attrs) {\n var val = attrs[name_2];\n if (val != null) {\n parts.push(name_2 + '=\"' + htmlEscape(val) + '\"');\n }\n }\n return parts.join(' ');\n }\n function parseClassName(raw) {\n if (Array.isArray(raw)) {\n return raw;\n }\n else if (typeof raw === 'string') {\n return raw.split(/\\s+/);\n }\n else {\n return [];\n }\n }\n\n var UNSCOPED_EVENT_UI_PROPS = {\n editable: Boolean,\n startEditable: Boolean,\n durationEditable: Boolean,\n constraint: null,\n overlap: null,\n allow: null,\n className: parseClassName,\n classNames: parseClassName,\n color: String,\n backgroundColor: String,\n borderColor: String,\n textColor: String\n };\n function processUnscopedUiProps(rawProps, calendar, leftovers) {\n var props = refineProps(rawProps, UNSCOPED_EVENT_UI_PROPS, {}, leftovers);\n var constraint = normalizeConstraint(props.constraint, calendar);\n return {\n startEditable: props.startEditable != null ? props.startEditable : props.editable,\n durationEditable: props.durationEditable != null ? props.durationEditable : props.editable,\n constraints: constraint != null ? [constraint] : [],\n overlap: props.overlap,\n allows: props.allow != null ? [props.allow] : [],\n backgroundColor: props.backgroundColor || props.color,\n borderColor: props.borderColor || props.color,\n textColor: props.textColor,\n classNames: props.classNames.concat(props.className)\n };\n }\n function processScopedUiProps(prefix, rawScoped, calendar, leftovers) {\n var rawUnscoped = {};\n var wasFound = {};\n for (var key in UNSCOPED_EVENT_UI_PROPS) {\n var scopedKey = prefix + capitaliseFirstLetter(key);\n rawUnscoped[key] = rawScoped[scopedKey];\n wasFound[scopedKey] = true;\n }\n if (prefix === 'event') {\n rawUnscoped.editable = rawScoped.editable; // special case. there is no 'eventEditable', just 'editable'\n }\n if (leftovers) {\n for (var key in rawScoped) {\n if (!wasFound[key]) {\n leftovers[key] = rawScoped[key];\n }\n }\n }\n return processUnscopedUiProps(rawUnscoped, calendar);\n }\n var EMPTY_EVENT_UI = {\n startEditable: null,\n durationEditable: null,\n constraints: [],\n overlap: null,\n allows: [],\n backgroundColor: '',\n borderColor: '',\n textColor: '',\n classNames: []\n };\n // prevent against problems with <2 args!\n function combineEventUis(uis) {\n return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI);\n }\n function combineTwoEventUis(item0, item1) {\n return {\n startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable,\n durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable,\n constraints: item0.constraints.concat(item1.constraints),\n overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap,\n allows: item0.allows.concat(item1.allows),\n backgroundColor: item1.backgroundColor || item0.backgroundColor,\n borderColor: item1.borderColor || item0.borderColor,\n textColor: item1.textColor || item0.textColor,\n classNames: item0.classNames.concat(item1.classNames)\n };\n }\n\n var NON_DATE_PROPS = {\n id: String,\n groupId: String,\n title: String,\n url: String,\n rendering: String,\n extendedProps: null\n };\n var DATE_PROPS = {\n start: null,\n date: null,\n end: null,\n allDay: null\n };\n var uid = 0;\n function parseEvent(raw, sourceId, calendar, allowOpenRange) {\n var allDayDefault = computeIsAllDayDefault(sourceId, calendar);\n var leftovers0 = {};\n var recurringRes = parseRecurring(raw, // raw, but with single-event stuff stripped out\n allDayDefault, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes, leftovers0 // will populate with non-recurring props\n );\n if (recurringRes) {\n var def = parseEventDef(leftovers0, sourceId, recurringRes.allDay, Boolean(recurringRes.duration), calendar);\n def.recurringDef = {\n typeId: recurringRes.typeId,\n typeData: recurringRes.typeData,\n duration: recurringRes.duration\n };\n return { def: def, instance: null };\n }\n else {\n var leftovers1 = {};\n var singleRes = parseSingle(raw, allDayDefault, calendar, leftovers1, allowOpenRange);\n if (singleRes) {\n var def = parseEventDef(leftovers1, sourceId, singleRes.allDay, singleRes.hasEnd, calendar);\n var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo);\n return { def: def, instance: instance };\n }\n }\n return null;\n }\n /*\n Will NOT populate extendedProps with the leftover properties.\n Will NOT populate date-related props.\n The EventNonDateInput has been normalized (id => publicId, etc).\n */\n function parseEventDef(raw, sourceId, allDay, hasEnd, calendar) {\n var leftovers = {};\n var def = pluckNonDateProps(raw, calendar, leftovers);\n def.defId = String(uid++);\n def.sourceId = sourceId;\n def.allDay = allDay;\n def.hasEnd = hasEnd;\n for (var _i = 0, _a = calendar.pluginSystem.hooks.eventDefParsers; _i < _a.length; _i++) {\n var eventDefParser = _a[_i];\n var newLeftovers = {};\n eventDefParser(def, leftovers, newLeftovers);\n leftovers = newLeftovers;\n }\n def.extendedProps = __assign(leftovers, def.extendedProps || {});\n // help out EventApi from having user modify props\n Object.freeze(def.ui.classNames);\n Object.freeze(def.extendedProps);\n return def;\n }\n function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) {\n return {\n instanceId: String(uid++),\n defId: defId,\n range: range,\n forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo,\n forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo\n };\n }\n function parseSingle(raw, allDayDefault, calendar, leftovers, allowOpenRange) {\n var props = pluckDateProps(raw, leftovers);\n var allDay = props.allDay;\n var startMeta;\n var startMarker = null;\n var hasEnd = false;\n var endMeta;\n var endMarker = null;\n startMeta = calendar.dateEnv.createMarkerMeta(props.start);\n if (startMeta) {\n startMarker = startMeta.marker;\n }\n else if (!allowOpenRange) {\n return null;\n }\n if (props.end != null) {\n endMeta = calendar.dateEnv.createMarkerMeta(props.end);\n }\n if (allDay == null) {\n if (allDayDefault != null) {\n allDay = allDayDefault;\n }\n else {\n // fall back to the date props LAST\n allDay = (!startMeta || startMeta.isTimeUnspecified) &&\n (!endMeta || endMeta.isTimeUnspecified);\n }\n }\n if (allDay && startMarker) {\n startMarker = startOfDay(startMarker);\n }\n if (endMeta) {\n endMarker = endMeta.marker;\n if (allDay) {\n endMarker = startOfDay(endMarker);\n }\n if (startMarker && endMarker <= startMarker) {\n endMarker = null;\n }\n }\n if (endMarker) {\n hasEnd = true;\n }\n else if (!allowOpenRange) {\n hasEnd = calendar.opt('forceEventDuration') || false;\n endMarker = calendar.dateEnv.add(startMarker, allDay ?\n calendar.defaultAllDayEventDuration :\n calendar.defaultTimedEventDuration);\n }\n return {\n allDay: allDay,\n hasEnd: hasEnd,\n range: { start: startMarker, end: endMarker },\n forcedStartTzo: startMeta ? startMeta.forcedTzo : null,\n forcedEndTzo: endMeta ? endMeta.forcedTzo : null\n };\n }\n function pluckDateProps(raw, leftovers) {\n var props = refineProps(raw, DATE_PROPS, {}, leftovers);\n props.start = (props.start !== null) ? props.start : props.date;\n delete props.date;\n return props;\n }\n function pluckNonDateProps(raw, calendar, leftovers) {\n var preLeftovers = {};\n var props = refineProps(raw, NON_DATE_PROPS, {}, preLeftovers);\n var ui = processUnscopedUiProps(preLeftovers, calendar, leftovers);\n props.publicId = props.id;\n delete props.id;\n props.ui = ui;\n return props;\n }\n function computeIsAllDayDefault(sourceId, calendar) {\n var res = null;\n if (sourceId) {\n var source = calendar.state.eventSources[sourceId];\n res = source.allDayDefault;\n }\n if (res == null) {\n res = calendar.opt('allDayDefault');\n }\n return res;\n }\n\n var DEF_DEFAULTS = {\n startTime: '09:00',\n endTime: '17:00',\n daysOfWeek: [1, 2, 3, 4, 5],\n rendering: 'inverse-background',\n classNames: 'fc-nonbusiness',\n groupId: '_businessHours' // so multiple defs get grouped\n };\n /*\n TODO: pass around as EventDefHash!!!\n */\n function parseBusinessHours(input, calendar) {\n return parseEvents(refineInputs(input), '', calendar);\n }\n function refineInputs(input) {\n var rawDefs;\n if (input === true) {\n rawDefs = [{}]; // will get DEF_DEFAULTS verbatim\n }\n else if (Array.isArray(input)) {\n // if specifying an array, every sub-definition NEEDS a day-of-week\n rawDefs = input.filter(function (rawDef) {\n return rawDef.daysOfWeek;\n });\n }\n else if (typeof input === 'object' && input) { // non-null object\n rawDefs = [input];\n }\n else { // is probably false\n rawDefs = [];\n }\n rawDefs = rawDefs.map(function (rawDef) {\n return __assign({}, DEF_DEFAULTS, rawDef);\n });\n return rawDefs;\n }\n\n function memoizeRendering(renderFunc, unrenderFunc, dependencies) {\n if (dependencies === void 0) { dependencies = []; }\n var dependents = [];\n var thisContext;\n var prevArgs;\n function unrender() {\n if (prevArgs) {\n for (var _i = 0, dependents_1 = dependents; _i < dependents_1.length; _i++) {\n var dependent = dependents_1[_i];\n dependent.unrender();\n }\n if (unrenderFunc) {\n unrenderFunc.apply(thisContext, prevArgs);\n }\n prevArgs = null;\n }\n }\n function res() {\n if (!prevArgs || !isArraysEqual(prevArgs, arguments)) {\n unrender();\n thisContext = this;\n prevArgs = arguments;\n renderFunc.apply(this, arguments);\n }\n }\n res.dependents = dependents;\n res.unrender = unrender;\n for (var _i = 0, dependencies_1 = dependencies; _i < dependencies_1.length; _i++) {\n var dependency = dependencies_1[_i];\n dependency.dependents.push(res);\n }\n return res;\n }\n\n function isValuesSimilar(val0, val1, depth) {\n if (depth === void 0) { depth = 1; }\n if (val0 === val1) {\n return true;\n }\n else if (Array.isArray(val0) && Array.isArray(val1)) {\n return isArraysSimilar(val0, val1, depth);\n }\n else if (typeof val0 === 'object' && val0 && typeof val1 === 'object' && val1) { // non-null objects\n return isObjectsSimilar(val0, val1, depth);\n }\n else {\n return false;\n }\n }\n function isArraysSimilar(a0, a1, depth) {\n if (depth === void 0) { depth = 1; }\n if (a0 === a1) {\n return true;\n }\n else if (depth > 0) {\n if (a0.length !== a1.length) {\n return false;\n }\n else {\n for (var i = 0; i < a0.length; i++) {\n if (!isValuesSimilar(a0[i], a1[i], depth - 1)) {\n return false;\n }\n }\n return true;\n }\n }\n else {\n return false;\n }\n }\n function isObjectsSimilar(obj0, obj1, depth) {\n if (depth === void 0) { depth = 1; }\n if (obj0 === obj1) {\n return true;\n }\n else if (depth > 0) {\n for (var prop in obj0) {\n if (!(prop in obj1)) {\n return false;\n }\n }\n for (var prop in obj1) {\n if (!(prop in obj0)) {\n return false;\n }\n else {\n if (!isValuesSimilar(obj0[prop], obj1[prop], depth - 1)) {\n return false;\n }\n }\n }\n return true;\n }\n else {\n return false;\n }\n }\n function computeChangedProps(obj0, obj1, depth) {\n if (depth === void 0) { depth = 1; }\n var res = {};\n for (var prop in obj1) {\n if (!(prop in obj0) ||\n !isValuesSimilar(obj0[prop], obj1[prop], depth - 1)) {\n res[prop] = obj1[prop];\n }\n }\n return res;\n }\n function anyKeysRemoved(obj0, obj1) {\n for (var prop in obj0) {\n if (!(prop in obj1)) {\n return true;\n }\n }\n return false;\n }\n\n var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere\n var Splitter = /** @class */ (function () {\n function Splitter() {\n this.getKeysForEventDefs = memoize(this._getKeysForEventDefs);\n this.splitDateSelection = memoize(this._splitDateSpan);\n this.splitEventStore = memoize(this._splitEventStore);\n this.splitIndividualUi = memoize(this._splitIndividualUi);\n this.splitEventDrag = memoize(this._splitInteraction);\n this.splitEventResize = memoize(this._splitInteraction);\n this.eventUiBuilders = {}; // TODO: typescript protection\n }\n Splitter.prototype.splitProps = function (props) {\n var _this = this;\n var keyInfos = this.getKeyInfo(props);\n var defKeys = this.getKeysForEventDefs(props.eventStore);\n var dateSelections = this.splitDateSelection(props.dateSelection);\n var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases*\n var eventStores = this.splitEventStore(props.eventStore, defKeys);\n var eventDrags = this.splitEventDrag(props.eventDrag);\n var eventResizes = this.splitEventResize(props.eventResize);\n var splitProps = {};\n this.eventUiBuilders = mapHash(keyInfos, function (info, key) {\n return _this.eventUiBuilders[key] || memoize(buildEventUiForKey);\n });\n for (var key in keyInfos) {\n var keyInfo = keyInfos[key];\n var eventStore = eventStores[key] || EMPTY_EVENT_STORE;\n var buildEventUi = this.eventUiBuilders[key];\n splitProps[key] = {\n businessHours: keyInfo.businessHours || props.businessHours,\n dateSelection: dateSelections[key] || null,\n eventStore: eventStore,\n eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]),\n eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '',\n eventDrag: eventDrags[key] || null,\n eventResize: eventResizes[key] || null\n };\n }\n return splitProps;\n };\n Splitter.prototype._splitDateSpan = function (dateSpan) {\n var dateSpans = {};\n if (dateSpan) {\n var keys = this.getKeysForDateSpan(dateSpan);\n for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\n var key = keys_1[_i];\n dateSpans[key] = dateSpan;\n }\n }\n return dateSpans;\n };\n Splitter.prototype._getKeysForEventDefs = function (eventStore) {\n var _this = this;\n return mapHash(eventStore.defs, function (eventDef) {\n return _this.getKeysForEventDef(eventDef);\n });\n };\n Splitter.prototype._splitEventStore = function (eventStore, defKeys) {\n var defs = eventStore.defs, instances = eventStore.instances;\n var splitStores = {};\n for (var defId in defs) {\n for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {\n var key = _a[_i];\n if (!splitStores[key]) {\n splitStores[key] = createEmptyEventStore();\n }\n splitStores[key].defs[defId] = defs[defId];\n }\n }\n for (var instanceId in instances) {\n var instance = instances[instanceId];\n for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) {\n var key = _c[_b];\n if (splitStores[key]) { // must have already been created\n splitStores[key].instances[instanceId] = instance;\n }\n }\n }\n return splitStores;\n };\n Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) {\n var splitHashes = {};\n for (var defId in eventUiBases) {\n if (defId) { // not the '' key\n for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {\n var key = _a[_i];\n if (!splitHashes[key]) {\n splitHashes[key] = {};\n }\n splitHashes[key][defId] = eventUiBases[defId];\n }\n }\n }\n return splitHashes;\n };\n Splitter.prototype._splitInteraction = function (interaction) {\n var splitStates = {};\n if (interaction) {\n var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents) // can't use cached. might be events from other calendar\n );\n // can't rely on defKeys because event data is mutated\n var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents);\n var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId);\n var populate = function (key) {\n if (!splitStates[key]) {\n splitStates[key] = {\n affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE,\n mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE,\n isEvent: interaction.isEvent,\n origSeg: interaction.origSeg\n };\n }\n };\n for (var key in affectedStores_1) {\n populate(key);\n }\n for (var key in mutatedStores_1) {\n populate(key);\n }\n }\n return splitStates;\n };\n return Splitter;\n }());\n function buildEventUiForKey(allUi, eventUiForKey, individualUi) {\n var baseParts = [];\n if (allUi) {\n baseParts.push(allUi);\n }\n if (eventUiForKey) {\n baseParts.push(eventUiForKey);\n }\n var stuff = {\n '': combineEventUis(baseParts)\n };\n if (individualUi) {\n __assign(stuff, individualUi);\n }\n return stuff;\n }\n\n // Generates HTML for an anchor to another view into the calendar.\n // Will either generate an tag or a non-clickable tag, depending on enabled settings.\n // `gotoOptions` can either be a DateMarker, or an object with the form:\n // { date, type, forceOff }\n // `type` is a view-type like \"day\" or \"week\". default value is \"day\".\n // `attrs` and `innerHtml` are use to generate the rest of the HTML tag.\n function buildGotoAnchorHtml(component, gotoOptions, attrs, innerHtml) {\n var dateEnv = component.dateEnv;\n var date;\n var type;\n var forceOff;\n var finalOptions;\n if (gotoOptions instanceof Date) {\n date = gotoOptions; // a single date-like input\n }\n else {\n date = gotoOptions.date;\n type = gotoOptions.type;\n forceOff = gotoOptions.forceOff;\n }\n finalOptions = {\n date: dateEnv.formatIso(date, { omitTime: true }),\n type: type || 'day'\n };\n if (typeof attrs === 'string') {\n innerHtml = attrs;\n attrs = null;\n }\n attrs = attrs ? ' ' + attrsToStr(attrs) : ''; // will have a leading space\n innerHtml = innerHtml || '';\n if (!forceOff && component.opt('navLinks')) {\n return '' +\n innerHtml +\n '';\n }\n else {\n return '' +\n innerHtml +\n '';\n }\n }\n function getAllDayHtml(component) {\n return component.opt('allDayHtml') || htmlEscape(component.opt('allDayText'));\n }\n // Computes HTML classNames for a single-day element\n function getDayClasses(date, dateProfile, context, noThemeHighlight) {\n var calendar = context.calendar, view = context.view, theme = context.theme, dateEnv = context.dateEnv;\n var classes = [];\n var todayStart;\n var todayEnd;\n if (!rangeContainsMarker(dateProfile.activeRange, date)) {\n classes.push('fc-disabled-day');\n }\n else {\n classes.push('fc-' + DAY_IDS[date.getUTCDay()]);\n if (view.opt('monthMode') &&\n dateEnv.getMonth(date) !== dateEnv.getMonth(dateProfile.currentRange.start)) {\n classes.push('fc-other-month');\n }\n todayStart = startOfDay(calendar.getNow());\n todayEnd = addDays(todayStart, 1);\n if (date < todayStart) {\n classes.push('fc-past');\n }\n else if (date >= todayEnd) {\n classes.push('fc-future');\n }\n else {\n classes.push('fc-today');\n if (noThemeHighlight !== true) {\n classes.push(theme.getClass('today'));\n }\n }\n }\n return classes;\n }\n\n // given a function that resolves a result asynchronously.\n // the function can either call passed-in success and failure callbacks,\n // or it can return a promise.\n // if you need to pass additional params to func, bind them first.\n function unpromisify(func, success, failure) {\n // guard against success/failure callbacks being called more than once\n // and guard against a promise AND callback being used together.\n var isResolved = false;\n var wrappedSuccess = function () {\n if (!isResolved) {\n isResolved = true;\n success.apply(this, arguments);\n }\n };\n var wrappedFailure = function () {\n if (!isResolved) {\n isResolved = true;\n if (failure) {\n failure.apply(this, arguments);\n }\n }\n };\n var res = func(wrappedSuccess, wrappedFailure);\n if (res && typeof res.then === 'function') {\n res.then(wrappedSuccess, wrappedFailure);\n }\n }\n\n var Mixin = /** @class */ (function () {\n function Mixin() {\n }\n // mix into a CLASS\n Mixin.mixInto = function (destClass) {\n this.mixIntoObj(destClass.prototype);\n };\n // mix into ANY object\n Mixin.mixIntoObj = function (destObj) {\n var _this = this;\n Object.getOwnPropertyNames(this.prototype).forEach(function (name) {\n if (!destObj[name]) { // if destination doesn't already define it\n destObj[name] = _this.prototype[name];\n }\n });\n };\n /*\n will override existing methods\n TODO: remove! not used anymore\n */\n Mixin.mixOver = function (destClass) {\n var _this = this;\n Object.getOwnPropertyNames(this.prototype).forEach(function (name) {\n destClass.prototype[name] = _this.prototype[name];\n });\n };\n return Mixin;\n }());\n\n /*\n USAGE:\n import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'\n in class:\n on: EmitterInterface['on']\n one: EmitterInterface['one']\n off: EmitterInterface['off']\n trigger: EmitterInterface['trigger']\n triggerWith: EmitterInterface['triggerWith']\n hasHandlers: EmitterInterface['hasHandlers']\n after class:\n EmitterMixin.mixInto(TheClass)\n */\n var EmitterMixin = /** @class */ (function (_super) {\n __extends(EmitterMixin, _super);\n function EmitterMixin() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n EmitterMixin.prototype.on = function (type, handler) {\n addToHash(this._handlers || (this._handlers = {}), type, handler);\n return this; // for chaining\n };\n // todo: add comments\n EmitterMixin.prototype.one = function (type, handler) {\n addToHash(this._oneHandlers || (this._oneHandlers = {}), type, handler);\n return this; // for chaining\n };\n EmitterMixin.prototype.off = function (type, handler) {\n if (this._handlers) {\n removeFromHash(this._handlers, type, handler);\n }\n if (this._oneHandlers) {\n removeFromHash(this._oneHandlers, type, handler);\n }\n return this; // for chaining\n };\n EmitterMixin.prototype.trigger = function (type) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n this.triggerWith(type, this, args);\n return this; // for chaining\n };\n EmitterMixin.prototype.triggerWith = function (type, context, args) {\n if (this._handlers) {\n applyAll(this._handlers[type], context, args);\n }\n if (this._oneHandlers) {\n applyAll(this._oneHandlers[type], context, args);\n delete this._oneHandlers[type]; // will never fire again\n }\n return this; // for chaining\n };\n EmitterMixin.prototype.hasHandlers = function (type) {\n return (this._handlers && this._handlers[type] && this._handlers[type].length) ||\n (this._oneHandlers && this._oneHandlers[type] && this._oneHandlers[type].length);\n };\n return EmitterMixin;\n }(Mixin));\n function addToHash(hash, type, handler) {\n (hash[type] || (hash[type] = []))\n .push(handler);\n }\n function removeFromHash(hash, type, handler) {\n if (handler) {\n if (hash[type]) {\n hash[type] = hash[type].filter(function (func) {\n return func !== handler;\n });\n }\n }\n else {\n delete hash[type]; // remove all handler funcs for this type\n }\n }\n\n /*\n Records offset information for a set of elements, relative to an origin element.\n Can record the left/right OR the top/bottom OR both.\n Provides methods for querying the cache by position.\n */\n var PositionCache = /** @class */ (function () {\n function PositionCache(originEl, els, isHorizontal, isVertical) {\n this.originEl = originEl;\n this.els = els;\n this.isHorizontal = isHorizontal;\n this.isVertical = isVertical;\n }\n // Queries the els for coordinates and stores them.\n // Call this method before using and of the get* methods below.\n PositionCache.prototype.build = function () {\n var originEl = this.originEl;\n var originClientRect = this.originClientRect =\n originEl.getBoundingClientRect(); // relative to viewport top-left\n if (this.isHorizontal) {\n this.buildElHorizontals(originClientRect.left);\n }\n if (this.isVertical) {\n this.buildElVerticals(originClientRect.top);\n }\n };\n // Populates the left/right internal coordinate arrays\n PositionCache.prototype.buildElHorizontals = function (originClientLeft) {\n var lefts = [];\n var rights = [];\n for (var _i = 0, _a = this.els; _i < _a.length; _i++) {\n var el = _a[_i];\n var rect = el.getBoundingClientRect();\n lefts.push(rect.left - originClientLeft);\n rights.push(rect.right - originClientLeft);\n }\n this.lefts = lefts;\n this.rights = rights;\n };\n // Populates the top/bottom internal coordinate arrays\n PositionCache.prototype.buildElVerticals = function (originClientTop) {\n var tops = [];\n var bottoms = [];\n for (var _i = 0, _a = this.els; _i < _a.length; _i++) {\n var el = _a[_i];\n var rect = el.getBoundingClientRect();\n tops.push(rect.top - originClientTop);\n bottoms.push(rect.bottom - originClientTop);\n }\n this.tops = tops;\n this.bottoms = bottoms;\n };\n // Given a left offset (from document left), returns the index of the el that it horizontally intersects.\n // If no intersection is made, returns undefined.\n PositionCache.prototype.leftToIndex = function (leftPosition) {\n var lefts = this.lefts;\n var rights = this.rights;\n var len = lefts.length;\n var i;\n for (i = 0; i < len; i++) {\n if (leftPosition >= lefts[i] && leftPosition < rights[i]) {\n return i;\n }\n }\n };\n // Given a top offset (from document top), returns the index of the el that it vertically intersects.\n // If no intersection is made, returns undefined.\n PositionCache.prototype.topToIndex = function (topPosition) {\n var tops = this.tops;\n var bottoms = this.bottoms;\n var len = tops.length;\n var i;\n for (i = 0; i < len; i++) {\n if (topPosition >= tops[i] && topPosition < bottoms[i]) {\n return i;\n }\n }\n };\n // Gets the width of the element at the given index\n PositionCache.prototype.getWidth = function (leftIndex) {\n return this.rights[leftIndex] - this.lefts[leftIndex];\n };\n // Gets the height of the element at the given index\n PositionCache.prototype.getHeight = function (topIndex) {\n return this.bottoms[topIndex] - this.tops[topIndex];\n };\n return PositionCache;\n }());\n\n /*\n An object for getting/setting scroll-related information for an element.\n Internally, this is done very differently for window versus DOM element,\n so this object serves as a common interface.\n */\n var ScrollController = /** @class */ (function () {\n function ScrollController() {\n }\n ScrollController.prototype.getMaxScrollTop = function () {\n return this.getScrollHeight() - this.getClientHeight();\n };\n ScrollController.prototype.getMaxScrollLeft = function () {\n return this.getScrollWidth() - this.getClientWidth();\n };\n ScrollController.prototype.canScrollVertically = function () {\n return this.getMaxScrollTop() > 0;\n };\n ScrollController.prototype.canScrollHorizontally = function () {\n return this.getMaxScrollLeft() > 0;\n };\n ScrollController.prototype.canScrollUp = function () {\n return this.getScrollTop() > 0;\n };\n ScrollController.prototype.canScrollDown = function () {\n return this.getScrollTop() < this.getMaxScrollTop();\n };\n ScrollController.prototype.canScrollLeft = function () {\n return this.getScrollLeft() > 0;\n };\n ScrollController.prototype.canScrollRight = function () {\n return this.getScrollLeft() < this.getMaxScrollLeft();\n };\n return ScrollController;\n }());\n var ElementScrollController = /** @class */ (function (_super) {\n __extends(ElementScrollController, _super);\n function ElementScrollController(el) {\n var _this = _super.call(this) || this;\n _this.el = el;\n return _this;\n }\n ElementScrollController.prototype.getScrollTop = function () {\n return this.el.scrollTop;\n };\n ElementScrollController.prototype.getScrollLeft = function () {\n return this.el.scrollLeft;\n };\n ElementScrollController.prototype.setScrollTop = function (top) {\n this.el.scrollTop = top;\n };\n ElementScrollController.prototype.setScrollLeft = function (left) {\n this.el.scrollLeft = left;\n };\n ElementScrollController.prototype.getScrollWidth = function () {\n return this.el.scrollWidth;\n };\n ElementScrollController.prototype.getScrollHeight = function () {\n return this.el.scrollHeight;\n };\n ElementScrollController.prototype.getClientHeight = function () {\n return this.el.clientHeight;\n };\n ElementScrollController.prototype.getClientWidth = function () {\n return this.el.clientWidth;\n };\n return ElementScrollController;\n }(ScrollController));\n var WindowScrollController = /** @class */ (function (_super) {\n __extends(WindowScrollController, _super);\n function WindowScrollController() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n WindowScrollController.prototype.getScrollTop = function () {\n return window.pageYOffset;\n };\n WindowScrollController.prototype.getScrollLeft = function () {\n return window.pageXOffset;\n };\n WindowScrollController.prototype.setScrollTop = function (n) {\n window.scroll(window.pageXOffset, n);\n };\n WindowScrollController.prototype.setScrollLeft = function (n) {\n window.scroll(n, window.pageYOffset);\n };\n WindowScrollController.prototype.getScrollWidth = function () {\n return document.documentElement.scrollWidth;\n };\n WindowScrollController.prototype.getScrollHeight = function () {\n return document.documentElement.scrollHeight;\n };\n WindowScrollController.prototype.getClientHeight = function () {\n return document.documentElement.clientHeight;\n };\n WindowScrollController.prototype.getClientWidth = function () {\n return document.documentElement.clientWidth;\n };\n return WindowScrollController;\n }(ScrollController));\n\n /*\n Embodies a div that has potential scrollbars\n */\n var ScrollComponent = /** @class */ (function (_super) {\n __extends(ScrollComponent, _super);\n function ScrollComponent(overflowX, overflowY) {\n var _this = _super.call(this, createElement('div', {\n className: 'fc-scroller'\n })) || this;\n _this.overflowX = overflowX;\n _this.overflowY = overflowY;\n _this.applyOverflow();\n return _this;\n }\n // sets to natural height, unlocks overflow\n ScrollComponent.prototype.clear = function () {\n this.setHeight('auto');\n this.applyOverflow();\n };\n ScrollComponent.prototype.destroy = function () {\n removeElement(this.el);\n };\n // Overflow\n // -----------------------------------------------------------------------------------------------------------------\n ScrollComponent.prototype.applyOverflow = function () {\n applyStyle(this.el, {\n overflowX: this.overflowX,\n overflowY: this.overflowY\n });\n };\n // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.\n // Useful for preserving scrollbar widths regardless of future resizes.\n // Can pass in scrollbarWidths for optimization.\n ScrollComponent.prototype.lockOverflow = function (scrollbarWidths) {\n var overflowX = this.overflowX;\n var overflowY = this.overflowY;\n scrollbarWidths = scrollbarWidths || this.getScrollbarWidths();\n if (overflowX === 'auto') {\n overflowX = (scrollbarWidths.bottom || // horizontal scrollbars?\n this.canScrollHorizontally() // OR scrolling pane with massless scrollbars?\n ) ? 'scroll' : 'hidden';\n }\n if (overflowY === 'auto') {\n overflowY = (scrollbarWidths.left || scrollbarWidths.right || // horizontal scrollbars?\n this.canScrollVertically() // OR scrolling pane with massless scrollbars?\n ) ? 'scroll' : 'hidden';\n }\n applyStyle(this.el, { overflowX: overflowX, overflowY: overflowY });\n };\n ScrollComponent.prototype.setHeight = function (height) {\n applyStyleProp(this.el, 'height', height);\n };\n ScrollComponent.prototype.getScrollbarWidths = function () {\n var edges = computeEdges(this.el);\n return {\n left: edges.scrollbarLeft,\n right: edges.scrollbarRight,\n bottom: edges.scrollbarBottom\n };\n };\n return ScrollComponent;\n }(ElementScrollController));\n\n var Theme = /** @class */ (function () {\n function Theme(calendarOptions) {\n this.calendarOptions = calendarOptions;\n this.processIconOverride();\n }\n Theme.prototype.processIconOverride = function () {\n if (this.iconOverrideOption) {\n this.setIconOverride(this.calendarOptions[this.iconOverrideOption]);\n }\n };\n Theme.prototype.setIconOverride = function (iconOverrideHash) {\n var iconClassesCopy;\n var buttonName;\n if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object\n iconClassesCopy = __assign({}, this.iconClasses);\n for (buttonName in iconOverrideHash) {\n iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);\n }\n this.iconClasses = iconClassesCopy;\n }\n else if (iconOverrideHash === false) {\n this.iconClasses = {};\n }\n };\n Theme.prototype.applyIconOverridePrefix = function (className) {\n var prefix = this.iconOverridePrefix;\n if (prefix && className.indexOf(prefix) !== 0) { // if not already present\n className = prefix + className;\n }\n return className;\n };\n Theme.prototype.getClass = function (key) {\n return this.classes[key] || '';\n };\n Theme.prototype.getIconClass = function (buttonName) {\n var className = this.iconClasses[buttonName];\n if (className) {\n return this.baseIconClass + ' ' + className;\n }\n return '';\n };\n Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {\n var className;\n if (this.iconOverrideCustomButtonOption) {\n className = customButtonProps[this.iconOverrideCustomButtonOption];\n if (className) {\n return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);\n }\n }\n return '';\n };\n return Theme;\n }());\n Theme.prototype.classes = {};\n Theme.prototype.iconClasses = {};\n Theme.prototype.baseIconClass = '';\n Theme.prototype.iconOverridePrefix = '';\n\n var guid = 0;\n var Component = /** @class */ (function () {\n function Component(context, isView) {\n // HACK to populate view at top of component instantiation call chain\n if (isView) {\n context.view = this;\n }\n this.uid = String(guid++);\n this.context = context;\n this.dateEnv = context.dateEnv;\n this.theme = context.theme;\n this.view = context.view;\n this.calendar = context.calendar;\n this.isRtl = this.opt('dir') === 'rtl';\n }\n Component.addEqualityFuncs = function (newFuncs) {\n this.prototype.equalityFuncs = __assign({}, this.prototype.equalityFuncs, newFuncs);\n };\n Component.prototype.opt = function (name) {\n return this.context.options[name];\n };\n Component.prototype.receiveProps = function (props) {\n var _a = recycleProps(this.props || {}, props, this.equalityFuncs), anyChanges = _a.anyChanges, comboProps = _a.comboProps;\n this.props = comboProps;\n if (anyChanges) {\n this.render(comboProps);\n }\n };\n Component.prototype.render = function (props) {\n };\n // after destroy is called, this component won't ever be used again\n Component.prototype.destroy = function () {\n };\n return Component;\n }());\n Component.prototype.equalityFuncs = {};\n /*\n Reuses old values when equal. If anything is unequal, returns newProps as-is.\n Great for PureComponent, but won't be feasible with React, so just eliminate and use React's DOM diffing.\n */\n function recycleProps(oldProps, newProps, equalityFuncs) {\n var comboProps = {}; // some old, some new\n var anyChanges = false;\n for (var key in newProps) {\n if (key in oldProps && (oldProps[key] === newProps[key] ||\n (equalityFuncs[key] && equalityFuncs[key](oldProps[key], newProps[key])))) {\n // equal to old? use old prop\n comboProps[key] = oldProps[key];\n }\n else {\n comboProps[key] = newProps[key];\n anyChanges = true;\n }\n }\n for (var key in oldProps) {\n if (!(key in newProps)) {\n anyChanges = true;\n break;\n }\n }\n return { anyChanges: anyChanges, comboProps: comboProps };\n }\n\n /*\n PURPOSES:\n - hook up to fg, fill, and mirror renderers\n - interface for dragging and hits\n */\n var DateComponent = /** @class */ (function (_super) {\n __extends(DateComponent, _super);\n function DateComponent(context, el, isView) {\n var _this = _super.call(this, context, isView) || this;\n _this.el = el;\n return _this;\n }\n DateComponent.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n removeElement(this.el);\n };\n // TODO: WHAT ABOUT (sourceSeg && sourceSeg.component.doesDragMirror)\n //\n // Event Drag-n-Drop Rendering (for both events and external elements)\n // ---------------------------------------------------------------------------------------------------------------\n /*\n renderEventDragSegs(state: EventSegUiInteractionState) {\n if (state) {\n let { isEvent, segs, sourceSeg } = state\n \n if (this.eventRenderer) {\n this.eventRenderer.hideByHash(state.affectedInstances)\n }\n \n // if the user is dragging something that is considered an event with real event data,\n // and this component likes to do drag mirrors OR the component where the seg came from\n // likes to do drag mirrors, then render a drag mirror.\n if (isEvent && (this.doesDragMirror || sourceSeg && sourceSeg.component.doesDragMirror)) {\n if (this.mirrorRenderer) {\n this.mirrorRenderer.renderSegs(segs, { isDragging: true, sourceSeg })\n }\n }\n \n // if it would be impossible to render a drag mirror OR this component likes to render\n // highlights, then render a highlight.\n if (!isEvent || this.doesDragHighlight) {\n if (this.fillRenderer) {\n this.fillRenderer.renderSegs('highlight', segs)\n }\n }\n }\n }\n */\n // Hit System\n // -----------------------------------------------------------------------------------------------------------------\n DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {\n return null; // this should be abstract\n };\n // Validation\n // -----------------------------------------------------------------------------------------------------------------\n DateComponent.prototype.isInteractionValid = function (interaction) {\n var calendar = this.calendar;\n var dateProfile = this.props.dateProfile; // HACK\n var instances = interaction.mutatedEvents.instances;\n if (dateProfile) { // HACK for DayTile\n for (var instanceId in instances) {\n if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) {\n return false;\n }\n }\n }\n return isInteractionValid(interaction, calendar);\n };\n DateComponent.prototype.isDateSelectionValid = function (selection) {\n var dateProfile = this.props.dateProfile; // HACK\n if (dateProfile && // HACK for DayTile\n !rangeContainsRange(dateProfile.validRange, selection.range)) {\n return false;\n }\n return isDateSelectionValid(selection, this.calendar);\n };\n // Triggering\n // -----------------------------------------------------------------------------------------------------------------\n // TODO: move to Calendar\n DateComponent.prototype.publiclyTrigger = function (name, args) {\n var calendar = this.calendar;\n return calendar.publiclyTrigger(name, args);\n };\n DateComponent.prototype.publiclyTriggerAfterSizing = function (name, args) {\n var calendar = this.calendar;\n return calendar.publiclyTriggerAfterSizing(name, args);\n };\n DateComponent.prototype.hasPublicHandlers = function (name) {\n var calendar = this.calendar;\n return calendar.hasPublicHandlers(name);\n };\n DateComponent.prototype.triggerRenderedSegs = function (segs, isMirrors) {\n var calendar = this.calendar;\n if (this.hasPublicHandlers('eventPositioned')) {\n for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {\n var seg = segs_1[_i];\n this.publiclyTriggerAfterSizing('eventPositioned', [\n {\n event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),\n isMirror: isMirrors,\n isStart: seg.isStart,\n isEnd: seg.isEnd,\n el: seg.el,\n view: this // ?\n }\n ]);\n }\n }\n if (!calendar.state.loadingLevel) { // avoid initial empty state while pending\n calendar.afterSizingTriggers._eventsPositioned = [null]; // fire once\n }\n };\n DateComponent.prototype.triggerWillRemoveSegs = function (segs, isMirrors) {\n var calendar = this.calendar;\n for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {\n var seg = segs_2[_i];\n calendar.trigger('eventElRemove', seg.el);\n }\n if (this.hasPublicHandlers('eventDestroy')) {\n for (var _a = 0, segs_3 = segs; _a < segs_3.length; _a++) {\n var seg = segs_3[_a];\n this.publiclyTrigger('eventDestroy', [\n {\n event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),\n isMirror: isMirrors,\n el: seg.el,\n view: this // ?\n }\n ]);\n }\n }\n };\n // Pointer Interaction Utils\n // -----------------------------------------------------------------------------------------------------------------\n DateComponent.prototype.isValidSegDownEl = function (el) {\n return !this.props.eventDrag && // HACK\n !this.props.eventResize && // HACK\n !elementClosest(el, '.fc-mirror') &&\n (this.isPopover() || !this.isInPopover(el));\n // ^above line ensures we don't detect a seg interaction within a nested component.\n // it's a HACK because it only supports a popover as the nested component.\n };\n DateComponent.prototype.isValidDateDownEl = function (el) {\n var segEl = elementClosest(el, this.fgSegSelector);\n return (!segEl || segEl.classList.contains('fc-mirror')) &&\n !elementClosest(el, '.fc-more') && // a \"more..\" link\n !elementClosest(el, 'a[data-goto]') && // a clickable nav link\n !this.isInPopover(el);\n };\n DateComponent.prototype.isPopover = function () {\n return this.el.classList.contains('fc-popover');\n };\n DateComponent.prototype.isInPopover = function (el) {\n return Boolean(elementClosest(el, '.fc-popover'));\n };\n return DateComponent;\n }(Component));\n DateComponent.prototype.fgSegSelector = '.fc-event-container > *';\n DateComponent.prototype.bgSegSelector = '.fc-bgevent:not(.fc-nonbusiness)';\n\n var uid$1 = 0;\n function createPlugin(input) {\n return {\n id: String(uid$1++),\n deps: input.deps || [],\n reducers: input.reducers || [],\n eventDefParsers: input.eventDefParsers || [],\n eventDragMutationMassagers: input.eventDragMutationMassagers || [],\n eventDefMutationAppliers: input.eventDefMutationAppliers || [],\n dateSelectionTransformers: input.dateSelectionTransformers || [],\n datePointTransforms: input.datePointTransforms || [],\n dateSpanTransforms: input.dateSpanTransforms || [],\n views: input.views || {},\n viewPropsTransformers: input.viewPropsTransformers || [],\n isPropsValid: input.isPropsValid || null,\n externalDefTransforms: input.externalDefTransforms || [],\n eventResizeJoinTransforms: input.eventResizeJoinTransforms || [],\n viewContainerModifiers: input.viewContainerModifiers || [],\n eventDropTransformers: input.eventDropTransformers || [],\n componentInteractions: input.componentInteractions || [],\n calendarInteractions: input.calendarInteractions || [],\n themeClasses: input.themeClasses || {},\n eventSourceDefs: input.eventSourceDefs || [],\n cmdFormatter: input.cmdFormatter,\n recurringTypes: input.recurringTypes || [],\n namedTimeZonedImpl: input.namedTimeZonedImpl,\n defaultView: input.defaultView || '',\n elementDraggingImpl: input.elementDraggingImpl,\n optionChangeHandlers: input.optionChangeHandlers || {}\n };\n }\n var PluginSystem = /** @class */ (function () {\n function PluginSystem() {\n this.hooks = {\n reducers: [],\n eventDefParsers: [],\n eventDragMutationMassagers: [],\n eventDefMutationAppliers: [],\n dateSelectionTransformers: [],\n datePointTransforms: [],\n dateSpanTransforms: [],\n views: {},\n viewPropsTransformers: [],\n isPropsValid: null,\n externalDefTransforms: [],\n eventResizeJoinTransforms: [],\n viewContainerModifiers: [],\n eventDropTransformers: [],\n componentInteractions: [],\n calendarInteractions: [],\n themeClasses: {},\n eventSourceDefs: [],\n cmdFormatter: null,\n recurringTypes: [],\n namedTimeZonedImpl: null,\n defaultView: '',\n elementDraggingImpl: null,\n optionChangeHandlers: {}\n };\n this.addedHash = {};\n }\n PluginSystem.prototype.add = function (plugin) {\n if (!this.addedHash[plugin.id]) {\n this.addedHash[plugin.id] = true;\n for (var _i = 0, _a = plugin.deps; _i < _a.length; _i++) {\n var dep = _a[_i];\n this.add(dep);\n }\n this.hooks = combineHooks(this.hooks, plugin);\n }\n };\n return PluginSystem;\n }());\n function combineHooks(hooks0, hooks1) {\n return {\n reducers: hooks0.reducers.concat(hooks1.reducers),\n eventDefParsers: hooks0.eventDefParsers.concat(hooks1.eventDefParsers),\n eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),\n eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),\n dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),\n datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),\n dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),\n views: __assign({}, hooks0.views, hooks1.views),\n viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),\n isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,\n externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),\n eventResizeJoinTransforms: hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms),\n viewContainerModifiers: hooks0.viewContainerModifiers.concat(hooks1.viewContainerModifiers),\n eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),\n calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),\n componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),\n themeClasses: __assign({}, hooks0.themeClasses, hooks1.themeClasses),\n eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),\n cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,\n recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),\n namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,\n defaultView: hooks0.defaultView || hooks1.defaultView,\n elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,\n optionChangeHandlers: __assign({}, hooks0.optionChangeHandlers, hooks1.optionChangeHandlers)\n };\n }\n\n var eventSourceDef = {\n ignoreRange: true,\n parseMeta: function (raw) {\n if (Array.isArray(raw)) { // short form\n return raw;\n }\n else if (Array.isArray(raw.events)) {\n return raw.events;\n }\n return null;\n },\n fetch: function (arg, success) {\n success({\n rawEvents: arg.eventSource.meta\n });\n }\n };\n var ArrayEventSourcePlugin = createPlugin({\n eventSourceDefs: [eventSourceDef]\n });\n\n var eventSourceDef$1 = {\n parseMeta: function (raw) {\n if (typeof raw === 'function') { // short form\n return raw;\n }\n else if (typeof raw.events === 'function') {\n return raw.events;\n }\n return null;\n },\n fetch: function (arg, success, failure) {\n var dateEnv = arg.calendar.dateEnv;\n var func = arg.eventSource.meta;\n unpromisify(func.bind(null, {\n start: dateEnv.toDate(arg.range.start),\n end: dateEnv.toDate(arg.range.end),\n startStr: dateEnv.formatIso(arg.range.start),\n endStr: dateEnv.formatIso(arg.range.end),\n timeZone: dateEnv.timeZone\n }), function (rawEvents) {\n success({ rawEvents: rawEvents }); // needs an object response\n }, failure // send errorObj directly to failure callback\n );\n }\n };\n var FuncEventSourcePlugin = createPlugin({\n eventSourceDefs: [eventSourceDef$1]\n });\n\n function requestJson(method, url, params, successCallback, failureCallback) {\n method = method.toUpperCase();\n var body = null;\n if (method === 'GET') {\n url = injectQueryStringParams(url, params);\n }\n else {\n body = encodeParams(params);\n }\n var xhr = new XMLHttpRequest();\n xhr.open(method, url, true);\n if (method !== 'GET') {\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n }\n xhr.onload = function () {\n if (xhr.status >= 200 && xhr.status < 400) {\n try {\n var res = JSON.parse(xhr.responseText);\n successCallback(res, xhr);\n }\n catch (err) {\n failureCallback('Failure parsing JSON', xhr);\n }\n }\n else {\n failureCallback('Request failed', xhr);\n }\n };\n xhr.onerror = function () {\n failureCallback('Request failed', xhr);\n };\n xhr.send(body);\n }\n function injectQueryStringParams(url, params) {\n return url +\n (url.indexOf('?') === -1 ? '?' : '&') +\n encodeParams(params);\n }\n function encodeParams(params) {\n var parts = [];\n for (var key in params) {\n parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));\n }\n return parts.join('&');\n }\n\n var eventSourceDef$2 = {\n parseMeta: function (raw) {\n if (typeof raw === 'string') { // short form\n raw = { url: raw };\n }\n else if (!raw || typeof raw !== 'object' || !raw.url) {\n return null;\n }\n return {\n url: raw.url,\n method: (raw.method || 'GET').toUpperCase(),\n extraParams: raw.extraParams,\n startParam: raw.startParam,\n endParam: raw.endParam,\n timeZoneParam: raw.timeZoneParam\n };\n },\n fetch: function (arg, success, failure) {\n var meta = arg.eventSource.meta;\n var requestParams = buildRequestParams(meta, arg.range, arg.calendar);\n requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) {\n success({ rawEvents: rawEvents, xhr: xhr });\n }, function (errorMessage, xhr) {\n failure({ message: errorMessage, xhr: xhr });\n });\n }\n };\n var JsonFeedEventSourcePlugin = createPlugin({\n eventSourceDefs: [eventSourceDef$2]\n });\n function buildRequestParams(meta, range, calendar) {\n var dateEnv = calendar.dateEnv;\n var startParam;\n var endParam;\n var timeZoneParam;\n var customRequestParams;\n var params = {};\n startParam = meta.startParam;\n if (startParam == null) {\n startParam = calendar.opt('startParam');\n }\n endParam = meta.endParam;\n if (endParam == null) {\n endParam = calendar.opt('endParam');\n }\n timeZoneParam = meta.timeZoneParam;\n if (timeZoneParam == null) {\n timeZoneParam = calendar.opt('timeZoneParam');\n }\n // retrieve any outbound GET/POST data from the options\n if (typeof meta.extraParams === 'function') {\n // supplied as a function that returns a key/value object\n customRequestParams = meta.extraParams();\n }\n else {\n // probably supplied as a straight key/value object\n customRequestParams = meta.extraParams || {};\n }\n __assign(params, customRequestParams);\n params[startParam] = dateEnv.formatIso(range.start);\n params[endParam] = dateEnv.formatIso(range.end);\n if (dateEnv.timeZone !== 'local') {\n params[timeZoneParam] = dateEnv.timeZone;\n }\n return params;\n }\n\n var recurring = {\n parse: function (rawEvent, leftoverProps, dateEnv) {\n var createMarker = dateEnv.createMarker.bind(dateEnv);\n var processors = {\n daysOfWeek: null,\n startTime: createDuration,\n endTime: createDuration,\n startRecur: createMarker,\n endRecur: createMarker\n };\n var props = refineProps(rawEvent, processors, {}, leftoverProps);\n var anyValid = false;\n for (var propName in props) {\n if (props[propName] != null) {\n anyValid = true;\n break;\n }\n }\n if (anyValid) {\n return {\n allDayGuess: Boolean(!props.startTime && !props.endTime),\n duration: (props.startTime && props.endTime) ?\n subtractDurations(props.endTime, props.startTime) :\n null,\n typeData: props // doesn't need endTime anymore but oh well\n };\n }\n return null;\n },\n expand: function (typeData, framingRange, dateEnv) {\n var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });\n if (clippedFramingRange) {\n return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);\n }\n else {\n return [];\n }\n }\n };\n var SimpleRecurrencePlugin = createPlugin({\n recurringTypes: [recurring]\n });\n function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {\n var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;\n var dayMarker = startOfDay(framingRange.start);\n var endMarker = framingRange.end;\n var instanceStarts = [];\n while (dayMarker < endMarker) {\n var instanceStart \n // if everyday, or this particular day-of-week\n = void 0;\n // if everyday, or this particular day-of-week\n if (!dowHash || dowHash[dayMarker.getUTCDay()]) {\n if (startTime) {\n instanceStart = dateEnv.add(dayMarker, startTime);\n }\n else {\n instanceStart = dayMarker;\n }\n instanceStarts.push(instanceStart);\n }\n dayMarker = addDays(dayMarker, 1);\n }\n return instanceStarts;\n }\n\n var DefaultOptionChangeHandlers = createPlugin({\n optionChangeHandlers: {\n events: function (events, calendar) {\n handleEventSources([events], calendar);\n },\n eventSources: handleEventSources,\n plugins: handlePlugins\n }\n });\n function handleEventSources(inputs, calendar) {\n var unfoundSources = hashValuesToArray(calendar.state.eventSources);\n var newInputs = [];\n for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {\n var input = inputs_1[_i];\n var inputFound = false;\n for (var i = 0; i < unfoundSources.length; i++) {\n if (isValuesSimilar(unfoundSources[i]._raw, input, 2)) {\n unfoundSources.splice(i, 1); // delete\n inputFound = true;\n break;\n }\n }\n if (!inputFound) {\n newInputs.push(input);\n }\n }\n for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) {\n var unfoundSource = unfoundSources_1[_a];\n calendar.dispatch({\n type: 'REMOVE_EVENT_SOURCE',\n sourceId: unfoundSource.sourceId\n });\n }\n for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) {\n var newInput = newInputs_1[_b];\n calendar.addEventSource(newInput);\n }\n }\n // shortcoming: won't remove plugins\n function handlePlugins(inputs, calendar) {\n calendar.addPluginInputs(inputs); // will gracefully handle duplicates\n }\n\n var config = {}; // TODO: make these options\n var globalDefaults = {\n defaultRangeSeparator: ' - ',\n titleRangeSeparator: ' \\u2013 ',\n defaultTimedEventDuration: '01:00:00',\n defaultAllDayEventDuration: { day: 1 },\n forceEventDuration: false,\n nextDayThreshold: '00:00:00',\n // display\n columnHeader: true,\n defaultView: '',\n aspectRatio: 1.35,\n header: {\n left: 'title',\n center: '',\n right: 'today prev,next'\n },\n weekends: true,\n weekNumbers: false,\n weekNumberCalculation: 'local',\n editable: false,\n // nowIndicator: false,\n scrollTime: '06:00:00',\n minTime: '00:00:00',\n maxTime: '24:00:00',\n showNonCurrentDates: true,\n // event ajax\n lazyFetching: true,\n startParam: 'start',\n endParam: 'end',\n timeZoneParam: 'timeZone',\n timeZone: 'local',\n // allDayDefault: undefined,\n // locale\n locales: [],\n locale: '',\n // dir: will get this from the default locale\n // buttonIcons: null,\n // allows setting a min-height to the event segment to prevent short events overlapping each other\n timeGridEventMinHeight: 0,\n themeSystem: 'standard',\n // eventResizableFromStart: false,\n dragRevertDuration: 500,\n dragScroll: true,\n allDayMaintainDuration: false,\n // selectable: false,\n unselectAuto: true,\n // selectMinDistance: 0,\n dropAccept: '*',\n eventOrder: 'start,-duration,allDay,title',\n // ^ if start tie, longer events go before shorter. final tie-breaker is title text\n // rerenderDelay: null,\n eventLimit: false,\n eventLimitClick: 'popover',\n dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' },\n handleWindowResize: true,\n windowResizeDelay: 100,\n longPressDelay: 1000,\n eventDragMinDistance: 5 // only applies to mouse\n };\n var rtlDefaults = {\n header: {\n left: 'next,prev today',\n center: '',\n right: 'title'\n },\n buttonIcons: {\n // TODO: make RTL support the responibility of the theme\n prev: 'fc-icon-chevron-right',\n next: 'fc-icon-chevron-left',\n prevYear: 'fc-icon-chevrons-right',\n nextYear: 'fc-icon-chevrons-left'\n }\n };\n var complexOptions = [\n 'header',\n 'footer',\n 'buttonText',\n 'buttonIcons'\n ];\n // Merges an array of option objects into a single object\n function mergeOptions(optionObjs) {\n return mergeProps(optionObjs, complexOptions);\n }\n // TODO: move this stuff to a \"plugin\"-related file...\n var INTERNAL_PLUGINS = [\n ArrayEventSourcePlugin,\n FuncEventSourcePlugin,\n JsonFeedEventSourcePlugin,\n SimpleRecurrencePlugin,\n DefaultOptionChangeHandlers\n ];\n function refinePluginDefs(pluginInputs) {\n var plugins = [];\n for (var _i = 0, pluginInputs_1 = pluginInputs; _i < pluginInputs_1.length; _i++) {\n var pluginInput = pluginInputs_1[_i];\n if (typeof pluginInput === 'string') {\n var globalName = 'FullCalendar' + capitaliseFirstLetter(pluginInput);\n if (!window[globalName]) {\n console.warn('Plugin file not loaded for ' + pluginInput);\n }\n else {\n plugins.push(window[globalName].default); // is an ES6 module\n }\n }\n else {\n plugins.push(pluginInput);\n }\n }\n return INTERNAL_PLUGINS.concat(plugins);\n }\n\n var RAW_EN_LOCALE = {\n code: 'en',\n week: {\n dow: 0,\n doy: 4 // 4 days need to be within the year to be considered the first week\n },\n dir: 'ltr',\n buttonText: {\n prev: 'prev',\n next: 'next',\n prevYear: 'prev year',\n nextYear: 'next year',\n year: 'year',\n today: 'today',\n month: 'month',\n week: 'week',\n day: 'day',\n list: 'list'\n },\n weekLabel: 'W',\n allDayText: 'all-day',\n eventLimitText: 'more',\n noEventsMessage: 'No events to display'\n };\n function parseRawLocales(explicitRawLocales) {\n var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en';\n var globalArray = window['FullCalendarLocalesAll'] || []; // from locales-all.js\n var globalObject = window['FullCalendarLocales'] || {}; // from locales/*.js. keys are meaningless\n var allRawLocales = globalArray.concat(// globalArray is low prio\n hashValuesToArray(globalObject), // medium prio\n explicitRawLocales // highest prio\n );\n var rawLocaleMap = {\n en: RAW_EN_LOCALE // necessary?\n };\n for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) {\n var rawLocale = allRawLocales_1[_i];\n rawLocaleMap[rawLocale.code] = rawLocale;\n }\n return {\n map: rawLocaleMap,\n defaultCode: defaultCode\n };\n }\n function buildLocale(inputSingular, available) {\n if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) {\n return parseLocale(inputSingular.code, [inputSingular.code], inputSingular);\n }\n else {\n return queryLocale(inputSingular, available);\n }\n }\n function queryLocale(codeArg, available) {\n var codes = [].concat(codeArg || []); // will convert to array\n var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE;\n return parseLocale(codeArg, codes, raw);\n }\n function queryRawLocale(codes, available) {\n for (var i = 0; i < codes.length; i++) {\n var parts = codes[i].toLocaleLowerCase().split('-');\n for (var j = parts.length; j > 0; j--) {\n var simpleId = parts.slice(0, j).join('-');\n if (available[simpleId]) {\n return available[simpleId];\n }\n }\n }\n return null;\n }\n function parseLocale(codeArg, codes, raw) {\n var merged = mergeProps([RAW_EN_LOCALE, raw], ['buttonText']);\n delete merged.code; // don't want this part of the options\n var week = merged.week;\n delete merged.week;\n return {\n codeArg: codeArg,\n codes: codes,\n week: week,\n simpleNumberFormat: new Intl.NumberFormat(codeArg),\n options: merged\n };\n }\n\n var OptionsManager = /** @class */ (function () {\n function OptionsManager(overrides) {\n this.overrides = __assign({}, overrides); // make a copy\n this.dynamicOverrides = {};\n this.compute();\n }\n OptionsManager.prototype.add = function (props) {\n __assign(this.overrides, props);\n this.compute();\n };\n OptionsManager.prototype.addDynamic = function (props) {\n __assign(this.dynamicOverrides, props);\n this.compute();\n };\n OptionsManager.prototype.reset = function (props) {\n this.overrides = props;\n this.compute();\n };\n // Computes the flattened options hash for the calendar and assigns to `this.options`.\n // Assumes this.overrides and this.dynamicOverrides have already been initialized.\n OptionsManager.prototype.compute = function () {\n // TODO: not a very efficient system\n var locales = firstDefined(// explicit locale option given?\n this.dynamicOverrides.locales, this.overrides.locales, globalDefaults.locales);\n var locale = firstDefined(// explicit locales option given?\n this.dynamicOverrides.locale, this.overrides.locale, globalDefaults.locale);\n var available = parseRawLocales(locales);\n var localeDefaults = buildLocale(locale || available.defaultCode, available.map).options;\n var dir = firstDefined(// based on options computed so far, is direction RTL?\n this.dynamicOverrides.dir, this.overrides.dir, localeDefaults.dir);\n var dirDefaults = dir === 'rtl' ? rtlDefaults : {};\n this.dirDefaults = dirDefaults;\n this.localeDefaults = localeDefaults;\n this.computed = mergeOptions([\n globalDefaults,\n dirDefaults,\n localeDefaults,\n this.overrides,\n this.dynamicOverrides\n ]);\n };\n return OptionsManager;\n }());\n\n var calendarSystemClassMap = {};\n function registerCalendarSystem(name, theClass) {\n calendarSystemClassMap[name] = theClass;\n }\n function createCalendarSystem(name) {\n return new calendarSystemClassMap[name]();\n }\n var GregorianCalendarSystem = /** @class */ (function () {\n function GregorianCalendarSystem() {\n }\n GregorianCalendarSystem.prototype.getMarkerYear = function (d) {\n return d.getUTCFullYear();\n };\n GregorianCalendarSystem.prototype.getMarkerMonth = function (d) {\n return d.getUTCMonth();\n };\n GregorianCalendarSystem.prototype.getMarkerDay = function (d) {\n return d.getUTCDate();\n };\n GregorianCalendarSystem.prototype.arrayToMarker = function (arr) {\n return arrayToUtcDate(arr);\n };\n GregorianCalendarSystem.prototype.markerToArray = function (marker) {\n return dateToUtcArray(marker);\n };\n return GregorianCalendarSystem;\n }());\n registerCalendarSystem('gregory', GregorianCalendarSystem);\n\n var ISO_START = /^\\s*\\d{4}-\\d\\d-\\d\\d([T ]\\d)?/;\n var ISO_TZO_RE = /(?:(Z)|([-+])(\\d\\d)(?::(\\d\\d))?)$/;\n function parse(str) {\n var timeZoneOffset = null;\n var isTimeUnspecified = false;\n var m = ISO_START.exec(str);\n if (m) {\n isTimeUnspecified = !m[1];\n if (isTimeUnspecified) {\n str += 'T00:00:00Z';\n }\n else {\n str = str.replace(ISO_TZO_RE, function (whole, z, sign, minutes, seconds) {\n if (z) {\n timeZoneOffset = 0;\n }\n else {\n timeZoneOffset = (parseInt(minutes, 10) * 60 +\n parseInt(seconds || 0, 10)) * (sign === '-' ? -1 : 1);\n }\n return '';\n }) + 'Z'; // otherwise will parse in local\n }\n }\n var marker = new Date(str);\n if (!isValidDate(marker)) {\n return null;\n }\n return {\n marker: marker,\n isTimeUnspecified: isTimeUnspecified,\n timeZoneOffset: timeZoneOffset\n };\n }\n\n var DateEnv = /** @class */ (function () {\n function DateEnv(settings) {\n var timeZone = this.timeZone = settings.timeZone;\n var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC';\n if (settings.namedTimeZoneImpl && isNamedTimeZone) {\n this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone);\n }\n this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl);\n this.calendarSystem = createCalendarSystem(settings.calendarSystem);\n this.locale = settings.locale;\n this.weekDow = settings.locale.week.dow;\n this.weekDoy = settings.locale.week.doy;\n if (settings.weekNumberCalculation === 'ISO') {\n this.weekDow = 1;\n this.weekDoy = 4;\n }\n else if (typeof settings.firstDay === 'number') {\n this.weekDow = settings.firstDay;\n }\n if (typeof settings.weekNumberCalculation === 'function') {\n this.weekNumberFunc = settings.weekNumberCalculation;\n }\n this.weekLabel = settings.weekLabel != null ? settings.weekLabel : settings.locale.options.weekLabel;\n this.cmdFormatter = settings.cmdFormatter;\n }\n // Creating / Parsing\n DateEnv.prototype.createMarker = function (input) {\n var meta = this.createMarkerMeta(input);\n if (meta === null) {\n return null;\n }\n return meta.marker;\n };\n DateEnv.prototype.createNowMarker = function () {\n if (this.canComputeOffset) {\n return this.timestampToMarker(new Date().valueOf());\n }\n else {\n // if we can't compute the current date val for a timezone,\n // better to give the current local date vals than UTC\n return arrayToUtcDate(dateToLocalArray(new Date()));\n }\n };\n DateEnv.prototype.createMarkerMeta = function (input) {\n if (typeof input === 'string') {\n return this.parse(input);\n }\n var marker = null;\n if (typeof input === 'number') {\n marker = this.timestampToMarker(input);\n }\n else if (input instanceof Date) {\n input = input.valueOf();\n if (!isNaN(input)) {\n marker = this.timestampToMarker(input);\n }\n }\n else if (Array.isArray(input)) {\n marker = arrayToUtcDate(input);\n }\n if (marker === null || !isValidDate(marker)) {\n return null;\n }\n return { marker: marker, isTimeUnspecified: false, forcedTzo: null };\n };\n DateEnv.prototype.parse = function (s) {\n var parts = parse(s);\n if (parts === null) {\n return null;\n }\n var marker = parts.marker;\n var forcedTzo = null;\n if (parts.timeZoneOffset !== null) {\n if (this.canComputeOffset) {\n marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000);\n }\n else {\n forcedTzo = parts.timeZoneOffset;\n }\n }\n return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo };\n };\n // Accessors\n DateEnv.prototype.getYear = function (marker) {\n return this.calendarSystem.getMarkerYear(marker);\n };\n DateEnv.prototype.getMonth = function (marker) {\n return this.calendarSystem.getMarkerMonth(marker);\n };\n // Adding / Subtracting\n DateEnv.prototype.add = function (marker, dur) {\n var a = this.calendarSystem.markerToArray(marker);\n a[0] += dur.years;\n a[1] += dur.months;\n a[2] += dur.days;\n a[6] += dur.milliseconds;\n return this.calendarSystem.arrayToMarker(a);\n };\n DateEnv.prototype.subtract = function (marker, dur) {\n var a = this.calendarSystem.markerToArray(marker);\n a[0] -= dur.years;\n a[1] -= dur.months;\n a[2] -= dur.days;\n a[6] -= dur.milliseconds;\n return this.calendarSystem.arrayToMarker(a);\n };\n DateEnv.prototype.addYears = function (marker, n) {\n var a = this.calendarSystem.markerToArray(marker);\n a[0] += n;\n return this.calendarSystem.arrayToMarker(a);\n };\n DateEnv.prototype.addMonths = function (marker, n) {\n var a = this.calendarSystem.markerToArray(marker);\n a[1] += n;\n return this.calendarSystem.arrayToMarker(a);\n };\n // Diffing Whole Units\n DateEnv.prototype.diffWholeYears = function (m0, m1) {\n var calendarSystem = this.calendarSystem;\n if (timeAsMs(m0) === timeAsMs(m1) &&\n calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) &&\n calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) {\n return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0);\n }\n return null;\n };\n DateEnv.prototype.diffWholeMonths = function (m0, m1) {\n var calendarSystem = this.calendarSystem;\n if (timeAsMs(m0) === timeAsMs(m1) &&\n calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) {\n return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) +\n (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12;\n }\n return null;\n };\n // Range / Duration\n DateEnv.prototype.greatestWholeUnit = function (m0, m1) {\n var n = this.diffWholeYears(m0, m1);\n if (n !== null) {\n return { unit: 'year', value: n };\n }\n n = this.diffWholeMonths(m0, m1);\n if (n !== null) {\n return { unit: 'month', value: n };\n }\n n = diffWholeWeeks(m0, m1);\n if (n !== null) {\n return { unit: 'week', value: n };\n }\n n = diffWholeDays(m0, m1);\n if (n !== null) {\n return { unit: 'day', value: n };\n }\n n = diffHours(m0, m1);\n if (isInt(n)) {\n return { unit: 'hour', value: n };\n }\n n = diffMinutes(m0, m1);\n if (isInt(n)) {\n return { unit: 'minute', value: n };\n }\n n = diffSeconds(m0, m1);\n if (isInt(n)) {\n return { unit: 'second', value: n };\n }\n return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() };\n };\n DateEnv.prototype.countDurationsBetween = function (m0, m1, d) {\n // TODO: can use greatestWholeUnit\n var diff;\n if (d.years) {\n diff = this.diffWholeYears(m0, m1);\n if (diff !== null) {\n return diff / asRoughYears(d);\n }\n }\n if (d.months) {\n diff = this.diffWholeMonths(m0, m1);\n if (diff !== null) {\n return diff / asRoughMonths(d);\n }\n }\n if (d.days) {\n diff = diffWholeDays(m0, m1);\n if (diff !== null) {\n return diff / asRoughDays(d);\n }\n }\n return (m1.valueOf() - m0.valueOf()) / asRoughMs(d);\n };\n // Start-Of\n DateEnv.prototype.startOf = function (m, unit) {\n if (unit === 'year') {\n return this.startOfYear(m);\n }\n else if (unit === 'month') {\n return this.startOfMonth(m);\n }\n else if (unit === 'week') {\n return this.startOfWeek(m);\n }\n else if (unit === 'day') {\n return startOfDay(m);\n }\n else if (unit === 'hour') {\n return startOfHour(m);\n }\n else if (unit === 'minute') {\n return startOfMinute(m);\n }\n else if (unit === 'second') {\n return startOfSecond(m);\n }\n };\n DateEnv.prototype.startOfYear = function (m) {\n return this.calendarSystem.arrayToMarker([\n this.calendarSystem.getMarkerYear(m)\n ]);\n };\n DateEnv.prototype.startOfMonth = function (m) {\n return this.calendarSystem.arrayToMarker([\n this.calendarSystem.getMarkerYear(m),\n this.calendarSystem.getMarkerMonth(m)\n ]);\n };\n DateEnv.prototype.startOfWeek = function (m) {\n return this.calendarSystem.arrayToMarker([\n this.calendarSystem.getMarkerYear(m),\n this.calendarSystem.getMarkerMonth(m),\n m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7)\n ]);\n };\n // Week Number\n DateEnv.prototype.computeWeekNumber = function (marker) {\n if (this.weekNumberFunc) {\n return this.weekNumberFunc(this.toDate(marker));\n }\n else {\n return weekOfYear(marker, this.weekDow, this.weekDoy);\n }\n };\n // TODO: choke on timeZoneName: long\n DateEnv.prototype.format = function (marker, formatter, dateOptions) {\n if (dateOptions === void 0) { dateOptions = {}; }\n return formatter.format({\n marker: marker,\n timeZoneOffset: dateOptions.forcedTzo != null ?\n dateOptions.forcedTzo :\n this.offsetForMarker(marker)\n }, this);\n };\n DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) {\n if (dateOptions === void 0) { dateOptions = {}; }\n if (dateOptions.isEndExclusive) {\n end = addMs(end, -1);\n }\n return formatter.formatRange({\n marker: start,\n timeZoneOffset: dateOptions.forcedStartTzo != null ?\n dateOptions.forcedStartTzo :\n this.offsetForMarker(start)\n }, {\n marker: end,\n timeZoneOffset: dateOptions.forcedEndTzo != null ?\n dateOptions.forcedEndTzo :\n this.offsetForMarker(end)\n }, this);\n };\n DateEnv.prototype.formatIso = function (marker, extraOptions) {\n if (extraOptions === void 0) { extraOptions = {}; }\n var timeZoneOffset = null;\n if (!extraOptions.omitTimeZoneOffset) {\n if (extraOptions.forcedTzo != null) {\n timeZoneOffset = extraOptions.forcedTzo;\n }\n else {\n timeZoneOffset = this.offsetForMarker(marker);\n }\n }\n return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime);\n };\n // TimeZone\n DateEnv.prototype.timestampToMarker = function (ms) {\n if (this.timeZone === 'local') {\n return arrayToUtcDate(dateToLocalArray(new Date(ms)));\n }\n else if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) {\n return new Date(ms);\n }\n else {\n return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));\n }\n };\n DateEnv.prototype.offsetForMarker = function (m) {\n if (this.timeZone === 'local') {\n return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert \"inverse\" offset to \"normal\" offset\n }\n else if (this.timeZone === 'UTC') {\n return 0;\n }\n else if (this.namedTimeZoneImpl) {\n return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m));\n }\n return null;\n };\n // Conversion\n DateEnv.prototype.toDate = function (m, forcedTzo) {\n if (this.timeZone === 'local') {\n return arrayToLocalDate(dateToUtcArray(m));\n }\n else if (this.timeZone === 'UTC') {\n return new Date(m.valueOf()); // make sure it's a copy\n }\n else if (!this.namedTimeZoneImpl) {\n return new Date(m.valueOf() - (forcedTzo || 0));\n }\n else {\n return new Date(m.valueOf() -\n this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60 // convert minutes -> ms\n );\n }\n };\n return DateEnv;\n }());\n\n var SIMPLE_SOURCE_PROPS = {\n id: String,\n allDayDefault: Boolean,\n eventDataTransform: Function,\n success: Function,\n failure: Function\n };\n var uid$2 = 0;\n function doesSourceNeedRange(eventSource, calendar) {\n var defs = calendar.pluginSystem.hooks.eventSourceDefs;\n return !defs[eventSource.sourceDefId].ignoreRange;\n }\n function parseEventSource(raw, calendar) {\n var defs = calendar.pluginSystem.hooks.eventSourceDefs;\n for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence\n var def = defs[i];\n var meta = def.parseMeta(raw);\n if (meta) {\n var res = parseEventSourceProps(typeof raw === 'object' ? raw : {}, meta, i, calendar);\n res._raw = freezeRaw(raw);\n return res;\n }\n }\n return null;\n }\n function parseEventSourceProps(raw, meta, sourceDefId, calendar) {\n var leftovers0 = {};\n var props = refineProps(raw, SIMPLE_SOURCE_PROPS, {}, leftovers0);\n var leftovers1 = {};\n var ui = processUnscopedUiProps(leftovers0, calendar, leftovers1);\n props.isFetching = false;\n props.latestFetchId = '';\n props.fetchRange = null;\n props.publicId = String(raw.id || '');\n props.sourceId = String(uid$2++);\n props.sourceDefId = sourceDefId;\n props.meta = meta;\n props.ui = ui;\n props.extendedProps = leftovers1;\n return props;\n }\n\n function reduceEventSources (eventSources, action, dateProfile, calendar) {\n switch (action.type) {\n case 'ADD_EVENT_SOURCES': // already parsed\n return addSources(eventSources, action.sources, dateProfile ? dateProfile.activeRange : null, calendar);\n case 'REMOVE_EVENT_SOURCE':\n return removeSource(eventSources, action.sourceId);\n case 'PREV': // TODO: how do we track all actions that affect dateProfile :(\n case 'NEXT':\n case 'SET_DATE':\n case 'SET_VIEW_TYPE':\n if (dateProfile) {\n return fetchDirtySources(eventSources, dateProfile.activeRange, calendar);\n }\n else {\n return eventSources;\n }\n case 'FETCH_EVENT_SOURCES':\n case 'CHANGE_TIMEZONE':\n return fetchSourcesByIds(eventSources, action.sourceIds ?\n arrayToHash(action.sourceIds) :\n excludeStaticSources(eventSources, calendar), dateProfile ? dateProfile.activeRange : null, calendar);\n case 'RECEIVE_EVENTS':\n case 'RECEIVE_EVENT_ERROR':\n return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);\n case 'REMOVE_ALL_EVENT_SOURCES':\n return {};\n default:\n return eventSources;\n }\n }\n var uid$3 = 0;\n function addSources(eventSourceHash, sources, fetchRange, calendar) {\n var hash = {};\n for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) {\n var source = sources_1[_i];\n hash[source.sourceId] = source;\n }\n if (fetchRange) {\n hash = fetchDirtySources(hash, fetchRange, calendar);\n }\n return __assign({}, eventSourceHash, hash);\n }\n function removeSource(eventSourceHash, sourceId) {\n return filterHash(eventSourceHash, function (eventSource) {\n return eventSource.sourceId !== sourceId;\n });\n }\n function fetchDirtySources(sourceHash, fetchRange, calendar) {\n return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) {\n return isSourceDirty(eventSource, fetchRange, calendar);\n }), fetchRange, calendar);\n }\n function isSourceDirty(eventSource, fetchRange, calendar) {\n if (!doesSourceNeedRange(eventSource, calendar)) {\n return !eventSource.latestFetchId;\n }\n else {\n return !calendar.opt('lazyFetching') ||\n !eventSource.fetchRange ||\n fetchRange.start < eventSource.fetchRange.start ||\n fetchRange.end > eventSource.fetchRange.end;\n }\n }\n function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, calendar) {\n var nextSources = {};\n for (var sourceId in prevSources) {\n var source = prevSources[sourceId];\n if (sourceIdHash[sourceId]) {\n nextSources[sourceId] = fetchSource(source, fetchRange, calendar);\n }\n else {\n nextSources[sourceId] = source;\n }\n }\n return nextSources;\n }\n function fetchSource(eventSource, fetchRange, calendar) {\n var sourceDef = calendar.pluginSystem.hooks.eventSourceDefs[eventSource.sourceDefId];\n var fetchId = String(uid$3++);\n sourceDef.fetch({\n eventSource: eventSource,\n calendar: calendar,\n range: fetchRange\n }, function (res) {\n var rawEvents = res.rawEvents;\n var calSuccess = calendar.opt('eventSourceSuccess');\n var calSuccessRes;\n var sourceSuccessRes;\n if (eventSource.success) {\n sourceSuccessRes = eventSource.success(rawEvents, res.xhr);\n }\n if (calSuccess) {\n calSuccessRes = calSuccess(rawEvents, res.xhr);\n }\n rawEvents = sourceSuccessRes || calSuccessRes || rawEvents;\n calendar.dispatch({\n type: 'RECEIVE_EVENTS',\n sourceId: eventSource.sourceId,\n fetchId: fetchId,\n fetchRange: fetchRange,\n rawEvents: rawEvents\n });\n }, function (error) {\n var callFailure = calendar.opt('eventSourceFailure');\n console.warn(error.message, error);\n if (eventSource.failure) {\n eventSource.failure(error);\n }\n if (callFailure) {\n callFailure(error);\n }\n calendar.dispatch({\n type: 'RECEIVE_EVENT_ERROR',\n sourceId: eventSource.sourceId,\n fetchId: fetchId,\n fetchRange: fetchRange,\n error: error\n });\n });\n return __assign({}, eventSource, { isFetching: true, latestFetchId: fetchId });\n }\n function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {\n var _a;\n var eventSource = sourceHash[sourceId];\n if (eventSource && // not already removed\n fetchId === eventSource.latestFetchId) {\n return __assign({}, sourceHash, (_a = {}, _a[sourceId] = __assign({}, eventSource, { isFetching: false, fetchRange: fetchRange }), _a));\n }\n return sourceHash;\n }\n function excludeStaticSources(eventSources, calendar) {\n return filterHash(eventSources, function (eventSource) {\n return doesSourceNeedRange(eventSource, calendar);\n });\n }\n\n var DateProfileGenerator = /** @class */ (function () {\n function DateProfileGenerator(viewSpec, calendar) {\n this.viewSpec = viewSpec;\n this.options = viewSpec.options;\n this.dateEnv = calendar.dateEnv;\n this.calendar = calendar;\n this.initHiddenDays();\n }\n /* Date Range Computation\n ------------------------------------------------------------------------------------------------------------------*/\n // Builds a structure with info about what the dates/ranges will be for the \"prev\" view.\n DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate) {\n var dateEnv = this.dateEnv;\n var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month\n currentDateProfile.dateIncrement);\n return this.build(prevDate, -1);\n };\n // Builds a structure with info about what the dates/ranges will be for the \"next\" view.\n DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate) {\n var dateEnv = this.dateEnv;\n var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month\n currentDateProfile.dateIncrement);\n return this.build(nextDate, 1);\n };\n // Builds a structure holding dates/ranges for rendering around the given date.\n // Optional direction param indicates whether the date is being incremented/decremented\n // from its previous value. decremented = -1, incremented = 1 (default).\n DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) {\n if (forceToValid === void 0) { forceToValid = false; }\n var validRange;\n var minTime = null;\n var maxTime = null;\n var currentInfo;\n var isRangeAllDay;\n var renderRange;\n var activeRange;\n var isValid;\n validRange = this.buildValidRange();\n validRange = this.trimHiddenDays(validRange);\n if (forceToValid) {\n currentDate = constrainMarkerToRange(currentDate, validRange);\n }\n currentInfo = this.buildCurrentRangeInfo(currentDate, direction);\n isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);\n renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay);\n renderRange = this.trimHiddenDays(renderRange);\n activeRange = renderRange;\n if (!this.options.showNonCurrentDates) {\n activeRange = intersectRanges(activeRange, currentInfo.range);\n }\n minTime = createDuration(this.options.minTime);\n maxTime = createDuration(this.options.maxTime);\n activeRange = this.adjustActiveRange(activeRange, minTime, maxTime);\n activeRange = intersectRanges(activeRange, validRange); // might return null\n // it's invalid if the originally requested date is not contained,\n // or if the range is completely outside of the valid range.\n isValid = rangesIntersect(currentInfo.range, validRange);\n return {\n // constraint for where prev/next operations can go and where events can be dragged/resized to.\n // an object with optional start and end properties.\n validRange: validRange,\n // range the view is formally responsible for.\n // for example, a month view might have 1st-31st, excluding padded dates\n currentRange: currentInfo.range,\n // name of largest unit being displayed, like \"month\" or \"week\"\n currentRangeUnit: currentInfo.unit,\n isRangeAllDay: isRangeAllDay,\n // dates that display events and accept drag-n-drop\n // will be `null` if no dates accept events\n activeRange: activeRange,\n // date range with a rendered skeleton\n // includes not-active days that need some sort of DOM\n renderRange: renderRange,\n // Duration object that denotes the first visible time of any given day\n minTime: minTime,\n // Duration object that denotes the exclusive visible end time of any given day\n maxTime: maxTime,\n isValid: isValid,\n // how far the current date will move for a prev/next operation\n dateIncrement: this.buildDateIncrement(currentInfo.duration)\n // pass a fallback (might be null) ^\n };\n };\n // Builds an object with optional start/end properties.\n // Indicates the minimum/maximum dates to display.\n // not responsible for trimming hidden days.\n DateProfileGenerator.prototype.buildValidRange = function () {\n return this.getRangeOption('validRange', this.calendar.getNow()) ||\n { start: null, end: null }; // completely open-ended\n };\n // Builds a structure with info about the \"current\" range, the range that is\n // highlighted as being the current month for example.\n // See build() for a description of `direction`.\n // Guaranteed to have `range` and `unit` properties. `duration` is optional.\n DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {\n var _a = this, viewSpec = _a.viewSpec, dateEnv = _a.dateEnv;\n var duration = null;\n var unit = null;\n var range = null;\n var dayCount;\n if (viewSpec.duration) {\n duration = viewSpec.duration;\n unit = viewSpec.durationUnit;\n range = this.buildRangeFromDuration(date, direction, duration, unit);\n }\n else if ((dayCount = this.options.dayCount)) {\n unit = 'day';\n range = this.buildRangeFromDayCount(date, direction, dayCount);\n }\n else if ((range = this.buildCustomVisibleRange(date))) {\n unit = dateEnv.greatestWholeUnit(range.start, range.end).unit;\n }\n else {\n duration = this.getFallbackDuration();\n unit = greatestDurationDenominator(duration).unit;\n range = this.buildRangeFromDuration(date, direction, duration, unit);\n }\n return { duration: duration, unit: unit, range: range };\n };\n DateProfileGenerator.prototype.getFallbackDuration = function () {\n return createDuration({ day: 1 });\n };\n // Returns a new activeRange to have time values (un-ambiguate)\n // minTime or maxTime causes the range to expand.\n DateProfileGenerator.prototype.adjustActiveRange = function (range, minTime, maxTime) {\n var dateEnv = this.dateEnv;\n var start = range.start;\n var end = range.end;\n if (this.viewSpec.class.prototype.usesMinMaxTime) {\n // expand active range if minTime is negative (why not when positive?)\n if (asRoughDays(minTime) < 0) {\n start = startOfDay(start); // necessary?\n start = dateEnv.add(start, minTime);\n }\n // expand active range if maxTime is beyond one day (why not when positive?)\n if (asRoughDays(maxTime) > 1) {\n end = startOfDay(end); // necessary?\n end = addDays(end, -1);\n end = dateEnv.add(end, maxTime);\n }\n }\n return { start: start, end: end };\n };\n // Builds the \"current\" range when it is specified as an explicit duration.\n // `unit` is the already-computed greatestDurationDenominator unit of duration.\n DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {\n var dateEnv = this.dateEnv;\n var alignment = this.options.dateAlignment;\n var dateIncrementInput;\n var dateIncrementDuration;\n var start;\n var end;\n var res;\n // compute what the alignment should be\n if (!alignment) {\n dateIncrementInput = this.options.dateIncrement;\n if (dateIncrementInput) {\n dateIncrementDuration = createDuration(dateIncrementInput);\n // use the smaller of the two units\n if (asRoughMs(dateIncrementDuration) < asRoughMs(duration)) {\n alignment = greatestDurationDenominator(dateIncrementDuration, !getWeeksFromInput(dateIncrementInput)).unit;\n }\n else {\n alignment = unit;\n }\n }\n else {\n alignment = unit;\n }\n }\n // if the view displays a single day or smaller\n if (asRoughDays(duration) <= 1) {\n if (this.isHiddenDay(start)) {\n start = this.skipHiddenDays(start, direction);\n start = startOfDay(start);\n }\n }\n function computeRes() {\n start = dateEnv.startOf(date, alignment);\n end = dateEnv.add(start, duration);\n res = { start: start, end: end };\n }\n computeRes();\n // if range is completely enveloped by hidden days, go past the hidden days\n if (!this.trimHiddenDays(res)) {\n date = this.skipHiddenDays(date, direction);\n computeRes();\n }\n return res;\n };\n // Builds the \"current\" range when a dayCount is specified.\n DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {\n var dateEnv = this.dateEnv;\n var customAlignment = this.options.dateAlignment;\n var runningCount = 0;\n var start = date;\n var end;\n if (customAlignment) {\n start = dateEnv.startOf(start, customAlignment);\n }\n start = startOfDay(start);\n start = this.skipHiddenDays(start, direction);\n end = start;\n do {\n end = addDays(end, 1);\n if (!this.isHiddenDay(end)) {\n runningCount++;\n }\n } while (runningCount < dayCount);\n return { start: start, end: end };\n };\n // Builds a normalized range object for the \"visible\" range,\n // which is a way to define the currentRange and activeRange at the same time.\n DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {\n var dateEnv = this.dateEnv;\n var visibleRange = this.getRangeOption('visibleRange', dateEnv.toDate(date));\n if (visibleRange && (visibleRange.start == null || visibleRange.end == null)) {\n return null;\n }\n return visibleRange;\n };\n // Computes the range that will represent the element/cells for *rendering*,\n // but which may have voided days/times.\n // not responsible for trimming hidden days.\n DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {\n return currentRange;\n };\n // Compute the duration value that should be added/substracted to the current date\n // when a prev/next operation happens.\n DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {\n var dateIncrementInput = this.options.dateIncrement;\n var customAlignment;\n if (dateIncrementInput) {\n return createDuration(dateIncrementInput);\n }\n else if ((customAlignment = this.options.dateAlignment)) {\n return createDuration(1, customAlignment);\n }\n else if (fallback) {\n return fallback;\n }\n else {\n return createDuration({ days: 1 });\n }\n };\n // Arguments after name will be forwarded to a hypothetical function value\n // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.\n // Always clone your objects if you fear mutation.\n DateProfileGenerator.prototype.getRangeOption = function (name) {\n var otherArgs = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n otherArgs[_i - 1] = arguments[_i];\n }\n var val = this.options[name];\n if (typeof val === 'function') {\n val = val.apply(null, otherArgs);\n }\n if (val) {\n val = parseRange(val, this.dateEnv);\n }\n if (val) {\n val = computeVisibleDayRange(val);\n }\n return val;\n };\n /* Hidden Days\n ------------------------------------------------------------------------------------------------------------------*/\n // Initializes internal variables related to calculating hidden days-of-week\n DateProfileGenerator.prototype.initHiddenDays = function () {\n var hiddenDays = this.options.hiddenDays || []; // array of day-of-week indices that are hidden\n var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)\n var dayCnt = 0;\n var i;\n if (this.options.weekends === false) {\n hiddenDays.push(0, 6); // 0=sunday, 6=saturday\n }\n for (i = 0; i < 7; i++) {\n if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) {\n dayCnt++;\n }\n }\n if (!dayCnt) {\n throw new Error('invalid hiddenDays'); // all days were hidden? bad.\n }\n this.isHiddenDayHash = isHiddenDayHash;\n };\n // Remove days from the beginning and end of the range that are computed as hidden.\n // If the whole range is trimmed off, returns null\n DateProfileGenerator.prototype.trimHiddenDays = function (range) {\n var start = range.start;\n var end = range.end;\n if (start) {\n start = this.skipHiddenDays(start);\n }\n if (end) {\n end = this.skipHiddenDays(end, -1, true);\n }\n if (start == null || end == null || start < end) {\n return { start: start, end: end };\n }\n return null;\n };\n // Is the current day hidden?\n // `day` is a day-of-week index (0-6), or a Date (used for UTC)\n DateProfileGenerator.prototype.isHiddenDay = function (day) {\n if (day instanceof Date) {\n day = day.getUTCDay();\n }\n return this.isHiddenDayHash[day];\n };\n // Incrementing the current day until it is no longer a hidden day, returning a copy.\n // DOES NOT CONSIDER validRange!\n // If the initial value of `date` is not a hidden day, don't do anything.\n // Pass `isExclusive` as `true` if you are dealing with an end date.\n // `inc` defaults to `1` (increment one day forward each time)\n DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) {\n if (inc === void 0) { inc = 1; }\n if (isExclusive === void 0) { isExclusive = false; }\n while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) {\n date = addDays(date, inc);\n }\n return date;\n };\n return DateProfileGenerator;\n }());\n // TODO: find a way to avoid comparing DateProfiles. it's tedious\n function isDateProfilesEqual(p0, p1) {\n return rangesEqual(p0.activeRange, p1.activeRange) &&\n rangesEqual(p0.validRange, p1.validRange) &&\n durationsEqual(p0.minTime, p1.minTime) &&\n durationsEqual(p0.maxTime, p1.maxTime);\n }\n\n function reduce (state, action, calendar) {\n var viewType = reduceViewType(state.viewType, action);\n var dateProfile = reduceDateProfile(state.dateProfile, action, state.currentDate, viewType, calendar);\n var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendar);\n var nextState = __assign({}, state, { viewType: viewType,\n dateProfile: dateProfile, currentDate: reduceCurrentDate(state.currentDate, action, dateProfile), eventSources: eventSources, eventStore: reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendar), dateSelection: reduceDateSelection(state.dateSelection, action, calendar), eventSelection: reduceSelectedEvent(state.eventSelection, action), eventDrag: reduceEventDrag(state.eventDrag, action, eventSources, calendar), eventResize: reduceEventResize(state.eventResize, action, eventSources, calendar), eventSourceLoadingLevel: computeLoadingLevel(eventSources), loadingLevel: computeLoadingLevel(eventSources) });\n for (var _i = 0, _a = calendar.pluginSystem.hooks.reducers; _i < _a.length; _i++) {\n var reducerFunc = _a[_i];\n nextState = reducerFunc(nextState, action, calendar);\n }\n // console.log(action.type, nextState)\n return nextState;\n }\n function reduceViewType(currentViewType, action) {\n switch (action.type) {\n case 'SET_VIEW_TYPE':\n return action.viewType;\n default:\n return currentViewType;\n }\n }\n function reduceDateProfile(currentDateProfile, action, currentDate, viewType, calendar) {\n var newDateProfile;\n switch (action.type) {\n case 'PREV':\n newDateProfile = calendar.dateProfileGenerators[viewType].buildPrev(currentDateProfile, currentDate);\n break;\n case 'NEXT':\n newDateProfile = calendar.dateProfileGenerators[viewType].buildNext(currentDateProfile, currentDate);\n break;\n case 'SET_DATE':\n if (!currentDateProfile.activeRange ||\n !rangeContainsMarker(currentDateProfile.currentRange, action.dateMarker)) {\n newDateProfile = calendar.dateProfileGenerators[viewType].build(action.dateMarker, undefined, true // forceToValid\n );\n }\n break;\n case 'SET_VIEW_TYPE':\n var generator = calendar.dateProfileGenerators[viewType];\n if (!generator) {\n throw new Error(viewType ?\n 'The FullCalendar view \"' + viewType + '\" does not exist. Make sure your plugins are loaded correctly.' :\n 'No available FullCalendar view plugins.');\n }\n newDateProfile = generator.build(action.dateMarker || currentDate, undefined, true // forceToValid\n );\n break;\n }\n if (newDateProfile &&\n newDateProfile.isValid &&\n !(currentDateProfile && isDateProfilesEqual(currentDateProfile, newDateProfile))) {\n return newDateProfile;\n }\n else {\n return currentDateProfile;\n }\n }\n function reduceCurrentDate(currentDate, action, dateProfile) {\n switch (action.type) {\n case 'PREV':\n case 'NEXT':\n if (!rangeContainsMarker(dateProfile.currentRange, currentDate)) {\n return dateProfile.currentRange.start;\n }\n else {\n return currentDate;\n }\n case 'SET_DATE':\n case 'SET_VIEW_TYPE':\n var newDate = action.dateMarker || currentDate;\n if (dateProfile.activeRange && !rangeContainsMarker(dateProfile.activeRange, newDate)) {\n return dateProfile.currentRange.start;\n }\n else {\n return newDate;\n }\n default:\n return currentDate;\n }\n }\n function reduceDateSelection(currentSelection, action, calendar) {\n switch (action.type) {\n case 'SELECT_DATES':\n return action.selection;\n case 'UNSELECT_DATES':\n return null;\n default:\n return currentSelection;\n }\n }\n function reduceSelectedEvent(currentInstanceId, action) {\n switch (action.type) {\n case 'SELECT_EVENT':\n return action.eventInstanceId;\n case 'UNSELECT_EVENT':\n return '';\n default:\n return currentInstanceId;\n }\n }\n function reduceEventDrag(currentDrag, action, sources, calendar) {\n switch (action.type) {\n case 'SET_EVENT_DRAG':\n var newDrag = action.state;\n return {\n affectedEvents: newDrag.affectedEvents,\n mutatedEvents: newDrag.mutatedEvents,\n isEvent: newDrag.isEvent,\n origSeg: newDrag.origSeg\n };\n case 'UNSET_EVENT_DRAG':\n return null;\n default:\n return currentDrag;\n }\n }\n function reduceEventResize(currentResize, action, sources, calendar) {\n switch (action.type) {\n case 'SET_EVENT_RESIZE':\n var newResize = action.state;\n return {\n affectedEvents: newResize.affectedEvents,\n mutatedEvents: newResize.mutatedEvents,\n isEvent: newResize.isEvent,\n origSeg: newResize.origSeg\n };\n case 'UNSET_EVENT_RESIZE':\n return null;\n default:\n return currentResize;\n }\n }\n function computeLoadingLevel(eventSources) {\n var cnt = 0;\n for (var sourceId in eventSources) {\n if (eventSources[sourceId].isFetching) {\n cnt++;\n }\n }\n return cnt;\n }\n\n var STANDARD_PROPS = {\n start: null,\n end: null,\n allDay: Boolean\n };\n function parseDateSpan(raw, dateEnv, defaultDuration) {\n var span = parseOpenDateSpan(raw, dateEnv);\n var range = span.range;\n if (!range.start) {\n return null;\n }\n if (!range.end) {\n if (defaultDuration == null) {\n return null;\n }\n else {\n range.end = dateEnv.add(range.start, defaultDuration);\n }\n }\n return span;\n }\n /*\n TODO: somehow combine with parseRange?\n Will return null if the start/end props were present but parsed invalidly.\n */\n function parseOpenDateSpan(raw, dateEnv) {\n var leftovers = {};\n var standardProps = refineProps(raw, STANDARD_PROPS, {}, leftovers);\n var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null;\n var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null;\n var allDay = standardProps.allDay;\n if (allDay == null) {\n allDay = (startMeta && startMeta.isTimeUnspecified) &&\n (!endMeta || endMeta.isTimeUnspecified);\n }\n // use this leftover object as the selection object\n leftovers.range = {\n start: startMeta ? startMeta.marker : null,\n end: endMeta ? endMeta.marker : null\n };\n leftovers.allDay = allDay;\n return leftovers;\n }\n function isDateSpansEqual(span0, span1) {\n return rangesEqual(span0.range, span1.range) &&\n span0.allDay === span1.allDay &&\n isSpanPropsEqual(span0, span1);\n }\n // the NON-DATE-RELATED props\n function isSpanPropsEqual(span0, span1) {\n for (var propName in span1) {\n if (propName !== 'range' && propName !== 'allDay') {\n if (span0[propName] !== span1[propName]) {\n return false;\n }\n }\n }\n // are there any props that span0 has that span1 DOESN'T have?\n // both have range/allDay, so no need to special-case.\n for (var propName in span0) {\n if (!(propName in span1)) {\n return false;\n }\n }\n return true;\n }\n function buildDateSpanApi(span, dateEnv) {\n return {\n start: dateEnv.toDate(span.range.start),\n end: dateEnv.toDate(span.range.end),\n startStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),\n endStr: dateEnv.formatIso(span.range.end, { omitTime: span.allDay }),\n allDay: span.allDay\n };\n }\n function buildDatePointApi(span, dateEnv) {\n return {\n date: dateEnv.toDate(span.range.start),\n dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),\n allDay: span.allDay\n };\n }\n function fabricateEventRange(dateSpan, eventUiBases, calendar) {\n var def = parseEventDef({ editable: false }, '', // sourceId\n dateSpan.allDay, true, // hasEnd\n calendar);\n return {\n def: def,\n ui: compileEventUi(def, eventUiBases),\n instance: createEventInstance(def.defId, dateSpan.range),\n range: dateSpan.range,\n isStart: true,\n isEnd: true\n };\n }\n\n function compileViewDefs(defaultConfigs, overrideConfigs) {\n var hash = {};\n var viewType;\n for (viewType in defaultConfigs) {\n ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);\n }\n for (viewType in overrideConfigs) {\n ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);\n }\n return hash;\n }\n function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {\n if (hash[viewType]) {\n return hash[viewType];\n }\n var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);\n if (viewDef) {\n hash[viewType] = viewDef;\n }\n return viewDef;\n }\n function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {\n var defaultConfig = defaultConfigs[viewType];\n var overrideConfig = overrideConfigs[viewType];\n var queryProp = function (name) {\n return (defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :\n ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null);\n };\n var theClass = queryProp('class');\n var superType = queryProp('superType');\n if (!superType && theClass) {\n superType =\n findViewNameBySubclass(theClass, overrideConfigs) ||\n findViewNameBySubclass(theClass, defaultConfigs);\n }\n var superDef = superType ? ensureViewDef(superType, hash, defaultConfigs, overrideConfigs) : null;\n if (!theClass && superDef) {\n theClass = superDef.class;\n }\n if (!theClass) {\n return null; // don't throw a warning, might be settings for a single-unit view\n }\n return {\n type: viewType,\n class: theClass,\n defaults: __assign({}, (superDef ? superDef.defaults : {}), (defaultConfig ? defaultConfig.options : {})),\n overrides: __assign({}, (superDef ? superDef.overrides : {}), (overrideConfig ? overrideConfig.options : {}))\n };\n }\n function findViewNameBySubclass(viewSubclass, configs) {\n var superProto = Object.getPrototypeOf(viewSubclass.prototype);\n for (var viewType in configs) {\n var parsed = configs[viewType];\n // need DIRECT subclass, so instanceof won't do it\n if (parsed.class && parsed.class.prototype === superProto) {\n return viewType;\n }\n }\n return '';\n }\n\n function parseViewConfigs(inputs) {\n return mapHash(inputs, parseViewConfig);\n }\n var VIEW_DEF_PROPS = {\n type: String,\n class: null\n };\n function parseViewConfig(input) {\n if (typeof input === 'function') {\n input = { class: input };\n }\n var options = {};\n var props = refineProps(input, VIEW_DEF_PROPS, {}, options);\n return {\n superType: props.type,\n class: props.class,\n options: options\n };\n }\n\n function buildViewSpecs(defaultInputs, optionsManager) {\n var defaultConfigs = parseViewConfigs(defaultInputs);\n var overrideConfigs = parseViewConfigs(optionsManager.overrides.views);\n var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs);\n return mapHash(viewDefs, function (viewDef) {\n return buildViewSpec(viewDef, overrideConfigs, optionsManager);\n });\n }\n function buildViewSpec(viewDef, overrideConfigs, optionsManager) {\n var durationInput = viewDef.overrides.duration ||\n viewDef.defaults.duration ||\n optionsManager.dynamicOverrides.duration ||\n optionsManager.overrides.duration;\n var duration = null;\n var durationUnit = '';\n var singleUnit = '';\n var singleUnitOverrides = {};\n if (durationInput) {\n duration = createDuration(durationInput);\n if (duration) { // valid?\n var denom = greatestDurationDenominator(duration, !getWeeksFromInput(durationInput));\n durationUnit = denom.unit;\n if (denom.value === 1) {\n singleUnit = durationUnit;\n singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].options : {};\n }\n }\n }\n var queryButtonText = function (options) {\n var buttonTextMap = options.buttonText || {};\n var buttonTextKey = viewDef.defaults.buttonTextKey;\n if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) {\n return buttonTextMap[buttonTextKey];\n }\n if (buttonTextMap[viewDef.type] != null) {\n return buttonTextMap[viewDef.type];\n }\n if (buttonTextMap[singleUnit] != null) {\n return buttonTextMap[singleUnit];\n }\n };\n return {\n type: viewDef.type,\n class: viewDef.class,\n duration: duration,\n durationUnit: durationUnit,\n singleUnit: singleUnit,\n options: __assign({}, globalDefaults, viewDef.defaults, optionsManager.dirDefaults, optionsManager.localeDefaults, optionsManager.overrides, singleUnitOverrides, viewDef.overrides, optionsManager.dynamicOverrides),\n buttonTextOverride: queryButtonText(optionsManager.dynamicOverrides) ||\n queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence\n viewDef.overrides.buttonText,\n buttonTextDefault: queryButtonText(optionsManager.localeDefaults) ||\n queryButtonText(optionsManager.dirDefaults) ||\n viewDef.defaults.buttonText ||\n queryButtonText(globalDefaults) ||\n viewDef.type // fall back to given view name\n };\n }\n\n var Toolbar = /** @class */ (function (_super) {\n __extends(Toolbar, _super);\n function Toolbar(context, extraClassName) {\n var _this = _super.call(this, context) || this;\n _this._renderLayout = memoizeRendering(_this.renderLayout, _this.unrenderLayout);\n _this._updateTitle = memoizeRendering(_this.updateTitle, null, [_this._renderLayout]);\n _this._updateActiveButton = memoizeRendering(_this.updateActiveButton, null, [_this._renderLayout]);\n _this._updateToday = memoizeRendering(_this.updateToday, null, [_this._renderLayout]);\n _this._updatePrev = memoizeRendering(_this.updatePrev, null, [_this._renderLayout]);\n _this._updateNext = memoizeRendering(_this.updateNext, null, [_this._renderLayout]);\n _this.el = createElement('div', { className: 'fc-toolbar ' + extraClassName });\n return _this;\n }\n Toolbar.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n this._renderLayout.unrender(); // should unrender everything else\n removeElement(this.el);\n };\n Toolbar.prototype.render = function (props) {\n this._renderLayout(props.layout);\n this._updateTitle(props.title);\n this._updateActiveButton(props.activeButton);\n this._updateToday(props.isTodayEnabled);\n this._updatePrev(props.isPrevEnabled);\n this._updateNext(props.isNextEnabled);\n };\n Toolbar.prototype.renderLayout = function (layout) {\n var el = this.el;\n this.viewsWithButtons = [];\n appendToElement(el, this.renderSection('left', layout.left));\n appendToElement(el, this.renderSection('center', layout.center));\n appendToElement(el, this.renderSection('right', layout.right));\n };\n Toolbar.prototype.unrenderLayout = function () {\n this.el.innerHTML = '';\n };\n Toolbar.prototype.renderSection = function (position, buttonStr) {\n var _this = this;\n var _a = this, theme = _a.theme, calendar = _a.calendar;\n var optionsManager = calendar.optionsManager;\n var viewSpecs = calendar.viewSpecs;\n var sectionEl = createElement('div', { className: 'fc-' + position });\n var calendarCustomButtons = optionsManager.computed.customButtons || {};\n var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {};\n var calendarButtonText = optionsManager.computed.buttonText || {};\n if (buttonStr) {\n buttonStr.split(' ').forEach(function (buttonGroupStr, i) {\n var groupChildren = [];\n var isOnlyButtons = true;\n var groupEl;\n buttonGroupStr.split(',').forEach(function (buttonName, j) {\n var customButtonProps;\n var viewSpec;\n var buttonClick;\n var buttonIcon; // only one of these will be set\n var buttonText; // \"\n var buttonInnerHtml;\n var buttonClasses;\n var buttonEl;\n var buttonAriaAttr;\n if (buttonName === 'title') {\n groupChildren.push(htmlToElement('

 

')); // we always want it to take up height\n isOnlyButtons = false;\n }\n else {\n if ((customButtonProps = calendarCustomButtons[buttonName])) {\n buttonClick = function (ev) {\n if (customButtonProps.click) {\n customButtonProps.click.call(buttonEl, ev);\n }\n };\n (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||\n (buttonIcon = theme.getIconClass(buttonName)) ||\n (buttonText = customButtonProps.text);\n }\n else if ((viewSpec = viewSpecs[buttonName])) {\n _this.viewsWithButtons.push(buttonName);\n buttonClick = function () {\n calendar.changeView(buttonName);\n };\n (buttonText = viewSpec.buttonTextOverride) ||\n (buttonIcon = theme.getIconClass(buttonName)) ||\n (buttonText = viewSpec.buttonTextDefault);\n }\n else if (calendar[buttonName]) { // a calendar method\n buttonClick = function () {\n calendar[buttonName]();\n };\n (buttonText = calendarButtonTextOverrides[buttonName]) ||\n (buttonIcon = theme.getIconClass(buttonName)) ||\n (buttonText = calendarButtonText[buttonName]);\n // ^ everything else is considered default\n }\n if (buttonClick) {\n buttonClasses = [\n 'fc-' + buttonName + '-button',\n theme.getClass('button')\n ];\n if (buttonText) {\n buttonInnerHtml = htmlEscape(buttonText);\n buttonAriaAttr = '';\n }\n else if (buttonIcon) {\n buttonInnerHtml = \"\";\n buttonAriaAttr = ' aria-label=\"' + buttonName + '\"';\n }\n buttonEl = htmlToElement(// type=\"button\" so that it doesn't submit a form\n '');\n buttonEl.addEventListener('click', buttonClick);\n groupChildren.push(buttonEl);\n }\n }\n });\n if (groupChildren.length > 1) {\n groupEl = document.createElement('div');\n var buttonGroupClassName = theme.getClass('buttonGroup');\n if (isOnlyButtons && buttonGroupClassName) {\n groupEl.classList.add(buttonGroupClassName);\n }\n appendToElement(groupEl, groupChildren);\n sectionEl.appendChild(groupEl);\n }\n else {\n appendToElement(sectionEl, groupChildren); // 1 or 0 children\n }\n });\n }\n return sectionEl;\n };\n Toolbar.prototype.updateToday = function (isTodayEnabled) {\n this.toggleButtonEnabled('today', isTodayEnabled);\n };\n Toolbar.prototype.updatePrev = function (isPrevEnabled) {\n this.toggleButtonEnabled('prev', isPrevEnabled);\n };\n Toolbar.prototype.updateNext = function (isNextEnabled) {\n this.toggleButtonEnabled('next', isNextEnabled);\n };\n Toolbar.prototype.updateTitle = function (text) {\n findElements(this.el, 'h2').forEach(function (titleEl) {\n titleEl.innerText = text;\n });\n };\n Toolbar.prototype.updateActiveButton = function (buttonName) {\n var className = this.theme.getClass('buttonActive');\n findElements(this.el, 'button').forEach(function (buttonEl) {\n if (buttonName && buttonEl.classList.contains('fc-' + buttonName + '-button')) {\n buttonEl.classList.add(className);\n }\n else {\n buttonEl.classList.remove(className);\n }\n });\n };\n Toolbar.prototype.toggleButtonEnabled = function (buttonName, bool) {\n findElements(this.el, '.fc-' + buttonName + '-button').forEach(function (buttonEl) {\n buttonEl.disabled = !bool;\n });\n };\n return Toolbar;\n }(Component));\n\n var CalendarComponent = /** @class */ (function (_super) {\n __extends(CalendarComponent, _super);\n function CalendarComponent(context, el) {\n var _this = _super.call(this, context) || this;\n _this._renderToolbars = memoizeRendering(_this.renderToolbars);\n _this.buildViewPropTransformers = memoize(buildViewPropTransformers);\n _this.el = el;\n prependToElement(el, _this.contentEl = createElement('div', { className: 'fc-view-container' }));\n var calendar = _this.calendar;\n for (var _i = 0, _a = calendar.pluginSystem.hooks.viewContainerModifiers; _i < _a.length; _i++) {\n var modifyViewContainer = _a[_i];\n modifyViewContainer(_this.contentEl, calendar);\n }\n _this.toggleElClassNames(true);\n _this.computeTitle = memoize(computeTitle);\n _this.parseBusinessHours = memoize(function (input) {\n return parseBusinessHours(input, _this.calendar);\n });\n return _this;\n }\n CalendarComponent.prototype.destroy = function () {\n if (this.header) {\n this.header.destroy();\n }\n if (this.footer) {\n this.footer.destroy();\n }\n if (this.view) {\n this.view.destroy();\n }\n removeElement(this.contentEl);\n this.toggleElClassNames(false);\n _super.prototype.destroy.call(this);\n };\n CalendarComponent.prototype.toggleElClassNames = function (bool) {\n var classList = this.el.classList;\n var dirClassName = 'fc-' + this.opt('dir');\n var themeClassName = this.theme.getClass('widget');\n if (bool) {\n classList.add('fc');\n classList.add(dirClassName);\n classList.add(themeClassName);\n }\n else {\n classList.remove('fc');\n classList.remove(dirClassName);\n classList.remove(themeClassName);\n }\n };\n CalendarComponent.prototype.render = function (props) {\n this.freezeHeight();\n var title = this.computeTitle(props.dateProfile, props.viewSpec.options);\n this._renderToolbars(props.viewSpec, props.dateProfile, props.currentDate, props.dateProfileGenerator, title);\n this.renderView(props, title);\n this.updateSize();\n this.thawHeight();\n };\n CalendarComponent.prototype.renderToolbars = function (viewSpec, dateProfile, currentDate, dateProfileGenerator, title) {\n var headerLayout = this.opt('header');\n var footerLayout = this.opt('footer');\n var now = this.calendar.getNow();\n var todayInfo = dateProfileGenerator.build(now);\n var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate);\n var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate);\n var toolbarProps = {\n title: title,\n activeButton: viewSpec.type,\n isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now),\n isPrevEnabled: prevInfo.isValid,\n isNextEnabled: nextInfo.isValid\n };\n if (headerLayout) {\n if (!this.header) {\n this.header = new Toolbar(this.context, 'fc-header-toolbar');\n prependToElement(this.el, this.header.el);\n }\n this.header.receiveProps(__assign({ layout: headerLayout }, toolbarProps));\n }\n else if (this.header) {\n this.header.destroy();\n this.header = null;\n }\n if (footerLayout) {\n if (!this.footer) {\n this.footer = new Toolbar(this.context, 'fc-footer-toolbar');\n appendToElement(this.el, this.footer.el);\n }\n this.footer.receiveProps(__assign({ layout: footerLayout }, toolbarProps));\n }\n else if (this.footer) {\n this.footer.destroy();\n this.footer = null;\n }\n };\n CalendarComponent.prototype.renderView = function (props, title) {\n var view = this.view;\n var viewSpec = props.viewSpec, dateProfileGenerator = props.dateProfileGenerator;\n if (!view || view.viewSpec !== viewSpec) {\n if (view) {\n view.destroy();\n }\n view = this.view = new viewSpec['class']({\n calendar: this.calendar,\n view: null,\n dateEnv: this.dateEnv,\n theme: this.theme,\n options: viewSpec.options\n }, viewSpec, dateProfileGenerator, this.contentEl);\n }\n else {\n view.addScroll(view.queryScroll());\n }\n view.title = title; // for the API\n var viewProps = {\n dateProfile: props.dateProfile,\n businessHours: this.parseBusinessHours(viewSpec.options.businessHours),\n eventStore: props.eventStore,\n eventUiBases: props.eventUiBases,\n dateSelection: props.dateSelection,\n eventSelection: props.eventSelection,\n eventDrag: props.eventDrag,\n eventResize: props.eventResize\n };\n var transformers = this.buildViewPropTransformers(this.calendar.pluginSystem.hooks.viewPropsTransformers);\n for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {\n var transformer = transformers_1[_i];\n __assign(viewProps, transformer.transform(viewProps, viewSpec, props, view));\n }\n view.receiveProps(viewProps);\n };\n // Sizing\n // -----------------------------------------------------------------------------------------------------------------\n CalendarComponent.prototype.updateSize = function (isResize) {\n if (isResize === void 0) { isResize = false; }\n var view = this.view;\n if (isResize) {\n view.addScroll(view.queryScroll());\n }\n if (isResize || this.isHeightAuto == null) {\n this.computeHeightVars();\n }\n view.updateSize(isResize, this.viewHeight, this.isHeightAuto);\n view.updateNowIndicator(); // we need to guarantee this will run after updateSize\n view.popScroll(isResize);\n };\n CalendarComponent.prototype.computeHeightVars = function () {\n var calendar = this.calendar; // yuck. need to handle dynamic options\n var heightInput = calendar.opt('height');\n var contentHeightInput = calendar.opt('contentHeight');\n this.isHeightAuto = heightInput === 'auto' || contentHeightInput === 'auto';\n if (typeof contentHeightInput === 'number') { // exists and not 'auto'\n this.viewHeight = contentHeightInput;\n }\n else if (typeof contentHeightInput === 'function') { // exists and is a function\n this.viewHeight = contentHeightInput();\n }\n else if (typeof heightInput === 'number') { // exists and not 'auto'\n this.viewHeight = heightInput - this.queryToolbarsHeight();\n }\n else if (typeof heightInput === 'function') { // exists and is a function\n this.viewHeight = heightInput() - this.queryToolbarsHeight();\n }\n else if (heightInput === 'parent') { // set to height of parent element\n this.viewHeight = this.el.parentNode.offsetHeight - this.queryToolbarsHeight();\n }\n else {\n this.viewHeight = Math.round(this.contentEl.offsetWidth /\n Math.max(calendar.opt('aspectRatio'), .5));\n }\n };\n CalendarComponent.prototype.queryToolbarsHeight = function () {\n var height = 0;\n if (this.header) {\n height += computeHeightAndMargins(this.header.el);\n }\n if (this.footer) {\n height += computeHeightAndMargins(this.footer.el);\n }\n return height;\n };\n // Height \"Freezing\"\n // -----------------------------------------------------------------------------------------------------------------\n CalendarComponent.prototype.freezeHeight = function () {\n applyStyle(this.el, {\n height: this.el.offsetHeight,\n overflow: 'hidden'\n });\n };\n CalendarComponent.prototype.thawHeight = function () {\n applyStyle(this.el, {\n height: '',\n overflow: ''\n });\n };\n return CalendarComponent;\n }(Component));\n // Title and Date Formatting\n // -----------------------------------------------------------------------------------------------------------------\n // Computes what the title at the top of the calendar should be for this view\n function computeTitle(dateProfile, viewOptions) {\n var range;\n // for views that span a large unit of time, show the proper interval, ignoring stray days before and after\n if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {\n range = dateProfile.currentRange;\n }\n else { // for day units or smaller, use the actual day range\n range = dateProfile.activeRange;\n }\n return this.dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || computeTitleFormat(dateProfile), viewOptions.titleRangeSeparator), { isEndExclusive: dateProfile.isRangeAllDay });\n }\n // Generates the format string that should be used to generate the title for the current date range.\n // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.\n function computeTitleFormat(dateProfile) {\n var currentRangeUnit = dateProfile.currentRangeUnit;\n if (currentRangeUnit === 'year') {\n return { year: 'numeric' };\n }\n else if (currentRangeUnit === 'month') {\n return { year: 'numeric', month: 'long' }; // like \"September 2014\"\n }\n else {\n var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end);\n if (days !== null && days > 1) {\n // multi-day range. shorter, like \"Sep 9 - 10 2014\"\n return { year: 'numeric', month: 'short', day: 'numeric' };\n }\n else {\n // one day. longer, like \"September 9 2014\"\n return { year: 'numeric', month: 'long', day: 'numeric' };\n }\n }\n }\n // Plugin\n // -----------------------------------------------------------------------------------------------------------------\n function buildViewPropTransformers(theClasses) {\n return theClasses.map(function (theClass) {\n return new theClass();\n });\n }\n\n var Interaction = /** @class */ (function () {\n function Interaction(settings) {\n this.component = settings.component;\n }\n Interaction.prototype.destroy = function () {\n };\n return Interaction;\n }());\n function parseInteractionSettings(component, input) {\n return {\n component: component,\n el: input.el,\n useEventCenter: input.useEventCenter != null ? input.useEventCenter : true\n };\n }\n function interactionSettingsToStore(settings) {\n var _a;\n return _a = {},\n _a[settings.component.uid] = settings,\n _a;\n }\n // global state\n var interactionSettingsStore = {};\n\n /*\n Detects when the user clicks on an event within a DateComponent\n */\n var EventClicking = /** @class */ (function (_super) {\n __extends(EventClicking, _super);\n function EventClicking(settings) {\n var _this = _super.call(this, settings) || this;\n _this.handleSegClick = function (ev, segEl) {\n var component = _this.component;\n var seg = getElSeg(segEl);\n if (seg && // might be the
surrounding the more link\n component.isValidSegDownEl(ev.target)) {\n // our way to simulate a link click for elements that can't be tags\n // grab before trigger fired in case trigger trashes DOM thru rerendering\n var hasUrlContainer = elementClosest(ev.target, '.fc-has-url');\n var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : '';\n component.publiclyTrigger('eventClick', [\n {\n el: segEl,\n event: new EventApi(component.calendar, seg.eventRange.def, seg.eventRange.instance),\n jsEvent: ev,\n view: component.view\n }\n ]);\n if (url && !ev.defaultPrevented) {\n window.location.href = url;\n }\n }\n };\n var component = settings.component;\n _this.destroy = listenBySelector(component.el, 'click', component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegClick);\n return _this;\n }\n return EventClicking;\n }(Interaction));\n\n /*\n Triggers events and adds/removes core classNames when the user's pointer\n enters/leaves event-elements of a component.\n */\n var EventHovering = /** @class */ (function (_super) {\n __extends(EventHovering, _super);\n function EventHovering(settings) {\n var _this = _super.call(this, settings) || this;\n // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it\n _this.handleEventElRemove = function (el) {\n if (el === _this.currentSegEl) {\n _this.handleSegLeave(null, _this.currentSegEl);\n }\n };\n _this.handleSegEnter = function (ev, segEl) {\n if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper\n segEl.classList.add('fc-allow-mouse-resize');\n _this.currentSegEl = segEl;\n _this.triggerEvent('eventMouseEnter', ev, segEl);\n }\n };\n _this.handleSegLeave = function (ev, segEl) {\n if (_this.currentSegEl) {\n segEl.classList.remove('fc-allow-mouse-resize');\n _this.currentSegEl = null;\n _this.triggerEvent('eventMouseLeave', ev, segEl);\n }\n };\n var component = settings.component;\n _this.removeHoverListeners = listenToHoverBySelector(component.el, component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegEnter, _this.handleSegLeave);\n component.calendar.on('eventElRemove', _this.handleEventElRemove);\n return _this;\n }\n EventHovering.prototype.destroy = function () {\n this.removeHoverListeners();\n this.component.calendar.off('eventElRemove', this.handleEventElRemove);\n };\n EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) {\n var component = this.component;\n var seg = getElSeg(segEl);\n if (!ev || component.isValidSegDownEl(ev.target)) {\n component.publiclyTrigger(publicEvName, [\n {\n el: segEl,\n event: new EventApi(this.component.calendar, seg.eventRange.def, seg.eventRange.instance),\n jsEvent: ev,\n view: component.view\n }\n ]);\n }\n };\n return EventHovering;\n }(Interaction));\n\n var StandardTheme = /** @class */ (function (_super) {\n __extends(StandardTheme, _super);\n function StandardTheme() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n return StandardTheme;\n }(Theme));\n StandardTheme.prototype.classes = {\n widget: 'fc-unthemed',\n widgetHeader: 'fc-widget-header',\n widgetContent: 'fc-widget-content',\n buttonGroup: 'fc-button-group',\n button: 'fc-button fc-button-primary',\n buttonActive: 'fc-button-active',\n popoverHeader: 'fc-widget-header',\n popoverContent: 'fc-widget-content',\n // day grid\n headerRow: 'fc-widget-header',\n dayRow: 'fc-widget-content',\n // list view\n listView: 'fc-widget-content'\n };\n StandardTheme.prototype.baseIconClass = 'fc-icon';\n StandardTheme.prototype.iconClasses = {\n close: 'fc-icon-x',\n prev: 'fc-icon-chevron-left',\n next: 'fc-icon-chevron-right',\n prevYear: 'fc-icon-chevrons-left',\n nextYear: 'fc-icon-chevrons-right'\n };\n StandardTheme.prototype.iconOverrideOption = 'buttonIcons';\n StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';\n StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';\n\n var Calendar = /** @class */ (function () {\n function Calendar(el, overrides) {\n var _this = this;\n this.parseRawLocales = memoize(parseRawLocales);\n this.buildLocale = memoize(buildLocale);\n this.buildDateEnv = memoize(buildDateEnv);\n this.buildTheme = memoize(buildTheme);\n this.buildEventUiSingleBase = memoize(this._buildEventUiSingleBase);\n this.buildSelectionConfig = memoize(this._buildSelectionConfig);\n this.buildEventUiBySource = memoizeOutput(buildEventUiBySource, isObjectsSimilar);\n this.buildEventUiBases = memoize(buildEventUiBases);\n this.interactionsStore = {};\n this.actionQueue = [];\n this.isReducing = false;\n // isDisplaying: boolean = false // installed in DOM? accepting renders?\n this.needsRerender = false; // needs a render?\n this.needsFullRerender = false;\n this.isRendering = false; // currently in the executeRender function?\n this.renderingPauseDepth = 0;\n this.buildDelayedRerender = memoize(buildDelayedRerender);\n this.afterSizingTriggers = {};\n this.isViewUpdated = false;\n this.isDatesUpdated = false;\n this.isEventsUpdated = false;\n this.el = el;\n this.optionsManager = new OptionsManager(overrides || {});\n this.pluginSystem = new PluginSystem();\n // only do once. don't do in handleOptions. because can't remove plugins\n this.addPluginInputs(this.optionsManager.computed.plugins || []);\n this.handleOptions(this.optionsManager.computed);\n this.publiclyTrigger('_init'); // for tests\n this.hydrate();\n this.calendarInteractions = this.pluginSystem.hooks.calendarInteractions\n .map(function (calendarInteractionClass) {\n return new calendarInteractionClass(_this);\n });\n }\n Calendar.prototype.addPluginInputs = function (pluginInputs) {\n var pluginDefs = refinePluginDefs(pluginInputs);\n for (var _i = 0, pluginDefs_1 = pluginDefs; _i < pluginDefs_1.length; _i++) {\n var pluginDef = pluginDefs_1[_i];\n this.pluginSystem.add(pluginDef);\n }\n };\n Object.defineProperty(Calendar.prototype, \"view\", {\n // public API\n get: function () {\n return this.component ? this.component.view : null;\n },\n enumerable: true,\n configurable: true\n });\n // Public API for rendering\n // -----------------------------------------------------------------------------------------------------------------\n Calendar.prototype.render = function () {\n if (!this.component) {\n this.renderableEventStore = createEmptyEventStore();\n this.bindHandlers();\n this.executeRender();\n }\n else {\n this.requestRerender(true);\n }\n };\n Calendar.prototype.destroy = function () {\n if (this.component) {\n this.unbindHandlers();\n this.component.destroy(); // don't null-out. in case API needs access\n this.component = null; // umm ???\n for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) {\n var interaction = _a[_i];\n interaction.destroy();\n }\n this.publiclyTrigger('_destroyed');\n }\n };\n // Handlers\n // -----------------------------------------------------------------------------------------------------------------\n Calendar.prototype.bindHandlers = function () {\n var _this = this;\n // event delegation for nav links\n this.removeNavLinkListener = listenBySelector(this.el, 'click', 'a[data-goto]', function (ev, anchorEl) {\n var gotoOptions = anchorEl.getAttribute('data-goto');\n gotoOptions = gotoOptions ? JSON.parse(gotoOptions) : {};\n var dateEnv = _this.dateEnv;\n var dateMarker = dateEnv.createMarker(gotoOptions.date);\n var viewType = gotoOptions.type;\n // property like \"navLinkDayClick\". might be a string or a function\n var customAction = _this.viewOpt('navLink' + capitaliseFirstLetter(viewType) + 'Click');\n if (typeof customAction === 'function') {\n customAction(dateEnv.toDate(dateMarker), ev);\n }\n else {\n if (typeof customAction === 'string') {\n viewType = customAction;\n }\n _this.zoomTo(dateMarker, viewType);\n }\n });\n if (this.opt('handleWindowResize')) {\n window.addEventListener('resize', this.windowResizeProxy = debounce(// prevents rapid calls\n this.windowResize.bind(this), this.opt('windowResizeDelay')));\n }\n };\n Calendar.prototype.unbindHandlers = function () {\n this.removeNavLinkListener();\n if (this.windowResizeProxy) {\n window.removeEventListener('resize', this.windowResizeProxy);\n this.windowResizeProxy = null;\n }\n };\n // Dispatcher\n // -----------------------------------------------------------------------------------------------------------------\n Calendar.prototype.hydrate = function () {\n var _this = this;\n this.state = this.buildInitialState();\n var rawSources = this.opt('eventSources') || [];\n var singleRawSource = this.opt('events');\n var sources = []; // parsed\n if (singleRawSource) {\n rawSources.unshift(singleRawSource);\n }\n for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) {\n var rawSource = rawSources_1[_i];\n var source = parseEventSource(rawSource, this);\n if (source) {\n sources.push(source);\n }\n }\n this.batchRendering(function () {\n _this.dispatch({ type: 'INIT' }); // pass in sources here?\n _this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: sources });\n _this.dispatch({\n type: 'SET_VIEW_TYPE',\n viewType: _this.opt('defaultView') || _this.pluginSystem.hooks.defaultView\n });\n });\n };\n Calendar.prototype.buildInitialState = function () {\n return {\n viewType: null,\n loadingLevel: 0,\n eventSourceLoadingLevel: 0,\n currentDate: this.getInitialDate(),\n dateProfile: null,\n eventSources: {},\n eventStore: createEmptyEventStore(),\n dateSelection: null,\n eventSelection: '',\n eventDrag: null,\n eventResize: null\n };\n };\n Calendar.prototype.dispatch = function (action) {\n this.actionQueue.push(action);\n if (!this.isReducing) {\n this.isReducing = true;\n var oldState = this.state;\n while (this.actionQueue.length) {\n this.state = this.reduce(this.state, this.actionQueue.shift(), this);\n }\n var newState = this.state;\n this.isReducing = false;\n if (!oldState.loadingLevel && newState.loadingLevel) {\n this.publiclyTrigger('loading', [true]);\n }\n else if (oldState.loadingLevel && !newState.loadingLevel) {\n this.publiclyTrigger('loading', [false]);\n }\n var view = this.component && this.component.view;\n if (oldState.eventStore !== newState.eventStore || this.needsFullRerender) {\n if (oldState.eventStore) {\n this.isEventsUpdated = true;\n }\n }\n if (oldState.dateProfile !== newState.dateProfile || this.needsFullRerender) {\n if (oldState.dateProfile && view) { // why would view be null!?\n this.publiclyTrigger('datesDestroy', [\n {\n view: view,\n el: view.el\n }\n ]);\n }\n this.isDatesUpdated = true;\n }\n if (oldState.viewType !== newState.viewType || this.needsFullRerender) {\n if (oldState.viewType && view) { // why would view be null!?\n this.publiclyTrigger('viewSkeletonDestroy', [\n {\n view: view,\n el: view.el\n }\n ]);\n }\n this.isViewUpdated = true;\n }\n this.requestRerender();\n }\n };\n Calendar.prototype.reduce = function (state, action, calendar) {\n return reduce(state, action, calendar);\n };\n // Render Queue\n // -----------------------------------------------------------------------------------------------------------------\n Calendar.prototype.requestRerender = function (needsFull) {\n if (needsFull === void 0) { needsFull = false; }\n this.needsRerender = true;\n this.needsFullRerender = this.needsFullRerender || needsFull;\n this.delayedRerender(); // will call a debounced-version of tryRerender\n };\n Calendar.prototype.tryRerender = function () {\n if (this.component && // must be accepting renders\n this.needsRerender && // indicates that a rerender was requested\n !this.renderingPauseDepth && // not paused\n !this.isRendering // not currently in the render loop\n ) {\n this.executeRender();\n }\n };\n Calendar.prototype.batchRendering = function (func) {\n this.renderingPauseDepth++;\n func();\n this.renderingPauseDepth--;\n if (this.needsRerender) {\n this.requestRerender();\n }\n };\n // Rendering\n // -----------------------------------------------------------------------------------------------------------------\n Calendar.prototype.executeRender = function () {\n var needsFullRerender = this.needsFullRerender; // save before clearing\n // clear these BEFORE the render so that new values will accumulate during render\n this.needsRerender = false;\n this.needsFullRerender = false;\n this.isRendering = true;\n this.renderComponent(needsFullRerender);\n this.isRendering = false;\n // received a rerender request while rendering\n if (this.needsRerender) {\n this.delayedRerender();\n }\n };\n /*\n don't call this directly. use executeRender instead\n */\n Calendar.prototype.renderComponent = function (needsFull) {\n var _a = this, state = _a.state, component = _a.component;\n var viewType = state.viewType;\n var viewSpec = this.viewSpecs[viewType];\n var savedScroll = (needsFull && component) ? component.view.queryScroll() : null;\n if (!viewSpec) {\n throw new Error(\"View type \\\"\" + viewType + \"\\\" is not valid\");\n }\n // if event sources are still loading and progressive rendering hasn't been enabled,\n // keep rendering the last fully loaded set of events\n var renderableEventStore = this.renderableEventStore =\n (state.eventSourceLoadingLevel && !this.opt('progressiveEventRendering')) ?\n this.renderableEventStore :\n state.eventStore;\n var eventUiSingleBase = this.buildEventUiSingleBase(viewSpec.options);\n var eventUiBySource = this.buildEventUiBySource(state.eventSources);\n var eventUiBases = this.eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource);\n if (needsFull || !component) {\n if (component) {\n component.freezeHeight(); // next component will unfreeze it\n component.destroy();\n }\n component = this.component = new CalendarComponent({\n calendar: this,\n view: null,\n dateEnv: this.dateEnv,\n theme: this.theme,\n options: this.optionsManager.computed\n }, this.el);\n }\n component.receiveProps(__assign({}, state, { viewSpec: viewSpec, dateProfile: state.dateProfile, dateProfileGenerator: this.dateProfileGenerators[viewType], eventStore: renderableEventStore, eventUiBases: eventUiBases, dateSelection: state.dateSelection, eventSelection: state.eventSelection, eventDrag: state.eventDrag, eventResize: state.eventResize }));\n if (savedScroll) {\n component.view.applyScroll(savedScroll, false);\n }\n if (this.isViewUpdated) {\n this.isViewUpdated = false;\n this.publiclyTrigger('viewSkeletonRender', [\n {\n view: component.view,\n el: component.view.el\n }\n ]);\n }\n if (this.isDatesUpdated) {\n this.isDatesUpdated = false;\n this.publiclyTrigger('datesRender', [\n {\n view: component.view,\n el: component.view.el\n }\n ]);\n }\n if (this.isEventsUpdated) {\n this.isEventsUpdated = false;\n }\n this.releaseAfterSizingTriggers();\n };\n // Options\n // -----------------------------------------------------------------------------------------------------------------\n /*\n Not meant for public API\n */\n Calendar.prototype.resetOptions = function (options) {\n var _this = this;\n var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers;\n var oldOptions = this.optionsManager.overrides;\n var oldNormalOptions = {};\n var normalOptions = {};\n var specialOptions = {};\n for (var name_1 in oldOptions) {\n if (!changeHandlers[name_1]) {\n oldNormalOptions[name_1] = oldOptions[name_1];\n }\n }\n for (var name_2 in options) {\n if (changeHandlers[name_2]) {\n specialOptions[name_2] = options[name_2];\n }\n else {\n normalOptions[name_2] = options[name_2];\n }\n }\n this.batchRendering(function () {\n if (anyKeysRemoved(oldNormalOptions, normalOptions)) {\n _this.processOptions(options, 'reset');\n }\n else {\n _this.processOptions(computeChangedProps(oldNormalOptions, normalOptions));\n }\n // handle special options last\n for (var name_3 in specialOptions) {\n changeHandlers[name_3](specialOptions[name_3], _this);\n }\n });\n };\n /*\n Not meant for public API. Won't give the same precedence that setOption does\n */\n Calendar.prototype.setOptions = function (options) {\n var _this = this;\n var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers;\n var normalOptions = {};\n var specialOptions = {};\n for (var name_4 in options) {\n if (changeHandlers[name_4]) {\n specialOptions[name_4] = options[name_4];\n }\n else {\n normalOptions[name_4] = options[name_4];\n }\n }\n this.batchRendering(function () {\n _this.processOptions(normalOptions);\n // handle special options last\n for (var name_5 in specialOptions) {\n changeHandlers[name_5](specialOptions[name_5], _this);\n }\n });\n };\n Calendar.prototype.processOptions = function (options, mode) {\n var _this = this;\n var oldDateEnv = this.dateEnv; // do this before handleOptions\n var isTimeZoneDirty = false;\n var isSizeDirty = false;\n var anyDifficultOptions = false;\n for (var name_6 in options) {\n if (/^(height|contentHeight|aspectRatio)$/.test(name_6)) {\n isSizeDirty = true;\n }\n else if (/^(defaultDate|defaultView)$/.test(name_6)) ;\n else {\n anyDifficultOptions = true;\n if (name_6 === 'timeZone') {\n isTimeZoneDirty = true;\n }\n }\n }\n if (mode === 'reset') {\n anyDifficultOptions = true;\n this.optionsManager.reset(options);\n }\n else if (mode === 'dynamic') {\n this.optionsManager.addDynamic(options); // takes higher precedence\n }\n else {\n this.optionsManager.add(options);\n }\n if (anyDifficultOptions) {\n this.handleOptions(this.optionsManager.computed); // only for \"difficult\" options\n this.needsFullRerender = true;\n this.batchRendering(function () {\n if (isTimeZoneDirty) {\n _this.dispatch({\n type: 'CHANGE_TIMEZONE',\n oldDateEnv: oldDateEnv\n });\n }\n /* HACK\n has the same effect as calling this.requestRerender(true)\n but recomputes the state's dateProfile\n */\n _this.dispatch({\n type: 'SET_VIEW_TYPE',\n viewType: _this.state.viewType\n });\n });\n }\n if (isSizeDirty) {\n this.updateSize();\n }\n };\n Calendar.prototype.setOption = function (name, val) {\n var _a;\n this.processOptions((_a = {}, _a[name] = val, _a), 'dynamic');\n };\n Calendar.prototype.getOption = function (name) {\n return this.optionsManager.computed[name];\n };\n Calendar.prototype.opt = function (name) {\n return this.optionsManager.computed[name];\n };\n Calendar.prototype.viewOpt = function (name) {\n return this.viewOpts()[name];\n };\n Calendar.prototype.viewOpts = function () {\n return this.viewSpecs[this.state.viewType].options;\n };\n /*\n rebuilds things based off of a complete set of refined options\n */\n Calendar.prototype.handleOptions = function (options) {\n var _this = this;\n var pluginHooks = this.pluginSystem.hooks;\n this.defaultAllDayEventDuration = createDuration(options.defaultAllDayEventDuration);\n this.defaultTimedEventDuration = createDuration(options.defaultTimedEventDuration);\n this.delayedRerender = this.buildDelayedRerender(options.rerenderDelay);\n this.theme = this.buildTheme(options);\n var available = this.parseRawLocales(options.locales);\n this.availableRawLocales = available.map;\n var locale = this.buildLocale(options.locale || available.defaultCode, available.map);\n this.dateEnv = this.buildDateEnv(locale, options.timeZone, pluginHooks.namedTimeZonedImpl, options.firstDay, options.weekNumberCalculation, options.weekLabel, pluginHooks.cmdFormatter);\n this.selectionConfig = this.buildSelectionConfig(options); // needs dateEnv. do after :(\n // ineffecient to do every time?\n this.viewSpecs = buildViewSpecs(pluginHooks.views, this.optionsManager);\n // ineffecient to do every time?\n this.dateProfileGenerators = mapHash(this.viewSpecs, function (viewSpec) {\n return new viewSpec.class.prototype.dateProfileGeneratorClass(viewSpec, _this);\n });\n };\n Calendar.prototype.getAvailableLocaleCodes = function () {\n return Object.keys(this.availableRawLocales);\n };\n Calendar.prototype._buildSelectionConfig = function (rawOpts) {\n return processScopedUiProps('select', rawOpts, this);\n };\n Calendar.prototype._buildEventUiSingleBase = function (rawOpts) {\n if (rawOpts.editable) { // so 'editable' affected events\n rawOpts = __assign({}, rawOpts, { eventEditable: true });\n }\n return processScopedUiProps('event', rawOpts, this);\n };\n // Trigger\n // -----------------------------------------------------------------------------------------------------------------\n Calendar.prototype.hasPublicHandlers = function (name) {\n return this.hasHandlers(name) ||\n this.opt(name); // handler specified in options\n };\n Calendar.prototype.publiclyTrigger = function (name, args) {\n var optHandler = this.opt(name);\n this.triggerWith(name, this, args);\n if (optHandler) {\n return optHandler.apply(this, args);\n }\n };\n Calendar.prototype.publiclyTriggerAfterSizing = function (name, args) {\n var afterSizingTriggers = this.afterSizingTriggers;\n (afterSizingTriggers[name] || (afterSizingTriggers[name] = [])).push(args);\n };\n Calendar.prototype.releaseAfterSizingTriggers = function () {\n var afterSizingTriggers = this.afterSizingTriggers;\n for (var name_7 in afterSizingTriggers) {\n for (var _i = 0, _a = afterSizingTriggers[name_7]; _i < _a.length; _i++) {\n var args = _a[_i];\n this.publiclyTrigger(name_7, args);\n }\n }\n this.afterSizingTriggers = {};\n };\n // View\n // -----------------------------------------------------------------------------------------------------------------\n // Returns a boolean about whether the view is okay to instantiate at some point\n Calendar.prototype.isValidViewType = function (viewType) {\n return Boolean(this.viewSpecs[viewType]);\n };\n Calendar.prototype.changeView = function (viewType, dateOrRange) {\n var dateMarker = null;\n if (dateOrRange) {\n if (dateOrRange.start && dateOrRange.end) { // a range\n this.optionsManager.addDynamic({ visibleRange: dateOrRange }); // will not rerender\n this.handleOptions(this.optionsManager.computed); // ...but yuck\n }\n else { // a date\n dateMarker = this.dateEnv.createMarker(dateOrRange); // just like gotoDate\n }\n }\n this.unselect();\n this.dispatch({\n type: 'SET_VIEW_TYPE',\n viewType: viewType,\n dateMarker: dateMarker\n });\n };\n // Forces navigation to a view for the given date.\n // `viewType` can be a specific view name or a generic one like \"week\" or \"day\".\n // needs to change\n Calendar.prototype.zoomTo = function (dateMarker, viewType) {\n var spec;\n viewType = viewType || 'day'; // day is default zoom\n spec = this.viewSpecs[viewType] ||\n this.getUnitViewSpec(viewType);\n this.unselect();\n if (spec) {\n this.dispatch({\n type: 'SET_VIEW_TYPE',\n viewType: spec.type,\n dateMarker: dateMarker\n });\n }\n else {\n this.dispatch({\n type: 'SET_DATE',\n dateMarker: dateMarker\n });\n }\n };\n // Given a duration singular unit, like \"week\" or \"day\", finds a matching view spec.\n // Preference is given to views that have corresponding buttons.\n Calendar.prototype.getUnitViewSpec = function (unit) {\n var viewTypes;\n var i;\n var spec;\n // put views that have buttons first. there will be duplicates, but oh well\n viewTypes = this.component.header.viewsWithButtons; // TODO: include footer as well?\n for (var viewType in this.viewSpecs) {\n viewTypes.push(viewType);\n }\n for (i = 0; i < viewTypes.length; i++) {\n spec = this.viewSpecs[viewTypes[i]];\n if (spec) {\n if (spec.singleUnit === unit) {\n return spec;\n }\n }\n }\n };\n // Current Date\n // -----------------------------------------------------------------------------------------------------------------\n Calendar.prototype.getInitialDate = function () {\n var defaultDateInput = this.opt('defaultDate');\n // compute the initial ambig-timezone date\n if (defaultDateInput != null) {\n return this.dateEnv.createMarker(defaultDateInput);\n }\n else {\n return this.getNow(); // getNow already returns unzoned\n }\n };\n Calendar.prototype.prev = function () {\n this.unselect();\n this.dispatch({ type: 'PREV' });\n };\n Calendar.prototype.next = function () {\n this.unselect();\n this.dispatch({ type: 'NEXT' });\n };\n Calendar.prototype.prevYear = function () {\n this.unselect();\n this.dispatch({\n type: 'SET_DATE',\n dateMarker: this.dateEnv.addYears(this.state.currentDate, -1)\n });\n };\n Calendar.prototype.nextYear = function () {\n this.unselect();\n this.dispatch({\n type: 'SET_DATE',\n dateMarker: this.dateEnv.addYears(this.state.currentDate, 1)\n });\n };\n Calendar.prototype.today = function () {\n this.unselect();\n this.dispatch({\n type: 'SET_DATE',\n dateMarker: this.getNow()\n });\n };\n Calendar.prototype.gotoDate = function (zonedDateInput) {\n this.unselect();\n this.dispatch({\n type: 'SET_DATE',\n dateMarker: this.dateEnv.createMarker(zonedDateInput)\n });\n };\n Calendar.prototype.incrementDate = function (deltaInput) {\n var delta = createDuration(deltaInput);\n if (delta) { // else, warn about invalid input?\n this.unselect();\n this.dispatch({\n type: 'SET_DATE',\n dateMarker: this.dateEnv.add(this.state.currentDate, delta)\n });\n }\n };\n // for external API\n Calendar.prototype.getDate = function () {\n return this.dateEnv.toDate(this.state.currentDate);\n };\n // Date Formatting Utils\n // -----------------------------------------------------------------------------------------------------------------\n Calendar.prototype.formatDate = function (d, formatter) {\n var dateEnv = this.dateEnv;\n return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter));\n };\n // `settings` is for formatter AND isEndExclusive\n Calendar.prototype.formatRange = function (d0, d1, settings) {\n var dateEnv = this.dateEnv;\n return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings, this.opt('defaultRangeSeparator')), settings);\n };\n Calendar.prototype.formatIso = function (d, omitTime) {\n var dateEnv = this.dateEnv;\n return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime });\n };\n // Sizing\n // -----------------------------------------------------------------------------------------------------------------\n Calendar.prototype.windowResize = function (ev) {\n if (!this.isHandlingWindowResize &&\n this.component && // why?\n ev.target === window // not a jqui resize event\n ) {\n this.isHandlingWindowResize = true;\n this.updateSize();\n this.publiclyTrigger('windowResize', [this.view]);\n this.isHandlingWindowResize = false;\n }\n };\n Calendar.prototype.updateSize = function () {\n if (this.component) { // when?\n this.component.updateSize(true);\n }\n };\n // Component Registration\n // -----------------------------------------------------------------------------------------------------------------\n Calendar.prototype.registerInteractiveComponent = function (component, settingsInput) {\n var settings = parseInteractionSettings(component, settingsInput);\n var DEFAULT_INTERACTIONS = [\n EventClicking,\n EventHovering\n ];\n var interactionClasses = DEFAULT_INTERACTIONS.concat(this.pluginSystem.hooks.componentInteractions);\n var interactions = interactionClasses.map(function (interactionClass) {\n return new interactionClass(settings);\n });\n this.interactionsStore[component.uid] = interactions;\n interactionSettingsStore[component.uid] = settings;\n };\n Calendar.prototype.unregisterInteractiveComponent = function (component) {\n for (var _i = 0, _a = this.interactionsStore[component.uid]; _i < _a.length; _i++) {\n var listener = _a[_i];\n listener.destroy();\n }\n delete this.interactionsStore[component.uid];\n delete interactionSettingsStore[component.uid];\n };\n // Date Selection / Event Selection / DayClick\n // -----------------------------------------------------------------------------------------------------------------\n // this public method receives start/end dates in any format, with any timezone\n // NOTE: args were changed from v3\n Calendar.prototype.select = function (dateOrObj, endDate) {\n var selectionInput;\n if (endDate == null) {\n if (dateOrObj.start != null) {\n selectionInput = dateOrObj;\n }\n else {\n selectionInput = {\n start: dateOrObj,\n end: null\n };\n }\n }\n else {\n selectionInput = {\n start: dateOrObj,\n end: endDate\n };\n }\n var selection = parseDateSpan(selectionInput, this.dateEnv, createDuration({ days: 1 }) // TODO: cache this?\n );\n if (selection) { // throw parse error otherwise?\n this.dispatch({ type: 'SELECT_DATES', selection: selection });\n this.triggerDateSelect(selection);\n }\n };\n // public method\n Calendar.prototype.unselect = function (pev) {\n if (this.state.dateSelection) {\n this.dispatch({ type: 'UNSELECT_DATES' });\n this.triggerDateUnselect(pev);\n }\n };\n Calendar.prototype.triggerDateSelect = function (selection, pev) {\n var arg = this.buildDateSpanApi(selection);\n arg.jsEvent = pev ? pev.origEvent : null;\n arg.view = this.view;\n this.publiclyTrigger('select', [arg]);\n };\n Calendar.prototype.triggerDateUnselect = function (pev) {\n this.publiclyTrigger('unselect', [\n {\n jsEvent: pev ? pev.origEvent : null,\n view: this.view\n }\n ]);\n };\n // TODO: receive pev?\n Calendar.prototype.triggerDateClick = function (dateSpan, dayEl, view, ev) {\n var arg = this.buildDatePointApi(dateSpan);\n arg.dayEl = dayEl;\n arg.jsEvent = ev;\n arg.view = view;\n this.publiclyTrigger('dateClick', [arg]);\n };\n Calendar.prototype.buildDatePointApi = function (dateSpan) {\n var props = {};\n for (var _i = 0, _a = this.pluginSystem.hooks.datePointTransforms; _i < _a.length; _i++) {\n var transform = _a[_i];\n __assign(props, transform(dateSpan, this));\n }\n __assign(props, buildDatePointApi(dateSpan, this.dateEnv));\n return props;\n };\n Calendar.prototype.buildDateSpanApi = function (dateSpan) {\n var props = {};\n for (var _i = 0, _a = this.pluginSystem.hooks.dateSpanTransforms; _i < _a.length; _i++) {\n var transform = _a[_i];\n __assign(props, transform(dateSpan, this));\n }\n __assign(props, buildDateSpanApi(dateSpan, this.dateEnv));\n return props;\n };\n // Date Utils\n // -----------------------------------------------------------------------------------------------------------------\n // Returns a DateMarker for the current date, as defined by the client's computer or from the `now` option\n Calendar.prototype.getNow = function () {\n var now = this.opt('now');\n if (typeof now === 'function') {\n now = now();\n }\n if (now == null) {\n return this.dateEnv.createNowMarker();\n }\n return this.dateEnv.createMarker(now);\n };\n // Event-Date Utilities\n // -----------------------------------------------------------------------------------------------------------------\n // Given an event's allDay status and start date, return what its fallback end date should be.\n // TODO: rename to computeDefaultEventEnd\n Calendar.prototype.getDefaultEventEnd = function (allDay, marker) {\n var end = marker;\n if (allDay) {\n end = startOfDay(end);\n end = this.dateEnv.add(end, this.defaultAllDayEventDuration);\n }\n else {\n end = this.dateEnv.add(end, this.defaultTimedEventDuration);\n }\n return end;\n };\n // Public Events API\n // -----------------------------------------------------------------------------------------------------------------\n Calendar.prototype.addEvent = function (eventInput, sourceInput) {\n if (eventInput instanceof EventApi) {\n var def = eventInput._def;\n var instance = eventInput._instance;\n // not already present? don't want to add an old snapshot\n if (!this.state.eventStore.defs[def.defId]) {\n this.dispatch({\n type: 'ADD_EVENTS',\n eventStore: eventTupleToStore({ def: def, instance: instance }) // TODO: better util for two args?\n });\n }\n return eventInput;\n }\n var sourceId;\n if (sourceInput instanceof EventSourceApi) {\n sourceId = sourceInput.internalEventSource.sourceId;\n }\n else if (sourceInput != null) {\n var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function\n if (!sourceApi) {\n console.warn('Could not find an event source with ID \"' + sourceInput + '\"'); // TODO: test\n return null;\n }\n else {\n sourceId = sourceApi.internalEventSource.sourceId;\n }\n }\n var tuple = parseEvent(eventInput, sourceId, this);\n if (tuple) {\n this.dispatch({\n type: 'ADD_EVENTS',\n eventStore: eventTupleToStore(tuple)\n });\n return new EventApi(this, tuple.def, tuple.def.recurringDef ? null : tuple.instance);\n }\n return null;\n };\n // TODO: optimize\n Calendar.prototype.getEventById = function (id) {\n var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;\n id = String(id);\n for (var defId in defs) {\n var def = defs[defId];\n if (def.publicId === id) {\n if (def.recurringDef) {\n return new EventApi(this, def, null);\n }\n else {\n for (var instanceId in instances) {\n var instance = instances[instanceId];\n if (instance.defId === def.defId) {\n return new EventApi(this, def, instance);\n }\n }\n }\n }\n }\n return null;\n };\n Calendar.prototype.getEvents = function () {\n var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;\n var eventApis = [];\n for (var id in instances) {\n var instance = instances[id];\n var def = defs[instance.defId];\n eventApis.push(new EventApi(this, def, instance));\n }\n return eventApis;\n };\n Calendar.prototype.removeAllEvents = function () {\n this.dispatch({ type: 'REMOVE_ALL_EVENTS' });\n };\n Calendar.prototype.rerenderEvents = function () {\n this.dispatch({ type: 'RESET_EVENTS' });\n };\n // Public Event Sources API\n // -----------------------------------------------------------------------------------------------------------------\n Calendar.prototype.getEventSources = function () {\n var sourceHash = this.state.eventSources;\n var sourceApis = [];\n for (var internalId in sourceHash) {\n sourceApis.push(new EventSourceApi(this, sourceHash[internalId]));\n }\n return sourceApis;\n };\n Calendar.prototype.getEventSourceById = function (id) {\n var sourceHash = this.state.eventSources;\n id = String(id);\n for (var sourceId in sourceHash) {\n if (sourceHash[sourceId].publicId === id) {\n return new EventSourceApi(this, sourceHash[sourceId]);\n }\n }\n return null;\n };\n Calendar.prototype.addEventSource = function (sourceInput) {\n if (sourceInput instanceof EventSourceApi) {\n // not already present? don't want to add an old snapshot\n if (!this.state.eventSources[sourceInput.internalEventSource.sourceId]) {\n this.dispatch({\n type: 'ADD_EVENT_SOURCES',\n sources: [sourceInput.internalEventSource]\n });\n }\n return sourceInput;\n }\n var eventSource = parseEventSource(sourceInput, this);\n if (eventSource) { // TODO: error otherwise?\n this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] });\n return new EventSourceApi(this, eventSource);\n }\n return null;\n };\n Calendar.prototype.removeAllEventSources = function () {\n this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' });\n };\n Calendar.prototype.refetchEvents = function () {\n this.dispatch({ type: 'FETCH_EVENT_SOURCES' });\n };\n return Calendar;\n }());\n EmitterMixin.mixInto(Calendar);\n // for memoizers\n // -----------------------------------------------------------------------------------------------------------------\n function buildDateEnv(locale, timeZone, namedTimeZoneImpl, firstDay, weekNumberCalculation, weekLabel, cmdFormatter) {\n return new DateEnv({\n calendarSystem: 'gregory',\n timeZone: timeZone,\n namedTimeZoneImpl: namedTimeZoneImpl,\n locale: locale,\n weekNumberCalculation: weekNumberCalculation,\n firstDay: firstDay,\n weekLabel: weekLabel,\n cmdFormatter: cmdFormatter\n });\n }\n function buildTheme(calendarOptions) {\n var themeClass = this.pluginSystem.hooks.themeClasses[calendarOptions.themeSystem] || StandardTheme;\n return new themeClass(calendarOptions);\n }\n function buildDelayedRerender(wait) {\n var func = this.tryRerender.bind(this);\n if (wait != null) {\n func = debounce(func, wait);\n }\n return func;\n }\n function buildEventUiBySource(eventSources) {\n return mapHash(eventSources, function (eventSource) {\n return eventSource.ui;\n });\n }\n function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) {\n var eventUiBases = { '': eventUiSingleBase };\n for (var defId in eventDefs) {\n var def = eventDefs[defId];\n if (def.sourceId && eventUiBySource[def.sourceId]) {\n eventUiBases[defId] = eventUiBySource[def.sourceId];\n }\n }\n return eventUiBases;\n }\n\n var View = /** @class */ (function (_super) {\n __extends(View, _super);\n function View(context, viewSpec, dateProfileGenerator, parentEl) {\n var _this = _super.call(this, context, createElement('div', { className: 'fc-view fc-' + viewSpec.type + '-view' }), true // isView (HACK)\n ) || this;\n _this.renderDatesMem = memoizeRendering(_this.renderDatesWrap, _this.unrenderDatesWrap);\n _this.renderBusinessHoursMem = memoizeRendering(_this.renderBusinessHours, _this.unrenderBusinessHours, [_this.renderDatesMem]);\n _this.renderDateSelectionMem = memoizeRendering(_this.renderDateSelectionWrap, _this.unrenderDateSelectionWrap, [_this.renderDatesMem]);\n _this.renderEventsMem = memoizeRendering(_this.renderEvents, _this.unrenderEvents, [_this.renderDatesMem]);\n _this.renderEventSelectionMem = memoizeRendering(_this.renderEventSelectionWrap, _this.unrenderEventSelectionWrap, [_this.renderEventsMem]);\n _this.renderEventDragMem = memoizeRendering(_this.renderEventDragWrap, _this.unrenderEventDragWrap, [_this.renderDatesMem]);\n _this.renderEventResizeMem = memoizeRendering(_this.renderEventResizeWrap, _this.unrenderEventResizeWrap, [_this.renderDatesMem]);\n _this.viewSpec = viewSpec;\n _this.dateProfileGenerator = dateProfileGenerator;\n _this.type = viewSpec.type;\n _this.eventOrderSpecs = parseFieldSpecs(_this.opt('eventOrder'));\n _this.nextDayThreshold = createDuration(_this.opt('nextDayThreshold'));\n parentEl.appendChild(_this.el);\n _this.initialize();\n return _this;\n }\n View.prototype.initialize = function () {\n };\n Object.defineProperty(View.prototype, \"activeStart\", {\n // Date Setting/Unsetting\n // -----------------------------------------------------------------------------------------------------------------\n get: function () {\n return this.dateEnv.toDate(this.props.dateProfile.activeRange.start);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(View.prototype, \"activeEnd\", {\n get: function () {\n return this.dateEnv.toDate(this.props.dateProfile.activeRange.end);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(View.prototype, \"currentStart\", {\n get: function () {\n return this.dateEnv.toDate(this.props.dateProfile.currentRange.start);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(View.prototype, \"currentEnd\", {\n get: function () {\n return this.dateEnv.toDate(this.props.dateProfile.currentRange.end);\n },\n enumerable: true,\n configurable: true\n });\n // General Rendering\n // -----------------------------------------------------------------------------------------------------------------\n View.prototype.render = function (props) {\n this.renderDatesMem(props.dateProfile);\n this.renderBusinessHoursMem(props.businessHours);\n this.renderDateSelectionMem(props.dateSelection);\n this.renderEventsMem(props.eventStore);\n this.renderEventSelectionMem(props.eventSelection);\n this.renderEventDragMem(props.eventDrag);\n this.renderEventResizeMem(props.eventResize);\n };\n View.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n this.renderDatesMem.unrender(); // should unrender everything else\n };\n // Sizing\n // -----------------------------------------------------------------------------------------------------------------\n View.prototype.updateSize = function (isResize, viewHeight, isAuto) {\n var calendar = this.calendar;\n if (isResize || calendar.isViewUpdated || calendar.isDatesUpdated || calendar.isEventsUpdated) {\n // sort of the catch-all sizing\n // anything that might cause dimension changes\n this.updateBaseSize(isResize, viewHeight, isAuto);\n }\n };\n View.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {\n };\n // Date Rendering\n // -----------------------------------------------------------------------------------------------------------------\n View.prototype.renderDatesWrap = function (dateProfile) {\n this.renderDates(dateProfile);\n this.addScroll({ isDateInit: true });\n this.startNowIndicator(dateProfile); // shouldn't render yet because updateSize will be called soon\n };\n View.prototype.unrenderDatesWrap = function () {\n this.stopNowIndicator();\n this.unrenderDates();\n };\n View.prototype.renderDates = function (dateProfile) { };\n View.prototype.unrenderDates = function () { };\n // Business Hours\n // -----------------------------------------------------------------------------------------------------------------\n View.prototype.renderBusinessHours = function (businessHours) { };\n View.prototype.unrenderBusinessHours = function () { };\n // Date Selection\n // -----------------------------------------------------------------------------------------------------------------\n View.prototype.renderDateSelectionWrap = function (selection) {\n if (selection) {\n this.renderDateSelection(selection);\n }\n };\n View.prototype.unrenderDateSelectionWrap = function (selection) {\n if (selection) {\n this.unrenderDateSelection(selection);\n }\n };\n View.prototype.renderDateSelection = function (selection) { };\n View.prototype.unrenderDateSelection = function (selection) { };\n // Event Rendering\n // -----------------------------------------------------------------------------------------------------------------\n View.prototype.renderEvents = function (eventStore) { };\n View.prototype.unrenderEvents = function () { };\n // util for subclasses\n View.prototype.sliceEvents = function (eventStore, allDay) {\n var props = this.props;\n return sliceEventStore(eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? this.nextDayThreshold : null).fg;\n };\n // Event Selection\n // -----------------------------------------------------------------------------------------------------------------\n View.prototype.renderEventSelectionWrap = function (instanceId) {\n if (instanceId) {\n this.renderEventSelection(instanceId);\n }\n };\n View.prototype.unrenderEventSelectionWrap = function (instanceId) {\n if (instanceId) {\n this.unrenderEventSelection(instanceId);\n }\n };\n View.prototype.renderEventSelection = function (instanceId) { };\n View.prototype.unrenderEventSelection = function (instanceId) { };\n // Event Drag\n // -----------------------------------------------------------------------------------------------------------------\n View.prototype.renderEventDragWrap = function (state) {\n if (state) {\n this.renderEventDrag(state);\n }\n };\n View.prototype.unrenderEventDragWrap = function (state) {\n if (state) {\n this.unrenderEventDrag(state);\n }\n };\n View.prototype.renderEventDrag = function (state) { };\n View.prototype.unrenderEventDrag = function (state) { };\n // Event Resize\n // -----------------------------------------------------------------------------------------------------------------\n View.prototype.renderEventResizeWrap = function (state) {\n if (state) {\n this.renderEventResize(state);\n }\n };\n View.prototype.unrenderEventResizeWrap = function (state) {\n if (state) {\n this.unrenderEventResize(state);\n }\n };\n View.prototype.renderEventResize = function (state) { };\n View.prototype.unrenderEventResize = function (state) { };\n /* Now Indicator\n ------------------------------------------------------------------------------------------------------------------*/\n // Immediately render the current time indicator and begins re-rendering it at an interval,\n // which is defined by this.getNowIndicatorUnit().\n // TODO: somehow do this for the current whole day's background too\n View.prototype.startNowIndicator = function (dateProfile) {\n var _this = this;\n var dateEnv = this.dateEnv;\n var unit;\n var update;\n var delay; // ms wait value\n if (this.opt('nowIndicator')) {\n unit = this.getNowIndicatorUnit(dateProfile);\n if (unit) {\n update = this.updateNowIndicator.bind(this);\n this.initialNowDate = this.calendar.getNow();\n this.initialNowQueriedMs = new Date().valueOf();\n // wait until the beginning of the next interval\n delay = dateEnv.add(dateEnv.startOf(this.initialNowDate, unit), createDuration(1, unit)).valueOf() - this.initialNowDate.valueOf();\n // TODO: maybe always use setTimeout, waiting until start of next unit\n this.nowIndicatorTimeoutID = setTimeout(function () {\n _this.nowIndicatorTimeoutID = null;\n update();\n if (unit === 'second') {\n delay = 1000; // every second\n }\n else {\n delay = 1000 * 60; // otherwise, every minute\n }\n _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval\n }, delay);\n }\n // rendering will be initiated in updateSize\n }\n };\n // rerenders the now indicator, computing the new current time from the amount of time that has passed\n // since the initial getNow call.\n View.prototype.updateNowIndicator = function () {\n if (this.props.dateProfile && // a way to determine if dates were rendered yet\n this.initialNowDate // activated before?\n ) {\n this.unrenderNowIndicator(); // won't unrender if unnecessary\n this.renderNowIndicator(addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs));\n this.isNowIndicatorRendered = true;\n }\n };\n // Immediately unrenders the view's current time indicator and stops any re-rendering timers.\n // Won't cause side effects if indicator isn't rendered.\n View.prototype.stopNowIndicator = function () {\n if (this.isNowIndicatorRendered) {\n if (this.nowIndicatorTimeoutID) {\n clearTimeout(this.nowIndicatorTimeoutID);\n this.nowIndicatorTimeoutID = null;\n }\n if (this.nowIndicatorIntervalID) {\n clearInterval(this.nowIndicatorIntervalID);\n this.nowIndicatorIntervalID = null;\n }\n this.unrenderNowIndicator();\n this.isNowIndicatorRendered = false;\n }\n };\n View.prototype.getNowIndicatorUnit = function (dateProfile) {\n // subclasses should implement\n };\n // Renders a current time indicator at the given datetime\n View.prototype.renderNowIndicator = function (date) {\n // SUBCLASSES MUST PASS TO CHILDREN!\n };\n // Undoes the rendering actions from renderNowIndicator\n View.prototype.unrenderNowIndicator = function () {\n // SUBCLASSES MUST PASS TO CHILDREN!\n };\n /* Scroller\n ------------------------------------------------------------------------------------------------------------------*/\n View.prototype.addScroll = function (scroll) {\n var queuedScroll = this.queuedScroll || (this.queuedScroll = {});\n __assign(queuedScroll, scroll);\n };\n View.prototype.popScroll = function (isResize) {\n this.applyQueuedScroll(isResize);\n this.queuedScroll = null;\n };\n View.prototype.applyQueuedScroll = function (isResize) {\n this.applyScroll(this.queuedScroll || {}, isResize);\n };\n View.prototype.queryScroll = function () {\n var scroll = {};\n if (this.props.dateProfile) { // dates rendered yet?\n __assign(scroll, this.queryDateScroll());\n }\n return scroll;\n };\n View.prototype.applyScroll = function (scroll, isResize) {\n if (scroll.isDateInit) {\n delete scroll.isDateInit;\n if (this.props.dateProfile) { // dates rendered yet?\n __assign(scroll, this.computeInitialDateScroll());\n }\n }\n if (this.props.dateProfile) { // dates rendered yet?\n this.applyDateScroll(scroll);\n }\n };\n View.prototype.computeInitialDateScroll = function () {\n return {}; // subclasses must implement\n };\n View.prototype.queryDateScroll = function () {\n return {}; // subclasses must implement\n };\n View.prototype.applyDateScroll = function (scroll) {\n // subclasses must implement\n };\n return View;\n }(DateComponent));\n EmitterMixin.mixInto(View);\n View.prototype.usesMinMaxTime = false;\n View.prototype.dateProfileGeneratorClass = DateProfileGenerator;\n\n var FgEventRenderer = /** @class */ (function () {\n function FgEventRenderer(context) {\n this.segs = [];\n this.isSizeDirty = false;\n this.context = context;\n }\n FgEventRenderer.prototype.renderSegs = function (segs, mirrorInfo) {\n this.rangeUpdated(); // called too frequently :(\n // render an `.el` on each seg\n // returns a subset of the segs. segs that were actually rendered\n segs = this.renderSegEls(segs, mirrorInfo);\n this.segs = segs;\n this.attachSegs(segs, mirrorInfo);\n this.isSizeDirty = true;\n this.context.view.triggerRenderedSegs(this.segs, Boolean(mirrorInfo));\n };\n FgEventRenderer.prototype.unrender = function (_segs, mirrorInfo) {\n this.context.view.triggerWillRemoveSegs(this.segs, Boolean(mirrorInfo));\n this.detachSegs(this.segs);\n this.segs = [];\n };\n // Updates values that rely on options and also relate to range\n FgEventRenderer.prototype.rangeUpdated = function () {\n var options = this.context.options;\n var displayEventTime;\n var displayEventEnd;\n this.eventTimeFormat = createFormatter(options.eventTimeFormat || this.computeEventTimeFormat(), options.defaultRangeSeparator);\n displayEventTime = options.displayEventTime;\n if (displayEventTime == null) {\n displayEventTime = this.computeDisplayEventTime(); // might be based off of range\n }\n displayEventEnd = options.displayEventEnd;\n if (displayEventEnd == null) {\n displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range\n }\n this.displayEventTime = displayEventTime;\n this.displayEventEnd = displayEventEnd;\n };\n // Renders and assigns an `el` property for each foreground event segment.\n // Only returns segments that successfully rendered.\n FgEventRenderer.prototype.renderSegEls = function (segs, mirrorInfo) {\n var html = '';\n var i;\n if (segs.length) { // don't build an empty html string\n // build a large concatenation of event segment HTML\n for (i = 0; i < segs.length; i++) {\n html += this.renderSegHtml(segs[i], mirrorInfo);\n }\n // Grab individual elements from the combined HTML string. Use each as the default rendering.\n // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.\n htmlToElements(html).forEach(function (el, i) {\n var seg = segs[i];\n if (el) {\n seg.el = el;\n }\n });\n segs = filterSegsViaEls(this.context.view, segs, Boolean(mirrorInfo));\n }\n return segs;\n };\n // Generic utility for generating the HTML classNames for an event segment's element\n FgEventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable, mirrorInfo) {\n var classes = [\n 'fc-event',\n seg.isStart ? 'fc-start' : 'fc-not-start',\n seg.isEnd ? 'fc-end' : 'fc-not-end'\n ].concat(seg.eventRange.ui.classNames);\n if (isDraggable) {\n classes.push('fc-draggable');\n }\n if (isResizable) {\n classes.push('fc-resizable');\n }\n if (mirrorInfo) {\n classes.push('fc-mirror');\n if (mirrorInfo.isDragging) {\n classes.push('fc-dragging');\n }\n if (mirrorInfo.isResizing) {\n classes.push('fc-resizing');\n }\n }\n return classes;\n };\n // Compute the text that should be displayed on an event's element.\n // `range` can be the Event object itself, or something range-like, with at least a `start`.\n // If event times are disabled, or the event has no time, will return a blank string.\n // If not specified, formatter will default to the eventTimeFormat setting,\n // and displayEnd will default to the displayEventEnd setting.\n FgEventRenderer.prototype.getTimeText = function (eventRange, formatter, displayEnd) {\n var def = eventRange.def, instance = eventRange.instance;\n return this._getTimeText(instance.range.start, def.hasEnd ? instance.range.end : null, def.allDay, formatter, displayEnd, instance.forcedStartTzo, instance.forcedEndTzo);\n };\n FgEventRenderer.prototype._getTimeText = function (start, end, allDay, formatter, displayEnd, forcedStartTzo, forcedEndTzo) {\n var dateEnv = this.context.dateEnv;\n if (formatter == null) {\n formatter = this.eventTimeFormat;\n }\n if (displayEnd == null) {\n displayEnd = this.displayEventEnd;\n }\n if (this.displayEventTime && !allDay) {\n if (displayEnd && end) {\n return dateEnv.formatRange(start, end, formatter, {\n forcedStartTzo: forcedStartTzo,\n forcedEndTzo: forcedEndTzo\n });\n }\n else {\n return dateEnv.format(start, formatter, {\n forcedTzo: forcedStartTzo\n });\n }\n }\n return '';\n };\n FgEventRenderer.prototype.computeEventTimeFormat = function () {\n return {\n hour: 'numeric',\n minute: '2-digit',\n omitZeroMinute: true\n };\n };\n FgEventRenderer.prototype.computeDisplayEventTime = function () {\n return true;\n };\n FgEventRenderer.prototype.computeDisplayEventEnd = function () {\n return true;\n };\n // Utility for generating event skin-related CSS properties\n FgEventRenderer.prototype.getSkinCss = function (ui) {\n return {\n 'background-color': ui.backgroundColor,\n 'border-color': ui.borderColor,\n color: ui.textColor\n };\n };\n FgEventRenderer.prototype.sortEventSegs = function (segs) {\n var specs = this.context.view.eventOrderSpecs;\n var objs = segs.map(buildSegCompareObj);\n objs.sort(function (obj0, obj1) {\n return compareByFieldSpecs(obj0, obj1, specs);\n });\n return objs.map(function (c) {\n return c._seg;\n });\n };\n FgEventRenderer.prototype.computeSizes = function (force) {\n if (force || this.isSizeDirty) {\n this.computeSegSizes(this.segs);\n }\n };\n FgEventRenderer.prototype.assignSizes = function (force) {\n if (force || this.isSizeDirty) {\n this.assignSegSizes(this.segs);\n this.isSizeDirty = false;\n }\n };\n FgEventRenderer.prototype.computeSegSizes = function (segs) {\n };\n FgEventRenderer.prototype.assignSegSizes = function (segs) {\n };\n // Manipulation on rendered segs\n FgEventRenderer.prototype.hideByHash = function (hash) {\n if (hash) {\n for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {\n var seg = _a[_i];\n if (hash[seg.eventRange.instance.instanceId]) {\n seg.el.style.visibility = 'hidden';\n }\n }\n }\n };\n FgEventRenderer.prototype.showByHash = function (hash) {\n if (hash) {\n for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {\n var seg = _a[_i];\n if (hash[seg.eventRange.instance.instanceId]) {\n seg.el.style.visibility = '';\n }\n }\n }\n };\n FgEventRenderer.prototype.selectByInstanceId = function (instanceId) {\n if (instanceId) {\n for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {\n var seg = _a[_i];\n var eventInstance = seg.eventRange.instance;\n if (eventInstance && eventInstance.instanceId === instanceId &&\n seg.el // necessary?\n ) {\n seg.el.classList.add('fc-selected');\n }\n }\n }\n };\n FgEventRenderer.prototype.unselectByInstanceId = function (instanceId) {\n if (instanceId) {\n for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {\n var seg = _a[_i];\n if (seg.el) { // necessary?\n seg.el.classList.remove('fc-selected');\n }\n }\n }\n };\n return FgEventRenderer;\n }());\n // returns a object with all primitive props that can be compared\n function buildSegCompareObj(seg) {\n var eventDef = seg.eventRange.def;\n var range = seg.eventRange.instance.range;\n var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events\n var end = range.end ? range.end.valueOf() : 0; // \"\n return __assign({}, eventDef.extendedProps, eventDef, { id: eventDef.publicId, start: start,\n end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg // for later retrieval\n });\n }\n\n var FillRenderer = /** @class */ (function () {\n function FillRenderer(context) {\n this.fillSegTag = 'div';\n this.dirtySizeFlags = {};\n this.context = context;\n this.containerElsByType = {};\n this.segsByType = {};\n }\n FillRenderer.prototype.getSegsByType = function (type) {\n return this.segsByType[type] || [];\n };\n FillRenderer.prototype.renderSegs = function (type, segs) {\n var _a;\n var renderedSegs = this.renderSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs\n var containerEls = this.attachSegs(type, renderedSegs);\n if (containerEls) {\n (_a = (this.containerElsByType[type] || (this.containerElsByType[type] = []))).push.apply(_a, containerEls);\n }\n this.segsByType[type] = renderedSegs;\n if (type === 'bgEvent') {\n this.context.view.triggerRenderedSegs(renderedSegs, false); // isMirror=false\n }\n this.dirtySizeFlags[type] = true;\n };\n // Unrenders a specific type of fill that is currently rendered on the grid\n FillRenderer.prototype.unrender = function (type) {\n var segs = this.segsByType[type];\n if (segs) {\n if (type === 'bgEvent') {\n this.context.view.triggerWillRemoveSegs(segs, false); // isMirror=false\n }\n this.detachSegs(type, segs);\n }\n };\n // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.\n // Only returns segments that successfully rendered.\n FillRenderer.prototype.renderSegEls = function (type, segs) {\n var _this = this;\n var html = '';\n var i;\n if (segs.length) {\n // build a large concatenation of segment HTML\n for (i = 0; i < segs.length; i++) {\n html += this.renderSegHtml(type, segs[i]);\n }\n // Grab individual elements from the combined HTML string. Use each as the default rendering.\n // Then, compute the 'el' for each segment.\n htmlToElements(html).forEach(function (el, i) {\n var seg = segs[i];\n if (el) {\n seg.el = el;\n }\n });\n if (type === 'bgEvent') {\n segs = filterSegsViaEls(this.context.view, segs, false // isMirror. background events can never be mirror elements\n );\n }\n // correct element type? (would be bad if a non-TD were inserted into a table for example)\n segs = segs.filter(function (seg) {\n return elementMatches(seg.el, _this.fillSegTag);\n });\n }\n return segs;\n };\n // Builds the HTML needed for one fill segment. Generic enough to work with different types.\n FillRenderer.prototype.renderSegHtml = function (type, seg) {\n var css = null;\n var classNames = [];\n if (type !== 'highlight' && type !== 'businessHours') {\n css = {\n 'background-color': seg.eventRange.ui.backgroundColor\n };\n }\n if (type !== 'highlight') {\n classNames = classNames.concat(seg.eventRange.ui.classNames);\n }\n if (type === 'businessHours') {\n classNames.push('fc-bgevent');\n }\n else {\n classNames.push('fc-' + type.toLowerCase());\n }\n return '<' + this.fillSegTag +\n (classNames.length ? ' class=\"' + classNames.join(' ') + '\"' : '') +\n (css ? ' style=\"' + cssToStr(css) + '\"' : '') +\n '>';\n };\n FillRenderer.prototype.detachSegs = function (type, segs) {\n var containerEls = this.containerElsByType[type];\n if (containerEls) {\n containerEls.forEach(removeElement);\n delete this.containerElsByType[type];\n }\n };\n FillRenderer.prototype.computeSizes = function (force) {\n for (var type in this.segsByType) {\n if (force || this.dirtySizeFlags[type]) {\n this.computeSegSizes(this.segsByType[type]);\n }\n }\n };\n FillRenderer.prototype.assignSizes = function (force) {\n for (var type in this.segsByType) {\n if (force || this.dirtySizeFlags[type]) {\n this.assignSegSizes(this.segsByType[type]);\n }\n }\n this.dirtySizeFlags = {};\n };\n FillRenderer.prototype.computeSegSizes = function (segs) {\n };\n FillRenderer.prototype.assignSegSizes = function (segs) {\n };\n return FillRenderer;\n }());\n\n var NamedTimeZoneImpl = /** @class */ (function () {\n function NamedTimeZoneImpl(timeZoneName) {\n this.timeZoneName = timeZoneName;\n }\n return NamedTimeZoneImpl;\n }());\n\n /*\n An abstraction for a dragging interaction originating on an event.\n Does higher-level things than PointerDragger, such as possibly:\n - a \"mirror\" that moves with the pointer\n - a minimum number of pixels or other criteria for a true drag to begin\n\n subclasses must emit:\n - pointerdown\n - dragstart\n - dragmove\n - pointerup\n - dragend\n */\n var ElementDragging = /** @class */ (function () {\n function ElementDragging(el) {\n this.emitter = new EmitterMixin();\n }\n ElementDragging.prototype.destroy = function () {\n };\n ElementDragging.prototype.setMirrorIsVisible = function (bool) {\n // optional if subclass doesn't want to support a mirror\n };\n ElementDragging.prototype.setMirrorNeedsRevert = function (bool) {\n // optional if subclass doesn't want to support a mirror\n };\n ElementDragging.prototype.setAutoScrollEnabled = function (bool) {\n // optional\n };\n return ElementDragging;\n }());\n\n function formatDate(dateInput, settings) {\n if (settings === void 0) { settings = {}; }\n var dateEnv = buildDateEnv$1(settings);\n var formatter = createFormatter(settings);\n var dateMeta = dateEnv.createMarkerMeta(dateInput);\n if (!dateMeta) { // TODO: warning?\n return '';\n }\n return dateEnv.format(dateMeta.marker, formatter, {\n forcedTzo: dateMeta.forcedTzo\n });\n }\n function formatRange(startInput, endInput, settings // mixture of env and formatter settings\n ) {\n var dateEnv = buildDateEnv$1(typeof settings === 'object' && settings ? settings : {}); // pass in if non-null object\n var formatter = createFormatter(settings, globalDefaults.defaultRangeSeparator);\n var startMeta = dateEnv.createMarkerMeta(startInput);\n var endMeta = dateEnv.createMarkerMeta(endInput);\n if (!startMeta || !endMeta) { // TODO: warning?\n return '';\n }\n return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, {\n forcedStartTzo: startMeta.forcedTzo,\n forcedEndTzo: endMeta.forcedTzo,\n isEndExclusive: settings.isEndExclusive\n });\n }\n // TODO: more DRY and optimized\n function buildDateEnv$1(settings) {\n var locale = buildLocale(settings.locale || 'en', parseRawLocales([]).map); // TODO: don't hardcode 'en' everywhere\n // ensure required settings\n settings = __assign({ timeZone: globalDefaults.timeZone, calendarSystem: 'gregory' }, settings, { locale: locale });\n return new DateEnv(settings);\n }\n\n var DRAG_META_PROPS = {\n startTime: createDuration,\n duration: createDuration,\n create: Boolean,\n sourceId: String\n };\n var DRAG_META_DEFAULTS = {\n create: true\n };\n function parseDragMeta(raw) {\n var leftoverProps = {};\n var refined = refineProps(raw, DRAG_META_PROPS, DRAG_META_DEFAULTS, leftoverProps);\n refined.leftoverProps = leftoverProps;\n return refined;\n }\n\n // Computes a default column header formatting string if `colFormat` is not explicitly defined\n function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) {\n // if more than one week row, or if there are a lot of columns with not much space,\n // put just the day numbers will be in each cell\n if (!datesRepDistinctDays || dayCnt > 10) {\n return { weekday: 'short' }; // \"Sat\"\n }\n else if (dayCnt > 1) {\n return { weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }; // \"Sat 11/12\"\n }\n else {\n return { weekday: 'long' }; // \"Saturday\"\n }\n }\n function renderDateCell(dateMarker, dateProfile, datesRepDistinctDays, colCnt, colHeadFormat, context, colspan, otherAttrs) {\n var view = context.view, dateEnv = context.dateEnv, theme = context.theme, options = context.options;\n var isDateValid = rangeContainsMarker(dateProfile.activeRange, dateMarker); // TODO: called too frequently. cache somehow.\n var classNames = [\n 'fc-day-header',\n theme.getClass('widgetHeader')\n ];\n var innerHtml;\n if (typeof options.columnHeaderHtml === 'function') {\n innerHtml = options.columnHeaderHtml(dateEnv.toDate(dateMarker));\n }\n else if (typeof options.columnHeaderText === 'function') {\n innerHtml = htmlEscape(options.columnHeaderText(dateEnv.toDate(dateMarker)));\n }\n else {\n innerHtml = htmlEscape(dateEnv.format(dateMarker, colHeadFormat));\n }\n // if only one row of days, the classNames on the header can represent the specific days beneath\n if (datesRepDistinctDays) {\n classNames = classNames.concat(\n // includes the day-of-week class\n // noThemeHighlight=true (don't highlight the header)\n getDayClasses(dateMarker, dateProfile, context, true));\n }\n else {\n classNames.push('fc-' + DAY_IDS[dateMarker.getUTCDay()]); // only add the day-of-week class\n }\n return '' +\n ' 1 ?\n ' colspan=\"' + colspan + '\"' :\n '') +\n (otherAttrs ?\n ' ' + otherAttrs :\n '') +\n '>' +\n (isDateValid ?\n // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)\n buildGotoAnchorHtml(view, { date: dateMarker, forceOff: !datesRepDistinctDays || colCnt === 1 }, innerHtml) :\n // if not valid, display text, but no link\n innerHtml) +\n '';\n }\n\n var DayHeader = /** @class */ (function (_super) {\n __extends(DayHeader, _super);\n function DayHeader(context, parentEl) {\n var _this = _super.call(this, context) || this;\n parentEl.innerHTML = ''; // because might be nbsp\n parentEl.appendChild(_this.el = htmlToElement('
' +\n '' +\n '' +\n '
' +\n '
'));\n _this.thead = _this.el.querySelector('thead');\n return _this;\n }\n DayHeader.prototype.destroy = function () {\n removeElement(this.el);\n };\n DayHeader.prototype.render = function (props) {\n var dates = props.dates, datesRepDistinctDays = props.datesRepDistinctDays;\n var parts = [];\n if (props.renderIntroHtml) {\n parts.push(props.renderIntroHtml());\n }\n var colHeadFormat = createFormatter(this.opt('columnHeaderFormat') ||\n computeFallbackHeaderFormat(datesRepDistinctDays, dates.length));\n for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {\n var date = dates_1[_i];\n parts.push(renderDateCell(date, props.dateProfile, datesRepDistinctDays, dates.length, colHeadFormat, this.context));\n }\n if (this.isRtl) {\n parts.reverse();\n }\n this.thead.innerHTML = '' + parts.join('') + '';\n };\n return DayHeader;\n }(Component));\n\n var DaySeries = /** @class */ (function () {\n function DaySeries(range, dateProfileGenerator) {\n var date = range.start;\n var end = range.end;\n var indices = [];\n var dates = [];\n var dayIndex = -1;\n while (date < end) { // loop each day from start to end\n if (dateProfileGenerator.isHiddenDay(date)) {\n indices.push(dayIndex + 0.5); // mark that it's between indices\n }\n else {\n dayIndex++;\n indices.push(dayIndex);\n dates.push(date);\n }\n date = addDays(date, 1);\n }\n this.dates = dates;\n this.indices = indices;\n this.cnt = dates.length;\n }\n DaySeries.prototype.sliceRange = function (range) {\n var firstIndex = this.getDateDayIndex(range.start); // inclusive first index\n var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index\n var clippedFirstIndex = Math.max(0, firstIndex);\n var clippedLastIndex = Math.min(this.cnt - 1, lastIndex);\n // deal with in-between indices\n clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell\n clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell\n if (clippedFirstIndex <= clippedLastIndex) {\n return {\n firstIndex: clippedFirstIndex,\n lastIndex: clippedLastIndex,\n isStart: firstIndex === clippedFirstIndex,\n isEnd: lastIndex === clippedLastIndex\n };\n }\n else {\n return null;\n }\n };\n // Given a date, returns its chronolocial cell-index from the first cell of the grid.\n // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.\n // If before the first offset, returns a negative number.\n // If after the last offset, returns an offset past the last cell offset.\n // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.\n DaySeries.prototype.getDateDayIndex = function (date) {\n var indices = this.indices;\n var dayOffset = Math.floor(diffDays(this.dates[0], date));\n if (dayOffset < 0) {\n return indices[0] - 1;\n }\n else if (dayOffset >= indices.length) {\n return indices[indices.length - 1] + 1;\n }\n else {\n return indices[dayOffset];\n }\n };\n return DaySeries;\n }());\n\n var DayTable = /** @class */ (function () {\n function DayTable(daySeries, breakOnWeeks) {\n var dates = daySeries.dates;\n var daysPerRow;\n var firstDay;\n var rowCnt;\n if (breakOnWeeks) {\n // count columns until the day-of-week repeats\n firstDay = dates[0].getUTCDay();\n for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow++) {\n if (dates[daysPerRow].getUTCDay() === firstDay) {\n break;\n }\n }\n rowCnt = Math.ceil(dates.length / daysPerRow);\n }\n else {\n rowCnt = 1;\n daysPerRow = dates.length;\n }\n this.rowCnt = rowCnt;\n this.colCnt = daysPerRow;\n this.daySeries = daySeries;\n this.cells = this.buildCells();\n this.headerDates = this.buildHeaderDates();\n }\n DayTable.prototype.buildCells = function () {\n var rows = [];\n for (var row = 0; row < this.rowCnt; row++) {\n var cells = [];\n for (var col = 0; col < this.colCnt; col++) {\n cells.push(this.buildCell(row, col));\n }\n rows.push(cells);\n }\n return rows;\n };\n DayTable.prototype.buildCell = function (row, col) {\n return {\n date: this.daySeries.dates[row * this.colCnt + col]\n };\n };\n DayTable.prototype.buildHeaderDates = function () {\n var dates = [];\n for (var col = 0; col < this.colCnt; col++) {\n dates.push(this.cells[0][col].date);\n }\n return dates;\n };\n DayTable.prototype.sliceRange = function (range) {\n var colCnt = this.colCnt;\n var seriesSeg = this.daySeries.sliceRange(range);\n var segs = [];\n if (seriesSeg) {\n var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex;\n var index = firstIndex;\n while (index <= lastIndex) {\n var row = Math.floor(index / colCnt);\n var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1);\n segs.push({\n row: row,\n firstCol: index % colCnt,\n lastCol: (nextIndex - 1) % colCnt,\n isStart: seriesSeg.isStart && index === firstIndex,\n isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex\n });\n index = nextIndex;\n }\n }\n return segs;\n };\n return DayTable;\n }());\n\n var Slicer = /** @class */ (function () {\n function Slicer() {\n this.sliceBusinessHours = memoize(this._sliceBusinessHours);\n this.sliceDateSelection = memoize(this._sliceDateSpan);\n this.sliceEventStore = memoize(this._sliceEventStore);\n this.sliceEventDrag = memoize(this._sliceInteraction);\n this.sliceEventResize = memoize(this._sliceInteraction);\n }\n Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, component) {\n var extraArgs = [];\n for (var _i = 4; _i < arguments.length; _i++) {\n extraArgs[_i - 4] = arguments[_i];\n }\n var eventUiBases = props.eventUiBases;\n var eventSegs = this.sliceEventStore.apply(this, [props.eventStore, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs));\n return {\n dateSelectionSegs: this.sliceDateSelection.apply(this, [props.dateSelection, eventUiBases, component].concat(extraArgs)),\n businessHourSegs: this.sliceBusinessHours.apply(this, [props.businessHours, dateProfile, nextDayThreshold, component].concat(extraArgs)),\n fgEventSegs: eventSegs.fg,\n bgEventSegs: eventSegs.bg,\n eventDrag: this.sliceEventDrag.apply(this, [props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),\n eventResize: this.sliceEventResize.apply(this, [props.eventResize, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),\n eventSelection: props.eventSelection\n }; // TODO: give interactionSegs?\n };\n Slicer.prototype.sliceNowDate = function (// does not memoize\n date, component) {\n var extraArgs = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n extraArgs[_i - 2] = arguments[_i];\n }\n return this._sliceDateSpan.apply(this, [{ range: { start: date, end: addMs(date, 1) }, allDay: false },\n {},\n component].concat(extraArgs));\n };\n Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, component) {\n var extraArgs = [];\n for (var _i = 4; _i < arguments.length; _i++) {\n extraArgs[_i - 4] = arguments[_i];\n }\n if (!businessHours) {\n return [];\n }\n return this._sliceEventStore.apply(this, [expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), component.calendar),\n {},\n dateProfile,\n nextDayThreshold,\n component].concat(extraArgs)).bg;\n };\n Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold, component) {\n var extraArgs = [];\n for (var _i = 5; _i < arguments.length; _i++) {\n extraArgs[_i - 5] = arguments[_i];\n }\n if (eventStore) {\n var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);\n return {\n bg: this.sliceEventRanges(rangeRes.bg, component, extraArgs),\n fg: this.sliceEventRanges(rangeRes.fg, component, extraArgs)\n };\n }\n else {\n return { bg: [], fg: [] };\n }\n };\n Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold, component) {\n var extraArgs = [];\n for (var _i = 5; _i < arguments.length; _i++) {\n extraArgs[_i - 5] = arguments[_i];\n }\n if (!interaction) {\n return null;\n }\n var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);\n return {\n segs: this.sliceEventRanges(rangeRes.fg, component, extraArgs),\n affectedInstances: interaction.affectedEvents.instances,\n isEvent: interaction.isEvent,\n sourceSeg: interaction.origSeg\n };\n };\n Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, component) {\n var extraArgs = [];\n for (var _i = 3; _i < arguments.length; _i++) {\n extraArgs[_i - 3] = arguments[_i];\n }\n if (!dateSpan) {\n return [];\n }\n var eventRange = fabricateEventRange(dateSpan, eventUiBases, component.calendar);\n var segs = this.sliceRange.apply(this, [dateSpan.range].concat(extraArgs));\n for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) {\n var seg = segs_1[_a];\n seg.component = component;\n seg.eventRange = eventRange;\n }\n return segs;\n };\n /*\n \"complete\" seg means it has component and eventRange\n */\n Slicer.prototype.sliceEventRanges = function (eventRanges, component, // TODO: kill\n extraArgs) {\n var segs = [];\n for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {\n var eventRange = eventRanges_1[_i];\n segs.push.apply(segs, this.sliceEventRange(eventRange, component, extraArgs));\n }\n return segs;\n };\n /*\n \"complete\" seg means it has component and eventRange\n */\n Slicer.prototype.sliceEventRange = function (eventRange, component, // TODO: kill\n extraArgs) {\n var segs = this.sliceRange.apply(this, [eventRange.range].concat(extraArgs));\n for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {\n var seg = segs_2[_i];\n seg.component = component;\n seg.eventRange = eventRange;\n seg.isStart = eventRange.isStart && seg.isStart;\n seg.isEnd = eventRange.isEnd && seg.isEnd;\n }\n return segs;\n };\n return Slicer;\n }());\n /*\n for incorporating minTime/maxTime if appropriate\n TODO: should be part of DateProfile!\n TimelineDateProfile already does this btw\n */\n function computeActiveRange(dateProfile, isComponentAllDay) {\n var range = dateProfile.activeRange;\n if (isComponentAllDay) {\n return range;\n }\n return {\n start: addMs(range.start, dateProfile.minTime.milliseconds),\n end: addMs(range.end, dateProfile.maxTime.milliseconds - 864e5) // 864e5 = ms in a day\n };\n }\n\n // exports\n // --------------------------------------------------------------------------------------------------\n var version = '4.0.2';\n\n exports.Calendar = Calendar;\n exports.Component = Component;\n exports.DateComponent = DateComponent;\n exports.DateEnv = DateEnv;\n exports.DateProfileGenerator = DateProfileGenerator;\n exports.DayHeader = DayHeader;\n exports.DaySeries = DaySeries;\n exports.DayTable = DayTable;\n exports.ElementDragging = ElementDragging;\n exports.ElementScrollController = ElementScrollController;\n exports.EmitterMixin = EmitterMixin;\n exports.EventApi = EventApi;\n exports.FgEventRenderer = FgEventRenderer;\n exports.FillRenderer = FillRenderer;\n exports.Interaction = Interaction;\n exports.Mixin = Mixin;\n exports.NamedTimeZoneImpl = NamedTimeZoneImpl;\n exports.PositionCache = PositionCache;\n exports.ScrollComponent = ScrollComponent;\n exports.ScrollController = ScrollController;\n exports.Slicer = Slicer;\n exports.Splitter = Splitter;\n exports.Theme = Theme;\n exports.View = View;\n exports.WindowScrollController = WindowScrollController;\n exports.addDays = addDays;\n exports.addDurations = addDurations;\n exports.addMs = addMs;\n exports.addWeeks = addWeeks;\n exports.allowContextMenu = allowContextMenu;\n exports.allowSelection = allowSelection;\n exports.appendToElement = appendToElement;\n exports.applyAll = applyAll;\n exports.applyMutationToEventStore = applyMutationToEventStore;\n exports.applyStyle = applyStyle;\n exports.applyStyleProp = applyStyleProp;\n exports.asRoughMinutes = asRoughMinutes;\n exports.asRoughMs = asRoughMs;\n exports.asRoughSeconds = asRoughSeconds;\n exports.buildGotoAnchorHtml = buildGotoAnchorHtml;\n exports.buildSegCompareObj = buildSegCompareObj;\n exports.capitaliseFirstLetter = capitaliseFirstLetter;\n exports.combineEventUis = combineEventUis;\n exports.compareByFieldSpec = compareByFieldSpec;\n exports.compareByFieldSpecs = compareByFieldSpecs;\n exports.compareNumbers = compareNumbers;\n exports.compensateScroll = compensateScroll;\n exports.computeClippingRect = computeClippingRect;\n exports.computeEdges = computeEdges;\n exports.computeFallbackHeaderFormat = computeFallbackHeaderFormat;\n exports.computeHeightAndMargins = computeHeightAndMargins;\n exports.computeInnerRect = computeInnerRect;\n exports.computeRect = computeRect;\n exports.computeVisibleDayRange = computeVisibleDayRange;\n exports.config = config;\n exports.constrainPoint = constrainPoint;\n exports.createDuration = createDuration;\n exports.createElement = createElement;\n exports.createEmptyEventStore = createEmptyEventStore;\n exports.createEventInstance = createEventInstance;\n exports.createFormatter = createFormatter;\n exports.createPlugin = createPlugin;\n exports.cssToStr = cssToStr;\n exports.debounce = debounce;\n exports.diffDates = diffDates;\n exports.diffDayAndTime = diffDayAndTime;\n exports.diffDays = diffDays;\n exports.diffPoints = diffPoints;\n exports.diffWeeks = diffWeeks;\n exports.diffWholeDays = diffWholeDays;\n exports.diffWholeWeeks = diffWholeWeeks;\n exports.disableCursor = disableCursor;\n exports.distributeHeight = distributeHeight;\n exports.elementClosest = elementClosest;\n exports.elementMatches = elementMatches;\n exports.enableCursor = enableCursor;\n exports.eventTupleToStore = eventTupleToStore;\n exports.filterEventStoreDefs = filterEventStoreDefs;\n exports.filterHash = filterHash;\n exports.findChildren = findChildren;\n exports.findElements = findElements;\n exports.flexibleCompare = flexibleCompare;\n exports.forceClassName = forceClassName;\n exports.formatDate = formatDate;\n exports.formatIsoTimeString = formatIsoTimeString;\n exports.formatRange = formatRange;\n exports.freezeRaw = freezeRaw;\n exports.getAllDayHtml = getAllDayHtml;\n exports.getClippingParents = getClippingParents;\n exports.getDayClasses = getDayClasses;\n exports.getElSeg = getElSeg;\n exports.getRectCenter = getRectCenter;\n exports.getRelevantEvents = getRelevantEvents;\n exports.globalDefaults = globalDefaults;\n exports.greatestDurationDenominator = greatestDurationDenominator;\n exports.hasBgRendering = hasBgRendering;\n exports.htmlEscape = htmlEscape;\n exports.htmlToElement = htmlToElement;\n exports.insertAfterElement = insertAfterElement;\n exports.interactionSettingsStore = interactionSettingsStore;\n exports.interactionSettingsToStore = interactionSettingsToStore;\n exports.intersectRanges = intersectRanges;\n exports.intersectRects = intersectRects;\n exports.isArraysEqual = isArraysEqual;\n exports.isDateSpansEqual = isDateSpansEqual;\n exports.isInt = isInt;\n exports.isInteractionValid = isInteractionValid;\n exports.isMultiDayRange = isMultiDayRange;\n exports.isObjectsSimilar = isObjectsSimilar;\n exports.isPropsValid = isPropsValid;\n exports.isSingleDay = isSingleDay;\n exports.isValidDate = isValidDate;\n exports.isValuesSimilar = isValuesSimilar;\n exports.listenBySelector = listenBySelector;\n exports.mapHash = mapHash;\n exports.matchCellWidths = matchCellWidths;\n exports.memoize = memoize;\n exports.memoizeOutput = memoizeOutput;\n exports.memoizeRendering = memoizeRendering;\n exports.mergeEventStores = mergeEventStores;\n exports.multiplyDuration = multiplyDuration;\n exports.padStart = padStart;\n exports.parseBusinessHours = parseBusinessHours;\n exports.parseDragMeta = parseDragMeta;\n exports.parseEventDef = parseEventDef;\n exports.parseFieldSpecs = parseFieldSpecs;\n exports.parseMarker = parse;\n exports.pointInsideRect = pointInsideRect;\n exports.prependToElement = prependToElement;\n exports.preventContextMenu = preventContextMenu;\n exports.preventDefault = preventDefault;\n exports.preventSelection = preventSelection;\n exports.processScopedUiProps = processScopedUiProps;\n exports.rangeContainsMarker = rangeContainsMarker;\n exports.rangeContainsRange = rangeContainsRange;\n exports.rangesEqual = rangesEqual;\n exports.rangesIntersect = rangesIntersect;\n exports.refineProps = refineProps;\n exports.removeElement = removeElement;\n exports.removeExact = removeExact;\n exports.renderDateCell = renderDateCell;\n exports.requestJson = requestJson;\n exports.sliceEventStore = sliceEventStore;\n exports.startOfDay = startOfDay;\n exports.subtractInnerElHeight = subtractInnerElHeight;\n exports.translateRect = translateRect;\n exports.uncompensateScroll = uncompensateScroll;\n exports.undistributeHeight = undistributeHeight;\n exports.unpromisify = unpromisify;\n exports.version = version;\n exports.whenTransitionDone = whenTransitionDone;\n exports.wholeDivideDurations = wholeDivideDurations;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n","/*!\n@fullcalendar/daygrid v4.0.1\nDocs & License: https://fullcalendar.io/\n(c) 2019 Adam Shaw\n*/\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :\n typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :\n (global = global || self, factory(global.FullCalendarDayGrid = {}, global.FullCalendar));\n}(this, function (exports, core) { 'use strict';\n\n /*! *****************************************************************************\r\n Copyright (c) Microsoft Corporation. All rights reserved.\r\n Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\n this file except in compliance with the License. You may obtain a copy of the\r\n License at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\n WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\n MERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\n See the Apache Version 2.0 License for specific language governing permissions\r\n and limitations under the License.\r\n ***************************************************************************** */\r\n /* global Reflect, Promise */\r\n\r\n var extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n };\r\n\r\n function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n }\r\n\r\n var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n };\n\n var DayGridDateProfileGenerator = /** @class */ (function (_super) {\n __extends(DayGridDateProfileGenerator, _super);\n function DayGridDateProfileGenerator() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n // Computes the date range that will be rendered.\n DayGridDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {\n var dateEnv = this.dateEnv;\n var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay);\n var start = renderRange.start;\n var end = renderRange.end;\n var endOfWeek;\n // year and month views should be aligned with weeks. this is already done for week\n if (/^(year|month)$/.test(currentRangeUnit)) {\n start = dateEnv.startOfWeek(start);\n // make end-of-week if not already\n endOfWeek = dateEnv.startOfWeek(end);\n if (endOfWeek.valueOf() !== end.valueOf()) {\n end = core.addWeeks(endOfWeek, 1);\n }\n }\n // ensure 6 weeks\n if (this.options.monthMode &&\n this.options.fixedWeekCount) {\n var rowCnt = Math.ceil(// could be partial weeks due to hiddenDays\n core.diffWeeks(start, end));\n end = core.addWeeks(end, 6 - rowCnt);\n }\n return { start: start, end: end };\n };\n return DayGridDateProfileGenerator;\n }(core.DateProfileGenerator));\n\n /* A rectangular panel that is absolutely positioned over other content\n ------------------------------------------------------------------------------------------------------------------------\n Options:\n - className (string)\n - content (HTML string, element, or element array)\n - parentEl\n - top\n - left\n - right (the x coord of where the right edge should be. not a \"CSS\" right)\n - autoHide (boolean)\n - show (callback)\n - hide (callback)\n */\n var Popover = /** @class */ (function () {\n function Popover(options) {\n var _this = this;\n this.isHidden = true;\n this.margin = 10; // the space required between the popover and the edges of the scroll container\n // Triggered when the user clicks *anywhere* in the document, for the autoHide feature\n this.documentMousedown = function (ev) {\n // only hide the popover if the click happened outside the popover\n if (_this.el && !_this.el.contains(ev.target)) {\n _this.hide();\n }\n };\n this.options = options;\n }\n // Shows the popover on the specified position. Renders it if not already\n Popover.prototype.show = function () {\n if (this.isHidden) {\n if (!this.el) {\n this.render();\n }\n this.el.style.display = '';\n this.position();\n this.isHidden = false;\n this.trigger('show');\n }\n };\n // Hides the popover, through CSS, but does not remove it from the DOM\n Popover.prototype.hide = function () {\n if (!this.isHidden) {\n this.el.style.display = 'none';\n this.isHidden = true;\n this.trigger('hide');\n }\n };\n // Creates `this.el` and renders content inside of it\n Popover.prototype.render = function () {\n var _this = this;\n var options = this.options;\n var el = this.el = core.createElement('div', {\n className: 'fc-popover ' + (options.className || ''),\n style: {\n top: '0',\n left: '0'\n }\n });\n if (typeof options.content === 'function') {\n options.content(el);\n }\n options.parentEl.appendChild(el);\n // when a click happens on anything inside with a 'fc-close' className, hide the popover\n core.listenBySelector(el, 'click', '.fc-close', function (ev) {\n _this.hide();\n });\n if (options.autoHide) {\n document.addEventListener('mousedown', this.documentMousedown);\n }\n };\n // Hides and unregisters any handlers\n Popover.prototype.destroy = function () {\n this.hide();\n if (this.el) {\n core.removeElement(this.el);\n this.el = null;\n }\n document.removeEventListener('mousedown', this.documentMousedown);\n };\n // Positions the popover optimally, using the top/left/right options\n Popover.prototype.position = function () {\n var options = this.options;\n var el = this.el;\n var elDims = el.getBoundingClientRect(); // only used for width,height\n var origin = core.computeRect(el.offsetParent);\n var clippingRect = core.computeClippingRect(options.parentEl);\n var top; // the \"position\" (not \"offset\") values for the popover\n var left; //\n // compute top and left\n top = options.top || 0;\n if (options.left !== undefined) {\n left = options.left;\n }\n else if (options.right !== undefined) {\n left = options.right - elDims.width; // derive the left value from the right value\n }\n else {\n left = 0;\n }\n // constrain to the view port. if constrained by two edges, give precedence to top/left\n top = Math.min(top, clippingRect.bottom - elDims.height - this.margin);\n top = Math.max(top, clippingRect.top + this.margin);\n left = Math.min(left, clippingRect.right - elDims.width - this.margin);\n left = Math.max(left, clippingRect.left + this.margin);\n core.applyStyle(el, {\n top: top - origin.top,\n left: left - origin.left\n });\n };\n // Triggers a callback. Calls a function in the option hash of the same name.\n // Arguments beyond the first `name` are forwarded on.\n // TODO: better code reuse for this. Repeat code\n // can kill this???\n Popover.prototype.trigger = function (name) {\n if (this.options[name]) {\n this.options[name].apply(this, Array.prototype.slice.call(arguments, 1));\n }\n };\n return Popover;\n }());\n\n /* Event-rendering methods for the DayGrid class\n ----------------------------------------------------------------------------------------------------------------------*/\n // \"Simple\" is bad a name. has nothing to do with SimpleDayGrid\n var SimpleDayGridEventRenderer = /** @class */ (function (_super) {\n __extends(SimpleDayGridEventRenderer, _super);\n function SimpleDayGridEventRenderer() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n // Builds the HTML to be used for the default element for an individual segment\n SimpleDayGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {\n var options = this.context.options;\n var eventRange = seg.eventRange;\n var eventDef = eventRange.def;\n var eventUi = eventRange.ui;\n var allDay = eventDef.allDay;\n var isDraggable = eventUi.startEditable;\n var isResizableFromStart = allDay && seg.isStart && eventUi.durationEditable && options.eventResizableFromStart;\n var isResizableFromEnd = allDay && seg.isEnd && eventUi.durationEditable;\n var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);\n var skinCss = core.cssToStr(this.getSkinCss(eventUi));\n var timeHtml = '';\n var timeText;\n var titleHtml;\n classes.unshift('fc-day-grid-event', 'fc-h-event');\n // Only display a timed events time if it is the starting segment\n if (seg.isStart) {\n timeText = this.getTimeText(eventRange);\n if (timeText) {\n timeHtml = '' + core.htmlEscape(timeText) + '';\n }\n }\n titleHtml =\n '' +\n (core.htmlEscape(eventDef.title || '') || ' ') + // we always want one line of height\n '';\n return '
' +\n '
' +\n (options.dir === 'rtl' ?\n titleHtml + ' ' + timeHtml : // put a natural space in between\n timeHtml + ' ' + titleHtml //\n ) +\n '
' +\n (isResizableFromStart ?\n '
' :\n '') +\n (isResizableFromEnd ?\n '
' :\n '') +\n '
';\n };\n // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined\n SimpleDayGridEventRenderer.prototype.computeEventTimeFormat = function () {\n return {\n hour: 'numeric',\n minute: '2-digit',\n omitZeroMinute: true,\n meridiem: 'narrow'\n };\n };\n SimpleDayGridEventRenderer.prototype.computeDisplayEventEnd = function () {\n return false; // TODO: somehow consider the originating DayGrid's column count\n };\n return SimpleDayGridEventRenderer;\n }(core.FgEventRenderer));\n\n /* Event-rendering methods for the DayGrid class\n ----------------------------------------------------------------------------------------------------------------------*/\n var DayGridEventRenderer = /** @class */ (function (_super) {\n __extends(DayGridEventRenderer, _super);\n function DayGridEventRenderer(dayGrid) {\n var _this = _super.call(this, dayGrid.context) || this;\n _this.dayGrid = dayGrid;\n return _this;\n }\n // Renders the given foreground event segments onto the grid\n DayGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {\n var rowStructs = this.rowStructs = this.renderSegRows(segs);\n // append to each row's content skeleton\n this.dayGrid.rowEls.forEach(function (rowNode, i) {\n rowNode.querySelector('.fc-content-skeleton > table').appendChild(rowStructs[i].tbodyEl);\n });\n // removes the \"more..\" events popover\n if (!mirrorInfo) {\n this.dayGrid.removeSegPopover();\n }\n };\n // Unrenders all currently rendered foreground event segments\n DayGridEventRenderer.prototype.detachSegs = function () {\n var rowStructs = this.rowStructs || [];\n var rowStruct;\n while ((rowStruct = rowStructs.pop())) {\n core.removeElement(rowStruct.tbodyEl);\n }\n this.rowStructs = null;\n };\n // Uses the given events array to generate elements that should be appended to each row's content skeleton.\n // Returns an array of rowStruct objects (see the bottom of `renderSegRow`).\n // PRECONDITION: each segment shoud already have a rendered and assigned `.el`\n DayGridEventRenderer.prototype.renderSegRows = function (segs) {\n var rowStructs = [];\n var segRows;\n var row;\n segRows = this.groupSegRows(segs); // group into nested arrays\n // iterate each row of segment groupings\n for (row = 0; row < segRows.length; row++) {\n rowStructs.push(this.renderSegRow(row, segRows[row]));\n }\n return rowStructs;\n };\n // Given a row # and an array of segments all in the same row, render a element, a skeleton that contains\n // the segments. Returns object with a bunch of internal data about how the render was calculated.\n // NOTE: modifies rowSegs\n DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) {\n var dayGrid = this.dayGrid;\n var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl;\n var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels\n var levelCnt = Math.max(1, segLevels.length); // ensure at least one level\n var tbody = document.createElement('tbody');\n var segMatrix = []; // lookup for which segments are rendered into which level+col cells\n var cellMatrix = []; // lookup for all elements of the level+col matrix\n var loneCellMatrix = []; // lookup for elements that only take up a single column\n var i;\n var levelSegs;\n var col;\n var tr;\n var j;\n var seg;\n var td;\n // populates empty cells from the current column (`col`) to `endCol`\n function emptyCellsUntil(endCol) {\n while (col < endCol) {\n // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell\n td = (loneCellMatrix[i - 1] || [])[col];\n if (td) {\n td.rowSpan = (td.rowSpan || 1) + 1;\n }\n else {\n td = document.createElement('td');\n tr.appendChild(td);\n }\n cellMatrix[i][col] = td;\n loneCellMatrix[i][col] = td;\n col++;\n }\n }\n for (i = 0; i < levelCnt; i++) { // iterate through all levels\n levelSegs = segLevels[i];\n col = 0;\n tr = document.createElement('tr');\n segMatrix.push([]);\n cellMatrix.push([]);\n loneCellMatrix.push([]);\n // levelCnt might be 1 even though there are no actual levels. protect against this.\n // this single empty row is useful for styling.\n if (levelSegs) {\n for (j = 0; j < levelSegs.length; j++) { // iterate through segments in level\n seg = levelSegs[j];\n var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;\n var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;\n emptyCellsUntil(leftCol);\n // create a container that occupies or more columns. append the event element.\n td = core.createElement('td', { className: 'fc-event-container' }, seg.el);\n if (leftCol !== rightCol) {\n td.colSpan = rightCol - leftCol + 1;\n }\n else { // a single-column segment\n loneCellMatrix[i][col] = td;\n }\n while (col <= rightCol) {\n cellMatrix[i][col] = td;\n segMatrix[i][col] = seg;\n col++;\n }\n tr.appendChild(td);\n }\n }\n emptyCellsUntil(colCnt); // finish off the row\n var introHtml = dayGrid.renderProps.renderIntroHtml();\n if (introHtml) {\n if (dayGrid.isRtl) {\n core.appendToElement(tr, introHtml);\n }\n else {\n core.prependToElement(tr, introHtml);\n }\n }\n tbody.appendChild(tr);\n }\n return {\n row: row,\n tbodyEl: tbody,\n cellMatrix: cellMatrix,\n segMatrix: segMatrix,\n segLevels: segLevels,\n segs: rowSegs\n };\n };\n // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.\n // NOTE: modifies segs\n DayGridEventRenderer.prototype.buildSegLevels = function (segs) {\n var _a = this.dayGrid, isRtl = _a.isRtl, colCnt = _a.colCnt;\n var levels = [];\n var i;\n var seg;\n var j;\n // Give preference to elements with certain criteria, so they have\n // a chance to be closer to the top.\n segs = this.sortEventSegs(segs);\n for (i = 0; i < segs.length; i++) {\n seg = segs[i];\n // loop through levels, starting with the topmost, until the segment doesn't collide with other segments\n for (j = 0; j < levels.length; j++) {\n if (!isDaySegCollision(seg, levels[j])) {\n break;\n }\n }\n // `j` now holds the desired subrow index\n seg.level = j;\n seg.leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; // for sorting only\n seg.rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol // for sorting only\n ;\n (levels[j] || (levels[j] = [])).push(seg);\n }\n // order segments left-to-right. very important if calendar is RTL\n for (j = 0; j < levels.length; j++) {\n levels[j].sort(compareDaySegCols);\n }\n return levels;\n };\n // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row\n DayGridEventRenderer.prototype.groupSegRows = function (segs) {\n var segRows = [];\n var i;\n for (i = 0; i < this.dayGrid.rowCnt; i++) {\n segRows.push([]);\n }\n for (i = 0; i < segs.length; i++) {\n segRows[segs[i].row].push(segs[i]);\n }\n return segRows;\n };\n // Computes a default `displayEventEnd` value if one is not expliclty defined\n DayGridEventRenderer.prototype.computeDisplayEventEnd = function () {\n return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day\n };\n return DayGridEventRenderer;\n }(SimpleDayGridEventRenderer));\n // Computes whether two segments' columns collide. They are assumed to be in the same row.\n function isDaySegCollision(seg, otherSegs) {\n var i;\n var otherSeg;\n for (i = 0; i < otherSegs.length; i++) {\n otherSeg = otherSegs[i];\n if (otherSeg.firstCol <= seg.lastCol &&\n otherSeg.lastCol >= seg.firstCol) {\n return true;\n }\n }\n return false;\n }\n // A cmp function for determining the leftmost event\n function compareDaySegCols(a, b) {\n return a.leftCol - b.leftCol;\n }\n\n var DayGridMirrorRenderer = /** @class */ (function (_super) {\n __extends(DayGridMirrorRenderer, _super);\n function DayGridMirrorRenderer() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n DayGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {\n var sourceSeg = mirrorInfo.sourceSeg;\n var rowStructs = this.rowStructs = this.renderSegRows(segs);\n // inject each new event skeleton into each associated row\n this.dayGrid.rowEls.forEach(function (rowNode, row) {\n var skeletonEl = core.htmlToElement('
'); // will be absolutely positioned\n var skeletonTopEl;\n var skeletonTop;\n // If there is an original segment, match the top position. Otherwise, put it at the row's top level\n if (sourceSeg && sourceSeg.row === row) {\n skeletonTopEl = sourceSeg.el;\n }\n else {\n skeletonTopEl = rowNode.querySelector('.fc-content-skeleton tbody');\n if (!skeletonTopEl) { // when no events\n skeletonTopEl = rowNode.querySelector('.fc-content-skeleton table');\n }\n }\n skeletonTop = skeletonTopEl.getBoundingClientRect().top -\n rowNode.getBoundingClientRect().top; // the offsetParent origin\n skeletonEl.style.top = skeletonTop + 'px';\n skeletonEl.querySelector('table').appendChild(rowStructs[row].tbodyEl);\n rowNode.appendChild(skeletonEl);\n });\n };\n return DayGridMirrorRenderer;\n }(DayGridEventRenderer));\n\n var DayGridFillRenderer = /** @class */ (function (_super) {\n __extends(DayGridFillRenderer, _super);\n function DayGridFillRenderer(dayGrid) {\n var _this = _super.call(this, dayGrid.context) || this;\n _this.fillSegTag = 'td'; // override the default tag name\n _this.dayGrid = dayGrid;\n return _this;\n }\n DayGridFillRenderer.prototype.renderSegs = function (type, segs) {\n // don't render timed background events\n if (type === 'bgEvent') {\n segs = segs.filter(function (seg) {\n return seg.eventRange.def.allDay;\n });\n }\n _super.prototype.renderSegs.call(this, type, segs);\n };\n DayGridFillRenderer.prototype.attachSegs = function (type, segs) {\n var els = [];\n var i;\n var seg;\n var skeletonEl;\n for (i = 0; i < segs.length; i++) {\n seg = segs[i];\n skeletonEl = this.renderFillRow(type, seg);\n this.dayGrid.rowEls[seg.row].appendChild(skeletonEl);\n els.push(skeletonEl);\n }\n return els;\n };\n // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.\n DayGridFillRenderer.prototype.renderFillRow = function (type, seg) {\n var dayGrid = this.dayGrid;\n var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl;\n var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;\n var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;\n var startCol = leftCol;\n var endCol = rightCol + 1;\n var className;\n var skeletonEl;\n var trEl;\n if (type === 'businessHours') {\n className = 'bgevent';\n }\n else {\n className = type.toLowerCase();\n }\n skeletonEl = core.htmlToElement('
' +\n '
' +\n '
');\n trEl = skeletonEl.getElementsByTagName('tr')[0];\n if (startCol > 0) {\n core.appendToElement(trEl, \n // will create (startCol + 1) td's\n new Array(startCol + 1).join(''));\n }\n seg.el.colSpan = endCol - startCol;\n trEl.appendChild(seg.el);\n if (endCol < colCnt) {\n core.appendToElement(trEl, \n // will create (colCnt - endCol) td's\n new Array(colCnt - endCol + 1).join(''));\n }\n var introHtml = dayGrid.renderProps.renderIntroHtml();\n if (introHtml) {\n if (dayGrid.isRtl) {\n core.appendToElement(trEl, introHtml);\n }\n else {\n core.prependToElement(trEl, introHtml);\n }\n }\n return skeletonEl;\n };\n return DayGridFillRenderer;\n }(core.FillRenderer));\n\n var DayTile = /** @class */ (function (_super) {\n __extends(DayTile, _super);\n function DayTile(context, el) {\n var _this = _super.call(this, context, el) || this;\n var eventRenderer = _this.eventRenderer = new DayTileEventRenderer(_this);\n var renderFrame = _this.renderFrame = core.memoizeRendering(_this._renderFrame);\n _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderFrame]);\n _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);\n _this.renderEventDrag = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);\n _this.renderEventResize = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);\n context.calendar.registerInteractiveComponent(_this, {\n el: _this.el,\n useEventCenter: false\n });\n return _this;\n }\n DayTile.prototype.render = function (props) {\n this.renderFrame(props.date);\n this.renderFgEvents(props.fgSegs);\n this.renderEventSelection(props.eventSelection);\n this.renderEventDrag(props.eventDragInstances);\n this.renderEventResize(props.eventResizeInstances);\n };\n DayTile.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n this.renderFrame.unrender(); // should unrender everything else\n this.calendar.unregisterInteractiveComponent(this);\n };\n DayTile.prototype._renderFrame = function (date) {\n var _a = this, theme = _a.theme, dateEnv = _a.dateEnv;\n var title = dateEnv.format(date, core.createFormatter(this.opt('dayPopoverFormat')) // TODO: cache\n );\n this.el.innerHTML =\n '
' +\n '' +\n core.htmlEscape(title) +\n '' +\n '' +\n '
' +\n '
' +\n '
' +\n '
';\n this.segContainerEl = this.el.querySelector('.fc-event-container');\n };\n DayTile.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {\n var date = this.props.date; // HACK\n if (positionLeft < elWidth && positionTop < elHeight) {\n return {\n component: this,\n dateSpan: {\n allDay: true,\n range: { start: date, end: core.addDays(date, 1) }\n },\n dayEl: this.el,\n rect: {\n left: 0,\n top: 0,\n right: elWidth,\n bottom: elHeight\n },\n layer: 1\n };\n }\n };\n return DayTile;\n }(core.DateComponent));\n var DayTileEventRenderer = /** @class */ (function (_super) {\n __extends(DayTileEventRenderer, _super);\n function DayTileEventRenderer(dayTile) {\n var _this = _super.call(this, dayTile.context) || this;\n _this.dayTile = dayTile;\n return _this;\n }\n DayTileEventRenderer.prototype.attachSegs = function (segs) {\n for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {\n var seg = segs_1[_i];\n this.dayTile.segContainerEl.appendChild(seg.el);\n }\n };\n DayTileEventRenderer.prototype.detachSegs = function (segs) {\n for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {\n var seg = segs_2[_i];\n core.removeElement(seg.el);\n }\n };\n return DayTileEventRenderer;\n }(SimpleDayGridEventRenderer));\n\n var DayBgRow = /** @class */ (function () {\n function DayBgRow(context) {\n this.context = context;\n }\n DayBgRow.prototype.renderHtml = function (props) {\n var parts = [];\n if (props.renderIntroHtml) {\n parts.push(props.renderIntroHtml());\n }\n for (var _i = 0, _a = props.cells; _i < _a.length; _i++) {\n var cell = _a[_i];\n parts.push(renderCellHtml(cell.date, props.dateProfile, this.context, cell.htmlAttrs));\n }\n if (!props.cells.length) {\n parts.push('');\n }\n if (this.context.options.dir === 'rtl') {\n parts.reverse();\n }\n return '' + parts.join('') + '';\n };\n return DayBgRow;\n }());\n function renderCellHtml(date, dateProfile, context, otherAttrs) {\n var dateEnv = context.dateEnv, theme = context.theme;\n var isDateValid = core.rangeContainsMarker(dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.\n var classes = core.getDayClasses(date, dateProfile, context);\n classes.unshift('fc-day', theme.getClass('widgetContent'));\n return '';\n }\n\n var DAY_NUM_FORMAT = core.createFormatter({ day: 'numeric' });\n var WEEK_NUM_FORMAT = core.createFormatter({ week: 'numeric' });\n var DayGrid = /** @class */ (function (_super) {\n __extends(DayGrid, _super);\n function DayGrid(context, el, renderProps) {\n var _this = _super.call(this, context, el) || this;\n _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid\n _this.isCellSizesDirty = false;\n var eventRenderer = _this.eventRenderer = new DayGridEventRenderer(_this);\n var fillRenderer = _this.fillRenderer = new DayGridFillRenderer(_this);\n _this.mirrorRenderer = new DayGridMirrorRenderer(_this);\n var renderCells = _this.renderCells = core.memoizeRendering(_this._renderCells, _this._unrenderCells);\n _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderCells]);\n _this.renderDateSelection = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'highlight'), fillRenderer.unrender.bind(fillRenderer, 'highlight'), [renderCells]);\n _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderCells]);\n _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderCells]);\n _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);\n _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderCells]);\n _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderCells]);\n _this.renderProps = renderProps;\n return _this;\n }\n DayGrid.prototype.render = function (props) {\n var cells = props.cells;\n this.rowCnt = cells.length;\n this.colCnt = cells[0].length;\n this.renderCells(cells, props.isRigid);\n this.renderBusinessHours(props.businessHourSegs);\n this.renderDateSelection(props.dateSelectionSegs);\n this.renderBgEvents(props.bgEventSegs);\n this.renderFgEvents(props.fgEventSegs);\n this.renderEventSelection(props.eventSelection);\n this.renderEventDrag(props.eventDrag);\n this.renderEventResize(props.eventResize);\n if (this.segPopoverTile) {\n this.updateSegPopoverTile();\n }\n };\n DayGrid.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n this.renderCells.unrender(); // will unrender everything else\n };\n DayGrid.prototype.getCellRange = function (row, col) {\n var start = this.props.cells[row][col].date;\n var end = core.addDays(start, 1);\n return { start: start, end: end };\n };\n DayGrid.prototype.updateSegPopoverTile = function (date, segs) {\n var ownProps = this.props;\n this.segPopoverTile.receiveProps({\n date: date || this.segPopoverTile.props.date,\n fgSegs: segs || this.segPopoverTile.props.fgSegs,\n eventSelection: ownProps.eventSelection,\n eventDragInstances: ownProps.eventDrag ? ownProps.eventDrag.affectedInstances : null,\n eventResizeInstances: ownProps.eventResize ? ownProps.eventResize.affectedInstances : null\n });\n };\n /* Date Rendering\n ------------------------------------------------------------------------------------------------------------------*/\n DayGrid.prototype._renderCells = function (cells, isRigid) {\n var _a = this, view = _a.view, dateEnv = _a.dateEnv;\n var _b = this, rowCnt = _b.rowCnt, colCnt = _b.colCnt;\n var html = '';\n var row;\n var col;\n for (row = 0; row < rowCnt; row++) {\n html += this.renderDayRowHtml(row, isRigid);\n }\n this.el.innerHTML = html;\n this.rowEls = core.findElements(this.el, '.fc-row');\n this.cellEls = core.findElements(this.el, '.fc-day, .fc-disabled-day');\n if (this.isRtl) {\n this.cellEls.reverse();\n }\n this.rowPositions = new core.PositionCache(this.el, this.rowEls, false, true // vertical\n );\n this.colPositions = new core.PositionCache(this.el, this.cellEls.slice(0, colCnt), // only the first row\n true, false // horizontal\n );\n // trigger dayRender with each cell's element\n for (row = 0; row < rowCnt; row++) {\n for (col = 0; col < colCnt; col++) {\n this.publiclyTrigger('dayRender', [\n {\n date: dateEnv.toDate(cells[row][col].date),\n el: this.getCellEl(row, col),\n view: view\n }\n ]);\n }\n }\n this.isCellSizesDirty = true;\n };\n DayGrid.prototype._unrenderCells = function () {\n this.removeSegPopover();\n };\n // Generates the HTML for a single row, which is a div that wraps a table.\n // `row` is the row number.\n DayGrid.prototype.renderDayRowHtml = function (row, isRigid) {\n var theme = this.theme;\n var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')];\n if (isRigid) {\n classes.push('fc-rigid');\n }\n var bgRow = new DayBgRow(this.context);\n return '' +\n '
' +\n '
' +\n '' +\n bgRow.renderHtml({\n cells: this.props.cells[row],\n dateProfile: this.props.dateProfile,\n renderIntroHtml: this.renderProps.renderBgIntroHtml\n }) +\n '
' +\n '
' +\n '
' +\n '' +\n (this.getIsNumbersVisible() ?\n '' +\n this.renderNumberTrHtml(row) +\n '' :\n '') +\n '
' +\n '
' +\n '
';\n };\n DayGrid.prototype.getIsNumbersVisible = function () {\n return this.getIsDayNumbersVisible() ||\n this.renderProps.cellWeekNumbersVisible ||\n this.renderProps.colWeekNumbersVisible;\n };\n DayGrid.prototype.getIsDayNumbersVisible = function () {\n return this.rowCnt > 1;\n };\n /* Grid Number Rendering\n ------------------------------------------------------------------------------------------------------------------*/\n DayGrid.prototype.renderNumberTrHtml = function (row) {\n var intro = this.renderProps.renderNumberIntroHtml(row, this);\n return '' +\n '' +\n (this.isRtl ? '' : intro) +\n this.renderNumberCellsHtml(row) +\n (this.isRtl ? intro : '') +\n '';\n };\n DayGrid.prototype.renderNumberCellsHtml = function (row) {\n var htmls = [];\n var col;\n var date;\n for (col = 0; col < this.colCnt; col++) {\n date = this.props.cells[row][col].date;\n htmls.push(this.renderNumberCellHtml(date));\n }\n if (this.isRtl) {\n htmls.reverse();\n }\n return htmls.join('');\n };\n // Generates the HTML for the s of the \"number\" row in the DayGrid's content skeleton.\n // The number row will only exist if either day numbers or week numbers are turned on.\n DayGrid.prototype.renderNumberCellHtml = function (date) {\n var _a = this, view = _a.view, dateEnv = _a.dateEnv;\n var html = '';\n var isDateValid = core.rangeContainsMarker(this.props.dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.\n var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid;\n var classes;\n var weekCalcFirstDow;\n if (!isDayNumberVisible && !this.renderProps.cellWeekNumbersVisible) {\n // no numbers in day cell (week number must be along the side)\n return ''; // will create an empty space above events :(\n }\n classes = core.getDayClasses(date, this.props.dateProfile, this.context);\n classes.unshift('fc-day-top');\n if (this.renderProps.cellWeekNumbersVisible) {\n weekCalcFirstDow = dateEnv.weekDow;\n }\n html += '';\n if (this.renderProps.cellWeekNumbersVisible && (date.getUTCDay() === weekCalcFirstDow)) {\n html += core.buildGotoAnchorHtml(view, { date: date, type: 'week' }, { 'class': 'fc-week-number' }, dateEnv.format(date, WEEK_NUM_FORMAT) // inner HTML\n );\n }\n if (isDayNumberVisible) {\n html += core.buildGotoAnchorHtml(view, date, { 'class': 'fc-day-number' }, dateEnv.format(date, DAY_NUM_FORMAT) // inner HTML\n );\n }\n html += '';\n return html;\n };\n /* Sizing\n ------------------------------------------------------------------------------------------------------------------*/\n DayGrid.prototype.updateSize = function (isResize) {\n var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;\n if (isResize || this.isCellSizesDirty) {\n this.buildColPositions();\n this.buildRowPositions();\n this.isCellSizesDirty = false;\n }\n fillRenderer.computeSizes(isResize);\n eventRenderer.computeSizes(isResize);\n mirrorRenderer.computeSizes(isResize);\n fillRenderer.assignSizes(isResize);\n eventRenderer.assignSizes(isResize);\n mirrorRenderer.assignSizes(isResize);\n };\n DayGrid.prototype.buildColPositions = function () {\n this.colPositions.build();\n };\n DayGrid.prototype.buildRowPositions = function () {\n this.rowPositions.build();\n this.rowPositions.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack\n };\n /* Hit System\n ------------------------------------------------------------------------------------------------------------------*/\n DayGrid.prototype.positionToHit = function (leftPosition, topPosition) {\n var _a = this, colPositions = _a.colPositions, rowPositions = _a.rowPositions;\n var col = colPositions.leftToIndex(leftPosition);\n var row = rowPositions.topToIndex(topPosition);\n if (row != null && col != null) {\n return {\n row: row,\n col: col,\n dateSpan: {\n range: this.getCellRange(row, col),\n allDay: true\n },\n dayEl: this.getCellEl(row, col),\n relativeRect: {\n left: colPositions.lefts[col],\n right: colPositions.rights[col],\n top: rowPositions.tops[row],\n bottom: rowPositions.bottoms[row]\n }\n };\n }\n };\n /* Cell System\n ------------------------------------------------------------------------------------------------------------------*/\n // FYI: the first column is the leftmost column, regardless of date\n DayGrid.prototype.getCellEl = function (row, col) {\n return this.cellEls[row * this.colCnt + col];\n };\n /* Event Drag Visualization\n ------------------------------------------------------------------------------------------------------------------*/\n DayGrid.prototype._renderEventDrag = function (state) {\n if (state) {\n this.eventRenderer.hideByHash(state.affectedInstances);\n this.fillRenderer.renderSegs('highlight', state.segs);\n }\n };\n DayGrid.prototype._unrenderEventDrag = function (state) {\n if (state) {\n this.eventRenderer.showByHash(state.affectedInstances);\n this.fillRenderer.unrender('highlight');\n }\n };\n /* Event Resize Visualization\n ------------------------------------------------------------------------------------------------------------------*/\n DayGrid.prototype._renderEventResize = function (state) {\n if (state) {\n this.eventRenderer.hideByHash(state.affectedInstances);\n this.fillRenderer.renderSegs('highlight', state.segs);\n this.mirrorRenderer.renderSegs(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });\n }\n };\n DayGrid.prototype._unrenderEventResize = function (state) {\n if (state) {\n this.eventRenderer.showByHash(state.affectedInstances);\n this.fillRenderer.unrender('highlight');\n this.mirrorRenderer.unrender(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });\n }\n };\n /* More+ Link Popover\n ------------------------------------------------------------------------------------------------------------------*/\n DayGrid.prototype.removeSegPopover = function () {\n if (this.segPopover) {\n this.segPopover.hide(); // in handler, will call segPopover's removeElement\n }\n };\n // Limits the number of \"levels\" (vertically stacking layers of events) for each row of the grid.\n // `levelLimit` can be false (don't limit), a number, or true (should be computed).\n DayGrid.prototype.limitRows = function (levelLimit) {\n var rowStructs = this.eventRenderer.rowStructs || [];\n var row; // row #\n var rowLevelLimit;\n for (row = 0; row < rowStructs.length; row++) {\n this.unlimitRow(row);\n if (!levelLimit) {\n rowLevelLimit = false;\n }\n else if (typeof levelLimit === 'number') {\n rowLevelLimit = levelLimit;\n }\n else {\n rowLevelLimit = this.computeRowLevelLimit(row);\n }\n if (rowLevelLimit !== false) {\n this.limitRow(row, rowLevelLimit);\n }\n }\n };\n // Computes the number of levels a row will accomodate without going outside its bounds.\n // Assumes the row is \"rigid\" (maintains a constant height regardless of what is inside).\n // `row` is the row number.\n DayGrid.prototype.computeRowLevelLimit = function (row) {\n var rowEl = this.rowEls[row]; // the containing \"fake\" row div\n var rowBottom = rowEl.getBoundingClientRect().bottom; // relative to viewport!\n var trEls = core.findChildren(this.eventRenderer.rowStructs[row].tbodyEl);\n var i;\n var trEl;\n // Reveal one level at a time and stop when we find one out of bounds\n for (i = 0; i < trEls.length; i++) {\n trEl = trEls[i];\n trEl.classList.remove('fc-limited'); // reset to original state (reveal)\n if (trEl.getBoundingClientRect().bottom > rowBottom) {\n return i;\n }\n }\n return false; // should not limit at all\n };\n // Limits the given grid row to the maximum number of levels and injects \"more\" links if necessary.\n // `row` is the row number.\n // `levelLimit` is a number for the maximum (inclusive) number of levels allowed.\n DayGrid.prototype.limitRow = function (row, levelLimit) {\n var _this = this;\n var _a = this, colCnt = _a.colCnt, isRtl = _a.isRtl;\n var rowStruct = this.eventRenderer.rowStructs[row];\n var moreNodes = []; // array of \"more\" links and DOM nodes\n var col = 0; // col #, left-to-right (not chronologically)\n var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right\n var cellMatrix; // a matrix (by level, then column) of all elements in the row\n var limitedNodes; // array of temporarily hidden level and segment DOM nodes\n var i;\n var seg;\n var segsBelow; // array of segment objects below `seg` in the current `col`\n var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies\n var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)\n var td;\n var rowSpan;\n var segMoreNodes; // array of \"more\" cells that will stand-in for the current seg's cell\n var j;\n var moreTd;\n var moreWrap;\n var moreLink;\n // Iterates through empty level cells and places \"more\" links inside if need be\n var emptyCellsUntil = function (endCol) {\n while (col < endCol) {\n segsBelow = _this.getCellSegs(row, col, levelLimit);\n if (segsBelow.length) {\n td = cellMatrix[levelLimit - 1][col];\n moreLink = _this.renderMoreLink(row, col, segsBelow);\n moreWrap = core.createElement('div', null, moreLink);\n td.appendChild(moreWrap);\n moreNodes.push(moreWrap[0]);\n }\n col++;\n }\n };\n if (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit?\n levelSegs = rowStruct.segLevels[levelLimit - 1];\n cellMatrix = rowStruct.cellMatrix;\n limitedNodes = core.findChildren(rowStruct.tbodyEl).slice(levelLimit); // get level elements past the limit\n limitedNodes.forEach(function (node) {\n node.classList.add('fc-limited'); // hide elements and get a simple DOM-nodes array\n });\n // iterate though segments in the last allowable level\n for (i = 0; i < levelSegs.length; i++) {\n seg = levelSegs[i];\n var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;\n var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;\n emptyCellsUntil(leftCol); // process empty cells before the segment\n // determine *all* segments below `seg` that occupy the same columns\n colSegsBelow = [];\n totalSegsBelow = 0;\n while (col <= rightCol) {\n segsBelow = this.getCellSegs(row, col, levelLimit);\n colSegsBelow.push(segsBelow);\n totalSegsBelow += segsBelow.length;\n col++;\n }\n if (totalSegsBelow) { // do we need to replace this segment with one or many \"more\" links?\n td = cellMatrix[levelLimit - 1][leftCol]; // the segment's parent cell\n rowSpan = td.rowSpan || 1;\n segMoreNodes = [];\n // make a replacement for each column the segment occupies. will be one for each colspan\n for (j = 0; j < colSegsBelow.length; j++) {\n moreTd = core.createElement('td', { className: 'fc-more-cell', rowSpan: rowSpan });\n segsBelow = colSegsBelow[j];\n moreLink = this.renderMoreLink(row, leftCol + j, [seg].concat(segsBelow) // count seg as hidden too\n );\n moreWrap = core.createElement('div', null, moreLink);\n moreTd.appendChild(moreWrap);\n segMoreNodes.push(moreTd);\n moreNodes.push(moreTd);\n }\n td.classList.add('fc-limited');\n core.insertAfterElement(td, segMoreNodes);\n limitedNodes.push(td);\n }\n }\n emptyCellsUntil(this.colCnt); // finish off the level\n rowStruct.moreEls = moreNodes; // for easy undoing later\n rowStruct.limitedEls = limitedNodes; // for easy undoing later\n }\n };\n // Reveals all levels and removes all \"more\"-related elements for a grid's row.\n // `row` is a row number.\n DayGrid.prototype.unlimitRow = function (row) {\n var rowStruct = this.eventRenderer.rowStructs[row];\n if (rowStruct.moreEls) {\n rowStruct.moreEls.forEach(core.removeElement);\n rowStruct.moreEls = null;\n }\n if (rowStruct.limitedEls) {\n rowStruct.limitedEls.forEach(function (limitedEl) {\n limitedEl.classList.remove('fc-limited');\n });\n rowStruct.limitedEls = null;\n }\n };\n // Renders an element that represents hidden event element for a cell.\n // Responsible for attaching click handler as well.\n DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) {\n var _this = this;\n var _a = this, view = _a.view, dateEnv = _a.dateEnv;\n var a = core.createElement('a', { className: 'fc-more' });\n a.innerText = this.getMoreLinkText(hiddenSegs.length);\n a.addEventListener('click', function (ev) {\n var clickOption = _this.opt('eventLimitClick');\n var _col = _this.isRtl ? _this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?\n var date = _this.props.cells[row][_col].date;\n var moreEl = ev.currentTarget;\n var dayEl = _this.getCellEl(row, col);\n var allSegs = _this.getCellSegs(row, col);\n // rescope the segments to be within the cell's date\n var reslicedAllSegs = _this.resliceDaySegs(allSegs, date);\n var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);\n if (typeof clickOption === 'function') {\n // the returned value can be an atomic option\n clickOption = _this.publiclyTrigger('eventLimitClick', [\n {\n date: dateEnv.toDate(date),\n allDay: true,\n dayEl: dayEl,\n moreEl: moreEl,\n segs: reslicedAllSegs,\n hiddenSegs: reslicedHiddenSegs,\n jsEvent: ev,\n view: view\n }\n ]);\n }\n if (clickOption === 'popover') {\n _this.showSegPopover(row, col, moreEl, reslicedAllSegs);\n }\n else if (typeof clickOption === 'string') { // a view name\n view.calendar.zoomTo(date, clickOption);\n }\n });\n return a;\n };\n // Reveals the popover that displays all events within a cell\n DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) {\n var _this = this;\n var _a = this, calendar = _a.calendar, view = _a.view, theme = _a.theme;\n var _col = this.isRtl ? this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?\n var moreWrap = moreLink.parentNode; // the
wrapper around the \n var topEl; // the element we want to match the top coordinate of\n var options;\n if (this.rowCnt === 1) {\n topEl = view.el; // will cause the popover to cover any sort of header\n }\n else {\n topEl = this.rowEls[row]; // will align with top of row\n }\n options = {\n className: 'fc-more-popover ' + theme.getClass('popover'),\n parentEl: view.el,\n top: core.computeRect(topEl).top,\n autoHide: true,\n content: function (el) {\n _this.segPopoverTile = new DayTile(_this.context, el);\n _this.updateSegPopoverTile(_this.props.cells[row][_col].date, segs);\n },\n hide: function () {\n _this.segPopoverTile.destroy();\n _this.segPopoverTile = null;\n _this.segPopover.destroy();\n _this.segPopover = null;\n }\n };\n // Determine horizontal coordinate.\n // We use the moreWrap instead of the to avoid border confusion.\n if (this.isRtl) {\n options.right = core.computeRect(moreWrap).right + 1; // +1 to be over cell border\n }\n else {\n options.left = core.computeRect(moreWrap).left - 1; // -1 to be over cell border\n }\n this.segPopover = new Popover(options);\n this.segPopover.show();\n calendar.releaseAfterSizingTriggers(); // hack for eventPositioned\n };\n // Given the events within an array of segment objects, reslice them to be in a single day\n DayGrid.prototype.resliceDaySegs = function (segs, dayDate) {\n var dayStart = dayDate;\n var dayEnd = core.addDays(dayStart, 1);\n var dayRange = { start: dayStart, end: dayEnd };\n var newSegs = [];\n for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {\n var seg = segs_1[_i];\n var eventRange = seg.eventRange;\n var origRange = eventRange.range;\n var slicedRange = core.intersectRanges(origRange, dayRange);\n if (slicedRange) {\n newSegs.push(__assign({}, seg, { eventRange: {\n def: eventRange.def,\n ui: __assign({}, eventRange.ui, { durationEditable: false }),\n instance: eventRange.instance,\n range: slicedRange\n }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }));\n }\n }\n return newSegs;\n };\n // Generates the text that should be inside a \"more\" link, given the number of events it represents\n DayGrid.prototype.getMoreLinkText = function (num) {\n var opt = this.opt('eventLimitText');\n if (typeof opt === 'function') {\n return opt(num);\n }\n else {\n return '+' + num + ' ' + opt;\n }\n };\n // Returns segments within a given cell.\n // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.\n DayGrid.prototype.getCellSegs = function (row, col, startLevel) {\n var segMatrix = this.eventRenderer.rowStructs[row].segMatrix;\n var level = startLevel || 0;\n var segs = [];\n var seg;\n while (level < segMatrix.length) {\n seg = segMatrix[level][col];\n if (seg) {\n segs.push(seg);\n }\n level++;\n }\n return segs;\n };\n return DayGrid;\n }(core.DateComponent));\n\n var WEEK_NUM_FORMAT$1 = core.createFormatter({ week: 'numeric' });\n /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells.\n ----------------------------------------------------------------------------------------------------------------------*/\n // It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.\n // It is responsible for managing width/height.\n var DayGridView = /** @class */ (function (_super) {\n __extends(DayGridView, _super);\n function DayGridView(context, viewSpec, dateProfileGenerator, parentEl) {\n var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;\n /* Header Rendering\n ------------------------------------------------------------------------------------------------------------------*/\n // Generates the HTML that will go before the day-of week header cells\n _this.renderHeadIntroHtml = function () {\n var theme = _this.theme;\n if (_this.colWeekNumbersVisible) {\n return '' +\n '' +\n '' + // needed for matchCellWidths\n core.htmlEscape(_this.opt('weekLabel')) +\n '' +\n '';\n }\n return '';\n };\n /* Day Grid Rendering\n ------------------------------------------------------------------------------------------------------------------*/\n // Generates the HTML that will go before content-skeleton cells that display the day/week numbers\n _this.renderDayGridNumberIntroHtml = function (row, dayGrid) {\n var dateEnv = _this.dateEnv;\n var weekStart = dayGrid.props.cells[row][0].date;\n if (_this.colWeekNumbersVisible) {\n return '' +\n '' +\n core.buildGotoAnchorHtml(// aside from link, important for matchCellWidths\n _this, { date: weekStart, type: 'week', forceOff: dayGrid.colCnt === 1 }, dateEnv.format(weekStart, WEEK_NUM_FORMAT$1) // inner HTML\n ) +\n '';\n }\n return '';\n };\n // Generates the HTML that goes before the day bg cells for each day-row\n _this.renderDayGridBgIntroHtml = function () {\n var theme = _this.theme;\n if (_this.colWeekNumbersVisible) {\n return '';\n }\n return '';\n };\n // Generates the HTML that goes before every other type of row generated by DayGrid.\n // Affects mirror-skeleton and highlight-skeleton rows.\n _this.renderDayGridIntroHtml = function () {\n if (_this.colWeekNumbersVisible) {\n return '';\n }\n return '';\n };\n _this.el.classList.add('fc-dayGrid-view');\n _this.el.innerHTML = _this.renderSkeletonHtml();\n _this.scroller = new core.ScrollComponent('hidden', // overflow x\n 'auto' // overflow y\n );\n var dayGridContainerEl = _this.scroller.el;\n _this.el.querySelector('.fc-body > tr > td').appendChild(dayGridContainerEl);\n dayGridContainerEl.classList.add('fc-day-grid-container');\n var dayGridEl = core.createElement('div', { className: 'fc-day-grid' });\n dayGridContainerEl.appendChild(dayGridEl);\n var cellWeekNumbersVisible;\n if (_this.opt('weekNumbers')) {\n if (_this.opt('weekNumbersWithinDays')) {\n cellWeekNumbersVisible = true;\n _this.colWeekNumbersVisible = false;\n }\n else {\n cellWeekNumbersVisible = false;\n _this.colWeekNumbersVisible = true;\n }\n }\n else {\n _this.colWeekNumbersVisible = false;\n cellWeekNumbersVisible = false;\n }\n _this.dayGrid = new DayGrid(_this.context, dayGridEl, {\n renderNumberIntroHtml: _this.renderDayGridNumberIntroHtml,\n renderBgIntroHtml: _this.renderDayGridBgIntroHtml,\n renderIntroHtml: _this.renderDayGridIntroHtml,\n colWeekNumbersVisible: _this.colWeekNumbersVisible,\n cellWeekNumbersVisible: cellWeekNumbersVisible\n });\n return _this;\n }\n DayGridView.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n this.dayGrid.destroy();\n this.scroller.destroy();\n };\n // Builds the HTML skeleton for the view.\n // The day-grid component will render inside of a container defined by this HTML.\n DayGridView.prototype.renderSkeletonHtml = function () {\n var theme = this.theme;\n return '' +\n '' +\n (this.opt('columnHeader') ?\n '' +\n '' +\n '' +\n '' +\n '' :\n '') +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
 
';\n };\n // Generates an HTML attribute string for setting the width of the week number column, if it is known\n DayGridView.prototype.weekNumberStyleAttr = function () {\n if (this.weekNumberWidth != null) {\n return 'style=\"width:' + this.weekNumberWidth + 'px\"';\n }\n return '';\n };\n // Determines whether each row should have a constant height\n DayGridView.prototype.hasRigidRows = function () {\n var eventLimit = this.opt('eventLimit');\n return eventLimit && typeof eventLimit !== 'number';\n };\n /* Dimensions\n ------------------------------------------------------------------------------------------------------------------*/\n DayGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {\n _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first\n this.dayGrid.updateSize(isResize);\n };\n // Refreshes the horizontal dimensions of the view\n DayGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {\n var dayGrid = this.dayGrid;\n var eventLimit = this.opt('eventLimit');\n var headRowEl = this.header ? this.header.el : null; // HACK\n var scrollerHeight;\n var scrollbarWidths;\n // hack to give the view some height prior to dayGrid's columns being rendered\n // TODO: separate setting height from scroller VS dayGrid.\n if (!dayGrid.rowEls) {\n if (!isAuto) {\n scrollerHeight = this.computeScrollerHeight(viewHeight);\n this.scroller.setHeight(scrollerHeight);\n }\n return;\n }\n if (this.colWeekNumbersVisible) {\n // Make sure all week number cells running down the side have the same width.\n this.weekNumberWidth = core.matchCellWidths(core.findElements(this.el, '.fc-week-number'));\n }\n // reset all heights to be natural\n this.scroller.clear();\n if (headRowEl) {\n core.uncompensateScroll(headRowEl);\n }\n dayGrid.removeSegPopover(); // kill the \"more\" popover if displayed\n // is the event limit a constant level number?\n if (eventLimit && typeof eventLimit === 'number') {\n dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after\n }\n // distribute the height to the rows\n // (viewHeight is a \"recommended\" value if isAuto)\n scrollerHeight = this.computeScrollerHeight(viewHeight);\n this.setGridHeight(scrollerHeight, isAuto);\n // is the event limit dynamically calculated?\n if (eventLimit && typeof eventLimit !== 'number') {\n dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set\n }\n if (!isAuto) { // should we force dimensions of the scroll container?\n this.scroller.setHeight(scrollerHeight);\n scrollbarWidths = this.scroller.getScrollbarWidths();\n if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?\n if (headRowEl) {\n core.compensateScroll(headRowEl, scrollbarWidths);\n }\n // doing the scrollbar compensation might have created text overflow which created more height. redo\n scrollerHeight = this.computeScrollerHeight(viewHeight);\n this.scroller.setHeight(scrollerHeight);\n }\n // guarantees the same scrollbar widths\n this.scroller.lockOverflow(scrollbarWidths);\n }\n };\n // given a desired total height of the view, returns what the height of the scroller should be\n DayGridView.prototype.computeScrollerHeight = function (viewHeight) {\n return viewHeight -\n core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\n };\n // Sets the height of just the DayGrid component in this view\n DayGridView.prototype.setGridHeight = function (height, isAuto) {\n if (this.opt('monthMode')) {\n // if auto, make the height of each row the height that it would be if there were 6 weeks\n if (isAuto) {\n height *= this.dayGrid.rowCnt / 6;\n }\n core.distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows\n }\n else {\n if (isAuto) {\n core.undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding\n }\n else {\n core.distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows\n }\n }\n };\n /* Scroll\n ------------------------------------------------------------------------------------------------------------------*/\n DayGridView.prototype.computeInitialDateScroll = function () {\n return { top: 0 };\n };\n DayGridView.prototype.queryDateScroll = function () {\n return { top: this.scroller.getScrollTop() };\n };\n DayGridView.prototype.applyDateScroll = function (scroll) {\n if (scroll.top !== undefined) {\n this.scroller.setScrollTop(scroll.top);\n }\n };\n return DayGridView;\n }(core.View));\n DayGridView.prototype.dateProfileGeneratorClass = DayGridDateProfileGenerator;\n\n var SimpleDayGrid = /** @class */ (function (_super) {\n __extends(SimpleDayGrid, _super);\n function SimpleDayGrid(context, dayGrid) {\n var _this = _super.call(this, context, dayGrid.el) || this;\n _this.slicer = new DayGridSlicer();\n _this.dayGrid = dayGrid;\n context.calendar.registerInteractiveComponent(_this, { el: _this.dayGrid.el });\n return _this;\n }\n SimpleDayGrid.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n this.calendar.unregisterInteractiveComponent(this);\n };\n SimpleDayGrid.prototype.render = function (props) {\n var dayGrid = this.dayGrid;\n var dateProfile = props.dateProfile, dayTable = props.dayTable;\n dayGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, props.nextDayThreshold, dayGrid, dayTable), { dateProfile: dateProfile, cells: dayTable.cells, isRigid: props.isRigid }));\n };\n SimpleDayGrid.prototype.queryHit = function (positionLeft, positionTop) {\n var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop);\n if (rawHit) {\n return {\n component: this.dayGrid,\n dateSpan: rawHit.dateSpan,\n dayEl: rawHit.dayEl,\n rect: {\n left: rawHit.relativeRect.left,\n right: rawHit.relativeRect.right,\n top: rawHit.relativeRect.top,\n bottom: rawHit.relativeRect.bottom\n },\n layer: 0\n };\n }\n };\n return SimpleDayGrid;\n }(core.DateComponent));\n var DayGridSlicer = /** @class */ (function (_super) {\n __extends(DayGridSlicer, _super);\n function DayGridSlicer() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n DayGridSlicer.prototype.sliceRange = function (dateRange, dayTable) {\n return dayTable.sliceRange(dateRange);\n };\n return DayGridSlicer;\n }(core.Slicer));\n\n var DayGridView$1 = /** @class */ (function (_super) {\n __extends(DayGridView, _super);\n function DayGridView(_context, viewSpec, dateProfileGenerator, parentEl) {\n var _this = _super.call(this, _context, viewSpec, dateProfileGenerator, parentEl) || this;\n _this.buildDayTable = core.memoize(buildDayTable);\n if (_this.opt('columnHeader')) {\n _this.header = new core.DayHeader(_this.context, _this.el.querySelector('.fc-head-container'));\n }\n _this.simpleDayGrid = new SimpleDayGrid(_this.context, _this.dayGrid);\n return _this;\n }\n DayGridView.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n if (this.header) {\n this.header.destroy();\n }\n this.simpleDayGrid.destroy();\n };\n DayGridView.prototype.render = function (props) {\n _super.prototype.render.call(this, props);\n var dateProfile = this.props.dateProfile;\n var dayTable = this.dayTable =\n this.buildDayTable(dateProfile, this.dateProfileGenerator);\n if (this.header) {\n this.header.receiveProps({\n dateProfile: dateProfile,\n dates: dayTable.headerDates,\n datesRepDistinctDays: dayTable.rowCnt === 1,\n renderIntroHtml: this.renderHeadIntroHtml\n });\n }\n this.simpleDayGrid.receiveProps({\n dateProfile: dateProfile,\n dayTable: dayTable,\n businessHours: props.businessHours,\n dateSelection: props.dateSelection,\n eventStore: props.eventStore,\n eventUiBases: props.eventUiBases,\n eventSelection: props.eventSelection,\n eventDrag: props.eventDrag,\n eventResize: props.eventResize,\n isRigid: this.hasRigidRows(),\n nextDayThreshold: this.nextDayThreshold\n });\n };\n return DayGridView;\n }(DayGridView));\n function buildDayTable(dateProfile, dateProfileGenerator) {\n var daySeries = new core.DaySeries(dateProfile.renderRange, dateProfileGenerator);\n return new core.DayTable(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit));\n }\n\n var main = core.createPlugin({\n defaultView: 'dayGridMonth',\n views: {\n dayGrid: DayGridView$1,\n dayGridDay: {\n type: 'dayGrid',\n duration: { days: 1 }\n },\n dayGridWeek: {\n type: 'dayGrid',\n duration: { weeks: 1 }\n },\n dayGridMonth: {\n type: 'dayGrid',\n duration: { months: 1 },\n monthMode: true,\n fixedWeekCount: true\n }\n }\n });\n\n exports.default = main;\n exports.SimpleDayGrid = SimpleDayGrid;\n exports.DayGridSlicer = DayGridSlicer;\n exports.DayGrid = DayGrid;\n exports.AbstractDayGridView = DayGridView;\n exports.DayGridView = DayGridView$1;\n exports.buildBasicDayTable = buildDayTable;\n exports.DayBgRow = DayBgRow;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n","/*!\n@fullcalendar/timegrid v4.0.1\nDocs & License: https://fullcalendar.io/\n(c) 2019 Adam Shaw\n*/\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core'), require('@fullcalendar/daygrid')) :\n typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core', '@fullcalendar/daygrid'], factory) :\n (global = global || self, factory(global.FullCalendarTimeGrid = {}, global.FullCalendar, global.FullCalendarDayGrid));\n}(this, function (exports, core, daygrid) { 'use strict';\n\n /*! *****************************************************************************\r\n Copyright (c) Microsoft Corporation. All rights reserved.\r\n Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\n this file except in compliance with the License. You may obtain a copy of the\r\n License at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\n WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\n MERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\n See the Apache Version 2.0 License for specific language governing permissions\r\n and limitations under the License.\r\n ***************************************************************************** */\r\n /* global Reflect, Promise */\r\n\r\n var extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n };\r\n\r\n function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n }\r\n\r\n var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n };\n\n /*\n Only handles foreground segs.\n Does not own rendering. Use for low-level util methods by TimeGrid.\n */\n var TimeGridEventRenderer = /** @class */ (function (_super) {\n __extends(TimeGridEventRenderer, _super);\n function TimeGridEventRenderer(timeGrid) {\n var _this = _super.call(this, timeGrid.context) || this;\n _this.timeGrid = timeGrid;\n _this.fullTimeFormat = core.createFormatter({\n hour: 'numeric',\n minute: '2-digit',\n separator: _this.context.options.defaultRangeSeparator\n });\n return _this;\n }\n // Given an array of foreground segments, render a DOM element for each, computes position,\n // and attaches to the column inner-container elements.\n TimeGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {\n var segsByCol = this.timeGrid.groupSegsByCol(segs);\n // order the segs within each column\n // TODO: have groupSegsByCol do this?\n for (var col = 0; col < segsByCol.length; col++) {\n segsByCol[col] = this.sortEventSegs(segsByCol[col]);\n }\n this.segsByCol = segsByCol;\n this.timeGrid.attachSegsByCol(segsByCol, this.timeGrid.fgContainerEls);\n };\n TimeGridEventRenderer.prototype.detachSegs = function (segs) {\n segs.forEach(function (seg) {\n core.removeElement(seg.el);\n });\n this.segsByCol = null;\n };\n TimeGridEventRenderer.prototype.computeSegSizes = function (allSegs) {\n var _a = this, timeGrid = _a.timeGrid, segsByCol = _a.segsByCol;\n var colCnt = timeGrid.colCnt;\n timeGrid.computeSegVerticals(allSegs); // horizontals relies on this\n if (segsByCol) {\n for (var col = 0; col < colCnt; col++) {\n this.computeSegHorizontals(segsByCol[col]); // compute horizontal coordinates, z-index's, and reorder the array\n }\n }\n };\n TimeGridEventRenderer.prototype.assignSegSizes = function (allSegs) {\n var _a = this, timeGrid = _a.timeGrid, segsByCol = _a.segsByCol;\n var colCnt = timeGrid.colCnt;\n timeGrid.assignSegVerticals(allSegs); // horizontals relies on this\n if (segsByCol) {\n for (var col = 0; col < colCnt; col++) {\n this.assignSegCss(segsByCol[col]);\n }\n }\n };\n // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined\n TimeGridEventRenderer.prototype.computeEventTimeFormat = function () {\n return {\n hour: 'numeric',\n minute: '2-digit',\n meridiem: false\n };\n };\n // Computes a default `displayEventEnd` value if one is not expliclty defined\n TimeGridEventRenderer.prototype.computeDisplayEventEnd = function () {\n return true;\n };\n // Renders the HTML for a single event segment's default rendering\n TimeGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {\n var eventRange = seg.eventRange;\n var eventDef = eventRange.def;\n var eventUi = eventRange.ui;\n var allDay = eventDef.allDay;\n var isDraggable = eventUi.startEditable;\n var isResizableFromStart = seg.isStart && eventUi.durationEditable && this.context.options.eventResizableFromStart;\n var isResizableFromEnd = seg.isEnd && eventUi.durationEditable;\n var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);\n var skinCss = core.cssToStr(this.getSkinCss(eventUi));\n var timeText;\n var fullTimeText; // more verbose time text. for the print stylesheet\n var startTimeText; // just the start time text\n classes.unshift('fc-time-grid-event');\n // if the event appears to span more than one day...\n if (core.isMultiDayRange(eventRange.range)) {\n // Don't display time text on segments that run entirely through a day.\n // That would appear as midnight-midnight and would look dumb.\n // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am)\n if (seg.isStart || seg.isEnd) {\n var unzonedStart = seg.start;\n var unzonedEnd = seg.end;\n timeText = this._getTimeText(unzonedStart, unzonedEnd, allDay); // TODO: give the timezones\n fullTimeText = this._getTimeText(unzonedStart, unzonedEnd, allDay, this.fullTimeFormat);\n startTimeText = this._getTimeText(unzonedStart, unzonedEnd, allDay, null, false); // displayEnd=false\n }\n }\n else {\n // Display the normal time text for the *event's* times\n timeText = this.getTimeText(eventRange);\n fullTimeText = this.getTimeText(eventRange, this.fullTimeFormat);\n startTimeText = this.getTimeText(eventRange, null, false); // displayEnd=false\n }\n return '
' +\n '
' +\n (timeText ?\n '
' +\n '' + core.htmlEscape(timeText) + '' +\n '
' :\n '') +\n (eventDef.title ?\n '
' +\n core.htmlEscape(eventDef.title) +\n '
' :\n '') +\n '
' +\n /* TODO: write CSS for this\n (isResizableFromStart ?\n '
' :\n ''\n ) +\n */\n (isResizableFromEnd ?\n '
' :\n '') +\n '
';\n };\n // Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.\n // Assumed the segs are already ordered.\n // NOTE: Also reorders the given array by date!\n TimeGridEventRenderer.prototype.computeSegHorizontals = function (segs) {\n var levels;\n var level0;\n var i;\n levels = buildSlotSegLevels(segs);\n computeForwardSlotSegs(levels);\n if ((level0 = levels[0])) {\n for (i = 0; i < level0.length; i++) {\n computeSlotSegPressures(level0[i]);\n }\n for (i = 0; i < level0.length; i++) {\n this.computeSegForwardBack(level0[i], 0, 0);\n }\n }\n };\n // Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range\n // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to \"left\" and\n // seg.forwardCoord maps to \"right\" (via percentage). Vice-versa if the calendar is right-to-left.\n //\n // The segment might be part of a \"series\", which means consecutive segments with the same pressure\n // who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of\n // segments behind this one in the current series, and `seriesBackwardCoord` is the starting\n // coordinate of the first segment in the series.\n TimeGridEventRenderer.prototype.computeSegForwardBack = function (seg, seriesBackwardPressure, seriesBackwardCoord) {\n var forwardSegs = seg.forwardSegs;\n var i;\n if (seg.forwardCoord === undefined) { // not already computed\n if (!forwardSegs.length) {\n // if there are no forward segments, this segment should butt up against the edge\n seg.forwardCoord = 1;\n }\n else {\n // sort highest pressure first\n this.sortForwardSegs(forwardSegs);\n // this segment's forwardCoord will be calculated from the backwardCoord of the\n // highest-pressure forward segment.\n this.computeSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord);\n seg.forwardCoord = forwardSegs[0].backwardCoord;\n }\n // calculate the backwardCoord from the forwardCoord. consider the series\n seg.backwardCoord = seg.forwardCoord -\n (seg.forwardCoord - seriesBackwardCoord) / // available width for series\n (seriesBackwardPressure + 1); // # of segments in the series\n // use this segment's coordinates to computed the coordinates of the less-pressurized\n // forward segments\n for (i = 0; i < forwardSegs.length; i++) {\n this.computeSegForwardBack(forwardSegs[i], 0, seg.forwardCoord);\n }\n }\n };\n TimeGridEventRenderer.prototype.sortForwardSegs = function (forwardSegs) {\n var objs = forwardSegs.map(buildTimeGridSegCompareObj);\n var specs = [\n // put higher-pressure first\n { field: 'forwardPressure', order: -1 },\n // put segments that are closer to initial edge first (and favor ones with no coords yet)\n { field: 'backwardCoord', order: 1 }\n ].concat(this.context.view.eventOrderSpecs);\n objs.sort(function (obj0, obj1) {\n return core.compareByFieldSpecs(obj0, obj1, specs);\n });\n return objs.map(function (c) {\n return c._seg;\n });\n };\n // Given foreground event segments that have already had their position coordinates computed,\n // assigns position-related CSS values to their elements.\n TimeGridEventRenderer.prototype.assignSegCss = function (segs) {\n for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {\n var seg = segs_1[_i];\n core.applyStyle(seg.el, this.generateSegCss(seg));\n if (seg.level > 0) {\n seg.el.classList.add('fc-time-grid-event-inset');\n }\n // if the event is short that the title will be cut off,\n // attach a className that condenses the title into the time area.\n if (seg.eventRange.def.title && seg.bottom - seg.top < 30) {\n seg.el.classList.add('fc-short'); // TODO: \"condensed\" is a better name\n }\n }\n };\n // Generates an object with CSS properties/values that should be applied to an event segment element.\n // Contains important positioning-related properties that should be applied to any event element, customized or not.\n TimeGridEventRenderer.prototype.generateSegCss = function (seg) {\n var shouldOverlap = this.context.options.slotEventOverlap;\n var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point\n var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point\n var props = this.timeGrid.generateSegVerticalCss(seg); // get top/bottom first\n var isRtl = this.timeGrid.isRtl;\n var left; // amount of space from left edge, a fraction of the total width\n var right; // amount of space from right edge, a fraction of the total width\n if (shouldOverlap) {\n // double the width, but don't go beyond the maximum forward coordinate (1.0)\n forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2);\n }\n if (isRtl) {\n left = 1 - forwardCoord;\n right = backwardCoord;\n }\n else {\n left = backwardCoord;\n right = 1 - forwardCoord;\n }\n props.zIndex = seg.level + 1; // convert from 0-base to 1-based\n props.left = left * 100 + '%';\n props.right = right * 100 + '%';\n if (shouldOverlap && seg.forwardPressure) {\n // add padding to the edge so that forward stacked events don't cover the resizer's icon\n props[isRtl ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width\n }\n return props;\n };\n return TimeGridEventRenderer;\n }(core.FgEventRenderer));\n // Builds an array of segments \"levels\". The first level will be the leftmost tier of segments if the calendar is\n // left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date.\n function buildSlotSegLevels(segs) {\n var levels = [];\n var i;\n var seg;\n var j;\n for (i = 0; i < segs.length; i++) {\n seg = segs[i];\n // go through all the levels and stop on the first level where there are no collisions\n for (j = 0; j < levels.length; j++) {\n if (!computeSlotSegCollisions(seg, levels[j]).length) {\n break;\n }\n }\n seg.level = j;\n (levels[j] || (levels[j] = [])).push(seg);\n }\n return levels;\n }\n // For every segment, figure out the other segments that are in subsequent\n // levels that also occupy the same vertical space. Accumulate in seg.forwardSegs\n function computeForwardSlotSegs(levels) {\n var i;\n var level;\n var j;\n var seg;\n var k;\n for (i = 0; i < levels.length; i++) {\n level = levels[i];\n for (j = 0; j < level.length; j++) {\n seg = level[j];\n seg.forwardSegs = [];\n for (k = i + 1; k < levels.length; k++) {\n computeSlotSegCollisions(seg, levels[k], seg.forwardSegs);\n }\n }\n }\n }\n // Figure out which path forward (via seg.forwardSegs) results in the longest path until\n // the furthest edge is reached. The number of segments in this path will be seg.forwardPressure\n function computeSlotSegPressures(seg) {\n var forwardSegs = seg.forwardSegs;\n var forwardPressure = 0;\n var i;\n var forwardSeg;\n if (seg.forwardPressure === undefined) { // not already computed\n for (i = 0; i < forwardSegs.length; i++) {\n forwardSeg = forwardSegs[i];\n // figure out the child's maximum forward path\n computeSlotSegPressures(forwardSeg);\n // either use the existing maximum, or use the child's forward pressure\n // plus one (for the forwardSeg itself)\n forwardPressure = Math.max(forwardPressure, 1 + forwardSeg.forwardPressure);\n }\n seg.forwardPressure = forwardPressure;\n }\n }\n // Find all the segments in `otherSegs` that vertically collide with `seg`.\n // Append into an optionally-supplied `results` array and return.\n function computeSlotSegCollisions(seg, otherSegs, results) {\n if (results === void 0) { results = []; }\n for (var i = 0; i < otherSegs.length; i++) {\n if (isSlotSegCollision(seg, otherSegs[i])) {\n results.push(otherSegs[i]);\n }\n }\n return results;\n }\n // Do these segments occupy the same vertical space?\n function isSlotSegCollision(seg1, seg2) {\n return seg1.bottom > seg2.top && seg1.top < seg2.bottom;\n }\n function buildTimeGridSegCompareObj(seg) {\n var obj = core.buildSegCompareObj(seg);\n obj.forwardPressure = seg.forwardPressure;\n obj.backwardCoord = seg.backwardCoord;\n return obj;\n }\n\n var TimeGridMirrorRenderer = /** @class */ (function (_super) {\n __extends(TimeGridMirrorRenderer, _super);\n function TimeGridMirrorRenderer() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n TimeGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {\n this.segsByCol = this.timeGrid.groupSegsByCol(segs);\n this.timeGrid.attachSegsByCol(this.segsByCol, this.timeGrid.mirrorContainerEls);\n this.sourceSeg = mirrorInfo.sourceSeg;\n };\n TimeGridMirrorRenderer.prototype.generateSegCss = function (seg) {\n var props = _super.prototype.generateSegCss.call(this, seg);\n var sourceSeg = this.sourceSeg;\n if (sourceSeg && sourceSeg.col === seg.col) {\n var sourceSegProps = _super.prototype.generateSegCss.call(this, sourceSeg);\n props.left = sourceSegProps.left;\n props.right = sourceSegProps.right;\n props.marginLeft = sourceSegProps.marginLeft;\n props.marginRight = sourceSegProps.marginRight;\n }\n return props;\n };\n return TimeGridMirrorRenderer;\n }(TimeGridEventRenderer));\n\n var TimeGridFillRenderer = /** @class */ (function (_super) {\n __extends(TimeGridFillRenderer, _super);\n function TimeGridFillRenderer(timeGrid) {\n var _this = _super.call(this, timeGrid.context) || this;\n _this.timeGrid = timeGrid;\n return _this;\n }\n TimeGridFillRenderer.prototype.attachSegs = function (type, segs) {\n var timeGrid = this.timeGrid;\n var containerEls;\n // TODO: more efficient lookup\n if (type === 'bgEvent') {\n containerEls = timeGrid.bgContainerEls;\n }\n else if (type === 'businessHours') {\n containerEls = timeGrid.businessContainerEls;\n }\n else if (type === 'highlight') {\n containerEls = timeGrid.highlightContainerEls;\n }\n timeGrid.attachSegsByCol(timeGrid.groupSegsByCol(segs), containerEls);\n return segs.map(function (seg) {\n return seg.el;\n });\n };\n TimeGridFillRenderer.prototype.computeSegSizes = function (segs) {\n this.timeGrid.computeSegVerticals(segs);\n };\n TimeGridFillRenderer.prototype.assignSegSizes = function (segs) {\n this.timeGrid.assignSegVerticals(segs);\n };\n return TimeGridFillRenderer;\n }(core.FillRenderer));\n\n /* A component that renders one or more columns of vertical time slots\n ----------------------------------------------------------------------------------------------------------------------*/\n // potential nice values for the slot-duration and interval-duration\n // from largest to smallest\n var AGENDA_STOCK_SUB_DURATIONS = [\n { hours: 1 },\n { minutes: 30 },\n { minutes: 15 },\n { seconds: 30 },\n { seconds: 15 }\n ];\n var TimeGrid = /** @class */ (function (_super) {\n __extends(TimeGrid, _super);\n function TimeGrid(context, el, renderProps) {\n var _this = _super.call(this, context, el) || this;\n _this.isSlatSizesDirty = false;\n _this.isColSizesDirty = false;\n _this.renderSlats = core.memoizeRendering(_this._renderSlats);\n var eventRenderer = _this.eventRenderer = new TimeGridEventRenderer(_this);\n var fillRenderer = _this.fillRenderer = new TimeGridFillRenderer(_this);\n _this.mirrorRenderer = new TimeGridMirrorRenderer(_this);\n var renderColumns = _this.renderColumns = core.memoizeRendering(_this._renderColumns, _this._unrenderColumns);\n _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderColumns]);\n _this.renderDateSelection = core.memoizeRendering(_this._renderDateSelection, _this._unrenderDateSelection, [renderColumns]);\n _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderColumns]);\n _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderColumns]);\n _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);\n _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderColumns]);\n _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderColumns]);\n _this.processOptions();\n el.innerHTML =\n '
' +\n '
' +\n '
';\n _this.rootBgContainerEl = el.querySelector('.fc-bg');\n _this.slatContainerEl = el.querySelector('.fc-slats');\n _this.bottomRuleEl = el.querySelector('.fc-divider');\n _this.renderProps = renderProps;\n return _this;\n }\n /* Options\n ------------------------------------------------------------------------------------------------------------------*/\n // Parses various options into properties of this object\n TimeGrid.prototype.processOptions = function () {\n var slotDuration = this.opt('slotDuration');\n var snapDuration = this.opt('snapDuration');\n var snapsPerSlot;\n var input;\n slotDuration = core.createDuration(slotDuration);\n snapDuration = snapDuration ? core.createDuration(snapDuration) : slotDuration;\n snapsPerSlot = core.wholeDivideDurations(slotDuration, snapDuration);\n if (snapsPerSlot === null) {\n snapDuration = slotDuration;\n snapsPerSlot = 1;\n // TODO: say warning?\n }\n this.slotDuration = slotDuration;\n this.snapDuration = snapDuration;\n this.snapsPerSlot = snapsPerSlot;\n // might be an array value (for TimelineView).\n // if so, getting the most granular entry (the last one probably).\n input = this.opt('slotLabelFormat');\n if (Array.isArray(input)) {\n input = input[input.length - 1];\n }\n this.labelFormat = core.createFormatter(input || {\n hour: 'numeric',\n minute: '2-digit',\n omitZeroMinute: true,\n meridiem: 'short'\n });\n input = this.opt('slotLabelInterval');\n this.labelInterval = input ?\n core.createDuration(input) :\n this.computeLabelInterval(slotDuration);\n };\n // Computes an automatic value for slotLabelInterval\n TimeGrid.prototype.computeLabelInterval = function (slotDuration) {\n var i;\n var labelInterval;\n var slotsPerLabel;\n // find the smallest stock label interval that results in more than one slots-per-label\n for (i = AGENDA_STOCK_SUB_DURATIONS.length - 1; i >= 0; i--) {\n labelInterval = core.createDuration(AGENDA_STOCK_SUB_DURATIONS[i]);\n slotsPerLabel = core.wholeDivideDurations(labelInterval, slotDuration);\n if (slotsPerLabel !== null && slotsPerLabel > 1) {\n return labelInterval;\n }\n }\n return slotDuration; // fall back\n };\n /* Rendering\n ------------------------------------------------------------------------------------------------------------------*/\n TimeGrid.prototype.render = function (props) {\n var cells = props.cells;\n this.colCnt = cells.length;\n this.renderSlats(props.dateProfile);\n this.renderColumns(props.cells, props.dateProfile);\n this.renderBusinessHours(props.businessHourSegs);\n this.renderDateSelection(props.dateSelectionSegs);\n this.renderFgEvents(props.fgEventSegs);\n this.renderBgEvents(props.bgEventSegs);\n this.renderEventSelection(props.eventSelection);\n this.renderEventDrag(props.eventDrag);\n this.renderEventResize(props.eventResize);\n };\n TimeGrid.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n // should unrender everything else too\n this.renderSlats.unrender();\n this.renderColumns.unrender();\n };\n TimeGrid.prototype.updateSize = function (isResize) {\n var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;\n if (isResize || this.isSlatSizesDirty) {\n this.buildSlatPositions();\n this.isSlatSizesDirty = false;\n }\n if (isResize || this.isColSizesDirty) {\n this.buildColPositions();\n this.isColSizesDirty = false;\n }\n fillRenderer.computeSizes(isResize);\n eventRenderer.computeSizes(isResize);\n mirrorRenderer.computeSizes(isResize);\n fillRenderer.assignSizes(isResize);\n eventRenderer.assignSizes(isResize);\n mirrorRenderer.assignSizes(isResize);\n };\n TimeGrid.prototype._renderSlats = function (dateProfile) {\n var theme = this.theme;\n this.slatContainerEl.innerHTML =\n '' +\n this.renderSlatRowHtml(dateProfile) +\n '
';\n this.slatEls = core.findElements(this.slatContainerEl, 'tr');\n this.slatPositions = new core.PositionCache(this.el, this.slatEls, false, true // vertical\n );\n this.isSlatSizesDirty = true;\n };\n // Generates the HTML for the horizontal \"slats\" that run width-wise. Has a time axis on a side. Depends on RTL.\n TimeGrid.prototype.renderSlatRowHtml = function (dateProfile) {\n var _a = this, dateEnv = _a.dateEnv, theme = _a.theme, isRtl = _a.isRtl;\n var html = '';\n var dayStart = core.startOfDay(dateProfile.renderRange.start);\n var slotTime = dateProfile.minTime;\n var slotIterator = core.createDuration(0);\n var slotDate; // will be on the view's first day, but we only care about its time\n var isLabeled;\n var axisHtml;\n // Calculate the time for each slot\n while (core.asRoughMs(slotTime) < core.asRoughMs(dateProfile.maxTime)) {\n slotDate = dateEnv.add(dayStart, slotTime);\n isLabeled = core.wholeDivideDurations(slotIterator, this.labelInterval) !== null;\n axisHtml =\n '' +\n (isLabeled ?\n '' + // for matchCellWidths\n core.htmlEscape(dateEnv.format(slotDate, this.labelFormat)) +\n '' :\n '') +\n '';\n html +=\n '' +\n (!isRtl ? axisHtml : '') +\n '' +\n (isRtl ? axisHtml : '') +\n '';\n slotTime = core.addDurations(slotTime, this.slotDuration);\n slotIterator = core.addDurations(slotIterator, this.slotDuration);\n }\n return html;\n };\n TimeGrid.prototype._renderColumns = function (cells, dateProfile) {\n var theme = this.theme;\n var bgRow = new daygrid.DayBgRow(this.context);\n this.rootBgContainerEl.innerHTML =\n '' +\n bgRow.renderHtml({\n cells: cells,\n dateProfile: dateProfile,\n renderIntroHtml: this.renderProps.renderBgIntroHtml\n }) +\n '
';\n this.colEls = core.findElements(this.el, '.fc-day, .fc-disabled-day');\n if (this.isRtl) {\n this.colEls.reverse();\n }\n this.colPositions = new core.PositionCache(this.el, this.colEls, true, // horizontal\n false);\n this.renderContentSkeleton();\n this.isColSizesDirty = true;\n };\n TimeGrid.prototype._unrenderColumns = function () {\n this.unrenderContentSkeleton();\n };\n /* Content Skeleton\n ------------------------------------------------------------------------------------------------------------------*/\n // Renders the DOM that the view's content will live in\n TimeGrid.prototype.renderContentSkeleton = function () {\n var parts = [];\n var skeletonEl;\n parts.push(this.renderProps.renderIntroHtml());\n for (var i = 0; i < this.colCnt; i++) {\n parts.push('' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '');\n }\n if (this.isRtl) {\n parts.reverse();\n }\n skeletonEl = this.contentSkeletonEl = core.htmlToElement('
' +\n '' +\n '' + parts.join('') + '' +\n '
' +\n '
');\n this.colContainerEls = core.findElements(skeletonEl, '.fc-content-col');\n this.mirrorContainerEls = core.findElements(skeletonEl, '.fc-mirror-container');\n this.fgContainerEls = core.findElements(skeletonEl, '.fc-event-container:not(.fc-mirror-container)');\n this.bgContainerEls = core.findElements(skeletonEl, '.fc-bgevent-container');\n this.highlightContainerEls = core.findElements(skeletonEl, '.fc-highlight-container');\n this.businessContainerEls = core.findElements(skeletonEl, '.fc-business-container');\n if (this.isRtl) {\n this.colContainerEls.reverse();\n this.mirrorContainerEls.reverse();\n this.fgContainerEls.reverse();\n this.bgContainerEls.reverse();\n this.highlightContainerEls.reverse();\n this.businessContainerEls.reverse();\n }\n this.el.appendChild(skeletonEl);\n };\n TimeGrid.prototype.unrenderContentSkeleton = function () {\n core.removeElement(this.contentSkeletonEl);\n };\n // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col\n TimeGrid.prototype.groupSegsByCol = function (segs) {\n var segsByCol = [];\n var i;\n for (i = 0; i < this.colCnt; i++) {\n segsByCol.push([]);\n }\n for (i = 0; i < segs.length; i++) {\n segsByCol[segs[i].col].push(segs[i]);\n }\n return segsByCol;\n };\n // Given segments grouped by column, insert the segments' elements into a parallel array of container\n // elements, each living within a column.\n TimeGrid.prototype.attachSegsByCol = function (segsByCol, containerEls) {\n var col;\n var segs;\n var i;\n for (col = 0; col < this.colCnt; col++) { // iterate each column grouping\n segs = segsByCol[col];\n for (i = 0; i < segs.length; i++) {\n containerEls[col].appendChild(segs[i].el);\n }\n }\n };\n /* Now Indicator\n ------------------------------------------------------------------------------------------------------------------*/\n TimeGrid.prototype.getNowIndicatorUnit = function () {\n return 'minute'; // will refresh on the minute\n };\n TimeGrid.prototype.renderNowIndicator = function (segs, date) {\n // HACK: if date columns not ready for some reason (scheduler)\n if (!this.colContainerEls) {\n return;\n }\n var top = this.computeDateTop(date);\n var nodes = [];\n var i;\n // render lines within the columns\n for (i = 0; i < segs.length; i++) {\n var lineEl = core.createElement('div', { className: 'fc-now-indicator fc-now-indicator-line' });\n lineEl.style.top = top + 'px';\n this.colContainerEls[segs[i].col].appendChild(lineEl);\n nodes.push(lineEl);\n }\n // render an arrow over the axis\n if (segs.length > 0) { // is the current time in view?\n var arrowEl = core.createElement('div', { className: 'fc-now-indicator fc-now-indicator-arrow' });\n arrowEl.style.top = top + 'px';\n this.contentSkeletonEl.appendChild(arrowEl);\n nodes.push(arrowEl);\n }\n this.nowIndicatorEls = nodes;\n };\n TimeGrid.prototype.unrenderNowIndicator = function () {\n if (this.nowIndicatorEls) {\n this.nowIndicatorEls.forEach(core.removeElement);\n this.nowIndicatorEls = null;\n }\n };\n /* Coordinates\n ------------------------------------------------------------------------------------------------------------------*/\n TimeGrid.prototype.getTotalSlatHeight = function () {\n return this.slatContainerEl.offsetHeight;\n };\n // Computes the top coordinate, relative to the bounds of the grid, of the given date.\n // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.\n TimeGrid.prototype.computeDateTop = function (when, startOfDayDate) {\n if (!startOfDayDate) {\n startOfDayDate = core.startOfDay(when);\n }\n return this.computeTimeTop(when.valueOf() - startOfDayDate.valueOf());\n };\n // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).\n TimeGrid.prototype.computeTimeTop = function (timeMs) {\n var len = this.slatEls.length;\n var dateProfile = this.props.dateProfile;\n var slatCoverage = (timeMs - core.asRoughMs(dateProfile.minTime)) / core.asRoughMs(this.slotDuration); // floating-point value of # of slots covered\n var slatIndex;\n var slatRemainder;\n // compute a floating-point number for how many slats should be progressed through.\n // from 0 to number of slats (inclusive)\n // constrained because minTime/maxTime might be customized.\n slatCoverage = Math.max(0, slatCoverage);\n slatCoverage = Math.min(len, slatCoverage);\n // an integer index of the furthest whole slat\n // from 0 to number slats (*exclusive*, so len-1)\n slatIndex = Math.floor(slatCoverage);\n slatIndex = Math.min(slatIndex, len - 1);\n // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.\n // could be 1.0 if slatCoverage is covering *all* the slots\n slatRemainder = slatCoverage - slatIndex;\n return this.slatPositions.tops[slatIndex] +\n this.slatPositions.getHeight(slatIndex) * slatRemainder;\n };\n // For each segment in an array, computes and assigns its top and bottom properties\n TimeGrid.prototype.computeSegVerticals = function (segs) {\n var eventMinHeight = this.opt('timeGridEventMinHeight');\n var i;\n var seg;\n var dayDate;\n for (i = 0; i < segs.length; i++) {\n seg = segs[i];\n dayDate = this.props.cells[seg.col].date;\n seg.top = this.computeDateTop(seg.start, dayDate);\n seg.bottom = Math.max(seg.top + eventMinHeight, this.computeDateTop(seg.end, dayDate));\n }\n };\n // Given segments that already have their top/bottom properties computed, applies those values to\n // the segments' elements.\n TimeGrid.prototype.assignSegVerticals = function (segs) {\n var i;\n var seg;\n for (i = 0; i < segs.length; i++) {\n seg = segs[i];\n core.applyStyle(seg.el, this.generateSegVerticalCss(seg));\n }\n };\n // Generates an object with CSS properties for the top/bottom coordinates of a segment element\n TimeGrid.prototype.generateSegVerticalCss = function (seg) {\n return {\n top: seg.top,\n bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container\n };\n };\n /* Sizing\n ------------------------------------------------------------------------------------------------------------------*/\n TimeGrid.prototype.buildColPositions = function () {\n this.colPositions.build();\n };\n TimeGrid.prototype.buildSlatPositions = function () {\n this.slatPositions.build();\n };\n /* Hit System\n ------------------------------------------------------------------------------------------------------------------*/\n TimeGrid.prototype.positionToHit = function (positionLeft, positionTop) {\n var _a = this, dateEnv = _a.dateEnv, snapsPerSlot = _a.snapsPerSlot, slatPositions = _a.slatPositions, colPositions = _a.colPositions;\n var colIndex = colPositions.leftToIndex(positionLeft);\n var slatIndex = slatPositions.topToIndex(positionTop);\n if (colIndex != null && slatIndex != null) {\n var slatTop = slatPositions.tops[slatIndex];\n var slatHeight = slatPositions.getHeight(slatIndex);\n var partial = (positionTop - slatTop) / slatHeight; // floating point number between 0 and 1\n var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat\n var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;\n var dayDate = this.props.cells[colIndex].date;\n var time = core.addDurations(this.props.dateProfile.minTime, core.multiplyDuration(this.snapDuration, snapIndex));\n var start = dateEnv.add(dayDate, time);\n var end = dateEnv.add(start, this.snapDuration);\n return {\n col: colIndex,\n dateSpan: {\n range: { start: start, end: end },\n allDay: false\n },\n dayEl: this.colEls[colIndex],\n relativeRect: {\n left: colPositions.lefts[colIndex],\n right: colPositions.rights[colIndex],\n top: slatTop,\n bottom: slatTop + slatHeight\n }\n };\n }\n };\n /* Event Drag Visualization\n ------------------------------------------------------------------------------------------------------------------*/\n TimeGrid.prototype._renderEventDrag = function (state) {\n if (state) {\n this.eventRenderer.hideByHash(state.affectedInstances);\n if (state.isEvent) {\n this.mirrorRenderer.renderSegs(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });\n }\n else {\n this.fillRenderer.renderSegs('highlight', state.segs);\n }\n }\n };\n TimeGrid.prototype._unrenderEventDrag = function (state) {\n if (state) {\n this.eventRenderer.showByHash(state.affectedInstances);\n this.mirrorRenderer.unrender(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });\n this.fillRenderer.unrender('highlight');\n }\n };\n /* Event Resize Visualization\n ------------------------------------------------------------------------------------------------------------------*/\n TimeGrid.prototype._renderEventResize = function (state) {\n if (state) {\n this.eventRenderer.hideByHash(state.affectedInstances);\n this.mirrorRenderer.renderSegs(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });\n }\n };\n TimeGrid.prototype._unrenderEventResize = function (state) {\n if (state) {\n this.eventRenderer.showByHash(state.affectedInstances);\n this.mirrorRenderer.unrender(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });\n }\n };\n /* Selection\n ------------------------------------------------------------------------------------------------------------------*/\n // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight.\n TimeGrid.prototype._renderDateSelection = function (segs) {\n if (segs) {\n if (this.opt('selectMirror')) {\n this.mirrorRenderer.renderSegs(segs, { isSelecting: true });\n }\n else {\n this.fillRenderer.renderSegs('highlight', segs);\n }\n }\n };\n TimeGrid.prototype._unrenderDateSelection = function (segs) {\n this.mirrorRenderer.unrender(segs, { isSelecting: true });\n this.fillRenderer.unrender('highlight');\n };\n return TimeGrid;\n }(core.DateComponent));\n\n var AllDaySplitter = /** @class */ (function (_super) {\n __extends(AllDaySplitter, _super);\n function AllDaySplitter() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n AllDaySplitter.prototype.getKeyInfo = function () {\n return {\n allDay: {},\n timed: {}\n };\n };\n AllDaySplitter.prototype.getKeysForDateSpan = function (dateSpan) {\n if (dateSpan.allDay) {\n return ['allDay'];\n }\n else {\n return ['timed'];\n }\n };\n AllDaySplitter.prototype.getKeysForEventDef = function (eventDef) {\n if (!eventDef.allDay) {\n return ['timed'];\n }\n else if (core.hasBgRendering(eventDef)) {\n return ['timed', 'allDay'];\n }\n else {\n return ['allDay'];\n }\n };\n return AllDaySplitter;\n }(core.Splitter));\n\n var TIMEGRID_ALL_DAY_EVENT_LIMIT = 5;\n var WEEK_HEADER_FORMAT = core.createFormatter({ week: 'short' });\n /* An abstract class for all timegrid-related views. Displays one more columns with time slots running vertically.\n ----------------------------------------------------------------------------------------------------------------------*/\n // Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on).\n // Responsible for managing width/height.\n var TimeGridView = /** @class */ (function (_super) {\n __extends(TimeGridView, _super);\n function TimeGridView(context, viewSpec, dateProfileGenerator, parentEl) {\n var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;\n _this.splitter = new AllDaySplitter();\n /* Header Render Methods\n ------------------------------------------------------------------------------------------------------------------*/\n // Generates the HTML that will go before the day-of week header cells\n _this.renderHeadIntroHtml = function () {\n var _a = _this, theme = _a.theme, dateEnv = _a.dateEnv;\n var range = _this.props.dateProfile.renderRange;\n var dayCnt = core.diffDays(range.start, range.end);\n var weekText;\n if (_this.opt('weekNumbers')) {\n weekText = dateEnv.format(range.start, WEEK_HEADER_FORMAT);\n return '' +\n '' +\n core.buildGotoAnchorHtml(// aside from link, important for matchCellWidths\n _this, { date: range.start, type: 'week', forceOff: dayCnt > 1 }, core.htmlEscape(weekText) // inner HTML\n ) +\n '';\n }\n else {\n return '';\n }\n };\n /* Time Grid Render Methods\n ------------------------------------------------------------------------------------------------------------------*/\n // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column.\n _this.renderTimeGridBgIntroHtml = function () {\n var theme = _this.theme;\n return '';\n };\n // Generates the HTML that goes before all other types of cells.\n // Affects content-skeleton, mirror-skeleton, highlight-skeleton for both the time-grid and day-grid.\n _this.renderTimeGridIntroHtml = function () {\n return '';\n };\n /* Day Grid Render Methods\n ------------------------------------------------------------------------------------------------------------------*/\n // Generates the HTML that goes before the all-day cells\n _this.renderDayGridBgIntroHtml = function () {\n var theme = _this.theme;\n return '' +\n '' +\n '' + // needed for matchCellWidths\n core.getAllDayHtml(_this) +\n '' +\n '';\n };\n // Generates the HTML that goes before all other types of cells.\n // Affects content-skeleton, mirror-skeleton, highlight-skeleton for both the time-grid and day-grid.\n _this.renderDayGridIntroHtml = function () {\n return '';\n };\n _this.el.classList.add('fc-timeGrid-view');\n _this.el.innerHTML = _this.renderSkeletonHtml();\n _this.scroller = new core.ScrollComponent('hidden', // overflow x\n 'auto' // overflow y\n );\n var timeGridWrapEl = _this.scroller.el;\n _this.el.querySelector('.fc-body > tr > td').appendChild(timeGridWrapEl);\n timeGridWrapEl.classList.add('fc-time-grid-container');\n var timeGridEl = core.createElement('div', { className: 'fc-time-grid' });\n timeGridWrapEl.appendChild(timeGridEl);\n _this.timeGrid = new TimeGrid(_this.context, timeGridEl, {\n renderBgIntroHtml: _this.renderTimeGridBgIntroHtml,\n renderIntroHtml: _this.renderTimeGridIntroHtml\n });\n if (_this.opt('allDaySlot')) { // should we display the \"all-day\" area?\n _this.dayGrid = new daygrid.DayGrid(// the all-day subcomponent of this view\n _this.context, _this.el.querySelector('.fc-day-grid'), {\n renderNumberIntroHtml: _this.renderDayGridIntroHtml,\n renderBgIntroHtml: _this.renderDayGridBgIntroHtml,\n renderIntroHtml: _this.renderDayGridIntroHtml,\n colWeekNumbersVisible: false,\n cellWeekNumbersVisible: false\n });\n // have the day-grid extend it's coordinate area over the
dividing the two grids\n _this.dayGrid.bottomCoordPadding = _this.el.querySelector('.fc-divider').offsetHeight;\n }\n return _this;\n }\n TimeGridView.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n this.timeGrid.destroy();\n if (this.dayGrid) {\n this.dayGrid.destroy();\n }\n this.scroller.destroy();\n };\n /* Rendering\n ------------------------------------------------------------------------------------------------------------------*/\n // Builds the HTML skeleton for the view.\n // The day-grid and time-grid components will render inside containers defined by this HTML.\n TimeGridView.prototype.renderSkeletonHtml = function () {\n var theme = this.theme;\n return '' +\n '' +\n (this.opt('columnHeader') ?\n '' +\n '' +\n '' +\n '' +\n '' :\n '') +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
 
' +\n (this.opt('allDaySlot') ?\n '
' +\n '
' :\n '') +\n '
';\n };\n /* Now Indicator\n ------------------------------------------------------------------------------------------------------------------*/\n TimeGridView.prototype.getNowIndicatorUnit = function () {\n return this.timeGrid.getNowIndicatorUnit();\n };\n // subclasses should implement\n // renderNowIndicator(date: DateMarker) {\n // }\n TimeGridView.prototype.unrenderNowIndicator = function () {\n this.timeGrid.unrenderNowIndicator();\n };\n /* Dimensions\n ------------------------------------------------------------------------------------------------------------------*/\n TimeGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {\n _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first\n this.timeGrid.updateSize(isResize);\n if (this.dayGrid) {\n this.dayGrid.updateSize(isResize);\n }\n };\n // Adjusts the vertical dimensions of the view to the specified values\n TimeGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {\n var _this = this;\n var eventLimit;\n var scrollerHeight;\n var scrollbarWidths;\n // make all axis cells line up\n this.axisWidth = core.matchCellWidths(core.findElements(this.el, '.fc-axis'));\n // hack to give the view some height prior to timeGrid's columns being rendered\n // TODO: separate setting height from scroller VS timeGrid.\n if (!this.timeGrid.colEls) {\n if (!isAuto) {\n scrollerHeight = this.computeScrollerHeight(viewHeight);\n this.scroller.setHeight(scrollerHeight);\n }\n return;\n }\n // set of fake row elements that must compensate when scroller has scrollbars\n var noScrollRowEls = core.findElements(this.el, '.fc-row').filter(function (node) {\n return !_this.scroller.el.contains(node);\n });\n // reset all dimensions back to the original state\n this.timeGrid.bottomRuleEl.style.display = 'none'; // will be shown later if this
is necessary\n this.scroller.clear(); // sets height to 'auto' and clears overflow\n noScrollRowEls.forEach(core.uncompensateScroll);\n // limit number of events in the all-day area\n if (this.dayGrid) {\n this.dayGrid.removeSegPopover(); // kill the \"more\" popover if displayed\n eventLimit = this.opt('eventLimit');\n if (eventLimit && typeof eventLimit !== 'number') {\n eventLimit = TIMEGRID_ALL_DAY_EVENT_LIMIT; // make sure \"auto\" goes to a real number\n }\n if (eventLimit) {\n this.dayGrid.limitRows(eventLimit);\n }\n }\n if (!isAuto) { // should we force dimensions of the scroll container?\n scrollerHeight = this.computeScrollerHeight(viewHeight);\n this.scroller.setHeight(scrollerHeight);\n scrollbarWidths = this.scroller.getScrollbarWidths();\n if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?\n // make the all-day and header rows lines up\n noScrollRowEls.forEach(function (rowEl) {\n core.compensateScroll(rowEl, scrollbarWidths);\n });\n // the scrollbar compensation might have changed text flow, which might affect height, so recalculate\n // and reapply the desired height to the scroller.\n scrollerHeight = this.computeScrollerHeight(viewHeight);\n this.scroller.setHeight(scrollerHeight);\n }\n // guarantees the same scrollbar widths\n this.scroller.lockOverflow(scrollbarWidths);\n // if there's any space below the slats, show the horizontal rule.\n // this won't cause any new overflow, because lockOverflow already called.\n if (this.timeGrid.getTotalSlatHeight() < scrollerHeight) {\n this.timeGrid.bottomRuleEl.style.display = '';\n }\n }\n };\n // given a desired total height of the view, returns what the height of the scroller should be\n TimeGridView.prototype.computeScrollerHeight = function (viewHeight) {\n return viewHeight -\n core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller\n };\n /* Scroll\n ------------------------------------------------------------------------------------------------------------------*/\n // Computes the initial pre-configured scroll state prior to allowing the user to change it\n TimeGridView.prototype.computeInitialDateScroll = function () {\n var scrollTime = core.createDuration(this.opt('scrollTime'));\n var top = this.timeGrid.computeTimeTop(scrollTime.milliseconds);\n // zoom can give weird floating-point values. rather scroll a little bit further\n top = Math.ceil(top);\n if (top) {\n top++; // to overcome top border that slots beyond the first have. looks better\n }\n return { top: top };\n };\n TimeGridView.prototype.queryDateScroll = function () {\n return { top: this.scroller.getScrollTop() };\n };\n TimeGridView.prototype.applyDateScroll = function (scroll) {\n if (scroll.top !== undefined) {\n this.scroller.setScrollTop(scroll.top);\n }\n };\n // Generates an HTML attribute string for setting the width of the axis, if it is known\n TimeGridView.prototype.axisStyleAttr = function () {\n if (this.axisWidth != null) {\n return 'style=\"width:' + this.axisWidth + 'px\"';\n }\n return '';\n };\n return TimeGridView;\n }(core.View));\n TimeGridView.prototype.usesMinMaxTime = true; // indicates that minTime/maxTime affects rendering\n\n var SimpleTimeGrid = /** @class */ (function (_super) {\n __extends(SimpleTimeGrid, _super);\n function SimpleTimeGrid(context, timeGrid) {\n var _this = _super.call(this, context, timeGrid.el) || this;\n _this.buildDayRanges = core.memoize(buildDayRanges);\n _this.slicer = new TimeGridSlicer();\n _this.timeGrid = timeGrid;\n context.calendar.registerInteractiveComponent(_this, {\n el: _this.timeGrid.el\n });\n return _this;\n }\n SimpleTimeGrid.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n this.calendar.unregisterInteractiveComponent(this);\n };\n SimpleTimeGrid.prototype.render = function (props) {\n var dateProfile = props.dateProfile, dayTable = props.dayTable;\n var dayRanges = this.dayRanges = this.buildDayRanges(dayTable, dateProfile, this.dateEnv);\n this.timeGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, null, this.timeGrid, dayRanges), { dateProfile: dateProfile, cells: dayTable.cells[0] }));\n };\n SimpleTimeGrid.prototype.renderNowIndicator = function (date) {\n this.timeGrid.renderNowIndicator(this.slicer.sliceNowDate(date, this.timeGrid, this.dayRanges), date);\n };\n SimpleTimeGrid.prototype.queryHit = function (positionLeft, positionTop) {\n var rawHit = this.timeGrid.positionToHit(positionLeft, positionTop);\n if (rawHit) {\n return {\n component: this.timeGrid,\n dateSpan: rawHit.dateSpan,\n dayEl: rawHit.dayEl,\n rect: {\n left: rawHit.relativeRect.left,\n right: rawHit.relativeRect.right,\n top: rawHit.relativeRect.top,\n bottom: rawHit.relativeRect.bottom\n },\n layer: 0\n };\n }\n };\n return SimpleTimeGrid;\n }(core.DateComponent));\n function buildDayRanges(dayTable, dateProfile, dateEnv) {\n var ranges = [];\n for (var _i = 0, _a = dayTable.headerDates; _i < _a.length; _i++) {\n var date = _a[_i];\n ranges.push({\n start: dateEnv.add(date, dateProfile.minTime),\n end: dateEnv.add(date, dateProfile.maxTime)\n });\n }\n return ranges;\n }\n var TimeGridSlicer = /** @class */ (function (_super) {\n __extends(TimeGridSlicer, _super);\n function TimeGridSlicer() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n TimeGridSlicer.prototype.sliceRange = function (range, dayRanges) {\n var segs = [];\n for (var col = 0; col < dayRanges.length; col++) {\n var segRange = core.intersectRanges(range, dayRanges[col]);\n if (segRange) {\n segs.push({\n start: segRange.start,\n end: segRange.end,\n isStart: segRange.start.valueOf() === range.start.valueOf(),\n isEnd: segRange.end.valueOf() === range.end.valueOf(),\n col: col\n });\n }\n }\n return segs;\n };\n return TimeGridSlicer;\n }(core.Slicer));\n\n var TimeGridView$1 = /** @class */ (function (_super) {\n __extends(TimeGridView, _super);\n function TimeGridView(_context, viewSpec, dateProfileGenerator, parentEl) {\n var _this = _super.call(this, _context, viewSpec, dateProfileGenerator, parentEl) || this;\n _this.buildDayTable = core.memoize(buildDayTable);\n if (_this.opt('columnHeader')) {\n _this.header = new core.DayHeader(_this.context, _this.el.querySelector('.fc-head-container'));\n }\n _this.simpleTimeGrid = new SimpleTimeGrid(_this.context, _this.timeGrid);\n if (_this.dayGrid) {\n _this.simpleDayGrid = new daygrid.SimpleDayGrid(_this.context, _this.dayGrid);\n }\n return _this;\n }\n TimeGridView.prototype.destroy = function () {\n _super.prototype.destroy.call(this);\n if (this.header) {\n this.header.destroy();\n }\n this.simpleTimeGrid.destroy();\n if (this.simpleDayGrid) {\n this.simpleDayGrid.destroy();\n }\n };\n TimeGridView.prototype.render = function (props) {\n _super.prototype.render.call(this, props); // for flags for updateSize\n var dateProfile = this.props.dateProfile;\n var dayTable = this.buildDayTable(dateProfile, this.dateProfileGenerator);\n var splitProps = this.splitter.splitProps(props);\n if (this.header) {\n this.header.receiveProps({\n dateProfile: dateProfile,\n dates: dayTable.headerDates,\n datesRepDistinctDays: true,\n renderIntroHtml: this.renderHeadIntroHtml\n });\n }\n this.simpleTimeGrid.receiveProps(__assign({}, splitProps['timed'], { dateProfile: dateProfile,\n dayTable: dayTable }));\n if (this.simpleDayGrid) {\n this.simpleDayGrid.receiveProps(__assign({}, splitProps['allDay'], { dateProfile: dateProfile,\n dayTable: dayTable, nextDayThreshold: this.nextDayThreshold, isRigid: false }));\n }\n };\n TimeGridView.prototype.renderNowIndicator = function (date) {\n this.simpleTimeGrid.renderNowIndicator(date);\n };\n return TimeGridView;\n }(TimeGridView));\n function buildDayTable(dateProfile, dateProfileGenerator) {\n var daySeries = new core.DaySeries(dateProfile.renderRange, dateProfileGenerator);\n return new core.DayTable(daySeries, false);\n }\n\n var main = core.createPlugin({\n defaultView: 'timeGridWeek',\n views: {\n timeGrid: {\n class: TimeGridView$1,\n allDaySlot: true,\n slotDuration: '00:30:00',\n slotEventOverlap: true // a bad name. confused with overlap/constraint system\n },\n timeGridDay: {\n type: 'timeGrid',\n duration: { days: 1 }\n },\n timeGridWeek: {\n type: 'timeGrid',\n duration: { weeks: 1 }\n }\n }\n });\n\n exports.TimeGridView = TimeGridView$1;\n exports.AbstractTimeGridView = TimeGridView;\n exports.buildDayTable = buildDayTable;\n exports.buildDayRanges = buildDayRanges;\n exports.TimeGridSlicer = TimeGridSlicer;\n exports.default = main;\n exports.TimeGrid = TimeGrid;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n","/*!\nFullCalendar Interaction Plugin v4.0.2\nDocs & License: https://fullcalendar.io/\n(c) 2019 Adam Shaw\n*/\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :\n typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :\n (global = global || self, factory(global.FullCalendarInteraction = {}, global.FullCalendar));\n}(this, function (exports, core) { 'use strict';\n\n /*! *****************************************************************************\r\n Copyright (c) Microsoft Corporation. All rights reserved.\r\n Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\n this file except in compliance with the License. You may obtain a copy of the\r\n License at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\n WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\n MERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\n See the Apache Version 2.0 License for specific language governing permissions\r\n and limitations under the License.\r\n ***************************************************************************** */\r\n /* global Reflect, Promise */\r\n\r\n var extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n };\r\n\r\n function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n }\r\n\r\n var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n };\n\n core.config.touchMouseIgnoreWait = 500;\n var ignoreMouseDepth = 0;\n var listenerCnt = 0;\n var isWindowTouchMoveCancelled = false;\n /*\n Uses a \"pointer\" abstraction, which monitors UI events for both mouse and touch.\n Tracks when the pointer \"drags\" on a certain element, meaning down+move+up.\n\n Also, tracks if there was touch-scrolling.\n Also, can prevent touch-scrolling from happening.\n Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement.\n\n emits:\n - pointerdown\n - pointermove\n - pointerup\n */\n var PointerDragging = /** @class */ (function () {\n function PointerDragging(containerEl) {\n var _this = this;\n this.subjectEl = null;\n this.downEl = null;\n // options that can be directly assigned by caller\n this.selector = ''; // will cause subjectEl in all emitted events to be this element\n this.handleSelector = '';\n this.shouldIgnoreMove = false;\n this.shouldWatchScroll = true; // for simulating pointermove on scroll\n // internal states\n this.isDragging = false;\n this.isTouchDragging = false;\n this.wasTouchScroll = false;\n // Mouse\n // ----------------------------------------------------------------------------------------------------\n this.handleMouseDown = function (ev) {\n if (!_this.shouldIgnoreMouse() &&\n isPrimaryMouseButton(ev) &&\n _this.tryStart(ev)) {\n var pev = _this.createEventFromMouse(ev, true);\n _this.emitter.trigger('pointerdown', pev);\n _this.initScrollWatch(pev);\n if (!_this.shouldIgnoreMove) {\n document.addEventListener('mousemove', _this.handleMouseMove);\n }\n document.addEventListener('mouseup', _this.handleMouseUp);\n }\n };\n this.handleMouseMove = function (ev) {\n var pev = _this.createEventFromMouse(ev);\n _this.recordCoords(pev);\n _this.emitter.trigger('pointermove', pev);\n };\n this.handleMouseUp = function (ev) {\n document.removeEventListener('mousemove', _this.handleMouseMove);\n document.removeEventListener('mouseup', _this.handleMouseUp);\n _this.emitter.trigger('pointerup', _this.createEventFromMouse(ev));\n _this.cleanup(); // call last so that pointerup has access to props\n };\n // Touch\n // ----------------------------------------------------------------------------------------------------\n this.handleTouchStart = function (ev) {\n if (_this.tryStart(ev)) {\n _this.isTouchDragging = true;\n var pev = _this.createEventFromTouch(ev, true);\n _this.emitter.trigger('pointerdown', pev);\n _this.initScrollWatch(pev);\n // unlike mouse, need to attach to target, not document\n // https://stackoverflow.com/a/45760014\n var target = ev.target;\n if (!_this.shouldIgnoreMove) {\n target.addEventListener('touchmove', _this.handleTouchMove);\n }\n target.addEventListener('touchend', _this.handleTouchEnd);\n target.addEventListener('touchcancel', _this.handleTouchEnd); // treat it as a touch end\n // attach a handler to get called when ANY scroll action happens on the page.\n // this was impossible to do with normal on/off because 'scroll' doesn't bubble.\n // http://stackoverflow.com/a/32954565/96342\n window.addEventListener('scroll', _this.handleTouchScroll, true // useCapture\n );\n }\n };\n this.handleTouchMove = function (ev) {\n var pev = _this.createEventFromTouch(ev);\n _this.recordCoords(pev);\n _this.emitter.trigger('pointermove', pev);\n };\n this.handleTouchEnd = function (ev) {\n if (_this.isDragging) { // done to guard against touchend followed by touchcancel\n var target = ev.target;\n target.removeEventListener('touchmove', _this.handleTouchMove);\n target.removeEventListener('touchend', _this.handleTouchEnd);\n target.removeEventListener('touchcancel', _this.handleTouchEnd);\n window.removeEventListener('scroll', _this.handleTouchScroll, true); // useCaptured=true\n _this.emitter.trigger('pointerup', _this.createEventFromTouch(ev));\n _this.cleanup(); // call last so that pointerup has access to props\n _this.isTouchDragging = false;\n startIgnoringMouse();\n }\n };\n this.handleTouchScroll = function () {\n _this.wasTouchScroll = true;\n };\n this.handleScroll = function (ev) {\n if (!_this.shouldIgnoreMove) {\n var pageX = (window.pageXOffset - _this.prevScrollX) + _this.prevPageX;\n var pageY = (window.pageYOffset - _this.prevScrollY) + _this.prevPageY;\n _this.emitter.trigger('pointermove', {\n origEvent: ev,\n isTouch: _this.isTouchDragging,\n subjectEl: _this.subjectEl,\n pageX: pageX,\n pageY: pageY,\n deltaX: pageX - _this.origPageX,\n deltaY: pageY - _this.origPageY\n });\n }\n };\n this.containerEl = containerEl;\n this.emitter = new core.EmitterMixin();\n containerEl.addEventListener('mousedown', this.handleMouseDown);\n containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true });\n listenerCreated();\n }\n PointerDragging.prototype.destroy = function () {\n this.containerEl.removeEventListener('mousedown', this.handleMouseDown);\n this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true });\n listenerDestroyed();\n };\n PointerDragging.prototype.tryStart = function (ev) {\n var subjectEl = this.querySubjectEl(ev);\n var downEl = ev.target;\n if (subjectEl &&\n (!this.handleSelector || core.elementClosest(downEl, this.handleSelector))) {\n this.subjectEl = subjectEl;\n this.downEl = downEl;\n this.isDragging = true; // do this first so cancelTouchScroll will work\n this.wasTouchScroll = false;\n return true;\n }\n return false;\n };\n PointerDragging.prototype.cleanup = function () {\n isWindowTouchMoveCancelled = false;\n this.isDragging = false;\n this.subjectEl = null;\n this.downEl = null;\n // keep wasTouchScroll around for later access\n this.destroyScrollWatch();\n };\n PointerDragging.prototype.querySubjectEl = function (ev) {\n if (this.selector) {\n return core.elementClosest(ev.target, this.selector);\n }\n else {\n return this.containerEl;\n }\n };\n PointerDragging.prototype.shouldIgnoreMouse = function () {\n return ignoreMouseDepth || this.isTouchDragging;\n };\n // can be called by user of this class, to cancel touch-based scrolling for the current drag\n PointerDragging.prototype.cancelTouchScroll = function () {\n if (this.isDragging) {\n isWindowTouchMoveCancelled = true;\n }\n };\n // Scrolling that simulates pointermoves\n // ----------------------------------------------------------------------------------------------------\n PointerDragging.prototype.initScrollWatch = function (ev) {\n if (this.shouldWatchScroll) {\n this.recordCoords(ev);\n window.addEventListener('scroll', this.handleScroll, true); // useCapture=true\n }\n };\n PointerDragging.prototype.recordCoords = function (ev) {\n if (this.shouldWatchScroll) {\n this.prevPageX = ev.pageX;\n this.prevPageY = ev.pageY;\n this.prevScrollX = window.pageXOffset;\n this.prevScrollY = window.pageYOffset;\n }\n };\n PointerDragging.prototype.destroyScrollWatch = function () {\n if (this.shouldWatchScroll) {\n window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true\n }\n };\n // Event Normalization\n // ----------------------------------------------------------------------------------------------------\n PointerDragging.prototype.createEventFromMouse = function (ev, isFirst) {\n var deltaX = 0;\n var deltaY = 0;\n // TODO: repeat code\n if (isFirst) {\n this.origPageX = ev.pageX;\n this.origPageY = ev.pageY;\n }\n else {\n deltaX = ev.pageX - this.origPageX;\n deltaY = ev.pageY - this.origPageY;\n }\n return {\n origEvent: ev,\n isTouch: false,\n subjectEl: this.subjectEl,\n pageX: ev.pageX,\n pageY: ev.pageY,\n deltaX: deltaX,\n deltaY: deltaY\n };\n };\n PointerDragging.prototype.createEventFromTouch = function (ev, isFirst) {\n var touches = ev.touches;\n var pageX;\n var pageY;\n var deltaX = 0;\n var deltaY = 0;\n // if touch coords available, prefer,\n // because FF would give bad ev.pageX ev.pageY\n if (touches && touches.length) {\n pageX = touches[0].pageX;\n pageY = touches[0].pageY;\n }\n else {\n pageX = ev.pageX;\n pageY = ev.pageY;\n }\n // TODO: repeat code\n if (isFirst) {\n this.origPageX = pageX;\n this.origPageY = pageY;\n }\n else {\n deltaX = pageX - this.origPageX;\n deltaY = pageY - this.origPageY;\n }\n return {\n origEvent: ev,\n isTouch: true,\n subjectEl: this.subjectEl,\n pageX: pageX,\n pageY: pageY,\n deltaX: deltaX,\n deltaY: deltaY\n };\n };\n return PointerDragging;\n }());\n // Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)\n function isPrimaryMouseButton(ev) {\n return ev.button === 0 && !ev.ctrlKey;\n }\n // Ignoring fake mouse events generated by touch\n // ----------------------------------------------------------------------------------------------------\n function startIgnoringMouse() {\n ignoreMouseDepth++;\n setTimeout(function () {\n ignoreMouseDepth--;\n }, core.config.touchMouseIgnoreWait);\n }\n // We want to attach touchmove as early as possible for Safari\n // ----------------------------------------------------------------------------------------------------\n function listenerCreated() {\n if (!(listenerCnt++)) {\n window.addEventListener('touchmove', onWindowTouchMove, { passive: false });\n }\n }\n function listenerDestroyed() {\n if (!(--listenerCnt)) {\n window.removeEventListener('touchmove', onWindowTouchMove, { passive: false });\n }\n }\n function onWindowTouchMove(ev) {\n if (isWindowTouchMoveCancelled) {\n ev.preventDefault();\n }\n }\n\n /*\n An effect in which an element follows the movement of a pointer across the screen.\n The moving element is a clone of some other element.\n Must call start + handleMove + stop.\n */\n var ElementMirror = /** @class */ (function () {\n function ElementMirror() {\n this.isVisible = false; // must be explicitly enabled\n this.sourceEl = null;\n this.mirrorEl = null;\n this.sourceElRect = null; // screen coords relative to viewport\n // options that can be set directly by caller\n this.parentNode = document.body;\n this.zIndex = 9999;\n this.revertDuration = 0;\n }\n ElementMirror.prototype.start = function (sourceEl, pageX, pageY) {\n this.sourceEl = sourceEl;\n this.sourceElRect = this.sourceEl.getBoundingClientRect();\n this.origScreenX = pageX - window.pageXOffset;\n this.origScreenY = pageY - window.pageYOffset;\n this.deltaX = 0;\n this.deltaY = 0;\n this.updateElPosition();\n };\n ElementMirror.prototype.handleMove = function (pageX, pageY) {\n this.deltaX = (pageX - window.pageXOffset) - this.origScreenX;\n this.deltaY = (pageY - window.pageYOffset) - this.origScreenY;\n this.updateElPosition();\n };\n // can be called before start\n ElementMirror.prototype.setIsVisible = function (bool) {\n if (bool) {\n if (!this.isVisible) {\n if (this.mirrorEl) {\n this.mirrorEl.style.display = '';\n }\n this.isVisible = bool; // needs to happen before updateElPosition\n this.updateElPosition(); // because was not updating the position while invisible\n }\n }\n else {\n if (this.isVisible) {\n if (this.mirrorEl) {\n this.mirrorEl.style.display = 'none';\n }\n this.isVisible = bool;\n }\n }\n };\n // always async\n ElementMirror.prototype.stop = function (needsRevertAnimation, callback) {\n var _this = this;\n var done = function () {\n _this.cleanup();\n callback();\n };\n if (needsRevertAnimation &&\n this.mirrorEl &&\n this.isVisible &&\n this.revertDuration && // if 0, transition won't work\n (this.deltaX || this.deltaY) // if same coords, transition won't work\n ) {\n this.doRevertAnimation(done, this.revertDuration);\n }\n else {\n setTimeout(done, 0);\n }\n };\n ElementMirror.prototype.doRevertAnimation = function (callback, revertDuration) {\n var mirrorEl = this.mirrorEl;\n var finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened\n mirrorEl.style.transition =\n 'top ' + revertDuration + 'ms,' +\n 'left ' + revertDuration + 'ms';\n core.applyStyle(mirrorEl, {\n left: finalSourceElRect.left,\n top: finalSourceElRect.top\n });\n core.whenTransitionDone(mirrorEl, function () {\n mirrorEl.style.transition = '';\n callback();\n });\n };\n ElementMirror.prototype.cleanup = function () {\n if (this.mirrorEl) {\n core.removeElement(this.mirrorEl);\n this.mirrorEl = null;\n }\n this.sourceEl = null;\n };\n ElementMirror.prototype.updateElPosition = function () {\n if (this.sourceEl && this.isVisible) {\n core.applyStyle(this.getMirrorEl(), {\n left: this.sourceElRect.left + this.deltaX,\n top: this.sourceElRect.top + this.deltaY\n });\n }\n };\n ElementMirror.prototype.getMirrorEl = function () {\n var sourceElRect = this.sourceElRect;\n var mirrorEl = this.mirrorEl;\n if (!mirrorEl) {\n mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true\n // we don't want long taps or any mouse interaction causing selection/menus.\n // would use preventSelection(), but that prevents selectstart, causing problems.\n mirrorEl.classList.add('fc-unselectable');\n mirrorEl.classList.add('fc-dragging');\n core.applyStyle(mirrorEl, {\n position: 'fixed',\n zIndex: this.zIndex,\n visibility: '',\n boxSizing: 'border-box',\n width: sourceElRect.right - sourceElRect.left,\n height: sourceElRect.bottom - sourceElRect.top,\n right: 'auto',\n bottom: 'auto',\n margin: 0\n });\n this.parentNode.appendChild(mirrorEl);\n }\n return mirrorEl;\n };\n return ElementMirror;\n }());\n\n /*\n Is a cache for a given element's scroll information (all the info that ScrollController stores)\n in addition the \"client rectangle\" of the element.. the area within the scrollbars.\n\n The cache can be in one of two modes:\n - doesListening:false - ignores when the container is scrolled by someone else\n - doesListening:true - watch for scrolling and update the cache\n */\n var ScrollGeomCache = /** @class */ (function (_super) {\n __extends(ScrollGeomCache, _super);\n function ScrollGeomCache(scrollController, doesListening) {\n var _this = _super.call(this) || this;\n _this.handleScroll = function () {\n _this.scrollTop = _this.scrollController.getScrollTop();\n _this.scrollLeft = _this.scrollController.getScrollLeft();\n _this.handleScrollChange();\n };\n _this.scrollController = scrollController;\n _this.doesListening = doesListening;\n _this.scrollTop = _this.origScrollTop = scrollController.getScrollTop();\n _this.scrollLeft = _this.origScrollLeft = scrollController.getScrollLeft();\n _this.scrollWidth = scrollController.getScrollWidth();\n _this.scrollHeight = scrollController.getScrollHeight();\n _this.clientWidth = scrollController.getClientWidth();\n _this.clientHeight = scrollController.getClientHeight();\n _this.clientRect = _this.computeClientRect(); // do last in case it needs cached values\n if (_this.doesListening) {\n _this.getEventTarget().addEventListener('scroll', _this.handleScroll);\n }\n return _this;\n }\n ScrollGeomCache.prototype.destroy = function () {\n if (this.doesListening) {\n this.getEventTarget().removeEventListener('scroll', this.handleScroll);\n }\n };\n ScrollGeomCache.prototype.getScrollTop = function () {\n return this.scrollTop;\n };\n ScrollGeomCache.prototype.getScrollLeft = function () {\n return this.scrollLeft;\n };\n ScrollGeomCache.prototype.setScrollTop = function (top) {\n this.scrollController.setScrollTop(top);\n if (!this.doesListening) {\n // we are not relying on the element to normalize out-of-bounds scroll values\n // so we need to sanitize ourselves\n this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0);\n this.handleScrollChange();\n }\n };\n ScrollGeomCache.prototype.setScrollLeft = function (top) {\n this.scrollController.setScrollLeft(top);\n if (!this.doesListening) {\n // we are not relying on the element to normalize out-of-bounds scroll values\n // so we need to sanitize ourselves\n this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0);\n this.handleScrollChange();\n }\n };\n ScrollGeomCache.prototype.getClientWidth = function () {\n return this.clientWidth;\n };\n ScrollGeomCache.prototype.getClientHeight = function () {\n return this.clientHeight;\n };\n ScrollGeomCache.prototype.getScrollWidth = function () {\n return this.scrollWidth;\n };\n ScrollGeomCache.prototype.getScrollHeight = function () {\n return this.scrollHeight;\n };\n ScrollGeomCache.prototype.handleScrollChange = function () {\n };\n return ScrollGeomCache;\n }(core.ScrollController));\n var ElementScrollGeomCache = /** @class */ (function (_super) {\n __extends(ElementScrollGeomCache, _super);\n function ElementScrollGeomCache(el, doesListening) {\n return _super.call(this, new core.ElementScrollController(el), doesListening) || this;\n }\n ElementScrollGeomCache.prototype.getEventTarget = function () {\n return this.scrollController.el;\n };\n ElementScrollGeomCache.prototype.computeClientRect = function () {\n return core.computeInnerRect(this.scrollController.el);\n };\n return ElementScrollGeomCache;\n }(ScrollGeomCache));\n var WindowScrollGeomCache = /** @class */ (function (_super) {\n __extends(WindowScrollGeomCache, _super);\n function WindowScrollGeomCache(doesListening) {\n return _super.call(this, new core.WindowScrollController(), doesListening) || this;\n }\n WindowScrollGeomCache.prototype.getEventTarget = function () {\n return window;\n };\n WindowScrollGeomCache.prototype.computeClientRect = function () {\n return {\n left: this.scrollLeft,\n right: this.scrollLeft + this.clientWidth,\n top: this.scrollTop,\n bottom: this.scrollTop + this.clientHeight\n };\n };\n // the window is the only scroll object that changes it's rectangle relative\n // to the document's topleft as it scrolls\n WindowScrollGeomCache.prototype.handleScrollChange = function () {\n this.clientRect = this.computeClientRect();\n };\n return WindowScrollGeomCache;\n }(ScrollGeomCache));\n\n // If available we are using native \"performance\" API instead of \"Date\"\n // Read more about it on MDN:\n // https://developer.mozilla.org/en-US/docs/Web/API/Performance\n var getTime = typeof performance === 'function' ? performance.now : Date.now;\n /*\n For a pointer interaction, automatically scrolls certain scroll containers when the pointer\n approaches the edge.\n\n The caller must call start + handleMove + stop.\n */\n var AutoScroller = /** @class */ (function () {\n function AutoScroller() {\n var _this = this;\n // options that can be set by caller\n this.isEnabled = true;\n this.scrollQuery = [window, '.fc-scroller'];\n this.edgeThreshold = 50; // pixels\n this.maxVelocity = 300; // pixels per second\n // internal state\n this.pointerScreenX = null;\n this.pointerScreenY = null;\n this.isAnimating = false;\n this.scrollCaches = null;\n // protect against the initial pointerdown being too close to an edge and starting the scroll\n this.everMovedUp = false;\n this.everMovedDown = false;\n this.everMovedLeft = false;\n this.everMovedRight = false;\n this.animate = function () {\n if (_this.isAnimating) { // wasn't cancelled between animation calls\n var edge = _this.computeBestEdge(_this.pointerScreenX + window.pageXOffset, _this.pointerScreenY + window.pageYOffset);\n if (edge) {\n var now = getTime();\n _this.handleSide(edge, (now - _this.msSinceRequest) / 1000);\n _this.requestAnimation(now);\n }\n else {\n _this.isAnimating = false; // will stop animation\n }\n }\n };\n }\n AutoScroller.prototype.start = function (pageX, pageY) {\n if (this.isEnabled) {\n this.scrollCaches = this.buildCaches();\n this.pointerScreenX = null;\n this.pointerScreenY = null;\n this.everMovedUp = false;\n this.everMovedDown = false;\n this.everMovedLeft = false;\n this.everMovedRight = false;\n this.handleMove(pageX, pageY);\n }\n };\n AutoScroller.prototype.handleMove = function (pageX, pageY) {\n if (this.isEnabled) {\n var pointerScreenX = pageX - window.pageXOffset;\n var pointerScreenY = pageY - window.pageYOffset;\n var yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY;\n var xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX;\n if (yDelta < 0) {\n this.everMovedUp = true;\n }\n else if (yDelta > 0) {\n this.everMovedDown = true;\n }\n if (xDelta < 0) {\n this.everMovedLeft = true;\n }\n else if (xDelta > 0) {\n this.everMovedRight = true;\n }\n this.pointerScreenX = pointerScreenX;\n this.pointerScreenY = pointerScreenY;\n if (!this.isAnimating) {\n this.isAnimating = true;\n this.requestAnimation(getTime());\n }\n }\n };\n AutoScroller.prototype.stop = function () {\n if (this.isEnabled) {\n this.isAnimating = false; // will stop animation\n for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {\n var scrollCache = _a[_i];\n scrollCache.destroy();\n }\n this.scrollCaches = null;\n }\n };\n AutoScroller.prototype.requestAnimation = function (now) {\n this.msSinceRequest = now;\n requestAnimationFrame(this.animate);\n };\n AutoScroller.prototype.handleSide = function (edge, seconds) {\n var scrollCache = edge.scrollCache;\n var edgeThreshold = this.edgeThreshold;\n var invDistance = edgeThreshold - edge.distance;\n var velocity = // the closer to the edge, the faster we scroll\n (invDistance * invDistance) / (edgeThreshold * edgeThreshold) * // quadratic\n this.maxVelocity * seconds;\n var sign = 1;\n switch (edge.name) {\n case 'left':\n sign = -1;\n // falls through\n case 'right':\n scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign);\n break;\n case 'top':\n sign = -1;\n // falls through\n case 'bottom':\n scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign);\n break;\n }\n };\n // left/top are relative to document topleft\n AutoScroller.prototype.computeBestEdge = function (left, top) {\n var edgeThreshold = this.edgeThreshold;\n var bestSide = null;\n for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {\n var scrollCache = _a[_i];\n var rect = scrollCache.clientRect;\n var leftDist = left - rect.left;\n var rightDist = rect.right - left;\n var topDist = top - rect.top;\n var bottomDist = rect.bottom - top;\n // completely within the rect?\n if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) {\n if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() &&\n (!bestSide || bestSide.distance > topDist)) {\n bestSide = { scrollCache: scrollCache, name: 'top', distance: topDist };\n }\n if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() &&\n (!bestSide || bestSide.distance > bottomDist)) {\n bestSide = { scrollCache: scrollCache, name: 'bottom', distance: bottomDist };\n }\n if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() &&\n (!bestSide || bestSide.distance > leftDist)) {\n bestSide = { scrollCache: scrollCache, name: 'left', distance: leftDist };\n }\n if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() &&\n (!bestSide || bestSide.distance > rightDist)) {\n bestSide = { scrollCache: scrollCache, name: 'right', distance: rightDist };\n }\n }\n }\n return bestSide;\n };\n AutoScroller.prototype.buildCaches = function () {\n return this.queryScrollEls().map(function (el) {\n if (el === window) {\n return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls\n }\n else {\n return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls\n }\n });\n };\n AutoScroller.prototype.queryScrollEls = function () {\n var els = [];\n for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) {\n var query = _a[_i];\n if (typeof query === 'object') {\n els.push(query);\n }\n else {\n els.push.apply(els, Array.prototype.slice.call(document.querySelectorAll(query)));\n }\n }\n return els;\n };\n return AutoScroller;\n }());\n\n /*\n Monitors dragging on an element. Has a number of high-level features:\n - minimum distance required before dragging\n - minimum wait time (\"delay\") before dragging\n - a mirror element that follows the pointer\n */\n var FeaturefulElementDragging = /** @class */ (function (_super) {\n __extends(FeaturefulElementDragging, _super);\n function FeaturefulElementDragging(containerEl) {\n var _this = _super.call(this, containerEl) || this;\n // options that can be directly set by caller\n // the caller can also set the PointerDragging's options as well\n _this.delay = null;\n _this.minDistance = 0;\n _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag\n _this.mirrorNeedsRevert = false;\n _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup\n _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation\n _this.isDelayEnded = false;\n _this.isDistanceSurpassed = false;\n _this.delayTimeoutId = null;\n _this.onPointerDown = function (ev) {\n if (!_this.isDragging) { // so new drag doesn't happen while revert animation is going\n _this.isInteracting = true;\n _this.isDelayEnded = false;\n _this.isDistanceSurpassed = false;\n core.preventSelection(document.body);\n core.preventContextMenu(document.body);\n // prevent links from being visited if there's an eventual drag.\n // also prevents selection in older browsers (maybe?).\n // not necessary for touch, besides, browser would complain about passiveness.\n if (!ev.isTouch) {\n ev.origEvent.preventDefault();\n }\n _this.emitter.trigger('pointerdown', ev);\n if (!_this.pointer.shouldIgnoreMove) {\n // actions related to initiating dragstart+dragmove+dragend...\n _this.mirror.setIsVisible(false); // reset. caller must set-visible\n _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down\n _this.startDelay(ev);\n if (!_this.minDistance) {\n _this.handleDistanceSurpassed(ev);\n }\n }\n }\n };\n _this.onPointerMove = function (ev) {\n if (_this.isInteracting) { // if false, still waiting for previous drag's revert\n _this.emitter.trigger('pointermove', ev);\n if (!_this.isDistanceSurpassed) {\n var minDistance = _this.minDistance;\n var distanceSq = void 0; // current distance from the origin, squared\n var deltaX = ev.deltaX, deltaY = ev.deltaY;\n distanceSq = deltaX * deltaX + deltaY * deltaY;\n if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem\n _this.handleDistanceSurpassed(ev);\n }\n }\n if (_this.isDragging) {\n // a real pointer move? (not one simulated by scrolling)\n if (ev.origEvent.type !== 'scroll') {\n _this.mirror.handleMove(ev.pageX, ev.pageY);\n _this.autoScroller.handleMove(ev.pageX, ev.pageY);\n }\n _this.emitter.trigger('dragmove', ev);\n }\n }\n };\n _this.onPointerUp = function (ev) {\n if (_this.isInteracting) { // if false, still waiting for previous drag's revert\n _this.isInteracting = false;\n core.allowSelection(document.body);\n core.allowContextMenu(document.body);\n _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert\n if (_this.isDragging) {\n _this.autoScroller.stop();\n _this.tryStopDrag(ev); // which will stop the mirror\n }\n if (_this.delayTimeoutId) {\n clearTimeout(_this.delayTimeoutId);\n _this.delayTimeoutId = null;\n }\n }\n };\n var pointer = _this.pointer = new PointerDragging(containerEl);\n pointer.emitter.on('pointerdown', _this.onPointerDown);\n pointer.emitter.on('pointermove', _this.onPointerMove);\n pointer.emitter.on('pointerup', _this.onPointerUp);\n _this.mirror = new ElementMirror();\n _this.autoScroller = new AutoScroller();\n return _this;\n }\n FeaturefulElementDragging.prototype.destroy = function () {\n this.pointer.destroy();\n };\n FeaturefulElementDragging.prototype.startDelay = function (ev) {\n var _this = this;\n if (typeof this.delay === 'number') {\n this.delayTimeoutId = setTimeout(function () {\n _this.delayTimeoutId = null;\n _this.handleDelayEnd(ev);\n }, this.delay);\n }\n else {\n this.handleDelayEnd(ev);\n }\n };\n FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) {\n this.isDelayEnded = true;\n this.tryStartDrag(ev);\n };\n FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) {\n this.isDistanceSurpassed = true;\n this.tryStartDrag(ev);\n };\n FeaturefulElementDragging.prototype.tryStartDrag = function (ev) {\n if (this.isDelayEnded && this.isDistanceSurpassed) {\n if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) {\n this.isDragging = true;\n this.mirrorNeedsRevert = false;\n this.autoScroller.start(ev.pageX, ev.pageY);\n this.emitter.trigger('dragstart', ev);\n if (this.touchScrollAllowed === false) {\n this.pointer.cancelTouchScroll();\n }\n }\n }\n };\n FeaturefulElementDragging.prototype.tryStopDrag = function (ev) {\n // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events\n // that come from the document to fire beforehand. much more convenient this way.\n this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev) // bound with args\n );\n };\n FeaturefulElementDragging.prototype.stopDrag = function (ev) {\n this.isDragging = false;\n this.emitter.trigger('dragend', ev);\n };\n // fill in the implementations...\n FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) {\n this.pointer.shouldIgnoreMove = bool;\n };\n FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) {\n this.mirror.setIsVisible(bool);\n };\n FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) {\n this.mirrorNeedsRevert = bool;\n };\n FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) {\n this.autoScroller.isEnabled = bool;\n };\n return FeaturefulElementDragging;\n }(core.ElementDragging));\n\n /*\n When this class is instantiated, it records the offset of an element (relative to the document topleft),\n and continues to monitor scrolling, updating the cached coordinates if it needs to.\n Does not access the DOM after instantiation, so highly performant.\n\n Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element\n and an determine if a given point is inside the combined clipping rectangle.\n */\n var OffsetTracker = /** @class */ (function () {\n function OffsetTracker(el) {\n this.origRect = core.computeRect(el);\n // will work fine for divs that have overflow:hidden\n this.scrollCaches = core.getClippingParents(el).map(function (el) {\n return new ElementScrollGeomCache(el, true); // listen=true\n });\n }\n OffsetTracker.prototype.destroy = function () {\n for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {\n var scrollCache = _a[_i];\n scrollCache.destroy();\n }\n };\n OffsetTracker.prototype.computeLeft = function () {\n var left = this.origRect.left;\n for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {\n var scrollCache = _a[_i];\n left += scrollCache.origScrollLeft - scrollCache.getScrollLeft();\n }\n return left;\n };\n OffsetTracker.prototype.computeTop = function () {\n var top = this.origRect.top;\n for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {\n var scrollCache = _a[_i];\n top += scrollCache.origScrollTop - scrollCache.getScrollTop();\n }\n return top;\n };\n OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) {\n var point = { left: pageX, top: pageY };\n for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {\n var scrollCache = _a[_i];\n if (!isIgnoredClipping(scrollCache.getEventTarget()) &&\n !core.pointInsideRect(point, scrollCache.clientRect)) {\n return false;\n }\n }\n return true;\n };\n return OffsetTracker;\n }());\n // certain clipping containers should never constrain interactions, like and \n // https://github.com/fullcalendar/fullcalendar/issues/3615\n function isIgnoredClipping(node) {\n var tagName = node.tagName;\n return tagName === 'HTML' || tagName === 'BODY';\n }\n\n /*\n Tracks movement over multiple droppable areas (aka \"hits\")\n that exist in one or more DateComponents.\n Relies on an existing draggable.\n\n emits:\n - pointerdown\n - dragstart\n - hitchange - fires initially, even if not over a hit\n - pointerup\n - (hitchange - again, to null, if ended over a hit)\n - dragend\n */\n var HitDragging = /** @class */ (function () {\n function HitDragging(dragging, droppableStore) {\n var _this = this;\n // options that can be set by caller\n this.useSubjectCenter = false;\n this.requireInitial = true; // if doesn't start out on a hit, won't emit any events\n this.initialHit = null;\n this.movingHit = null;\n this.finalHit = null; // won't ever be populated if shouldIgnoreMove\n this.handlePointerDown = function (ev) {\n var dragging = _this.dragging;\n _this.initialHit = null;\n _this.movingHit = null;\n _this.finalHit = null;\n _this.prepareHits();\n _this.processFirstCoord(ev);\n if (_this.initialHit || !_this.requireInitial) {\n dragging.setIgnoreMove(false);\n _this.emitter.trigger('pointerdown', ev); // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :(\n }\n else {\n dragging.setIgnoreMove(true);\n }\n };\n this.handleDragStart = function (ev) {\n _this.emitter.trigger('dragstart', ev);\n _this.handleMove(ev, true); // force = fire even if initially null\n };\n this.handleDragMove = function (ev) {\n _this.emitter.trigger('dragmove', ev);\n _this.handleMove(ev);\n };\n this.handlePointerUp = function (ev) {\n _this.releaseHits();\n _this.emitter.trigger('pointerup', ev);\n };\n this.handleDragEnd = function (ev) {\n if (_this.movingHit) {\n _this.emitter.trigger('hitupdate', null, true, ev);\n }\n _this.finalHit = _this.movingHit;\n _this.movingHit = null;\n _this.emitter.trigger('dragend', ev);\n };\n this.droppableStore = droppableStore;\n dragging.emitter.on('pointerdown', this.handlePointerDown);\n dragging.emitter.on('dragstart', this.handleDragStart);\n dragging.emitter.on('dragmove', this.handleDragMove);\n dragging.emitter.on('pointerup', this.handlePointerUp);\n dragging.emitter.on('dragend', this.handleDragEnd);\n this.dragging = dragging;\n this.emitter = new core.EmitterMixin();\n }\n // sets initialHit\n // sets coordAdjust\n HitDragging.prototype.processFirstCoord = function (ev) {\n var origPoint = { left: ev.pageX, top: ev.pageY };\n var adjustedPoint = origPoint;\n var subjectEl = ev.subjectEl;\n var subjectRect;\n if (subjectEl !== document) {\n subjectRect = core.computeRect(subjectEl);\n adjustedPoint = core.constrainPoint(adjustedPoint, subjectRect);\n }\n var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top);\n if (initialHit) {\n if (this.useSubjectCenter && subjectRect) {\n var slicedSubjectRect = core.intersectRects(subjectRect, initialHit.rect);\n if (slicedSubjectRect) {\n adjustedPoint = core.getRectCenter(slicedSubjectRect);\n }\n }\n this.coordAdjust = core.diffPoints(adjustedPoint, origPoint);\n }\n else {\n this.coordAdjust = { left: 0, top: 0 };\n }\n };\n HitDragging.prototype.handleMove = function (ev, forceHandle) {\n var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top);\n if (forceHandle || !isHitsEqual(this.movingHit, hit)) {\n this.movingHit = hit;\n this.emitter.trigger('hitupdate', hit, false, ev);\n }\n };\n HitDragging.prototype.prepareHits = function () {\n this.offsetTrackers = core.mapHash(this.droppableStore, function (interactionSettings) {\n return new OffsetTracker(interactionSettings.el);\n });\n };\n HitDragging.prototype.releaseHits = function () {\n var offsetTrackers = this.offsetTrackers;\n for (var id in offsetTrackers) {\n offsetTrackers[id].destroy();\n }\n this.offsetTrackers = {};\n };\n HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) {\n var _a = this, droppableStore = _a.droppableStore, offsetTrackers = _a.offsetTrackers;\n var bestHit = null;\n for (var id in droppableStore) {\n var component = droppableStore[id].component;\n var offsetTracker = offsetTrackers[id];\n if (offsetTracker.isWithinClipping(offsetLeft, offsetTop)) {\n var originLeft = offsetTracker.computeLeft();\n var originTop = offsetTracker.computeTop();\n var positionLeft = offsetLeft - originLeft;\n var positionTop = offsetTop - originTop;\n var origRect = offsetTracker.origRect;\n var width = origRect.right - origRect.left;\n var height = origRect.bottom - origRect.top;\n if (\n // must be within the element's bounds\n positionLeft >= 0 && positionLeft < width &&\n positionTop >= 0 && positionTop < height) {\n var hit = component.queryHit(positionLeft, positionTop, width, height);\n if (hit &&\n (\n // make sure the hit is within activeRange, meaning it's not a deal cell\n !component.props.dateProfile || // hack for DayTile\n core.rangeContainsRange(component.props.dateProfile.activeRange, hit.dateSpan.range)) &&\n (!bestHit || hit.layer > bestHit.layer)) {\n // TODO: better way to re-orient rectangle\n hit.rect.left += originLeft;\n hit.rect.right += originLeft;\n hit.rect.top += originTop;\n hit.rect.bottom += originTop;\n bestHit = hit;\n }\n }\n }\n }\n return bestHit;\n };\n return HitDragging;\n }());\n function isHitsEqual(hit0, hit1) {\n if (!hit0 && !hit1) {\n return true;\n }\n if (Boolean(hit0) !== Boolean(hit1)) {\n return false;\n }\n return core.isDateSpansEqual(hit0.dateSpan, hit1.dateSpan);\n }\n\n /*\n Monitors when the user clicks on a specific date/time of a component.\n A pointerdown+pointerup on the same \"hit\" constitutes a click.\n */\n var DateClicking = /** @class */ (function (_super) {\n __extends(DateClicking, _super);\n function DateClicking(settings) {\n var _this = _super.call(this, settings) || this;\n _this.handlePointerDown = function (ev) {\n var dragging = _this.dragging;\n // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired\n dragging.setIgnoreMove(!_this.component.isValidDateDownEl(dragging.pointer.downEl));\n };\n // won't even fire if moving was ignored\n _this.handleDragEnd = function (ev) {\n var component = _this.component;\n var pointer = _this.dragging.pointer;\n if (!pointer.wasTouchScroll) {\n var _a = _this.hitDragging, initialHit = _a.initialHit, finalHit = _a.finalHit;\n if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) {\n component.calendar.triggerDateClick(initialHit.dateSpan, initialHit.dayEl, component.view, ev.origEvent);\n }\n }\n };\n var component = settings.component;\n // we DO want to watch pointer moves because otherwise finalHit won't get populated\n _this.dragging = new FeaturefulElementDragging(component.el);\n _this.dragging.autoScroller.isEnabled = false;\n var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));\n hitDragging.emitter.on('pointerdown', _this.handlePointerDown);\n hitDragging.emitter.on('dragend', _this.handleDragEnd);\n return _this;\n }\n DateClicking.prototype.destroy = function () {\n this.dragging.destroy();\n };\n return DateClicking;\n }(core.Interaction));\n\n /*\n Tracks when the user selects a portion of time of a component,\n constituted by a drag over date cells, with a possible delay at the beginning of the drag.\n */\n var DateSelecting = /** @class */ (function (_super) {\n __extends(DateSelecting, _super);\n function DateSelecting(settings) {\n var _this = _super.call(this, settings) || this;\n _this.dragSelection = null;\n _this.handlePointerDown = function (ev) {\n var _a = _this, component = _a.component, dragging = _a.dragging;\n var canSelect = component.opt('selectable') &&\n component.isValidDateDownEl(ev.origEvent.target);\n // don't bother to watch expensive moves if component won't do selection\n dragging.setIgnoreMove(!canSelect);\n // if touch, require user to hold down\n dragging.delay = ev.isTouch ? getComponentTouchDelay(component) : null;\n };\n _this.handleDragStart = function (ev) {\n _this.component.calendar.unselect(ev); // unselect previous selections\n };\n _this.handleHitUpdate = function (hit, isFinal) {\n var calendar = _this.component.calendar;\n var dragSelection = null;\n var isInvalid = false;\n if (hit) {\n dragSelection = joinHitsIntoSelection(_this.hitDragging.initialHit, hit, calendar.pluginSystem.hooks.dateSelectionTransformers);\n if (!dragSelection || !_this.component.isDateSelectionValid(dragSelection)) {\n isInvalid = true;\n dragSelection = null;\n }\n }\n if (dragSelection) {\n calendar.dispatch({ type: 'SELECT_DATES', selection: dragSelection });\n }\n else if (!isFinal) { // only unselect if moved away while dragging\n calendar.dispatch({ type: 'UNSELECT_DATES' });\n }\n if (!isInvalid) {\n core.enableCursor();\n }\n else {\n core.disableCursor();\n }\n if (!isFinal) {\n _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging\n }\n };\n _this.handlePointerUp = function (pev) {\n if (_this.dragSelection) {\n // selection is already rendered, so just need to report selection\n _this.component.calendar.triggerDateSelect(_this.dragSelection, pev);\n _this.dragSelection = null;\n }\n };\n var component = settings.component;\n var dragging = _this.dragging = new FeaturefulElementDragging(component.el);\n dragging.touchScrollAllowed = false;\n dragging.minDistance = component.opt('selectMinDistance') || 0;\n dragging.autoScroller.isEnabled = component.opt('dragScroll');\n var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));\n hitDragging.emitter.on('pointerdown', _this.handlePointerDown);\n hitDragging.emitter.on('dragstart', _this.handleDragStart);\n hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);\n hitDragging.emitter.on('pointerup', _this.handlePointerUp);\n return _this;\n }\n DateSelecting.prototype.destroy = function () {\n this.dragging.destroy();\n };\n return DateSelecting;\n }(core.Interaction));\n function getComponentTouchDelay(component) {\n var delay = component.opt('selectLongPressDelay');\n if (delay == null) {\n delay = component.opt('longPressDelay');\n }\n return delay;\n }\n function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) {\n var dateSpan0 = hit0.dateSpan;\n var dateSpan1 = hit1.dateSpan;\n var ms = [\n dateSpan0.range.start,\n dateSpan0.range.end,\n dateSpan1.range.start,\n dateSpan1.range.end\n ];\n ms.sort(core.compareNumbers);\n var props = {};\n for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) {\n var transformer = dateSelectionTransformers_1[_i];\n var res = transformer(hit0, hit1);\n if (res === false) {\n return null;\n }\n else if (res) {\n __assign(props, res);\n }\n }\n props.range = { start: ms[0], end: ms[3] };\n props.allDay = dateSpan0.allDay;\n return props;\n }\n\n var EventDragging = /** @class */ (function (_super) {\n __extends(EventDragging, _super);\n function EventDragging(settings) {\n var _this = _super.call(this, settings) || this;\n // internal state\n _this.subjectSeg = null; // the seg being selected/dragged\n _this.isDragging = false;\n _this.eventRange = null;\n _this.relevantEvents = null; // the events being dragged\n _this.receivingCalendar = null;\n _this.validMutation = null;\n _this.mutatedRelevantEvents = null;\n _this.handlePointerDown = function (ev) {\n var origTarget = ev.origEvent.target;\n var _a = _this, component = _a.component, dragging = _a.dragging;\n var mirror = dragging.mirror;\n var initialCalendar = component.calendar;\n var subjectSeg = _this.subjectSeg = core.getElSeg(ev.subjectEl);\n var eventRange = _this.eventRange = subjectSeg.eventRange;\n var eventInstanceId = eventRange.instance.instanceId;\n _this.relevantEvents = core.getRelevantEvents(initialCalendar.state.eventStore, eventInstanceId);\n dragging.minDistance = ev.isTouch ? 0 : component.opt('eventDragMinDistance');\n dragging.delay =\n // only do a touch delay if touch and this event hasn't been selected yet\n (ev.isTouch && eventInstanceId !== component.props.eventSelection) ?\n getComponentTouchDelay$1(component) :\n null;\n mirror.parentNode = initialCalendar.el;\n mirror.revertDuration = component.opt('dragRevertDuration');\n var isValid = component.isValidSegDownEl(origTarget) &&\n !core.elementClosest(origTarget, '.fc-resizer');\n dragging.setIgnoreMove(!isValid);\n // disable dragging for elements that are resizable (ie, selectable)\n // but are not draggable\n _this.isDragging = isValid &&\n ev.subjectEl.classList.contains('fc-draggable');\n };\n _this.handleDragStart = function (ev) {\n var initialCalendar = _this.component.calendar;\n var eventRange = _this.eventRange;\n var eventInstanceId = eventRange.instance.instanceId;\n if (ev.isTouch) {\n // need to select a different event?\n if (eventInstanceId !== _this.component.props.eventSelection) {\n initialCalendar.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstanceId });\n }\n }\n else {\n // if now using mouse, but was previous touch interaction, clear selected event\n initialCalendar.dispatch({ type: 'UNSELECT_EVENT' });\n }\n if (_this.isDragging) {\n initialCalendar.unselect(ev); // unselect *date* selection\n initialCalendar.publiclyTrigger('eventDragStart', [\n {\n el: _this.subjectSeg.el,\n event: new core.EventApi(initialCalendar, eventRange.def, eventRange.instance),\n jsEvent: ev.origEvent,\n view: _this.component.view\n }\n ]);\n }\n };\n _this.handleHitUpdate = function (hit, isFinal) {\n if (!_this.isDragging) {\n return;\n }\n var relevantEvents = _this.relevantEvents;\n var initialHit = _this.hitDragging.initialHit;\n var initialCalendar = _this.component.calendar;\n // states based on new hit\n var receivingCalendar = null;\n var mutation = null;\n var mutatedRelevantEvents = null;\n var isInvalid = false;\n var interaction = {\n affectedEvents: relevantEvents,\n mutatedEvents: core.createEmptyEventStore(),\n isEvent: true,\n origSeg: _this.subjectSeg\n };\n if (hit) {\n var receivingComponent = hit.component;\n receivingCalendar = receivingComponent.calendar;\n if (initialCalendar === receivingCalendar ||\n receivingComponent.opt('editable') && receivingComponent.opt('droppable')) {\n mutation = computeEventMutation(initialHit, hit, receivingCalendar.pluginSystem.hooks.eventDragMutationMassagers);\n if (mutation) {\n mutatedRelevantEvents = core.applyMutationToEventStore(relevantEvents, receivingCalendar.eventUiBases, mutation, receivingCalendar);\n interaction.mutatedEvents = mutatedRelevantEvents;\n if (!receivingComponent.isInteractionValid(interaction)) {\n isInvalid = true;\n mutation = null;\n mutatedRelevantEvents = null;\n interaction.mutatedEvents = core.createEmptyEventStore();\n }\n }\n }\n else {\n receivingCalendar = null;\n }\n }\n _this.displayDrag(receivingCalendar, interaction);\n if (!isInvalid) {\n core.enableCursor();\n }\n else {\n core.disableCursor();\n }\n if (!isFinal) {\n if (initialCalendar === receivingCalendar && // TODO: write test for this\n isHitsEqual(initialHit, hit)) {\n mutation = null;\n }\n _this.dragging.setMirrorNeedsRevert(!mutation);\n // render the mirror if no already-rendered mirror\n // TODO: wish we could somehow wait for dispatch to guarantee render\n _this.dragging.setMirrorIsVisible(!hit || !document.querySelector('.fc-mirror'));\n // assign states based on new hit\n _this.receivingCalendar = receivingCalendar;\n _this.validMutation = mutation;\n _this.mutatedRelevantEvents = mutatedRelevantEvents;\n }\n };\n _this.handlePointerUp = function () {\n if (!_this.isDragging) {\n _this.cleanup(); // because handleDragEnd won't fire\n }\n };\n _this.handleDragEnd = function (ev) {\n if (_this.isDragging) {\n var initialCalendar_1 = _this.component.calendar;\n var initialView = _this.component.view;\n var receivingCalendar = _this.receivingCalendar;\n var eventDef = _this.eventRange.def;\n var eventInstance = _this.eventRange.instance;\n var eventApi = new core.EventApi(initialCalendar_1, eventDef, eventInstance);\n var relevantEvents_1 = _this.relevantEvents;\n var mutatedRelevantEvents = _this.mutatedRelevantEvents;\n var finalHit = _this.hitDragging.finalHit;\n _this.clearDrag(); // must happen after revert animation\n initialCalendar_1.publiclyTrigger('eventDragStop', [\n {\n el: _this.subjectSeg.el,\n event: eventApi,\n jsEvent: ev.origEvent,\n view: initialView\n }\n ]);\n if (_this.validMutation) {\n // dropped within same calendar\n if (receivingCalendar === initialCalendar_1) {\n initialCalendar_1.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: mutatedRelevantEvents\n });\n var eventDropArg = {};\n for (var _i = 0, _a = initialCalendar_1.pluginSystem.hooks.eventDropTransformers; _i < _a.length; _i++) {\n var transformer = _a[_i];\n __assign(eventDropArg, transformer(_this.validMutation, initialCalendar_1));\n }\n __assign(eventDropArg, {\n el: ev.subjectEl,\n delta: _this.validMutation.startDelta,\n oldEvent: eventApi,\n event: new core.EventApi(// the data AFTER the mutation\n initialCalendar_1, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null),\n revert: function () {\n initialCalendar_1.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: relevantEvents_1\n });\n },\n jsEvent: ev.origEvent,\n view: initialView\n });\n initialCalendar_1.publiclyTrigger('eventDrop', [eventDropArg]);\n // dropped in different calendar\n }\n else if (receivingCalendar) {\n initialCalendar_1.publiclyTrigger('eventLeave', [\n {\n draggedEl: ev.subjectEl,\n event: eventApi,\n view: initialView\n }\n ]);\n initialCalendar_1.dispatch({\n type: 'REMOVE_EVENT_INSTANCES',\n instances: _this.mutatedRelevantEvents.instances\n });\n receivingCalendar.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: _this.mutatedRelevantEvents\n });\n if (ev.isTouch) {\n receivingCalendar.dispatch({\n type: 'SELECT_EVENT',\n eventInstanceId: eventInstance.instanceId\n });\n }\n var dropArg = receivingCalendar.buildDatePointApi(finalHit.dateSpan);\n dropArg.draggedEl = ev.subjectEl;\n dropArg.jsEvent = ev.origEvent;\n dropArg.view = finalHit.component; // ?\n receivingCalendar.publiclyTrigger('drop', [dropArg]);\n receivingCalendar.publiclyTrigger('eventReceive', [\n {\n draggedEl: ev.subjectEl,\n event: new core.EventApi(// the data AFTER the mutation\n receivingCalendar, mutatedRelevantEvents.defs[eventDef.defId], mutatedRelevantEvents.instances[eventInstance.instanceId]),\n view: finalHit.component\n }\n ]);\n }\n }\n else {\n initialCalendar_1.publiclyTrigger('_noEventDrop');\n }\n }\n _this.cleanup();\n };\n var component = _this.component;\n var dragging = _this.dragging = new FeaturefulElementDragging(component.el);\n dragging.pointer.selector = EventDragging.SELECTOR;\n dragging.touchScrollAllowed = false;\n dragging.autoScroller.isEnabled = component.opt('dragScroll');\n var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsStore);\n hitDragging.useSubjectCenter = settings.useEventCenter;\n hitDragging.emitter.on('pointerdown', _this.handlePointerDown);\n hitDragging.emitter.on('dragstart', _this.handleDragStart);\n hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);\n hitDragging.emitter.on('pointerup', _this.handlePointerUp);\n hitDragging.emitter.on('dragend', _this.handleDragEnd);\n return _this;\n }\n EventDragging.prototype.destroy = function () {\n this.dragging.destroy();\n };\n // render a drag state on the next receivingCalendar\n EventDragging.prototype.displayDrag = function (nextCalendar, state) {\n var initialCalendar = this.component.calendar;\n var prevCalendar = this.receivingCalendar;\n // does the previous calendar need to be cleared?\n if (prevCalendar && prevCalendar !== nextCalendar) {\n // does the initial calendar need to be cleared?\n // if so, don't clear all the way. we still need to to hide the affectedEvents\n if (prevCalendar === initialCalendar) {\n prevCalendar.dispatch({\n type: 'SET_EVENT_DRAG',\n state: {\n affectedEvents: state.affectedEvents,\n mutatedEvents: core.createEmptyEventStore(),\n isEvent: true,\n origSeg: state.origSeg\n }\n });\n // completely clear the old calendar if it wasn't the initial\n }\n else {\n prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });\n }\n }\n if (nextCalendar) {\n nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });\n }\n };\n EventDragging.prototype.clearDrag = function () {\n var initialCalendar = this.component.calendar;\n var receivingCalendar = this.receivingCalendar;\n if (receivingCalendar) {\n receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });\n }\n // the initial calendar might have an dummy drag state from displayDrag\n if (initialCalendar !== receivingCalendar) {\n initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });\n }\n };\n EventDragging.prototype.cleanup = function () {\n this.subjectSeg = null;\n this.isDragging = false;\n this.eventRange = null;\n this.relevantEvents = null;\n this.receivingCalendar = null;\n this.validMutation = null;\n this.mutatedRelevantEvents = null;\n };\n EventDragging.SELECTOR = '.fc-draggable, .fc-resizable'; // TODO: test this in IE11\n return EventDragging;\n }(core.Interaction));\n function computeEventMutation(hit0, hit1, massagers) {\n var dateSpan0 = hit0.dateSpan;\n var dateSpan1 = hit1.dateSpan;\n var date0 = dateSpan0.range.start;\n var date1 = dateSpan1.range.start;\n var standardProps = {};\n if (dateSpan0.allDay !== dateSpan1.allDay) {\n standardProps.allDay = dateSpan1.allDay;\n standardProps.hasEnd = hit1.component.opt('allDayMaintainDuration');\n if (dateSpan1.allDay) {\n // means date1 is already start-of-day,\n // but date0 needs to be converted\n date0 = core.startOfDay(date0);\n }\n }\n var delta = core.diffDates(date0, date1, hit0.component.dateEnv, hit0.component === hit1.component ?\n hit0.component.largeUnit :\n null);\n if (delta.milliseconds) { // has hours/minutes/seconds\n standardProps.allDay = false;\n }\n var mutation = {\n startDelta: delta,\n endDelta: delta,\n standardProps: standardProps\n };\n for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) {\n var massager = massagers_1[_i];\n massager(mutation, hit0, hit1);\n }\n return mutation;\n }\n function getComponentTouchDelay$1(component) {\n var delay = component.opt('eventLongPressDelay');\n if (delay == null) {\n delay = component.opt('longPressDelay');\n }\n return delay;\n }\n\n var EventDragging$1 = /** @class */ (function (_super) {\n __extends(EventDragging, _super);\n function EventDragging(settings) {\n var _this = _super.call(this, settings) || this;\n // internal state\n _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg?\n _this.eventRange = null;\n _this.relevantEvents = null;\n _this.validMutation = null;\n _this.mutatedRelevantEvents = null;\n _this.handlePointerDown = function (ev) {\n var component = _this.component;\n var seg = _this.querySeg(ev);\n var eventRange = _this.eventRange = seg.eventRange;\n _this.dragging.minDistance = component.opt('eventDragMinDistance');\n // if touch, need to be working with a selected event\n _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) ||\n (ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId));\n };\n _this.handleDragStart = function (ev) {\n var calendar = _this.component.calendar;\n var eventRange = _this.eventRange;\n _this.relevantEvents = core.getRelevantEvents(calendar.state.eventStore, _this.eventRange.instance.instanceId);\n _this.draggingSeg = _this.querySeg(ev);\n calendar.unselect();\n calendar.publiclyTrigger('eventResizeStart', [\n {\n el: _this.draggingSeg.el,\n event: new core.EventApi(calendar, eventRange.def, eventRange.instance),\n jsEvent: ev.origEvent,\n view: _this.component.view\n }\n ]);\n };\n _this.handleHitUpdate = function (hit, isFinal, ev) {\n var calendar = _this.component.calendar;\n var relevantEvents = _this.relevantEvents;\n var initialHit = _this.hitDragging.initialHit;\n var eventInstance = _this.eventRange.instance;\n var mutation = null;\n var mutatedRelevantEvents = null;\n var isInvalid = false;\n var interaction = {\n affectedEvents: relevantEvents,\n mutatedEvents: core.createEmptyEventStore(),\n isEvent: true,\n origSeg: _this.draggingSeg\n };\n if (hit) {\n mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-start-resizer'), eventInstance.range, calendar.pluginSystem.hooks.eventResizeJoinTransforms);\n }\n if (mutation) {\n mutatedRelevantEvents = core.applyMutationToEventStore(relevantEvents, calendar.eventUiBases, mutation, calendar);\n interaction.mutatedEvents = mutatedRelevantEvents;\n if (!_this.component.isInteractionValid(interaction)) {\n isInvalid = true;\n mutation = null;\n mutatedRelevantEvents = null;\n interaction.mutatedEvents = null;\n }\n }\n if (mutatedRelevantEvents) {\n calendar.dispatch({\n type: 'SET_EVENT_RESIZE',\n state: interaction\n });\n }\n else {\n calendar.dispatch({ type: 'UNSET_EVENT_RESIZE' });\n }\n if (!isInvalid) {\n core.enableCursor();\n }\n else {\n core.disableCursor();\n }\n if (!isFinal) {\n if (mutation && isHitsEqual(initialHit, hit)) {\n mutation = null;\n }\n _this.validMutation = mutation;\n _this.mutatedRelevantEvents = mutatedRelevantEvents;\n }\n };\n _this.handleDragEnd = function (ev) {\n var calendar = _this.component.calendar;\n var view = _this.component.view;\n var eventDef = _this.eventRange.def;\n var eventInstance = _this.eventRange.instance;\n var eventApi = new core.EventApi(calendar, eventDef, eventInstance);\n var relevantEvents = _this.relevantEvents;\n var mutatedRelevantEvents = _this.mutatedRelevantEvents;\n calendar.publiclyTrigger('eventResizeStop', [\n {\n el: _this.draggingSeg.el,\n event: eventApi,\n jsEvent: ev.origEvent,\n view: view\n }\n ]);\n if (_this.validMutation) {\n calendar.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: mutatedRelevantEvents\n });\n calendar.publiclyTrigger('eventResize', [\n {\n el: _this.draggingSeg.el,\n startDelta: _this.validMutation.startDelta || core.createDuration(0),\n endDelta: _this.validMutation.endDelta || core.createDuration(0),\n prevEvent: eventApi,\n event: new core.EventApi(// the data AFTER the mutation\n calendar, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null),\n revert: function () {\n calendar.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: relevantEvents\n });\n },\n jsEvent: ev.origEvent,\n view: view\n }\n ]);\n }\n else {\n calendar.publiclyTrigger('_noEventResize');\n }\n // reset all internal state\n _this.draggingSeg = null;\n _this.relevantEvents = null;\n _this.validMutation = null;\n // okay to keep eventInstance around. useful to set it in handlePointerDown\n };\n var component = settings.component;\n var dragging = _this.dragging = new FeaturefulElementDragging(component.el);\n dragging.pointer.selector = '.fc-resizer';\n dragging.touchScrollAllowed = false;\n dragging.autoScroller.isEnabled = component.opt('dragScroll');\n var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));\n hitDragging.emitter.on('pointerdown', _this.handlePointerDown);\n hitDragging.emitter.on('dragstart', _this.handleDragStart);\n hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);\n hitDragging.emitter.on('dragend', _this.handleDragEnd);\n return _this;\n }\n EventDragging.prototype.destroy = function () {\n this.dragging.destroy();\n };\n EventDragging.prototype.querySeg = function (ev) {\n return core.getElSeg(core.elementClosest(ev.subjectEl, this.component.fgSegSelector));\n };\n return EventDragging;\n }(core.Interaction));\n function computeMutation(hit0, hit1, isFromStart, instanceRange, transforms) {\n var dateEnv = hit0.component.dateEnv;\n var date0 = hit0.dateSpan.range.start;\n var date1 = hit1.dateSpan.range.start;\n var delta = core.diffDates(date0, date1, dateEnv, hit0.component.largeUnit);\n var props = {};\n for (var _i = 0, transforms_1 = transforms; _i < transforms_1.length; _i++) {\n var transform = transforms_1[_i];\n var res = transform(hit0, hit1);\n if (res === false) {\n return null;\n }\n else if (res) {\n __assign(props, res);\n }\n }\n if (isFromStart) {\n if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) {\n props.startDelta = delta;\n return props;\n }\n }\n else {\n if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) {\n props.endDelta = delta;\n return props;\n }\n }\n return null;\n }\n\n var UnselectAuto = /** @class */ (function () {\n function UnselectAuto(calendar) {\n var _this = this;\n this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system\n this.onSelect = function (selectInfo) {\n if (selectInfo.jsEvent) {\n _this.isRecentPointerDateSelect = true;\n }\n };\n this.onDocumentPointerUp = function (pev) {\n var _a = _this, calendar = _a.calendar, documentPointer = _a.documentPointer;\n var state = calendar.state;\n // touch-scrolling should never unfocus any type of selection\n if (!documentPointer.wasTouchScroll) {\n if (state.dateSelection && // an existing date selection?\n !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp?\n ) {\n var unselectAuto = calendar.viewOpt('unselectAuto');\n var unselectCancel = calendar.viewOpt('unselectCancel');\n if (unselectAuto && (!unselectAuto || !core.elementClosest(documentPointer.downEl, unselectCancel))) {\n calendar.unselect(pev);\n }\n }\n if (state.eventSelection && // an existing event selected?\n !core.elementClosest(documentPointer.downEl, EventDragging.SELECTOR) // interaction DIDN'T start on an event\n ) {\n calendar.dispatch({ type: 'UNSELECT_EVENT' });\n }\n }\n _this.isRecentPointerDateSelect = false;\n };\n this.calendar = calendar;\n var documentPointer = this.documentPointer = new PointerDragging(document);\n documentPointer.shouldIgnoreMove = true;\n documentPointer.shouldWatchScroll = false;\n documentPointer.emitter.on('pointerup', this.onDocumentPointerUp);\n /*\n TODO: better way to know about whether there was a selection with the pointer\n */\n calendar.on('select', this.onSelect);\n }\n UnselectAuto.prototype.destroy = function () {\n this.calendar.off('select', this.onSelect);\n this.documentPointer.destroy();\n };\n return UnselectAuto;\n }());\n\n /*\n Given an already instantiated draggable object for one-or-more elements,\n Interprets any dragging as an attempt to drag an events that lives outside\n of a calendar onto a calendar.\n */\n var ExternalElementDragging = /** @class */ (function () {\n function ExternalElementDragging(dragging, suppliedDragMeta) {\n var _this = this;\n this.receivingCalendar = null;\n this.droppableEvent = null; // will exist for all drags, even if create:false\n this.suppliedDragMeta = null;\n this.dragMeta = null;\n this.handleDragStart = function (ev) {\n _this.dragMeta = _this.buildDragMeta(ev.subjectEl);\n };\n this.handleHitUpdate = function (hit, isFinal, ev) {\n var dragging = _this.hitDragging.dragging;\n var receivingCalendar = null;\n var droppableEvent = null;\n var isInvalid = false;\n var interaction = {\n affectedEvents: core.createEmptyEventStore(),\n mutatedEvents: core.createEmptyEventStore(),\n isEvent: _this.dragMeta.create,\n origSeg: null\n };\n if (hit) {\n receivingCalendar = hit.component.calendar;\n if (_this.canDropElOnCalendar(ev.subjectEl, receivingCalendar)) {\n droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingCalendar);\n interaction.mutatedEvents = core.eventTupleToStore(droppableEvent);\n isInvalid = !core.isInteractionValid(interaction, receivingCalendar);\n if (isInvalid) {\n interaction.mutatedEvents = core.createEmptyEventStore();\n droppableEvent = null;\n }\n }\n }\n _this.displayDrag(receivingCalendar, interaction);\n // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?)\n // TODO: wish we could somehow wait for dispatch to guarantee render\n dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-mirror'));\n if (!isInvalid) {\n core.enableCursor();\n }\n else {\n core.disableCursor();\n }\n if (!isFinal) {\n dragging.setMirrorNeedsRevert(!droppableEvent);\n _this.receivingCalendar = receivingCalendar;\n _this.droppableEvent = droppableEvent;\n }\n };\n this.handleDragEnd = function (pev) {\n var _a = _this, receivingCalendar = _a.receivingCalendar, droppableEvent = _a.droppableEvent;\n _this.clearDrag();\n if (receivingCalendar && droppableEvent) {\n var finalHit = _this.hitDragging.finalHit;\n var finalView = finalHit.component.view;\n var dragMeta = _this.dragMeta;\n var arg = receivingCalendar.buildDatePointApi(finalHit.dateSpan);\n arg.draggedEl = pev.subjectEl;\n arg.jsEvent = pev.origEvent;\n arg.view = finalView;\n receivingCalendar.publiclyTrigger('drop', [arg]);\n if (dragMeta.create) {\n receivingCalendar.dispatch({\n type: 'MERGE_EVENTS',\n eventStore: core.eventTupleToStore(droppableEvent)\n });\n if (pev.isTouch) {\n receivingCalendar.dispatch({\n type: 'SELECT_EVENT',\n eventInstanceId: droppableEvent.instance.instanceId\n });\n }\n // signal that an external event landed\n receivingCalendar.publiclyTrigger('eventReceive', [\n {\n draggedEl: pev.subjectEl,\n event: new core.EventApi(receivingCalendar, droppableEvent.def, droppableEvent.instance),\n view: finalView\n }\n ]);\n }\n }\n _this.receivingCalendar = null;\n _this.droppableEvent = null;\n };\n var hitDragging = this.hitDragging = new HitDragging(dragging, core.interactionSettingsStore);\n hitDragging.requireInitial = false; // will start outside of a component\n hitDragging.emitter.on('dragstart', this.handleDragStart);\n hitDragging.emitter.on('hitupdate', this.handleHitUpdate);\n hitDragging.emitter.on('dragend', this.handleDragEnd);\n this.suppliedDragMeta = suppliedDragMeta;\n }\n ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) {\n if (typeof this.suppliedDragMeta === 'object') {\n return core.parseDragMeta(this.suppliedDragMeta);\n }\n else if (typeof this.suppliedDragMeta === 'function') {\n return core.parseDragMeta(this.suppliedDragMeta(subjectEl));\n }\n else {\n return getDragMetaFromEl(subjectEl);\n }\n };\n ExternalElementDragging.prototype.displayDrag = function (nextCalendar, state) {\n var prevCalendar = this.receivingCalendar;\n if (prevCalendar && prevCalendar !== nextCalendar) {\n prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });\n }\n if (nextCalendar) {\n nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });\n }\n };\n ExternalElementDragging.prototype.clearDrag = function () {\n if (this.receivingCalendar) {\n this.receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });\n }\n };\n ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingCalendar) {\n var dropAccept = receivingCalendar.opt('dropAccept');\n if (typeof dropAccept === 'function') {\n return dropAccept(el);\n }\n else if (typeof dropAccept === 'string' && dropAccept) {\n return Boolean(core.elementMatches(el, dropAccept));\n }\n return true;\n };\n return ExternalElementDragging;\n }());\n // Utils for computing event store from the DragMeta\n // ----------------------------------------------------------------------------------------------------\n function computeEventForDateSpan(dateSpan, dragMeta, calendar) {\n var defProps = __assign({}, dragMeta.leftoverProps);\n for (var _i = 0, _a = calendar.pluginSystem.hooks.externalDefTransforms; _i < _a.length; _i++) {\n var transform = _a[_i];\n __assign(defProps, transform(dateSpan, dragMeta));\n }\n var def = core.parseEventDef(defProps, dragMeta.sourceId, dateSpan.allDay, calendar.opt('forceEventDuration') || Boolean(dragMeta.duration), // hasEnd\n calendar);\n var start = dateSpan.range.start;\n // only rely on time info if drop zone is all-day,\n // otherwise, we already know the time\n if (dateSpan.allDay && dragMeta.startTime) {\n start = calendar.dateEnv.add(start, dragMeta.startTime);\n }\n var end = dragMeta.duration ?\n calendar.dateEnv.add(start, dragMeta.duration) :\n calendar.getDefaultEventEnd(dateSpan.allDay, start);\n var instance = core.createEventInstance(def.defId, { start: start, end: end });\n return { def: def, instance: instance };\n }\n // Utils for extracting data from element\n // ----------------------------------------------------------------------------------------------------\n function getDragMetaFromEl(el) {\n var str = getEmbeddedElData(el, 'event');\n var obj = str ?\n JSON.parse(str) :\n { create: false }; // if no embedded data, assume no event creation\n return core.parseDragMeta(obj);\n }\n core.config.dataAttrPrefix = '';\n function getEmbeddedElData(el, name) {\n var prefix = core.config.dataAttrPrefix;\n var prefixedName = (prefix ? prefix + '-' : '') + name;\n return el.getAttribute('data-' + prefixedName) || '';\n }\n\n /*\n Makes an element (that is *external* to any calendar) draggable.\n Can pass in data that determines how an event will be created when dropped onto a calendar.\n Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system.\n */\n var ExternalDraggable = /** @class */ (function () {\n function ExternalDraggable(el, settings) {\n var _this = this;\n if (settings === void 0) { settings = {}; }\n this.handlePointerDown = function (ev) {\n var dragging = _this.dragging;\n var _a = _this.settings, minDistance = _a.minDistance, longPressDelay = _a.longPressDelay;\n dragging.minDistance =\n minDistance != null ?\n minDistance :\n (ev.isTouch ? 0 : core.globalDefaults.eventDragMinDistance);\n dragging.delay =\n ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv\n (longPressDelay != null ? longPressDelay : core.globalDefaults.longPressDelay) :\n 0;\n };\n this.handleDragStart = function (ev) {\n if (ev.isTouch &&\n _this.dragging.delay &&\n ev.subjectEl.classList.contains('fc-event')) {\n _this.dragging.mirror.getMirrorEl().classList.add('fc-selected');\n }\n };\n this.settings = settings;\n var dragging = this.dragging = new FeaturefulElementDragging(el);\n dragging.touchScrollAllowed = false;\n if (settings.itemSelector != null) {\n dragging.pointer.selector = settings.itemSelector;\n }\n if (settings.appendTo != null) {\n dragging.mirror.parentNode = settings.appendTo; // TODO: write tests\n }\n dragging.emitter.on('pointerdown', this.handlePointerDown);\n dragging.emitter.on('dragstart', this.handleDragStart);\n new ExternalElementDragging(dragging, settings.eventData);\n }\n ExternalDraggable.prototype.destroy = function () {\n this.dragging.destroy();\n };\n return ExternalDraggable;\n }());\n\n /*\n Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements.\n The third-party system is responsible for drawing the visuals effects of the drag.\n This class simply monitors for pointer movements and fires events.\n It also has the ability to hide the moving element (the \"mirror\") during the drag.\n */\n var InferredElementDragging = /** @class */ (function (_super) {\n __extends(InferredElementDragging, _super);\n function InferredElementDragging(containerEl) {\n var _this = _super.call(this, containerEl) || this;\n _this.shouldIgnoreMove = false;\n _this.mirrorSelector = '';\n _this.currentMirrorEl = null;\n _this.handlePointerDown = function (ev) {\n _this.emitter.trigger('pointerdown', ev);\n if (!_this.shouldIgnoreMove) {\n // fire dragstart right away. does not support delay or min-distance\n _this.emitter.trigger('dragstart', ev);\n }\n };\n _this.handlePointerMove = function (ev) {\n if (!_this.shouldIgnoreMove) {\n _this.emitter.trigger('dragmove', ev);\n }\n };\n _this.handlePointerUp = function (ev) {\n _this.emitter.trigger('pointerup', ev);\n if (!_this.shouldIgnoreMove) {\n // fire dragend right away. does not support a revert animation\n _this.emitter.trigger('dragend', ev);\n }\n };\n var pointer = _this.pointer = new PointerDragging(containerEl);\n pointer.emitter.on('pointerdown', _this.handlePointerDown);\n pointer.emitter.on('pointermove', _this.handlePointerMove);\n pointer.emitter.on('pointerup', _this.handlePointerUp);\n return _this;\n }\n InferredElementDragging.prototype.destroy = function () {\n this.pointer.destroy();\n };\n InferredElementDragging.prototype.setIgnoreMove = function (bool) {\n this.shouldIgnoreMove = bool;\n };\n InferredElementDragging.prototype.setMirrorIsVisible = function (bool) {\n if (bool) {\n // restore a previously hidden element.\n // use the reference in case the selector class has already been removed.\n if (this.currentMirrorEl) {\n this.currentMirrorEl.style.visibility = '';\n this.currentMirrorEl = null;\n }\n }\n else {\n var mirrorEl = this.mirrorSelector ?\n document.querySelector(this.mirrorSelector) :\n null;\n if (mirrorEl) {\n this.currentMirrorEl = mirrorEl;\n mirrorEl.style.visibility = 'hidden';\n }\n }\n };\n return InferredElementDragging;\n }(core.ElementDragging));\n\n /*\n Bridges third-party drag-n-drop systems with FullCalendar.\n Must be instantiated and destroyed by caller.\n */\n var ThirdPartyDraggable = /** @class */ (function () {\n function ThirdPartyDraggable(containerOrSettings, settings) {\n var containerEl = document;\n if (\n // wish we could just test instanceof EventTarget, but doesn't work in IE11\n containerOrSettings === document ||\n containerOrSettings instanceof Element) {\n containerEl = containerOrSettings;\n settings = settings || {};\n }\n else {\n settings = (containerOrSettings || {});\n }\n var dragging = this.dragging = new InferredElementDragging(containerEl);\n if (typeof settings.itemSelector === 'string') {\n dragging.pointer.selector = settings.itemSelector;\n }\n else if (containerEl === document) {\n dragging.pointer.selector = '[data-event]';\n }\n if (typeof settings.mirrorSelector === 'string') {\n dragging.mirrorSelector = settings.mirrorSelector;\n }\n new ExternalElementDragging(dragging, settings.eventData);\n }\n ThirdPartyDraggable.prototype.destroy = function () {\n this.dragging.destroy();\n };\n return ThirdPartyDraggable;\n }());\n\n var main = core.createPlugin({\n componentInteractions: [DateClicking, DateSelecting, EventDragging, EventDragging$1],\n calendarInteractions: [UnselectAuto],\n elementDraggingImpl: FeaturefulElementDragging\n });\n\n exports.Draggable = ExternalDraggable;\n exports.FeaturefulElementDragging = FeaturefulElementDragging;\n exports.PointerDragging = PointerDragging;\n exports.ThirdPartyDraggable = ThirdPartyDraggable;\n exports.default = main;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n","\n/* **********************************************\n Begin prism-core.js\n********************************************** */\n\nvar _self = (typeof window !== 'undefined')\n\t? window // if in browser\n\t: (\n\t\t(typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)\n\t\t? self // if in worker\n\t\t: {} // if in node js\n\t);\n\n/**\n * Prism: Lightweight, robust, elegant syntax highlighting\n * MIT license http://www.opensource.org/licenses/mit-license.php/\n * @author Lea Verou http://lea.verou.me\n */\n\nvar Prism = (function(){\n\n// Private helper vars\nvar lang = /\\blang(?:uage)?-([\\w-]+)\\b/i;\nvar uniqueId = 0;\n\nvar _ = _self.Prism = {\n\tmanual: _self.Prism && _self.Prism.manual,\n\tdisableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,\n\tutil: {\n\t\tencode: function (tokens) {\n\t\t\tif (tokens instanceof Token) {\n\t\t\t\treturn new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);\n\t\t\t} else if (_.util.type(tokens) === 'Array') {\n\t\t\t\treturn tokens.map(_.util.encode);\n\t\t\t} else {\n\t\t\t\treturn tokens.replace(/&/g, '&').replace(/ text.length) {\n\t\t\t\t\t\t// Something went terribly wrong, ABORT, ABORT!\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (str instanceof Token) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (greedy && i != strarr.length - 1) {\n\t\t\t\t\t\tpattern.lastIndex = pos;\n\t\t\t\t\t\tvar match = pattern.exec(text);\n\t\t\t\t\t\tif (!match) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar from = match.index + (lookbehind ? match[1].length : 0),\n\t\t\t\t\t\t to = match.index + match[0].length,\n\t\t\t\t\t\t k = i,\n\t\t\t\t\t\t p = pos;\n\n\t\t\t\t\t\tfor (var len = strarr.length; k < len && (p < to || (!strarr[k].type && !strarr[k - 1].greedy)); ++k) {\n\t\t\t\t\t\t\tp += strarr[k].length;\n\t\t\t\t\t\t\t// Move the index i to the element in strarr that is closest to from\n\t\t\t\t\t\t\tif (from >= p) {\n\t\t\t\t\t\t\t\t++i;\n\t\t\t\t\t\t\t\tpos = p;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If strarr[i] is a Token, then the match starts inside another Token, which is invalid\n\t\t\t\t\t\tif (strarr[i] instanceof Token) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Number of tokens to delete and replace with the new match\n\t\t\t\t\t\tdelNum = k - i;\n\t\t\t\t\t\tstr = text.slice(pos, p);\n\t\t\t\t\t\tmatch.index -= pos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpattern.lastIndex = 0;\n\n\t\t\t\t\t\tvar match = pattern.exec(str),\n\t\t\t\t\t\t\tdelNum = 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!match) {\n\t\t\t\t\t\tif (oneshot) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(lookbehind) {\n\t\t\t\t\t\tlookbehindLength = match[1] ? match[1].length : 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar from = match.index + lookbehindLength,\n\t\t\t\t\t match = match[0].slice(lookbehindLength),\n\t\t\t\t\t to = from + match.length,\n\t\t\t\t\t before = str.slice(0, from),\n\t\t\t\t\t after = str.slice(to);\n\n\t\t\t\t\tvar args = [i, delNum];\n\n\t\t\t\t\tif (before) {\n\t\t\t\t\t\t++i;\n\t\t\t\t\t\tpos += before.length;\n\t\t\t\t\t\targs.push(before);\n\t\t\t\t\t}\n\n\t\t\t\t\tvar wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias, match, greedy);\n\n\t\t\t\t\targs.push(wrapped);\n\n\t\t\t\t\tif (after) {\n\t\t\t\t\t\targs.push(after);\n\t\t\t\t\t}\n\n\t\t\t\t\tArray.prototype.splice.apply(strarr, args);\n\n\t\t\t\t\tif (delNum != 1)\n\t\t\t\t\t\t_.matchGrammar(text, strarr, grammar, i, pos, true, token);\n\n\t\t\t\t\tif (oneshot)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\ttokenize: function(text, grammar, language) {\n\t\tvar strarr = [text];\n\n\t\tvar rest = grammar.rest;\n\n\t\tif (rest) {\n\t\t\tfor (var token in rest) {\n\t\t\t\tgrammar[token] = rest[token];\n\t\t\t}\n\n\t\t\tdelete grammar.rest;\n\t\t}\n\n\t\t_.matchGrammar(text, strarr, grammar, 0, 0, false);\n\n\t\treturn strarr;\n\t},\n\n\thooks: {\n\t\tall: {},\n\n\t\tadd: function (name, callback) {\n\t\t\tvar hooks = _.hooks.all;\n\n\t\t\thooks[name] = hooks[name] || [];\n\n\t\t\thooks[name].push(callback);\n\t\t},\n\n\t\trun: function (name, env) {\n\t\t\tvar callbacks = _.hooks.all[name];\n\n\t\t\tif (!callbacks || !callbacks.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (var i=0, callback; callback = callbacks[i++];) {\n\t\t\t\tcallback(env);\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar Token = _.Token = function(type, content, alias, matchedStr, greedy) {\n\tthis.type = type;\n\tthis.content = content;\n\tthis.alias = alias;\n\t// Copy of the full string this token was created from\n\tthis.length = (matchedStr || \"\").length|0;\n\tthis.greedy = !!greedy;\n};\n\nToken.stringify = function(o, language, parent) {\n\tif (typeof o == 'string') {\n\t\treturn o;\n\t}\n\n\tif (_.util.type(o) === 'Array') {\n\t\treturn o.map(function(element) {\n\t\t\treturn Token.stringify(element, language, o);\n\t\t}).join('');\n\t}\n\n\tvar env = {\n\t\ttype: o.type,\n\t\tcontent: Token.stringify(o.content, language, parent),\n\t\ttag: 'span',\n\t\tclasses: ['token', o.type],\n\t\tattributes: {},\n\t\tlanguage: language,\n\t\tparent: parent\n\t};\n\n\tif (o.alias) {\n\t\tvar aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias];\n\t\tArray.prototype.push.apply(env.classes, aliases);\n\t}\n\n\t_.hooks.run('wrap', env);\n\n\tvar attributes = Object.keys(env.attributes).map(function(name) {\n\t\treturn name + '=\"' + (env.attributes[name] || '').replace(/\"/g, '"') + '\"';\n\t}).join(' ');\n\n\treturn '<' + env.tag + ' class=\"' + env.classes.join(' ') + '\"' + (attributes ? ' ' + attributes : '') + '>' + env.content + '';\n\n};\n\nif (!_self.document) {\n\tif (!_self.addEventListener) {\n\t\t// in Node.js\n\t\treturn _self.Prism;\n\t}\n\n\tif (!_.disableWorkerMessageHandler) {\n\t\t// In worker\n\t\t_self.addEventListener('message', function (evt) {\n\t\t\tvar message = JSON.parse(evt.data),\n\t\t\t\tlang = message.language,\n\t\t\t\tcode = message.code,\n\t\t\t\timmediateClose = message.immediateClose;\n\n\t\t\t_self.postMessage(_.highlight(code, _.languages[lang], lang));\n\t\t\tif (immediateClose) {\n\t\t\t\t_self.close();\n\t\t\t}\n\t\t}, false);\n\t}\n\n\treturn _self.Prism;\n}\n\n//Get current script and highlight\nvar script = document.currentScript || [].slice.call(document.getElementsByTagName(\"script\")).pop();\n\nif (script) {\n\t_.filename = script.src;\n\n\tif (!_.manual && !script.hasAttribute('data-manual')) {\n\t\tif(document.readyState !== \"loading\") {\n\t\t\tif (window.requestAnimationFrame) {\n\t\t\t\twindow.requestAnimationFrame(_.highlightAll);\n\t\t\t} else {\n\t\t\t\twindow.setTimeout(_.highlightAll, 16);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tdocument.addEventListener('DOMContentLoaded', _.highlightAll);\n\t\t}\n\t}\n}\n\nreturn _self.Prism;\n\n})();\n\nif (typeof module !== 'undefined' && module.exports) {\n\tmodule.exports = Prism;\n}\n\n// hack for components to work correctly in node.js\nif (typeof global !== 'undefined') {\n\tglobal.Prism = Prism;\n}\n\n\n/* **********************************************\n Begin prism-markup.js\n********************************************** */\n\nPrism.languages.markup = {\n\t'comment': //,\n\t'prolog': /<\\?[\\s\\S]+?\\?>/,\n\t'doctype': //i,\n\t'cdata': //i,\n\t'tag': {\n\t\tpattern: /<\\/?(?!\\d)[^\\s>\\/=$<%]+(?:\\s+[^\\s>\\/=]+(?:=(?:(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1|[^\\s'\">=]+))?)*\\s*\\/?>/i,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'tag': {\n\t\t\t\tpattern: /^<\\/?[^\\s>\\/]+/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^<\\/?/,\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t},\n\t\t\t'attr-value': {\n\t\t\t\tpattern: /=(?:(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1|[^\\s'\">=]+)/i,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t/^=/,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /(^|[^\\\\])[\"']/,\n\t\t\t\t\t\t\tlookbehind: true\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\t'punctuation': /\\/?>/,\n\t\t\t'attr-name': {\n\t\t\t\tpattern: /[^\\s>\\/]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t},\n\t'entity': /&#?[\\da-z]{1,8};/i\n};\n\nPrism.languages.markup['tag'].inside['attr-value'].inside['entity'] =\n\tPrism.languages.markup['entity'];\n\n// Plugin to make entity title show the real entity, idea by Roman Komarov\nPrism.hooks.add('wrap', function(env) {\n\n\tif (env.type === 'entity') {\n\t\tenv.attributes['title'] = env.content.replace(/&/, '&');\n\t}\n});\n\nPrism.languages.xml = Prism.languages.markup;\nPrism.languages.html = Prism.languages.markup;\nPrism.languages.mathml = Prism.languages.markup;\nPrism.languages.svg = Prism.languages.markup;\n\n\n/* **********************************************\n Begin prism-css.js\n********************************************** */\n\nPrism.languages.css = {\n\t'comment': /\\/\\*[\\s\\S]*?\\*\\//,\n\t'atrule': {\n\t\tpattern: /@[\\w-]+?.*?(?:;|(?=\\s*\\{))/i,\n\t\tinside: {\n\t\t\t'rule': /@[\\w-]+/\n\t\t\t// See rest below\n\t\t}\n\t},\n\t'url': /url\\((?:([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1|.*?)\\)/i,\n\t'selector': /[^{}\\s][^{};]*?(?=\\s*\\{)/,\n\t'string': {\n\t\tpattern: /(\"|')(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\tgreedy: true\n\t},\n\t'property': /[-_a-z\\xA0-\\uFFFF][-\\w\\xA0-\\uFFFF]*(?=\\s*:)/i,\n\t'important': /\\B!important\\b/i,\n\t'function': /[-a-z0-9]+(?=\\()/i,\n\t'punctuation': /[(){};:]/\n};\n\nPrism.languages.css['atrule'].inside.rest = Prism.languages.css;\n\nif (Prism.languages.markup) {\n\tPrism.languages.insertBefore('markup', 'tag', {\n\t\t'style': {\n\t\t\tpattern: /()[\\s\\S]*?(?=<\\/style>)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.css,\n\t\t\talias: 'language-css',\n\t\t\tgreedy: true\n\t\t}\n\t});\n\n\tPrism.languages.insertBefore('inside', 'attr-value', {\n\t\t'style-attr': {\n\t\t\tpattern: /\\s*style=(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1/i,\n\t\t\tinside: {\n\t\t\t\t'attr-name': {\n\t\t\t\t\tpattern: /^\\s*style/i,\n\t\t\t\t\tinside: Prism.languages.markup.tag.inside\n\t\t\t\t},\n\t\t\t\t'punctuation': /^\\s*=\\s*['\"]|['\"]\\s*$/,\n\t\t\t\t'attr-value': {\n\t\t\t\t\tpattern: /.+/i,\n\t\t\t\t\tinside: Prism.languages.css\n\t\t\t\t}\n\t\t\t},\n\t\t\talias: 'language-css'\n\t\t}\n\t}, Prism.languages.markup.tag);\n}\n\n/* **********************************************\n Begin prism-clike.js\n********************************************** */\n\nPrism.languages.clike = {\n\t'comment': [\n\t\t{\n\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\tlookbehind: true\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true\n\t\t}\n\t],\n\t'string': {\n\t\tpattern: /([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\tgreedy: true\n\t},\n\t'class-name': {\n\t\tpattern: /((?:\\b(?:class|interface|extends|implements|trait|instanceof|new)\\s+)|(?:catch\\s+\\())[\\w.\\\\]+/i,\n\t\tlookbehind: true,\n\t\tinside: {\n\t\t\tpunctuation: /[.\\\\]/\n\t\t}\n\t},\n\t'keyword': /\\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\\b/,\n\t'boolean': /\\b(?:true|false)\\b/,\n\t'function': /[a-z0-9_]+(?=\\()/i,\n\t'number': /\\b0x[\\da-f]+\\b|(?:\\b\\d+\\.?\\d*|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,\n\t'operator': /--?|\\+\\+?|!=?=?|<=?|>=?|==?=?|&&?|\\|\\|?|\\?|\\*|\\/|~|\\^|%/,\n\t'punctuation': /[{}[\\];(),.:]/\n};\n\n\n/* **********************************************\n Begin prism-javascript.js\n********************************************** */\n\nPrism.languages.javascript = Prism.languages.extend('clike', {\n\t'keyword': /\\b(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\\b/,\n\t'number': /\\b(?:0[xX][\\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|NaN|Infinity)\\b|(?:\\b\\d+\\.?\\d*|\\B\\.\\d+)(?:[Ee][+-]?\\d+)?/,\n\t// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)\n\t'function': /[_$a-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*(?=\\s*\\()/i,\n\t'operator': /-[-=]?|\\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\\|[|=]?|\\*\\*?=?|\\/=?|~|\\^=?|%=?|\\?|\\.{3}/\n});\n\nPrism.languages.insertBefore('javascript', 'keyword', {\n\t'regex': {\n\t\tpattern: /((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s])\\s*)\\/(\\[[^\\]\\r\\n]+]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[gimyu]{0,5}(?=\\s*($|[\\r\\n,.;})\\]]))/,\n\t\tlookbehind: true,\n\t\tgreedy: true\n\t},\n\t// This must be declared before keyword because we use \"function\" inside the look-forward\n\t'function-variable': {\n\t\tpattern: /[_$a-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*(?=\\s*=\\s*(?:function\\b|(?:\\([^()]*\\)|[_$a-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*)\\s*=>))/i,\n\t\talias: 'function'\n\t},\n\t'constant': /\\b[A-Z][A-Z\\d_]*\\b/\n});\n\nPrism.languages.insertBefore('javascript', 'string', {\n\t'template-string': {\n\t\tpattern: /`(?:\\\\[\\s\\S]|\\${[^}]+}|[^\\\\`])*`/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'interpolation': {\n\t\t\t\tpattern: /\\${[^}]+}/,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\tpattern: /^\\${|}$/,\n\t\t\t\t\t\talias: 'punctuation'\n\t\t\t\t\t},\n\t\t\t\t\trest: null // See below\n\t\t\t\t}\n\t\t\t},\n\t\t\t'string': /[\\s\\S]+/\n\t\t}\n\t}\n});\nPrism.languages.javascript['template-string'].inside['interpolation'].inside.rest = Prism.languages.javascript;\n\nif (Prism.languages.markup) {\n\tPrism.languages.insertBefore('markup', 'tag', {\n\t\t'script': {\n\t\t\tpattern: /()[\\s\\S]*?(?=<\\/script>)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript,\n\t\t\talias: 'language-javascript',\n\t\t\tgreedy: true\n\t\t}\n\t});\n}\n\nPrism.languages.js = Prism.languages.javascript;\n\n\n/* **********************************************\n Begin prism-file-highlight.js\n********************************************** */\n\n(function () {\n\tif (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) {\n\t\treturn;\n\t}\n\n\tself.Prism.fileHighlight = function() {\n\n\t\tvar Extensions = {\n\t\t\t'js': 'javascript',\n\t\t\t'py': 'python',\n\t\t\t'rb': 'ruby',\n\t\t\t'ps1': 'powershell',\n\t\t\t'psm1': 'powershell',\n\t\t\t'sh': 'bash',\n\t\t\t'bat': 'batch',\n\t\t\t'h': 'c',\n\t\t\t'tex': 'latex'\n\t\t};\n\n\t\tArray.prototype.slice.call(document.querySelectorAll('pre[data-src]')).forEach(function (pre) {\n\t\t\tvar src = pre.getAttribute('data-src');\n\n\t\t\tvar language, parent = pre;\n\t\t\tvar lang = /\\blang(?:uage)?-([\\w-]+)\\b/i;\n\t\t\twhile (parent && !lang.test(parent.className)) {\n\t\t\t\tparent = parent.parentNode;\n\t\t\t}\n\n\t\t\tif (parent) {\n\t\t\t\tlanguage = (pre.className.match(lang) || [, ''])[1];\n\t\t\t}\n\n\t\t\tif (!language) {\n\t\t\t\tvar extension = (src.match(/\\.(\\w+)$/) || [, ''])[1];\n\t\t\t\tlanguage = Extensions[extension] || extension;\n\t\t\t}\n\n\t\t\tvar code = document.createElement('code');\n\t\t\tcode.className = 'language-' + language;\n\n\t\t\tpre.textContent = '';\n\n\t\t\tcode.textContent = 'Loading…';\n\n\t\t\tpre.appendChild(code);\n\n\t\t\tvar xhr = new XMLHttpRequest();\n\n\t\t\txhr.open('GET', src, true);\n\n\t\t\txhr.onreadystatechange = function () {\n\t\t\t\tif (xhr.readyState == 4) {\n\n\t\t\t\t\tif (xhr.status < 400 && xhr.responseText) {\n\t\t\t\t\t\tcode.textContent = xhr.responseText;\n\n\t\t\t\t\t\tPrism.highlightElement(code);\n\t\t\t\t\t}\n\t\t\t\t\telse if (xhr.status >= 400) {\n\t\t\t\t\t\tcode.textContent = '✖ Error ' + xhr.status + ' while fetching file: ' + xhr.statusText;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tcode.textContent = '✖ Error: File does not exist or is empty';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\txhr.send(null);\n\t\t});\n\n\t\tif (Prism.plugins.toolbar) {\n\t\t\tPrism.plugins.toolbar.registerButton('download-file', function (env) {\n\t\t\t\tvar pre = env.element.parentNode;\n\t\t\t\tif (!pre || !/pre/i.test(pre.nodeName) || !pre.hasAttribute('data-src') || !pre.hasAttribute('data-download-link')) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar src = pre.getAttribute('data-src');\n\t\t\t\tvar a = document.createElement('a');\n\t\t\t\ta.textContent = pre.getAttribute('data-download-link-label') || 'Download';\n\t\t\t\ta.setAttribute('download', '');\n\t\t\t\ta.href = src;\n\t\t\t\treturn a;\n\t\t\t});\n\t\t}\n\n\t};\n\n\tdocument.addEventListener('DOMContentLoaded', self.Prism.fileHighlight);\n\n})();","/*!\n * Quill Editor v1.1.8\n * https://quilljs.com/\n * Copyright (c) 2014, Jason Chen\n * Copyright (c) 2013, salesforce.com\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Quill\"] = factory();\n\telse\n\t\troot[\"Quill\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(53);\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _quill = __webpack_require__(18);\n\n\tvar _quill2 = _interopRequireDefault(_quill);\n\n\tvar _block = __webpack_require__(29);\n\n\tvar _block2 = _interopRequireDefault(_block);\n\n\tvar _break = __webpack_require__(30);\n\n\tvar _break2 = _interopRequireDefault(_break);\n\n\tvar _container = __webpack_require__(42);\n\n\tvar _container2 = _interopRequireDefault(_container);\n\n\tvar _cursor = __webpack_require__(34);\n\n\tvar _cursor2 = _interopRequireDefault(_cursor);\n\n\tvar _embed = __webpack_require__(31);\n\n\tvar _embed2 = _interopRequireDefault(_embed);\n\n\tvar _inline = __webpack_require__(32);\n\n\tvar _inline2 = _interopRequireDefault(_inline);\n\n\tvar _scroll = __webpack_require__(43);\n\n\tvar _scroll2 = _interopRequireDefault(_scroll);\n\n\tvar _text = __webpack_require__(33);\n\n\tvar _text2 = _interopRequireDefault(_text);\n\n\tvar _clipboard = __webpack_require__(44);\n\n\tvar _clipboard2 = _interopRequireDefault(_clipboard);\n\n\tvar _history = __webpack_require__(51);\n\n\tvar _history2 = _interopRequireDefault(_history);\n\n\tvar _keyboard = __webpack_require__(52);\n\n\tvar _keyboard2 = _interopRequireDefault(_keyboard);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\t_quill2.default.register({\n\t 'blots/block': _block2.default,\n\t 'blots/block/embed': _block.BlockEmbed,\n\t 'blots/break': _break2.default,\n\t 'blots/container': _container2.default,\n\t 'blots/cursor': _cursor2.default,\n\t 'blots/embed': _embed2.default,\n\t 'blots/inline': _inline2.default,\n\t 'blots/scroll': _scroll2.default,\n\t 'blots/text': _text2.default,\n\n\t 'modules/clipboard': _clipboard2.default,\n\t 'modules/history': _history2.default,\n\t 'modules/keyboard': _keyboard2.default\n\t});\n\n\t_parchment2.default.register(_block2.default, _break2.default, _cursor2.default, _inline2.default, _scroll2.default, _text2.default);\n\n\tmodule.exports = _quill2.default;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar container_1 = __webpack_require__(3);\n\tvar format_1 = __webpack_require__(7);\n\tvar leaf_1 = __webpack_require__(12);\n\tvar scroll_1 = __webpack_require__(13);\n\tvar inline_1 = __webpack_require__(14);\n\tvar block_1 = __webpack_require__(15);\n\tvar embed_1 = __webpack_require__(16);\n\tvar text_1 = __webpack_require__(17);\n\tvar attributor_1 = __webpack_require__(8);\n\tvar class_1 = __webpack_require__(10);\n\tvar style_1 = __webpack_require__(11);\n\tvar store_1 = __webpack_require__(9);\n\tvar Registry = __webpack_require__(6);\n\tvar Parchment = {\n\t Scope: Registry.Scope,\n\t create: Registry.create,\n\t find: Registry.find,\n\t query: Registry.query,\n\t register: Registry.register,\n\t Container: container_1.default,\n\t Format: format_1.default,\n\t Leaf: leaf_1.default,\n\t Embed: embed_1.default,\n\t Scroll: scroll_1.default,\n\t Block: block_1.default,\n\t Inline: inline_1.default,\n\t Text: text_1.default,\n\t Attributor: {\n\t Attribute: attributor_1.default,\n\t Class: class_1.default,\n\t Style: style_1.default,\n\t Store: store_1.default\n\t }\n\t};\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = Parchment;\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar __extends = (this && this.__extends) || function (d, b) {\n\t for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n\t function __() { this.constructor = d; }\n\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t};\n\tvar linked_list_1 = __webpack_require__(4);\n\tvar shadow_1 = __webpack_require__(5);\n\tvar Registry = __webpack_require__(6);\n\tvar ContainerBlot = (function (_super) {\n\t __extends(ContainerBlot, _super);\n\t function ContainerBlot() {\n\t return _super.apply(this, arguments) || this;\n\t }\n\t ContainerBlot.prototype.appendChild = function (other) {\n\t this.insertBefore(other);\n\t };\n\t ContainerBlot.prototype.attach = function () {\n\t var _this = this;\n\t _super.prototype.attach.call(this);\n\t this.children = new linked_list_1.default();\n\t // Need to be reversed for if DOM nodes already in order\n\t [].slice.call(this.domNode.childNodes).reverse().forEach(function (node) {\n\t try {\n\t var child = makeBlot(node);\n\t _this.insertBefore(child, _this.children.head);\n\t }\n\t catch (err) {\n\t if (err instanceof Registry.ParchmentError)\n\t return;\n\t else\n\t throw err;\n\t }\n\t });\n\t };\n\t ContainerBlot.prototype.deleteAt = function (index, length) {\n\t if (index === 0 && length === this.length()) {\n\t return this.remove();\n\t }\n\t this.children.forEachAt(index, length, function (child, offset, length) {\n\t child.deleteAt(offset, length);\n\t });\n\t };\n\t ContainerBlot.prototype.descendant = function (criteria, index) {\n\t var _a = this.children.find(index), child = _a[0], offset = _a[1];\n\t if ((criteria.blotName == null && criteria(child)) ||\n\t (criteria.blotName != null && child instanceof criteria)) {\n\t return [child, offset];\n\t }\n\t else if (child instanceof ContainerBlot) {\n\t return child.descendant(criteria, offset);\n\t }\n\t else {\n\t return [null, -1];\n\t }\n\t };\n\t ContainerBlot.prototype.descendants = function (criteria, index, length) {\n\t if (index === void 0) { index = 0; }\n\t if (length === void 0) { length = Number.MAX_VALUE; }\n\t var descendants = [], lengthLeft = length;\n\t this.children.forEachAt(index, length, function (child, index, length) {\n\t if ((criteria.blotName == null && criteria(child)) ||\n\t (criteria.blotName != null && child instanceof criteria)) {\n\t descendants.push(child);\n\t }\n\t if (child instanceof ContainerBlot) {\n\t descendants = descendants.concat(child.descendants(criteria, index, lengthLeft));\n\t }\n\t lengthLeft -= length;\n\t });\n\t return descendants;\n\t };\n\t ContainerBlot.prototype.detach = function () {\n\t this.children.forEach(function (child) {\n\t child.detach();\n\t });\n\t _super.prototype.detach.call(this);\n\t };\n\t ContainerBlot.prototype.formatAt = function (index, length, name, value) {\n\t this.children.forEachAt(index, length, function (child, offset, length) {\n\t child.formatAt(offset, length, name, value);\n\t });\n\t };\n\t ContainerBlot.prototype.insertAt = function (index, value, def) {\n\t var _a = this.children.find(index), child = _a[0], offset = _a[1];\n\t if (child) {\n\t child.insertAt(offset, value, def);\n\t }\n\t else {\n\t var blot = (def == null) ? Registry.create('text', value) : Registry.create(value, def);\n\t this.appendChild(blot);\n\t }\n\t };\n\t ContainerBlot.prototype.insertBefore = function (childBlot, refBlot) {\n\t if (this.statics.allowedChildren != null && !this.statics.allowedChildren.some(function (child) {\n\t return childBlot instanceof child;\n\t })) {\n\t throw new Registry.ParchmentError(\"Cannot insert \" + childBlot.statics.blotName + \" into \" + this.statics.blotName);\n\t }\n\t childBlot.insertInto(this, refBlot);\n\t };\n\t ContainerBlot.prototype.length = function () {\n\t return this.children.reduce(function (memo, child) {\n\t return memo + child.length();\n\t }, 0);\n\t };\n\t ContainerBlot.prototype.moveChildren = function (targetParent, refNode) {\n\t this.children.forEach(function (child) {\n\t targetParent.insertBefore(child, refNode);\n\t });\n\t };\n\t ContainerBlot.prototype.optimize = function () {\n\t _super.prototype.optimize.call(this);\n\t if (this.children.length === 0) {\n\t if (this.statics.defaultChild != null) {\n\t var child = Registry.create(this.statics.defaultChild);\n\t this.appendChild(child);\n\t child.optimize();\n\t }\n\t else {\n\t this.remove();\n\t }\n\t }\n\t };\n\t ContainerBlot.prototype.path = function (index, inclusive) {\n\t if (inclusive === void 0) { inclusive = false; }\n\t var _a = this.children.find(index, inclusive), child = _a[0], offset = _a[1];\n\t var position = [[this, index]];\n\t if (child instanceof ContainerBlot) {\n\t return position.concat(child.path(offset, inclusive));\n\t }\n\t else if (child != null) {\n\t position.push([child, offset]);\n\t }\n\t return position;\n\t };\n\t ContainerBlot.prototype.removeChild = function (child) {\n\t this.children.remove(child);\n\t };\n\t ContainerBlot.prototype.replace = function (target) {\n\t if (target instanceof ContainerBlot) {\n\t target.moveChildren(this);\n\t }\n\t _super.prototype.replace.call(this, target);\n\t };\n\t ContainerBlot.prototype.split = function (index, force) {\n\t if (force === void 0) { force = false; }\n\t if (!force) {\n\t if (index === 0)\n\t return this;\n\t if (index === this.length())\n\t return this.next;\n\t }\n\t var after = this.clone();\n\t this.parent.insertBefore(after, this.next);\n\t this.children.forEachAt(index, this.length(), function (child, offset, length) {\n\t child = child.split(offset, force);\n\t after.appendChild(child);\n\t });\n\t return after;\n\t };\n\t ContainerBlot.prototype.unwrap = function () {\n\t this.moveChildren(this.parent, this.next);\n\t this.remove();\n\t };\n\t ContainerBlot.prototype.update = function (mutations) {\n\t var _this = this;\n\t var addedNodes = [], removedNodes = [];\n\t mutations.forEach(function (mutation) {\n\t if (mutation.target === _this.domNode && mutation.type === 'childList') {\n\t addedNodes.push.apply(addedNodes, mutation.addedNodes);\n\t removedNodes.push.apply(removedNodes, mutation.removedNodes);\n\t }\n\t });\n\t removedNodes.forEach(function (node) {\n\t if (node.parentNode != null &&\n\t (document.body.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY)) {\n\t // Node has not actually been removed\n\t return;\n\t }\n\t var blot = Registry.find(node);\n\t if (blot == null)\n\t return;\n\t if (blot.domNode.parentNode == null || blot.domNode.parentNode === _this.domNode) {\n\t blot.detach();\n\t }\n\t });\n\t addedNodes.filter(function (node) {\n\t return node.parentNode == _this.domNode;\n\t }).sort(function (a, b) {\n\t if (a === b)\n\t return 0;\n\t if (a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING) {\n\t return 1;\n\t }\n\t return -1;\n\t }).forEach(function (node) {\n\t var refBlot = null;\n\t if (node.nextSibling != null) {\n\t refBlot = Registry.find(node.nextSibling);\n\t }\n\t var blot = makeBlot(node);\n\t if (blot.next != refBlot || blot.next == null) {\n\t if (blot.parent != null) {\n\t blot.parent.removeChild(_this);\n\t }\n\t _this.insertBefore(blot, refBlot);\n\t }\n\t });\n\t };\n\t return ContainerBlot;\n\t}(shadow_1.default));\n\tfunction makeBlot(node) {\n\t var blot = Registry.find(node);\n\t if (blot == null) {\n\t try {\n\t blot = Registry.create(node);\n\t }\n\t catch (e) {\n\t blot = Registry.create(Registry.Scope.INLINE);\n\t [].slice.call(node.childNodes).forEach(function (child) {\n\t blot.domNode.appendChild(child);\n\t });\n\t node.parentNode.replaceChild(blot.domNode, node);\n\t blot.attach();\n\t }\n\t }\n\t return blot;\n\t}\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = ContainerBlot;\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\tvar LinkedList = (function () {\n\t function LinkedList() {\n\t this.head = this.tail = undefined;\n\t this.length = 0;\n\t }\n\t LinkedList.prototype.append = function () {\n\t var nodes = [];\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t nodes[_i] = arguments[_i];\n\t }\n\t this.insertBefore(nodes[0], undefined);\n\t if (nodes.length > 1) {\n\t this.append.apply(this, nodes.slice(1));\n\t }\n\t };\n\t LinkedList.prototype.contains = function (node) {\n\t var cur, next = this.iterator();\n\t while (cur = next()) {\n\t if (cur === node)\n\t return true;\n\t }\n\t return false;\n\t };\n\t LinkedList.prototype.insertBefore = function (node, refNode) {\n\t node.next = refNode;\n\t if (refNode != null) {\n\t node.prev = refNode.prev;\n\t if (refNode.prev != null) {\n\t refNode.prev.next = node;\n\t }\n\t refNode.prev = node;\n\t if (refNode === this.head) {\n\t this.head = node;\n\t }\n\t }\n\t else if (this.tail != null) {\n\t this.tail.next = node;\n\t node.prev = this.tail;\n\t this.tail = node;\n\t }\n\t else {\n\t node.prev = undefined;\n\t this.head = this.tail = node;\n\t }\n\t this.length += 1;\n\t };\n\t LinkedList.prototype.offset = function (target) {\n\t var index = 0, cur = this.head;\n\t while (cur != null) {\n\t if (cur === target)\n\t return index;\n\t index += cur.length();\n\t cur = cur.next;\n\t }\n\t return -1;\n\t };\n\t LinkedList.prototype.remove = function (node) {\n\t if (!this.contains(node))\n\t return;\n\t if (node.prev != null)\n\t node.prev.next = node.next;\n\t if (node.next != null)\n\t node.next.prev = node.prev;\n\t if (node === this.head)\n\t this.head = node.next;\n\t if (node === this.tail)\n\t this.tail = node.prev;\n\t this.length -= 1;\n\t };\n\t LinkedList.prototype.iterator = function (curNode) {\n\t if (curNode === void 0) { curNode = this.head; }\n\t // TODO use yield when we can\n\t return function () {\n\t var ret = curNode;\n\t if (curNode != null)\n\t curNode = curNode.next;\n\t return ret;\n\t };\n\t };\n\t LinkedList.prototype.find = function (index, inclusive) {\n\t if (inclusive === void 0) { inclusive = false; }\n\t var cur, next = this.iterator();\n\t while (cur = next()) {\n\t var length_1 = cur.length();\n\t if (index < length_1 || (inclusive && index === length_1 && (cur.next == null || cur.next.length() !== 0))) {\n\t return [cur, index];\n\t }\n\t index -= length_1;\n\t }\n\t return [null, 0];\n\t };\n\t LinkedList.prototype.forEach = function (callback) {\n\t var cur, next = this.iterator();\n\t while (cur = next()) {\n\t callback(cur);\n\t }\n\t };\n\t LinkedList.prototype.forEachAt = function (index, length, callback) {\n\t if (length <= 0)\n\t return;\n\t var _a = this.find(index), startNode = _a[0], offset = _a[1];\n\t var cur, curIndex = index - offset, next = this.iterator(startNode);\n\t while ((cur = next()) && curIndex < index + length) {\n\t var curLength = cur.length();\n\t if (index > curIndex) {\n\t callback(cur, index - curIndex, Math.min(length, curIndex + curLength - index));\n\t }\n\t else {\n\t callback(cur, 0, Math.min(curLength, index + length - curIndex));\n\t }\n\t curIndex += curLength;\n\t }\n\t };\n\t LinkedList.prototype.map = function (callback) {\n\t return this.reduce(function (memo, cur) {\n\t memo.push(callback(cur));\n\t return memo;\n\t }, []);\n\t };\n\t LinkedList.prototype.reduce = function (callback, memo) {\n\t var cur, next = this.iterator();\n\t while (cur = next()) {\n\t memo = callback(memo, cur);\n\t }\n\t return memo;\n\t };\n\t return LinkedList;\n\t}());\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = LinkedList;\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar Registry = __webpack_require__(6);\n\tvar ShadowBlot = (function () {\n\t function ShadowBlot(domNode) {\n\t this.domNode = domNode;\n\t this.attach();\n\t }\n\t Object.defineProperty(ShadowBlot.prototype, \"statics\", {\n\t // Hack for accessing inherited static methods\n\t get: function () {\n\t return this.constructor;\n\t },\n\t enumerable: true,\n\t configurable: true\n\t });\n\t ShadowBlot.create = function (value) {\n\t if (this.tagName == null) {\n\t throw new Registry.ParchmentError('Blot definition missing tagName');\n\t }\n\t var node;\n\t if (Array.isArray(this.tagName)) {\n\t if (typeof value === 'string') {\n\t value = value.toUpperCase();\n\t if (parseInt(value).toString() === value) {\n\t value = parseInt(value);\n\t }\n\t }\n\t if (typeof value === 'number') {\n\t node = document.createElement(this.tagName[value - 1]);\n\t }\n\t else if (this.tagName.indexOf(value) > -1) {\n\t node = document.createElement(value);\n\t }\n\t else {\n\t node = document.createElement(this.tagName[0]);\n\t }\n\t }\n\t else {\n\t node = document.createElement(this.tagName);\n\t }\n\t if (this.className) {\n\t node.classList.add(this.className);\n\t }\n\t return node;\n\t };\n\t ShadowBlot.prototype.attach = function () {\n\t this.domNode[Registry.DATA_KEY] = { blot: this };\n\t };\n\t ShadowBlot.prototype.clone = function () {\n\t var domNode = this.domNode.cloneNode();\n\t return Registry.create(domNode);\n\t };\n\t ShadowBlot.prototype.detach = function () {\n\t if (this.parent != null)\n\t this.parent.removeChild(this);\n\t delete this.domNode[Registry.DATA_KEY];\n\t };\n\t ShadowBlot.prototype.deleteAt = function (index, length) {\n\t var blot = this.isolate(index, length);\n\t blot.remove();\n\t };\n\t ShadowBlot.prototype.formatAt = function (index, length, name, value) {\n\t var blot = this.isolate(index, length);\n\t if (Registry.query(name, Registry.Scope.BLOT) != null && value) {\n\t blot.wrap(name, value);\n\t }\n\t else if (Registry.query(name, Registry.Scope.ATTRIBUTE) != null) {\n\t var parent_1 = Registry.create(this.statics.scope);\n\t blot.wrap(parent_1);\n\t parent_1.format(name, value);\n\t }\n\t };\n\t ShadowBlot.prototype.insertAt = function (index, value, def) {\n\t var blot = (def == null) ? Registry.create('text', value) : Registry.create(value, def);\n\t var ref = this.split(index);\n\t this.parent.insertBefore(blot, ref);\n\t };\n\t ShadowBlot.prototype.insertInto = function (parentBlot, refBlot) {\n\t if (this.parent != null) {\n\t this.parent.children.remove(this);\n\t }\n\t parentBlot.children.insertBefore(this, refBlot);\n\t if (refBlot != null) {\n\t var refDomNode = refBlot.domNode;\n\t }\n\t if (this.next == null || this.domNode.nextSibling != refDomNode) {\n\t parentBlot.domNode.insertBefore(this.domNode, (typeof refDomNode !== 'undefined') ? refDomNode : null);\n\t }\n\t this.parent = parentBlot;\n\t };\n\t ShadowBlot.prototype.isolate = function (index, length) {\n\t var target = this.split(index);\n\t target.split(length);\n\t return target;\n\t };\n\t ShadowBlot.prototype.length = function () {\n\t return 1;\n\t };\n\t ;\n\t ShadowBlot.prototype.offset = function (root) {\n\t if (root === void 0) { root = this.parent; }\n\t if (this.parent == null || this == root)\n\t return 0;\n\t return this.parent.children.offset(this) + this.parent.offset(root);\n\t };\n\t ShadowBlot.prototype.optimize = function () {\n\t // TODO clean up once we use WeakMap\n\t if (this.domNode[Registry.DATA_KEY] != null) {\n\t delete this.domNode[Registry.DATA_KEY].mutations;\n\t }\n\t };\n\t ShadowBlot.prototype.remove = function () {\n\t if (this.domNode.parentNode != null) {\n\t this.domNode.parentNode.removeChild(this.domNode);\n\t }\n\t this.detach();\n\t };\n\t ShadowBlot.prototype.replace = function (target) {\n\t if (target.parent == null)\n\t return;\n\t target.parent.insertBefore(this, target.next);\n\t target.remove();\n\t };\n\t ShadowBlot.prototype.replaceWith = function (name, value) {\n\t var replacement = typeof name === 'string' ? Registry.create(name, value) : name;\n\t replacement.replace(this);\n\t return replacement;\n\t };\n\t ShadowBlot.prototype.split = function (index, force) {\n\t return index === 0 ? this : this.next;\n\t };\n\t ShadowBlot.prototype.update = function (mutations) {\n\t if (mutations === void 0) { mutations = []; }\n\t // Nothing to do by default\n\t };\n\t ShadowBlot.prototype.wrap = function (name, value) {\n\t var wrapper = typeof name === 'string' ? Registry.create(name, value) : name;\n\t if (this.parent != null) {\n\t this.parent.insertBefore(wrapper, this.next);\n\t }\n\t wrapper.appendChild(this);\n\t return wrapper;\n\t };\n\t return ShadowBlot;\n\t}());\n\tShadowBlot.blotName = 'abstract';\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = ShadowBlot;\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\tvar __extends = (this && this.__extends) || function (d, b) {\n\t for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n\t function __() { this.constructor = d; }\n\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t};\n\tvar ParchmentError = (function (_super) {\n\t __extends(ParchmentError, _super);\n\t function ParchmentError(message) {\n\t var _this;\n\t message = '[Parchment] ' + message;\n\t _this = _super.call(this, message) || this;\n\t _this.message = message;\n\t _this.name = _this.constructor.name;\n\t return _this;\n\t }\n\t return ParchmentError;\n\t}(Error));\n\texports.ParchmentError = ParchmentError;\n\tvar attributes = {};\n\tvar classes = {};\n\tvar tags = {};\n\tvar types = {};\n\texports.DATA_KEY = '__blot';\n\tvar Scope;\n\t(function (Scope) {\n\t Scope[Scope[\"TYPE\"] = 3] = \"TYPE\";\n\t Scope[Scope[\"LEVEL\"] = 12] = \"LEVEL\";\n\t Scope[Scope[\"ATTRIBUTE\"] = 13] = \"ATTRIBUTE\";\n\t Scope[Scope[\"BLOT\"] = 14] = \"BLOT\";\n\t Scope[Scope[\"INLINE\"] = 7] = \"INLINE\";\n\t Scope[Scope[\"BLOCK\"] = 11] = \"BLOCK\";\n\t Scope[Scope[\"BLOCK_BLOT\"] = 10] = \"BLOCK_BLOT\";\n\t Scope[Scope[\"INLINE_BLOT\"] = 6] = \"INLINE_BLOT\";\n\t Scope[Scope[\"BLOCK_ATTRIBUTE\"] = 9] = \"BLOCK_ATTRIBUTE\";\n\t Scope[Scope[\"INLINE_ATTRIBUTE\"] = 5] = \"INLINE_ATTRIBUTE\";\n\t Scope[Scope[\"ANY\"] = 15] = \"ANY\";\n\t})(Scope = exports.Scope || (exports.Scope = {}));\n\t;\n\tfunction create(input, value) {\n\t var match = query(input);\n\t if (match == null) {\n\t throw new ParchmentError(\"Unable to create \" + input + \" blot\");\n\t }\n\t var BlotClass = match;\n\t var node = input instanceof Node ? input : BlotClass.create(value);\n\t return new BlotClass(node, value);\n\t}\n\texports.create = create;\n\tfunction find(node, bubble) {\n\t if (bubble === void 0) { bubble = false; }\n\t if (node == null)\n\t return null;\n\t if (node[exports.DATA_KEY] != null)\n\t return node[exports.DATA_KEY].blot;\n\t if (bubble)\n\t return find(node.parentNode, bubble);\n\t return null;\n\t}\n\texports.find = find;\n\tfunction query(query, scope) {\n\t if (scope === void 0) { scope = Scope.ANY; }\n\t var match;\n\t if (typeof query === 'string') {\n\t match = types[query] || attributes[query];\n\t }\n\t else if (query instanceof Text) {\n\t match = types['text'];\n\t }\n\t else if (typeof query === 'number') {\n\t if (query & Scope.LEVEL & Scope.BLOCK) {\n\t match = types['block'];\n\t }\n\t else if (query & Scope.LEVEL & Scope.INLINE) {\n\t match = types['inline'];\n\t }\n\t }\n\t else if (query instanceof HTMLElement) {\n\t var names = (query.getAttribute('class') || '').split(/\\s+/);\n\t for (var i in names) {\n\t match = classes[names[i]];\n\t if (match)\n\t break;\n\t }\n\t match = match || tags[query.tagName];\n\t }\n\t if (match == null)\n\t return null;\n\t if ((scope & Scope.LEVEL & match.scope) && (scope & Scope.TYPE & match.scope))\n\t return match;\n\t return null;\n\t}\n\texports.query = query;\n\tfunction register() {\n\t var Definitions = [];\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t Definitions[_i] = arguments[_i];\n\t }\n\t if (Definitions.length > 1) {\n\t return Definitions.map(function (d) {\n\t return register(d);\n\t });\n\t }\n\t var Definition = Definitions[0];\n\t if (typeof Definition.blotName !== 'string' && typeof Definition.attrName !== 'string') {\n\t throw new ParchmentError('Invalid definition');\n\t }\n\t else if (Definition.blotName === 'abstract') {\n\t throw new ParchmentError('Cannot register abstract class');\n\t }\n\t types[Definition.blotName || Definition.attrName] = Definition;\n\t if (typeof Definition.keyName === 'string') {\n\t attributes[Definition.keyName] = Definition;\n\t }\n\t else {\n\t if (Definition.className != null) {\n\t classes[Definition.className] = Definition;\n\t }\n\t if (Definition.tagName != null) {\n\t if (Array.isArray(Definition.tagName)) {\n\t Definition.tagName = Definition.tagName.map(function (tagName) {\n\t return tagName.toUpperCase();\n\t });\n\t }\n\t else {\n\t Definition.tagName = Definition.tagName.toUpperCase();\n\t }\n\t var tagNames = Array.isArray(Definition.tagName) ? Definition.tagName : [Definition.tagName];\n\t tagNames.forEach(function (tag) {\n\t if (tags[tag] == null || Definition.className == null) {\n\t tags[tag] = Definition;\n\t }\n\t });\n\t }\n\t }\n\t return Definition;\n\t}\n\texports.register = register;\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar __extends = (this && this.__extends) || function (d, b) {\n\t for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n\t function __() { this.constructor = d; }\n\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t};\n\tvar attributor_1 = __webpack_require__(8);\n\tvar store_1 = __webpack_require__(9);\n\tvar container_1 = __webpack_require__(3);\n\tvar Registry = __webpack_require__(6);\n\tvar FormatBlot = (function (_super) {\n\t __extends(FormatBlot, _super);\n\t function FormatBlot() {\n\t return _super.apply(this, arguments) || this;\n\t }\n\t FormatBlot.formats = function (domNode) {\n\t if (typeof this.tagName === 'string') {\n\t return true;\n\t }\n\t else if (Array.isArray(this.tagName)) {\n\t return domNode.tagName.toLowerCase();\n\t }\n\t return undefined;\n\t };\n\t FormatBlot.prototype.attach = function () {\n\t _super.prototype.attach.call(this);\n\t this.attributes = new store_1.default(this.domNode);\n\t };\n\t FormatBlot.prototype.format = function (name, value) {\n\t var format = Registry.query(name);\n\t if (format instanceof attributor_1.default) {\n\t this.attributes.attribute(format, value);\n\t }\n\t else if (value) {\n\t if (format != null && (name !== this.statics.blotName || this.formats()[name] !== value)) {\n\t this.replaceWith(name, value);\n\t }\n\t }\n\t };\n\t FormatBlot.prototype.formats = function () {\n\t var formats = this.attributes.values();\n\t var format = this.statics.formats(this.domNode);\n\t if (format != null) {\n\t formats[this.statics.blotName] = format;\n\t }\n\t return formats;\n\t };\n\t FormatBlot.prototype.replaceWith = function (name, value) {\n\t var replacement = _super.prototype.replaceWith.call(this, name, value);\n\t this.attributes.copy(replacement);\n\t return replacement;\n\t };\n\t FormatBlot.prototype.update = function (mutations) {\n\t var _this = this;\n\t _super.prototype.update.call(this, mutations);\n\t if (mutations.some(function (mutation) {\n\t return mutation.target === _this.domNode && mutation.type === 'attributes';\n\t })) {\n\t this.attributes.build();\n\t }\n\t };\n\t FormatBlot.prototype.wrap = function (name, value) {\n\t var wrapper = _super.prototype.wrap.call(this, name, value);\n\t if (wrapper instanceof FormatBlot && wrapper.statics.scope === this.statics.scope) {\n\t this.attributes.move(wrapper);\n\t }\n\t return wrapper;\n\t };\n\t return FormatBlot;\n\t}(container_1.default));\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = FormatBlot;\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar Registry = __webpack_require__(6);\n\tvar Attributor = (function () {\n\t function Attributor(attrName, keyName, options) {\n\t if (options === void 0) { options = {}; }\n\t this.attrName = attrName;\n\t this.keyName = keyName;\n\t var attributeBit = Registry.Scope.TYPE & Registry.Scope.ATTRIBUTE;\n\t if (options.scope != null) {\n\t // Ignore type bits, force attribute bit\n\t this.scope = (options.scope & Registry.Scope.LEVEL) | attributeBit;\n\t }\n\t else {\n\t this.scope = Registry.Scope.ATTRIBUTE;\n\t }\n\t if (options.whitelist != null)\n\t this.whitelist = options.whitelist;\n\t }\n\t Attributor.keys = function (node) {\n\t return [].map.call(node.attributes, function (item) {\n\t return item.name;\n\t });\n\t };\n\t Attributor.prototype.add = function (node, value) {\n\t if (!this.canAdd(node, value))\n\t return false;\n\t node.setAttribute(this.keyName, value);\n\t return true;\n\t };\n\t Attributor.prototype.canAdd = function (node, value) {\n\t var match = Registry.query(node, Registry.Scope.BLOT & (this.scope | Registry.Scope.TYPE));\n\t if (match != null && (this.whitelist == null || this.whitelist.indexOf(value) > -1)) {\n\t return true;\n\t }\n\t return false;\n\t };\n\t Attributor.prototype.remove = function (node) {\n\t node.removeAttribute(this.keyName);\n\t };\n\t Attributor.prototype.value = function (node) {\n\t var value = node.getAttribute(this.keyName);\n\t return this.canAdd(node, value) ? value : '';\n\t };\n\t return Attributor;\n\t}());\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = Attributor;\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar attributor_1 = __webpack_require__(8);\n\tvar class_1 = __webpack_require__(10);\n\tvar style_1 = __webpack_require__(11);\n\tvar Registry = __webpack_require__(6);\n\tvar AttributorStore = (function () {\n\t function AttributorStore(domNode) {\n\t this.attributes = {};\n\t this.domNode = domNode;\n\t this.build();\n\t }\n\t AttributorStore.prototype.attribute = function (attribute, value) {\n\t if (value) {\n\t if (attribute.add(this.domNode, value)) {\n\t if (attribute.value(this.domNode) != null) {\n\t this.attributes[attribute.attrName] = attribute;\n\t }\n\t else {\n\t delete this.attributes[attribute.attrName];\n\t }\n\t }\n\t }\n\t else {\n\t attribute.remove(this.domNode);\n\t delete this.attributes[attribute.attrName];\n\t }\n\t };\n\t AttributorStore.prototype.build = function () {\n\t var _this = this;\n\t this.attributes = {};\n\t var attributes = attributor_1.default.keys(this.domNode);\n\t var classes = class_1.default.keys(this.domNode);\n\t var styles = style_1.default.keys(this.domNode);\n\t attributes.concat(classes).concat(styles).forEach(function (name) {\n\t var attr = Registry.query(name, Registry.Scope.ATTRIBUTE);\n\t if (attr instanceof attributor_1.default) {\n\t _this.attributes[attr.attrName] = attr;\n\t }\n\t });\n\t };\n\t AttributorStore.prototype.copy = function (target) {\n\t var _this = this;\n\t Object.keys(this.attributes).forEach(function (key) {\n\t var value = _this.attributes[key].value(_this.domNode);\n\t target.format(key, value);\n\t });\n\t };\n\t AttributorStore.prototype.move = function (target) {\n\t var _this = this;\n\t this.copy(target);\n\t Object.keys(this.attributes).forEach(function (key) {\n\t _this.attributes[key].remove(_this.domNode);\n\t });\n\t this.attributes = {};\n\t };\n\t AttributorStore.prototype.values = function () {\n\t var _this = this;\n\t return Object.keys(this.attributes).reduce(function (attributes, name) {\n\t attributes[name] = _this.attributes[name].value(_this.domNode);\n\t return attributes;\n\t }, {});\n\t };\n\t return AttributorStore;\n\t}());\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = AttributorStore;\n\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar __extends = (this && this.__extends) || function (d, b) {\n\t for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n\t function __() { this.constructor = d; }\n\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t};\n\tvar attributor_1 = __webpack_require__(8);\n\tfunction match(node, prefix) {\n\t var className = node.getAttribute('class') || '';\n\t return className.split(/\\s+/).filter(function (name) {\n\t return name.indexOf(prefix + \"-\") === 0;\n\t });\n\t}\n\tvar ClassAttributor = (function (_super) {\n\t __extends(ClassAttributor, _super);\n\t function ClassAttributor() {\n\t return _super.apply(this, arguments) || this;\n\t }\n\t ClassAttributor.keys = function (node) {\n\t return (node.getAttribute('class') || '').split(/\\s+/).map(function (name) {\n\t return name.split('-').slice(0, -1).join('-');\n\t });\n\t };\n\t ClassAttributor.prototype.add = function (node, value) {\n\t if (!this.canAdd(node, value))\n\t return false;\n\t this.remove(node);\n\t node.classList.add(this.keyName + \"-\" + value);\n\t return true;\n\t };\n\t ClassAttributor.prototype.remove = function (node) {\n\t var matches = match(node, this.keyName);\n\t matches.forEach(function (name) {\n\t node.classList.remove(name);\n\t });\n\t if (node.classList.length === 0) {\n\t node.removeAttribute('class');\n\t }\n\t };\n\t ClassAttributor.prototype.value = function (node) {\n\t var result = match(node, this.keyName)[0] || '';\n\t var value = result.slice(this.keyName.length + 1); // +1 for hyphen\n\t return this.canAdd(node, value) ? value : '';\n\t };\n\t return ClassAttributor;\n\t}(attributor_1.default));\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = ClassAttributor;\n\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar __extends = (this && this.__extends) || function (d, b) {\n\t for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n\t function __() { this.constructor = d; }\n\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t};\n\tvar attributor_1 = __webpack_require__(8);\n\tfunction camelize(name) {\n\t var parts = name.split('-');\n\t var rest = parts.slice(1).map(function (part) {\n\t return part[0].toUpperCase() + part.slice(1);\n\t }).join('');\n\t return parts[0] + rest;\n\t}\n\tvar StyleAttributor = (function (_super) {\n\t __extends(StyleAttributor, _super);\n\t function StyleAttributor() {\n\t return _super.apply(this, arguments) || this;\n\t }\n\t StyleAttributor.keys = function (node) {\n\t return (node.getAttribute('style') || '').split(';').map(function (value) {\n\t var arr = value.split(':');\n\t return arr[0].trim();\n\t });\n\t };\n\t StyleAttributor.prototype.add = function (node, value) {\n\t if (!this.canAdd(node, value))\n\t return false;\n\t node.style[camelize(this.keyName)] = value;\n\t return true;\n\t };\n\t StyleAttributor.prototype.remove = function (node) {\n\t node.style[camelize(this.keyName)] = '';\n\t if (!node.getAttribute('style')) {\n\t node.removeAttribute('style');\n\t }\n\t };\n\t StyleAttributor.prototype.value = function (node) {\n\t var value = node.style[camelize(this.keyName)];\n\t return this.canAdd(node, value) ? value : '';\n\t };\n\t return StyleAttributor;\n\t}(attributor_1.default));\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = StyleAttributor;\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar __extends = (this && this.__extends) || function (d, b) {\n\t for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n\t function __() { this.constructor = d; }\n\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t};\n\tvar shadow_1 = __webpack_require__(5);\n\tvar Registry = __webpack_require__(6);\n\tvar LeafBlot = (function (_super) {\n\t __extends(LeafBlot, _super);\n\t function LeafBlot() {\n\t return _super.apply(this, arguments) || this;\n\t }\n\t LeafBlot.value = function (domNode) {\n\t return true;\n\t };\n\t LeafBlot.prototype.index = function (node, offset) {\n\t if (node !== this.domNode)\n\t return -1;\n\t return Math.min(offset, 1);\n\t };\n\t LeafBlot.prototype.position = function (index, inclusive) {\n\t var offset = [].indexOf.call(this.parent.domNode.childNodes, this.domNode);\n\t if (index > 0)\n\t offset += 1;\n\t return [this.parent.domNode, offset];\n\t };\n\t LeafBlot.prototype.value = function () {\n\t return _a = {}, _a[this.statics.blotName] = this.statics.value(this.domNode) || true, _a;\n\t var _a;\n\t };\n\t return LeafBlot;\n\t}(shadow_1.default));\n\tLeafBlot.scope = Registry.Scope.INLINE_BLOT;\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = LeafBlot;\n\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar __extends = (this && this.__extends) || function (d, b) {\n\t for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n\t function __() { this.constructor = d; }\n\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t};\n\tvar container_1 = __webpack_require__(3);\n\tvar Registry = __webpack_require__(6);\n\tvar OBSERVER_CONFIG = {\n\t attributes: true,\n\t characterData: true,\n\t characterDataOldValue: true,\n\t childList: true,\n\t subtree: true\n\t};\n\tvar MAX_OPTIMIZE_ITERATIONS = 100;\n\tvar ScrollBlot = (function (_super) {\n\t __extends(ScrollBlot, _super);\n\t function ScrollBlot(node) {\n\t var _this = _super.call(this, node) || this;\n\t _this.parent = null;\n\t _this.observer = new MutationObserver(function (mutations) {\n\t _this.update(mutations);\n\t });\n\t _this.observer.observe(_this.domNode, OBSERVER_CONFIG);\n\t return _this;\n\t }\n\t ScrollBlot.prototype.detach = function () {\n\t _super.prototype.detach.call(this);\n\t this.observer.disconnect();\n\t };\n\t ScrollBlot.prototype.deleteAt = function (index, length) {\n\t this.update();\n\t if (index === 0 && length === this.length()) {\n\t this.children.forEach(function (child) {\n\t child.remove();\n\t });\n\t }\n\t else {\n\t _super.prototype.deleteAt.call(this, index, length);\n\t }\n\t };\n\t ScrollBlot.prototype.formatAt = function (index, length, name, value) {\n\t this.update();\n\t _super.prototype.formatAt.call(this, index, length, name, value);\n\t };\n\t ScrollBlot.prototype.insertAt = function (index, value, def) {\n\t this.update();\n\t _super.prototype.insertAt.call(this, index, value, def);\n\t };\n\t ScrollBlot.prototype.optimize = function (mutations) {\n\t var _this = this;\n\t if (mutations === void 0) { mutations = []; }\n\t _super.prototype.optimize.call(this);\n\t // We must modify mutations directly, cannot make copy and then modify\n\t var records = [].slice.call(this.observer.takeRecords());\n\t // Array.push currently seems to be implemented by a non-tail recursive function\n\t // so we cannot just mutations.push.apply(mutations, this.observer.takeRecords());\n\t while (records.length > 0)\n\t mutations.push(records.pop());\n\t // TODO use WeakMap\n\t var mark = function (blot, markParent) {\n\t if (markParent === void 0) { markParent = true; }\n\t if (blot == null || blot === _this)\n\t return;\n\t if (blot.domNode.parentNode == null)\n\t return;\n\t if (blot.domNode[Registry.DATA_KEY].mutations == null) {\n\t blot.domNode[Registry.DATA_KEY].mutations = [];\n\t }\n\t if (markParent)\n\t mark(blot.parent);\n\t };\n\t var optimize = function (blot) {\n\t if (blot.domNode[Registry.DATA_KEY] == null || blot.domNode[Registry.DATA_KEY].mutations == null) {\n\t return;\n\t }\n\t if (blot instanceof container_1.default) {\n\t blot.children.forEach(optimize);\n\t }\n\t blot.optimize();\n\t };\n\t var remaining = mutations;\n\t for (var i = 0; remaining.length > 0; i += 1) {\n\t if (i >= MAX_OPTIMIZE_ITERATIONS) {\n\t throw new Error('[Parchment] Maximum optimize iterations reached');\n\t }\n\t remaining.forEach(function (mutation) {\n\t var blot = Registry.find(mutation.target, true);\n\t if (blot == null)\n\t return;\n\t if (blot.domNode === mutation.target) {\n\t if (mutation.type === 'childList') {\n\t mark(Registry.find(mutation.previousSibling, false));\n\t [].forEach.call(mutation.addedNodes, function (node) {\n\t var child = Registry.find(node, false);\n\t mark(child, false);\n\t if (child instanceof container_1.default) {\n\t child.children.forEach(function (grandChild) {\n\t mark(grandChild, false);\n\t });\n\t }\n\t });\n\t }\n\t else if (mutation.type === 'attributes') {\n\t mark(blot.prev);\n\t }\n\t }\n\t mark(blot);\n\t });\n\t this.children.forEach(optimize);\n\t remaining = [].slice.call(this.observer.takeRecords());\n\t records = remaining.slice();\n\t while (records.length > 0)\n\t mutations.push(records.pop());\n\t }\n\t };\n\t ScrollBlot.prototype.update = function (mutations) {\n\t var _this = this;\n\t mutations = mutations || this.observer.takeRecords();\n\t // TODO use WeakMap\n\t mutations.map(function (mutation) {\n\t var blot = Registry.find(mutation.target, true);\n\t if (blot == null)\n\t return;\n\t if (blot.domNode[Registry.DATA_KEY].mutations == null) {\n\t blot.domNode[Registry.DATA_KEY].mutations = [mutation];\n\t return blot;\n\t }\n\t else {\n\t blot.domNode[Registry.DATA_KEY].mutations.push(mutation);\n\t return null;\n\t }\n\t }).forEach(function (blot) {\n\t if (blot == null || blot === _this || blot.domNode[Registry.DATA_KEY] == null)\n\t return;\n\t blot.update(blot.domNode[Registry.DATA_KEY].mutations || []);\n\t });\n\t if (this.domNode[Registry.DATA_KEY].mutations != null) {\n\t _super.prototype.update.call(this, this.domNode[Registry.DATA_KEY].mutations);\n\t }\n\t this.optimize(mutations);\n\t };\n\t return ScrollBlot;\n\t}(container_1.default));\n\tScrollBlot.blotName = 'scroll';\n\tScrollBlot.defaultChild = 'block';\n\tScrollBlot.scope = Registry.Scope.BLOCK_BLOT;\n\tScrollBlot.tagName = 'DIV';\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = ScrollBlot;\n\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar __extends = (this && this.__extends) || function (d, b) {\n\t for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n\t function __() { this.constructor = d; }\n\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t};\n\tvar format_1 = __webpack_require__(7);\n\tvar Registry = __webpack_require__(6);\n\t// Shallow object comparison\n\tfunction isEqual(obj1, obj2) {\n\t if (Object.keys(obj1).length !== Object.keys(obj2).length)\n\t return false;\n\t for (var prop in obj1) {\n\t if (obj1[prop] !== obj2[prop])\n\t return false;\n\t }\n\t return true;\n\t}\n\tvar InlineBlot = (function (_super) {\n\t __extends(InlineBlot, _super);\n\t function InlineBlot() {\n\t return _super.apply(this, arguments) || this;\n\t }\n\t InlineBlot.formats = function (domNode) {\n\t if (domNode.tagName === InlineBlot.tagName)\n\t return undefined;\n\t return _super.formats.call(this, domNode);\n\t };\n\t InlineBlot.prototype.format = function (name, value) {\n\t var _this = this;\n\t if (name === this.statics.blotName && !value) {\n\t this.children.forEach(function (child) {\n\t if (!(child instanceof format_1.default)) {\n\t child = child.wrap(InlineBlot.blotName, true);\n\t }\n\t _this.attributes.copy(child);\n\t });\n\t this.unwrap();\n\t }\n\t else {\n\t _super.prototype.format.call(this, name, value);\n\t }\n\t };\n\t InlineBlot.prototype.formatAt = function (index, length, name, value) {\n\t if (this.formats()[name] != null || Registry.query(name, Registry.Scope.ATTRIBUTE)) {\n\t var blot = this.isolate(index, length);\n\t blot.format(name, value);\n\t }\n\t else {\n\t _super.prototype.formatAt.call(this, index, length, name, value);\n\t }\n\t };\n\t InlineBlot.prototype.optimize = function () {\n\t _super.prototype.optimize.call(this);\n\t var formats = this.formats();\n\t if (Object.keys(formats).length === 0) {\n\t return this.unwrap(); // unformatted span\n\t }\n\t var next = this.next;\n\t if (next instanceof InlineBlot && next.prev === this && isEqual(formats, next.formats())) {\n\t next.moveChildren(this);\n\t next.remove();\n\t }\n\t };\n\t return InlineBlot;\n\t}(format_1.default));\n\tInlineBlot.blotName = 'inline';\n\tInlineBlot.scope = Registry.Scope.INLINE_BLOT;\n\tInlineBlot.tagName = 'SPAN';\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = InlineBlot;\n\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar __extends = (this && this.__extends) || function (d, b) {\n\t for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n\t function __() { this.constructor = d; }\n\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t};\n\tvar format_1 = __webpack_require__(7);\n\tvar Registry = __webpack_require__(6);\n\tvar BlockBlot = (function (_super) {\n\t __extends(BlockBlot, _super);\n\t function BlockBlot() {\n\t return _super.apply(this, arguments) || this;\n\t }\n\t BlockBlot.formats = function (domNode) {\n\t var tagName = Registry.query(BlockBlot.blotName).tagName;\n\t if (domNode.tagName === tagName)\n\t return undefined;\n\t return _super.formats.call(this, domNode);\n\t };\n\t BlockBlot.prototype.format = function (name, value) {\n\t if (Registry.query(name, Registry.Scope.BLOCK) == null) {\n\t return;\n\t }\n\t else if (name === this.statics.blotName && !value) {\n\t this.replaceWith(BlockBlot.blotName);\n\t }\n\t else {\n\t _super.prototype.format.call(this, name, value);\n\t }\n\t };\n\t BlockBlot.prototype.formatAt = function (index, length, name, value) {\n\t if (Registry.query(name, Registry.Scope.BLOCK) != null) {\n\t this.format(name, value);\n\t }\n\t else {\n\t _super.prototype.formatAt.call(this, index, length, name, value);\n\t }\n\t };\n\t BlockBlot.prototype.insertAt = function (index, value, def) {\n\t if (def == null || Registry.query(value, Registry.Scope.INLINE) != null) {\n\t // Insert text or inline\n\t _super.prototype.insertAt.call(this, index, value, def);\n\t }\n\t else {\n\t var after = this.split(index);\n\t var blot = Registry.create(value, def);\n\t after.parent.insertBefore(blot, after);\n\t }\n\t };\n\t return BlockBlot;\n\t}(format_1.default));\n\tBlockBlot.blotName = 'block';\n\tBlockBlot.scope = Registry.Scope.BLOCK_BLOT;\n\tBlockBlot.tagName = 'P';\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = BlockBlot;\n\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar __extends = (this && this.__extends) || function (d, b) {\n\t for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n\t function __() { this.constructor = d; }\n\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t};\n\tvar leaf_1 = __webpack_require__(12);\n\tvar EmbedBlot = (function (_super) {\n\t __extends(EmbedBlot, _super);\n\t function EmbedBlot() {\n\t return _super.apply(this, arguments) || this;\n\t }\n\t EmbedBlot.formats = function (domNode) {\n\t return undefined;\n\t };\n\t EmbedBlot.prototype.format = function (name, value) {\n\t // super.formatAt wraps, which is what we want in general,\n\t // but this allows subclasses to overwrite for formats\n\t // that just apply to particular embeds\n\t _super.prototype.formatAt.call(this, 0, this.length(), name, value);\n\t };\n\t EmbedBlot.prototype.formatAt = function (index, length, name, value) {\n\t if (index === 0 && length === this.length()) {\n\t this.format(name, value);\n\t }\n\t else {\n\t _super.prototype.formatAt.call(this, index, length, name, value);\n\t }\n\t };\n\t EmbedBlot.prototype.formats = function () {\n\t return this.statics.formats(this.domNode);\n\t };\n\t return EmbedBlot;\n\t}(leaf_1.default));\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = EmbedBlot;\n\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tvar __extends = (this && this.__extends) || function (d, b) {\n\t for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n\t function __() { this.constructor = d; }\n\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t};\n\tvar leaf_1 = __webpack_require__(12);\n\tvar Registry = __webpack_require__(6);\n\tvar TextBlot = (function (_super) {\n\t __extends(TextBlot, _super);\n\t function TextBlot(node) {\n\t var _this = _super.call(this, node) || this;\n\t _this.text = _this.statics.value(_this.domNode);\n\t return _this;\n\t }\n\t TextBlot.create = function (value) {\n\t return document.createTextNode(value);\n\t };\n\t TextBlot.value = function (domNode) {\n\t return domNode.data;\n\t };\n\t TextBlot.prototype.deleteAt = function (index, length) {\n\t this.domNode.data = this.text = this.text.slice(0, index) + this.text.slice(index + length);\n\t };\n\t TextBlot.prototype.index = function (node, offset) {\n\t if (this.domNode === node) {\n\t return offset;\n\t }\n\t return -1;\n\t };\n\t TextBlot.prototype.insertAt = function (index, value, def) {\n\t if (def == null) {\n\t this.text = this.text.slice(0, index) + value + this.text.slice(index);\n\t this.domNode.data = this.text;\n\t }\n\t else {\n\t _super.prototype.insertAt.call(this, index, value, def);\n\t }\n\t };\n\t TextBlot.prototype.length = function () {\n\t return this.text.length;\n\t };\n\t TextBlot.prototype.optimize = function () {\n\t _super.prototype.optimize.call(this);\n\t this.text = this.statics.value(this.domNode);\n\t if (this.text.length === 0) {\n\t this.remove();\n\t }\n\t else if (this.next instanceof TextBlot && this.next.prev === this) {\n\t this.insertAt(this.length(), this.next.value());\n\t this.next.remove();\n\t }\n\t };\n\t TextBlot.prototype.position = function (index, inclusive) {\n\t if (inclusive === void 0) { inclusive = false; }\n\t return [this.domNode, index];\n\t };\n\t TextBlot.prototype.split = function (index, force) {\n\t if (force === void 0) { force = false; }\n\t if (!force) {\n\t if (index === 0)\n\t return this;\n\t if (index === this.length())\n\t return this.next;\n\t }\n\t var after = Registry.create(this.domNode.splitText(index));\n\t this.parent.insertBefore(after, this.next);\n\t this.text = this.statics.value(this.domNode);\n\t return after;\n\t };\n\t TextBlot.prototype.update = function (mutations) {\n\t var _this = this;\n\t if (mutations.some(function (mutation) {\n\t return mutation.type === 'characterData' && mutation.target === _this.domNode;\n\t })) {\n\t this.text = this.statics.value(this.domNode);\n\t }\n\t };\n\t TextBlot.prototype.value = function () {\n\t return this.text;\n\t };\n\t return TextBlot;\n\t}(leaf_1.default));\n\tTextBlot.blotName = 'text';\n\tTextBlot.scope = Registry.Scope.INLINE_BLOT;\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.default = TextBlot;\n\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = exports.overload = exports.expandConfig = undefined;\n\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\t__webpack_require__(19);\n\n\tvar _quillDelta = __webpack_require__(20);\n\n\tvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\n\tvar _editor = __webpack_require__(27);\n\n\tvar _editor2 = _interopRequireDefault(_editor);\n\n\tvar _emitter3 = __webpack_require__(35);\n\n\tvar _emitter4 = _interopRequireDefault(_emitter3);\n\n\tvar _module = __webpack_require__(39);\n\n\tvar _module2 = _interopRequireDefault(_module);\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _selection = __webpack_require__(40);\n\n\tvar _selection2 = _interopRequireDefault(_selection);\n\n\tvar _extend = __webpack_require__(25);\n\n\tvar _extend2 = _interopRequireDefault(_extend);\n\n\tvar _logger = __webpack_require__(37);\n\n\tvar _logger2 = _interopRequireDefault(_logger);\n\n\tvar _theme = __webpack_require__(41);\n\n\tvar _theme2 = _interopRequireDefault(_theme);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tvar debug = (0, _logger2.default)('quill');\n\n\tvar Quill = function () {\n\t _createClass(Quill, null, [{\n\t key: 'debug',\n\t value: function debug(limit) {\n\t if (limit === true) {\n\t limit = 'log';\n\t }\n\t _logger2.default.level(limit);\n\t }\n\t }, {\n\t key: 'import',\n\t value: function _import(name) {\n\t if (this.imports[name] == null) {\n\t debug.error('Cannot import ' + name + '. Are you sure it was registered?');\n\t }\n\t return this.imports[name];\n\t }\n\t }, {\n\t key: 'register',\n\t value: function register(path, target) {\n\t var _this = this;\n\n\t var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n\t if (typeof path !== 'string') {\n\t var name = path.attrName || path.blotName;\n\t if (typeof name === 'string') {\n\t // register(Blot | Attributor, overwrite)\n\t this.register('formats/' + name, path, target);\n\t } else {\n\t Object.keys(path).forEach(function (key) {\n\t _this.register(key, path[key], target);\n\t });\n\t }\n\t } else {\n\t if (this.imports[path] != null && !overwrite) {\n\t debug.warn('Overwriting ' + path + ' with', target);\n\t }\n\t this.imports[path] = target;\n\t if ((path.startsWith('blots/') || path.startsWith('formats/')) && target.blotName !== 'abstract') {\n\t _parchment2.default.register(target);\n\t }\n\t }\n\t }\n\t }]);\n\n\t function Quill(container) {\n\t var _this2 = this;\n\n\t var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t _classCallCheck(this, Quill);\n\n\t this.options = expandConfig(container, options);\n\t this.container = this.options.container;\n\t this.scrollingContainer = this.options.scrollingContainer || document.body;\n\t if (this.container == null) {\n\t return debug.error('Invalid Quill container', container);\n\t }\n\t if (this.options.debug) {\n\t Quill.debug(this.options.debug);\n\t }\n\t var html = this.container.innerHTML.trim();\n\t this.container.classList.add('ql-container');\n\t this.container.innerHTML = '';\n\t this.root = this.addContainer('ql-editor');\n\t this.root.classList.add('ql-blank');\n\t this.emitter = new _emitter4.default();\n\t this.scroll = _parchment2.default.create(this.root, {\n\t emitter: this.emitter,\n\t whitelist: this.options.formats\n\t });\n\t this.editor = new _editor2.default(this.scroll);\n\t this.selection = new _selection2.default(this.scroll, this.emitter);\n\t this.theme = new this.options.theme(this, this.options);\n\t this.keyboard = this.theme.addModule('keyboard');\n\t this.clipboard = this.theme.addModule('clipboard');\n\t this.history = this.theme.addModule('history');\n\t this.theme.init();\n\t this.emitter.on(_emitter4.default.events.EDITOR_CHANGE, function (type) {\n\t if (type === _emitter4.default.events.TEXT_CHANGE) {\n\t _this2.root.classList.toggle('ql-blank', _this2.editor.isBlank());\n\t }\n\t });\n\t this.emitter.on(_emitter4.default.events.SCROLL_UPDATE, function (source, mutations) {\n\t var range = _this2.selection.lastRange;\n\t var index = range && range.length === 0 ? range.index : undefined;\n\t modify.call(_this2, function () {\n\t return _this2.editor.update(null, mutations, index);\n\t }, source);\n\t });\n\t var contents = this.clipboard.convert('
' + html + '


');\n\t this.setContents(contents);\n\t this.history.clear();\n\t if (this.options.placeholder) {\n\t this.root.setAttribute('data-placeholder', this.options.placeholder);\n\t }\n\t if (this.options.readOnly) {\n\t this.disable();\n\t }\n\t }\n\n\t _createClass(Quill, [{\n\t key: 'addContainer',\n\t value: function addContainer(container) {\n\t var refNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n\t if (typeof container === 'string') {\n\t var className = container;\n\t container = document.createElement('div');\n\t container.classList.add(className);\n\t }\n\t this.container.insertBefore(container, refNode);\n\t return container;\n\t }\n\t }, {\n\t key: 'blur',\n\t value: function blur() {\n\t this.selection.setRange(null);\n\t }\n\t }, {\n\t key: 'deleteText',\n\t value: function deleteText(index, length, source) {\n\t var _this3 = this;\n\n\t var _overload = overload(index, length, source);\n\n\t var _overload2 = _slicedToArray(_overload, 4);\n\n\t index = _overload2[0];\n\t length = _overload2[1];\n\t source = _overload2[3];\n\n\t return modify.call(this, function () {\n\t return _this3.editor.deleteText(index, length);\n\t }, source, index, -1 * length);\n\t }\n\t }, {\n\t key: 'disable',\n\t value: function disable() {\n\t this.enable(false);\n\t }\n\t }, {\n\t key: 'enable',\n\t value: function enable() {\n\t var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n\t this.scroll.enable(enabled);\n\t this.container.classList.toggle('ql-disabled', !enabled);\n\t if (!enabled) {\n\t this.blur();\n\t }\n\t }\n\t }, {\n\t key: 'focus',\n\t value: function focus() {\n\t var scrollTop = this.scrollingContainer.scrollTop;\n\t this.selection.focus();\n\t this.scrollingContainer.scrollTop = scrollTop;\n\t this.selection.scrollIntoView();\n\t }\n\t }, {\n\t key: 'format',\n\t value: function format(name, value) {\n\t var _this4 = this;\n\n\t var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _emitter4.default.sources.API;\n\n\t return modify.call(this, function () {\n\t var range = _this4.getSelection(true);\n\t var change = new _quillDelta2.default();\n\t if (range == null) {\n\t return change;\n\t } else if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK)) {\n\t change = _this4.editor.formatLine(range.index, range.length, _defineProperty({}, name, value));\n\t } else if (range.length === 0) {\n\t _this4.selection.format(name, value);\n\t return change;\n\t } else {\n\t change = _this4.editor.formatText(range.index, range.length, _defineProperty({}, name, value));\n\t }\n\t _this4.setSelection(range, _emitter4.default.sources.SILENT);\n\t return change;\n\t }, source);\n\t }\n\t }, {\n\t key: 'formatLine',\n\t value: function formatLine(index, length, name, value, source) {\n\t var _this5 = this;\n\n\t var formats = void 0;\n\n\t var _overload3 = overload(index, length, name, value, source);\n\n\t var _overload4 = _slicedToArray(_overload3, 4);\n\n\t index = _overload4[0];\n\t length = _overload4[1];\n\t formats = _overload4[2];\n\t source = _overload4[3];\n\n\t return modify.call(this, function () {\n\t return _this5.editor.formatLine(index, length, formats);\n\t }, source, index, 0);\n\t }\n\t }, {\n\t key: 'formatText',\n\t value: function formatText(index, length, name, value, source) {\n\t var _this6 = this;\n\n\t var formats = void 0;\n\n\t var _overload5 = overload(index, length, name, value, source);\n\n\t var _overload6 = _slicedToArray(_overload5, 4);\n\n\t index = _overload6[0];\n\t length = _overload6[1];\n\t formats = _overload6[2];\n\t source = _overload6[3];\n\n\t return modify.call(this, function () {\n\t return _this6.editor.formatText(index, length, formats);\n\t }, source, index, 0);\n\t }\n\t }, {\n\t key: 'getBounds',\n\t value: function getBounds(index) {\n\t var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n\t if (typeof index === 'number') {\n\t return this.selection.getBounds(index, length);\n\t } else {\n\t return this.selection.getBounds(index.index, index.length);\n\t }\n\t }\n\t }, {\n\t key: 'getContents',\n\t value: function getContents() {\n\t var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\t var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getLength() - index;\n\n\t var _overload7 = overload(index, length);\n\n\t var _overload8 = _slicedToArray(_overload7, 2);\n\n\t index = _overload8[0];\n\t length = _overload8[1];\n\n\t return this.editor.getContents(index, length);\n\t }\n\t }, {\n\t key: 'getFormat',\n\t value: function getFormat() {\n\t var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getSelection();\n\t var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n\t if (typeof index === 'number') {\n\t return this.editor.getFormat(index, length);\n\t } else {\n\t return this.editor.getFormat(index.index, index.length);\n\t }\n\t }\n\t }, {\n\t key: 'getLength',\n\t value: function getLength() {\n\t return this.scroll.length();\n\t }\n\t }, {\n\t key: 'getModule',\n\t value: function getModule(name) {\n\t return this.theme.modules[name];\n\t }\n\t }, {\n\t key: 'getSelection',\n\t value: function getSelection() {\n\t var focus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t if (focus) this.focus();\n\t this.update(); // Make sure we access getRange with editor in consistent state\n\t return this.selection.getRange()[0];\n\t }\n\t }, {\n\t key: 'getText',\n\t value: function getText() {\n\t var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\t var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getLength() - index;\n\n\t var _overload9 = overload(index, length);\n\n\t var _overload10 = _slicedToArray(_overload9, 2);\n\n\t index = _overload10[0];\n\t length = _overload10[1];\n\n\t return this.editor.getText(index, length);\n\t }\n\t }, {\n\t key: 'hasFocus',\n\t value: function hasFocus() {\n\t return this.selection.hasFocus();\n\t }\n\t }, {\n\t key: 'insertEmbed',\n\t value: function insertEmbed(index, embed, value) {\n\t var _this7 = this;\n\n\t var source = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Quill.sources.API;\n\n\t return modify.call(this, function () {\n\t return _this7.editor.insertEmbed(index, embed, value);\n\t }, source, index);\n\t }\n\t }, {\n\t key: 'insertText',\n\t value: function insertText(index, text, name, value, source) {\n\t var _this8 = this;\n\n\t var formats = void 0;\n\n\t var _overload11 = overload(index, 0, name, value, source);\n\n\t var _overload12 = _slicedToArray(_overload11, 4);\n\n\t index = _overload12[0];\n\t formats = _overload12[2];\n\t source = _overload12[3];\n\n\t return modify.call(this, function () {\n\t return _this8.editor.insertText(index, text, formats);\n\t }, source, index, text.length);\n\t }\n\t }, {\n\t key: 'isEnabled',\n\t value: function isEnabled() {\n\t return !this.container.classList.contains('ql-disabled');\n\t }\n\t }, {\n\t key: 'off',\n\t value: function off() {\n\t return this.emitter.off.apply(this.emitter, arguments);\n\t }\n\t }, {\n\t key: 'on',\n\t value: function on() {\n\t return this.emitter.on.apply(this.emitter, arguments);\n\t }\n\t }, {\n\t key: 'once',\n\t value: function once() {\n\t return this.emitter.once.apply(this.emitter, arguments);\n\t }\n\t }, {\n\t key: 'pasteHTML',\n\t value: function pasteHTML(index, html, source) {\n\t this.clipboard.dangerouslyPasteHTML(index, html, source);\n\t }\n\t }, {\n\t key: 'removeFormat',\n\t value: function removeFormat(index, length, source) {\n\t var _this9 = this;\n\n\t var _overload13 = overload(index, length, source);\n\n\t var _overload14 = _slicedToArray(_overload13, 4);\n\n\t index = _overload14[0];\n\t length = _overload14[1];\n\t source = _overload14[3];\n\n\t return modify.call(this, function () {\n\t return _this9.editor.removeFormat(index, length);\n\t }, source, index);\n\t }\n\t }, {\n\t key: 'setContents',\n\t value: function setContents(delta) {\n\t var _this10 = this;\n\n\t var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API;\n\n\t return modify.call(this, function () {\n\t delta = new _quillDelta2.default(delta);\n\t var length = _this10.getLength();\n\t var deleted = _this10.editor.deleteText(0, length);\n\t var applied = _this10.editor.applyDelta(delta);\n\t var lastOp = applied.ops[applied.ops.length - 1];\n\t if (lastOp != null && typeof lastOp.insert === 'string' && lastOp.insert[lastOp.insert.length - 1] === '\\n') {\n\t _this10.editor.deleteText(_this10.getLength() - 1, 1);\n\t applied.delete(1);\n\t }\n\t var ret = deleted.compose(applied);\n\t return ret;\n\t }, source);\n\t }\n\t }, {\n\t key: 'setSelection',\n\t value: function setSelection(index, length, source) {\n\t if (index == null) {\n\t this.selection.setRange(null, length || Quill.sources.API);\n\t } else {\n\t var _overload15 = overload(index, length, source);\n\n\t var _overload16 = _slicedToArray(_overload15, 4);\n\n\t index = _overload16[0];\n\t length = _overload16[1];\n\t source = _overload16[3];\n\n\t this.selection.setRange(new _selection.Range(index, length), source);\n\t }\n\t this.selection.scrollIntoView();\n\t }\n\t }, {\n\t key: 'setText',\n\t value: function setText(text) {\n\t var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API;\n\n\t var delta = new _quillDelta2.default().insert(text);\n\t return this.setContents(delta, source);\n\t }\n\t }, {\n\t key: 'update',\n\t value: function update() {\n\t var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _emitter4.default.sources.USER;\n\n\t var change = this.scroll.update(source); // Will update selection before selection.update() does if text changes\n\t this.selection.update(source);\n\t return change;\n\t }\n\t }, {\n\t key: 'updateContents',\n\t value: function updateContents(delta) {\n\t var _this11 = this;\n\n\t var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API;\n\n\t return modify.call(this, function () {\n\t delta = new _quillDelta2.default(delta);\n\t return _this11.editor.applyDelta(delta, source);\n\t }, source, true);\n\t }\n\t }]);\n\n\t return Quill;\n\t}();\n\n\tQuill.DEFAULTS = {\n\t bounds: null,\n\t formats: null,\n\t modules: {},\n\t placeholder: '',\n\t readOnly: false,\n\t scrollingContainer: null,\n\t strict: true,\n\t theme: 'default'\n\t};\n\tQuill.events = _emitter4.default.events;\n\tQuill.sources = _emitter4.default.sources;\n\t// eslint-disable-next-line no-undef\n\tQuill.version = false ? 'dev' : (\"1.1.8\");\n\n\tQuill.imports = {\n\t 'delta': _quillDelta2.default,\n\t 'parchment': _parchment2.default,\n\t 'core/module': _module2.default,\n\t 'core/theme': _theme2.default\n\t};\n\n\tfunction expandConfig(container, userConfig) {\n\t userConfig = (0, _extend2.default)(true, {\n\t container: container,\n\t modules: {\n\t clipboard: true,\n\t keyboard: true,\n\t history: true\n\t }\n\t }, userConfig);\n\t if (!userConfig.theme || userConfig.theme === Quill.DEFAULTS.theme) {\n\t userConfig.theme = _theme2.default;\n\t } else {\n\t userConfig.theme = Quill.import('themes/' + userConfig.theme);\n\t if (userConfig.theme == null) {\n\t throw new Error('Invalid theme ' + userConfig.theme + '. Did you register it?');\n\t }\n\t }\n\t var themeConfig = (0, _extend2.default)(true, {}, userConfig.theme.DEFAULTS);\n\t [themeConfig, userConfig].forEach(function (config) {\n\t config.modules = config.modules || {};\n\t Object.keys(config.modules).forEach(function (module) {\n\t if (config.modules[module] === true) {\n\t config.modules[module] = {};\n\t }\n\t });\n\t });\n\t var moduleNames = Object.keys(themeConfig.modules).concat(Object.keys(userConfig.modules));\n\t var moduleConfig = moduleNames.reduce(function (config, name) {\n\t var moduleClass = Quill.import('modules/' + name);\n\t if (moduleClass == null) {\n\t debug.error('Cannot load ' + name + ' module. Are you sure you registered it?');\n\t } else {\n\t config[name] = moduleClass.DEFAULTS || {};\n\t }\n\t return config;\n\t }, {});\n\t // Special case toolbar shorthand\n\t if (userConfig.modules != null && userConfig.modules.toolbar && userConfig.modules.toolbar.constructor !== Object) {\n\t userConfig.modules.toolbar = {\n\t container: userConfig.modules.toolbar\n\t };\n\t }\n\t userConfig = (0, _extend2.default)(true, {}, Quill.DEFAULTS, { modules: moduleConfig }, themeConfig, userConfig);\n\t ['bounds', 'container', 'scrollingContainer'].forEach(function (key) {\n\t if (typeof userConfig[key] === 'string') {\n\t userConfig[key] = document.querySelector(userConfig[key]);\n\t }\n\t });\n\t userConfig.modules = Object.keys(userConfig.modules).reduce(function (config, name) {\n\t if (userConfig.modules[name]) {\n\t config[name] = userConfig.modules[name];\n\t }\n\t return config;\n\t }, {});\n\t return userConfig;\n\t}\n\n\t// Handle selection preservation and TEXT_CHANGE emission\n\t// common to modification APIs\n\tfunction modify(modifier, source, index, shift) {\n\t if (this.options.strict && !this.isEnabled() && source === _emitter4.default.sources.USER) {\n\t return new _quillDelta2.default();\n\t }\n\t var range = index == null ? null : this.getSelection();\n\t var oldDelta = this.editor.delta;\n\t var change = modifier();\n\t if (range != null && source === _emitter4.default.sources.USER) {\n\t if (index === true) index = range.index;\n\t if (shift == null) {\n\t range = shiftRange(range, change, source);\n\t } else if (shift !== 0) {\n\t range = shiftRange(range, index, shift, source);\n\t }\n\t this.setSelection(range, _emitter4.default.sources.SILENT);\n\t }\n\t if (change.length() > 0) {\n\t var _emitter;\n\n\t var args = [_emitter4.default.events.TEXT_CHANGE, change, oldDelta, source];\n\t (_emitter = this.emitter).emit.apply(_emitter, [_emitter4.default.events.EDITOR_CHANGE].concat(args));\n\t if (source !== _emitter4.default.sources.SILENT) {\n\t var _emitter2;\n\n\t (_emitter2 = this.emitter).emit.apply(_emitter2, args);\n\t }\n\t }\n\t return change;\n\t}\n\n\tfunction overload(index, length, name, value, source) {\n\t var formats = {};\n\t if (typeof index.index === 'number' && typeof index.length === 'number') {\n\t // Allow for throwaway end (used by insertText/insertEmbed)\n\t if (typeof length !== 'number') {\n\t source = value, value = name, name = length, length = index.length, index = index.index;\n\t } else {\n\t length = index.length, index = index.index;\n\t }\n\t } else if (typeof length !== 'number') {\n\t source = value, value = name, name = length, length = 0;\n\t }\n\t // Handle format being object, two format name/value strings or excluded\n\t if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {\n\t formats = name;\n\t source = value;\n\t } else if (typeof name === 'string') {\n\t if (value != null) {\n\t formats[name] = value;\n\t } else {\n\t source = name;\n\t }\n\t }\n\t // Handle optional source\n\t source = source || _emitter4.default.sources.API;\n\t return [index, length, formats, source];\n\t}\n\n\tfunction shiftRange(range, index, length, source) {\n\t if (range == null) return null;\n\t var start = void 0,\n\t end = void 0;\n\t if (index instanceof _quillDelta2.default) {\n\t var _map = [range.index, range.index + range.length].map(function (pos) {\n\t return index.transformPosition(pos, source === _emitter4.default.sources.USER);\n\t });\n\n\t var _map2 = _slicedToArray(_map, 2);\n\n\t start = _map2[0];\n\t end = _map2[1];\n\t } else {\n\t var _map3 = [range.index, range.index + range.length].map(function (pos) {\n\t if (pos < index || pos === index && source !== _emitter4.default.sources.USER) return pos;\n\t if (length >= 0) {\n\t return pos + length;\n\t } else {\n\t return Math.max(index, pos + length);\n\t }\n\t });\n\n\t var _map4 = _slicedToArray(_map3, 2);\n\n\t start = _map4[0];\n\t end = _map4[1];\n\t }\n\t return new _selection.Range(start, end - start);\n\t}\n\n\texports.expandConfig = expandConfig;\n\texports.overload = overload;\n\texports.default = Quill;\n\n/***/ },\n/* 19 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tvar elem = document.createElement('div');\n\telem.classList.toggle('test-class', false);\n\tif (elem.classList.contains('test-class')) {\n\t (function () {\n\t var _toggle = DOMTokenList.prototype.toggle;\n\t DOMTokenList.prototype.toggle = function (token, force) {\n\t if (arguments.length > 1 && !this.contains(token) === !force) {\n\t return force;\n\t } else {\n\t return _toggle.call(this, token);\n\t }\n\t };\n\t })();\n\t}\n\n\tif (!String.prototype.startsWith) {\n\t String.prototype.startsWith = function (searchString, position) {\n\t position = position || 0;\n\t return this.substr(position, searchString.length) === searchString;\n\t };\n\t}\n\n\tif (!String.prototype.endsWith) {\n\t String.prototype.endsWith = function (searchString, position) {\n\t var subjectString = this.toString();\n\t if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {\n\t position = subjectString.length;\n\t }\n\t position -= searchString.length;\n\t var lastIndex = subjectString.indexOf(searchString, position);\n\t return lastIndex !== -1 && lastIndex === position;\n\t };\n\t}\n\n\tif (!Array.prototype.find) {\n\t Object.defineProperty(Array.prototype, \"find\", {\n\t value: function value(predicate) {\n\t if (this === null) {\n\t throw new TypeError('Array.prototype.find called on null or undefined');\n\t }\n\t if (typeof predicate !== 'function') {\n\t throw new TypeError('predicate must be a function');\n\t }\n\t var list = Object(this);\n\t var length = list.length >>> 0;\n\t var thisArg = arguments[1];\n\t var value;\n\n\t for (var i = 0; i < length; i++) {\n\t value = list[i];\n\t if (predicate.call(thisArg, value, i, list)) {\n\t return value;\n\t }\n\t }\n\t return undefined;\n\t }\n\t });\n\t}\n\n\t// Disable resizing in Firefox\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t document.execCommand(\"enableObjectResizing\", false, false);\n\t});\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar diff = __webpack_require__(21);\n\tvar equal = __webpack_require__(22);\n\tvar extend = __webpack_require__(25);\n\tvar op = __webpack_require__(26);\n\n\n\tvar NULL_CHARACTER = String.fromCharCode(0); // Placeholder char for embed in diff()\n\n\n\tvar Delta = function (ops) {\n\t // Assume we are given a well formed ops\n\t if (Array.isArray(ops)) {\n\t this.ops = ops;\n\t } else if (ops != null && Array.isArray(ops.ops)) {\n\t this.ops = ops.ops;\n\t } else {\n\t this.ops = [];\n\t }\n\t};\n\n\n\tDelta.prototype.insert = function (text, attributes) {\n\t var newOp = {};\n\t if (text.length === 0) return this;\n\t newOp.insert = text;\n\t if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) {\n\t newOp.attributes = attributes;\n\t }\n\t return this.push(newOp);\n\t};\n\n\tDelta.prototype['delete'] = function (length) {\n\t if (length <= 0) return this;\n\t return this.push({ 'delete': length });\n\t};\n\n\tDelta.prototype.retain = function (length, attributes) {\n\t if (length <= 0) return this;\n\t var newOp = { retain: length };\n\t if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) {\n\t newOp.attributes = attributes;\n\t }\n\t return this.push(newOp);\n\t};\n\n\tDelta.prototype.push = function (newOp) {\n\t var index = this.ops.length;\n\t var lastOp = this.ops[index - 1];\n\t newOp = extend(true, {}, newOp);\n\t if (typeof lastOp === 'object') {\n\t if (typeof newOp['delete'] === 'number' && typeof lastOp['delete'] === 'number') {\n\t this.ops[index - 1] = { 'delete': lastOp['delete'] + newOp['delete'] };\n\t return this;\n\t }\n\t // Since it does not matter if we insert before or after deleting at the same index,\n\t // always prefer to insert first\n\t if (typeof lastOp['delete'] === 'number' && newOp.insert != null) {\n\t index -= 1;\n\t lastOp = this.ops[index - 1];\n\t if (typeof lastOp !== 'object') {\n\t this.ops.unshift(newOp);\n\t return this;\n\t }\n\t }\n\t if (equal(newOp.attributes, lastOp.attributes)) {\n\t if (typeof newOp.insert === 'string' && typeof lastOp.insert === 'string') {\n\t this.ops[index - 1] = { insert: lastOp.insert + newOp.insert };\n\t if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes\n\t return this;\n\t } else if (typeof newOp.retain === 'number' && typeof lastOp.retain === 'number') {\n\t this.ops[index - 1] = { retain: lastOp.retain + newOp.retain };\n\t if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes\n\t return this;\n\t }\n\t }\n\t }\n\t if (index === this.ops.length) {\n\t this.ops.push(newOp);\n\t } else {\n\t this.ops.splice(index, 0, newOp);\n\t }\n\t return this;\n\t};\n\n\tDelta.prototype.filter = function (predicate) {\n\t return this.ops.filter(predicate);\n\t};\n\n\tDelta.prototype.forEach = function (predicate) {\n\t this.ops.forEach(predicate);\n\t};\n\n\tDelta.prototype.map = function (predicate) {\n\t return this.ops.map(predicate);\n\t};\n\n\tDelta.prototype.partition = function (predicate) {\n\t var passed = [], failed = [];\n\t this.forEach(function(op) {\n\t var target = predicate(op) ? passed : failed;\n\t target.push(op);\n\t });\n\t return [passed, failed];\n\t};\n\n\tDelta.prototype.reduce = function (predicate, initial) {\n\t return this.ops.reduce(predicate, initial);\n\t};\n\n\tDelta.prototype.chop = function () {\n\t var lastOp = this.ops[this.ops.length - 1];\n\t if (lastOp && lastOp.retain && !lastOp.attributes) {\n\t this.ops.pop();\n\t }\n\t return this;\n\t};\n\n\tDelta.prototype.length = function () {\n\t return this.reduce(function (length, elem) {\n\t return length + op.length(elem);\n\t }, 0);\n\t};\n\n\tDelta.prototype.slice = function (start, end) {\n\t start = start || 0;\n\t if (typeof end !== 'number') end = Infinity;\n\t var ops = [];\n\t var iter = op.iterator(this.ops);\n\t var index = 0;\n\t while (index < end && iter.hasNext()) {\n\t var nextOp;\n\t if (index < start) {\n\t nextOp = iter.next(start - index);\n\t } else {\n\t nextOp = iter.next(end - index);\n\t ops.push(nextOp);\n\t }\n\t index += op.length(nextOp);\n\t }\n\t return new Delta(ops);\n\t};\n\n\n\tDelta.prototype.compose = function (other) {\n\t var thisIter = op.iterator(this.ops);\n\t var otherIter = op.iterator(other.ops);\n\t var delta = new Delta();\n\t while (thisIter.hasNext() || otherIter.hasNext()) {\n\t if (otherIter.peekType() === 'insert') {\n\t delta.push(otherIter.next());\n\t } else if (thisIter.peekType() === 'delete') {\n\t delta.push(thisIter.next());\n\t } else {\n\t var length = Math.min(thisIter.peekLength(), otherIter.peekLength());\n\t var thisOp = thisIter.next(length);\n\t var otherOp = otherIter.next(length);\n\t if (typeof otherOp.retain === 'number') {\n\t var newOp = {};\n\t if (typeof thisOp.retain === 'number') {\n\t newOp.retain = length;\n\t } else {\n\t newOp.insert = thisOp.insert;\n\t }\n\t // Preserve null when composing with a retain, otherwise remove it for inserts\n\t var attributes = op.attributes.compose(thisOp.attributes, otherOp.attributes, typeof thisOp.retain === 'number');\n\t if (attributes) newOp.attributes = attributes;\n\t delta.push(newOp);\n\t // Other op should be delete, we could be an insert or retain\n\t // Insert + delete cancels out\n\t } else if (typeof otherOp['delete'] === 'number' && typeof thisOp.retain === 'number') {\n\t delta.push(otherOp);\n\t }\n\t }\n\t }\n\t return delta.chop();\n\t};\n\n\tDelta.prototype.concat = function (other) {\n\t var delta = new Delta(this.ops.slice());\n\t if (other.ops.length > 0) {\n\t delta.push(other.ops[0]);\n\t delta.ops = delta.ops.concat(other.ops.slice(1));\n\t }\n\t return delta;\n\t};\n\n\tDelta.prototype.diff = function (other, index) {\n\t if (this.ops === other.ops) {\n\t return new Delta();\n\t }\n\t var strings = [this, other].map(function (delta) {\n\t return delta.map(function (op) {\n\t if (op.insert != null) {\n\t return typeof op.insert === 'string' ? op.insert : NULL_CHARACTER;\n\t }\n\t var prep = (ops === other.ops) ? 'on' : 'with';\n\t throw new Error('diff() called ' + prep + ' non-document');\n\t }).join('');\n\t });\n\t var delta = new Delta();\n\t var diffResult = diff(strings[0], strings[1], index);\n\t var thisIter = op.iterator(this.ops);\n\t var otherIter = op.iterator(other.ops);\n\t diffResult.forEach(function (component) {\n\t var length = component[1].length;\n\t while (length > 0) {\n\t var opLength = 0;\n\t switch (component[0]) {\n\t case diff.INSERT:\n\t opLength = Math.min(otherIter.peekLength(), length);\n\t delta.push(otherIter.next(opLength));\n\t break;\n\t case diff.DELETE:\n\t opLength = Math.min(length, thisIter.peekLength());\n\t thisIter.next(opLength);\n\t delta['delete'](opLength);\n\t break;\n\t case diff.EQUAL:\n\t opLength = Math.min(thisIter.peekLength(), otherIter.peekLength(), length);\n\t var thisOp = thisIter.next(opLength);\n\t var otherOp = otherIter.next(opLength);\n\t if (equal(thisOp.insert, otherOp.insert)) {\n\t delta.retain(opLength, op.attributes.diff(thisOp.attributes, otherOp.attributes));\n\t } else {\n\t delta.push(otherOp)['delete'](opLength);\n\t }\n\t break;\n\t }\n\t length -= opLength;\n\t }\n\t });\n\t return delta.chop();\n\t};\n\n\tDelta.prototype.eachLine = function (predicate, newline) {\n\t newline = newline || '\\n';\n\t var iter = op.iterator(this.ops);\n\t var line = new Delta();\n\t while (iter.hasNext()) {\n\t if (iter.peekType() !== 'insert') return;\n\t var thisOp = iter.peek();\n\t var start = op.length(thisOp) - iter.peekLength();\n\t var index = typeof thisOp.insert === 'string' ?\n\t thisOp.insert.indexOf(newline, start) - start : -1;\n\t if (index < 0) {\n\t line.push(iter.next());\n\t } else if (index > 0) {\n\t line.push(iter.next(index));\n\t } else {\n\t predicate(line, iter.next(1).attributes || {});\n\t line = new Delta();\n\t }\n\t }\n\t if (line.length() > 0) {\n\t predicate(line, {});\n\t }\n\t};\n\n\tDelta.prototype.transform = function (other, priority) {\n\t priority = !!priority;\n\t if (typeof other === 'number') {\n\t return this.transformPosition(other, priority);\n\t }\n\t var thisIter = op.iterator(this.ops);\n\t var otherIter = op.iterator(other.ops);\n\t var delta = new Delta();\n\t while (thisIter.hasNext() || otherIter.hasNext()) {\n\t if (thisIter.peekType() === 'insert' && (priority || otherIter.peekType() !== 'insert')) {\n\t delta.retain(op.length(thisIter.next()));\n\t } else if (otherIter.peekType() === 'insert') {\n\t delta.push(otherIter.next());\n\t } else {\n\t var length = Math.min(thisIter.peekLength(), otherIter.peekLength());\n\t var thisOp = thisIter.next(length);\n\t var otherOp = otherIter.next(length);\n\t if (thisOp['delete']) {\n\t // Our delete either makes their delete redundant or removes their retain\n\t continue;\n\t } else if (otherOp['delete']) {\n\t delta.push(otherOp);\n\t } else {\n\t // We retain either their retain or insert\n\t delta.retain(length, op.attributes.transform(thisOp.attributes, otherOp.attributes, priority));\n\t }\n\t }\n\t }\n\t return delta.chop();\n\t};\n\n\tDelta.prototype.transformPosition = function (index, priority) {\n\t priority = !!priority;\n\t var thisIter = op.iterator(this.ops);\n\t var offset = 0;\n\t while (thisIter.hasNext() && offset <= index) {\n\t var length = thisIter.peekLength();\n\t var nextType = thisIter.peekType();\n\t thisIter.next();\n\t if (nextType === 'delete') {\n\t index -= Math.min(length, index - offset);\n\t continue;\n\t } else if (nextType === 'insert' && (offset < index || !priority)) {\n\t index += length;\n\t }\n\t offset += length;\n\t }\n\t return index;\n\t};\n\n\n\tmodule.exports = Delta;\n\n\n/***/ },\n/* 21 */\n/***/ function(module, exports) {\n\n\t/**\n\t * This library modifies the diff-patch-match library by Neil Fraser\n\t * by removing the patch and match functionality and certain advanced\n\t * options in the diff function. The original license is as follows:\n\t *\n\t * ===\n\t *\n\t * Diff Match and Patch\n\t *\n\t * Copyright 2006 Google Inc.\n\t * http://code.google.com/p/google-diff-match-patch/\n\t *\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t */\n\n\n\t/**\n\t * The data structure representing a diff is an array of tuples:\n\t * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n\t * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n\t */\n\tvar DIFF_DELETE = -1;\n\tvar DIFF_INSERT = 1;\n\tvar DIFF_EQUAL = 0;\n\n\n\t/**\n\t * Find the differences between two texts. Simplifies the problem by stripping\n\t * any common prefix or suffix off the texts before diffing.\n\t * @param {string} text1 Old string to be diffed.\n\t * @param {string} text2 New string to be diffed.\n\t * @param {Int} cursor_pos Expected edit position in text1 (optional)\n\t * @return {Array} Array of diff tuples.\n\t */\n\tfunction diff_main(text1, text2, cursor_pos) {\n\t // Check for equality (speedup).\n\t if (text1 == text2) {\n\t if (text1) {\n\t return [[DIFF_EQUAL, text1]];\n\t }\n\t return [];\n\t }\n\n\t // Check cursor_pos within bounds\n\t if (cursor_pos < 0 || text1.length < cursor_pos) {\n\t cursor_pos = null;\n\t }\n\n\t // Trim off common prefix (speedup).\n\t var commonlength = diff_commonPrefix(text1, text2);\n\t var commonprefix = text1.substring(0, commonlength);\n\t text1 = text1.substring(commonlength);\n\t text2 = text2.substring(commonlength);\n\n\t // Trim off common suffix (speedup).\n\t commonlength = diff_commonSuffix(text1, text2);\n\t var commonsuffix = text1.substring(text1.length - commonlength);\n\t text1 = text1.substring(0, text1.length - commonlength);\n\t text2 = text2.substring(0, text2.length - commonlength);\n\n\t // Compute the diff on the middle block.\n\t var diffs = diff_compute_(text1, text2);\n\n\t // Restore the prefix and suffix.\n\t if (commonprefix) {\n\t diffs.unshift([DIFF_EQUAL, commonprefix]);\n\t }\n\t if (commonsuffix) {\n\t diffs.push([DIFF_EQUAL, commonsuffix]);\n\t }\n\t diff_cleanupMerge(diffs);\n\t if (cursor_pos != null) {\n\t diffs = fix_cursor(diffs, cursor_pos);\n\t }\n\t return diffs;\n\t};\n\n\n\t/**\n\t * Find the differences between two texts. Assumes that the texts do not\n\t * have any common prefix or suffix.\n\t * @param {string} text1 Old string to be diffed.\n\t * @param {string} text2 New string to be diffed.\n\t * @return {Array} Array of diff tuples.\n\t */\n\tfunction diff_compute_(text1, text2) {\n\t var diffs;\n\n\t if (!text1) {\n\t // Just add some text (speedup).\n\t return [[DIFF_INSERT, text2]];\n\t }\n\n\t if (!text2) {\n\t // Just delete some text (speedup).\n\t return [[DIFF_DELETE, text1]];\n\t }\n\n\t var longtext = text1.length > text2.length ? text1 : text2;\n\t var shorttext = text1.length > text2.length ? text2 : text1;\n\t var i = longtext.indexOf(shorttext);\n\t if (i != -1) {\n\t // Shorter text is inside the longer text (speedup).\n\t diffs = [[DIFF_INSERT, longtext.substring(0, i)],\n\t [DIFF_EQUAL, shorttext],\n\t [DIFF_INSERT, longtext.substring(i + shorttext.length)]];\n\t // Swap insertions for deletions if diff is reversed.\n\t if (text1.length > text2.length) {\n\t diffs[0][0] = diffs[2][0] = DIFF_DELETE;\n\t }\n\t return diffs;\n\t }\n\n\t if (shorttext.length == 1) {\n\t // Single character string.\n\t // After the previous speedup, the character can't be an equality.\n\t return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n\t }\n\n\t // Check to see if the problem can be split in two.\n\t var hm = diff_halfMatch_(text1, text2);\n\t if (hm) {\n\t // A half-match was found, sort out the return data.\n\t var text1_a = hm[0];\n\t var text1_b = hm[1];\n\t var text2_a = hm[2];\n\t var text2_b = hm[3];\n\t var mid_common = hm[4];\n\t // Send both pairs off for separate processing.\n\t var diffs_a = diff_main(text1_a, text2_a);\n\t var diffs_b = diff_main(text1_b, text2_b);\n\t // Merge the results.\n\t return diffs_a.concat([[DIFF_EQUAL, mid_common]], diffs_b);\n\t }\n\n\t return diff_bisect_(text1, text2);\n\t};\n\n\n\t/**\n\t * Find the 'middle snake' of a diff, split the problem in two\n\t * and return the recursively constructed diff.\n\t * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n\t * @param {string} text1 Old string to be diffed.\n\t * @param {string} text2 New string to be diffed.\n\t * @return {Array} Array of diff tuples.\n\t * @private\n\t */\n\tfunction diff_bisect_(text1, text2) {\n\t // Cache the text lengths to prevent multiple calls.\n\t var text1_length = text1.length;\n\t var text2_length = text2.length;\n\t var max_d = Math.ceil((text1_length + text2_length) / 2);\n\t var v_offset = max_d;\n\t var v_length = 2 * max_d;\n\t var v1 = new Array(v_length);\n\t var v2 = new Array(v_length);\n\t // Setting all elements to -1 is faster in Chrome & Firefox than mixing\n\t // integers and undefined.\n\t for (var x = 0; x < v_length; x++) {\n\t v1[x] = -1;\n\t v2[x] = -1;\n\t }\n\t v1[v_offset + 1] = 0;\n\t v2[v_offset + 1] = 0;\n\t var delta = text1_length - text2_length;\n\t // If the total number of characters is odd, then the front path will collide\n\t // with the reverse path.\n\t var front = (delta % 2 != 0);\n\t // Offsets for start and end of k loop.\n\t // Prevents mapping of space beyond the grid.\n\t var k1start = 0;\n\t var k1end = 0;\n\t var k2start = 0;\n\t var k2end = 0;\n\t for (var d = 0; d < max_d; d++) {\n\t // Walk the front path one step.\n\t for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n\t var k1_offset = v_offset + k1;\n\t var x1;\n\t if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {\n\t x1 = v1[k1_offset + 1];\n\t } else {\n\t x1 = v1[k1_offset - 1] + 1;\n\t }\n\t var y1 = x1 - k1;\n\t while (x1 < text1_length && y1 < text2_length &&\n\t text1.charAt(x1) == text2.charAt(y1)) {\n\t x1++;\n\t y1++;\n\t }\n\t v1[k1_offset] = x1;\n\t if (x1 > text1_length) {\n\t // Ran off the right of the graph.\n\t k1end += 2;\n\t } else if (y1 > text2_length) {\n\t // Ran off the bottom of the graph.\n\t k1start += 2;\n\t } else if (front) {\n\t var k2_offset = v_offset + delta - k1;\n\t if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {\n\t // Mirror x2 onto top-left coordinate system.\n\t var x2 = text1_length - v2[k2_offset];\n\t if (x1 >= x2) {\n\t // Overlap detected.\n\t return diff_bisectSplit_(text1, text2, x1, y1);\n\t }\n\t }\n\t }\n\t }\n\n\t // Walk the reverse path one step.\n\t for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n\t var k2_offset = v_offset + k2;\n\t var x2;\n\t if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {\n\t x2 = v2[k2_offset + 1];\n\t } else {\n\t x2 = v2[k2_offset - 1] + 1;\n\t }\n\t var y2 = x2 - k2;\n\t while (x2 < text1_length && y2 < text2_length &&\n\t text1.charAt(text1_length - x2 - 1) ==\n\t text2.charAt(text2_length - y2 - 1)) {\n\t x2++;\n\t y2++;\n\t }\n\t v2[k2_offset] = x2;\n\t if (x2 > text1_length) {\n\t // Ran off the left of the graph.\n\t k2end += 2;\n\t } else if (y2 > text2_length) {\n\t // Ran off the top of the graph.\n\t k2start += 2;\n\t } else if (!front) {\n\t var k1_offset = v_offset + delta - k2;\n\t if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {\n\t var x1 = v1[k1_offset];\n\t var y1 = v_offset + x1 - k1_offset;\n\t // Mirror x2 onto top-left coordinate system.\n\t x2 = text1_length - x2;\n\t if (x1 >= x2) {\n\t // Overlap detected.\n\t return diff_bisectSplit_(text1, text2, x1, y1);\n\t }\n\t }\n\t }\n\t }\n\t }\n\t // Diff took too long and hit the deadline or\n\t // number of diffs equals number of characters, no commonality at all.\n\t return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n\t};\n\n\n\t/**\n\t * Given the location of the 'middle snake', split the diff in two parts\n\t * and recurse.\n\t * @param {string} text1 Old string to be diffed.\n\t * @param {string} text2 New string to be diffed.\n\t * @param {number} x Index of split point in text1.\n\t * @param {number} y Index of split point in text2.\n\t * @return {Array} Array of diff tuples.\n\t */\n\tfunction diff_bisectSplit_(text1, text2, x, y) {\n\t var text1a = text1.substring(0, x);\n\t var text2a = text2.substring(0, y);\n\t var text1b = text1.substring(x);\n\t var text2b = text2.substring(y);\n\n\t // Compute both diffs serially.\n\t var diffs = diff_main(text1a, text2a);\n\t var diffsb = diff_main(text1b, text2b);\n\n\t return diffs.concat(diffsb);\n\t};\n\n\n\t/**\n\t * Determine the common prefix of two strings.\n\t * @param {string} text1 First string.\n\t * @param {string} text2 Second string.\n\t * @return {number} The number of characters common to the start of each\n\t * string.\n\t */\n\tfunction diff_commonPrefix(text1, text2) {\n\t // Quick check for common null cases.\n\t if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {\n\t return 0;\n\t }\n\t // Binary search.\n\t // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n\t var pointermin = 0;\n\t var pointermax = Math.min(text1.length, text2.length);\n\t var pointermid = pointermax;\n\t var pointerstart = 0;\n\t while (pointermin < pointermid) {\n\t if (text1.substring(pointerstart, pointermid) ==\n\t text2.substring(pointerstart, pointermid)) {\n\t pointermin = pointermid;\n\t pointerstart = pointermin;\n\t } else {\n\t pointermax = pointermid;\n\t }\n\t pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n\t }\n\t return pointermid;\n\t};\n\n\n\t/**\n\t * Determine the common suffix of two strings.\n\t * @param {string} text1 First string.\n\t * @param {string} text2 Second string.\n\t * @return {number} The number of characters common to the end of each string.\n\t */\n\tfunction diff_commonSuffix(text1, text2) {\n\t // Quick check for common null cases.\n\t if (!text1 || !text2 ||\n\t text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {\n\t return 0;\n\t }\n\t // Binary search.\n\t // Performance analysis: http://neil.fraser.name/news/2007/10/09/\n\t var pointermin = 0;\n\t var pointermax = Math.min(text1.length, text2.length);\n\t var pointermid = pointermax;\n\t var pointerend = 0;\n\t while (pointermin < pointermid) {\n\t if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==\n\t text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n\t pointermin = pointermid;\n\t pointerend = pointermin;\n\t } else {\n\t pointermax = pointermid;\n\t }\n\t pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n\t }\n\t return pointermid;\n\t};\n\n\n\t/**\n\t * Do the two texts share a substring which is at least half the length of the\n\t * longer text?\n\t * This speedup can produce non-minimal diffs.\n\t * @param {string} text1 First string.\n\t * @param {string} text2 Second string.\n\t * @return {Array.} Five element Array, containing the prefix of\n\t * text1, the suffix of text1, the prefix of text2, the suffix of\n\t * text2 and the common middle. Or null if there was no match.\n\t */\n\tfunction diff_halfMatch_(text1, text2) {\n\t var longtext = text1.length > text2.length ? text1 : text2;\n\t var shorttext = text1.length > text2.length ? text2 : text1;\n\t if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n\t return null; // Pointless.\n\t }\n\n\t /**\n\t * Does a substring of shorttext exist within longtext such that the substring\n\t * is at least half the length of longtext?\n\t * Closure, but does not reference any external variables.\n\t * @param {string} longtext Longer string.\n\t * @param {string} shorttext Shorter string.\n\t * @param {number} i Start index of quarter length substring within longtext.\n\t * @return {Array.} Five element Array, containing the prefix of\n\t * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n\t * of shorttext and the common middle. Or null if there was no match.\n\t * @private\n\t */\n\t function diff_halfMatchI_(longtext, shorttext, i) {\n\t // Start with a 1/4 length substring at position i as a seed.\n\t var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n\t var j = -1;\n\t var best_common = '';\n\t var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\n\t while ((j = shorttext.indexOf(seed, j + 1)) != -1) {\n\t var prefixLength = diff_commonPrefix(longtext.substring(i),\n\t shorttext.substring(j));\n\t var suffixLength = diff_commonSuffix(longtext.substring(0, i),\n\t shorttext.substring(0, j));\n\t if (best_common.length < suffixLength + prefixLength) {\n\t best_common = shorttext.substring(j - suffixLength, j) +\n\t shorttext.substring(j, j + prefixLength);\n\t best_longtext_a = longtext.substring(0, i - suffixLength);\n\t best_longtext_b = longtext.substring(i + prefixLength);\n\t best_shorttext_a = shorttext.substring(0, j - suffixLength);\n\t best_shorttext_b = shorttext.substring(j + prefixLength);\n\t }\n\t }\n\t if (best_common.length * 2 >= longtext.length) {\n\t return [best_longtext_a, best_longtext_b,\n\t best_shorttext_a, best_shorttext_b, best_common];\n\t } else {\n\t return null;\n\t }\n\t }\n\n\t // First check if the second quarter is the seed for a half-match.\n\t var hm1 = diff_halfMatchI_(longtext, shorttext,\n\t Math.ceil(longtext.length / 4));\n\t // Check again based on the third quarter.\n\t var hm2 = diff_halfMatchI_(longtext, shorttext,\n\t Math.ceil(longtext.length / 2));\n\t var hm;\n\t if (!hm1 && !hm2) {\n\t return null;\n\t } else if (!hm2) {\n\t hm = hm1;\n\t } else if (!hm1) {\n\t hm = hm2;\n\t } else {\n\t // Both matched. Select the longest.\n\t hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n\t }\n\n\t // A half-match was found, sort out the return data.\n\t var text1_a, text1_b, text2_a, text2_b;\n\t if (text1.length > text2.length) {\n\t text1_a = hm[0];\n\t text1_b = hm[1];\n\t text2_a = hm[2];\n\t text2_b = hm[3];\n\t } else {\n\t text2_a = hm[0];\n\t text2_b = hm[1];\n\t text1_a = hm[2];\n\t text1_b = hm[3];\n\t }\n\t var mid_common = hm[4];\n\t return [text1_a, text1_b, text2_a, text2_b, mid_common];\n\t};\n\n\n\t/**\n\t * Reorder and merge like edit sections. Merge equalities.\n\t * Any edit section can move as long as it doesn't cross an equality.\n\t * @param {Array} diffs Array of diff tuples.\n\t */\n\tfunction diff_cleanupMerge(diffs) {\n\t diffs.push([DIFF_EQUAL, '']); // Add a dummy entry at the end.\n\t var pointer = 0;\n\t var count_delete = 0;\n\t var count_insert = 0;\n\t var text_delete = '';\n\t var text_insert = '';\n\t var commonlength;\n\t while (pointer < diffs.length) {\n\t switch (diffs[pointer][0]) {\n\t case DIFF_INSERT:\n\t count_insert++;\n\t text_insert += diffs[pointer][1];\n\t pointer++;\n\t break;\n\t case DIFF_DELETE:\n\t count_delete++;\n\t text_delete += diffs[pointer][1];\n\t pointer++;\n\t break;\n\t case DIFF_EQUAL:\n\t // Upon reaching an equality, check for prior redundancies.\n\t if (count_delete + count_insert > 1) {\n\t if (count_delete !== 0 && count_insert !== 0) {\n\t // Factor out any common prefixies.\n\t commonlength = diff_commonPrefix(text_insert, text_delete);\n\t if (commonlength !== 0) {\n\t if ((pointer - count_delete - count_insert) > 0 &&\n\t diffs[pointer - count_delete - count_insert - 1][0] ==\n\t DIFF_EQUAL) {\n\t diffs[pointer - count_delete - count_insert - 1][1] +=\n\t text_insert.substring(0, commonlength);\n\t } else {\n\t diffs.splice(0, 0, [DIFF_EQUAL,\n\t text_insert.substring(0, commonlength)]);\n\t pointer++;\n\t }\n\t text_insert = text_insert.substring(commonlength);\n\t text_delete = text_delete.substring(commonlength);\n\t }\n\t // Factor out any common suffixies.\n\t commonlength = diff_commonSuffix(text_insert, text_delete);\n\t if (commonlength !== 0) {\n\t diffs[pointer][1] = text_insert.substring(text_insert.length -\n\t commonlength) + diffs[pointer][1];\n\t text_insert = text_insert.substring(0, text_insert.length -\n\t commonlength);\n\t text_delete = text_delete.substring(0, text_delete.length -\n\t commonlength);\n\t }\n\t }\n\t // Delete the offending records and add the merged ones.\n\t if (count_delete === 0) {\n\t diffs.splice(pointer - count_insert,\n\t count_delete + count_insert, [DIFF_INSERT, text_insert]);\n\t } else if (count_insert === 0) {\n\t diffs.splice(pointer - count_delete,\n\t count_delete + count_insert, [DIFF_DELETE, text_delete]);\n\t } else {\n\t diffs.splice(pointer - count_delete - count_insert,\n\t count_delete + count_insert, [DIFF_DELETE, text_delete],\n\t [DIFF_INSERT, text_insert]);\n\t }\n\t pointer = pointer - count_delete - count_insert +\n\t (count_delete ? 1 : 0) + (count_insert ? 1 : 0) + 1;\n\t } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {\n\t // Merge this equality with the previous one.\n\t diffs[pointer - 1][1] += diffs[pointer][1];\n\t diffs.splice(pointer, 1);\n\t } else {\n\t pointer++;\n\t }\n\t count_insert = 0;\n\t count_delete = 0;\n\t text_delete = '';\n\t text_insert = '';\n\t break;\n\t }\n\t }\n\t if (diffs[diffs.length - 1][1] === '') {\n\t diffs.pop(); // Remove the dummy entry at the end.\n\t }\n\n\t // Second pass: look for single edits surrounded on both sides by equalities\n\t // which can be shifted sideways to eliminate an equality.\n\t // e.g: ABAC -> ABAC\n\t var changes = false;\n\t pointer = 1;\n\t // Intentionally ignore the first and last element (don't need checking).\n\t while (pointer < diffs.length - 1) {\n\t if (diffs[pointer - 1][0] == DIFF_EQUAL &&\n\t diffs[pointer + 1][0] == DIFF_EQUAL) {\n\t // This is a single edit surrounded by equalities.\n\t if (diffs[pointer][1].substring(diffs[pointer][1].length -\n\t diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {\n\t // Shift the edit over the previous equality.\n\t diffs[pointer][1] = diffs[pointer - 1][1] +\n\t diffs[pointer][1].substring(0, diffs[pointer][1].length -\n\t diffs[pointer - 1][1].length);\n\t diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n\t diffs.splice(pointer - 1, 1);\n\t changes = true;\n\t } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==\n\t diffs[pointer + 1][1]) {\n\t // Shift the edit over the next equality.\n\t diffs[pointer - 1][1] += diffs[pointer + 1][1];\n\t diffs[pointer][1] =\n\t diffs[pointer][1].substring(diffs[pointer + 1][1].length) +\n\t diffs[pointer + 1][1];\n\t diffs.splice(pointer + 1, 1);\n\t changes = true;\n\t }\n\t }\n\t pointer++;\n\t }\n\t // If shifts were made, the diff needs reordering and another shift sweep.\n\t if (changes) {\n\t diff_cleanupMerge(diffs);\n\t }\n\t};\n\n\n\tvar diff = diff_main;\n\tdiff.INSERT = DIFF_INSERT;\n\tdiff.DELETE = DIFF_DELETE;\n\tdiff.EQUAL = DIFF_EQUAL;\n\n\tmodule.exports = diff;\n\n\t/*\n\t * Modify a diff such that the cursor position points to the start of a change:\n\t * E.g.\n\t * cursor_normalize_diff([[DIFF_EQUAL, 'abc']], 1)\n\t * => [1, [[DIFF_EQUAL, 'a'], [DIFF_EQUAL, 'bc']]]\n\t * cursor_normalize_diff([[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xyz']], 2)\n\t * => [2, [[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xy'], [DIFF_DELETE, 'z']]]\n\t *\n\t * @param {Array} diffs Array of diff tuples\n\t * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds!\n\t * @return {Array} A tuple [cursor location in the modified diff, modified diff]\n\t */\n\tfunction cursor_normalize_diff (diffs, cursor_pos) {\n\t if (cursor_pos === 0) {\n\t return [DIFF_EQUAL, diffs];\n\t }\n\t for (var current_pos = 0, i = 0; i < diffs.length; i++) {\n\t var d = diffs[i];\n\t if (d[0] === DIFF_DELETE || d[0] === DIFF_EQUAL) {\n\t var next_pos = current_pos + d[1].length;\n\t if (cursor_pos === next_pos) {\n\t return [i + 1, diffs];\n\t } else if (cursor_pos < next_pos) {\n\t // copy to prevent side effects\n\t diffs = diffs.slice();\n\t // split d into two diff changes\n\t var split_pos = cursor_pos - current_pos;\n\t var d_left = [d[0], d[1].slice(0, split_pos)];\n\t var d_right = [d[0], d[1].slice(split_pos)];\n\t diffs.splice(i, 1, d_left, d_right);\n\t return [i + 1, diffs];\n\t } else {\n\t current_pos = next_pos;\n\t }\n\t }\n\t }\n\t throw new Error('cursor_pos is out of bounds!')\n\t}\n\n\t/*\n\t * Modify a diff such that the edit position is \"shifted\" to the proposed edit location (cursor_position).\n\t *\n\t * Case 1)\n\t * Check if a naive shift is possible:\n\t * [0, X], [ 1, Y] -> [ 1, Y], [0, X] (if X + Y === Y + X)\n\t * [0, X], [-1, Y] -> [-1, Y], [0, X] (if X + Y === Y + X) - holds same result\n\t * Case 2)\n\t * Check if the following shifts are possible:\n\t * [0, 'pre'], [ 1, 'prefix'] -> [ 1, 'pre'], [0, 'pre'], [ 1, 'fix']\n\t * [0, 'pre'], [-1, 'prefix'] -> [-1, 'pre'], [0, 'pre'], [-1, 'fix']\n\t * ^ ^\n\t * d d_next\n\t *\n\t * @param {Array} diffs Array of diff tuples\n\t * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds!\n\t * @return {Array} Array of diff tuples\n\t */\n\tfunction fix_cursor (diffs, cursor_pos) {\n\t var norm = cursor_normalize_diff(diffs, cursor_pos);\n\t var ndiffs = norm[1];\n\t var cursor_pointer = norm[0];\n\t var d = ndiffs[cursor_pointer];\n\t var d_next = ndiffs[cursor_pointer + 1];\n\n\t if (d == null) {\n\t // Text was deleted from end of original string,\n\t // cursor is now out of bounds in new string\n\t return diffs;\n\t } else if (d[0] !== DIFF_EQUAL) {\n\t // A modification happened at the cursor location.\n\t // This is the expected outcome, so we can return the original diff.\n\t return diffs;\n\t } else {\n\t if (d_next != null && d[1] + d_next[1] === d_next[1] + d[1]) {\n\t // Case 1)\n\t // It is possible to perform a naive shift\n\t ndiffs.splice(cursor_pointer, 2, d_next, d)\n\t return merge_tuples(ndiffs, cursor_pointer, 2)\n\t } else if (d_next != null && d_next[1].indexOf(d[1]) === 0) {\n\t // Case 2)\n\t // d[1] is a prefix of d_next[1]\n\t // We can assume that d_next[0] !== 0, since d[0] === 0\n\t // Shift edit locations..\n\t ndiffs.splice(cursor_pointer, 2, [d_next[0], d[1]], [0, d[1]]);\n\t var suffix = d_next[1].slice(d[1].length);\n\t if (suffix.length > 0) {\n\t ndiffs.splice(cursor_pointer + 2, 0, [d_next[0], suffix]);\n\t }\n\t return merge_tuples(ndiffs, cursor_pointer, 3)\n\t } else {\n\t // Not possible to perform any modification\n\t return diffs;\n\t }\n\t }\n\n\t}\n\n\t/*\n\t * Try to merge tuples with their neigbors in a given range.\n\t * E.g. [0, 'a'], [0, 'b'] -> [0, 'ab']\n\t *\n\t * @param {Array} diffs Array of diff tuples.\n\t * @param {Int} start Position of the first element to merge (diffs[start] is also merged with diffs[start - 1]).\n\t * @param {Int} length Number of consecutive elements to check.\n\t * @return {Array} Array of merged diff tuples.\n\t */\n\tfunction merge_tuples (diffs, start, length) {\n\t // Check from (start-1) to (start+length).\n\t for (var i = start + length - 1; i >= 0 && i >= start - 1; i--) {\n\t if (i + 1 < diffs.length) {\n\t var left_d = diffs[i];\n\t var right_d = diffs[i+1];\n\t if (left_d[0] === right_d[1]) {\n\t diffs.splice(i, 2, [left_d[0], left_d[1] + right_d[1]]);\n\t }\n\t }\n\t }\n\t return diffs;\n\t}\n\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar pSlice = Array.prototype.slice;\n\tvar objectKeys = __webpack_require__(23);\n\tvar isArguments = __webpack_require__(24);\n\n\tvar deepEqual = module.exports = function (actual, expected, opts) {\n\t if (!opts) opts = {};\n\t // 7.1. All identical values are equivalent, as determined by ===.\n\t if (actual === expected) {\n\t return true;\n\n\t } else if (actual instanceof Date && expected instanceof Date) {\n\t return actual.getTime() === expected.getTime();\n\n\t // 7.3. Other pairs that do not both pass typeof value == 'object',\n\t // equivalence is determined by ==.\n\t } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {\n\t return opts.strict ? actual === expected : actual == expected;\n\n\t // 7.4. For all other Object pairs, including Array objects, equivalence is\n\t // determined by having the same number of owned properties (as verified\n\t // with Object.prototype.hasOwnProperty.call), the same set of keys\n\t // (although not necessarily the same order), equivalent values for every\n\t // corresponding key, and an identical 'prototype' property. Note: this\n\t // accounts for both named and indexed properties on Arrays.\n\t } else {\n\t return objEquiv(actual, expected, opts);\n\t }\n\t}\n\n\tfunction isUndefinedOrNull(value) {\n\t return value === null || value === undefined;\n\t}\n\n\tfunction isBuffer (x) {\n\t if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;\n\t if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {\n\t return false;\n\t }\n\t if (x.length > 0 && typeof x[0] !== 'number') return false;\n\t return true;\n\t}\n\n\tfunction objEquiv(a, b, opts) {\n\t var i, key;\n\t if (isUndefinedOrNull(a) || isUndefinedOrNull(b))\n\t return false;\n\t // an identical 'prototype' property.\n\t if (a.prototype !== b.prototype) return false;\n\t //~~~I've managed to break Object.keys through screwy arguments passing.\n\t // Converting to array solves the problem.\n\t if (isArguments(a)) {\n\t if (!isArguments(b)) {\n\t return false;\n\t }\n\t a = pSlice.call(a);\n\t b = pSlice.call(b);\n\t return deepEqual(a, b, opts);\n\t }\n\t if (isBuffer(a)) {\n\t if (!isBuffer(b)) {\n\t return false;\n\t }\n\t if (a.length !== b.length) return false;\n\t for (i = 0; i < a.length; i++) {\n\t if (a[i] !== b[i]) return false;\n\t }\n\t return true;\n\t }\n\t try {\n\t var ka = objectKeys(a),\n\t kb = objectKeys(b);\n\t } catch (e) {//happens when one is a string literal and the other isn't\n\t return false;\n\t }\n\t // having the same number of owned properties (keys incorporates\n\t // hasOwnProperty)\n\t if (ka.length != kb.length)\n\t return false;\n\t //the same set of keys (although not necessarily the same order),\n\t ka.sort();\n\t kb.sort();\n\t //~~~cheap key test\n\t for (i = ka.length - 1; i >= 0; i--) {\n\t if (ka[i] != kb[i])\n\t return false;\n\t }\n\t //equivalent values for every corresponding key, and\n\t //~~~possibly expensive deep test\n\t for (i = ka.length - 1; i >= 0; i--) {\n\t key = ka[i];\n\t if (!deepEqual(a[key], b[key], opts)) return false;\n\t }\n\t return typeof a === typeof b;\n\t}\n\n\n/***/ },\n/* 23 */\n/***/ function(module, exports) {\n\n\texports = module.exports = typeof Object.keys === 'function'\n\t ? Object.keys : shim;\n\n\texports.shim = shim;\n\tfunction shim (obj) {\n\t var keys = [];\n\t for (var key in obj) keys.push(key);\n\t return keys;\n\t}\n\n\n/***/ },\n/* 24 */\n/***/ function(module, exports) {\n\n\tvar supportsArgumentsClass = (function(){\n\t return Object.prototype.toString.call(arguments)\n\t})() == '[object Arguments]';\n\n\texports = module.exports = supportsArgumentsClass ? supported : unsupported;\n\n\texports.supported = supported;\n\tfunction supported(object) {\n\t return Object.prototype.toString.call(object) == '[object Arguments]';\n\t};\n\n\texports.unsupported = unsupported;\n\tfunction unsupported(object){\n\t return object &&\n\t typeof object == 'object' &&\n\t typeof object.length == 'number' &&\n\t Object.prototype.hasOwnProperty.call(object, 'callee') &&\n\t !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||\n\t false;\n\t};\n\n\n/***/ },\n/* 25 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tvar hasOwn = Object.prototype.hasOwnProperty;\n\tvar toStr = Object.prototype.toString;\n\n\tvar isArray = function isArray(arr) {\n\t\tif (typeof Array.isArray === 'function') {\n\t\t\treturn Array.isArray(arr);\n\t\t}\n\n\t\treturn toStr.call(arr) === '[object Array]';\n\t};\n\n\tvar isPlainObject = function isPlainObject(obj) {\n\t\tif (!obj || toStr.call(obj) !== '[object Object]') {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar hasOwnConstructor = hasOwn.call(obj, 'constructor');\n\t\tvar hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');\n\t\t// Not own constructor property must be Object\n\t\tif (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\t\tvar key;\n\t\tfor (key in obj) {/**/}\n\n\t\treturn typeof key === 'undefined' || hasOwn.call(obj, key);\n\t};\n\n\tmodule.exports = function extend() {\n\t\tvar options, name, src, copy, copyIsArray, clone,\n\t\t\ttarget = arguments[0],\n\t\t\ti = 1,\n\t\t\tlength = arguments.length,\n\t\t\tdeep = false;\n\n\t\t// Handle a deep copy situation\n\t\tif (typeof target === 'boolean') {\n\t\t\tdeep = target;\n\t\t\ttarget = arguments[1] || {};\n\t\t\t// skip the boolean and the target\n\t\t\ti = 2;\n\t\t} else if ((typeof target !== 'object' && typeof target !== 'function') || target == null) {\n\t\t\ttarget = {};\n\t\t}\n\n\t\tfor (; i < length; ++i) {\n\t\t\toptions = arguments[i];\n\t\t\t// Only deal with non-null/undefined values\n\t\t\tif (options != null) {\n\t\t\t\t// Extend the base object\n\t\t\t\tfor (name in options) {\n\t\t\t\t\tsrc = target[name];\n\t\t\t\t\tcopy = options[name];\n\n\t\t\t\t\t// Prevent never-ending loop\n\t\t\t\t\tif (target !== copy) {\n\t\t\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\t\t\tif (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n\t\t\t\t\t\t\tif (copyIsArray) {\n\t\t\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\t\t\tclone = src && isArray(src) ? src : [];\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tclone = src && isPlainObject(src) ? src : {};\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\t\t\ttarget[name] = extend(deep, clone, copy);\n\n\t\t\t\t\t\t// Don't bring in undefined values\n\t\t\t\t\t\t} else if (typeof copy !== 'undefined') {\n\t\t\t\t\t\t\ttarget[name] = copy;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Return the modified object\n\t\treturn target;\n\t};\n\n\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar equal = __webpack_require__(22);\n\tvar extend = __webpack_require__(25);\n\n\n\tvar lib = {\n\t attributes: {\n\t compose: function (a, b, keepNull) {\n\t if (typeof a !== 'object') a = {};\n\t if (typeof b !== 'object') b = {};\n\t var attributes = extend(true, {}, b);\n\t if (!keepNull) {\n\t attributes = Object.keys(attributes).reduce(function (copy, key) {\n\t if (attributes[key] != null) {\n\t copy[key] = attributes[key];\n\t }\n\t return copy;\n\t }, {});\n\t }\n\t for (var key in a) {\n\t if (a[key] !== undefined && b[key] === undefined) {\n\t attributes[key] = a[key];\n\t }\n\t }\n\t return Object.keys(attributes).length > 0 ? attributes : undefined;\n\t },\n\n\t diff: function(a, b) {\n\t if (typeof a !== 'object') a = {};\n\t if (typeof b !== 'object') b = {};\n\t var attributes = Object.keys(a).concat(Object.keys(b)).reduce(function (attributes, key) {\n\t if (!equal(a[key], b[key])) {\n\t attributes[key] = b[key] === undefined ? null : b[key];\n\t }\n\t return attributes;\n\t }, {});\n\t return Object.keys(attributes).length > 0 ? attributes : undefined;\n\t },\n\n\t transform: function (a, b, priority) {\n\t if (typeof a !== 'object') return b;\n\t if (typeof b !== 'object') return undefined;\n\t if (!priority) return b; // b simply overwrites us without priority\n\t var attributes = Object.keys(b).reduce(function (attributes, key) {\n\t if (a[key] === undefined) attributes[key] = b[key]; // null is a valid value\n\t return attributes;\n\t }, {});\n\t return Object.keys(attributes).length > 0 ? attributes : undefined;\n\t }\n\t },\n\n\t iterator: function (ops) {\n\t return new Iterator(ops);\n\t },\n\n\t length: function (op) {\n\t if (typeof op['delete'] === 'number') {\n\t return op['delete'];\n\t } else if (typeof op.retain === 'number') {\n\t return op.retain;\n\t } else {\n\t return typeof op.insert === 'string' ? op.insert.length : 1;\n\t }\n\t }\n\t};\n\n\n\tfunction Iterator(ops) {\n\t this.ops = ops;\n\t this.index = 0;\n\t this.offset = 0;\n\t};\n\n\tIterator.prototype.hasNext = function () {\n\t return this.peekLength() < Infinity;\n\t};\n\n\tIterator.prototype.next = function (length) {\n\t if (!length) length = Infinity;\n\t var nextOp = this.ops[this.index];\n\t if (nextOp) {\n\t var offset = this.offset;\n\t var opLength = lib.length(nextOp)\n\t if (length >= opLength - offset) {\n\t length = opLength - offset;\n\t this.index += 1;\n\t this.offset = 0;\n\t } else {\n\t this.offset += length;\n\t }\n\t if (typeof nextOp['delete'] === 'number') {\n\t return { 'delete': length };\n\t } else {\n\t var retOp = {};\n\t if (nextOp.attributes) {\n\t retOp.attributes = nextOp.attributes;\n\t }\n\t if (typeof nextOp.retain === 'number') {\n\t retOp.retain = length;\n\t } else if (typeof nextOp.insert === 'string') {\n\t retOp.insert = nextOp.insert.substr(offset, length);\n\t } else {\n\t // offset should === 0, length should === 1\n\t retOp.insert = nextOp.insert;\n\t }\n\t return retOp;\n\t }\n\t } else {\n\t return { retain: Infinity };\n\t }\n\t};\n\n\tIterator.prototype.peek = function () {\n\t return this.ops[this.index];\n\t};\n\n\tIterator.prototype.peekLength = function () {\n\t if (this.ops[this.index]) {\n\t // Should never return 0 if our index is being managed correctly\n\t return lib.length(this.ops[this.index]) - this.offset;\n\t } else {\n\t return Infinity;\n\t }\n\t};\n\n\tIterator.prototype.peekType = function () {\n\t if (this.ops[this.index]) {\n\t if (typeof this.ops[this.index]['delete'] === 'number') {\n\t return 'delete';\n\t } else if (typeof this.ops[this.index].retain === 'number') {\n\t return 'retain';\n\t } else {\n\t return 'insert';\n\t }\n\t }\n\t return 'retain';\n\t};\n\n\n\tmodule.exports = lib;\n\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _quillDelta = __webpack_require__(20);\n\n\tvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\n\tvar _op = __webpack_require__(26);\n\n\tvar _op2 = _interopRequireDefault(_op);\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _code = __webpack_require__(28);\n\n\tvar _code2 = _interopRequireDefault(_code);\n\n\tvar _cursor = __webpack_require__(34);\n\n\tvar _cursor2 = _interopRequireDefault(_cursor);\n\n\tvar _block = __webpack_require__(29);\n\n\tvar _block2 = _interopRequireDefault(_block);\n\n\tvar _clone = __webpack_require__(38);\n\n\tvar _clone2 = _interopRequireDefault(_clone);\n\n\tvar _deepEqual = __webpack_require__(22);\n\n\tvar _deepEqual2 = _interopRequireDefault(_deepEqual);\n\n\tvar _extend = __webpack_require__(25);\n\n\tvar _extend2 = _interopRequireDefault(_extend);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tvar Editor = function () {\n\t function Editor(scroll) {\n\t _classCallCheck(this, Editor);\n\n\t this.scroll = scroll;\n\t this.delta = this.getDelta();\n\t }\n\n\t _createClass(Editor, [{\n\t key: 'applyDelta',\n\t value: function applyDelta(delta) {\n\t var _this = this;\n\n\t var consumeNextNewline = false;\n\t this.scroll.update();\n\t var scrollLength = this.scroll.length();\n\t this.scroll.batch = true;\n\t delta = normalizeDelta(delta);\n\t delta.reduce(function (index, op) {\n\t var length = op.retain || op.delete || op.insert.length || 1;\n\t var attributes = op.attributes || {};\n\t if (op.insert != null) {\n\t if (typeof op.insert === 'string') {\n\t var text = op.insert;\n\t if (text.endsWith('\\n') && consumeNextNewline) {\n\t consumeNextNewline = false;\n\t text = text.slice(0, -1);\n\t }\n\t if (index >= scrollLength && !text.endsWith('\\n')) {\n\t consumeNextNewline = true;\n\t }\n\t _this.scroll.insertAt(index, text);\n\n\t var _scroll$line = _this.scroll.line(index),\n\t _scroll$line2 = _slicedToArray(_scroll$line, 2),\n\t line = _scroll$line2[0],\n\t offset = _scroll$line2[1];\n\n\t var formats = (0, _extend2.default)({}, (0, _block.bubbleFormats)(line));\n\t if (line instanceof _block2.default) {\n\t var _line$descendant = line.descendant(_parchment2.default.Leaf, offset),\n\t _line$descendant2 = _slicedToArray(_line$descendant, 1),\n\t leaf = _line$descendant2[0];\n\n\t formats = (0, _extend2.default)(formats, (0, _block.bubbleFormats)(leaf));\n\t }\n\t attributes = _op2.default.attributes.diff(formats, attributes) || {};\n\t } else if (_typeof(op.insert) === 'object') {\n\t var key = Object.keys(op.insert)[0]; // There should only be one key\n\t if (key == null) return index;\n\t _this.scroll.insertAt(index, key, op.insert[key]);\n\t }\n\t scrollLength += length;\n\t }\n\t Object.keys(attributes).forEach(function (name) {\n\t _this.scroll.formatAt(index, length, name, attributes[name]);\n\t });\n\t return index + length;\n\t }, 0);\n\t delta.reduce(function (index, op) {\n\t if (typeof op.delete === 'number') {\n\t _this.scroll.deleteAt(index, op.delete);\n\t return index;\n\t }\n\t return index + (op.retain || op.insert.length || 1);\n\t }, 0);\n\t this.scroll.batch = false;\n\t this.scroll.optimize();\n\t return this.update(delta);\n\t }\n\t }, {\n\t key: 'deleteText',\n\t value: function deleteText(index, length) {\n\t this.scroll.deleteAt(index, length);\n\t return this.update(new _quillDelta2.default().retain(index).delete(length));\n\t }\n\t }, {\n\t key: 'formatLine',\n\t value: function formatLine(index, length) {\n\t var _this2 = this;\n\n\t var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\t this.scroll.update();\n\t Object.keys(formats).forEach(function (format) {\n\t var lines = _this2.scroll.lines(index, Math.max(length, 1));\n\t var lengthRemaining = length;\n\t lines.forEach(function (line) {\n\t var lineLength = line.length();\n\t if (!(line instanceof _code2.default)) {\n\t line.format(format, formats[format]);\n\t } else {\n\t var codeIndex = index - line.offset(_this2.scroll);\n\t var codeLength = line.newlineIndex(codeIndex + lengthRemaining) - codeIndex + 1;\n\t line.formatAt(codeIndex, codeLength, format, formats[format]);\n\t }\n\t lengthRemaining -= lineLength;\n\t });\n\t });\n\t this.scroll.optimize();\n\t return this.update(new _quillDelta2.default().retain(index).retain(length, (0, _clone2.default)(formats)));\n\t }\n\t }, {\n\t key: 'formatText',\n\t value: function formatText(index, length) {\n\t var _this3 = this;\n\n\t var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\t Object.keys(formats).forEach(function (format) {\n\t _this3.scroll.formatAt(index, length, format, formats[format]);\n\t });\n\t return this.update(new _quillDelta2.default().retain(index).retain(length, (0, _clone2.default)(formats)));\n\t }\n\t }, {\n\t key: 'getContents',\n\t value: function getContents(index, length) {\n\t return this.delta.slice(index, index + length);\n\t }\n\t }, {\n\t key: 'getDelta',\n\t value: function getDelta() {\n\t return this.scroll.lines().reduce(function (delta, line) {\n\t return delta.concat(line.delta());\n\t }, new _quillDelta2.default());\n\t }\n\t }, {\n\t key: 'getFormat',\n\t value: function getFormat(index) {\n\t var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n\t var lines = [],\n\t leaves = [];\n\t if (length === 0) {\n\t this.scroll.path(index).forEach(function (path) {\n\t var _path = _slicedToArray(path, 1),\n\t blot = _path[0];\n\n\t if (blot instanceof _block2.default) {\n\t lines.push(blot);\n\t } else if (blot instanceof _parchment2.default.Leaf) {\n\t leaves.push(blot);\n\t }\n\t });\n\t } else {\n\t lines = this.scroll.lines(index, length);\n\t leaves = this.scroll.descendants(_parchment2.default.Leaf, index, length);\n\t }\n\t var formatsArr = [lines, leaves].map(function (blots) {\n\t if (blots.length === 0) return {};\n\t var formats = (0, _block.bubbleFormats)(blots.shift());\n\t while (Object.keys(formats).length > 0) {\n\t var blot = blots.shift();\n\t if (blot == null) return formats;\n\t formats = combineFormats((0, _block.bubbleFormats)(blot), formats);\n\t }\n\t return formats;\n\t });\n\t return _extend2.default.apply(_extend2.default, formatsArr);\n\t }\n\t }, {\n\t key: 'getText',\n\t value: function getText(index, length) {\n\t return this.getContents(index, length).filter(function (op) {\n\t return typeof op.insert === 'string';\n\t }).map(function (op) {\n\t return op.insert;\n\t }).join('');\n\t }\n\t }, {\n\t key: 'insertEmbed',\n\t value: function insertEmbed(index, embed, value) {\n\t this.scroll.insertAt(index, embed, value);\n\t return this.update(new _quillDelta2.default().retain(index).insert(_defineProperty({}, embed, value)));\n\t }\n\t }, {\n\t key: 'insertText',\n\t value: function insertText(index, text) {\n\t var _this4 = this;\n\n\t var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\t text = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n\t this.scroll.insertAt(index, text);\n\t Object.keys(formats).forEach(function (format) {\n\t _this4.scroll.formatAt(index, text.length, format, formats[format]);\n\t });\n\t return this.update(new _quillDelta2.default().retain(index).insert(text, (0, _clone2.default)(formats)));\n\t }\n\t }, {\n\t key: 'isBlank',\n\t value: function isBlank() {\n\t if (this.scroll.children.length == 0) return true;\n\t if (this.scroll.children.length > 1) return false;\n\t var child = this.scroll.children.head;\n\t return child.length() <= 1 && Object.keys(child.formats()).length == 0;\n\t }\n\t }, {\n\t key: 'removeFormat',\n\t value: function removeFormat(index, length) {\n\t var text = this.getText(index, length);\n\n\t var _scroll$line3 = this.scroll.line(index + length),\n\t _scroll$line4 = _slicedToArray(_scroll$line3, 2),\n\t line = _scroll$line4[0],\n\t offset = _scroll$line4[1];\n\n\t var suffixLength = 0,\n\t suffix = new _quillDelta2.default();\n\t if (line != null) {\n\t if (!(line instanceof _code2.default)) {\n\t suffixLength = line.length() - offset;\n\t } else {\n\t suffixLength = line.newlineIndex(offset) - offset + 1;\n\t }\n\t suffix = line.delta().slice(offset, offset + suffixLength - 1).insert('\\n');\n\t }\n\t var contents = this.getContents(index, length + suffixLength);\n\t var diff = contents.diff(new _quillDelta2.default().insert(text).concat(suffix));\n\t var delta = new _quillDelta2.default().retain(index).concat(diff);\n\t return this.applyDelta(delta);\n\t }\n\t }, {\n\t key: 'update',\n\t value: function update(change) {\n\t var _this5 = this;\n\n\t var mutations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n\t var cursorIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;\n\n\t var oldDelta = this.delta;\n\t if (mutations.length === 1 && mutations[0].type === 'characterData' && _parchment2.default.find(mutations[0].target)) {\n\t (function () {\n\t // Optimization for character changes\n\t var textBlot = _parchment2.default.find(mutations[0].target);\n\t var formats = (0, _block.bubbleFormats)(textBlot);\n\t var index = textBlot.offset(_this5.scroll);\n\t var oldValue = mutations[0].oldValue.replace(_cursor2.default.CONTENTS, '');\n\t var oldText = new _quillDelta2.default().insert(oldValue);\n\t var newText = new _quillDelta2.default().insert(textBlot.value());\n\t var diffDelta = new _quillDelta2.default().retain(index).concat(oldText.diff(newText, cursorIndex));\n\t change = diffDelta.reduce(function (delta, op) {\n\t if (op.insert) {\n\t return delta.insert(op.insert, formats);\n\t } else {\n\t return delta.push(op);\n\t }\n\t }, new _quillDelta2.default());\n\t _this5.delta = oldDelta.compose(change);\n\t })();\n\t } else {\n\t this.delta = this.getDelta();\n\t if (!change || !(0, _deepEqual2.default)(oldDelta.compose(change), this.delta)) {\n\t change = oldDelta.diff(this.delta, cursorIndex);\n\t }\n\t }\n\t return change;\n\t }\n\t }]);\n\n\t return Editor;\n\t}();\n\n\tfunction combineFormats(formats, combined) {\n\t return Object.keys(combined).reduce(function (merged, name) {\n\t if (formats[name] == null) return merged;\n\t if (combined[name] === formats[name]) {\n\t merged[name] = combined[name];\n\t } else if (Array.isArray(combined[name])) {\n\t if (combined[name].indexOf(formats[name]) < 0) {\n\t merged[name] = combined[name].concat([formats[name]]);\n\t }\n\t } else {\n\t merged[name] = [combined[name], formats[name]];\n\t }\n\t return merged;\n\t }, {});\n\t}\n\n\tfunction normalizeDelta(delta) {\n\t return delta.reduce(function (delta, op) {\n\t if (op.insert === 1) {\n\t var attributes = (0, _clone2.default)(op.attributes);\n\t delete attributes['image'];\n\t return delta.insert({ image: op.attributes.image }, attributes);\n\t }\n\t if (op.attributes != null && (op.attributes.list === true || op.attributes.bullet === true)) {\n\t op = (0, _clone2.default)(op);\n\t if (op.attributes.list) {\n\t op.attributes.list = 'ordered';\n\t } else {\n\t op.attributes.list = 'bullet';\n\t delete op.attributes.bullet;\n\t }\n\t }\n\t if (typeof op.insert === 'string') {\n\t var text = op.insert.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n\t return delta.insert(text, op.attributes);\n\t }\n\t return delta.push(op);\n\t }, new _quillDelta2.default());\n\t}\n\n\texports.default = Editor;\n\n/***/ },\n/* 28 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = exports.Code = undefined;\n\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _quillDelta = __webpack_require__(20);\n\n\tvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _block = __webpack_require__(29);\n\n\tvar _block2 = _interopRequireDefault(_block);\n\n\tvar _inline = __webpack_require__(32);\n\n\tvar _inline2 = _interopRequireDefault(_inline);\n\n\tvar _text = __webpack_require__(33);\n\n\tvar _text2 = _interopRequireDefault(_text);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Code = function (_Inline) {\n\t _inherits(Code, _Inline);\n\n\t function Code() {\n\t _classCallCheck(this, Code);\n\n\t return _possibleConstructorReturn(this, (Code.__proto__ || Object.getPrototypeOf(Code)).apply(this, arguments));\n\t }\n\n\t return Code;\n\t}(_inline2.default);\n\n\tCode.blotName = 'code';\n\tCode.tagName = 'CODE';\n\n\tvar CodeBlock = function (_Block) {\n\t _inherits(CodeBlock, _Block);\n\n\t function CodeBlock() {\n\t _classCallCheck(this, CodeBlock);\n\n\t return _possibleConstructorReturn(this, (CodeBlock.__proto__ || Object.getPrototypeOf(CodeBlock)).apply(this, arguments));\n\t }\n\n\t _createClass(CodeBlock, [{\n\t key: 'delta',\n\t value: function delta() {\n\t var _this3 = this;\n\n\t var text = this.domNode.textContent;\n\t if (text.endsWith('\\n')) {\n\t // Should always be true\n\t text = text.slice(0, -1);\n\t }\n\t return text.split('\\n').reduce(function (delta, frag) {\n\t return delta.insert(frag).insert('\\n', _this3.formats());\n\t }, new _quillDelta2.default());\n\t }\n\t }, {\n\t key: 'format',\n\t value: function format(name, value) {\n\t if (name === this.statics.blotName && value) return;\n\n\t var _descendant = this.descendant(_text2.default, this.length() - 1),\n\t _descendant2 = _slicedToArray(_descendant, 1),\n\t text = _descendant2[0];\n\n\t if (text != null) {\n\t text.deleteAt(text.length() - 1, 1);\n\t }\n\t _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'format', this).call(this, name, value);\n\t }\n\t }, {\n\t key: 'formatAt',\n\t value: function formatAt(index, length, name, value) {\n\t if (length === 0) return;\n\t if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK) == null || name === this.statics.blotName && value === this.statics.formats(this.domNode)) {\n\t return;\n\t }\n\t var nextNewline = this.newlineIndex(index);\n\t if (nextNewline < 0 || nextNewline >= index + length) return;\n\t var prevNewline = this.newlineIndex(index, true) + 1;\n\t var isolateLength = nextNewline - prevNewline + 1;\n\t var blot = this.isolate(prevNewline, isolateLength);\n\t var next = blot.next;\n\t blot.format(name, value);\n\t if (next instanceof CodeBlock) {\n\t next.formatAt(0, index - prevNewline + length - isolateLength, name, value);\n\t }\n\t }\n\t }, {\n\t key: 'insertAt',\n\t value: function insertAt(index, value, def) {\n\t if (def != null) return;\n\n\t var _descendant3 = this.descendant(_text2.default, index),\n\t _descendant4 = _slicedToArray(_descendant3, 2),\n\t text = _descendant4[0],\n\t offset = _descendant4[1];\n\n\t text.insertAt(offset, value);\n\t }\n\t }, {\n\t key: 'length',\n\t value: function length() {\n\t var length = this.domNode.textContent.length;\n\t if (!this.domNode.textContent.endsWith('\\n')) {\n\t return length + 1;\n\t }\n\t return length;\n\t }\n\t }, {\n\t key: 'newlineIndex',\n\t value: function newlineIndex(searchIndex) {\n\t var reverse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n\t if (!reverse) {\n\t var offset = this.domNode.textContent.slice(searchIndex).indexOf('\\n');\n\t return offset > -1 ? searchIndex + offset : -1;\n\t } else {\n\t return this.domNode.textContent.slice(0, searchIndex).lastIndexOf('\\n');\n\t }\n\t }\n\t }, {\n\t key: 'optimize',\n\t value: function optimize() {\n\t if (!this.domNode.textContent.endsWith('\\n')) {\n\t this.appendChild(_parchment2.default.create('text', '\\n'));\n\t }\n\t _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'optimize', this).call(this);\n\t var next = this.next;\n\t if (next != null && next.prev === this && next.statics.blotName === this.statics.blotName && this.statics.formats(this.domNode) === next.statics.formats(next.domNode)) {\n\t next.optimize();\n\t next.moveChildren(this);\n\t next.remove();\n\t }\n\t }\n\t }, {\n\t key: 'replace',\n\t value: function replace(target) {\n\t _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'replace', this).call(this, target);\n\t [].slice.call(this.domNode.querySelectorAll('*')).forEach(function (node) {\n\t var blot = _parchment2.default.find(node);\n\t if (blot == null) {\n\t node.parentNode.removeChild(node);\n\t } else if (blot instanceof _parchment2.default.Embed) {\n\t blot.remove();\n\t } else {\n\t blot.unwrap();\n\t }\n\t });\n\t }\n\t }], [{\n\t key: 'create',\n\t value: function create(value) {\n\t var domNode = _get(CodeBlock.__proto__ || Object.getPrototypeOf(CodeBlock), 'create', this).call(this, value);\n\t domNode.setAttribute('spellcheck', false);\n\t return domNode;\n\t }\n\t }, {\n\t key: 'formats',\n\t value: function formats() {\n\t return true;\n\t }\n\t }]);\n\n\t return CodeBlock;\n\t}(_block2.default);\n\n\tCodeBlock.blotName = 'code-block';\n\tCodeBlock.tagName = 'PRE';\n\tCodeBlock.TAB = ' ';\n\n\texports.Code = Code;\n\texports.default = CodeBlock;\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = exports.BlockEmbed = exports.bubbleFormats = undefined;\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _extend = __webpack_require__(25);\n\n\tvar _extend2 = _interopRequireDefault(_extend);\n\n\tvar _quillDelta = __webpack_require__(20);\n\n\tvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _break = __webpack_require__(30);\n\n\tvar _break2 = _interopRequireDefault(_break);\n\n\tvar _embed = __webpack_require__(31);\n\n\tvar _embed2 = _interopRequireDefault(_embed);\n\n\tvar _inline = __webpack_require__(32);\n\n\tvar _inline2 = _interopRequireDefault(_inline);\n\n\tvar _text = __webpack_require__(33);\n\n\tvar _text2 = _interopRequireDefault(_text);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar NEWLINE_LENGTH = 1;\n\n\tvar BlockEmbed = function (_Embed) {\n\t _inherits(BlockEmbed, _Embed);\n\n\t function BlockEmbed() {\n\t _classCallCheck(this, BlockEmbed);\n\n\t return _possibleConstructorReturn(this, (BlockEmbed.__proto__ || Object.getPrototypeOf(BlockEmbed)).apply(this, arguments));\n\t }\n\n\t _createClass(BlockEmbed, [{\n\t key: 'attach',\n\t value: function attach() {\n\t _get(BlockEmbed.prototype.__proto__ || Object.getPrototypeOf(BlockEmbed.prototype), 'attach', this).call(this);\n\t this.attributes = new _parchment2.default.Attributor.Store(this.domNode);\n\t }\n\t }, {\n\t key: 'delta',\n\t value: function delta() {\n\t return new _quillDelta2.default().insert(this.value(), (0, _extend2.default)(this.formats(), this.attributes.values()));\n\t }\n\t }, {\n\t key: 'format',\n\t value: function format(name, value) {\n\t var attribute = _parchment2.default.query(name, _parchment2.default.Scope.BLOCK_ATTRIBUTE);\n\t if (attribute != null) {\n\t this.attributes.attribute(attribute, value);\n\t }\n\t }\n\t }, {\n\t key: 'formatAt',\n\t value: function formatAt(index, length, name, value) {\n\t this.format(name, value);\n\t }\n\t }, {\n\t key: 'insertAt',\n\t value: function insertAt(index, value, def) {\n\t if (typeof value === 'string' && value.endsWith('\\n')) {\n\t var block = _parchment2.default.create(Block.blotName);\n\t this.parent.insertBefore(block, index === 0 ? this : this.next);\n\t block.insertAt(0, value.slice(0, -1));\n\t } else {\n\t _get(BlockEmbed.prototype.__proto__ || Object.getPrototypeOf(BlockEmbed.prototype), 'insertAt', this).call(this, index, value, def);\n\t }\n\t }\n\t }]);\n\n\t return BlockEmbed;\n\t}(_embed2.default);\n\n\tBlockEmbed.scope = _parchment2.default.Scope.BLOCK_BLOT;\n\t// It is important for cursor behavior BlockEmbeds use tags that are block level elements\n\n\n\tvar Block = function (_Parchment$Block) {\n\t _inherits(Block, _Parchment$Block);\n\n\t function Block(domNode) {\n\t _classCallCheck(this, Block);\n\n\t var _this2 = _possibleConstructorReturn(this, (Block.__proto__ || Object.getPrototypeOf(Block)).call(this, domNode));\n\n\t _this2.cache = {};\n\t return _this2;\n\t }\n\n\t _createClass(Block, [{\n\t key: 'delta',\n\t value: function delta() {\n\t if (this.cache.delta == null) {\n\t this.cache.delta = this.descendants(_parchment2.default.Leaf).reduce(function (delta, leaf) {\n\t if (leaf.length() === 0) {\n\t return delta;\n\t } else {\n\t return delta.insert(leaf.value(), bubbleFormats(leaf));\n\t }\n\t }, new _quillDelta2.default()).insert('\\n', bubbleFormats(this));\n\t }\n\t return this.cache.delta;\n\t }\n\t }, {\n\t key: 'deleteAt',\n\t value: function deleteAt(index, length) {\n\t _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'deleteAt', this).call(this, index, length);\n\t this.cache = {};\n\t }\n\t }, {\n\t key: 'formatAt',\n\t value: function formatAt(index, length, name, value) {\n\t if (length <= 0) return;\n\t if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK)) {\n\t if (index + length === this.length()) {\n\t this.format(name, value);\n\t }\n\t } else {\n\t _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'formatAt', this).call(this, index, Math.min(length, this.length() - index - 1), name, value);\n\t }\n\t this.cache = {};\n\t }\n\t }, {\n\t key: 'insertAt',\n\t value: function insertAt(index, value, def) {\n\t if (def != null) return _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertAt', this).call(this, index, value, def);\n\t if (value.length === 0) return;\n\t var lines = value.split('\\n');\n\t var text = lines.shift();\n\t if (text.length > 0) {\n\t if (index < this.length() - 1 || this.children.tail == null) {\n\t _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertAt', this).call(this, Math.min(index, this.length() - 1), text);\n\t } else {\n\t this.children.tail.insertAt(this.children.tail.length(), text);\n\t }\n\t this.cache = {};\n\t }\n\t var block = this;\n\t lines.reduce(function (index, line) {\n\t block = block.split(index, true);\n\t block.insertAt(0, line);\n\t return line.length;\n\t }, index + text.length);\n\t }\n\t }, {\n\t key: 'insertBefore',\n\t value: function insertBefore(blot, ref) {\n\t var head = this.children.head;\n\t _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertBefore', this).call(this, blot, ref);\n\t if (head instanceof _break2.default) {\n\t head.remove();\n\t }\n\t this.cache = {};\n\t }\n\t }, {\n\t key: 'length',\n\t value: function length() {\n\t if (this.cache.length == null) {\n\t this.cache.length = _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'length', this).call(this) + NEWLINE_LENGTH;\n\t }\n\t return this.cache.length;\n\t }\n\t }, {\n\t key: 'moveChildren',\n\t value: function moveChildren(target, ref) {\n\t _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'moveChildren', this).call(this, target, ref);\n\t this.cache = {};\n\t }\n\t }, {\n\t key: 'optimize',\n\t value: function optimize() {\n\t _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'optimize', this).call(this);\n\t this.cache = {};\n\t }\n\t }, {\n\t key: 'path',\n\t value: function path(index) {\n\t return _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'path', this).call(this, index, true);\n\t }\n\t }, {\n\t key: 'removeChild',\n\t value: function removeChild(child) {\n\t _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'removeChild', this).call(this, child);\n\t this.cache = {};\n\t }\n\t }, {\n\t key: 'split',\n\t value: function split(index) {\n\t var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n\t if (force && (index === 0 || index >= this.length() - NEWLINE_LENGTH)) {\n\t var clone = this.clone();\n\t if (index === 0) {\n\t this.parent.insertBefore(clone, this);\n\t return this;\n\t } else {\n\t this.parent.insertBefore(clone, this.next);\n\t return clone;\n\t }\n\t } else {\n\t var next = _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'split', this).call(this, index, force);\n\t this.cache = {};\n\t return next;\n\t }\n\t }\n\t }]);\n\n\t return Block;\n\t}(_parchment2.default.Block);\n\n\tBlock.blotName = 'block';\n\tBlock.tagName = 'P';\n\tBlock.defaultChild = 'break';\n\tBlock.allowedChildren = [_inline2.default, _embed2.default, _text2.default];\n\n\tfunction bubbleFormats(blot) {\n\t var formats = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t if (blot == null) return formats;\n\t if (typeof blot.formats === 'function') {\n\t formats = (0, _extend2.default)(formats, blot.formats());\n\t }\n\t if (blot.parent == null || blot.parent.blotName == 'scroll' || blot.parent.statics.scope !== blot.statics.scope) {\n\t return formats;\n\t }\n\t return bubbleFormats(blot.parent, formats);\n\t}\n\n\texports.bubbleFormats = bubbleFormats;\n\texports.BlockEmbed = BlockEmbed;\n\texports.default = Block;\n\n/***/ },\n/* 30 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _embed = __webpack_require__(31);\n\n\tvar _embed2 = _interopRequireDefault(_embed);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Break = function (_Embed) {\n\t _inherits(Break, _Embed);\n\n\t function Break() {\n\t _classCallCheck(this, Break);\n\n\t return _possibleConstructorReturn(this, (Break.__proto__ || Object.getPrototypeOf(Break)).apply(this, arguments));\n\t }\n\n\t _createClass(Break, [{\n\t key: 'insertInto',\n\t value: function insertInto(parent, ref) {\n\t if (parent.children.length === 0) {\n\t _get(Break.prototype.__proto__ || Object.getPrototypeOf(Break.prototype), 'insertInto', this).call(this, parent, ref);\n\t } else {\n\t this.remove();\n\t }\n\t }\n\t }, {\n\t key: 'length',\n\t value: function length() {\n\t return 0;\n\t }\n\t }, {\n\t key: 'value',\n\t value: function value() {\n\t return '';\n\t }\n\t }], [{\n\t key: 'value',\n\t value: function value() {\n\t return undefined;\n\t }\n\t }]);\n\n\t return Break;\n\t}(_embed2.default);\n\n\tBreak.blotName = 'break';\n\tBreak.tagName = 'BR';\n\n\texports.default = Break;\n\n/***/ },\n/* 31 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Embed = function (_Parchment$Embed) {\n\t _inherits(Embed, _Parchment$Embed);\n\n\t function Embed() {\n\t _classCallCheck(this, Embed);\n\n\t return _possibleConstructorReturn(this, (Embed.__proto__ || Object.getPrototypeOf(Embed)).apply(this, arguments));\n\t }\n\n\t return Embed;\n\t}(_parchment2.default.Embed);\n\n\texports.default = Embed;\n\n/***/ },\n/* 32 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _embed = __webpack_require__(31);\n\n\tvar _embed2 = _interopRequireDefault(_embed);\n\n\tvar _text = __webpack_require__(33);\n\n\tvar _text2 = _interopRequireDefault(_text);\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Inline = function (_Parchment$Inline) {\n\t _inherits(Inline, _Parchment$Inline);\n\n\t function Inline() {\n\t _classCallCheck(this, Inline);\n\n\t return _possibleConstructorReturn(this, (Inline.__proto__ || Object.getPrototypeOf(Inline)).apply(this, arguments));\n\t }\n\n\t _createClass(Inline, [{\n\t key: 'formatAt',\n\t value: function formatAt(index, length, name, value) {\n\t if (Inline.compare(this.statics.blotName, name) < 0 && _parchment2.default.query(name, _parchment2.default.Scope.BLOT)) {\n\t var blot = this.isolate(index, length);\n\t if (value) {\n\t blot.wrap(name, value);\n\t }\n\t } else {\n\t _get(Inline.prototype.__proto__ || Object.getPrototypeOf(Inline.prototype), 'formatAt', this).call(this, index, length, name, value);\n\t }\n\t }\n\t }, {\n\t key: 'optimize',\n\t value: function optimize() {\n\t _get(Inline.prototype.__proto__ || Object.getPrototypeOf(Inline.prototype), 'optimize', this).call(this);\n\t if (this.parent instanceof Inline && Inline.compare(this.statics.blotName, this.parent.statics.blotName) > 0) {\n\t var parent = this.parent.isolate(this.offset(), this.length());\n\t this.moveChildren(parent);\n\t parent.wrap(this);\n\t }\n\t }\n\t }], [{\n\t key: 'compare',\n\t value: function compare(self, other) {\n\t var selfIndex = Inline.order.indexOf(self);\n\t var otherIndex = Inline.order.indexOf(other);\n\t if (selfIndex >= 0 || otherIndex >= 0) {\n\t return selfIndex - otherIndex;\n\t } else if (self === other) {\n\t return 0;\n\t } else if (self < other) {\n\t return -1;\n\t } else {\n\t return 1;\n\t }\n\t }\n\t }]);\n\n\t return Inline;\n\t}(_parchment2.default.Inline);\n\n\tInline.allowedChildren = [Inline, _embed2.default, _text2.default];\n\t// Lower index means deeper in the DOM tree, since not found (-1) is for embeds\n\tInline.order = ['cursor', 'inline', // Must be lower\n\t'code', 'underline', 'strike', 'italic', 'bold', 'script', 'link' // Must be higher\n\t];\n\n\texports.default = Inline;\n\n/***/ },\n/* 33 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar TextBlot = function (_Parchment$Text) {\n\t _inherits(TextBlot, _Parchment$Text);\n\n\t function TextBlot() {\n\t _classCallCheck(this, TextBlot);\n\n\t return _possibleConstructorReturn(this, (TextBlot.__proto__ || Object.getPrototypeOf(TextBlot)).apply(this, arguments));\n\t }\n\n\t return TextBlot;\n\t}(_parchment2.default.Text);\n\n\texports.default = TextBlot;\n\n/***/ },\n/* 34 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _embed = __webpack_require__(31);\n\n\tvar _embed2 = _interopRequireDefault(_embed);\n\n\tvar _text = __webpack_require__(33);\n\n\tvar _text2 = _interopRequireDefault(_text);\n\n\tvar _emitter = __webpack_require__(35);\n\n\tvar _emitter2 = _interopRequireDefault(_emitter);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Cursor = function (_Embed) {\n\t _inherits(Cursor, _Embed);\n\n\t _createClass(Cursor, null, [{\n\t key: 'value',\n\t value: function value() {\n\t return undefined;\n\t }\n\t }]);\n\n\t function Cursor(domNode, selection) {\n\t _classCallCheck(this, Cursor);\n\n\t var _this = _possibleConstructorReturn(this, (Cursor.__proto__ || Object.getPrototypeOf(Cursor)).call(this, domNode));\n\n\t _this.selection = selection;\n\t _this.textNode = document.createTextNode(Cursor.CONTENTS);\n\t _this.domNode.appendChild(_this.textNode);\n\t _this._length = 0;\n\t return _this;\n\t }\n\n\t _createClass(Cursor, [{\n\t key: 'detach',\n\t value: function detach() {\n\t // super.detach() will also clear domNode.__blot\n\t if (this.parent != null) this.parent.removeChild(this);\n\t }\n\t }, {\n\t key: 'format',\n\t value: function format(name, value) {\n\t if (this._length !== 0) {\n\t return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'format', this).call(this, name, value);\n\t }\n\t var target = this,\n\t index = 0;\n\t while (target != null && target.statics.scope !== _parchment2.default.Scope.BLOCK_BLOT) {\n\t index += target.offset(target.parent);\n\t target = target.parent;\n\t }\n\t if (target != null) {\n\t this._length = Cursor.CONTENTS.length;\n\t target.optimize();\n\t target.formatAt(index, Cursor.CONTENTS.length, name, value);\n\t this._length = 0;\n\t }\n\t }\n\t }, {\n\t key: 'index',\n\t value: function index(node, offset) {\n\t if (node === this.textNode) return 0;\n\t return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'index', this).call(this, node, offset);\n\t }\n\t }, {\n\t key: 'length',\n\t value: function length() {\n\t return this._length;\n\t }\n\t }, {\n\t key: 'position',\n\t value: function position() {\n\t return [this.textNode, this.textNode.data.length];\n\t }\n\t }, {\n\t key: 'remove',\n\t value: function remove() {\n\t _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'remove', this).call(this);\n\t this.parent = null;\n\t }\n\t }, {\n\t key: 'restore',\n\t value: function restore() {\n\t var _this2 = this;\n\n\t if (this.selection.composing) return;\n\t if (this.parent == null) return;\n\t var textNode = this.textNode;\n\t var range = this.selection.getNativeRange();\n\t var restoreText = void 0,\n\t start = void 0,\n\t end = void 0;\n\t if (range != null && range.start.node === textNode && range.end.node === textNode) {\n\t var _ref = [textNode, range.start.offset, range.end.offset];\n\t restoreText = _ref[0];\n\t start = _ref[1];\n\t end = _ref[2];\n\t }\n\t // Link format will insert text outside of anchor tag\n\t while (this.domNode.lastChild != null && this.domNode.lastChild !== this.textNode) {\n\t this.domNode.parentNode.insertBefore(this.domNode.lastChild, this.domNode);\n\t }\n\t if (this.textNode.data !== Cursor.CONTENTS) {\n\t var text = this.textNode.data.split(Cursor.CONTENTS).join('');\n\t if (this.next instanceof _text2.default) {\n\t restoreText = this.next.domNode;\n\t this.next.insertAt(0, text);\n\t this.textNode.data = Cursor.CONTENTS;\n\t } else {\n\t this.textNode.data = text;\n\t this.parent.insertBefore(_parchment2.default.create(this.textNode), this);\n\t this.textNode = document.createTextNode(Cursor.CONTENTS);\n\t this.domNode.appendChild(this.textNode);\n\t }\n\t }\n\t this.remove();\n\t if (start == null) return;\n\t this.selection.emitter.once(_emitter2.default.events.SCROLL_OPTIMIZE, function () {\n\t var _map = [start, end].map(function (offset) {\n\t return Math.max(0, Math.min(restoreText.data.length, offset - 1));\n\t });\n\n\t var _map2 = _slicedToArray(_map, 2);\n\n\t start = _map2[0];\n\t end = _map2[1];\n\n\t _this2.selection.setNativeRange(restoreText, start, restoreText, end);\n\t });\n\t }\n\t }, {\n\t key: 'update',\n\t value: function update(mutations) {\n\t var _this3 = this;\n\n\t mutations.forEach(function (mutation) {\n\t if (mutation.type === 'characterData' && mutation.target === _this3.textNode) {\n\t _this3.restore();\n\t }\n\t });\n\t }\n\t }, {\n\t key: 'value',\n\t value: function value() {\n\t return '';\n\t }\n\t }]);\n\n\t return Cursor;\n\t}(_embed2.default);\n\n\tCursor.blotName = 'cursor';\n\tCursor.className = 'ql-cursor';\n\tCursor.tagName = 'span';\n\tCursor.CONTENTS = '\\uFEFF'; // Zero width no break space\n\n\n\texports.default = Cursor;\n\n/***/ },\n/* 35 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _eventemitter = __webpack_require__(36);\n\n\tvar _eventemitter2 = _interopRequireDefault(_eventemitter);\n\n\tvar _logger = __webpack_require__(37);\n\n\tvar _logger2 = _interopRequireDefault(_logger);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar debug = (0, _logger2.default)('quill:events');\n\n\tvar Emitter = function (_EventEmitter) {\n\t _inherits(Emitter, _EventEmitter);\n\n\t function Emitter() {\n\t _classCallCheck(this, Emitter);\n\n\t var _this = _possibleConstructorReturn(this, (Emitter.__proto__ || Object.getPrototypeOf(Emitter)).call(this));\n\n\t _this.on('error', debug.error);\n\t return _this;\n\t }\n\n\t _createClass(Emitter, [{\n\t key: 'emit',\n\t value: function emit() {\n\t debug.log.apply(debug, arguments);\n\t _get(Emitter.prototype.__proto__ || Object.getPrototypeOf(Emitter.prototype), 'emit', this).apply(this, arguments);\n\t }\n\t }]);\n\n\t return Emitter;\n\t}(_eventemitter2.default);\n\n\tEmitter.events = {\n\t EDITOR_CHANGE: 'editor-change',\n\t SCROLL_BEFORE_UPDATE: 'scroll-before-update',\n\t SCROLL_OPTIMIZE: 'scroll-optimize',\n\t SCROLL_UPDATE: 'scroll-update',\n\t SELECTION_CHANGE: 'selection-change',\n\t TEXT_CHANGE: 'text-change'\n\t};\n\tEmitter.sources = {\n\t API: 'api',\n\t SILENT: 'silent',\n\t USER: 'user'\n\t};\n\n\texports.default = Emitter;\n\n/***/ },\n/* 36 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tvar has = Object.prototype.hasOwnProperty\n\t , prefix = '~';\n\n\t/**\n\t * Constructor to create a storage for our `EE` objects.\n\t * An `Events` instance is a plain object whose properties are event names.\n\t *\n\t * @constructor\n\t * @api private\n\t */\n\tfunction Events() {}\n\n\t//\n\t// We try to not inherit from `Object.prototype`. In some engines creating an\n\t// instance in this way is faster than calling `Object.create(null)` directly.\n\t// If `Object.create(null)` is not supported we prefix the event names with a\n\t// character to make sure that the built-in object properties are not\n\t// overridden or used as an attack vector.\n\t//\n\tif (Object.create) {\n\t Events.prototype = Object.create(null);\n\n\t //\n\t // This hack is needed because the `__proto__` property is still inherited in\n\t // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n\t //\n\t if (!new Events().__proto__) prefix = false;\n\t}\n\n\t/**\n\t * Representation of a single event listener.\n\t *\n\t * @param {Function} fn The listener function.\n\t * @param {Mixed} context The context to invoke the listener with.\n\t * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n\t * @constructor\n\t * @api private\n\t */\n\tfunction EE(fn, context, once) {\n\t this.fn = fn;\n\t this.context = context;\n\t this.once = once || false;\n\t}\n\n\t/**\n\t * Minimal `EventEmitter` interface that is molded against the Node.js\n\t * `EventEmitter` interface.\n\t *\n\t * @constructor\n\t * @api public\n\t */\n\tfunction EventEmitter() {\n\t this._events = new Events();\n\t this._eventsCount = 0;\n\t}\n\n\t/**\n\t * Return an array listing the events for which the emitter has registered\n\t * listeners.\n\t *\n\t * @returns {Array}\n\t * @api public\n\t */\n\tEventEmitter.prototype.eventNames = function eventNames() {\n\t var names = []\n\t , events\n\t , name;\n\n\t if (this._eventsCount === 0) return names;\n\n\t for (name in (events = this._events)) {\n\t if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n\t }\n\n\t if (Object.getOwnPropertySymbols) {\n\t return names.concat(Object.getOwnPropertySymbols(events));\n\t }\n\n\t return names;\n\t};\n\n\t/**\n\t * Return the listeners registered for a given event.\n\t *\n\t * @param {String|Symbol} event The event name.\n\t * @param {Boolean} exists Only check if there are listeners.\n\t * @returns {Array|Boolean}\n\t * @api public\n\t */\n\tEventEmitter.prototype.listeners = function listeners(event, exists) {\n\t var evt = prefix ? prefix + event : event\n\t , available = this._events[evt];\n\n\t if (exists) return !!available;\n\t if (!available) return [];\n\t if (available.fn) return [available.fn];\n\n\t for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n\t ee[i] = available[i].fn;\n\t }\n\n\t return ee;\n\t};\n\n\t/**\n\t * Calls each of the listeners registered for a given event.\n\t *\n\t * @param {String|Symbol} event The event name.\n\t * @returns {Boolean} `true` if the event had listeners, else `false`.\n\t * @api public\n\t */\n\tEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n\t var evt = prefix ? prefix + event : event;\n\n\t if (!this._events[evt]) return false;\n\n\t var listeners = this._events[evt]\n\t , len = arguments.length\n\t , args\n\t , i;\n\n\t if (listeners.fn) {\n\t if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n\t switch (len) {\n\t case 1: return listeners.fn.call(listeners.context), true;\n\t case 2: return listeners.fn.call(listeners.context, a1), true;\n\t case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n\t case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n\t case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n\t case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n\t }\n\n\t for (i = 1, args = new Array(len -1); i < len; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\n\t listeners.fn.apply(listeners.context, args);\n\t } else {\n\t var length = listeners.length\n\t , j;\n\n\t for (i = 0; i < length; i++) {\n\t if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n\t switch (len) {\n\t case 1: listeners[i].fn.call(listeners[i].context); break;\n\t case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n\t case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n\t case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n\t default:\n\t if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n\t args[j - 1] = arguments[j];\n\t }\n\n\t listeners[i].fn.apply(listeners[i].context, args);\n\t }\n\t }\n\t }\n\n\t return true;\n\t};\n\n\t/**\n\t * Add a listener for a given event.\n\t *\n\t * @param {String|Symbol} event The event name.\n\t * @param {Function} fn The listener function.\n\t * @param {Mixed} [context=this] The context to invoke the listener with.\n\t * @returns {EventEmitter} `this`.\n\t * @api public\n\t */\n\tEventEmitter.prototype.on = function on(event, fn, context) {\n\t var listener = new EE(fn, context || this)\n\t , evt = prefix ? prefix + event : event;\n\n\t if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n\t else if (!this._events[evt].fn) this._events[evt].push(listener);\n\t else this._events[evt] = [this._events[evt], listener];\n\n\t return this;\n\t};\n\n\t/**\n\t * Add a one-time listener for a given event.\n\t *\n\t * @param {String|Symbol} event The event name.\n\t * @param {Function} fn The listener function.\n\t * @param {Mixed} [context=this] The context to invoke the listener with.\n\t * @returns {EventEmitter} `this`.\n\t * @api public\n\t */\n\tEventEmitter.prototype.once = function once(event, fn, context) {\n\t var listener = new EE(fn, context || this, true)\n\t , evt = prefix ? prefix + event : event;\n\n\t if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;\n\t else if (!this._events[evt].fn) this._events[evt].push(listener);\n\t else this._events[evt] = [this._events[evt], listener];\n\n\t return this;\n\t};\n\n\t/**\n\t * Remove the listeners of a given event.\n\t *\n\t * @param {String|Symbol} event The event name.\n\t * @param {Function} fn Only remove the listeners that match this function.\n\t * @param {Mixed} context Only remove the listeners that have this context.\n\t * @param {Boolean} once Only remove one-time listeners.\n\t * @returns {EventEmitter} `this`.\n\t * @api public\n\t */\n\tEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n\t var evt = prefix ? prefix + event : event;\n\n\t if (!this._events[evt]) return this;\n\t if (!fn) {\n\t if (--this._eventsCount === 0) this._events = new Events();\n\t else delete this._events[evt];\n\t return this;\n\t }\n\n\t var listeners = this._events[evt];\n\n\t if (listeners.fn) {\n\t if (\n\t listeners.fn === fn\n\t && (!once || listeners.once)\n\t && (!context || listeners.context === context)\n\t ) {\n\t if (--this._eventsCount === 0) this._events = new Events();\n\t else delete this._events[evt];\n\t }\n\t } else {\n\t for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n\t if (\n\t listeners[i].fn !== fn\n\t || (once && !listeners[i].once)\n\t || (context && listeners[i].context !== context)\n\t ) {\n\t events.push(listeners[i]);\n\t }\n\t }\n\n\t //\n\t // Reset the array, or remove it completely if we have no more listeners.\n\t //\n\t if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n\t else if (--this._eventsCount === 0) this._events = new Events();\n\t else delete this._events[evt];\n\t }\n\n\t return this;\n\t};\n\n\t/**\n\t * Remove all listeners, or those of the specified event.\n\t *\n\t * @param {String|Symbol} [event] The event name.\n\t * @returns {EventEmitter} `this`.\n\t * @api public\n\t */\n\tEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n\t var evt;\n\n\t if (event) {\n\t evt = prefix ? prefix + event : event;\n\t if (this._events[evt]) {\n\t if (--this._eventsCount === 0) this._events = new Events();\n\t else delete this._events[evt];\n\t }\n\t } else {\n\t this._events = new Events();\n\t this._eventsCount = 0;\n\t }\n\n\t return this;\n\t};\n\n\t//\n\t// Alias methods names because people roll like that.\n\t//\n\tEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\tEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n\t//\n\t// This function doesn't apply anymore.\n\t//\n\tEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n\t return this;\n\t};\n\n\t//\n\t// Expose the prefix.\n\t//\n\tEventEmitter.prefixed = prefix;\n\n\t//\n\t// Allow `EventEmitter` to be imported as module namespace.\n\t//\n\tEventEmitter.EventEmitter = EventEmitter;\n\n\t//\n\t// Expose the module.\n\t//\n\tif ('undefined' !== typeof module) {\n\t module.exports = EventEmitter;\n\t}\n\n\n/***/ },\n/* 37 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\tvar levels = ['error', 'warn', 'log', 'info'];\n\tvar level = 'warn';\n\n\tfunction debug(method) {\n\t if (levels.indexOf(method) <= levels.indexOf(level)) {\n\t for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t args[_key - 1] = arguments[_key];\n\t }\n\n\t console[method].apply(console, args); // eslint-disable-line no-console\n\t }\n\t}\n\n\tfunction namespace(ns) {\n\t return levels.reduce(function (logger, method) {\n\t logger[method] = debug.bind(console, method, ns);\n\t return logger;\n\t }, {});\n\t}\n\n\tdebug.level = namespace.level = function (newLevel) {\n\t level = newLevel;\n\t};\n\n\texports.default = namespace;\n\n/***/ },\n/* 38 */\n/***/ function(module, exports) {\n\n\tvar clone = (function() {\n\t'use strict';\n\n\tvar nativeMap;\n\ttry {\n\t nativeMap = Map;\n\t} catch(_) {\n\t // maybe a reference error because no `Map`. Give it a dummy value that no\n\t // value will ever be an instanceof.\n\t nativeMap = function() {};\n\t}\n\n\tvar nativeSet;\n\ttry {\n\t nativeSet = Set;\n\t} catch(_) {\n\t nativeSet = function() {};\n\t}\n\n\tvar nativePromise;\n\ttry {\n\t nativePromise = Promise;\n\t} catch(_) {\n\t nativePromise = function() {};\n\t}\n\n\t/**\n\t * Clones (copies) an Object using deep copying.\n\t *\n\t * This function supports circular references by default, but if you are certain\n\t * there are no circular references in your object, you can save some CPU time\n\t * by calling clone(obj, false).\n\t *\n\t * Caution: if `circular` is false and `parent` contains circular references,\n\t * your program may enter an infinite loop and crash.\n\t *\n\t * @param `parent` - the object to be cloned\n\t * @param `circular` - set to true if the object to be cloned may contain\n\t * circular references. (optional - true by default)\n\t * @param `depth` - set to a number if the object is only to be cloned to\n\t * a particular depth. (optional - defaults to Infinity)\n\t * @param `prototype` - sets the prototype to be used when cloning an object.\n\t * (optional - defaults to parent prototype).\n\t * @param `includeNonEnumerable` - set to true if the non-enumerable properties\n\t * should be cloned as well. Non-enumerable properties on the prototype\n\t * chain will be ignored. (optional - false by default)\n\t*/\n\tfunction clone(parent, circular, depth, prototype, includeNonEnumerable) {\n\t if (typeof circular === 'object') {\n\t depth = circular.depth;\n\t prototype = circular.prototype;\n\t includeNonEnumerable = circular.includeNonEnumerable;\n\t circular = circular.circular;\n\t }\n\t // maintain two arrays for circular references, where corresponding parents\n\t // and children have the same index\n\t var allParents = [];\n\t var allChildren = [];\n\n\t var useBuffer = typeof Buffer != 'undefined';\n\n\t if (typeof circular == 'undefined')\n\t circular = true;\n\n\t if (typeof depth == 'undefined')\n\t depth = Infinity;\n\n\t // recurse this function so we don't reset allParents and allChildren\n\t function _clone(parent, depth) {\n\t // cloning null always returns null\n\t if (parent === null)\n\t return null;\n\n\t if (depth === 0)\n\t return parent;\n\n\t var child;\n\t var proto;\n\t if (typeof parent != 'object') {\n\t return parent;\n\t }\n\n\t if (parent instanceof nativeMap) {\n\t child = new nativeMap();\n\t } else if (parent instanceof nativeSet) {\n\t child = new nativeSet();\n\t } else if (parent instanceof nativePromise) {\n\t child = new nativePromise(function (resolve, reject) {\n\t parent.then(function(value) {\n\t resolve(_clone(value, depth - 1));\n\t }, function(err) {\n\t reject(_clone(err, depth - 1));\n\t });\n\t });\n\t } else if (clone.__isArray(parent)) {\n\t child = [];\n\t } else if (clone.__isRegExp(parent)) {\n\t child = new RegExp(parent.source, __getRegExpFlags(parent));\n\t if (parent.lastIndex) child.lastIndex = parent.lastIndex;\n\t } else if (clone.__isDate(parent)) {\n\t child = new Date(parent.getTime());\n\t } else if (useBuffer && Buffer.isBuffer(parent)) {\n\t child = new Buffer(parent.length);\n\t parent.copy(child);\n\t return child;\n\t } else if (parent instanceof Error) {\n\t child = Object.create(parent);\n\t } else {\n\t if (typeof prototype == 'undefined') {\n\t proto = Object.getPrototypeOf(parent);\n\t child = Object.create(proto);\n\t }\n\t else {\n\t child = Object.create(prototype);\n\t proto = prototype;\n\t }\n\t }\n\n\t if (circular) {\n\t var index = allParents.indexOf(parent);\n\n\t if (index != -1) {\n\t return allChildren[index];\n\t }\n\t allParents.push(parent);\n\t allChildren.push(child);\n\t }\n\n\t if (parent instanceof nativeMap) {\n\t var keyIterator = parent.keys();\n\t while(true) {\n\t var next = keyIterator.next();\n\t if (next.done) {\n\t break;\n\t }\n\t var keyChild = _clone(next.value, depth - 1);\n\t var valueChild = _clone(parent.get(next.value), depth - 1);\n\t child.set(keyChild, valueChild);\n\t }\n\t }\n\t if (parent instanceof nativeSet) {\n\t var iterator = parent.keys();\n\t while(true) {\n\t var next = iterator.next();\n\t if (next.done) {\n\t break;\n\t }\n\t var entryChild = _clone(next.value, depth - 1);\n\t child.add(entryChild);\n\t }\n\t }\n\n\t for (var i in parent) {\n\t var attrs;\n\t if (proto) {\n\t attrs = Object.getOwnPropertyDescriptor(proto, i);\n\t }\n\n\t if (attrs && attrs.set == null) {\n\t continue;\n\t }\n\t child[i] = _clone(parent[i], depth - 1);\n\t }\n\n\t if (Object.getOwnPropertySymbols) {\n\t var symbols = Object.getOwnPropertySymbols(parent);\n\t for (var i = 0; i < symbols.length; i++) {\n\t // Don't need to worry about cloning a symbol because it is a primitive,\n\t // like a number or string.\n\t var symbol = symbols[i];\n\t var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);\n\t if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {\n\t continue;\n\t }\n\t child[symbol] = _clone(parent[symbol], depth - 1);\n\t if (!descriptor.enumerable) {\n\t Object.defineProperty(child, symbol, {\n\t enumerable: false\n\t });\n\t }\n\t }\n\t }\n\n\t if (includeNonEnumerable) {\n\t var allPropertyNames = Object.getOwnPropertyNames(parent);\n\t for (var i = 0; i < allPropertyNames.length; i++) {\n\t var propertyName = allPropertyNames[i];\n\t var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);\n\t if (descriptor && descriptor.enumerable) {\n\t continue;\n\t }\n\t child[propertyName] = _clone(parent[propertyName], depth - 1);\n\t Object.defineProperty(child, propertyName, {\n\t enumerable: false\n\t });\n\t }\n\t }\n\n\t return child;\n\t }\n\n\t return _clone(parent, depth);\n\t}\n\n\t/**\n\t * Simple flat clone using prototype, accepts only objects, usefull for property\n\t * override on FLAT configuration object (no nested props).\n\t *\n\t * USE WITH CAUTION! This may not behave as you wish if you do not know how this\n\t * works.\n\t */\n\tclone.clonePrototype = function clonePrototype(parent) {\n\t if (parent === null)\n\t return null;\n\n\t var c = function () {};\n\t c.prototype = parent;\n\t return new c();\n\t};\n\n\t// private utility functions\n\n\tfunction __objToStr(o) {\n\t return Object.prototype.toString.call(o);\n\t}\n\tclone.__objToStr = __objToStr;\n\n\tfunction __isDate(o) {\n\t return typeof o === 'object' && __objToStr(o) === '[object Date]';\n\t}\n\tclone.__isDate = __isDate;\n\n\tfunction __isArray(o) {\n\t return typeof o === 'object' && __objToStr(o) === '[object Array]';\n\t}\n\tclone.__isArray = __isArray;\n\n\tfunction __isRegExp(o) {\n\t return typeof o === 'object' && __objToStr(o) === '[object RegExp]';\n\t}\n\tclone.__isRegExp = __isRegExp;\n\n\tfunction __getRegExpFlags(re) {\n\t var flags = '';\n\t if (re.global) flags += 'g';\n\t if (re.ignoreCase) flags += 'i';\n\t if (re.multiline) flags += 'm';\n\t return flags;\n\t}\n\tclone.__getRegExpFlags = __getRegExpFlags;\n\n\treturn clone;\n\t})();\n\n\tif (typeof module === 'object' && module.exports) {\n\t module.exports = clone;\n\t}\n\n\n/***/ },\n/* 39 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tvar Module = function Module(quill) {\n\t var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t _classCallCheck(this, Module);\n\n\t this.quill = quill;\n\t this.options = options;\n\t};\n\n\tModule.DEFAULTS = {};\n\n\texports.default = Module;\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = exports.Range = undefined;\n\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _clone = __webpack_require__(38);\n\n\tvar _clone2 = _interopRequireDefault(_clone);\n\n\tvar _deepEqual = __webpack_require__(22);\n\n\tvar _deepEqual2 = _interopRequireDefault(_deepEqual);\n\n\tvar _emitter3 = __webpack_require__(35);\n\n\tvar _emitter4 = _interopRequireDefault(_emitter3);\n\n\tvar _logger = __webpack_require__(37);\n\n\tvar _logger2 = _interopRequireDefault(_logger);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tvar debug = (0, _logger2.default)('quill:selection');\n\n\tvar Range = function Range(index) {\n\t var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n\t _classCallCheck(this, Range);\n\n\t this.index = index;\n\t this.length = length;\n\t};\n\n\tvar Selection = function () {\n\t function Selection(scroll, emitter) {\n\t var _this = this;\n\n\t _classCallCheck(this, Selection);\n\n\t this.emitter = emitter;\n\t this.scroll = scroll;\n\t this.composing = false;\n\t this.root = this.scroll.domNode;\n\t this.root.addEventListener('compositionstart', function () {\n\t _this.composing = true;\n\t });\n\t this.root.addEventListener('compositionend', function () {\n\t _this.composing = false;\n\t });\n\t this.cursor = _parchment2.default.create('cursor', this);\n\t // savedRange is last non-null range\n\t this.lastRange = this.savedRange = new Range(0, 0);\n\t ['keyup', 'mouseup', 'mouseleave', 'touchend', 'touchleave', 'focus', 'blur'].forEach(function (eventName) {\n\t _this.root.addEventListener(eventName, function () {\n\t // When range used to be a selection and user click within the selection,\n\t // the range now being a cursor has not updated yet without setTimeout\n\t setTimeout(_this.update.bind(_this, _emitter4.default.sources.USER), 100);\n\t });\n\t });\n\t this.emitter.on(_emitter4.default.events.EDITOR_CHANGE, function (type, delta) {\n\t if (type === _emitter4.default.events.TEXT_CHANGE && delta.length() > 0) {\n\t _this.update(_emitter4.default.sources.SILENT);\n\t }\n\t });\n\t this.emitter.on(_emitter4.default.events.SCROLL_BEFORE_UPDATE, function () {\n\t var native = _this.getNativeRange();\n\t if (native == null) return;\n\t if (native.start.node === _this.cursor.textNode) return; // cursor.restore() will handle\n\t // TODO unclear if this has negative side effects\n\t _this.emitter.once(_emitter4.default.events.SCROLL_UPDATE, function () {\n\t try {\n\t _this.setNativeRange(native.start.node, native.start.offset, native.end.node, native.end.offset);\n\t } catch (ignored) {}\n\t });\n\t });\n\t this.update(_emitter4.default.sources.SILENT);\n\t }\n\n\t _createClass(Selection, [{\n\t key: 'focus',\n\t value: function focus() {\n\t if (this.hasFocus()) return;\n\t this.root.focus();\n\t this.setRange(this.savedRange);\n\t }\n\t }, {\n\t key: 'format',\n\t value: function format(_format, value) {\n\t if (this.scroll.whitelist != null && !this.scroll.whitelist[_format]) return;\n\t this.scroll.update();\n\t var nativeRange = this.getNativeRange();\n\t if (nativeRange == null || !nativeRange.native.collapsed || _parchment2.default.query(_format, _parchment2.default.Scope.BLOCK)) return;\n\t if (nativeRange.start.node !== this.cursor.textNode) {\n\t var blot = _parchment2.default.find(nativeRange.start.node, false);\n\t if (blot == null) return;\n\t // TODO Give blot ability to not split\n\t if (blot instanceof _parchment2.default.Leaf) {\n\t var after = blot.split(nativeRange.start.offset);\n\t blot.parent.insertBefore(this.cursor, after);\n\t } else {\n\t blot.insertBefore(this.cursor, nativeRange.start.node); // Should never happen\n\t }\n\t this.cursor.attach();\n\t }\n\t this.cursor.format(_format, value);\n\t this.scroll.optimize();\n\t this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length);\n\t this.update();\n\t }\n\t }, {\n\t key: 'getBounds',\n\t value: function getBounds(index) {\n\t var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n\t var scrollLength = this.scroll.length();\n\t index = Math.min(index, scrollLength - 1);\n\t length = Math.min(index + length, scrollLength - 1) - index;\n\t var bounds = void 0,\n\t node = void 0,\n\t _scroll$leaf = this.scroll.leaf(index),\n\t _scroll$leaf2 = _slicedToArray(_scroll$leaf, 2),\n\t leaf = _scroll$leaf2[0],\n\t offset = _scroll$leaf2[1];\n\t if (leaf == null) return null;\n\n\t var _leaf$position = leaf.position(offset, true);\n\n\t var _leaf$position2 = _slicedToArray(_leaf$position, 2);\n\n\t node = _leaf$position2[0];\n\t offset = _leaf$position2[1];\n\n\t var range = document.createRange();\n\t if (length > 0) {\n\t range.setStart(node, offset);\n\n\t var _scroll$leaf3 = this.scroll.leaf(index + length);\n\n\t var _scroll$leaf4 = _slicedToArray(_scroll$leaf3, 2);\n\n\t leaf = _scroll$leaf4[0];\n\t offset = _scroll$leaf4[1];\n\n\t if (leaf == null) return null;\n\n\t var _leaf$position3 = leaf.position(offset, true);\n\n\t var _leaf$position4 = _slicedToArray(_leaf$position3, 2);\n\n\t node = _leaf$position4[0];\n\t offset = _leaf$position4[1];\n\n\t range.setEnd(node, offset);\n\t bounds = range.getBoundingClientRect();\n\t } else {\n\t var side = 'left';\n\t var rect = void 0;\n\t if (node instanceof Text) {\n\t if (offset < node.data.length) {\n\t range.setStart(node, offset);\n\t range.setEnd(node, offset + 1);\n\t } else {\n\t range.setStart(node, offset - 1);\n\t range.setEnd(node, offset);\n\t side = 'right';\n\t }\n\t rect = range.getBoundingClientRect();\n\t } else {\n\t rect = leaf.domNode.getBoundingClientRect();\n\t if (offset > 0) side = 'right';\n\t }\n\t bounds = {\n\t height: rect.height,\n\t left: rect[side],\n\t width: 0,\n\t top: rect.top\n\t };\n\t }\n\t var containerBounds = this.root.parentNode.getBoundingClientRect();\n\t return {\n\t left: bounds.left - containerBounds.left,\n\t right: bounds.left + bounds.width - containerBounds.left,\n\t top: bounds.top - containerBounds.top,\n\t bottom: bounds.top + bounds.height - containerBounds.top,\n\t height: bounds.height,\n\t width: bounds.width\n\t };\n\t }\n\t }, {\n\t key: 'getNativeRange',\n\t value: function getNativeRange() {\n\t var selection = document.getSelection();\n\t if (selection == null || selection.rangeCount <= 0) return null;\n\t var nativeRange = selection.getRangeAt(0);\n\t if (nativeRange == null) return null;\n\t if (!contains(this.root, nativeRange.startContainer) || !nativeRange.collapsed && !contains(this.root, nativeRange.endContainer)) {\n\t return null;\n\t }\n\t var range = {\n\t start: { node: nativeRange.startContainer, offset: nativeRange.startOffset },\n\t end: { node: nativeRange.endContainer, offset: nativeRange.endOffset },\n\t native: nativeRange\n\t };\n\t [range.start, range.end].forEach(function (position) {\n\t var node = position.node,\n\t offset = position.offset;\n\t while (!(node instanceof Text) && node.childNodes.length > 0) {\n\t if (node.childNodes.length > offset) {\n\t node = node.childNodes[offset];\n\t offset = 0;\n\t } else if (node.childNodes.length === offset) {\n\t node = node.lastChild;\n\t offset = node instanceof Text ? node.data.length : node.childNodes.length + 1;\n\t } else {\n\t break;\n\t }\n\t }\n\t position.node = node, position.offset = offset;\n\t });\n\t debug.info('getNativeRange', range);\n\t return range;\n\t }\n\t }, {\n\t key: 'getRange',\n\t value: function getRange() {\n\t var _this2 = this;\n\n\t var range = this.getNativeRange();\n\t if (range == null) return [null, null];\n\t var positions = [[range.start.node, range.start.offset]];\n\t if (!range.native.collapsed) {\n\t positions.push([range.end.node, range.end.offset]);\n\t }\n\t var indexes = positions.map(function (position) {\n\t var _position = _slicedToArray(position, 2),\n\t node = _position[0],\n\t offset = _position[1];\n\n\t var blot = _parchment2.default.find(node, true);\n\t var index = blot.offset(_this2.scroll);\n\t if (offset === 0) {\n\t return index;\n\t } else if (blot instanceof _parchment2.default.Container) {\n\t return index + blot.length();\n\t } else {\n\t return index + blot.index(node, offset);\n\t }\n\t });\n\t var start = Math.min.apply(Math, _toConsumableArray(indexes)),\n\t end = Math.max.apply(Math, _toConsumableArray(indexes));\n\t end = Math.min(end, this.scroll.length() - 1);\n\t return [new Range(start, end - start), range];\n\t }\n\t }, {\n\t key: 'hasFocus',\n\t value: function hasFocus() {\n\t return document.activeElement === this.root;\n\t }\n\t }, {\n\t key: 'scrollIntoView',\n\t value: function scrollIntoView() {\n\t var range = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.lastRange;\n\n\t if (range == null) return;\n\t var bounds = this.getBounds(range.index, range.length);\n\t if (bounds == null) return;\n\t if (this.root.offsetHeight < bounds.bottom) {\n\t var _scroll$line = this.scroll.line(Math.min(range.index + range.length, this.scroll.length() - 1)),\n\t _scroll$line2 = _slicedToArray(_scroll$line, 1),\n\t line = _scroll$line2[0];\n\n\t this.root.scrollTop = line.domNode.offsetTop + line.domNode.offsetHeight - this.root.offsetHeight;\n\t } else if (bounds.top < 0) {\n\t var _scroll$line3 = this.scroll.line(Math.min(range.index, this.scroll.length() - 1)),\n\t _scroll$line4 = _slicedToArray(_scroll$line3, 1),\n\t _line = _scroll$line4[0];\n\n\t this.root.scrollTop = _line.domNode.offsetTop;\n\t }\n\t }\n\t }, {\n\t key: 'setNativeRange',\n\t value: function setNativeRange(startNode, startOffset) {\n\t var endNode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : startNode;\n\t var endOffset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : startOffset;\n\t var force = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n\t debug.info('setNativeRange', startNode, startOffset, endNode, endOffset);\n\t if (startNode != null && (this.root.parentNode == null || startNode.parentNode == null || endNode.parentNode == null)) {\n\t return;\n\t }\n\t var selection = document.getSelection();\n\t if (selection == null) return;\n\t if (startNode != null) {\n\t if (!this.hasFocus()) this.root.focus();\n\t var native = (this.getNativeRange() || {}).native;\n\t if (native == null || force || startNode !== native.startContainer || startOffset !== native.startOffset || endNode !== native.endContainer || endOffset !== native.endOffset) {\n\t var range = document.createRange();\n\t range.setStart(startNode, startOffset);\n\t range.setEnd(endNode, endOffset);\n\t selection.removeAllRanges();\n\t selection.addRange(range);\n\t }\n\t } else {\n\t selection.removeAllRanges();\n\t this.root.blur();\n\t document.body.focus(); // root.blur() not enough on IE11+Travis+SauceLabs (but not local VMs)\n\t }\n\t }\n\t }, {\n\t key: 'setRange',\n\t value: function setRange(range) {\n\t var _this3 = this;\n\n\t var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\t var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _emitter4.default.sources.API;\n\n\t if (typeof force === 'string') {\n\t source = force;\n\t force = false;\n\t }\n\t debug.info('setRange', range);\n\t if (range != null) {\n\t (function () {\n\t var indexes = range.collapsed ? [range.index] : [range.index, range.index + range.length];\n\t var args = [];\n\t var scrollLength = _this3.scroll.length();\n\t indexes.forEach(function (index, i) {\n\t index = Math.min(scrollLength - 1, index);\n\t var node = void 0,\n\t _scroll$leaf5 = _this3.scroll.leaf(index),\n\t _scroll$leaf6 = _slicedToArray(_scroll$leaf5, 2),\n\t leaf = _scroll$leaf6[0],\n\t offset = _scroll$leaf6[1];\n\t var _leaf$position5 = leaf.position(offset, i !== 0);\n\n\t var _leaf$position6 = _slicedToArray(_leaf$position5, 2);\n\n\t node = _leaf$position6[0];\n\t offset = _leaf$position6[1];\n\n\t args.push(node, offset);\n\t });\n\t if (args.length < 2) {\n\t args = args.concat(args);\n\t }\n\t _this3.setNativeRange.apply(_this3, _toConsumableArray(args).concat([force]));\n\t })();\n\t } else {\n\t this.setNativeRange(null);\n\t }\n\t this.update(source);\n\t }\n\t }, {\n\t key: 'update',\n\t value: function update() {\n\t var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _emitter4.default.sources.USER;\n\n\t var nativeRange = void 0,\n\t oldRange = this.lastRange;\n\n\t var _getRange = this.getRange();\n\n\t var _getRange2 = _slicedToArray(_getRange, 2);\n\n\t this.lastRange = _getRange2[0];\n\t nativeRange = _getRange2[1];\n\n\t if (this.lastRange != null) {\n\t this.savedRange = this.lastRange;\n\t }\n\t if (!(0, _deepEqual2.default)(oldRange, this.lastRange)) {\n\t var _emitter;\n\n\t if (!this.composing && nativeRange != null && nativeRange.native.collapsed && nativeRange.start.node !== this.cursor.textNode) {\n\t this.cursor.restore();\n\t }\n\t var args = [_emitter4.default.events.SELECTION_CHANGE, (0, _clone2.default)(this.lastRange), (0, _clone2.default)(oldRange), source];\n\t (_emitter = this.emitter).emit.apply(_emitter, [_emitter4.default.events.EDITOR_CHANGE].concat(args));\n\t if (source !== _emitter4.default.sources.SILENT) {\n\t var _emitter2;\n\n\t (_emitter2 = this.emitter).emit.apply(_emitter2, args);\n\t }\n\t }\n\t }\n\t }]);\n\n\t return Selection;\n\t}();\n\n\tfunction contains(parent, descendant) {\n\t try {\n\t // Firefox inserts inaccessible nodes around video elements\n\t descendant.parentNode;\n\t } catch (e) {\n\t return false;\n\t }\n\t // IE11 has bug with Text nodes\n\t // https://connect.microsoft.com/IE/feedback/details/780874/node-contains-is-incorrect\n\t if (descendant instanceof Text) {\n\t descendant = descendant.parentNode;\n\t }\n\t return parent.contains(descendant);\n\t}\n\n\texports.Range = Range;\n\texports.default = Selection;\n\n/***/ },\n/* 41 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tvar Theme = function () {\n\t function Theme(quill, options) {\n\t _classCallCheck(this, Theme);\n\n\t this.quill = quill;\n\t this.options = options;\n\t this.modules = {};\n\t }\n\n\t _createClass(Theme, [{\n\t key: 'init',\n\t value: function init() {\n\t var _this = this;\n\n\t Object.keys(this.options.modules).forEach(function (name) {\n\t if (_this.modules[name] == null) {\n\t _this.addModule(name);\n\t }\n\t });\n\t }\n\t }, {\n\t key: 'addModule',\n\t value: function addModule(name) {\n\t var moduleClass = this.quill.constructor.import('modules/' + name);\n\t this.modules[name] = new moduleClass(this.quill, this.options.modules[name] || {});\n\t return this.modules[name];\n\t }\n\t }]);\n\n\t return Theme;\n\t}();\n\n\tTheme.DEFAULTS = {\n\t modules: {}\n\t};\n\tTheme.themes = {\n\t 'default': Theme\n\t};\n\n\texports.default = Theme;\n\n/***/ },\n/* 42 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _block = __webpack_require__(29);\n\n\tvar _block2 = _interopRequireDefault(_block);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Container = function (_Parchment$Container) {\n\t _inherits(Container, _Parchment$Container);\n\n\t function Container() {\n\t _classCallCheck(this, Container);\n\n\t return _possibleConstructorReturn(this, (Container.__proto__ || Object.getPrototypeOf(Container)).apply(this, arguments));\n\t }\n\n\t return Container;\n\t}(_parchment2.default.Container);\n\n\tContainer.allowedChildren = [_block2.default, _block.BlockEmbed, Container];\n\n\texports.default = Container;\n\n/***/ },\n/* 43 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _emitter = __webpack_require__(35);\n\n\tvar _emitter2 = _interopRequireDefault(_emitter);\n\n\tvar _block = __webpack_require__(29);\n\n\tvar _block2 = _interopRequireDefault(_block);\n\n\tvar _break = __webpack_require__(30);\n\n\tvar _break2 = _interopRequireDefault(_break);\n\n\tvar _container = __webpack_require__(42);\n\n\tvar _container2 = _interopRequireDefault(_container);\n\n\tvar _code = __webpack_require__(28);\n\n\tvar _code2 = _interopRequireDefault(_code);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tfunction isLine(blot) {\n\t return blot instanceof _block2.default || blot instanceof _block.BlockEmbed;\n\t}\n\n\tvar Scroll = function (_Parchment$Scroll) {\n\t _inherits(Scroll, _Parchment$Scroll);\n\n\t function Scroll(domNode, config) {\n\t _classCallCheck(this, Scroll);\n\n\t var _this = _possibleConstructorReturn(this, (Scroll.__proto__ || Object.getPrototypeOf(Scroll)).call(this, domNode));\n\n\t _this.emitter = config.emitter;\n\t if (Array.isArray(config.whitelist)) {\n\t _this.whitelist = config.whitelist.reduce(function (whitelist, format) {\n\t whitelist[format] = true;\n\t return whitelist;\n\t }, {});\n\t }\n\t _this.optimize();\n\t _this.enable();\n\t return _this;\n\t }\n\n\t _createClass(Scroll, [{\n\t key: 'deleteAt',\n\t value: function deleteAt(index, length) {\n\t var _line = this.line(index),\n\t _line2 = _slicedToArray(_line, 2),\n\t first = _line2[0],\n\t offset = _line2[1];\n\n\t var _line3 = this.line(index + length),\n\t _line4 = _slicedToArray(_line3, 1),\n\t last = _line4[0];\n\n\t _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'deleteAt', this).call(this, index, length);\n\t if (last != null && first !== last && offset > 0 && !(first instanceof _block.BlockEmbed) && !(last instanceof _block.BlockEmbed)) {\n\t if (last instanceof _code2.default) {\n\t last.deleteAt(last.length() - 1, 1);\n\t }\n\t var ref = last.children.head instanceof _break2.default ? null : last.children.head;\n\t first.moveChildren(last, ref);\n\t first.remove();\n\t }\n\t this.optimize();\n\t }\n\t }, {\n\t key: 'enable',\n\t value: function enable() {\n\t var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n\t this.domNode.setAttribute('contenteditable', enabled);\n\t }\n\t }, {\n\t key: 'formatAt',\n\t value: function formatAt(index, length, format, value) {\n\t if (this.whitelist != null && !this.whitelist[format]) return;\n\t _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'formatAt', this).call(this, index, length, format, value);\n\t this.optimize();\n\t }\n\t }, {\n\t key: 'insertAt',\n\t value: function insertAt(index, value, def) {\n\t if (def != null && this.whitelist != null && !this.whitelist[value]) return;\n\t if (index >= this.length()) {\n\t if (def == null || _parchment2.default.query(value, _parchment2.default.Scope.BLOCK) == null) {\n\t var blot = _parchment2.default.create(this.statics.defaultChild);\n\t this.appendChild(blot);\n\t if (def == null && value.endsWith('\\n')) {\n\t value = value.slice(0, -1);\n\t }\n\t blot.insertAt(0, value, def);\n\t } else {\n\t var embed = _parchment2.default.create(value, def);\n\t this.appendChild(embed);\n\t }\n\t } else {\n\t _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'insertAt', this).call(this, index, value, def);\n\t }\n\t this.optimize();\n\t }\n\t }, {\n\t key: 'insertBefore',\n\t value: function insertBefore(blot, ref) {\n\t if (blot.statics.scope === _parchment2.default.Scope.INLINE_BLOT) {\n\t var wrapper = _parchment2.default.create(this.statics.defaultChild);\n\t wrapper.appendChild(blot);\n\t blot = wrapper;\n\t }\n\t _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'insertBefore', this).call(this, blot, ref);\n\t }\n\t }, {\n\t key: 'leaf',\n\t value: function leaf(index) {\n\t return this.path(index).pop() || [null, -1];\n\t }\n\t }, {\n\t key: 'line',\n\t value: function line(index) {\n\t if (index === this.length()) {\n\t return this.line(index - 1);\n\t }\n\t return this.descendant(isLine, index);\n\t }\n\t }, {\n\t key: 'lines',\n\t value: function lines() {\n\t var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\t var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_VALUE;\n\n\t var getLines = function getLines(blot, index, length) {\n\t var lines = [],\n\t lengthLeft = length;\n\t blot.children.forEachAt(index, length, function (child, index, length) {\n\t if (isLine(child)) {\n\t lines.push(child);\n\t } else if (child instanceof _parchment2.default.Container) {\n\t lines = lines.concat(getLines(child, index, lengthLeft));\n\t }\n\t lengthLeft -= length;\n\t });\n\t return lines;\n\t };\n\t return getLines(this, index, length);\n\t }\n\t }, {\n\t key: 'optimize',\n\t value: function optimize() {\n\t var mutations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n\t if (this.batch === true) return;\n\t _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'optimize', this).call(this, mutations);\n\t if (mutations.length > 0) {\n\t this.emitter.emit(_emitter2.default.events.SCROLL_OPTIMIZE, mutations);\n\t }\n\t }\n\t }, {\n\t key: 'path',\n\t value: function path(index) {\n\t return _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'path', this).call(this, index).slice(1); // Exclude self\n\t }\n\t }, {\n\t key: 'update',\n\t value: function update(mutations) {\n\t if (this.batch === true) return;\n\t var source = _emitter2.default.sources.USER;\n\t if (typeof mutations === 'string') {\n\t source = mutations;\n\t }\n\t if (!Array.isArray(mutations)) {\n\t mutations = this.observer.takeRecords();\n\t }\n\t if (mutations.length > 0) {\n\t this.emitter.emit(_emitter2.default.events.SCROLL_BEFORE_UPDATE, source, mutations);\n\t }\n\t _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'update', this).call(this, mutations.concat([])); // pass copy\n\t if (mutations.length > 0) {\n\t this.emitter.emit(_emitter2.default.events.SCROLL_UPDATE, source, mutations);\n\t }\n\t }\n\t }]);\n\n\t return Scroll;\n\t}(_parchment2.default.Scroll);\n\n\tScroll.blotName = 'scroll';\n\tScroll.className = 'ql-editor';\n\tScroll.tagName = 'DIV';\n\tScroll.defaultChild = 'block';\n\tScroll.allowedChildren = [_block2.default, _block.BlockEmbed, _container2.default];\n\n\texports.default = Scroll;\n\n/***/ },\n/* 44 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.matchText = exports.matchSpacing = exports.matchNewline = exports.matchBlot = exports.matchAttributor = exports.default = undefined;\n\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _quillDelta = __webpack_require__(20);\n\n\tvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _quill = __webpack_require__(18);\n\n\tvar _quill2 = _interopRequireDefault(_quill);\n\n\tvar _logger = __webpack_require__(37);\n\n\tvar _logger2 = _interopRequireDefault(_logger);\n\n\tvar _module = __webpack_require__(39);\n\n\tvar _module2 = _interopRequireDefault(_module);\n\n\tvar _align = __webpack_require__(45);\n\n\tvar _background = __webpack_require__(46);\n\n\tvar _color = __webpack_require__(47);\n\n\tvar _direction = __webpack_require__(48);\n\n\tvar _font = __webpack_require__(49);\n\n\tvar _size = __webpack_require__(50);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar debug = (0, _logger2.default)('quill:clipboard');\n\n\tvar DOM_KEY = '__ql-matcher';\n\n\tvar CLIPBOARD_CONFIG = [[Node.TEXT_NODE, matchText], ['br', matchBreak], [Node.ELEMENT_NODE, matchNewline], [Node.ELEMENT_NODE, matchBlot], [Node.ELEMENT_NODE, matchSpacing], [Node.ELEMENT_NODE, matchAttributor], [Node.ELEMENT_NODE, matchStyles], ['b', matchAlias.bind(matchAlias, 'bold')], ['i', matchAlias.bind(matchAlias, 'italic')], ['style', matchIgnore]];\n\n\tvar ATTRIBUTE_ATTRIBUTORS = [_align.AlignAttribute, _direction.DirectionAttribute].reduce(function (memo, attr) {\n\t memo[attr.keyName] = attr;\n\t return memo;\n\t}, {});\n\n\tvar STYLE_ATTRIBUTORS = [_align.AlignStyle, _background.BackgroundStyle, _color.ColorStyle, _direction.DirectionStyle, _font.FontStyle, _size.SizeStyle].reduce(function (memo, attr) {\n\t memo[attr.keyName] = attr;\n\t return memo;\n\t}, {});\n\n\tvar Clipboard = function (_Module) {\n\t _inherits(Clipboard, _Module);\n\n\t function Clipboard(quill, options) {\n\t _classCallCheck(this, Clipboard);\n\n\t var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this, quill, options));\n\n\t _this.quill.root.addEventListener('paste', _this.onPaste.bind(_this));\n\t _this.container = _this.quill.addContainer('ql-clipboard');\n\t _this.container.setAttribute('contenteditable', true);\n\t _this.container.setAttribute('tabindex', -1);\n\t _this.matchers = [];\n\t CLIPBOARD_CONFIG.concat(_this.options.matchers).forEach(function (pair) {\n\t _this.addMatcher.apply(_this, _toConsumableArray(pair));\n\t });\n\t return _this;\n\t }\n\n\t _createClass(Clipboard, [{\n\t key: 'addMatcher',\n\t value: function addMatcher(selector, matcher) {\n\t this.matchers.push([selector, matcher]);\n\t }\n\t }, {\n\t key: 'convert',\n\t value: function convert(html) {\n\t if (typeof html === 'string') {\n\t this.container.innerHTML = html;\n\t }\n\n\t var _prepareMatching = this.prepareMatching(),\n\t _prepareMatching2 = _slicedToArray(_prepareMatching, 2),\n\t elementMatchers = _prepareMatching2[0],\n\t textMatchers = _prepareMatching2[1];\n\n\t var delta = traverse(this.container, elementMatchers, textMatchers);\n\t // Remove trailing newline\n\t if (deltaEndsWith(delta, '\\n') && delta.ops[delta.ops.length - 1].attributes == null) {\n\t delta = delta.compose(new _quillDelta2.default().retain(delta.length() - 1).delete(1));\n\t }\n\t debug.log('convert', this.container.innerHTML, delta);\n\t this.container.innerHTML = '';\n\t return delta;\n\t }\n\t }, {\n\t key: 'dangerouslyPasteHTML',\n\t value: function dangerouslyPasteHTML(index, html) {\n\t var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _quill2.default.sources.API;\n\n\t if (typeof index === 'string') {\n\t return this.quill.setContents(this.convert(index), html);\n\t } else {\n\t var paste = this.convert(html);\n\t return this.quill.updateContents(new _quillDelta2.default().retain(index).concat(paste), source);\n\t }\n\t }\n\t }, {\n\t key: 'onPaste',\n\t value: function onPaste(e) {\n\t var _this2 = this;\n\n\t if (e.defaultPrevented || !this.quill.isEnabled()) return;\n\t var range = this.quill.getSelection();\n\t var delta = new _quillDelta2.default().retain(range.index);\n\t var scrollTop = this.quill.scrollingContainer.scrollTop;\n\t this.container.focus();\n\t setTimeout(function () {\n\t _this2.quill.selection.update(_quill2.default.sources.SILENT);\n\t delta = delta.concat(_this2.convert()).delete(range.length);\n\t _this2.quill.updateContents(delta, _quill2.default.sources.USER);\n\t // range.length contributes to delta.length()\n\t _this2.quill.setSelection(delta.length() - range.length, _quill2.default.sources.SILENT);\n\t _this2.quill.scrollingContainer.scrollTop = scrollTop;\n\t _this2.quill.selection.scrollIntoView();\n\t }, 1);\n\t }\n\t }, {\n\t key: 'prepareMatching',\n\t value: function prepareMatching() {\n\t var _this3 = this;\n\n\t var elementMatchers = [],\n\t textMatchers = [];\n\t this.matchers.forEach(function (pair) {\n\t var _pair = _slicedToArray(pair, 2),\n\t selector = _pair[0],\n\t matcher = _pair[1];\n\n\t switch (selector) {\n\t case Node.TEXT_NODE:\n\t textMatchers.push(matcher);\n\t break;\n\t case Node.ELEMENT_NODE:\n\t elementMatchers.push(matcher);\n\t break;\n\t default:\n\t [].forEach.call(_this3.container.querySelectorAll(selector), function (node) {\n\t // TODO use weakmap\n\t node[DOM_KEY] = node[DOM_KEY] || [];\n\t node[DOM_KEY].push(matcher);\n\t });\n\t break;\n\t }\n\t });\n\t return [elementMatchers, textMatchers];\n\t }\n\t }]);\n\n\t return Clipboard;\n\t}(_module2.default);\n\n\tClipboard.DEFAULTS = {\n\t matchers: []\n\t};\n\n\tfunction computeStyle(node) {\n\t if (node.nodeType !== Node.ELEMENT_NODE) return {};\n\t var DOM_KEY = '__ql-computed-style';\n\t return node[DOM_KEY] || (node[DOM_KEY] = window.getComputedStyle(node));\n\t}\n\n\tfunction deltaEndsWith(delta, text) {\n\t var endText = \"\";\n\t for (var i = delta.ops.length - 1; i >= 0 && endText.length < text.length; --i) {\n\t var op = delta.ops[i];\n\t if (typeof op.insert !== 'string') break;\n\t endText = op.insert + endText;\n\t }\n\t return endText.slice(-1 * text.length) === text;\n\t}\n\n\tfunction isLine(node) {\n\t if (node.childNodes.length === 0) return false; // Exclude embed blocks\n\t var style = computeStyle(node);\n\t return ['block', 'list-item'].indexOf(style.display) > -1;\n\t}\n\n\tfunction traverse(node, elementMatchers, textMatchers) {\n\t // Post-order\n\t if (node.nodeType === node.TEXT_NODE) {\n\t return textMatchers.reduce(function (delta, matcher) {\n\t return matcher(node, delta);\n\t }, new _quillDelta2.default());\n\t } else if (node.nodeType === node.ELEMENT_NODE) {\n\t return [].reduce.call(node.childNodes || [], function (delta, childNode) {\n\t var childrenDelta = traverse(childNode, elementMatchers, textMatchers);\n\t if (childNode.nodeType === node.ELEMENT_NODE) {\n\t childrenDelta = elementMatchers.reduce(function (childrenDelta, matcher) {\n\t return matcher(childNode, childrenDelta);\n\t }, childrenDelta);\n\t childrenDelta = (childNode[DOM_KEY] || []).reduce(function (childrenDelta, matcher) {\n\t return matcher(childNode, childrenDelta);\n\t }, childrenDelta);\n\t }\n\t return delta.concat(childrenDelta);\n\t }, new _quillDelta2.default());\n\t } else {\n\t return new _quillDelta2.default();\n\t }\n\t}\n\n\tfunction matchAlias(format, node, delta) {\n\t return delta.compose(new _quillDelta2.default().retain(delta.length(), _defineProperty({}, format, true)));\n\t}\n\n\tfunction matchAttributor(node, delta) {\n\t var attributes = _parchment2.default.Attributor.Attribute.keys(node);\n\t var classes = _parchment2.default.Attributor.Class.keys(node);\n\t var styles = _parchment2.default.Attributor.Style.keys(node);\n\t var formats = {};\n\t attributes.concat(classes).concat(styles).forEach(function (name) {\n\t var attr = _parchment2.default.query(name, _parchment2.default.Scope.ATTRIBUTE);\n\t if (attr != null) {\n\t formats[attr.attrName] = attr.value(node);\n\t if (formats[attr.attrName]) return;\n\t }\n\t if (ATTRIBUTE_ATTRIBUTORS[name] != null) {\n\t attr = ATTRIBUTE_ATTRIBUTORS[name];\n\t formats[attr.attrName] = attr.value(node);\n\t }\n\t if (STYLE_ATTRIBUTORS[name] != null) {\n\t attr = STYLE_ATTRIBUTORS[name];\n\t formats[attr.attrName] = attr.value(node);\n\t }\n\t });\n\t if (Object.keys(formats).length > 0) {\n\t delta = delta.compose(new _quillDelta2.default().retain(delta.length(), formats));\n\t }\n\t return delta;\n\t}\n\n\tfunction matchBlot(node, delta) {\n\t var match = _parchment2.default.query(node);\n\t if (match == null) return delta;\n\t if (match.prototype instanceof _parchment2.default.Embed) {\n\t var embed = {};\n\t var value = match.value(node);\n\t if (value != null) {\n\t embed[match.blotName] = value;\n\t delta = new _quillDelta2.default().insert(embed, match.formats(node));\n\t }\n\t } else if (typeof match.formats === 'function') {\n\t var formats = _defineProperty({}, match.blotName, match.formats(node));\n\t delta = delta.compose(new _quillDelta2.default().retain(delta.length(), formats));\n\t }\n\t return delta;\n\t}\n\n\tfunction matchBreak(node, delta) {\n\t if (!deltaEndsWith(delta, '\\n')) {\n\t delta.insert('\\n');\n\t }\n\t return delta;\n\t}\n\n\tfunction matchIgnore() {\n\t return new _quillDelta2.default();\n\t}\n\n\tfunction matchNewline(node, delta) {\n\t if (isLine(node) && !deltaEndsWith(delta, '\\n')) {\n\t delta.insert('\\n');\n\t }\n\t return delta;\n\t}\n\n\tfunction matchSpacing(node, delta) {\n\t if (isLine(node) && node.nextElementSibling != null && !deltaEndsWith(delta, '\\n\\n')) {\n\t var nodeHeight = node.offsetHeight + parseFloat(computeStyle(node).marginTop) + parseFloat(computeStyle(node).marginBottom);\n\t if (node.nextElementSibling.offsetTop > node.offsetTop + nodeHeight * 1.5) {\n\t delta.insert('\\n');\n\t }\n\t }\n\t return delta;\n\t}\n\n\tfunction matchStyles(node, delta) {\n\t var formats = {};\n\t var style = node.style || {};\n\t if (style.fontStyle && computeStyle(node).fontStyle === 'italic') {\n\t formats.italic = true;\n\t }\n\t if (style.fontWeight && computeStyle(node).fontWeight === 'bold') {\n\t formats.bold = true;\n\t }\n\t if (Object.keys(formats).length > 0) {\n\t delta = delta.compose(new _quillDelta2.default().retain(delta.length(), formats));\n\t }\n\t if (parseFloat(style.textIndent || 0) > 0) {\n\t // Could be 0.5in\n\t delta = new _quillDelta2.default().insert('\\t').concat(delta);\n\t }\n\t return delta;\n\t}\n\n\tfunction matchText(node, delta) {\n\t var text = node.data;\n\t // Word represents empty line with  \n\t if (node.parentNode.tagName === 'O:P') {\n\t return delta.insert(text.trim());\n\t }\n\t if (!computeStyle(node.parentNode).whiteSpace.startsWith('pre')) {\n\t // eslint-disable-next-line func-style\n\t var replacer = function replacer(collapse, match) {\n\t match = match.replace(/[^\\u00a0]/g, ''); // \\u00a0 is nbsp;\n\t return match.length < 1 && collapse ? ' ' : match;\n\t };\n\t text = text.replace(/\\r\\n/g, ' ').replace(/\\n/g, ' ');\n\t text = text.replace(/\\s\\s+/g, replacer.bind(replacer, true)); // collapse whitespace\n\t if (node.previousSibling == null && isLine(node.parentNode) || node.previousSibling != null && isLine(node.previousSibling)) {\n\t text = text.replace(/^\\s+/, replacer.bind(replacer, false));\n\t }\n\t if (node.nextSibling == null && isLine(node.parentNode) || node.nextSibling != null && isLine(node.nextSibling)) {\n\t text = text.replace(/\\s+$/, replacer.bind(replacer, false));\n\t }\n\t }\n\t return delta.insert(text);\n\t}\n\n\texports.default = Clipboard;\n\texports.matchAttributor = matchAttributor;\n\texports.matchBlot = matchBlot;\n\texports.matchNewline = matchNewline;\n\texports.matchSpacing = matchSpacing;\n\texports.matchText = matchText;\n\n/***/ },\n/* 45 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.AlignStyle = exports.AlignClass = exports.AlignAttribute = undefined;\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tvar config = {\n\t scope: _parchment2.default.Scope.BLOCK,\n\t whitelist: ['right', 'center', 'justify']\n\t};\n\n\tvar AlignAttribute = new _parchment2.default.Attributor.Attribute('align', 'align', config);\n\tvar AlignClass = new _parchment2.default.Attributor.Class('align', 'ql-align', config);\n\tvar AlignStyle = new _parchment2.default.Attributor.Style('align', 'text-align', config);\n\n\texports.AlignAttribute = AlignAttribute;\n\texports.AlignClass = AlignClass;\n\texports.AlignStyle = AlignStyle;\n\n/***/ },\n/* 46 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.BackgroundStyle = exports.BackgroundClass = undefined;\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _color = __webpack_require__(47);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tvar BackgroundClass = new _parchment2.default.Attributor.Class('background', 'ql-bg', {\n\t scope: _parchment2.default.Scope.INLINE\n\t});\n\tvar BackgroundStyle = new _color.ColorAttributor('background', 'background-color', {\n\t scope: _parchment2.default.Scope.INLINE\n\t});\n\n\texports.BackgroundClass = BackgroundClass;\n\texports.BackgroundStyle = BackgroundStyle;\n\n/***/ },\n/* 47 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.ColorStyle = exports.ColorClass = exports.ColorAttributor = undefined;\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar ColorAttributor = function (_Parchment$Attributor) {\n\t _inherits(ColorAttributor, _Parchment$Attributor);\n\n\t function ColorAttributor() {\n\t _classCallCheck(this, ColorAttributor);\n\n\t return _possibleConstructorReturn(this, (ColorAttributor.__proto__ || Object.getPrototypeOf(ColorAttributor)).apply(this, arguments));\n\t }\n\n\t _createClass(ColorAttributor, [{\n\t key: 'value',\n\t value: function value(domNode) {\n\t var value = _get(ColorAttributor.prototype.__proto__ || Object.getPrototypeOf(ColorAttributor.prototype), 'value', this).call(this, domNode);\n\t if (!value.startsWith('rgb(')) return value;\n\t value = value.replace(/^[^\\d]+/, '').replace(/[^\\d]+$/, '');\n\t return '#' + value.split(',').map(function (component) {\n\t return ('00' + parseInt(component).toString(16)).slice(-2);\n\t }).join('');\n\t }\n\t }]);\n\n\t return ColorAttributor;\n\t}(_parchment2.default.Attributor.Style);\n\n\tvar ColorClass = new _parchment2.default.Attributor.Class('color', 'ql-color', {\n\t scope: _parchment2.default.Scope.INLINE\n\t});\n\tvar ColorStyle = new ColorAttributor('color', 'color', {\n\t scope: _parchment2.default.Scope.INLINE\n\t});\n\n\texports.ColorAttributor = ColorAttributor;\n\texports.ColorClass = ColorClass;\n\texports.ColorStyle = ColorStyle;\n\n/***/ },\n/* 48 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.DirectionStyle = exports.DirectionClass = exports.DirectionAttribute = undefined;\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tvar config = {\n\t scope: _parchment2.default.Scope.BLOCK,\n\t whitelist: ['rtl']\n\t};\n\n\tvar DirectionAttribute = new _parchment2.default.Attributor.Attribute('direction', 'dir', config);\n\tvar DirectionClass = new _parchment2.default.Attributor.Class('direction', 'ql-direction', config);\n\tvar DirectionStyle = new _parchment2.default.Attributor.Style('direction', 'direction', config);\n\n\texports.DirectionAttribute = DirectionAttribute;\n\texports.DirectionClass = DirectionClass;\n\texports.DirectionStyle = DirectionStyle;\n\n/***/ },\n/* 49 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.FontClass = exports.FontStyle = undefined;\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar config = {\n\t scope: _parchment2.default.Scope.INLINE,\n\t whitelist: ['serif', 'monospace']\n\t};\n\n\tvar FontClass = new _parchment2.default.Attributor.Class('font', 'ql-font', config);\n\n\tvar FontStyleAttributor = function (_Parchment$Attributor) {\n\t _inherits(FontStyleAttributor, _Parchment$Attributor);\n\n\t function FontStyleAttributor() {\n\t _classCallCheck(this, FontStyleAttributor);\n\n\t return _possibleConstructorReturn(this, (FontStyleAttributor.__proto__ || Object.getPrototypeOf(FontStyleAttributor)).apply(this, arguments));\n\t }\n\n\t _createClass(FontStyleAttributor, [{\n\t key: 'value',\n\t value: function value(node) {\n\t return _get(FontStyleAttributor.prototype.__proto__ || Object.getPrototypeOf(FontStyleAttributor.prototype), 'value', this).call(this, node).replace(/[\"']/g, '');\n\t }\n\t }]);\n\n\t return FontStyleAttributor;\n\t}(_parchment2.default.Attributor.Style);\n\n\tvar FontStyle = new FontStyleAttributor('font', 'font-family', config);\n\n\texports.FontStyle = FontStyle;\n\texports.FontClass = FontClass;\n\n/***/ },\n/* 50 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.SizeStyle = exports.SizeClass = undefined;\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tvar SizeClass = new _parchment2.default.Attributor.Class('size', 'ql-size', {\n\t scope: _parchment2.default.Scope.INLINE,\n\t whitelist: ['small', 'large', 'huge']\n\t});\n\tvar SizeStyle = new _parchment2.default.Attributor.Style('size', 'font-size', {\n\t scope: _parchment2.default.Scope.INLINE,\n\t whitelist: ['10px', '18px', '32px']\n\t});\n\n\texports.SizeClass = SizeClass;\n\texports.SizeStyle = SizeStyle;\n\n/***/ },\n/* 51 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.getLastChangeIndex = exports.default = undefined;\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _quill = __webpack_require__(18);\n\n\tvar _quill2 = _interopRequireDefault(_quill);\n\n\tvar _module = __webpack_require__(39);\n\n\tvar _module2 = _interopRequireDefault(_module);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar History = function (_Module) {\n\t _inherits(History, _Module);\n\n\t function History(quill, options) {\n\t _classCallCheck(this, History);\n\n\t var _this = _possibleConstructorReturn(this, (History.__proto__ || Object.getPrototypeOf(History)).call(this, quill, options));\n\n\t _this.lastRecorded = 0;\n\t _this.ignoreChange = false;\n\t _this.clear();\n\t _this.quill.on(_quill2.default.events.EDITOR_CHANGE, function (eventName, delta, oldDelta, source) {\n\t if (eventName !== _quill2.default.events.TEXT_CHANGE || _this.ignoreChange) return;\n\t if (!_this.options.userOnly || source === _quill2.default.sources.USER) {\n\t _this.record(delta, oldDelta);\n\t } else {\n\t _this.transform(delta);\n\t }\n\t });\n\t _this.quill.keyboard.addBinding({ key: 'Z', shortKey: true }, _this.undo.bind(_this));\n\t _this.quill.keyboard.addBinding({ key: 'Z', shortKey: true, shiftKey: true }, _this.redo.bind(_this));\n\t if (/Win/i.test(navigator.platform)) {\n\t _this.quill.keyboard.addBinding({ key: 'Y', shortKey: true }, _this.redo.bind(_this));\n\t }\n\t return _this;\n\t }\n\n\t _createClass(History, [{\n\t key: 'change',\n\t value: function change(source, dest) {\n\t if (this.stack[source].length === 0) return;\n\t var delta = this.stack[source].pop();\n\t this.lastRecorded = 0;\n\t this.ignoreChange = true;\n\t this.quill.updateContents(delta[source], _quill2.default.sources.USER);\n\t this.ignoreChange = false;\n\t var index = getLastChangeIndex(delta[source]);\n\t this.quill.setSelection(index);\n\t this.quill.selection.scrollIntoView();\n\t this.stack[dest].push(delta);\n\t }\n\t }, {\n\t key: 'clear',\n\t value: function clear() {\n\t this.stack = { undo: [], redo: [] };\n\t }\n\t }, {\n\t key: 'record',\n\t value: function record(changeDelta, oldDelta) {\n\t if (changeDelta.ops.length === 0) return;\n\t this.stack.redo = [];\n\t var undoDelta = this.quill.getContents().diff(oldDelta);\n\t var timestamp = Date.now();\n\t if (this.lastRecorded + this.options.delay > timestamp && this.stack.undo.length > 0) {\n\t var delta = this.stack.undo.pop();\n\t undoDelta = undoDelta.compose(delta.undo);\n\t changeDelta = delta.redo.compose(changeDelta);\n\t } else {\n\t this.lastRecorded = timestamp;\n\t }\n\t this.stack.undo.push({\n\t redo: changeDelta,\n\t undo: undoDelta\n\t });\n\t if (this.stack.undo.length > this.options.maxStack) {\n\t this.stack.undo.shift();\n\t }\n\t }\n\t }, {\n\t key: 'redo',\n\t value: function redo() {\n\t this.change('redo', 'undo');\n\t }\n\t }, {\n\t key: 'transform',\n\t value: function transform(delta) {\n\t this.stack.undo.forEach(function (change) {\n\t change.undo = delta.transform(change.undo, true);\n\t change.redo = delta.transform(change.redo, true);\n\t });\n\t this.stack.redo.forEach(function (change) {\n\t change.undo = delta.transform(change.undo, true);\n\t change.redo = delta.transform(change.redo, true);\n\t });\n\t }\n\t }, {\n\t key: 'undo',\n\t value: function undo() {\n\t this.change('undo', 'redo');\n\t }\n\t }]);\n\n\t return History;\n\t}(_module2.default);\n\n\tHistory.DEFAULTS = {\n\t delay: 1000,\n\t maxStack: 100,\n\t userOnly: false\n\t};\n\n\tfunction endsWithNewlineChange(delta) {\n\t var lastOp = delta.ops[delta.ops.length - 1];\n\t if (lastOp == null) return false;\n\t if (lastOp.insert != null) {\n\t return typeof lastOp.insert === 'string' && lastOp.insert.endsWith('\\n');\n\t }\n\t if (lastOp.attributes != null) {\n\t return Object.keys(lastOp.attributes).some(function (attr) {\n\t return _parchment2.default.query(attr, _parchment2.default.Scope.BLOCK) != null;\n\t });\n\t }\n\t return false;\n\t}\n\n\tfunction getLastChangeIndex(delta) {\n\t var deleteLength = delta.reduce(function (length, op) {\n\t length += op.delete || 0;\n\t return length;\n\t }, 0);\n\t var changeIndex = delta.length() - deleteLength;\n\t if (endsWithNewlineChange(delta)) {\n\t changeIndex -= 1;\n\t }\n\t return changeIndex;\n\t}\n\n\texports.default = History;\n\texports.getLastChangeIndex = getLastChangeIndex;\n\n/***/ },\n/* 52 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _clone = __webpack_require__(38);\n\n\tvar _clone2 = _interopRequireDefault(_clone);\n\n\tvar _deepEqual = __webpack_require__(22);\n\n\tvar _deepEqual2 = _interopRequireDefault(_deepEqual);\n\n\tvar _extend = __webpack_require__(25);\n\n\tvar _extend2 = _interopRequireDefault(_extend);\n\n\tvar _op = __webpack_require__(26);\n\n\tvar _op2 = _interopRequireDefault(_op);\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _quill = __webpack_require__(18);\n\n\tvar _quill2 = _interopRequireDefault(_quill);\n\n\tvar _logger = __webpack_require__(37);\n\n\tvar _logger2 = _interopRequireDefault(_logger);\n\n\tvar _module = __webpack_require__(39);\n\n\tvar _module2 = _interopRequireDefault(_module);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar debug = (0, _logger2.default)('quill:keyboard');\n\n\tvar SHORTKEY = /Mac/i.test(navigator.platform) ? 'metaKey' : 'ctrlKey';\n\n\tvar Keyboard = function (_Module) {\n\t _inherits(Keyboard, _Module);\n\n\t _createClass(Keyboard, null, [{\n\t key: 'match',\n\t value: function match(evt, binding) {\n\t binding = normalize(binding);\n\t if (!!binding.shortKey !== evt[SHORTKEY] && binding.shortKey !== null) return false;\n\t if (['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].some(function (key) {\n\t return key != SHORTKEY && !!binding[key] !== evt[key] && binding[key] !== null;\n\t })) {\n\t return false;\n\t }\n\t return binding.key === (evt.which || evt.keyCode);\n\t }\n\t }]);\n\n\t function Keyboard(quill, options) {\n\t _classCallCheck(this, Keyboard);\n\n\t var _this = _possibleConstructorReturn(this, (Keyboard.__proto__ || Object.getPrototypeOf(Keyboard)).call(this, quill, options));\n\n\t _this.bindings = {};\n\t Object.keys(_this.options.bindings).forEach(function (name) {\n\t if (_this.options.bindings[name]) {\n\t _this.addBinding(_this.options.bindings[name]);\n\t }\n\t });\n\t _this.addBinding({ key: Keyboard.keys.ENTER, shiftKey: null }, handleEnter);\n\t _this.addBinding({ key: Keyboard.keys.ENTER, metaKey: null, ctrlKey: null, altKey: null }, function () {});\n\t if (/Gecko/i.test(navigator.userAgent)) {\n\t // Need to handle delete and backspace for Firefox in the general case #1171\n\t _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true }, handleBackspace);\n\t _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true }, handleDelete);\n\t } else {\n\t _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true, prefix: /^.?$/ }, handleBackspace);\n\t _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true, suffix: /^.?$/ }, handleDelete);\n\t }\n\t _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: false }, handleDeleteRange);\n\t _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: false }, handleDeleteRange);\n\t if (/Trident/i.test(navigator.userAgent)) {\n\t _this.addBinding({ key: Keyboard.keys.BACKSPACE, shortKey: true }, handleBackspace);\n\t _this.addBinding({ key: Keyboard.keys.DELETE, shortKey: true }, handleDelete);\n\t }\n\t _this.listen();\n\t return _this;\n\t }\n\n\t _createClass(Keyboard, [{\n\t key: 'addBinding',\n\t value: function addBinding(key) {\n\t var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\t var handler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\t var binding = normalize(key);\n\t if (binding == null || binding.key == null) {\n\t return debug.warn('Attempted to add invalid keyboard binding', binding);\n\t }\n\t if (typeof context === 'function') {\n\t context = { handler: context };\n\t }\n\t if (typeof handler === 'function') {\n\t handler = { handler: handler };\n\t }\n\t binding = (0, _extend2.default)(binding, context, handler);\n\t this.bindings[binding.key] = this.bindings[binding.key] || [];\n\t this.bindings[binding.key].push(binding);\n\t }\n\t }, {\n\t key: 'listen',\n\t value: function listen() {\n\t var _this2 = this;\n\n\t this.quill.root.addEventListener('keydown', function (evt) {\n\t if (evt.defaultPrevented) return;\n\t var which = evt.which || evt.keyCode;\n\t var bindings = (_this2.bindings[which] || []).filter(function (binding) {\n\t return Keyboard.match(evt, binding);\n\t });\n\t if (bindings.length === 0) return;\n\t var range = _this2.quill.getSelection();\n\t if (range == null || !_this2.quill.hasFocus()) return;\n\n\t var _quill$scroll$line = _this2.quill.scroll.line(range.index),\n\t _quill$scroll$line2 = _slicedToArray(_quill$scroll$line, 2),\n\t line = _quill$scroll$line2[0],\n\t offset = _quill$scroll$line2[1];\n\n\t var _quill$scroll$leaf = _this2.quill.scroll.leaf(range.index),\n\t _quill$scroll$leaf2 = _slicedToArray(_quill$scroll$leaf, 2),\n\t leafStart = _quill$scroll$leaf2[0],\n\t offsetStart = _quill$scroll$leaf2[1];\n\n\t var _ref = range.length === 0 ? [leafStart, offsetStart] : _this2.quill.scroll.leaf(range.index + range.length),\n\t _ref2 = _slicedToArray(_ref, 2),\n\t leafEnd = _ref2[0],\n\t offsetEnd = _ref2[1];\n\n\t var prefixText = leafStart instanceof _parchment2.default.Text ? leafStart.value().slice(0, offsetStart) : '';\n\t var suffixText = leafEnd instanceof _parchment2.default.Text ? leafEnd.value().slice(offsetEnd) : '';\n\t var curContext = {\n\t collapsed: range.length === 0,\n\t empty: range.length === 0 && line.length() <= 1,\n\t format: _this2.quill.getFormat(range),\n\t offset: offset,\n\t prefix: prefixText,\n\t suffix: suffixText\n\t };\n\t var prevented = bindings.some(function (binding) {\n\t if (binding.collapsed != null && binding.collapsed !== curContext.collapsed) return false;\n\t if (binding.empty != null && binding.empty !== curContext.empty) return false;\n\t if (binding.offset != null && binding.offset !== curContext.offset) return false;\n\t if (Array.isArray(binding.format)) {\n\t // any format is present\n\t if (binding.format.every(function (name) {\n\t return curContext.format[name] == null;\n\t })) {\n\t return false;\n\t }\n\t } else if (_typeof(binding.format) === 'object') {\n\t // all formats must match\n\t if (!Object.keys(binding.format).every(function (name) {\n\t if (binding.format[name] === true) return curContext.format[name] != null;\n\t if (binding.format[name] === false) return curContext.format[name] == null;\n\t return (0, _deepEqual2.default)(binding.format[name], curContext.format[name]);\n\t })) {\n\t return false;\n\t }\n\t }\n\t if (binding.prefix != null && !binding.prefix.test(curContext.prefix)) return false;\n\t if (binding.suffix != null && !binding.suffix.test(curContext.suffix)) return false;\n\t return binding.handler.call(_this2, range, curContext) !== true;\n\t });\n\t if (prevented) {\n\t evt.preventDefault();\n\t }\n\t });\n\t }\n\t }]);\n\n\t return Keyboard;\n\t}(_module2.default);\n\n\tKeyboard.keys = {\n\t BACKSPACE: 8,\n\t TAB: 9,\n\t ENTER: 13,\n\t ESCAPE: 27,\n\t LEFT: 37,\n\t UP: 38,\n\t RIGHT: 39,\n\t DOWN: 40,\n\t DELETE: 46\n\t};\n\n\tKeyboard.DEFAULTS = {\n\t bindings: {\n\t 'bold': makeFormatHandler('bold'),\n\t 'italic': makeFormatHandler('italic'),\n\t 'underline': makeFormatHandler('underline'),\n\t 'indent': {\n\t // highlight tab or tab at beginning of list, indent or blockquote\n\t key: Keyboard.keys.TAB,\n\t format: ['blockquote', 'indent', 'list'],\n\t handler: function handler(range, context) {\n\t if (context.collapsed && context.offset !== 0) return true;\n\t this.quill.format('indent', '+1', _quill2.default.sources.USER);\n\t }\n\t },\n\t 'outdent': {\n\t key: Keyboard.keys.TAB,\n\t shiftKey: true,\n\t format: ['blockquote', 'indent', 'list'],\n\t // highlight tab or tab at beginning of list, indent or blockquote\n\t handler: function handler(range, context) {\n\t if (context.collapsed && context.offset !== 0) return true;\n\t this.quill.format('indent', '-1', _quill2.default.sources.USER);\n\t }\n\t },\n\t 'outdent backspace': {\n\t key: Keyboard.keys.BACKSPACE,\n\t collapsed: true,\n\t format: ['blockquote', 'indent', 'list'],\n\t offset: 0,\n\t handler: function handler(range, context) {\n\t if (context.format.indent != null) {\n\t this.quill.format('indent', '-1', _quill2.default.sources.USER);\n\t } else if (context.format.blockquote != null) {\n\t this.quill.format('blockquote', false, _quill2.default.sources.USER);\n\t } else if (context.format.list != null) {\n\t this.quill.format('list', false, _quill2.default.sources.USER);\n\t }\n\t }\n\t },\n\t 'indent code-block': makeCodeBlockHandler(true),\n\t 'outdent code-block': makeCodeBlockHandler(false),\n\t 'remove tab': {\n\t key: Keyboard.keys.TAB,\n\t shiftKey: true,\n\t collapsed: true,\n\t prefix: /\\t$/,\n\t handler: function handler(range) {\n\t this.quill.deleteText(range.index - 1, 1, _quill2.default.sources.USER);\n\t }\n\t },\n\t 'tab': {\n\t key: Keyboard.keys.TAB,\n\t handler: function handler(range, context) {\n\t if (!context.collapsed) {\n\t this.quill.scroll.deleteAt(range.index, range.length);\n\t }\n\t this.quill.insertText(range.index, '\\t', _quill2.default.sources.USER);\n\t this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);\n\t }\n\t },\n\t 'list empty enter': {\n\t key: Keyboard.keys.ENTER,\n\t collapsed: true,\n\t format: ['list'],\n\t empty: true,\n\t handler: function handler(range, context) {\n\t this.quill.format('list', false, _quill2.default.sources.USER);\n\t if (context.format.indent) {\n\t this.quill.format('indent', false, _quill2.default.sources.USER);\n\t }\n\t }\n\t },\n\t 'checklist enter': {\n\t key: Keyboard.keys.ENTER,\n\t collapsed: true,\n\t format: { list: 'checked' },\n\t handler: function handler(range) {\n\t this.quill.scroll.insertAt(range.index, '\\n');\n\n\t var _quill$scroll$line3 = this.quill.scroll.line(range.index + 1),\n\t _quill$scroll$line4 = _slicedToArray(_quill$scroll$line3, 1),\n\t line = _quill$scroll$line4[0];\n\n\t line.format('list', 'unchecked');\n\t this.quill.update(_quill2.default.sources.USER);\n\t this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);\n\t this.quill.selection.scrollIntoView();\n\t }\n\t },\n\t 'header enter': {\n\t key: Keyboard.keys.ENTER,\n\t collapsed: true,\n\t format: ['header'],\n\t suffix: /^$/,\n\t handler: function handler(range) {\n\t this.quill.scroll.insertAt(range.index, '\\n');\n\t this.quill.formatText(range.index + 1, 1, 'header', false, _quill2.default.sources.USER);\n\t this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);\n\t this.quill.selection.scrollIntoView();\n\t }\n\t },\n\t 'list autofill': {\n\t key: ' ',\n\t collapsed: true,\n\t format: { list: false },\n\t prefix: /^(1\\.|-)$/,\n\t handler: function handler(range, context) {\n\t var length = context.prefix.length;\n\t this.quill.scroll.deleteAt(range.index - length, length);\n\t this.quill.formatLine(range.index - length, 1, 'list', length === 1 ? 'bullet' : 'ordered', _quill2.default.sources.USER);\n\t this.quill.setSelection(range.index - length, _quill2.default.sources.SILENT);\n\t }\n\t }\n\t }\n\t};\n\n\tfunction handleBackspace(range, context) {\n\t if (range.index === 0) return;\n\n\t var _quill$scroll$line5 = this.quill.scroll.line(range.index),\n\t _quill$scroll$line6 = _slicedToArray(_quill$scroll$line5, 1),\n\t line = _quill$scroll$line6[0];\n\n\t var formats = {};\n\t if (context.offset === 0) {\n\t var curFormats = line.formats();\n\t var prevFormats = this.quill.getFormat(range.index - 1, 1);\n\t formats = _op2.default.attributes.diff(curFormats, prevFormats) || {};\n\t }\n\t this.quill.deleteText(range.index - 1, 1, _quill2.default.sources.USER);\n\t if (Object.keys(formats).length > 0) {\n\t this.quill.formatLine(range.index - 1, 1, formats, _quill2.default.sources.USER);\n\t }\n\t this.quill.selection.scrollIntoView();\n\t}\n\n\tfunction handleDelete(range) {\n\t if (range.index >= this.quill.getLength() - 1) return;\n\t this.quill.deleteText(range.index, 1, _quill2.default.sources.USER);\n\t}\n\n\tfunction handleDeleteRange(range) {\n\t this.quill.deleteText(range, _quill2.default.sources.USER);\n\t this.quill.setSelection(range.index, _quill2.default.sources.SILENT);\n\t this.quill.selection.scrollIntoView();\n\t}\n\n\tfunction handleEnter(range, context) {\n\t var _this3 = this;\n\n\t if (range.length > 0) {\n\t this.quill.scroll.deleteAt(range.index, range.length); // So we do not trigger text-change\n\t }\n\t var lineFormats = Object.keys(context.format).reduce(function (lineFormats, format) {\n\t if (_parchment2.default.query(format, _parchment2.default.Scope.BLOCK) && !Array.isArray(context.format[format])) {\n\t lineFormats[format] = context.format[format];\n\t }\n\t return lineFormats;\n\t }, {});\n\t this.quill.insertText(range.index, '\\n', lineFormats, _quill2.default.sources.USER);\n\t this.quill.selection.scrollIntoView();\n\t Object.keys(context.format).forEach(function (name) {\n\t if (lineFormats[name] != null) return;\n\t if (Array.isArray(context.format[name])) return;\n\t if (name === 'link') return;\n\t _this3.quill.format(name, context.format[name], _quill2.default.sources.USER);\n\t });\n\t}\n\n\tfunction makeCodeBlockHandler(indent) {\n\t return {\n\t key: Keyboard.keys.TAB,\n\t shiftKey: !indent,\n\t format: { 'code-block': true },\n\t handler: function handler(range) {\n\t var CodeBlock = _parchment2.default.query('code-block');\n\t var index = range.index,\n\t length = range.length;\n\n\t var _quill$scroll$descend = this.quill.scroll.descendant(CodeBlock, index),\n\t _quill$scroll$descend2 = _slicedToArray(_quill$scroll$descend, 2),\n\t block = _quill$scroll$descend2[0],\n\t offset = _quill$scroll$descend2[1];\n\n\t if (block == null) return;\n\t var scrollOffset = this.quill.scroll.offset(block);\n\t var start = block.newlineIndex(offset, true) + 1;\n\t var end = block.newlineIndex(scrollOffset + offset + length);\n\t var lines = block.domNode.textContent.slice(start, end).split('\\n');\n\t offset = 0;\n\t lines.forEach(function (line, i) {\n\t if (indent) {\n\t block.insertAt(start + offset, CodeBlock.TAB);\n\t offset += CodeBlock.TAB.length;\n\t if (i === 0) {\n\t index += CodeBlock.TAB.length;\n\t } else {\n\t length += CodeBlock.TAB.length;\n\t }\n\t } else if (line.startsWith(CodeBlock.TAB)) {\n\t block.deleteAt(start + offset, CodeBlock.TAB.length);\n\t offset -= CodeBlock.TAB.length;\n\t if (i === 0) {\n\t index -= CodeBlock.TAB.length;\n\t } else {\n\t length -= CodeBlock.TAB.length;\n\t }\n\t }\n\t offset += line.length + 1;\n\t });\n\t this.quill.update(_quill2.default.sources.USER);\n\t this.quill.setSelection(index, length, _quill2.default.sources.SILENT);\n\t }\n\t };\n\t}\n\n\tfunction makeFormatHandler(format) {\n\t return {\n\t key: format[0].toUpperCase(),\n\t shortKey: true,\n\t handler: function handler(range, context) {\n\t this.quill.format(format, !context.format[format], _quill2.default.sources.USER);\n\t }\n\t };\n\t}\n\n\tfunction normalize(binding) {\n\t if (typeof binding === 'string' || typeof binding === 'number') {\n\t return normalize({ key: binding });\n\t }\n\t if ((typeof binding === 'undefined' ? 'undefined' : _typeof(binding)) === 'object') {\n\t binding = (0, _clone2.default)(binding, false);\n\t }\n\t if (typeof binding.key === 'string') {\n\t if (Keyboard.keys[binding.key.toUpperCase()] != null) {\n\t binding.key = Keyboard.keys[binding.key.toUpperCase()];\n\t } else if (binding.key.length === 1) {\n\t binding.key = binding.key.toUpperCase().charCodeAt(0);\n\t } else {\n\t return null;\n\t }\n\t }\n\t return binding;\n\t}\n\n\texports.default = Keyboard;\n\n/***/ },\n/* 53 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar _core = __webpack_require__(1);\n\n\tvar _core2 = _interopRequireDefault(_core);\n\n\tvar _align = __webpack_require__(45);\n\n\tvar _direction = __webpack_require__(48);\n\n\tvar _indent = __webpack_require__(54);\n\n\tvar _blockquote = __webpack_require__(55);\n\n\tvar _blockquote2 = _interopRequireDefault(_blockquote);\n\n\tvar _header = __webpack_require__(56);\n\n\tvar _header2 = _interopRequireDefault(_header);\n\n\tvar _list = __webpack_require__(57);\n\n\tvar _list2 = _interopRequireDefault(_list);\n\n\tvar _background = __webpack_require__(46);\n\n\tvar _color = __webpack_require__(47);\n\n\tvar _font = __webpack_require__(49);\n\n\tvar _size = __webpack_require__(50);\n\n\tvar _bold = __webpack_require__(58);\n\n\tvar _bold2 = _interopRequireDefault(_bold);\n\n\tvar _italic = __webpack_require__(59);\n\n\tvar _italic2 = _interopRequireDefault(_italic);\n\n\tvar _link = __webpack_require__(60);\n\n\tvar _link2 = _interopRequireDefault(_link);\n\n\tvar _script = __webpack_require__(61);\n\n\tvar _script2 = _interopRequireDefault(_script);\n\n\tvar _strike = __webpack_require__(62);\n\n\tvar _strike2 = _interopRequireDefault(_strike);\n\n\tvar _underline = __webpack_require__(63);\n\n\tvar _underline2 = _interopRequireDefault(_underline);\n\n\tvar _image = __webpack_require__(64);\n\n\tvar _image2 = _interopRequireDefault(_image);\n\n\tvar _video = __webpack_require__(65);\n\n\tvar _video2 = _interopRequireDefault(_video);\n\n\tvar _code = __webpack_require__(28);\n\n\tvar _code2 = _interopRequireDefault(_code);\n\n\tvar _formula = __webpack_require__(66);\n\n\tvar _formula2 = _interopRequireDefault(_formula);\n\n\tvar _syntax = __webpack_require__(67);\n\n\tvar _syntax2 = _interopRequireDefault(_syntax);\n\n\tvar _toolbar = __webpack_require__(68);\n\n\tvar _toolbar2 = _interopRequireDefault(_toolbar);\n\n\tvar _icons = __webpack_require__(69);\n\n\tvar _icons2 = _interopRequireDefault(_icons);\n\n\tvar _picker = __webpack_require__(102);\n\n\tvar _picker2 = _interopRequireDefault(_picker);\n\n\tvar _colorPicker = __webpack_require__(104);\n\n\tvar _colorPicker2 = _interopRequireDefault(_colorPicker);\n\n\tvar _iconPicker = __webpack_require__(105);\n\n\tvar _iconPicker2 = _interopRequireDefault(_iconPicker);\n\n\tvar _tooltip = __webpack_require__(106);\n\n\tvar _tooltip2 = _interopRequireDefault(_tooltip);\n\n\tvar _bubble = __webpack_require__(107);\n\n\tvar _bubble2 = _interopRequireDefault(_bubble);\n\n\tvar _snow = __webpack_require__(109);\n\n\tvar _snow2 = _interopRequireDefault(_snow);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\t_core2.default.register({\n\t 'attributors/attribute/direction': _direction.DirectionAttribute,\n\n\t 'attributors/class/align': _align.AlignClass,\n\t 'attributors/class/background': _background.BackgroundClass,\n\t 'attributors/class/color': _color.ColorClass,\n\t 'attributors/class/direction': _direction.DirectionClass,\n\t 'attributors/class/font': _font.FontClass,\n\t 'attributors/class/size': _size.SizeClass,\n\n\t 'attributors/style/align': _align.AlignStyle,\n\t 'attributors/style/background': _background.BackgroundStyle,\n\t 'attributors/style/color': _color.ColorStyle,\n\t 'attributors/style/direction': _direction.DirectionStyle,\n\t 'attributors/style/font': _font.FontStyle,\n\t 'attributors/style/size': _size.SizeStyle\n\t}, true);\n\n\t_core2.default.register({\n\t 'formats/align': _align.AlignClass,\n\t 'formats/direction': _direction.DirectionClass,\n\t 'formats/indent': _indent.IndentClass,\n\n\t 'formats/background': _background.BackgroundStyle,\n\t 'formats/color': _color.ColorStyle,\n\t 'formats/font': _font.FontClass,\n\t 'formats/size': _size.SizeClass,\n\n\t 'formats/blockquote': _blockquote2.default,\n\t 'formats/code-block': _code2.default,\n\t 'formats/header': _header2.default,\n\t 'formats/list': _list2.default,\n\n\t 'formats/bold': _bold2.default,\n\t 'formats/code': _code.Code,\n\t 'formats/italic': _italic2.default,\n\t 'formats/link': _link2.default,\n\t 'formats/script': _script2.default,\n\t 'formats/strike': _strike2.default,\n\t 'formats/underline': _underline2.default,\n\n\t 'formats/image': _image2.default,\n\t 'formats/video': _video2.default,\n\n\t 'formats/list/item': _list.ListItem,\n\n\t 'modules/formula': _formula2.default,\n\t 'modules/syntax': _syntax2.default,\n\t 'modules/toolbar': _toolbar2.default,\n\n\t 'themes/bubble': _bubble2.default,\n\t 'themes/snow': _snow2.default,\n\n\t 'ui/icons': _icons2.default,\n\t 'ui/picker': _picker2.default,\n\t 'ui/icon-picker': _iconPicker2.default,\n\t 'ui/color-picker': _colorPicker2.default,\n\t 'ui/tooltip': _tooltip2.default\n\t}, true);\n\n\tmodule.exports = _core2.default;\n\n/***/ },\n/* 54 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.IndentClass = undefined;\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar IdentAttributor = function (_Parchment$Attributor) {\n\t _inherits(IdentAttributor, _Parchment$Attributor);\n\n\t function IdentAttributor() {\n\t _classCallCheck(this, IdentAttributor);\n\n\t return _possibleConstructorReturn(this, (IdentAttributor.__proto__ || Object.getPrototypeOf(IdentAttributor)).apply(this, arguments));\n\t }\n\n\t _createClass(IdentAttributor, [{\n\t key: 'add',\n\t value: function add(node, value) {\n\t if (value === '+1' || value === '-1') {\n\t var indent = this.value(node) || 0;\n\t value = value === '+1' ? indent + 1 : indent - 1;\n\t }\n\t if (value === 0) {\n\t this.remove(node);\n\t return true;\n\t } else {\n\t return _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'add', this).call(this, node, value);\n\t }\n\t }\n\t }, {\n\t key: 'canAdd',\n\t value: function canAdd(node, value) {\n\t return _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'canAdd', this).call(this, node, value) || _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'canAdd', this).call(this, node, parseInt(value));\n\t }\n\t }, {\n\t key: 'value',\n\t value: function value(node) {\n\t return parseInt(_get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'value', this).call(this, node)) || undefined; // Don't return NaN\n\t }\n\t }]);\n\n\t return IdentAttributor;\n\t}(_parchment2.default.Attributor.Class);\n\n\tvar IndentClass = new IdentAttributor('indent', 'ql-indent', {\n\t scope: _parchment2.default.Scope.BLOCK,\n\t whitelist: [1, 2, 3, 4, 5, 6, 7, 8]\n\t});\n\n\texports.IndentClass = IndentClass;\n\n/***/ },\n/* 55 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _block = __webpack_require__(29);\n\n\tvar _block2 = _interopRequireDefault(_block);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Blockquote = function (_Block) {\n\t _inherits(Blockquote, _Block);\n\n\t function Blockquote() {\n\t _classCallCheck(this, Blockquote);\n\n\t return _possibleConstructorReturn(this, (Blockquote.__proto__ || Object.getPrototypeOf(Blockquote)).apply(this, arguments));\n\t }\n\n\t return Blockquote;\n\t}(_block2.default);\n\n\tBlockquote.blotName = 'blockquote';\n\tBlockquote.tagName = 'blockquote';\n\n\texports.default = Blockquote;\n\n/***/ },\n/* 56 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _block = __webpack_require__(29);\n\n\tvar _block2 = _interopRequireDefault(_block);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Header = function (_Block) {\n\t _inherits(Header, _Block);\n\n\t function Header() {\n\t _classCallCheck(this, Header);\n\n\t return _possibleConstructorReturn(this, (Header.__proto__ || Object.getPrototypeOf(Header)).apply(this, arguments));\n\t }\n\n\t _createClass(Header, null, [{\n\t key: 'formats',\n\t value: function formats(domNode) {\n\t return this.tagName.indexOf(domNode.tagName) + 1;\n\t }\n\t }]);\n\n\t return Header;\n\t}(_block2.default);\n\n\tHeader.blotName = 'header';\n\tHeader.tagName = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];\n\n\texports.default = Header;\n\n/***/ },\n/* 57 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = exports.ListItem = undefined;\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _block = __webpack_require__(29);\n\n\tvar _block2 = _interopRequireDefault(_block);\n\n\tvar _container = __webpack_require__(42);\n\n\tvar _container2 = _interopRequireDefault(_container);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar ListItem = function (_Block) {\n\t _inherits(ListItem, _Block);\n\n\t function ListItem() {\n\t _classCallCheck(this, ListItem);\n\n\t return _possibleConstructorReturn(this, (ListItem.__proto__ || Object.getPrototypeOf(ListItem)).apply(this, arguments));\n\t }\n\n\t _createClass(ListItem, [{\n\t key: 'format',\n\t value: function format(name, value) {\n\t if (name === List.blotName && !value) {\n\t this.replaceWith(_parchment2.default.create(this.statics.scope));\n\t } else {\n\t _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'format', this).call(this, name, value);\n\t }\n\t }\n\t }, {\n\t key: 'remove',\n\t value: function remove() {\n\t if (this.prev == null && this.next == null) {\n\t this.parent.remove();\n\t } else {\n\t _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'remove', this).call(this);\n\t }\n\t }\n\t }, {\n\t key: 'replaceWith',\n\t value: function replaceWith(name, value) {\n\t this.parent.isolate(this.offset(this.parent), this.length());\n\t if (name === this.parent.statics.blotName) {\n\t this.parent.replaceWith(name, value);\n\t return this;\n\t } else {\n\t this.parent.unwrap();\n\t return _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'replaceWith', this).call(this, name, value);\n\t }\n\t }\n\t }], [{\n\t key: 'formats',\n\t value: function formats(domNode) {\n\t return domNode.tagName === this.tagName ? undefined : _get(ListItem.__proto__ || Object.getPrototypeOf(ListItem), 'formats', this).call(this, domNode);\n\t }\n\t }]);\n\n\t return ListItem;\n\t}(_block2.default);\n\n\tListItem.blotName = 'list-item';\n\tListItem.tagName = 'LI';\n\n\tvar List = function (_Container) {\n\t _inherits(List, _Container);\n\n\t function List() {\n\t _classCallCheck(this, List);\n\n\t return _possibleConstructorReturn(this, (List.__proto__ || Object.getPrototypeOf(List)).apply(this, arguments));\n\t }\n\n\t _createClass(List, [{\n\t key: 'format',\n\t value: function format(name, value) {\n\t if (this.children.length > 0) {\n\t this.children.tail.format(name, value);\n\t }\n\t }\n\t }, {\n\t key: 'formats',\n\t value: function formats() {\n\t // We don't inherit from FormatBlot\n\t return _defineProperty({}, this.statics.blotName, this.statics.formats(this.domNode));\n\t }\n\t }, {\n\t key: 'insertBefore',\n\t value: function insertBefore(blot, ref) {\n\t if (blot instanceof ListItem) {\n\t _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'insertBefore', this).call(this, blot, ref);\n\t } else {\n\t var index = ref == null ? this.length() : ref.offset(this);\n\t var after = this.split(index);\n\t after.parent.insertBefore(blot, after);\n\t }\n\t }\n\t }, {\n\t key: 'optimize',\n\t value: function optimize() {\n\t _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'optimize', this).call(this);\n\t var next = this.next;\n\t if (next != null && next.prev === this && next.statics.blotName === this.statics.blotName && next.domNode.tagName === this.domNode.tagName && next.domNode.getAttribute('data-checked') === this.domNode.getAttribute('data-checked')) {\n\t next.moveChildren(this);\n\t next.remove();\n\t }\n\t }\n\t }, {\n\t key: 'replace',\n\t value: function replace(target) {\n\t if (target.statics.blotName !== this.statics.blotName) {\n\t var item = _parchment2.default.create(this.statics.defaultChild);\n\t target.moveChildren(item);\n\t this.appendChild(item);\n\t }\n\t _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'replace', this).call(this, target);\n\t }\n\t }], [{\n\t key: 'create',\n\t value: function create(value) {\n\t var tagName = value === 'ordered' ? 'OL' : 'UL';\n\t var node = _get(List.__proto__ || Object.getPrototypeOf(List), 'create', this).call(this, tagName);\n\t if (value === 'checked' || value === 'unchecked') {\n\t node.setAttribute('data-checked', value === 'checked');\n\t }\n\t return node;\n\t }\n\t }, {\n\t key: 'formats',\n\t value: function formats(domNode) {\n\t if (domNode.tagName === 'OL') return 'ordered';\n\t if (domNode.tagName === 'UL') {\n\t if (domNode.hasAttribute('data-checked')) {\n\t return domNode.getAttribute('data-checked') === 'true' ? 'checked' : 'unchecked';\n\t } else {\n\t return 'bullet';\n\t }\n\t }\n\t return undefined;\n\t }\n\t }]);\n\n\t return List;\n\t}(_container2.default);\n\n\tList.blotName = 'list';\n\tList.scope = _parchment2.default.Scope.BLOCK_BLOT;\n\tList.tagName = ['OL', 'UL'];\n\tList.defaultChild = 'list-item';\n\tList.allowedChildren = [ListItem];\n\n\texports.ListItem = ListItem;\n\texports.default = List;\n\n/***/ },\n/* 58 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _inline = __webpack_require__(32);\n\n\tvar _inline2 = _interopRequireDefault(_inline);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Bold = function (_Inline) {\n\t _inherits(Bold, _Inline);\n\n\t function Bold() {\n\t _classCallCheck(this, Bold);\n\n\t return _possibleConstructorReturn(this, (Bold.__proto__ || Object.getPrototypeOf(Bold)).apply(this, arguments));\n\t }\n\n\t _createClass(Bold, [{\n\t key: 'optimize',\n\t value: function optimize() {\n\t _get(Bold.prototype.__proto__ || Object.getPrototypeOf(Bold.prototype), 'optimize', this).call(this);\n\t if (this.domNode.tagName !== this.statics.tagName[0]) {\n\t this.replaceWith(this.statics.blotName);\n\t }\n\t }\n\t }], [{\n\t key: 'create',\n\t value: function create() {\n\t return _get(Bold.__proto__ || Object.getPrototypeOf(Bold), 'create', this).call(this);\n\t }\n\t }, {\n\t key: 'formats',\n\t value: function formats() {\n\t return true;\n\t }\n\t }]);\n\n\t return Bold;\n\t}(_inline2.default);\n\n\tBold.blotName = 'bold';\n\tBold.tagName = ['STRONG', 'B'];\n\n\texports.default = Bold;\n\n/***/ },\n/* 59 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _bold = __webpack_require__(58);\n\n\tvar _bold2 = _interopRequireDefault(_bold);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Italic = function (_Bold) {\n\t _inherits(Italic, _Bold);\n\n\t function Italic() {\n\t _classCallCheck(this, Italic);\n\n\t return _possibleConstructorReturn(this, (Italic.__proto__ || Object.getPrototypeOf(Italic)).apply(this, arguments));\n\t }\n\n\t return Italic;\n\t}(_bold2.default);\n\n\tItalic.blotName = 'italic';\n\tItalic.tagName = ['EM', 'I'];\n\n\texports.default = Italic;\n\n/***/ },\n/* 60 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.sanitize = exports.default = undefined;\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _inline = __webpack_require__(32);\n\n\tvar _inline2 = _interopRequireDefault(_inline);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Link = function (_Inline) {\n\t _inherits(Link, _Inline);\n\n\t function Link() {\n\t _classCallCheck(this, Link);\n\n\t return _possibleConstructorReturn(this, (Link.__proto__ || Object.getPrototypeOf(Link)).apply(this, arguments));\n\t }\n\n\t _createClass(Link, [{\n\t key: 'format',\n\t value: function format(name, value) {\n\t if (name !== this.statics.blotName || !value) return _get(Link.prototype.__proto__ || Object.getPrototypeOf(Link.prototype), 'format', this).call(this, name, value);\n\t value = this.constructor.sanitize(value);\n\t this.domNode.setAttribute('href', value);\n\t }\n\t }], [{\n\t key: 'create',\n\t value: function create(value) {\n\t var node = _get(Link.__proto__ || Object.getPrototypeOf(Link), 'create', this).call(this, value);\n\t value = this.sanitize(value);\n\t node.setAttribute('href', value);\n\t node.setAttribute('target', '_blank');\n\t return node;\n\t }\n\t }, {\n\t key: 'formats',\n\t value: function formats(domNode) {\n\t return domNode.getAttribute('href');\n\t }\n\t }, {\n\t key: 'sanitize',\n\t value: function sanitize(url) {\n\t return _sanitize(url, ['http', 'https', 'mailto']) ? url : this.SANITIZED_URL;\n\t }\n\t }]);\n\n\t return Link;\n\t}(_inline2.default);\n\n\tLink.blotName = 'link';\n\tLink.tagName = 'A';\n\tLink.SANITIZED_URL = 'about:blank';\n\n\tfunction _sanitize(url, protocols) {\n\t var anchor = document.createElement('a');\n\t anchor.href = url;\n\t var protocol = anchor.href.slice(0, anchor.href.indexOf(':'));\n\t return protocols.indexOf(protocol) > -1;\n\t}\n\n\texports.default = Link;\n\texports.sanitize = _sanitize;\n\n/***/ },\n/* 61 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _inline = __webpack_require__(32);\n\n\tvar _inline2 = _interopRequireDefault(_inline);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Script = function (_Inline) {\n\t _inherits(Script, _Inline);\n\n\t function Script() {\n\t _classCallCheck(this, Script);\n\n\t return _possibleConstructorReturn(this, (Script.__proto__ || Object.getPrototypeOf(Script)).apply(this, arguments));\n\t }\n\n\t _createClass(Script, null, [{\n\t key: 'create',\n\t value: function create(value) {\n\t if (value === 'super') {\n\t return document.createElement('sup');\n\t } else if (value === 'sub') {\n\t return document.createElement('sub');\n\t } else {\n\t return _get(Script.__proto__ || Object.getPrototypeOf(Script), 'create', this).call(this, value);\n\t }\n\t }\n\t }, {\n\t key: 'formats',\n\t value: function formats(domNode) {\n\t if (domNode.tagName === 'SUB') return 'sub';\n\t if (domNode.tagName === 'SUP') return 'super';\n\t return undefined;\n\t }\n\t }]);\n\n\t return Script;\n\t}(_inline2.default);\n\n\tScript.blotName = 'script';\n\tScript.tagName = ['SUB', 'SUP'];\n\n\texports.default = Script;\n\n/***/ },\n/* 62 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _inline = __webpack_require__(32);\n\n\tvar _inline2 = _interopRequireDefault(_inline);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Strike = function (_Inline) {\n\t _inherits(Strike, _Inline);\n\n\t function Strike() {\n\t _classCallCheck(this, Strike);\n\n\t return _possibleConstructorReturn(this, (Strike.__proto__ || Object.getPrototypeOf(Strike)).apply(this, arguments));\n\t }\n\n\t return Strike;\n\t}(_inline2.default);\n\n\tStrike.blotName = 'strike';\n\tStrike.tagName = 'S';\n\n\texports.default = Strike;\n\n/***/ },\n/* 63 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _inline = __webpack_require__(32);\n\n\tvar _inline2 = _interopRequireDefault(_inline);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar Underline = function (_Inline) {\n\t _inherits(Underline, _Inline);\n\n\t function Underline() {\n\t _classCallCheck(this, Underline);\n\n\t return _possibleConstructorReturn(this, (Underline.__proto__ || Object.getPrototypeOf(Underline)).apply(this, arguments));\n\t }\n\n\t return Underline;\n\t}(_inline2.default);\n\n\tUnderline.blotName = 'underline';\n\tUnderline.tagName = 'U';\n\n\texports.default = Underline;\n\n/***/ },\n/* 64 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _embed = __webpack_require__(31);\n\n\tvar _embed2 = _interopRequireDefault(_embed);\n\n\tvar _link = __webpack_require__(60);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar ATTRIBUTES = ['alt', 'height', 'width'];\n\n\tvar Image = function (_Embed) {\n\t _inherits(Image, _Embed);\n\n\t function Image() {\n\t _classCallCheck(this, Image);\n\n\t return _possibleConstructorReturn(this, (Image.__proto__ || Object.getPrototypeOf(Image)).apply(this, arguments));\n\t }\n\n\t _createClass(Image, [{\n\t key: 'format',\n\t value: function format(name, value) {\n\t if (ATTRIBUTES.indexOf(name) > -1) {\n\t if (value) {\n\t this.domNode.setAttribute(name, value);\n\t } else {\n\t this.domNode.removeAttribute(name);\n\t }\n\t } else {\n\t _get(Image.prototype.__proto__ || Object.getPrototypeOf(Image.prototype), 'format', this).call(this, name, value);\n\t }\n\t }\n\t }], [{\n\t key: 'create',\n\t value: function create(value) {\n\t var node = _get(Image.__proto__ || Object.getPrototypeOf(Image), 'create', this).call(this, value);\n\t if (typeof value === 'string') {\n\t node.setAttribute('src', this.sanitize(value));\n\t }\n\t return node;\n\t }\n\t }, {\n\t key: 'formats',\n\t value: function formats(domNode) {\n\t return ATTRIBUTES.reduce(function (formats, attribute) {\n\t if (domNode.hasAttribute(attribute)) {\n\t formats[attribute] = domNode.getAttribute(attribute);\n\t }\n\t return formats;\n\t }, {});\n\t }\n\t }, {\n\t key: 'match',\n\t value: function match(url) {\n\t return (/\\.(jpe?g|gif|png)$/.test(url) || /^data:image\\/.+;base64/.test(url)\n\t );\n\t }\n\t }, {\n\t key: 'sanitize',\n\t value: function sanitize(url) {\n\t return (0, _link.sanitize)(url, ['http', 'https', 'data']) ? url : '//:0';\n\t }\n\t }, {\n\t key: 'value',\n\t value: function value(domNode) {\n\t return domNode.getAttribute('src');\n\t }\n\t }]);\n\n\t return Image;\n\t}(_embed2.default);\n\n\tImage.blotName = 'image';\n\tImage.tagName = 'IMG';\n\n\texports.default = Image;\n\n/***/ },\n/* 65 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _block = __webpack_require__(29);\n\n\tvar _link = __webpack_require__(60);\n\n\tvar _link2 = _interopRequireDefault(_link);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar ATTRIBUTES = ['height', 'width'];\n\n\tvar Video = function (_BlockEmbed) {\n\t _inherits(Video, _BlockEmbed);\n\n\t function Video() {\n\t _classCallCheck(this, Video);\n\n\t return _possibleConstructorReturn(this, (Video.__proto__ || Object.getPrototypeOf(Video)).apply(this, arguments));\n\t }\n\n\t _createClass(Video, [{\n\t key: 'format',\n\t value: function format(name, value) {\n\t if (ATTRIBUTES.indexOf(name) > -1) {\n\t if (value) {\n\t this.domNode.setAttribute(name, value);\n\t } else {\n\t this.domNode.removeAttribute(name);\n\t }\n\t } else {\n\t _get(Video.prototype.__proto__ || Object.getPrototypeOf(Video.prototype), 'format', this).call(this, name, value);\n\t }\n\t }\n\t }], [{\n\t key: 'create',\n\t value: function create(value) {\n\t var node = _get(Video.__proto__ || Object.getPrototypeOf(Video), 'create', this).call(this, value);\n\t node.setAttribute('frameborder', '0');\n\t node.setAttribute('allowfullscreen', true);\n\t node.setAttribute('src', this.sanitize(value));\n\t return node;\n\t }\n\t }, {\n\t key: 'formats',\n\t value: function formats(domNode) {\n\t return ATTRIBUTES.reduce(function (formats, attribute) {\n\t if (domNode.hasAttribute(attribute)) {\n\t formats[attribute] = domNode.getAttribute(attribute);\n\t }\n\t return formats;\n\t }, {});\n\t }\n\t }, {\n\t key: 'sanitize',\n\t value: function sanitize(url) {\n\t return _link2.default.sanitize(url);\n\t }\n\t }, {\n\t key: 'value',\n\t value: function value(domNode) {\n\t return domNode.getAttribute('src');\n\t }\n\t }]);\n\n\t return Video;\n\t}(_block.BlockEmbed);\n\n\tVideo.blotName = 'video';\n\tVideo.className = 'ql-video';\n\tVideo.tagName = 'IFRAME';\n\n\texports.default = Video;\n\n/***/ },\n/* 66 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = exports.FormulaBlot = undefined;\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _embed = __webpack_require__(31);\n\n\tvar _embed2 = _interopRequireDefault(_embed);\n\n\tvar _quill = __webpack_require__(18);\n\n\tvar _quill2 = _interopRequireDefault(_quill);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar FormulaBlot = function (_Embed) {\n\t _inherits(FormulaBlot, _Embed);\n\n\t function FormulaBlot() {\n\t _classCallCheck(this, FormulaBlot);\n\n\t return _possibleConstructorReturn(this, (FormulaBlot.__proto__ || Object.getPrototypeOf(FormulaBlot)).apply(this, arguments));\n\t }\n\n\t _createClass(FormulaBlot, [{\n\t key: 'index',\n\t value: function index() {\n\t return 1;\n\t }\n\t }], [{\n\t key: 'create',\n\t value: function create(value) {\n\t var node = _get(FormulaBlot.__proto__ || Object.getPrototypeOf(FormulaBlot), 'create', this).call(this, value);\n\t if (typeof value === 'string') {\n\t window.katex.render(value, node);\n\t node.setAttribute('data-value', value);\n\t }\n\t node.setAttribute('contenteditable', false);\n\t return node;\n\t }\n\t }, {\n\t key: 'value',\n\t value: function value(domNode) {\n\t return domNode.getAttribute('data-value');\n\t }\n\t }]);\n\n\t return FormulaBlot;\n\t}(_embed2.default);\n\n\tFormulaBlot.blotName = 'formula';\n\tFormulaBlot.className = 'ql-formula';\n\tFormulaBlot.tagName = 'SPAN';\n\n\tfunction Formula() {\n\t if (window.katex == null) {\n\t throw new Error('Formula module requires KaTeX.');\n\t }\n\t _quill2.default.register(FormulaBlot, true);\n\t}\n\n\texports.FormulaBlot = FormulaBlot;\n\texports.default = Formula;\n\n/***/ },\n/* 67 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = exports.CodeToken = exports.CodeBlock = undefined;\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _quill = __webpack_require__(18);\n\n\tvar _quill2 = _interopRequireDefault(_quill);\n\n\tvar _module = __webpack_require__(39);\n\n\tvar _module2 = _interopRequireDefault(_module);\n\n\tvar _code = __webpack_require__(28);\n\n\tvar _code2 = _interopRequireDefault(_code);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar SyntaxCodeBlock = function (_CodeBlock) {\n\t _inherits(SyntaxCodeBlock, _CodeBlock);\n\n\t function SyntaxCodeBlock() {\n\t _classCallCheck(this, SyntaxCodeBlock);\n\n\t return _possibleConstructorReturn(this, (SyntaxCodeBlock.__proto__ || Object.getPrototypeOf(SyntaxCodeBlock)).apply(this, arguments));\n\t }\n\n\t _createClass(SyntaxCodeBlock, [{\n\t key: 'replaceWith',\n\t value: function replaceWith(block) {\n\t this.domNode.textContent = this.domNode.textContent;\n\t this.attach();\n\t _get(SyntaxCodeBlock.prototype.__proto__ || Object.getPrototypeOf(SyntaxCodeBlock.prototype), 'replaceWith', this).call(this, block);\n\t }\n\t }, {\n\t key: 'highlight',\n\t value: function highlight(_highlight) {\n\t if (this.cachedHTML !== this.domNode.innerHTML) {\n\t var text = this.domNode.textContent;\n\t if (text.trim().length > 0 || this.cachedHTML == null) {\n\t this.domNode.innerHTML = _highlight(text);\n\t this.attach();\n\t }\n\t this.cachedHTML = this.domNode.innerHTML;\n\t }\n\t }\n\t }]);\n\n\t return SyntaxCodeBlock;\n\t}(_code2.default);\n\n\tSyntaxCodeBlock.className = 'ql-syntax';\n\n\tvar CodeToken = new _parchment2.default.Attributor.Class('token', 'hljs', {\n\t scope: _parchment2.default.Scope.INLINE\n\t});\n\n\tvar Syntax = function (_Module) {\n\t _inherits(Syntax, _Module);\n\n\t function Syntax(quill, options) {\n\t _classCallCheck(this, Syntax);\n\n\t var _this2 = _possibleConstructorReturn(this, (Syntax.__proto__ || Object.getPrototypeOf(Syntax)).call(this, quill, options));\n\n\t if (typeof _this2.options.highlight !== 'function') {\n\t throw new Error('Syntax module requires highlight.js. Please include the library on the page before Quill.');\n\t }\n\t _quill2.default.register(CodeToken, true);\n\t _quill2.default.register(SyntaxCodeBlock, true);\n\t var timer = null;\n\t _this2.quill.on(_quill2.default.events.SCROLL_OPTIMIZE, function () {\n\t if (timer != null) return;\n\t timer = setTimeout(function () {\n\t _this2.highlight();\n\t timer = null;\n\t }, 100);\n\t });\n\t _this2.highlight();\n\t return _this2;\n\t }\n\n\t _createClass(Syntax, [{\n\t key: 'highlight',\n\t value: function highlight() {\n\t var _this3 = this;\n\n\t if (this.quill.selection.composing) return;\n\t var range = this.quill.getSelection();\n\t this.quill.scroll.descendants(SyntaxCodeBlock).forEach(function (code) {\n\t code.highlight(_this3.options.highlight);\n\t });\n\t this.quill.update(_quill2.default.sources.SILENT);\n\t if (range != null) {\n\t this.quill.setSelection(range, _quill2.default.sources.SILENT);\n\t }\n\t }\n\t }]);\n\n\t return Syntax;\n\t}(_module2.default);\n\n\tSyntax.DEFAULTS = {\n\t highlight: function () {\n\t if (window.hljs == null) return null;\n\t return function (text) {\n\t var result = window.hljs.highlightAuto(text);\n\t return result.value;\n\t };\n\t }()\n\t};\n\n\texports.CodeBlock = SyntaxCodeBlock;\n\texports.CodeToken = CodeToken;\n\texports.default = Syntax;\n\n/***/ },\n/* 68 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.addControls = exports.default = undefined;\n\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _quillDelta = __webpack_require__(20);\n\n\tvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\n\tvar _parchment = __webpack_require__(2);\n\n\tvar _parchment2 = _interopRequireDefault(_parchment);\n\n\tvar _quill = __webpack_require__(18);\n\n\tvar _quill2 = _interopRequireDefault(_quill);\n\n\tvar _logger = __webpack_require__(37);\n\n\tvar _logger2 = _interopRequireDefault(_logger);\n\n\tvar _module = __webpack_require__(39);\n\n\tvar _module2 = _interopRequireDefault(_module);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar debug = (0, _logger2.default)('quill:toolbar');\n\n\tvar Toolbar = function (_Module) {\n\t _inherits(Toolbar, _Module);\n\n\t function Toolbar(quill, options) {\n\t _classCallCheck(this, Toolbar);\n\n\t var _this = _possibleConstructorReturn(this, (Toolbar.__proto__ || Object.getPrototypeOf(Toolbar)).call(this, quill, options));\n\n\t if (Array.isArray(_this.options.container)) {\n\t var container = document.createElement('div');\n\t addControls(container, _this.options.container);\n\t quill.container.parentNode.insertBefore(container, quill.container);\n\t _this.container = container;\n\t } else if (typeof _this.options.container === 'string') {\n\t _this.container = document.querySelector(_this.options.container);\n\t } else {\n\t _this.container = _this.options.container;\n\t }\n\t if (!(_this.container instanceof HTMLElement)) {\n\t var _ret;\n\n\t return _ret = debug.error('Container required for toolbar', _this.options), _possibleConstructorReturn(_this, _ret);\n\t }\n\t _this.container.classList.add('ql-toolbar');\n\t _this.controls = [];\n\t _this.handlers = {};\n\t Object.keys(_this.options.handlers).forEach(function (format) {\n\t _this.addHandler(format, _this.options.handlers[format]);\n\t });\n\t [].forEach.call(_this.container.querySelectorAll('button, select'), function (input) {\n\t _this.attach(input);\n\t });\n\t _this.quill.on(_quill2.default.events.EDITOR_CHANGE, function (type, range) {\n\t if (type === _quill2.default.events.SELECTION_CHANGE) {\n\t _this.update(range);\n\t }\n\t });\n\t _this.quill.on(_quill2.default.events.SCROLL_OPTIMIZE, function () {\n\t var _this$quill$selection = _this.quill.selection.getRange(),\n\t _this$quill$selection2 = _slicedToArray(_this$quill$selection, 1),\n\t range = _this$quill$selection2[0]; // quill.getSelection triggers update\n\n\n\t _this.update(range);\n\t });\n\t return _this;\n\t }\n\n\t _createClass(Toolbar, [{\n\t key: 'addHandler',\n\t value: function addHandler(format, handler) {\n\t this.handlers[format] = handler;\n\t }\n\t }, {\n\t key: 'attach',\n\t value: function attach(input) {\n\t var _this2 = this;\n\n\t var format = [].find.call(input.classList, function (className) {\n\t return className.indexOf('ql-') === 0;\n\t });\n\t if (!format) return;\n\t format = format.slice('ql-'.length);\n\t if (input.tagName === 'BUTTON') {\n\t input.setAttribute('type', 'button');\n\t }\n\t if (this.handlers[format] == null) {\n\t if (this.quill.scroll.whitelist != null && this.quill.scroll.whitelist[format] == null) {\n\t debug.warn('ignoring attaching to disabled format', format, input);\n\t return;\n\t }\n\t if (_parchment2.default.query(format) == null) {\n\t debug.warn('ignoring attaching to nonexistent format', format, input);\n\t return;\n\t }\n\t }\n\t var eventName = input.tagName === 'SELECT' ? 'change' : 'click';\n\t input.addEventListener(eventName, function (e) {\n\t var value = void 0;\n\t if (input.tagName === 'SELECT') {\n\t if (input.selectedIndex < 0) return;\n\t var selected = input.options[input.selectedIndex];\n\t if (selected.hasAttribute('selected')) {\n\t value = false;\n\t } else {\n\t value = selected.value || false;\n\t }\n\t } else {\n\t if (input.classList.contains('ql-active')) {\n\t value = false;\n\t } else {\n\t value = input.value || !input.hasAttribute('value');\n\t }\n\t e.preventDefault();\n\t }\n\t _this2.quill.focus();\n\n\t var _quill$selection$getR = _this2.quill.selection.getRange(),\n\t _quill$selection$getR2 = _slicedToArray(_quill$selection$getR, 1),\n\t range = _quill$selection$getR2[0];\n\n\t if (_this2.handlers[format] != null) {\n\t _this2.handlers[format].call(_this2, value);\n\t } else if (_parchment2.default.query(format).prototype instanceof _parchment2.default.Embed) {\n\t value = prompt('Enter ' + format);\n\t if (!value) return;\n\t _this2.quill.updateContents(new _quillDelta2.default().retain(range.index).delete(range.length).insert(_defineProperty({}, format, value)), _quill2.default.sources.USER);\n\t } else {\n\t _this2.quill.format(format, value, _quill2.default.sources.USER);\n\t }\n\t _this2.update(range);\n\t });\n\t // TODO use weakmap\n\t this.controls.push([format, input]);\n\t }\n\t }, {\n\t key: 'update',\n\t value: function update(range) {\n\t var formats = range == null ? {} : this.quill.getFormat(range);\n\t this.controls.forEach(function (pair) {\n\t var _pair = _slicedToArray(pair, 2),\n\t format = _pair[0],\n\t input = _pair[1];\n\n\t if (input.tagName === 'SELECT') {\n\t var option = void 0;\n\t if (range == null) {\n\t option = null;\n\t } else if (formats[format] == null) {\n\t option = input.querySelector('option[selected]');\n\t } else if (!Array.isArray(formats[format])) {\n\t var value = formats[format];\n\t if (typeof value === 'string') {\n\t value = value.replace(/\\\"/g, '\\\\\"');\n\t }\n\t option = input.querySelector('option[value=\"' + value + '\"]');\n\t }\n\t if (option == null) {\n\t input.value = ''; // TODO make configurable?\n\t input.selectedIndex = -1;\n\t } else {\n\t option.selected = true;\n\t }\n\t } else {\n\t if (range == null) {\n\t input.classList.remove('ql-active');\n\t } else if (input.hasAttribute('value')) {\n\t // both being null should match (default values)\n\t // '1' should match with 1 (headers)\n\t var isActive = formats[format] === input.getAttribute('value') || formats[format] != null && formats[format].toString() === input.getAttribute('value') || formats[format] == null && !input.getAttribute('value');\n\t input.classList.toggle('ql-active', isActive);\n\t } else {\n\t input.classList.toggle('ql-active', formats[format] != null);\n\t }\n\t }\n\t });\n\t }\n\t }]);\n\n\t return Toolbar;\n\t}(_module2.default);\n\n\tToolbar.DEFAULTS = {};\n\n\tfunction addButton(container, format, value) {\n\t var input = document.createElement('button');\n\t input.setAttribute('type', 'button');\n\t input.classList.add('ql-' + format);\n\t if (value != null) {\n\t input.value = value;\n\t }\n\t container.appendChild(input);\n\t}\n\n\tfunction addControls(container, groups) {\n\t if (!Array.isArray(groups[0])) {\n\t groups = [groups];\n\t }\n\t groups.forEach(function (controls) {\n\t var group = document.createElement('span');\n\t group.classList.add('ql-formats');\n\t controls.forEach(function (control) {\n\t if (typeof control === 'string') {\n\t addButton(group, control);\n\t } else {\n\t var format = Object.keys(control)[0];\n\t var value = control[format];\n\t if (Array.isArray(value)) {\n\t addSelect(group, format, value);\n\t } else {\n\t addButton(group, format, value);\n\t }\n\t }\n\t });\n\t container.appendChild(group);\n\t });\n\t}\n\n\tfunction addSelect(container, format, values) {\n\t var input = document.createElement('select');\n\t input.classList.add('ql-' + format);\n\t values.forEach(function (value) {\n\t var option = document.createElement('option');\n\t if (value !== false) {\n\t option.setAttribute('value', value);\n\t } else {\n\t option.setAttribute('selected', 'selected');\n\t }\n\t input.appendChild(option);\n\t });\n\t container.appendChild(input);\n\t}\n\n\tToolbar.DEFAULTS = {\n\t container: null,\n\t handlers: {\n\t clean: function clean() {\n\t var _this3 = this;\n\n\t var range = this.quill.getSelection();\n\t if (range == null) return;\n\t if (range.length == 0) {\n\t var formats = this.quill.getFormat();\n\t Object.keys(formats).forEach(function (name) {\n\t // Clean functionality in existing apps only clean inline formats\n\t if (_parchment2.default.query(name, _parchment2.default.Scope.INLINE) != null) {\n\t _this3.quill.format(name, false);\n\t }\n\t });\n\t } else {\n\t this.quill.removeFormat(range, _quill2.default.sources.USER);\n\t }\n\t },\n\t direction: function direction(value) {\n\t var align = this.quill.getFormat()['align'];\n\t if (value === 'rtl' && align == null) {\n\t this.quill.format('align', 'right', _quill2.default.sources.USER);\n\t } else if (!value && align === 'right') {\n\t this.quill.format('align', false, _quill2.default.sources.USER);\n\t }\n\t this.quill.format('direction', value, _quill2.default.sources.USER);\n\t },\n\t link: function link(value) {\n\t if (value === true) {\n\t value = prompt('Enter link URL:');\n\t }\n\t this.quill.format('link', value, _quill2.default.sources.USER);\n\t },\n\t indent: function indent(value) {\n\t var range = this.quill.getSelection();\n\t var formats = this.quill.getFormat(range);\n\t var indent = parseInt(formats.indent || 0);\n\t if (value === '+1' || value === '-1') {\n\t var modifier = value === '+1' ? 1 : -1;\n\t if (formats.direction === 'rtl') modifier *= -1;\n\t this.quill.format('indent', indent + modifier, _quill2.default.sources.USER);\n\t }\n\t }\n\t }\n\t};\n\n\texports.default = Toolbar;\n\texports.addControls = addControls;\n\n/***/ },\n/* 69 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tmodule.exports = {\n\t 'align': {\n\t '': __webpack_require__(70),\n\t 'center': __webpack_require__(71),\n\t 'right': __webpack_require__(72),\n\t 'justify': __webpack_require__(73)\n\t },\n\t 'background': __webpack_require__(74),\n\t 'blockquote': __webpack_require__(75),\n\t 'bold': __webpack_require__(76),\n\t 'clean': __webpack_require__(77),\n\t 'code': __webpack_require__(78),\n\t 'code-block': __webpack_require__(78),\n\t 'color': __webpack_require__(79),\n\t 'direction': {\n\t '': __webpack_require__(80),\n\t 'rtl': __webpack_require__(81)\n\t },\n\t 'float': {\n\t 'center': __webpack_require__(82),\n\t 'full': __webpack_require__(83),\n\t 'left': __webpack_require__(84),\n\t 'right': __webpack_require__(85)\n\t },\n\t 'formula': __webpack_require__(86),\n\t 'header': {\n\t '1': __webpack_require__(87),\n\t '2': __webpack_require__(88)\n\t },\n\t 'italic': __webpack_require__(89),\n\t 'image': __webpack_require__(90),\n\t 'indent': {\n\t '+1': __webpack_require__(91),\n\t '-1': __webpack_require__(92)\n\t },\n\t 'link': __webpack_require__(93),\n\t 'list': {\n\t 'ordered': __webpack_require__(94),\n\t 'bullet': __webpack_require__(95),\n\t 'unchecked': __webpack_require__(96)\n\t },\n\t 'script': {\n\t 'sub': __webpack_require__(97),\n\t 'super': __webpack_require__(98)\n\t },\n\t 'strike': __webpack_require__(99),\n\t 'underline': __webpack_require__(100),\n\t 'video': __webpack_require__(101)\n\t};\n\n/***/ },\n/* 70 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 71 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 72 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 73 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 74 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 75 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 76 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 77 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 78 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 79 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 80 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 81 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 82 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 83 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 84 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 85 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 86 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 87 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 88 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 89 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 90 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 91 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 92 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 93 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 94 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 95 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 96 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 97 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 98 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 99 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 100 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 101 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 102 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _dropdown = __webpack_require__(103);\n\n\tvar _dropdown2 = _interopRequireDefault(_dropdown);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tvar Picker = function () {\n\t function Picker(select) {\n\t var _this = this;\n\n\t _classCallCheck(this, Picker);\n\n\t this.select = select;\n\t this.container = document.createElement('span');\n\t this.buildPicker();\n\t this.select.style.display = 'none';\n\t this.select.parentNode.insertBefore(this.container, this.select);\n\t this.label.addEventListener('click', function () {\n\t _this.container.classList.toggle('ql-expanded');\n\t });\n\t this.select.addEventListener('change', this.update.bind(this));\n\t }\n\n\t _createClass(Picker, [{\n\t key: 'buildItem',\n\t value: function buildItem(option) {\n\t var _this2 = this;\n\n\t var item = document.createElement('span');\n\t item.classList.add('ql-picker-item');\n\t if (option.hasAttribute('value')) {\n\t item.setAttribute('data-value', option.getAttribute('value'));\n\t }\n\t if (option.textContent) {\n\t item.setAttribute('data-label', option.textContent);\n\t }\n\t item.addEventListener('click', function () {\n\t _this2.selectItem(item, true);\n\t });\n\t return item;\n\t }\n\t }, {\n\t key: 'buildLabel',\n\t value: function buildLabel() {\n\t var label = document.createElement('span');\n\t label.classList.add('ql-picker-label');\n\t label.innerHTML = _dropdown2.default;\n\t this.container.appendChild(label);\n\t return label;\n\t }\n\t }, {\n\t key: 'buildOptions',\n\t value: function buildOptions() {\n\t var _this3 = this;\n\n\t var options = document.createElement('span');\n\t options.classList.add('ql-picker-options');\n\t [].slice.call(this.select.options).forEach(function (option) {\n\t var item = _this3.buildItem(option);\n\t options.appendChild(item);\n\t if (option.hasAttribute('selected')) {\n\t _this3.selectItem(item);\n\t }\n\t });\n\t this.container.appendChild(options);\n\t }\n\t }, {\n\t key: 'buildPicker',\n\t value: function buildPicker() {\n\t var _this4 = this;\n\n\t [].slice.call(this.select.attributes).forEach(function (item) {\n\t _this4.container.setAttribute(item.name, item.value);\n\t });\n\t this.container.classList.add('ql-picker');\n\t this.label = this.buildLabel();\n\t this.buildOptions();\n\t }\n\t }, {\n\t key: 'close',\n\t value: function close() {\n\t this.container.classList.remove('ql-expanded');\n\t }\n\t }, {\n\t key: 'selectItem',\n\t value: function selectItem(item) {\n\t var trigger = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n\t var selected = this.container.querySelector('.ql-selected');\n\t if (item === selected) return;\n\t if (selected != null) {\n\t selected.classList.remove('ql-selected');\n\t }\n\t if (item == null) return;\n\t item.classList.add('ql-selected');\n\t this.select.selectedIndex = [].indexOf.call(item.parentNode.children, item);\n\t if (item.hasAttribute('data-value')) {\n\t this.label.setAttribute('data-value', item.getAttribute('data-value'));\n\t } else {\n\t this.label.removeAttribute('data-value');\n\t }\n\t if (item.hasAttribute('data-label')) {\n\t this.label.setAttribute('data-label', item.getAttribute('data-label'));\n\t } else {\n\t this.label.removeAttribute('data-label');\n\t }\n\t if (trigger) {\n\t if (typeof Event === 'function') {\n\t this.select.dispatchEvent(new Event('change'));\n\t } else if ((typeof Event === 'undefined' ? 'undefined' : _typeof(Event)) === 'object') {\n\t // IE11\n\t var event = document.createEvent('Event');\n\t event.initEvent('change', true, true);\n\t this.select.dispatchEvent(event);\n\t }\n\t this.close();\n\t }\n\t }\n\t }, {\n\t key: 'update',\n\t value: function update() {\n\t var option = void 0;\n\t if (this.select.selectedIndex > -1) {\n\t var item = this.container.querySelector('.ql-picker-options').children[this.select.selectedIndex];\n\t option = this.select.options[this.select.selectedIndex];\n\t this.selectItem(item);\n\t } else {\n\t this.selectItem(null);\n\t }\n\t var isActive = option != null && option !== this.select.querySelector('option[selected]');\n\t this.label.classList.toggle('ql-active', isActive);\n\t }\n\t }]);\n\n\t return Picker;\n\t}();\n\n\texports.default = Picker;\n\n/***/ },\n/* 103 */\n/***/ function(module, exports) {\n\n\tmodule.exports = \" \";\n\n/***/ },\n/* 104 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _picker = __webpack_require__(102);\n\n\tvar _picker2 = _interopRequireDefault(_picker);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar ColorPicker = function (_Picker) {\n\t _inherits(ColorPicker, _Picker);\n\n\t function ColorPicker(select, label) {\n\t _classCallCheck(this, ColorPicker);\n\n\t var _this = _possibleConstructorReturn(this, (ColorPicker.__proto__ || Object.getPrototypeOf(ColorPicker)).call(this, select));\n\n\t _this.label.innerHTML = label;\n\t _this.container.classList.add('ql-color-picker');\n\t [].slice.call(_this.container.querySelectorAll('.ql-picker-item'), 0, 7).forEach(function (item) {\n\t item.classList.add('ql-primary');\n\t });\n\t return _this;\n\t }\n\n\t _createClass(ColorPicker, [{\n\t key: 'buildItem',\n\t value: function buildItem(option) {\n\t var item = _get(ColorPicker.prototype.__proto__ || Object.getPrototypeOf(ColorPicker.prototype), 'buildItem', this).call(this, option);\n\t item.style.backgroundColor = option.getAttribute('value') || '';\n\t return item;\n\t }\n\t }, {\n\t key: 'selectItem',\n\t value: function selectItem(item, trigger) {\n\t _get(ColorPicker.prototype.__proto__ || Object.getPrototypeOf(ColorPicker.prototype), 'selectItem', this).call(this, item, trigger);\n\t var colorLabel = this.label.querySelector('.ql-color-label');\n\t var value = item ? item.getAttribute('data-value') || '' : '';\n\t if (colorLabel) {\n\t if (colorLabel.tagName === 'line') {\n\t colorLabel.style.stroke = value;\n\t } else {\n\t colorLabel.style.fill = value;\n\t }\n\t }\n\t }\n\t }]);\n\n\t return ColorPicker;\n\t}(_picker2.default);\n\n\texports.default = ColorPicker;\n\n/***/ },\n/* 105 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _picker = __webpack_require__(102);\n\n\tvar _picker2 = _interopRequireDefault(_picker);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar IconPicker = function (_Picker) {\n\t _inherits(IconPicker, _Picker);\n\n\t function IconPicker(select, icons) {\n\t _classCallCheck(this, IconPicker);\n\n\t var _this = _possibleConstructorReturn(this, (IconPicker.__proto__ || Object.getPrototypeOf(IconPicker)).call(this, select));\n\n\t _this.container.classList.add('ql-icon-picker');\n\t [].forEach.call(_this.container.querySelectorAll('.ql-picker-item'), function (item) {\n\t item.innerHTML = icons[item.getAttribute('data-value') || ''];\n\t });\n\t _this.defaultItem = _this.container.querySelector('.ql-selected');\n\t _this.selectItem(_this.defaultItem);\n\t return _this;\n\t }\n\n\t _createClass(IconPicker, [{\n\t key: 'selectItem',\n\t value: function selectItem(item, trigger) {\n\t _get(IconPicker.prototype.__proto__ || Object.getPrototypeOf(IconPicker.prototype), 'selectItem', this).call(this, item, trigger);\n\t item = item || this.defaultItem;\n\t this.label.innerHTML = item.innerHTML;\n\t }\n\t }]);\n\n\t return IconPicker;\n\t}(_picker2.default);\n\n\texports.default = IconPicker;\n\n/***/ },\n/* 106 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tvar Tooltip = function () {\n\t function Tooltip(quill, boundsContainer) {\n\t var _this = this;\n\n\t _classCallCheck(this, Tooltip);\n\n\t this.quill = quill;\n\t this.boundsContainer = boundsContainer || document.body;\n\t this.root = quill.addContainer('ql-tooltip');\n\t this.root.innerHTML = this.constructor.TEMPLATE;\n\t var offset = parseInt(window.getComputedStyle(this.root).marginTop);\n\t this.quill.root.addEventListener('scroll', function () {\n\t _this.root.style.marginTop = -1 * _this.quill.root.scrollTop + offset + 'px';\n\t _this.checkBounds();\n\t });\n\t this.hide();\n\t }\n\n\t _createClass(Tooltip, [{\n\t key: 'checkBounds',\n\t value: function checkBounds() {\n\t this.root.classList.toggle('ql-out-top', this.root.offsetTop <= 0);\n\t this.root.classList.remove('ql-out-bottom');\n\t this.root.classList.toggle('ql-out-bottom', this.root.offsetTop + this.root.offsetHeight >= this.quill.root.offsetHeight);\n\t }\n\t }, {\n\t key: 'hide',\n\t value: function hide() {\n\t this.root.classList.add('ql-hidden');\n\t }\n\t }, {\n\t key: 'position',\n\t value: function position(reference) {\n\t var left = reference.left + reference.width / 2 - this.root.offsetWidth / 2;\n\t var top = reference.bottom + this.quill.root.scrollTop;\n\t this.root.style.left = left + 'px';\n\t this.root.style.top = top + 'px';\n\t var containerBounds = this.boundsContainer.getBoundingClientRect();\n\t var rootBounds = this.root.getBoundingClientRect();\n\t var shift = 0;\n\t if (rootBounds.right > containerBounds.right) {\n\t shift = containerBounds.right - rootBounds.right;\n\t this.root.style.left = left + shift + 'px';\n\t }\n\t if (rootBounds.left < containerBounds.left) {\n\t shift = containerBounds.left - rootBounds.left;\n\t this.root.style.left = left + shift + 'px';\n\t }\n\t this.checkBounds();\n\t return shift;\n\t }\n\t }, {\n\t key: 'show',\n\t value: function show() {\n\t this.root.classList.remove('ql-editing');\n\t this.root.classList.remove('ql-hidden');\n\t }\n\t }]);\n\n\t return Tooltip;\n\t}();\n\n\texports.default = Tooltip;\n\n/***/ },\n/* 107 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = exports.BubbleTooltip = undefined;\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _extend = __webpack_require__(25);\n\n\tvar _extend2 = _interopRequireDefault(_extend);\n\n\tvar _emitter = __webpack_require__(35);\n\n\tvar _emitter2 = _interopRequireDefault(_emitter);\n\n\tvar _base = __webpack_require__(108);\n\n\tvar _base2 = _interopRequireDefault(_base);\n\n\tvar _selection = __webpack_require__(40);\n\n\tvar _icons = __webpack_require__(69);\n\n\tvar _icons2 = _interopRequireDefault(_icons);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar TOOLBAR_CONFIG = [['bold', 'italic', 'link'], [{ header: 1 }, { header: 2 }, 'blockquote']];\n\n\tvar BubbleTheme = function (_BaseTheme) {\n\t _inherits(BubbleTheme, _BaseTheme);\n\n\t function BubbleTheme(quill, options) {\n\t _classCallCheck(this, BubbleTheme);\n\n\t if (options.modules.toolbar != null && options.modules.toolbar.container == null) {\n\t options.modules.toolbar.container = TOOLBAR_CONFIG;\n\t }\n\n\t var _this = _possibleConstructorReturn(this, (BubbleTheme.__proto__ || Object.getPrototypeOf(BubbleTheme)).call(this, quill, options));\n\n\t _this.quill.container.classList.add('ql-bubble');\n\t return _this;\n\t }\n\n\t _createClass(BubbleTheme, [{\n\t key: 'extendToolbar',\n\t value: function extendToolbar(toolbar) {\n\t this.tooltip = new BubbleTooltip(this.quill, this.options.bounds);\n\t this.tooltip.root.appendChild(toolbar.container);\n\t this.buildButtons([].slice.call(toolbar.container.querySelectorAll('button')), _icons2.default);\n\t this.buildPickers([].slice.call(toolbar.container.querySelectorAll('select')), _icons2.default);\n\t }\n\t }]);\n\n\t return BubbleTheme;\n\t}(_base2.default);\n\n\tBubbleTheme.DEFAULTS = (0, _extend2.default)(true, {}, _base2.default.DEFAULTS, {\n\t modules: {\n\t toolbar: {\n\t handlers: {\n\t link: function link(value) {\n\t if (!value) {\n\t this.quill.format('link', false);\n\t } else {\n\t this.quill.theme.tooltip.edit();\n\t }\n\t }\n\t }\n\t }\n\t }\n\t});\n\n\tvar BubbleTooltip = function (_BaseTooltip) {\n\t _inherits(BubbleTooltip, _BaseTooltip);\n\n\t function BubbleTooltip(quill, bounds) {\n\t _classCallCheck(this, BubbleTooltip);\n\n\t var _this2 = _possibleConstructorReturn(this, (BubbleTooltip.__proto__ || Object.getPrototypeOf(BubbleTooltip)).call(this, quill, bounds));\n\n\t _this2.quill.on(_emitter2.default.events.EDITOR_CHANGE, function (type, range) {\n\t if (type !== _emitter2.default.events.SELECTION_CHANGE) return;\n\t if (range != null && range.length > 0) {\n\t _this2.show();\n\t // Lock our width so we will expand beyond our offsetParent boundaries\n\t _this2.root.style.left = '0px';\n\t _this2.root.style.width = '';\n\t _this2.root.style.width = _this2.root.offsetWidth + 'px';\n\t var lines = _this2.quill.scroll.lines(range.index, range.length);\n\t if (lines.length === 1) {\n\t _this2.position(_this2.quill.getBounds(range));\n\t } else {\n\t var lastLine = lines[lines.length - 1];\n\t var index = lastLine.offset(_this2.quill.scroll);\n\t var length = Math.min(lastLine.length() - 1, range.index + range.length - index);\n\t var _bounds = _this2.quill.getBounds(new _selection.Range(index, length));\n\t _this2.position(_bounds);\n\t }\n\t } else if (document.activeElement !== _this2.textbox && _this2.quill.hasFocus()) {\n\t _this2.hide();\n\t }\n\t });\n\t return _this2;\n\t }\n\n\t _createClass(BubbleTooltip, [{\n\t key: 'listen',\n\t value: function listen() {\n\t var _this3 = this;\n\n\t _get(BubbleTooltip.prototype.__proto__ || Object.getPrototypeOf(BubbleTooltip.prototype), 'listen', this).call(this);\n\t this.root.querySelector('.ql-close').addEventListener('click', function () {\n\t _this3.root.classList.remove('ql-editing');\n\t });\n\t this.quill.on(_emitter2.default.events.SCROLL_OPTIMIZE, function () {\n\t // Let selection be restored by toolbar handlers before repositioning\n\t setTimeout(function () {\n\t if (_this3.root.classList.contains('ql-hidden')) return;\n\t var range = _this3.quill.getSelection();\n\t if (range != null) {\n\t _this3.position(_this3.quill.getBounds(range));\n\t }\n\t }, 1);\n\t });\n\t }\n\t }, {\n\t key: 'cancel',\n\t value: function cancel() {\n\t this.show();\n\t }\n\t }, {\n\t key: 'position',\n\t value: function position(reference) {\n\t var shift = _get(BubbleTooltip.prototype.__proto__ || Object.getPrototypeOf(BubbleTooltip.prototype), 'position', this).call(this, reference);\n\t var arrow = this.root.querySelector('.ql-tooltip-arrow');\n\t arrow.style.marginLeft = '';\n\t if (shift === 0) return shift;\n\t arrow.style.marginLeft = -1 * shift - arrow.offsetWidth / 2 + 'px';\n\t }\n\t }]);\n\n\t return BubbleTooltip;\n\t}(_base.BaseTooltip);\n\n\tBubbleTooltip.TEMPLATE = ['', '
', '', '', '
'].join('');\n\n\texports.BubbleTooltip = BubbleTooltip;\n\texports.default = BubbleTheme;\n\n/***/ },\n/* 108 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports.default = exports.BaseTooltip = undefined;\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _extend = __webpack_require__(25);\n\n\tvar _extend2 = _interopRequireDefault(_extend);\n\n\tvar _quillDelta = __webpack_require__(20);\n\n\tvar _quillDelta2 = _interopRequireDefault(_quillDelta);\n\n\tvar _emitter = __webpack_require__(35);\n\n\tvar _emitter2 = _interopRequireDefault(_emitter);\n\n\tvar _keyboard = __webpack_require__(52);\n\n\tvar _keyboard2 = _interopRequireDefault(_keyboard);\n\n\tvar _theme = __webpack_require__(41);\n\n\tvar _theme2 = _interopRequireDefault(_theme);\n\n\tvar _colorPicker = __webpack_require__(104);\n\n\tvar _colorPicker2 = _interopRequireDefault(_colorPicker);\n\n\tvar _iconPicker = __webpack_require__(105);\n\n\tvar _iconPicker2 = _interopRequireDefault(_iconPicker);\n\n\tvar _picker = __webpack_require__(102);\n\n\tvar _picker2 = _interopRequireDefault(_picker);\n\n\tvar _tooltip = __webpack_require__(106);\n\n\tvar _tooltip2 = _interopRequireDefault(_tooltip);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar ALIGNS = [false, 'center', 'right', 'justify'];\n\n\tvar COLORS = [\"#000000\", \"#e60000\", \"#ff9900\", \"#ffff00\", \"#008a00\", \"#0066cc\", \"#9933ff\", \"#ffffff\", \"#facccc\", \"#ffebcc\", \"#ffffcc\", \"#cce8cc\", \"#cce0f5\", \"#ebd6ff\", \"#bbbbbb\", \"#f06666\", \"#ffc266\", \"#ffff66\", \"#66b966\", \"#66a3e0\", \"#c285ff\", \"#888888\", \"#a10000\", \"#b26b00\", \"#b2b200\", \"#006100\", \"#0047b2\", \"#6b24b2\", \"#444444\", \"#5c0000\", \"#663d00\", \"#666600\", \"#003700\", \"#002966\", \"#3d1466\"];\n\n\tvar FONTS = [false, 'serif', 'monospace'];\n\n\tvar HEADERS = ['1', '2', '3', false];\n\n\tvar SIZES = ['small', false, 'large', 'huge'];\n\n\tvar BaseTheme = function (_Theme) {\n\t _inherits(BaseTheme, _Theme);\n\n\t function BaseTheme(quill, options) {\n\t _classCallCheck(this, BaseTheme);\n\n\t var _this = _possibleConstructorReturn(this, (BaseTheme.__proto__ || Object.getPrototypeOf(BaseTheme)).call(this, quill, options));\n\n\t var listener = function listener(e) {\n\t if (!document.body.contains(quill.root)) {\n\t return document.body.removeEventListener('click', listener);\n\t }\n\t if (_this.tooltip != null && !_this.tooltip.root.contains(e.target) && document.activeElement !== _this.tooltip.textbox && !_this.quill.hasFocus()) {\n\t _this.tooltip.hide();\n\t }\n\t if (_this.pickers != null) {\n\t _this.pickers.forEach(function (picker) {\n\t if (!picker.container.contains(e.target)) {\n\t picker.close();\n\t }\n\t });\n\t }\n\t };\n\t document.body.addEventListener('click', listener);\n\t return _this;\n\t }\n\n\t _createClass(BaseTheme, [{\n\t key: 'addModule',\n\t value: function addModule(name) {\n\t var module = _get(BaseTheme.prototype.__proto__ || Object.getPrototypeOf(BaseTheme.prototype), 'addModule', this).call(this, name);\n\t if (name === 'toolbar') {\n\t this.extendToolbar(module);\n\t }\n\t return module;\n\t }\n\t }, {\n\t key: 'buildButtons',\n\t value: function buildButtons(buttons, icons) {\n\t buttons.forEach(function (button) {\n\t var className = button.getAttribute('class') || '';\n\t className.split(/\\s+/).forEach(function (name) {\n\t if (!name.startsWith('ql-')) return;\n\t name = name.slice('ql-'.length);\n\t if (icons[name] == null) return;\n\t if (name === 'direction') {\n\t button.innerHTML = icons[name][''] + icons[name]['rtl'];\n\t } else if (typeof icons[name] === 'string') {\n\t button.innerHTML = icons[name];\n\t } else {\n\t var value = button.value || '';\n\t if (value != null && icons[name][value]) {\n\t button.innerHTML = icons[name][value];\n\t }\n\t }\n\t });\n\t });\n\t }\n\t }, {\n\t key: 'buildPickers',\n\t value: function buildPickers(selects, icons) {\n\t var _this2 = this;\n\n\t this.pickers = selects.map(function (select) {\n\t if (select.classList.contains('ql-align')) {\n\t if (select.querySelector('option') == null) {\n\t fillSelect(select, ALIGNS);\n\t }\n\t return new _iconPicker2.default(select, icons.align);\n\t } else if (select.classList.contains('ql-background') || select.classList.contains('ql-color')) {\n\t var format = select.classList.contains('ql-background') ? 'background' : 'color';\n\t if (select.querySelector('option') == null) {\n\t fillSelect(select, COLORS, format === 'background' ? '#ffffff' : '#000000');\n\t }\n\t return new _colorPicker2.default(select, icons[format]);\n\t } else {\n\t if (select.querySelector('option') == null) {\n\t if (select.classList.contains('ql-font')) {\n\t fillSelect(select, FONTS);\n\t } else if (select.classList.contains('ql-header')) {\n\t fillSelect(select, HEADERS);\n\t } else if (select.classList.contains('ql-size')) {\n\t fillSelect(select, SIZES);\n\t }\n\t }\n\t return new _picker2.default(select);\n\t }\n\t });\n\t var update = function update() {\n\t _this2.pickers.forEach(function (picker) {\n\t picker.update();\n\t });\n\t };\n\t this.quill.on(_emitter2.default.events.SELECTION_CHANGE, update).on(_emitter2.default.events.SCROLL_OPTIMIZE, update);\n\t }\n\t }]);\n\n\t return BaseTheme;\n\t}(_theme2.default);\n\n\tBaseTheme.DEFAULTS = (0, _extend2.default)(true, {}, _theme2.default.DEFAULTS, {\n\t modules: {\n\t toolbar: {\n\t handlers: {\n\t formula: function formula() {\n\t this.quill.theme.tooltip.edit('formula');\n\t },\n\t image: function image() {\n\t var _this3 = this;\n\n\t var fileInput = this.container.querySelector('input.ql-image[type=file]');\n\t if (fileInput == null) {\n\t fileInput = document.createElement('input');\n\t fileInput.setAttribute('type', 'file');\n\t fileInput.setAttribute('accept', 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon, image/svg+xml');\n\t fileInput.classList.add('ql-image');\n\t fileInput.addEventListener('change', function () {\n\t if (fileInput.files != null && fileInput.files[0] != null) {\n\t var reader = new FileReader();\n\t reader.onload = function (e) {\n\t var range = _this3.quill.getSelection(true);\n\t _this3.quill.updateContents(new _quillDelta2.default().retain(range.index).delete(range.length).insert({ image: e.target.result }), _emitter2.default.sources.USER);\n\t fileInput.value = \"\";\n\t };\n\t reader.readAsDataURL(fileInput.files[0]);\n\t }\n\t });\n\t this.container.appendChild(fileInput);\n\t }\n\t fileInput.click();\n\t },\n\t video: function video() {\n\t this.quill.theme.tooltip.edit('video');\n\t }\n\t }\n\t }\n\t }\n\t});\n\n\tvar BaseTooltip = function (_Tooltip) {\n\t _inherits(BaseTooltip, _Tooltip);\n\n\t function BaseTooltip(quill, boundsContainer) {\n\t _classCallCheck(this, BaseTooltip);\n\n\t var _this4 = _possibleConstructorReturn(this, (BaseTooltip.__proto__ || Object.getPrototypeOf(BaseTooltip)).call(this, quill, boundsContainer));\n\n\t _this4.textbox = _this4.root.querySelector('input[type=\"text\"]');\n\t _this4.listen();\n\t return _this4;\n\t }\n\n\t _createClass(BaseTooltip, [{\n\t key: 'listen',\n\t value: function listen() {\n\t var _this5 = this;\n\n\t this.textbox.addEventListener('keydown', function (event) {\n\t if (_keyboard2.default.match(event, 'enter')) {\n\t _this5.save();\n\t event.preventDefault();\n\t } else if (_keyboard2.default.match(event, 'escape')) {\n\t _this5.cancel();\n\t event.preventDefault();\n\t }\n\t });\n\t }\n\t }, {\n\t key: 'cancel',\n\t value: function cancel() {\n\t this.hide();\n\t }\n\t }, {\n\t key: 'edit',\n\t value: function edit() {\n\t var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'link';\n\t var preview = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n\t this.root.classList.remove('ql-hidden');\n\t this.root.classList.add('ql-editing');\n\t if (preview != null) {\n\t this.textbox.value = preview;\n\t } else if (mode !== this.root.getAttribute('data-mode')) {\n\t this.textbox.value = '';\n\t }\n\t this.position(this.quill.getBounds(this.quill.selection.savedRange));\n\t this.textbox.select();\n\t this.textbox.setAttribute('placeholder', this.textbox.getAttribute('data-' + mode) || '');\n\t this.root.setAttribute('data-mode', mode);\n\t }\n\t }, {\n\t key: 'restoreFocus',\n\t value: function restoreFocus() {\n\t var scrollTop = this.quill.root.scrollTop;\n\t this.quill.focus();\n\t this.quill.root.scrollTop = scrollTop;\n\t }\n\t }, {\n\t key: 'save',\n\t value: function save() {\n\t var value = this.textbox.value;\n\t switch (this.root.getAttribute('data-mode')) {\n\t case 'link':\n\t {\n\t var scrollTop = this.quill.root.scrollTop;\n\t if (this.linkRange) {\n\t this.quill.formatText(this.linkRange, 'link', value, _emitter2.default.sources.USER);\n\t delete this.linkRange;\n\t } else {\n\t this.restoreFocus();\n\t this.quill.format('link', value, _emitter2.default.sources.USER);\n\t }\n\t this.quill.root.scrollTop = scrollTop;\n\t break;\n\t }\n\t case 'video':\n\t {\n\t var match = value.match(/^(https?):\\/\\/(www\\.)?youtube\\.com\\/watch.*v=([a-zA-Z0-9_-]+)/) || value.match(/^(https?):\\/\\/(www\\.)?youtu\\.be\\/([a-zA-Z0-9_-]+)/);\n\t if (match) {\n\t value = match[1] + '://www.youtube.com/embed/' + match[3] + '?showinfo=0';\n\t } else if (match = value.match(/^(https?):\\/\\/(www\\.)?vimeo\\.com\\/(\\d+)/)) {\n\t // eslint-disable-line no-cond-assign\n\t value = match[1] + '://player.vimeo.com/video/' + match[3] + '/';\n\t }\n\t } // eslint-disable-next-line no-fallthrough\n\t case 'formula':\n\t {\n\t var range = this.quill.getSelection(true);\n\t var index = range.index + range.length;\n\t if (range != null) {\n\t this.quill.insertEmbed(index, this.root.getAttribute('data-mode'), value, _emitter2.default.sources.USER);\n\t if (this.root.getAttribute('data-mode') === 'formula') {\n\t this.quill.insertText(index + 1, ' ', _emitter2.default.sources.USER);\n\t }\n\t this.quill.setSelection(index + 2, _emitter2.default.sources.USER);\n\t }\n\t break;\n\t }\n\t default:\n\t }\n\t this.textbox.value = '';\n\t this.hide();\n\t }\n\t }]);\n\n\t return BaseTooltip;\n\t}(_tooltip2.default);\n\n\tfunction fillSelect(select, values) {\n\t var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n\t values.forEach(function (value) {\n\t var option = document.createElement('option');\n\t if (value === defaultValue) {\n\t option.setAttribute('selected', 'selected');\n\t } else {\n\t option.setAttribute('value', value);\n\t }\n\t select.appendChild(option);\n\t });\n\t}\n\n\texports.BaseTooltip = BaseTooltip;\n\texports.default = BaseTheme;\n\n/***/ },\n/* 109 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\n\tvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\n\tvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n\tvar _extend = __webpack_require__(25);\n\n\tvar _extend2 = _interopRequireDefault(_extend);\n\n\tvar _emitter = __webpack_require__(35);\n\n\tvar _emitter2 = _interopRequireDefault(_emitter);\n\n\tvar _base = __webpack_require__(108);\n\n\tvar _base2 = _interopRequireDefault(_base);\n\n\tvar _link = __webpack_require__(60);\n\n\tvar _link2 = _interopRequireDefault(_link);\n\n\tvar _selection = __webpack_require__(40);\n\n\tvar _icons = __webpack_require__(69);\n\n\tvar _icons2 = _interopRequireDefault(_icons);\n\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\tfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n\tvar TOOLBAR_CONFIG = [[{ header: ['1', '2', '3', false] }], ['bold', 'italic', 'underline', 'link'], [{ list: 'ordered' }, { list: 'bullet' }], ['clean']];\n\n\tvar SnowTheme = function (_BaseTheme) {\n\t _inherits(SnowTheme, _BaseTheme);\n\n\t function SnowTheme(quill, options) {\n\t _classCallCheck(this, SnowTheme);\n\n\t if (options.modules.toolbar != null && options.modules.toolbar.container == null) {\n\t options.modules.toolbar.container = TOOLBAR_CONFIG;\n\t }\n\n\t var _this = _possibleConstructorReturn(this, (SnowTheme.__proto__ || Object.getPrototypeOf(SnowTheme)).call(this, quill, options));\n\n\t _this.quill.container.classList.add('ql-snow');\n\t return _this;\n\t }\n\n\t _createClass(SnowTheme, [{\n\t key: 'extendToolbar',\n\t value: function extendToolbar(toolbar) {\n\t toolbar.container.classList.add('ql-snow');\n\t this.buildButtons([].slice.call(toolbar.container.querySelectorAll('button')), _icons2.default);\n\t this.buildPickers([].slice.call(toolbar.container.querySelectorAll('select')), _icons2.default);\n\t this.tooltip = new SnowTooltip(this.quill, this.options.bounds);\n\t if (toolbar.container.querySelector('.ql-link')) {\n\t this.quill.keyboard.addBinding({ key: 'K', shortKey: true }, function (range, context) {\n\t toolbar.handlers['link'].call(toolbar, !context.format.link);\n\t });\n\t }\n\t }\n\t }]);\n\n\t return SnowTheme;\n\t}(_base2.default);\n\n\tSnowTheme.DEFAULTS = (0, _extend2.default)(true, {}, _base2.default.DEFAULTS, {\n\t modules: {\n\t toolbar: {\n\t handlers: {\n\t link: function link(value) {\n\t if (value) {\n\t var range = this.quill.getSelection();\n\t if (range == null || range.length == 0) return;\n\t var preview = this.quill.getText(range);\n\t if (/^\\S+@\\S+\\.\\S+$/.test(preview) && preview.indexOf('mailto:') !== 0) {\n\t preview = 'mailto:' + preview;\n\t }\n\t var tooltip = this.quill.theme.tooltip;\n\t tooltip.edit('link', preview);\n\t } else {\n\t this.quill.format('link', false);\n\t }\n\t }\n\t }\n\t }\n\t }\n\t});\n\n\tvar SnowTooltip = function (_BaseTooltip) {\n\t _inherits(SnowTooltip, _BaseTooltip);\n\n\t function SnowTooltip(quill, bounds) {\n\t _classCallCheck(this, SnowTooltip);\n\n\t var _this2 = _possibleConstructorReturn(this, (SnowTooltip.__proto__ || Object.getPrototypeOf(SnowTooltip)).call(this, quill, bounds));\n\n\t _this2.preview = _this2.root.querySelector('a.ql-preview');\n\t return _this2;\n\t }\n\n\t _createClass(SnowTooltip, [{\n\t key: 'listen',\n\t value: function listen() {\n\t var _this3 = this;\n\n\t _get(SnowTooltip.prototype.__proto__ || Object.getPrototypeOf(SnowTooltip.prototype), 'listen', this).call(this);\n\t this.root.querySelector('a.ql-action').addEventListener('click', function (event) {\n\t if (_this3.root.classList.contains('ql-editing')) {\n\t _this3.save();\n\t } else {\n\t _this3.edit('link', _this3.preview.textContent);\n\t }\n\t event.preventDefault();\n\t });\n\t this.root.querySelector('a.ql-remove').addEventListener('click', function (event) {\n\t if (_this3.linkRange != null) {\n\t _this3.restoreFocus();\n\t _this3.quill.formatText(_this3.linkRange, 'link', false, _emitter2.default.sources.USER);\n\t delete _this3.linkRange;\n\t }\n\t event.preventDefault();\n\t _this3.hide();\n\t });\n\t this.quill.on(_emitter2.default.events.SELECTION_CHANGE, function (range) {\n\t if (range == null) return;\n\t if (range.length === 0) {\n\t var _quill$scroll$descend = _this3.quill.scroll.descendant(_link2.default, range.index),\n\t _quill$scroll$descend2 = _slicedToArray(_quill$scroll$descend, 2),\n\t link = _quill$scroll$descend2[0],\n\t offset = _quill$scroll$descend2[1];\n\n\t if (link != null) {\n\t _this3.linkRange = new _selection.Range(range.index - offset, link.length());\n\t var preview = _link2.default.formats(link.domNode);\n\t _this3.preview.textContent = preview;\n\t _this3.preview.setAttribute('href', preview);\n\t _this3.show();\n\t _this3.position(_this3.quill.getBounds(_this3.linkRange));\n\t return;\n\t }\n\t } else {\n\t delete _this3.linkRange;\n\t }\n\t _this3.hide();\n\t });\n\t }\n\t }, {\n\t key: 'show',\n\t value: function show() {\n\t _get(SnowTooltip.prototype.__proto__ || Object.getPrototypeOf(SnowTooltip.prototype), 'show', this).call(this);\n\t this.root.removeAttribute('data-mode');\n\t }\n\t }]);\n\n\t return SnowTooltip;\n\t}(_base.BaseTooltip);\n\n\tSnowTooltip.TEMPLATE = ['', '', '', ''].join('');\n\n\texports.default = SnowTheme;\n\n/***/ }\n/******/ ])\n});\n;"],"x_google_ignoreList":[]}