From a603b942dc100df1a85e548182d88eec748958e8 Mon Sep 17 00:00:00 2001 From: Andrew Kos Date: Tue, 27 Sep 2016 15:46:22 -0500 Subject: [PATCH] build for tag: 2.9.4 --- dist/404.html | 157 + dist/favicon.ico | Bin 0 -> 4286 bytes dist/fonts/fontawesome-webfont.eot | Bin 0 -> 68875 bytes dist/fonts/fontawesome-webfont.svg | 640 + dist/fonts/fontawesome-webfont.ttf | Bin 0 -> 138204 bytes dist/fonts/fontawesome-webfont.woff | Bin 0 -> 81284 bytes dist/fonts/fontawesome-webfont.woff2 | Bin 0 -> 64464 bytes dist/fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes dist/fonts/glyphicons-halflings-regular.svg | 288 + dist/fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes dist/fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes dist/fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes dist/index.html | 450 + dist/scripts/scripts.js | 13962 ++ dist/scripts/scripts.min.js | 9 + dist/scripts/scripts.min.js.1475009181079.map | 1 + dist/scripts/templates.js | 7 + dist/scripts/templates.js.1475009180807.map | 1 + dist/scripts/vendor.js | 118299 +++++++++++++++ dist/styles/Jcrop.gif | Bin 0 -> 329 bytes dist/styles/font-awesome.min.css | 4 + dist/styles/main.css | 1 + dist/styles/vendor.css | 5 + dist/swf/ZeroClipboard.swf | Bin 0 -> 6580 bytes 24 files changed, 133824 insertions(+) create mode 100644 dist/404.html create mode 100644 dist/favicon.ico create mode 100644 dist/fonts/fontawesome-webfont.eot create mode 100644 dist/fonts/fontawesome-webfont.svg create mode 100644 dist/fonts/fontawesome-webfont.ttf create mode 100644 dist/fonts/fontawesome-webfont.woff create mode 100644 dist/fonts/fontawesome-webfont.woff2 create mode 100644 dist/fonts/glyphicons-halflings-regular.eot create mode 100644 dist/fonts/glyphicons-halflings-regular.svg create mode 100644 dist/fonts/glyphicons-halflings-regular.ttf create mode 100644 dist/fonts/glyphicons-halflings-regular.woff create mode 100644 dist/fonts/glyphicons-halflings-regular.woff2 create mode 100644 dist/index.html create mode 100644 dist/scripts/scripts.js create mode 100644 dist/scripts/scripts.min.js create mode 100644 dist/scripts/scripts.min.js.1475009181079.map create mode 100644 dist/scripts/templates.js create mode 100644 dist/scripts/templates.js.1475009180807.map create mode 100644 dist/scripts/vendor.js create mode 100644 dist/styles/Jcrop.gif create mode 100644 dist/styles/font-awesome.min.css create mode 100644 dist/styles/main.css create mode 100644 dist/styles/vendor.css create mode 100644 dist/swf/ZeroClipboard.swf diff --git a/dist/404.html b/dist/404.html new file mode 100644 index 000000000..ec98e3c26 --- /dev/null +++ b/dist/404.html @@ -0,0 +1,157 @@ + + + + + Page Not Found :( + + + +
+

Not found :(

+

Sorry, but the page you were trying to view does not exist.

+

It looks like this was the result of either:

+ + + +
+ + diff --git a/dist/favicon.ico b/dist/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6527905307f19ba00762f9241f7eb535fa84a2f9 GIT binary patch literal 4286 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

7r8$?kb-D3z%-c} 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 F002TuuHFCu literal 0 HcmV?d00001 diff --git a/dist/fonts/fontawesome-webfont.svg b/dist/fonts/fontawesome-webfont.svg new file mode 100644 index 000000000..6fd19abcb --- /dev/null +++ b/dist/fonts/fontawesome-webfont.svg @@ -0,0 +1,640 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dist/fonts/fontawesome-webfont.ttf b/dist/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d7994e13086b1ac1a216bd754c93e1bccd65f237 GIT binary patch literal 138204 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 literal 0 HcmV?d00001 diff --git a/dist/fonts/fontawesome-webfont.woff b/dist/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..6fd4ede0f30f170eecb4156beb7235bf01fff00b GIT binary patch literal 81284 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äY>7uxS6S37IVP_>DW-kg%dn+sFHLnFhvXTU%&ox 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 ZUtABnb?tu62nVk>KX+wfW(Hek zvyp+(?)D*}+YmVX&(<`Z!i+@NrNIkT9jIaB0KojcX7>O8|Nq%XMaE3R(ryC)Kvh-$ zU)TtXtU;}Nq=b9uDJj@AW62eX%`$1Hntbp{o=%*VFKp~;#HbSWI^EoF@Q}N5qQgP! zXe3uW@<7Kk8y+0!#-n5DD^^Z)ywHbqdfzz6!f3GQI>kDq%MF`XHqXMmk(Fg9TU6mJ z5M(qrZjoUQHivF(b8Wk0(6O0pX^++qmrIy;kEUaaX2bR~0w&v*wz3D>u*oLFhHYMk z-h+bnPojwtd+Pcva?Kg$=$o?syro@!Lu(dOP4U%LW=Old_&$q9xu3I&{GCVKrQk^4IQ4Tt)tA5Wvg*01hHrVb#Mm_>WXRGR z`?Q33zOE|X`%F|-caNkR-DFfQz|-!WSGoy06FETJ>?j)q2?0eyOca%{Fo;x8K(Kpe zfjxC|MlW=8n{F;#yLMf_?N{#it6%^3;$6@)y-(Q#iE7)eqauutrbx~vq5pnA-JH2W z&=!ieLg8~8Fs9a%(Lb(-HLavOmXgCbgA^D7D5-{%jCaS&+2yqLG5p-|0rLPrSS7{I zK^$C!%Qymtr@8%GQrp;I)QBCUMu@~l)Q(X#Xc5@aqe4pIPEeVGl72)HhLxxo2+A4t zzlC5VGYg~s{~P*OXU!~EXYTsUdnyK}$f~v>8`A>m{gr^zj8huR>CuTm0ZTlAHgzZOuaN*4oL6!laS-dWDyakH zs#JCF_4=&#_eKsl2@}V##?&zb+h&a8n3w8QjP`w1^QMu*7T+*WRC!&AFn^4|9O z&w^?irPg>e>A^Y10q8(C&<%70oev2*|7TNMSw7MxEI2NMT}Hve&-MVQDpNhKlVXF|8J0=f+Lyon_s*X;b!*R=x%!LBDS{B9Ok8&dYw&Kw zc5w|oBU6n%veZl%Yj`8|*~#K-=>~)l8JrjL$N>Pi`7c$gD?kx8 zvm75Do_$Yg$5|gCfSKnCuySH(Y?`Wdexg^xOLy=&8d%l+{9~huiig{pHWfz!sFaif>vSC_%Q#!SdK8sA=~xto)AG=_bawA2T}60= zF*|eArIaQV!SZ}8#zk3B2n+P?e{Y$qzlAx8+LsGuH(Q#4q}SzkoQq{0>Ka98g{r8o zAFush2DVupQrUGRtz!#8LpAaC9-kXzP6t-|o~=5ih!FUK4-&|^L~V@B97roNBIj~! zN%B9)Y5ZT5-u0%|Of@Pb1l6_BZLIhH_=#=(|6<8j?asmA5@hjbO-Ft%ZLg%CY?=ah6y*p#&C14+Q97E~OU2J0)`#BGSJdHGkq!Sv? zjEBs>e_EvZ6&-W!7{opt#MRFIn%#nO?AoWMY0?4*Jt#GPE>hGFyJvCcN@{(-88l9CiBokU_O zEoWapTlnwa=k}S+lbM4~rI1NP0v?B8m=GqI31R|d8oH(`vLp&T#}NFj-&?=4erx^4 z`nB~dc&+@O_}#SeB>q$PiJB_+DE0Y&(m%b3f^Q#P$0Y55`)Oh6kW#F#N>2dTABoLy zej|Kxp-WLO*uP4i2gQWBl3_`{cH4r%pg0siUJQzDWl|N>kyk7^O)0hTVo>b!F5)D6 zX%jA+G*-5*9T5SX#+m8{tTGpaPj&}-UA$i1&EvH1uc0-gW$nD zaFoO?(kSV@TOhYv(Ed~nBD8KK1OfCsF=FkR9ngcv#6 zg`r}sL>#FtyPVe8bHNbs6lC?XOY>?@A?+c-(^F(+jgl;&etH9WVu{I++aI{9u-XbV zk<&s(N|)py# z{=Ok$Z>Ls8g-Eu~?5ds!_A?G5hx1vp6t1%NskL=Fn<<4qaUnN5eot4u0|pfFl56Hi z&K;jOUwy>^Ryk$`DAN%Ji>nlGb@Xayx41i8)q=W4^=c?63NMhARDvxTL3Ve&NFkyl zOeWLWb~SrPJdOpKiJ~oc4xa%UKFpA12Q*`msC_;^UwHI)liQYgtFYyGOcWCBVGbrH z1-H*ye{=nMyU9m;e0-1(1{)QLgUpsywV~7{D~_*e_?fw?_77eHYH%O>#hVsd6LH-z zL%W?&%4^H`TZ8`FeC8{d_pH{P}i3orrTQwhMW9E#f)3&KJKQN(TI1U06-J~Hb zX5Ww*42*{O`P$uY@EHWI8u8JSXLz#~>=k`UP^b%!QX6f5Owt_vIsi=SE8C*ooW8f0 zIzrHNtHXX>H~C$XUoqb&ZL}+n#D3x1JnDtYJUoiP0AoOy0ghym zDP+wYZ)K6~iuIx@GB+%kA+$+2zt18%Ae43$h9f@30#T}K<6#*D2fXwTQ;~inVz50z zJ^tBz=E?rJ6gg$p5a9V9w`C!SWF7GHuHk}~aK+XD*QAykGzFCIXw+yCP>(!foiA@@ zgx=@9h^WL@hu6iC1wxMNVdBTI23mK=^(bGFd?dIPSJWZfY{dN}vp8-YaxEzI17mrl z^~vM(171E*5{vEmD7N_svoR!FUSt%mi8<*z6RG^adK34LSt*iAZj61?AsPGJvJ;#S ztBX6~-*Jd(tEaD~}_t-Ej8QnL8dK{j!2J$GWwb__8#a=gxR)E%P zj4~;;K}bX#>1&Myzdy++x>|A7Xwi;_p6h-d5C@|g6=oyLO=QS0j)aLS3hLjY&?(N5 zDpiEUR;nmpYST?i)n(0_hqUUUb3L(XspX1@xngi!-9&4*UmsRQ7o99-vQDhKVi8kW zF@+(klDt@UdA8gPsI0{a1@HX zM+M}sZ4&}%jkZNLOpQp|!2}_z(MS)vOI@u8TISnCtjmIH#!4nfqFr4vxdFmpEQi^^ zj3X7%GzQ14li|SS#x-fWiCAfx6)`JG5JZ70{lFITn=OU<{h8D%%3i;$(-?7Q=2Gf% z36Z75SfZ-1--e`beW%-7-9mMTp>*b&*I#}_0@fm>(C#ur#xnEF(tWheu~Q&W zc+RQnbi$c~&p4tW=tL|LXk%inF!jte)2vdd9@<#WTls)!T>w|>ppMoq$P@U#H9hT(tvD5l?_1rgVyTa4yJJI+6Yw2FtU=Qb&fDh z?YnLh1iM^S>+w32u9Md_HgS7nf3Zl5YBIlm``~a%vTbT;z19<8y@u`Da0o|{)?#?B z^%?Ila`!AYp8<)5pTlZ(9ll!h$}gJPvGJ8b9t3z#n~Kz7!f3Q>XtQJ%CX=MQ+@K&g zU`~qCwWVgWJP%IUMwj;4Iw-5i-Fbkh;83-7>CM5cb+ndcD%n|; z52ZR;59GUJ`AqxvH8=4&jaYkYvJBh%f$^tGLZ)46?<{GDY{va|pd9 zW(~_FJojQou#Dqb%8-ypiZfrkmbN8Zra8at{hY0{+0AX;x24P21clE5ks{=Lw|39UH^_0&&WyiG+FCWIj}hu5Ep- z+T^Usw9*&DecV(lkDc*~x3;mq@f@zYqcBtz5K~!#)V&DzZO-|LiXhba{qN&^+7;d% zUF`Bi8QVvy8Ahq)U#Y!}86=c)zUak>NzKDoo!eY-qkE_4&&x@j8}Y^k4P=i94|=4p zS76(BG`>~%o~63YX9GMDWFl2iNl6Sw~3zEEKK0uT@il>87A<6sD>|5q@Jxmi#B}Q%hM6 zQ+d1q^)SF%#;95Ir2@*E*?tCAD@HswJi2=I9ES{vDb(+ZgtwOjJtJGaw!>GRO{KWn z#2)ZI6-#KJCXuymv{pSSfZ}U-%5kNqvAdJ0(}%saV>EDIbA@J~O*m{8oGzIcFsE^q z#pa;zk@Ct{32Q8js}SY6x#958>}&~^KZv3+Ba|_^^o7{*^fc*{PA@;RMJ^ZisoOi! zu5?~+-4_&;%18_#IGtF>UfDKvL$@A{Ol0y|JFuF@70rN1Ls=7Gc(RN*cw=GYV4E=Z zbcsOhtlvO<;N*QC*-{_CiqCIW@NFfUS?Th>cR$3J2gP^HItkVD)-J^m^Q>N#Wm?RZ zE$$xmtVdSHW} zdIOa&y@NT!gWkvp$}VdzrOtc879s&8+Nx$IVFok zatt|u&X(ntC&X`y`?I95)!<;D1J=$T{L+g{>>mApnVa78Mpy%iV{H`;=8Bv;Q*&pd)hSMvz1VV`N9p^6ri>D?yehdiP-xbHvclBJ} zvkpc_s7$*HF_IXkql?((qLMo`#C3ojW+=C^Y;V3!I1KM-rjtvOV%Qy?zgj|u@PfU) zc?UyI@IXKd_l}vP!Vi8hHWx05spb_sR8vkHy~AfMc30N{0{;fg+8ucy(0{-QLF14F z-iMjh7{pbE8tcP2Mvyy%r2Jbr4sTub*3e>Jstyb&4#wItH!jax_s$ zI@C zE33P#VX-aXZvg72IV+52)}GDVP{zcEf!2Xd+HCf}&7)Jnl`QFf@cX9p7)AgFjzlDL z9uP}yg@)BObVuwY4Sqk?{S<;%iVCg0a5mFCwlf)|{q-X*PE%Z*H4u}{!O+l{BZ!dh z$iM*E0I~FZR9tTy;4nj}jPvJlB*LAJ2scHG|4<_3b`=B7NkHP(kWx194gJ0r z9q73{k2e^i-sulXMlX9JET5IGy+javq}K#2y42dnOLJHk!iGN25J#7l=T`sfd($ALWRZnag1x;lDR_#)q%!7*VRkT>#Gbq>_2@zux(OEX zA_|*-eh^mq=Z8^B@A5;0OiHp&#r0P9Qrawx((+4VjwJE>hSsylgjtk0g62|i2Azu5 zO{7QRsXY)6wvZouQwoZUCsAOO-4}ka33;20G&~qe22R|x;%OQg!Gt4bseU6WlL`)X z&83VJuom*RhOe54mKBt(zX}sO2p?liU3Bvg%^g9eM|q9IeEsvGql1|BABnO$f}q(8 z_>8DmmePN{5kIRpD%V6a-;}B<-wc}6AG5$*DWc60-s?*IDWbbds1=HvTL~BDK(cuE z-Q?4?4YqWTb^wgh%ylu-I4hU6&kA^mIrX*adn~5L2_pJ**W0(Vh1{ts6bEa zi9Ezm9Km9O)kg|hAC{ruhiZhh#LQH$_ z^tDjq34m^KOxlY=n=z?cqu)Nbvwdv!(|sPPv5V> zM|LWE$kl7J=1sD}o(P`H`ho`3o&mq)$kAkg5tSV+A7x!*BF`a3I(|zL=RAgwT!pEy z=siwEr{sC>pVryeE|GV8LCzZR?EM@)zzJXXgLuLWg;+!b&*4xe9EPnTRE2P&P0#Kg zyq2^A)b;O2Hpt5LVYQ^^5d|gGal{R!Lm|M@`YOM~G=)DeDp~zv-c`LDh{lyt9Lr1~ zJJWMm-HYTo?JA#E>ZU9LLXN_WQL**-VAQHK?s{O`@7U828{d1_%SD}fPZ^CcZP(6l zCK`LYnx%&EsGh4cdj% z`+?BA&nSZHKB9Y;>+nnUA*c5o%JtaYWTBHY_g}}em?J2UO7O9il0X1w@*v~>Z>?n2 zrJL?|x{ey`+=j%r*njYEcP@oS(SdN3;YZvyLs!AnA^5My3uJD7{)`m2 zN6`kks?sRU8&6B@{L=~j#hY2XRAAw;z46m<@*`1Ywe0Y)6FEa-V5!d$)11MdO&~Pqo9FUKVq`$Gb>?;3l>0I%R~^UVrx5-!9CDMOCEVU&h*z>D z$}!$u4NvFBgLBiHsZA4qn(juqKoW9=~ODVcb%#Te6M7n1P8X{ z<4D4Vu^>B?gL8<)263E4{GRi)HV!3&sxAehra}}SUZ0tBd=(4qZqqW7hBAgOm+=B_AP5fMSDfJ^L-iy7x0Ic#dvcb1``lCw>y z$Ckqw%w)64S4F~n#yDKL0%k#PyCDBq@B#$4a)!{PM}AuvPHaC?<1%r;ZTCogT7wT< zTPr>&(##2Y0?@f+J65R5D0zhtTvFK!n?lpVqPxQ^7kV6_7a{N~kCR+RWflTc+(MyM z`(8Lts9a3ykZpTfWHfqOOa>*rTPtliqWR+y(VQ;3*VJS2I4uQ>_6M5hI89rN_&v!@ z?WbTA${qH?v6tk%uWXCtqz5>xAi)FF#n&uLINVGRgoJQVL>^>}vCRONUJ?hgP?2+p zF5_SqqD#S46buh>C%|MI{KQcxSv^c>lupOfw8<^RY`wgm;L_>e2t{Zy(59M-%-A6a zQ*Mi3Ta7?>_^6!>rh&M?TH`GjAEcZVnThAIR%Hj7^`>ZWicjGqh$SRAVJC$?WIW=l z{^mVSE&j7flL{5jyb_cO`>GZ!BnpbCkRuZlh}!uYM5d&OUGz!`#HS80V0Ri=9cw>? zJ4oES;Kq5Y&>#Q-jU(D_cm{VPQW5@Iwg$Py>MjbC7gSR#SbEQ>NYi&8#4MuW(~oq# z{a0!WUDy25Wumynz;FdA0j$8{yyLJUH$-dXD2g@>Xt2%UXt8^kE5>2fYgLB1lev!^ z15JRxg}>=#L!Ua{I8)*{rs-i7nhaz(YS_hdPX?Cd2YT+CZYjl^<_Q>I^xA^eF;LrV zS)|U@vQO)X4HY)c{=2tcYU1!coA0*Z3fg|vzaP6`X+?{Tu2i<~XJVx*#)RL0w{;NWxUFKhd54dG&CBQ1X5a_6r<2`DSEYj4jLIXOb2{Fet@b=7nsRvSsurgF!0 zg}%O4H`=1n)82TCLEcDk=r+hhr@O%*m;GtI$=24ffXUqBTLEm%HtT$A&!=ymx0P%7h;tlp@r=)}@{9EW1cX!dO zJajluO>FfFt`~oFbZ+qqjX0@DF+esCYh8cdvx`RLJ-xilP(Rpk zRq;v;REAPc$~0hRDDF(j3W<^;c7|fP`D!83)A=6=sywO3svfnXQTZ^Hz( z`w<9WQzD#Ssz2Qj7n#TaFjI$;GRa??T%j<|kGNN!@91V@OwT+hA8Dx;N= z7q*dA%q45>jWSHP^%KcwkOnuagEe^Dnv?nP{sF$kow-QLT*X1j;~?^?-$`li7q)wqR*c z3TAz3rZm)gB7q)>32RIgze1AXqZC@p&`WQQM8ieI9d<}O86=$0M@){PgEJ*YQxB}d zJ}E-83XR21p^6sZ_8>*ZL1I(%#k6fRN>HEz)D@{VnvNQ5Vf2#Sd(P4ZC1YO=hrISZBluvP@f z75olgIL00vXwuHT*wxSnHqICXFv?y;E)3pJXY+rAQ(m-ny_(j zk3dJ~6L16fz}&T&dZF=As3Q&B_Q8qRW({Q&r)kJB;*q=SB3o=Y!PFPVhCF0W`5Sfm z9=U2VG$wWW4xiHFVkolIlQq)5U+6?|=MAo6sn=7#vU+!s$gZeheN3U;@h0}+b1;L_ z7CQpSu67%uAF+9X#5uachz#+hJT^ikX^Muk)D@Og9$7a}w!hTW`KGFpDdyi^TcCX7`yH%|)1sc8?*V5Jy&kX|>`SqFa7SRm z)2nKMhv#WzET`X_R8?EZZjNb;A2_X*;BSe_KrLUr5KU)=vdL$RC+R=SFSl(hZF)PD z^_-}x@;dMK-knNk*qDOmEvi(j(s>`#Wc7bZRJ8e(R_83VLkVGwb8BI{^qWCc{1_oO+-yyxJYC?!5nT81O`10-Rc(9o#pH0U_W$|a zYhj2W0tjG$xgy?|gjo+#0w@$3XC01d^z0bKy_X4QabG&{5oGeSN2^w{dUfx-(-&wA zJ}5A;r>9z4{*E(&q3R8~p}_zF1QEm#$HUJB>4?z#omfMEp}#*oBzh+63O9Z$AhZhcsXN4kqmR>t@=*)-rn!U|f zGDev-dW`Hv(7wqAY4Un{!=p)D79CgkgJb)-^6owj`gZ!o z$F(l~#k+slVYE7lK;la%Q&=;>rBx|&7u+eP9qchXwgb=2G`l^dUSzY#H&1hLlro6WV#7!yH_XOxC;3kRhb}FTmAEOIrTD zW7!HM8x<%^sE68?VaFS0!{WL4EKfeLOQobG`Ywt7?9zl_DO|=9?EDFHb-zMmg;NY` zDxF;M0c*$40KIF#ZFpwnO_p&p*<7&wQp=BeoAh4nlSto5#6Lm8g|UoSs+nfU`ntN&+rf>X}XieWBckSD21M%6G zgOf7OQIA)ktWli6I;HrcH8Ff%?^Mn(dM~9r+cT!}dDssnM$)Og>*TGgro(i`ZSw&k zw!G$EpHv5Kj4R$YV%Sx+8N+pO4xz&WAjl@|goc4ZK~_Co6&k}`Fb4~@dbbmtk_%?b z7*V)@qp0#*1Wg_+m8;^Xp2Gp$v{@f@I#d6mD;t~c+cN~!v6={tBQYIf9TD_Vh=;Fa zkV7PY3{y-1VhoUBVOqU4BmPb5Rmzwtw)Zr$3#|Bu}d`&$PET7QRtMsS7OaqSc2{wQDP zZ@czHxS$DNpCF*wEWb(z=6?zvIhP3?`YhG81*y=Aq^un-C!me*bpfloME!a5*lMbpp>;v(TQBIyGtW~AVNLyvk)cs-4%8WfG z8?@fJ<9{AFP{JDvWHE@QXbOcH{(n<#Z{XP3k%_ZYi%z?jhnxrDK)o89FLnmZH5|KK zM+;#Y7KLGMl6zBqf(8;d>rU!@AdtJzByPp#`ksb0xM@6^Nqr-Hs_zEnIQM*SoIbf- z!`|0=W2lpJ#vCE)GnS16pV1`dGQ5QDJ6k@miJhHdp<>Kk>-v!?l2JtkjSoKeKJABK z*GO@jk>y=wb46Y8tywSvkhcCkEqu+Z$07Z1E+b;ULS{ z4zVoC@K|J9B4 zW^S$VRLprH{0+Y8v*H&?Lvawb$d3P|?9U|*D z)V7YsFbnI!AMHEPT}E@X?wn>79YQJ1^4K0(Z3(IPa~#C8Uvz>%J{r`?W!7W4E^!=@ z8ePwwHxP|rQrYdA3aVnX{o*}W+&43Zov)c#oj#YrTXO0aj z8kW7Kq?kfC^da3YJ8PuV&Ow4dL`0uTcSbrjWypcvXFSZX;UP;CUT>iCOV_P=n)=L|8E0lrLnTC%b{AE zuiCw(Dq0hUbFcp_^0wg^Qbu`);wmPizHe(4Qls=bS5%^9z zSPV2hkGtvGGq$IZC;h15qmu>Ed^J?6VpyBbvxd_?aLDoVw~tj!Qms|SD?9kOxuQoC zqpd_1d4_8gH4&wkFDiSM@trZLEY8*jpMy$m+W{6B&7>Zgbw4^J`OJat2%WJz!6rk_ zjE58Y^=ie}Qd#VeK0TNv2?Sv6z?+T3RO-Cji~X2<+}UeQ7fuFrKyF~YG5owldy;pq zM+d|U@)mMaS|cx;GRifQfa^#(w!RH37kxfql4H#^tk#j`=Z=|VwJlMiFDG4Q_xP3P z*SSA>KYbxV;XZmZG`?wqw`7C4{poSLhNQ54%TMWrH<0IeERv%yvM#S#WWI;EGsg_D z;@5CcB5QQ**LKeDYYnWTs7mL{I6X#xjUa+e-?gX&J|=(AYRqX4k2fnhToJ@@CKtDH z!$;@Na!1QgjHPbZk?JhRY`YE^dxIL&V8!toKJ4Y5*p8I?W`b{{=QwL-X0rb`@+kXO z6$=jP4K{0pW-ICs(^Pf=V);bqzAcz}|5LNFO`)b&eu@-vEY~gLI}vXfLu%VS_5YCs zfz`EJh?YD;`|hoU(>`^fWNeS`aaXa$_$^`e({cKj5?2vJ+i+ntL%Y{6^GNj(MeIY5)q~f zYW+c_s^ULxbEPOwxT+od0+r!V_Q5l{C!NFd@4G0my^rgcT~kT)b4%d@!_(|I7C6!^ zdF(4LE7WXY|1c`~A!;RCO@o@4p}nS;i8yyKHak%xuVc%itDtO&pLL?0<&tt{DVYUa zqt1cSicVm^#eoymsR0E+cgx&RAm>=!omT^tjC4rV)|?7b2}mrmhfj{tlFKl3Kpl_D z6Xh7l!^68RET=d9D>x;mPE>p$TKVS(r}yn2ixoVGbc2p>UxF{ODd0pIwDN{xVk+yr zOIj*>X9D`0MHi_m3+Nle*c_{^8&vXe|GZks)nmxa93WT#dpuiFX&w{k00Ux%2ws#= zrB|@_$belfyxMgNxRdB+-d0=i)msx0Nr{{f(ahyrBz@s(M-XxJYb-DmZAt(@KwvqoWEgIMh~Soqer_3KVv8ub zTU%gtgWY*2YX%b)>D*hXm>mN7x;# z2j3$b;M}expJBBr2+C-u3JriW*i6Q6R3AB(CVAEO7RTI|eJF=A7(S@J*K5xqK^902 z4MW*{3h!^nS3rkpIg0ECfb2;$ztg=tw_H#%C$k8jQ=+{-KESHfgQ zzlGTcM%ls0L7t;EXdJ}*_F!IM93qqKnL{F%dKzC*!odZ*AaJ4Ttx3h?6Mxk%jGy%; z{P+fr=WqGIX1&H@uugY{XrC!`#k2F(8FU}8V86XEy$y~DO-ntQL&}uEIdh$7XcWm-5mX!x zM}wUn`;<}(urPhr#=A0x92_z6nAM*cm4}@_U&bnZgK6M6H_u>GXO-hv5{G62BO?xu z@~zSs*U?+2hk9T#p`pV=MtjaM)&#G4UUF>4FMo{UY$JOOW2cLpFXl&XkK!A~m6&wd zF#|EK4i7a10BEwIr=9K)ns%E4ttn92OiU77NV|WUSfxkGspsk*SPe|xi8R=KWAlP0 z(M(93qWCxa4`o}|j=E&7lXY^V**hwSOOgK2HJ9%&O`r@F@J+lt4mMd^5G1fi&$an@ zOl%cq*rF<PsS#4d4dN<$7;_H3c26?*8fr^jt}-owK1@u5;d z0fo?RGN(+RXrm)G++EZtuSV)6hg)uF40aKp;AxttC@IGC4U5mRslGBP+h9CKd`1qq z{3j?SG}#(WP0jW7tr#x$0c|$=5(ERGD8ziN%w$@ zEFJ{g2F1HlWqtG{N}Qpj&erU7gD0JykkuZ3M)J6qQ7G_fgVI^CwQ@eWDP3= zVH7mPj#N|XP&*LV_>)XYa#7YCO$LKvI@RAlotq{HnAd0bg{91_yNk$N3v4=?)x;Cw z(&S`Gaiz+7dV1Ylda_~o{r32YF2PM2LTLms>TC}9s0N?bt9?fdImBAA96NSR_?k@p zo;)lAa+1)(<6-YM}pQFOlGPVy0X|FP&vlT&vDsy;^@Ci)8b#Z~tA+=1g8%J8L~IgPMmBDEXq= zjCuuJ_z0@Q5M^7Kn?@W?ckR>%dlW3edPpUd`-?MMG-~b8!;5Kl&Ko{6->m!GZ2Gd|*uI0wz+Lo4tMMKRfi6!R!MuyoRlR~m@T28ydb@+&>@~H4LW5G~VXQcRyL^Q^u$oWBPIFhP zm5U!siAzFLe2V@&VJ~-Rvc?wYZtyixHAmtG(x-#f!lCpEbyT<>fbPkV0?OVfVob#e zaTgLgLy7~I__K$G zJ(7Y4!bE!H6z>z4G>$#vwP2qn@;t?boB`Y767H6-fj+?M!>h+FEEBhlg<>-#;+&K2 znzXfD`8zF1zAH6RsL)2Vm8FX$WMkQ*tKO3WD|U108UTbU@1a`!Ue`fbx*RaxXOJRU zN*kDZI>jAU7(9%<`kf8_g%K2!y6hWOBRq7Ie8d%OjSf*mGt3vHT9ngMJ!(m&p58OR z!jiIHC*A{(ND#ey1LrhGUNi>F8zMF7Mb&4jIuw_3u zAeNzP>pbU@@<|tB7ze~kUp>JorwgHZreW4%KAU(>Pm@M0cdbe!s?;$nweKx$tx0?UyWh6Br`q1w$py~<{_n0ZOt znsVG?nax&Zqzv7&1`e7bdK!PoI#ZX0_obxgM3-MfCF*8g(`$C=5KnY&;sfY;xwu1W z=I~HIrYZn*5b-X1>Tjhuk{URCa4G7!qpRvgluxfv=2hl%gFeCN_Ayn5pW`qk?pO|c z=rv{|&g5f)k8Mo`@|?8sCa0V_?Ik$(=0BO+U<-CQ7~XLzD=rmhHis+91GkT|q)&qJ zuv^4EHmVFEHyU5bi-tz&NvT&^^vj$tgw<%<7`9ASOiM&|3O!7@GGQVP0Ya*_*9$ix(1%qzRXpTl7WYImmp_riMYMZcTcp9(JChcJ&NH|QsF?231 zc{oR9Sy7|(;kt)lk~A=()Mv;Wy4zq&0@Wp{AFUS2PuqZe5N43#gc*Z06fl|E>A@Z) zohp**0_EzZye&3ew+-6UkqQ|TzwcIa|E=t$e2!PzpvuvEz9p$U!Ja`ue99cIX# z&oE~OJ=ya6i!gP;Zh(FcpOpH()2|hBzw$>TO0vz=NorFE7@L1gd=Zg5_$jGKtz~xG zA8`(JG1A5Vm{ABPTU{L)dQY@sqKf+e;K+gZo*aae51~UnUWrw-%fUeO6K!WIw&m*5 z>~5lQf4oC?Sem@RV0zU4>caf^I5mS(!bZsOx+4)p&8x}tf0Qa2EP5)+2P9^-TCXg7 zG%MB0ga#Jyv2mBP2<$k#4`p<4^nr~&vG+?l5$JM{AG5pc(MVGLeDc=h6xJIm{k#Ri zPEtWN(s#uSr6Yt|cpFmmAeWnZa!zGN#~mWN{O4jj=?kz1JdG7h#HkZkqxY?zp;<)6 z#ETba@OrQSD!F^wrv!YHr!3Y~tQVO;?5u3GpYyO$pAQ_CCg1V0as;5}o<<`dW>yo8 z-KOYZMc+A3_|=U*xY6WOyR_Za2)mzSy-o>Z9~BNIQ#y1>EL3g-S}dE7L0vNZzy^bH zNB}e(I=@iN38pPh+pn z+J{FD*mR0bP)<7s_4Z*`ir|cJSG+(Wlw%1LfP0zpoLU?1ct1l_Eag4{nwgJ%JYHzn)5)u zb`YboN(F_-UhRJw)+frb&1TgrQI~0~hgZW&YVtvJCDGGr6-;6ax5qysz;&NGbuGtS zxUHB3KZ?aszZT}VQ8lCGjbkzgH1Ad zKY~~Rhh(pZwi@!OTvp0N3+$lM(Y^AZ35-%S`~S5b7o|@{^s<;b>Z{1wB0-|KF3!Ag z2Ab*BRH~tw9+!eTngGXP#Pe%FjD2wz8Fs$7}RC;HxQynPE^25TBdXGbDch z{#PW$P4UgMS1*pu9Fjlv!+1@Jo$SpWZY!@Ja=z_hWOlK8cCsr1TCUL8Z|gj;fA)iw zfn1P3b>>2G@tM*YHa#^zeez$nOdPB+UYzBLz28)Kb>&oqKFD;~dT30!2!nWKl#ioZ z&u8N!y9#noB|X9pRl=y-(Rp+RXFTT73zz;k^!q4^?UP?&;Y?jDXQB&@h5m1eFg4O5nV+)kl5sXNDxQst)XG6kV(H zh!2Rg_@Srq8EY2wuwK@OY5?fpQ$MZOGM`#J%fZ?>#;#RDm?D`%4x52Yhh~Ru48T z8H;^My}opQ-|}K&_rd$tg2qo9ii;mTU0my^qz1&PjDB~B?qYwzE`k_VjDGGFlycv> zqh~9Y20gzFaEi%U^;cn@?qT31Kk$bbdMh{}Lf>`T#Y|(9D&_OqjB`0sDVBCAD8$9R zTx7{r$;{;(tw;6Q8P4qEv)NtWari+<^Z|6>IYTw;F+BV$kME5?Pe`;131~ z8BJc#dVV%BpviR@i4z)@V!fzEebr$uE3YTr(5N}RnzRcQyoq=VR+jMf4f=bd)Q7!u zBOU!C7tboY`6jRQ-HEm|mGpQOZ}@05A#@&_(gKzo}VXa{KffAG-3vS5p@H699fF=;iKeqsE$U3 z?-cq-W+P8D=@7poT)zQe&aOo_lUVWiF%UiGWyLoh`eoWXbP9fX>0Xv{82sYbfAz_q zKeTd(MIX~JF1&*6Pzu>zZob@_`M&i65dv%XXwV|UNPKebwF|%j;C3*j6j*76UOvt7 zWV~J2acvjw!z7)k2O`?wDj_oizfW>Jqyc2h?9q0|X#Hz)_+x)s)SqMe0 zAzFCn{9MDMa_6*o@2+0g^rQo(Am!TQeTc(qzY&_bM@oM(Wt?pSjhQ3BcpN-1{z9o_ zibH)cf;HYW<~58{fAZEq36{#|?*uK!a3DN0ExUd~hg=mC71y@G<|8+uT!gpWmhF#h zXHYKlbxb>-Uvh{nKUAkWecK&QyV_$fu0P=udbWyh^QNBc)6VsmeT1OCzz!Km zG&wPB4jwO+0QDuEXLBdE`^RsbVGbY@v`YmO<_G__4BS za9>1Xhc+yN9dTLQ-ORSYn@(sfAQl8cq6U=eJB`828Ev=HG9R@tCsNW7; zoN*2qwF*Fx0jpHUz0}$%Uj&f9=%_i0%SNj?oU@VOHPcAxwLYZKkkrECGG=-qTQx08 zC-@Qz!wP><=86MMN?zi2IP+Jj2jtyT_i30l+k*`rJ1x+rM5O4Wz97mbEwTpLCDBp(_dHUW2Xb%P*ij8q)(3eM@q zKjKy<9Dy22RObANDfvO;uE)q5;+^LHU5WP#qI$eUUm6VF#Wr8|2fJDSJAwPR`+7`~ z;urDeC-lBM{?=IAaAke(drzMBdT&RQReGHI?8eYc{V>s@3VecPXeI@D$eIC1#kGE@ zJ%n;X^ibp>I4o?=*ba6QFyZY>6K0z36C7V4P8B;$_JQn>t5C*;`>rq*JbUCz9*zgbhox zC2^Q`wLSkRXN}N^8+4}$CwPVLX_xOoW#_GEktI%-@cs!rjSl7o+DL6yfG1_${@^09 z{NAH9p1R0!UjDdcR}HzFCNRf69Xlt^zf^e8l-n^36Lu%!-o=na9GG0$a3?MzP7oug zf@w|EMP=x1v;i3O3Pfcx34!R6_1CcUcQ0?-P`qIiXt-`!zk~&maBo4Z(cpKZZdWS2 zW!1MYB5siN^CqUkhPrim^6o|am@Qi|yLHPW8hTTT`0ev$v)Q}A9Nf%ZY{PA4M5B)( zr<1j-C~R$b?8p;W-KxhIryU0fiz=61lp0NBQ=O2RXk5ORaRiQ%GN#mzi=C^;;qLxT zON@mMxC*leUshO0Rat#znLGeDdcJiZ6(&~Me1$HNQuc5D`h!xdb@0aXByd06%0l{r z*~oTFYHv{6EiTF~nN;E!BG?aGn5E*!r_?aS`(dzZV|Icw1Ta9LMj@4G=2h*(=J(dp zhFM2LkRS%oXVIro1($S8`3aHgXXC$6WD@NmMhxAg9IHLNpHx^r8|>%tX8bw)84N#x zKLwVa}g6vIX5{2IuTKvLM_V3e>ej-s~5R;Lm zn;)(`iwm4MapMAljo&8~#wRC-+B=TZQ7uMf7s5sBPR4Sv{?rX;5*$+6H6lK8ji;p$2eh$yNaf@%*wAL9rT@_B-RxPKFAE4))ptqKFgY1?~|hDmY8yReQ9 z%10g&eCeI&x8+LLtLXs9JpV|UTKn>gQZKS6c$XL6fWv2T>#GVXrc6_%LWY>SyS0rA z!xOGIWKzvad>)`J(!Em_||3)8_sp~P2n!JnrDG%wJt)q$%0{_!bcVBdxNJ=EVzZ0@wt(>8JZTc@5}S_ zg~nY`32CSdX2(l&e)C5}P(>YVSc8gb1@eo7lw9<~bwp;QadoolkcqD)&Pz3*r6&GR zxk%K-q%of;vzIECdY=`q%q3rA<2ohfUyAxDiyBxk8z=XPGU3OYk8Dp z9QMkGL12WAf2*-tF-7`12VzGYsqF|RCp*Qi6|Be0iQqs7hhnS@Vf2$Ld||)1r=?Cm zjvi5UF-pWIEH095IxUK2@2y|eo~Sq*M})a1{Td$Hg4Epc;ER!fa1qfbB?GEw^J~K$ zZ}eyg{2OMz_9&^1y%e*rWh8lnQ%5VhN0rDou}Ny*YK@Fau{J>6%b&Yf6A+Zh1FlAE z{Cu9?yjFUj8FEdC5BrB|n&aqUKURn`Y+^lF6{mkZ({VxnmB8S;xZ@bht`YKY>n-tZ zx(M(BTg>Va9qc}@m?MR9Cudr-${JaP$7)R5X2)ooO*zeEBl=xM9}JNAOuw-j@f+n! zNiCQEsAhWEQ;`XXt(BkJH7uVwAGMnUtO}5n3Nol+R_rhvsBW%AJAEfnRmAJfb>@-d z20d(ekzlAYf_S<98|!Tq!wNfa)6jPLyG`C81ViHg^-a5M6xBbZ(I#U%HO@Q>9iX6Y zH4ibZ`gPo-)4O+nG=NqPlpiJ?ShP{eA)FsjR4q@?@QhlArt-P2#`Fu5#ASPN@ zy|!4r@qSV0*FS1Esm(#xrGrFAkPc!5v9W~%P(Lmb?xdycm&$uO6jvQLuARD zt6kAEq=6Xrguv56vOUg1EjcXS`2mQP+7keL?;#AU-p zDfd^HRowBQ_dC73e%Qlx49!@;eX&NDM!iMtV?IX}-3lB~t3m|xpip6K?=&IPavLlQ zV{DQeNTdfW?(w@7v_ei%E!Ny{Zx)+{4h_y=iB^;B|JYug0^>uVN%b~{FG4sSA@h=4 zg{DQVaMMjbhw;J>n8-VOV#^&4I_8l@76q4`33q%d5#5YXoX%7ha9#{?{m_X{E(?Gw zfu<^^1`+9)e?3sSn)kCs8dSavAIoAo8&wz+1cichg?%2ew@-hI_%n*?Rp*8UiP_V_ zD447OS8!zF&gJM{7X46AQ+8GLtZBG`GAxzmFx8y1GTFO0a8!k!*)KGM^=Dm|>xxr5 zDk_vV3{UMg;yP&3%_E3fNA<+z@n{p$Lhiw-ev|B!X<0g}nOEfDK^VU1h1$1 zpV4zESv#(R?GV%;&PF&Nj`VfPJvyX*OSbjuk$C6a38q%&M!Yx;U=lH#zQ+)dva zA?>mK`XtdM@av>Y9Sw6R=v70$xfOn0F#%^CynSc%ksyq>BBLioebp%X-k3&8^_0^* z68p~ZlG#6O1EnJx%vX4S6Z3{HrCwA29WrW#WrLF_+7qd~(c8%qZ_%~45NMy<#qzBF zWbNvmyAuxCH7Z|bWVvXdb<1@>|MQ=7)6L3b`xX^N;=slQV-Xig5T-c5%45aty{#V` zjn#|F$9j$M*+qCvr$;0wu2Mya;0`#h_l5sc?^7I~3I7`n9ML+u)8uZ0{2oTBXP_Yp z5vDk!SHWckWg1M(0Lp*HHE9R3nj%|hjwJqk8<3ILEa zm+rk%yW>=))0=nsryZ{JM594cX$a0ZJ&Di^)8U&JC4_KQtixt43!))Id)!jpmY@Q} z?r6UJYZex!a4;_=Q9!&7xSO%{3!?d-r&{a@;m~uYDr@ip?!YYbSZd_!H3SX0o2}Nw zvHEG#t4$T{>Y|-c?&TFwrDIs?Iak#YcT0>;*--(YG7X+Q{%lu!X%!`g@8OX4|HEAI zWh(oQsuk~yPu8-pF=me`XCv4}CMZ+At*Td^sMz_0W}PH_EsSomMV@GL)CtC>0_p1@jN;i}=0t^wd$J?V{^p6G^C-oac~Ib*@mCHgH- z=RgI)Cbv6r&tZ9Y_>+iL<23=fE~f$aFez&L4UNo!c$D$TBHuH?pC)}yCY?bv(83E! z_F~sr$tlZ1f$dk|&jR!=Y_BtizT0Z2axqsu7D3<5op_@A09DcrXC{-^8T{dz)XgTG zqzz|1&fY0eIE`H>2G(qL%S&4T)z<&5&m@enBDMk)fU>5Ik-nov$#;&f!wpclQvmpr z(?ZN&U>c&6{K@m4iB$O6i0@=&@e~S026Ex50wsX!3@s#f4s#dIHOjBLBBKcswJG%` z`L^Ro11Ms&q~K2>2Yk8qCn=Xi6m{;ZSHzQI(RN zYW4yB!`--@dyrGif|P48a!$5w;Iua7XDHLF<@3`ZxEGWe?ItgPgTTrQI&+UX)Un5O zxk|nbS7@tDmpSd16l+eLM-S51#>xI6PPHR49}1Q# zsJtvZY&hDa^LR21ZhM(immtm+R++u*6~A{ClRSi#(AJ4prnbcAO9*NB@WPX*DY0#A zKrX367#_sbvN)AUY3v~}3fg2n7{S2# zajo-^(SX^AnlR;1L9*!!$zNBDde)VwB|WbX3>q#4k!xIp_LPf9HCX;T;;YH}j_n6c zb=$*WCOS&U;(|_|Xzek_PdgbC*UVyWI@JYSaT!=S8b7qmaOmF)@)TrtAjKr{wlZti zOaXhz4Q>ciZWxH?9wjDQEPgs|jm=ZrYO`;kAXYx%bvI$HOQZ8pRuQth+xJdF9GDa7 z=}1_N>JAgqJ&PcuVqT(EvMdc%glP}4NmRaL`S^y|{mVJV?ADy}ytNsJmQfBllw3yt zh0(8}>FJVZN577y?pO};uF=qQL&P5z%AbquM(OdWwAWjzjIhKAO2F4~M=`SIO2Nv! zH|3&=<0dx*)v;t*omeo*M18wYr-=o$;$6vR$qocM(#%GOqqck56oq-3I@|8x>JvFG zn?O|Ho*k}{F`00y41rMYcy1tdoE|Pu93Ij+;=(=&`29F|Dw3w|IId8j^2;HWXCp;f9C4eo&5Xh4~JNAd0?u9M+ z!WQQOk?;<9mo`WFJ(jqxs>(ghXGwtan5TqNs-Gox|L2rB?_hyDPzq=#49F4cOT57i z7)L|ht_SXmKJ)Ik)VrmlEMvkr06o~w<)IA@}Q;@J@+93oh2^8Xprm@TdN0~_uoSuJL?T; zX7~iYX~BKxe+1qV|KR}}6HcH94&X9t9W(l8did(Bp(}HRh6lkTYz8Nl;w7QOFqHIi z@ky*Mp8nnl>ke^qDy;5$dj$UrKxnFHMc?l++f()djmlpyG|kmf;Pa8?n9yU4(n!z< zhs!jA*grrLr+EmGASB^1byk~TL6qDdOg+}Uf6tRtSSqDIz{GkqCiQ&}7*~H36Vo?q z$~`p>CEd_Sd!ODL7qFNl;3aOc;#{YN=-B==umAk>jEsZdzoCsRXY7PL zzd@0B1q;@*RzcYYZ=*#gykBs^4TjZWy$$G( zx-FzuRQ&~F#mJV|U_?{S4lc=n_mx+eR|Oxy5l91c_h_ub8>Kh)%Xu2s!V^pn&Md6u z){9f1eM1T2i)^~a?=)ShY)=f_-LDd-LqB6Z2!J(QO8QHq{wev3Rhj39?}Ttyufn^X z|3sm~pz~s8ewy?Te$&80Yj>}!?k7A13FB&G{l`w4D87&_Ekx03Au)km)TWNzP7n5 z{rNf23+LykA%mXE1kM_0L}tx_Mfaft9>@@kGOp}7ywY%RW^Hv%*ZvUC6CN!kO~EXu%_XzvsaF*wFw{P zF{KKlN#wQe{S-YcXm0P6STj@aWSS$VJ8OM(oamvy6x^L0e2tjK267cLo_|&897t5~ zsn_dhyF)t8R3%@Uu%=h@c1k|N>Bks2efq*6z9I#pnThzNn3Fe&li;s+h%(us*uvRMPsK`u4xt)k<>;)6*^fj|ZX zzC>wV+1O&IDt2-r5S*r4Wd{STD^XtnokvdtU?`ucqXA?qN7X@{^c~$*c;B@x37tkc zQ)~i(J(XkBnec3g_ob$FqEc9#o-QUrYPPXT;Hkg_tg;1t77-cV*^a9N9{l%1>4({s zhQ^3oT?e>zV|ISZbNvqS3SQk1z$ z&#LZQsPa7DhwotN)q#)}wljaL??j`53AX)1x744nJ8x2@$>1PeZ28m_TI#x1)fd)# z!*xPx4!fG0EzAfK=h*ma_}j$^mf5XXrh+uo@XfIa5(_i9+3aeP0n$r9rE(Ml=roM8 zo*8K>>(L-gd;$8|+^jI!d7%_?-qb>dB#wteiRK0xM#lhU(`?EaFGl=8rP_X2AluZ~ zoMe1@y0vvYfO`rG00dzx>yA!i2Z-(d|1=b*I?fpYSd}oHM^`H40`(c_^HakwV?<$i zxRCKTTe=_o&_fg(s5icH#kk&sAXZmzJa9ze-&MR{Mt}2*AsfmJE4*1RlT55!IU%_Y zfH=v7tiJH()iOg2*{?SR^r5a|g+Cg$9SO4SiIw$Fmf{Q)Lkgf3@C2>RiheegtRV0F z3@G1r2p4&W{><97BctL+w7>QoGqw_#hg@-9^OajVR_oL5tSmb6LA&!*k?A7_pJsei zds%zoI&H?T#){kmI<4VZNUGuR^&^~9U+FG?r`kAX{BU)hSh9hp+1}H+MxTCZWudUt z>O#3TeGIE{$!EN6?fQ7ccmO~o2%dFXIw%$0v>x>FC^o7;qa^W3${9OyI6l8x*5%tJ zbNe*x7)3_o)9X&lz18u@5D%%spl#2hT=_8H9nZ3+kih~e3Mn~>91H^(ro|}<5Q5)b z(E9l;MRR~>W}0xH}H#+TZRw*=JH4UBtujOz3E4nIbD5 zTKfk2T3fI4YXh0;? zWsm%lZ2#u3@9mFIRy&;^no;nXu|vMHRlUBrMcBD#-~_>YoG#Wn(4$jYn6nhSiXkB5 zpppU-Y4t_wbTdl|b1{r3V9Rl&Coka1<-z`kLNZspTpCoNu+6T~$LTaekFFCAI_ukV zVJKY<*6NSc?bh`jGFk|r>yLL+`GR^viG2b85pc&sd!6WII9=tU!=q9sN2Qx$A{D?3 zk3`263JB1dE)K$vsi~E-{TL1*8L%lp{@WZw)!bj9!tn5;^WO}lfkpoqt=fC5YQ66g z`-QHn?89*Fesv}%k@Et25jF6(cC2X3v(YQg#jVLU%{9)J&PfC^UA4`-$LScP7bh=F zfle*e8BoZgVB-KSlZ>q1{S^L&Xo7I}W>s)>7+;nSp{yrGUZ@v$407`B+19t*fJ8mJ z>RPKL2#`_0o2=k(l7Lcak}7eS2wDRLS^hDG;lr4&MPfH(P1M<88!-4raU&knfVI;R zt$QUzH}&a!S=+!pfoHAk^hB48h7bi;yJ>+SQbQUtT!?xi{Om93+YVg)VZ0rG7LMxD zvoqdjJP4?Z@3LkoP%+>E=gFp1f#16U18VG_Wmv{y{ty*rfUV1@9FT(n2Rn&<;?7tA z&<8{!0A>t@d^1o0*a*U&8_3${lFe^gLwq5oI7pMrL0}Dah5`t3feq%cgf+P+ISkGi zW(=?=YZY!eXp|~TTjYv=dzZtR+RIlGI0o)idhR>e6xYDfU%nJf=QXfxMEavrV9yoE z$UlxveL@OB8=i%5mH1Vw7I<%F8*1LWt7wsNZ+8UQorP1RS=nOZi5*D;5BZ)FoCYB~!`;xNuP3%G`#G>9BuS0eHsW+IEV19TI@nM1N;z zbb}(Y1s4C&qEEcfvAq+{ZFIi+3{v%HyCy%^KfdJij@f1ZQjdlb$f6(Cuo4SL7_1gM zP)@0|{ZhCYGI&aJ3VaGQo@qnCo!A%~ZVDmVn6m=kpaac9AdzsujuA!{);sNu2-O0&rZ?KEqE26|^g zSDEdR-g>x(9#M8e-DOW4tZ_g_;jw8b4P1u+k+u^V=Pfr`lFHHcT_7?05DHiUj8sfO zc0)Yqy?~{a$@MAmWQP{8E}_`8@(kWHDdYk| zqnkbpHkefjwlJ_`JI;+#t8IflNL7^V{_$G|0ERUL`&gx^pk?qR0cHJKk#GrU9ZV4H z&)XP8%a$mgZcq8KmNHS^tWA{1AE-Q5_s4WEP|f102wIv-73x7qeJ&xHVTXqR zA=4a)s%bwkBwZtF7;-LGZX)+E=)4qmw-?`DoShUJ8O=xE38b$xbkc+Pv`Fpx;j^mT zDquS#=6@_Y-QC-2ckHOejr2o^FrEScE)oq5sd^hX$45IX z@8;q+SF(TNK+&qyH*dxziZIM3TcNM7nP+O6r>RvHUK$z_kYI%(T7|Hm_DtLNV#{l;XK_eRAHzy>nk$7uLZO z@Ej|J*Mg)AGvkR*ib(^BRBZHH0>r_7xqz<_9?1i6Fj<7u$vE362M(1X|HNv;=Mh$C zJ6CP^9L+1N&c(=toq+BT%Kl@VGyphbX<0LuHJk7!7&dxZM}%bJ)~)i(pFc;FJ3-LM zo_J0`$2=c6%%1j^PU-QOVvOk>Fo-s04^A%P#)H8V| ztkeZO0k7|`$B$KT*RV{CSp@|yeo1C#tUro{{DI;Q+j~T{H>Gs#*4X4P=*-K^mh4;_ zvrQ17W*~41cQv9bozULh0@ye#UfuFbqR|*jo5jg%1JOm3YDjBM^EGsFT(J zW@;`J_oFxL9k600?p?wyQYebJlOO@+%`I|}D($&_IxH1$-Y6_Pu#OIZ`U*=$K@J8W z@PEsr2fkgN7i%1FGA7HV%1O<~s#hj8N%;<7*T6`Yi zSbRsbwO3e}6o|3hoSNT_K$*2(Yn@rSFf+lonm3f|P7a`oHMB|E%n{kxW9uf9Z5IT~ zhr2H+!P}b#bMH9)5fL37_n?9u9T5@h?i3Xj&Q)Qi@%@xX4OAk#dCztG8wM!`x~#Nc zUyiIZB-zqi25EP{xXa1gC@R^Q$GNL9=DI{2u0^?<$FXeT+ZhmOR67Z~-J!C`#H!^q17H);AU zxn~*`gZBJdN$qX-Hk5BaxI}T9zkle)wV=4`rkqyVI3LVq-A@+jzm<>5+j%R!0 za`7%93FKDmav&B=@zch3_y-RXs+%B1JGDfoN#mp;(IHN$u80_Q0t@=L#mlP}U~ap! z9De=`|D{kxAXB*S?Xzm1{Q9vAefL;>f(nj(%Px1$&Cn>^gFnu0Jb18?J+3#DR9~OO zc01)5=+gH54x4dDukD%3!0`+ioCUaFjA~Ev%bYA?aN=zQd5PCLR(wzc$;LN-DVT6d z8PcKE2mSI7F#GT|@Tc3!a=%Ewb#KmT!xyA7g~*T&WrNEUk@|~%t!?A8rOpQ58YWwU zoy&qGYj>|Y@hGfink9Q*H(q&gTcuxFhG^dbj|>1ae3Fqk78qJ>LJR9}+Q{EpkF_rU z#b9344B90casbmKP87^Bnl{Ws0N@SNq8-tvAmdQ*A&}&dL!!xu2!&$ksF;pQb7^Gg zNt*s2Fi~&{z9N;%8N|n{CjR`H*v6%8kRoyhm3c})B>utOp3mKdq7S~V8yp&nh?o=s zv;p;aDHn!dsc1MLmtYtIl^w~zLPRHfvJ)AYIMmw5g*GXz$&RFWHxLi$2$!3UJ82t6 zBLU?Zs3!%eG}4A4>BsTNH?+Alu-(G-UKlx=cFQG%A8z8HjLU{9e@n9GOynZbMbHz% zp#o68lIRve*Y`K~9oXiT7I}!81s{vi#{B$1Pwo4Y2i{SpAGK@N@KQ9ofPC!4}3m~%qZ}*mXhEj`_(l0n5bZG2lb?vc zVEXcTugA;4dT{Mkm3-4s_wI|YF2=JRwZMyb(1gX<$3zB8UxZ)FXM8rjlvcZK_Co-` zq_R-qo@ady#rZ3kFHb}`ZOxTFB6OLoh7rIG4;PxzZ?2~Y2uLHsfjuO4{AN3esDN^> zmyZizWoEK8%2<1OQtAEs<9xfQC_Dc6;Nbq|6Pqtz-mEy`?0iD8GCk3}KPyWr<=ta_ zHwS-i^!~({$oSZl1s?vuLpB}o%mgZNih3U}^!#~_mW^rNP${m|Xoq^EsvK3Z#&Fa7W*XSDuWHv#yUB zck#zTwC3A`)hJeIDJ>e12>(1Q8?BeEzE$1hIGXsq$*ZbaeY0LRDm(ipR{})yq-ZCY z8gX9eJkEdIr9LLkI@!8C%m$>q%hJ^M{9V%RyQ967NSl+4%cz+K|H?mbqR%&3% zWnOw{QtG&ECB3aX+E>KUtl7_MO+!+Q6nN12kNKYkx8<$1i!(&kGnzb%ERYa_mOi^D z7#!og6-K(sNl3?K@svRK+|+7%QtA3`EkLQEn!uLBe zt(CQZjfUeZiteVj*;bCHh9;%+QZ5IkvQ$cgPtNFQ?z~reQWZ@^6Swnq>`bIfnuXR@ zPyZ6A%xv+qDbb$}P;lig2F7tlUdgH*>j628r_939orEg7(OUs zb{>GPCv(YR@92C4f%Ls>P99oK%za4|5UXA;v(9`n;!wSDx)P%K zXNPdugnz`LSoVf{U7i>N8o@X`;#u$HDHac$%?3s=?E;W}aS9Nt2rRa;yLkjwJiN_s zNQ$FicI@BZ)<$`N4eXE$EhP{>1QfEb2UqEGpo-L+wK}-e9yUA$Qs+%5~*wa3&=Aj_W#9bM$iOxHd;HJsp*VwvGsC#gH?7U}zzFygO4r)?Hh{dkLw0 z@#jfPB#8btw43mc-|t_7GWOJB1D24W1#M#Te}H`eV&=|! zz*lWQzP5pAYo3a8>i0I+RheOeUVHHv**KwXFXIu_=ZtsszwI?VtixhZljIAqv%B|S(uKb$e zfS#`k91l9BstbDM6^ITu$7mFpI$QGvwiZn9fOhOZsC7UJ!PO2OJuArcOJXJ3Ie+;r zlGKt$Q+gR9kjMywmy(v|N{ZY?PPa>BCHZAyx}(u{h%78kvdKyE?;FQUj~SRAp--oc z`T7+CQ25F-XXN2X%un0QZEAdk3mC+eb*$bs5+`>FP2&tmDFA$7LwU9*lbrxLIzT7| z06%XXj@22M4-_~TFWLQDR5c;S65}Fu4_6BJ#aY+{@cjfxQ|kkX)O6q8Uf*<^a|!9D za5<#g+F~t_?$oe;s(8@STXI)45P%fPFQ$>PylH>`X`bc_ZdDrx889GH>5vf5F8`}i zZeXr3Em;h=ZwUuae7JYSvv7y?QlBH^`R=Y<(3S>=RH!{;q8K+YUkMdCslWn;YIRgB zBdlg9e(yQ+N_xk!V;!qfvI;RN{`9ikkVJF9``e#p8>4wL`Ee&_m;e7^{jz~f-%1KH`X=-H$%t3ohhYnY$%zL<*drVI#@AoUcE1P!4W3%J_3n>uvZ7=d&&v(x+dn8#lGri4&@( zauP7IUb7?Lc2Di14NZcQsSWoU!Olp%)Jzr|Bw~=XoCg?w`UeZcio!9dt$q}J>R!5Y zp~pjWU^;IoY(>23z~f>=@9qhp4H^`ljia0SZmS|9pw>{8AgL9wcC!6D^8 zYQewSU+j=jaC(EjU3@HXy8cyHxImA8I7C(O)0G;RTmLg#OZ%p#1C8e7jgI7PyJHmM zvXs1TKrsiT5c#^$g<|E+vKCvu-KbTkNGy1;vUOT9RmW|D{UR)XZy(ZNR;@jV)AMKsk-2=c8LFcAW65nK7PWTYqtq-g1*mUd6|8Hqrl<5jS z_0WeSP?rvi3J>N5PK%EN5?P4y_pxIV2{|6+%i~|*p1eEbR_E z6A{y!)9Odud5W`h%gtbJ_;+_onR(Kw&ISM99a+%&(aI6bRaZhgxW@S;R z6?E+UZYyx2Y4aWAz*r0z^BV?a?Ibp-%>z-@6djVfk@D+bgX&hVEEwdKAGN|iLt>T= zfn9-_js&?(I?6J$P>=+n4|TIsNN!tBtTJdNRGn0`*9ix9=mJg_Kpa1c?}Y!`oIW?$ zb(hZhW+`>woAN<``mGLF$v10qIo`+Em9bGLHQPFP2Kg`wd3F%w7$p+dIOhJ|2Q3Fl z{df>_)?@0^|I`}6zerM*_*ra5Iu~1jWqr6`j#T$Y#;(rhdy}1pJL7>l3flcV=m*#` zKh-qS1;S)loj$D=gQOA{xSYL}*a9<l<{~3RwZKHl3 z-_e{05~p9yYva6d{+Kopnwd z8F|#>f)g^^f7`lRq+C0&iE{ia?<;+_TqyBEaZhSP@Iwy|;PLzv)0PFytf<-Y9YQT~nY(S|{U=0Qe1OpgM zP-5jIXnVFS08U1LWYp6vaj%Y!s~BRZaSVjo^4agHrk_)eJbJx(9NK6(7}gB4|@u-s0*Tm`tdW*JOz5#E#uGarkZ ze*d`WWJZ@s;#TA}43j0*ZKi?#`T^dxcHy?vC1?S710X?Q{`j?P<9xeW-v4v9GVLX> zGVK-J$3OBIcKq=xS9jU+$GW@5Prlr^Yn*TMH){h7E@!oSQ&A?Qw#Z_%3;3)Pi`;25Lm+>R2?TJ3hdy{bGHn zxi7YFpf=PJA1laQO^pcW7i~+3UfIaFqG0&r-S+T{Ta9DHO z{m`dX%}NN&49jr4J}Tw8Ul42vHSL@4vY7@7$wnC*PtgIr!zD#baTyy|yUIl_L592T z?hM0rdEiU}k2hsfDguCNM{ui|(fc$=#z!mHudnRP$nYLCD=Awy`RK{ehO&~xq;V_c zRV2JWDLF!!o!>v4pBEnP-D>_(%a4lUYd?y`qcoD9MCl$M|CFB~t+X2NW3{EF+Su!2 zaYhq^dM&cK(Sud0VPBm;h>R8B&U8Vl;t`2C3R~IH|@&y9_7^?u%4tsvC z>1eID(4Puo^7;M4%^y?6CYLdI3Q*`|ev}QH86{u~+~3&}E)$q;y1=qz|3F2CR>l%( zHJ)N$Gc+i9V`$ob1PW1^-^r>nA~OoyfQ_zJ#PT6&cxO}oQ1YqPDETWDC?Xp9B7tH6 zSZ(y_(7lCTsR;+#4Q)+OR)vkgvdD4RA`)H~WD~YG3UCRn3fm(K^qi!4DRVtL zeRqq3A4XIXuDlP_spa+n1ZFNM1;;Gf1+iOAXwe#QIpn7QEjZcy7(dAMS{2-c3ZB7j zVT(Of?u#+ZxZG&F(y2eR+|AkYb&)1%hyj>B5GtnIOl5#>gY>$q=HcLKE0i8?>V73v zZlV83G_|p;gxA1MV+s-B>z(+DfH41jav^14royv|$qNe#$5vTKu2&s1Yt?5p9RgR{ z!N8MpV0mcN7h06+_0G0jI(Gb^kk>YmO7p2ZJ zLCvyr=UD&y;?@0WB!eS9ZP8s1Il~jk@n_rxf`8ex6aD0P%K$@!RO%Mk1|u*CUwQhp z9IggygU*UMy9lhSJRgAPQz0y(U|eMKA*u7=2cA{dgR$BSM)B*WUVU9^$6LFpMZ+!+ zNrRPsnBOYPCkH0lNSi(8ee?W-YmcwY`7}~ib>VqqZ{C4`rj+;w_jXZk-Lo&3W62UkIU#4xL7iaD`17_OZ5t4`bMM#l7B7!NBvu_Laqep zBlVuH78ldZ*d@*N3p((t^DjEdy1JSJ^8DQW{tYQ{b?$A#?1;5W@>xajT7EQ`6gzVL z?)KrW8=Gf4-sJ}=q92vgE3naI9}eFqSXUAyFG*W(n}HlZl=ZL40DCG#Ss~ZBMcBxk z7$Og*k4R0^A{dyB$PFVw*H^dqDv&{f2p%_5M=Rh2hw6j4>Nr|)-nE!e^Tg56?ADkh zV_h;%c$MH$y310-dhZ{@X3)h)RV1aQb5M;#UXUP1;NzkmoM`ZPbKtmxoEhX1VN-e1 z$TxmHSklG&7kf-6htDTL% zWiip&?%6?_ST-a(FEF1F&-P6UAv}9g>bv@z*o*pw!p(sfIcoj5i9D$!za+51-gjT& zJ==&!1&{6)-+fpBETdSeaj|T0r808p447hEe!j|Wjk3N`H6kED<~|nPvvshqJcwyV z&sBo_u{#{#lj1qFlP76&6xa*!3GsIJ%+qlIpA35;Q5g{0A00n01t?OD##A^h`X*(0 ztQq;rVhhcFhwMxJT;QxuakCM^aY^&N9$QWdB$BvQiSzAwe|4mHNtu=2Y!Jb9g6$f2 zZL5<#>2TLarmc~)s-X#?BYftLGa6eE!9a6n2cJ0-AF6+E`*6iTXoNOL#pI?7GLiu7 z^qOa3&ysxrd0v_htj$PMgk`60%}AC1;pnfh$x~NFhw8+_ooqJ+sQ0tBc32-cbW-Y< z?GQS5W7)JJSwsUtw#WS@p`UG3zgR^5i=?)pmQQPv0k%2v&9x)rrl<{7jpo zLHoT7P&5Jv1M>?suh@LLV;$R=Uh&DkBWM`Lt*VtJRD=D01Jmzk4+A)4*&EiVs#-w zfLuQyK5HCH@4oqNWl8VlW<|6QF~v6CQ#~3|SFojBY#Mwu*rB7dO3s^6JTy$Z+I!0G zibUT0u0z;sWSQr$+mo%$8%^;`^`k|h_nuIw;Njx|j;j>YUO%clL`UDLHXq!m&1N!9 zQvW3M-46K0Uq;VR&$eGALA#)qBCB}U;Y@Ecoy!g~tHFTaQluO`hB6D=e!VBH6p98) zMlCYmU8#$J;CB>$Y%nt-7}|>NB7i^ftoU}7<0iRW2BMp#Qf1=Z!4g}9u#nDh9$ae- z9^)A(u2#(DiMUfJn<=g+Z>~zQvg*%EY*5#!S|JXM@q~|A!g+8C!QtTlOkL-RRaTMD z1~&gf=>jcJrT2UEr>Blk8BK!Ew#+4g_g)@gxVtZJ*S>R6NMZEtmn%Px_>uu8i7t^y zgF6=ZaF*3v(#c`rlWe)Tz9^!@qnjW=>dLc35feQVhB2$YUj+y>Rw;@wWUkFFSqu#4 zmHE8$b?WYR;#@s%$b8P^MY5BH@L&jk{;FVWJ-+XJcx8d%i`gY>Gh(;*l^o=s5D*~Y zn!x0*k^}$~n5k!H=t?+3O9)z>08XRYd!6vej2@6*O-!}Urnig8l6+owVQOP- ze-|qb{Beja8tKCUWjXO8M3nf-pd=&M6hluPEX`=W64Kk6Bc;+C!q37V_uXCK9dQ31 zCsEDz{dO0Nt2SByFoQi_CPL)I2b9r=EgCV9J2(BnMuzxPZ%b&1G_9>?(qyTOmz->y zMnAgW32+jLCSCA-j{N?3>hpp8qr+zC%^!G9^+z1{!TU{U+(6$y2R5VI!uorXoMpk8 zer4_hd@=@XFKGi%0N<>KD3EagTh^ga&4$oX^2-IjQ3M1h{=XtKPKRz7jKPvjB3y2l z$Vq-f)npC7)8vB8mGG?tG(&(-!Li16Y3Yu-wOT6gdn=qtD1LUUi~tn|#j>97(9p8+ z@nwLMcuj!?kR;?95DPG7hw$-*7?Y|$4+I##wE3P@MRN}DT<8x;bIHee&%#Vf31gc)b^(W<_9qT$-NSzpfL^f>ztCPPo2!qg`X zFvhE65QM8f7n~x5Lx3VdmQr}uWti;QP1GX9rgg(Y2{?}7=%kRbTg63{9E@`(RS=Mf zkkI!6Fn~=&vwTNnl8)0&v=qq+Cn;b#u}WQkj>>yD{j7dY|J2l6V2#+A*Gi4Rg+SaK zAN?*(O~oi+@=!oD{QU!dotH+X`;b61a&P|VKT1%*-&uGYk?*ICIZojl2ZI+ zjheR`lq&>VOxjmobrOdp39{l!{-rAq_G0`Y$5=xgljfXhLn;NkeYH?939*D>o#}?PE++Jhb&kokyquqUM`mm+G;4DWJS zPLJCW=U}-r!w)xZR_%t*Vynm%W!>I5Z>@S-G)mc~vy$KHTaXRGz75ykw+?b*Q>tBZ zi#JCX#&`2J^|o+jv74ic9-nP>GDp%n1Q3+CW=s*RIG88;Qa9YNY*D&}5ay@a4O$gG zRfOX$3+>mOkzR;o6et*|--!}cUZWj>@tvFf?phaa=?V;hGh-pQsseXg;FSImNWZ>f zS$C=De}d4fYwBx#S#KD#B5MZ#7ODTiZTfcg#O1nQmq5;aw`Ung@<=!6f=tVdz4A1ZGdy4E+?MKT`@-U>Ws+UH z&t|Kz@>9NLZgH*+<7Eq%eSG{BaEONZsP^AEW0$1|_n+IXHofS?tx~_Pi^twn^*Shp zeDUIQ2G%#$9=AB8Z_xcnH*eIlP{0>XbUN4Vp`M854^#8h&i2>_`G2U=Jmmd*(^K_x z#8cDPt~&}KyPTkSOZ^dUfN-7&_%E9+Fn_c` zaAsHV3@_bM@F(Zmn^C^b7FBQ;EkfDq_%mf$|NLFZgJdsvbk5^|nBHku7$A;6=(=>9 zaC|<_eXVVP8f-j|w6pn;3wWra;tft(ZIm2Lu3A$kK(JQBsK5RmBaU?uyZ-(bWf23& z2I}h10HkeUvLWMdi+&{_Un{wly)@RRF5FDeXOw}mVmsCZFg&$E!)OHQ9 zT~2R`vO#^Miz6eW^tnlaSrU8)s`H=R5><((ug=YSI$Txgq9dD^RkQdiEe@Qt{fw+e ze&0-<%-10)U&=d@)!`dOKs6yhTL+>&qnZa)wCw~h_r%a(!46kh+zlJ63)2mkR1K5n z-s+9P%{iJ8AVr>Smp+4U#J~~m++_yMGh3z>y}&Ye$wzm8fEx6xiQTe!)Q8$LTvC5#JEc?MIRr`*^-{hXScFr?J-^NKpFGW@-h!UAIg!rcofZ`7q)7e)oaZB0P`Pah~weXQA?g5_^$(vFZk#02kDw@bCAc_;re@%K021Sd( zw!hp^dKu;9Z5vQd@nE3sfvvOjNl!4o9)!Q-$hhBX^d z+CBgyA~Vx1yO>VRl@2)M<{I()xA|#PQc_ukhuuv~48*9xYK7>>k8$F-Mk5DQ^xNZT zdu?GMz+!{4H&+5;BHtJrUQy$h9`@!ajWhz1X6(pnmM^Y~Z43?je%R#j_pk*DIDm_Q zct_H1*ay%?3g}R3MW3vaj@D*V(M^XKjmoFl3Q_L(U9A^_z|3PcG%_?P9iGwxviIqC z?yrJ&?{^7QxMW9`X&K~Q<{0ed6XxVjvXsDY2Q5kX-aefxv z__;w>S`i}|KOVoD!f*j4Eq|teM{8NY7bX=V_upo9=5T~0IA|9flYY;dR|m>@a<>zJ z$Mx0a1rU}<1ADa_N8+^ql*(zly2_~}&E1hW>G!D@kWa1lGsnxw{vVlj{e$1w<6JMR zxV1|+&sp!PU}7_|FU|_iaID&PW3hP|P*7gF54jDo|H9pM+lU!#P_Qw0Bft_GlaT;& zE0-lG=603R3^)6MEmJS2MB0S_*TYUH762dei?8aw8L6o_zfvfCU1DNYZ|~Nt1OYN( zB?4OEhl_#Ek1H?xl#wBf|FdBT-I-fvV7gyYA-xOZkZN21G&Zwy2>oY+Fg_!rBv8no z2oREhtne?T@P)CgZ?qpL@c};Zw`^e3up90{`%|N46O3qdDCe4!t)=mm1RT_|jp=~^ z25y_^ahpchv z&8~3^L)79GYQoK%3r((Ap?+TH_$=y=YjB2sFTV|<&(kn|?oW<NRqF4sUz3L0c^@#l}9fpk{izW4pqxe3Ztqn)Ia` zeNu(mcMLSzOrHiQBBI+v zP;KSOAW(o3KgLH76* zoxHLVZeVFr-ZrJjYUU6q1XX0Cf61MGjIjJLM&H5L@0nUB8A#YOcVak2Ci#vMq=#17 zT5s_M2E(MyX>|WjvrhErQP-H%6Vqkblc>qnCH}(uKrKU1;XFMJH03+Ocy)llHRob; zeLjDYpI9OO+8u;5ft2o`7~H4^19>h?Z%*gr;3x4pTXJq~g-Mohqsg3` z3)s7#V(9&u5y ze=(vC424(Nl@D8Wn@Cv&DoHuB39ErDum2|L`@VizM+TrTIvgx!l?@=(7G$dcW%1@a z03Tf6uzzAfu76E@k2a}w$O#Ney_rtGzfX!k8UtfRfXw2|`kX~zC~W!6{FbNmA8L#D zL4q7M#Rp8;^NAq^;6pp3Lr4Ih4BSb2GCKO?UNSlBZO*epLV2j@p#MVd5X>RseL>S~ z7oJ^;k4jqs5LTVLNA~ap8A`SQW%8)dC*^dbYeTy7?^Xcz4k1)Gl*4a-D~~Th?pZkt z0b`K8HgC#nUi!tApkkhH2j6PO{#y-qY|f|Thcnmw!LJjZPtKRV9Nu&o5MCb0!B{`$ zj}&kV>cdfiIEIk#+6K98d?3KH6klf*0vR3KPJX%PMQM~NTcUssz}|@fC7}Eq%(K!! z=bkL}G5=?Fq<)VA=%8nzF?l>ru%b*JE@nx%Y5EZUrs#uj2%*ZaFj7Q$y$ zaez29ybVNGqJ(Q5qKQgEojavZM{Fi=noDy^twqrQYC~IB_S{i6jmVT^K7wBN!12yD z;S7}1{qkUJL}@92B;kQ=q_l5$VJx63FO9$km*027*rJurczD}u&__9jNu;rl&SiJC ztwjN%BCko|jV)vczLu(I!e%0*^NqzK*Fq<1Pl_{5h`@sw40bX;q-cPXdDzX-%u@70 zwDBKHx5JrV515lkPJ3p!oO5BkW?taA>@DGe%60*phK~bT>RB56;lGZ}XRqV%G2i#t zXx9n?H+Ld1=uv$?KX5HNdgnYkYJ$((yb|He?#+DOL|v;Fn-}L2&N|IG9Z^M2$fjj) zy%a{NZV6PL^I>mM2I_xEZejbJ3){~Vm5J<TO*#B4#{O93PZAQjqMQoEMNuiTfB=_t4IU4u%TjI(@45GrbdcB%M=qnfkJ} zJd7KS^FHtGYqCnCg(t8H8C0euW?xR^=5&!beShT6$g}AZIfv+ucZQt49TY9OEsefD z`x~MB=a|UhLzq`OcsMrlGNJgRdCS&==$D{J{+o%AOhk4~uXUz1JdD{z&$f%omzo@q z?AGiTN<`WN>fP%7T9HJ!KSJ|If}e`TJX_7~PAH~=tZeLlZUmg-v-G6mhc%H<0VaG!>N8XpVD3pRBH zB@OpMXW~|`Za^L;JF?3)1*oGAw222G=pz zwb2>$!#M;OjWYz7rLYzSav5&XehZ~rz# zd&<7>Egb{^=ncJaAVqHn1^^sw=l-G~MB8J_o5ZbwpEm{w1f8R& zfl;0y;W!vnOaUot^QZDz#@Lg5tKmhy=GOLu&i&)dT>6OQD4VP7zq(ppuj`cw-qb7% z5!yxoiBQqX&Jb~v;qIfwE$3_zxHx3>N+ONuNnqLS{daVi(a<1Q%V4}Yu*JTHw2M?@ zzlBsSJcjC>@2fQB;P zzMQ}Db6c7!!Xs1dHFg@ckK8i92njDdSDMCn7ghrnL*fSv38wL;wWBX;17)-YQySC8 zd+Wn5ghvUq+=DOdAKAT@ZU5IKEc;_EBGXF9khAq(*O_O**~t4+w1)a83!g$hlY)Ob z==W?;qWQ-%eu1!6_gb}Y4*1iU<@67+zxbW8{xm_hShWy;%c@$Mg zca5I#F@1En`qC(y9e&0>E$zM$6jcv?35Kb6>%~Y=={_D9n-G;G{E8D))s*T$%Itj^p)^{Q=v9P{RzkC(f6l6sN`L8eIP<5F^jQT0LO{6h!2>*R z-_9}HUeIYkI$>rWf!A|#GW8<-mX=Kc?&Z;W6Z~|L80hdK(!Bz`<*%x5H-gII&-wpWAOxw+sj8~^#nVgG$a#Gdtl z=?saIJq$)uj^bnzJ=XVD-*7+bzKbyzeU!25!ASfWJ;7Y|41d8mY7$>`Yi@=+s{+4- zF_)PWJBRXp4QDIYSGsYqHy2fEZkG?qK0?{w`Vo_Yrsf|BnJ}tFxwB zpnMZ69&91p`{O`egHz^CZ$Cbro|C8Xw)O-YprIrZi>t}D$qC7I_p-OhH0g#;Dpoj_ zBceA_%4gDEya%;=JHj1KT>($1n$=NU4w}C)=a-%85>1p*XeSuky! zMKxN3vU|V!Q1oD4JAFz-M-WPiY4`%D4wxpk@9FO3|C4{X{b_J^$J-tB_ z*=I$})S!T@D;6mZVLmY&*bF!Y)ZP zlKN}}ZQQu;nPuN0%FQe!@=hS6+V34$a)J8M+^F=xLIyBgR^_8I06Fbg>CcPBWmTq% z)@jPM$%-S^Stc5M;V|;%d^9>7>^(2F3w51eoaTLZ{OUVb5;j7Owy+)=f{Z=VL(Hd2 zX&5>G54z2&>jdnfaIS^6xyX}(=Nj=Yl^J9{JblZYBZ}|aS9AQ20L7_UKQ9=~^jTU3 zJxlK-Vz21EV_6J22a03YMY?AS_<8n$UE&Q;5j2@rMJ-9s&5yl-h%SLiZ8!FB+?<3& z&e-%k#^{nzQGcT)HVx){KWQAaWa_jWFZgqJ?pF&)0hT^O-2Sls>plPmblcBq02uj~ zZcy16-MN~k{O!>2Z*4&X{2#uF`6h@ZF-wuLKCuH6T}gGKB&9bd`(E|k`psSZlV7+a z%;3dOQ{LwtqCdL6ED9U^)%%YXAOJ*kE=>O$8DZ11t?Z7NP%D;lkN*1NA@Ozp9-z%% z7#il^AQ#)UxnVo#93@050`He>z1v@VVN->)@2{~BS3f;BH#9>gOlX9C{-Ur zWLx5Mi0HM()2}#o&NEePa3~597AbSC>eZfUPE54UkDJhG*g* zE!!0B^dgC%B7aR5u%wopNTs!+-myn!jlxHpG`77;3@rNyfn0_GESJihJFVDfNF2?iK7=~HI6wiLn{8@@$N?I{l$D{HD#!ph6uE`3W~KK&1M z4QPdOG{!28p;u@dDcVxz1#}0kR2355!)YN* zrfQ`i5jYvCvDf>BDm= z$2e#VOpBHjre0Gid7*~&tq%#wo*8BsAwZuHW!>Zx8|9N=8qbOVn}|gHZs*pdnsBd} zc{Ns5gw;+U`axrHVr5ONCy7R9#jcb@aa3lo>XvFYg{qMDfLj3xP9z$C3<%XVg+A>0 zFqi@#hhoRBTjqz$Rq1NHoZ+Du0xUdy^IC6|tu-mybUWOw#m0lcBzfIJ&wW64NNlcF;OeQ|i%n z-@@K{$2smr(}|^8+hl3mi=^9K#SyMrp3Vnfc;9;wa1hz}*y=v#SJM-uG<-9&?$zE`2=ce%&)t+>}&ijMF%o%znIN zD96w*ME+AA3M9|{8=_SQrzKM60{ymT5_wU2o|lsQ-gh%M&v&}o7QHjbD}3df#yA(T z!Rp9hFW>MJYdN|8Yq_JiAdNccZRk1)$P9nc%A^XCsczVA3w8+|3X zAYBB{lP5p1j+@Jy_N(?5m~eA*1G)JZ%T+_5g$Rv4Az{xp24n_`0T9n&vnT659$niv z`iM7}Yg=HeepvFYe4;}?j#d}Z~oiee(`(S<~v4v z?pW#1cB~UTe{BjV60fOKmdj}s-ElQR3X?r-=%2;Fhe}lW#I13bn@AC0vYdlqDir`2 zkcc-X0?Pn^okQN)Be+27`f#!aDE(%FwzPo>29j_zW#rJujE`2 z>Cd5Zv(MtsOb821cg;kyi&7_>Mvd{PZNbH@f4sh*&(3jDQ@UlvvW+Wa+QN!yZ;?pF zS{^-A94Cw~?)~)=yfxBVOxe^I2c!hb7x~wL@8+r$>I@g$2?fLzrOW?6v3c_Ua-xp@ zb8QU}H9YQwvBN}8&Z4jraZVzmPEMHUtHwtn$z(Uj?T3XBFL*ey!^E~aC*S_Z-gKSV zZ=Z=Vj?Q68BtDLckMX2l+e_!pkB8Sw$$jddbz~=@kyH?PVD#$M!1rR03qnf9ua7^T zAGDVIB;*O1a+QBoLmrDi1z#RlbpKeQ8i#Oy-|lSv4`x*q@33QTP-mWHKdeak%!6^% z-QmkRxozF29ox2#hg(O8S+&G^akAV1H{RhmVn}3p@l<(Hq#fpn^L9+lXq~pKRI4c~ zQRC5b7-phW;c+?*8^;&)%=U z_gctJ7)NwR7=?4+KkuIZ_GQP)(*eCxatnO?o^L4RxX>ynT%sFyD-x-txSqs z4Is!88^hzcj9u7ycdmuR7#`nWMdNj=-Nzd-G@L3gI=LR!aNG4dP1v|K*J}QUNSM&^ zh}`rr(}Np*O8B5MjkPu|HCtf>!rku|nT&C7Z|f_>K602xJym7Xaj+ zSVGTxrPQ$I&jDtZZ?hn^{FwC!1)`ouW zQw8zm(qM1e^B)WL)tqaa>+v^EU<$kmWp~e`c2jZATLbGgC1GKj(D!cl6?Df7_q`dh zrfTCv`>{FIcBP+AER<<0eH)#(1LDUwh9*ZwpYTI>c&_{~&VmS(Al zLT_jKRurI1hm|J5rFy#~43TJV+~o6u8WkQRGamREE?S8% z$)c9#-$$ZQfTB0M3f;#AG(nptKV{IsT>{#4OP9B|9UZ)Mf!@qke>>2?7I-gSpLHxe znEc3LAp2CJ7cVl!0rF5-@is zADf#AjmLEjbd_F?nR5ray+3dwA}O+bf?rMR+SVg}gU6|^X*2ri45764Sx zv}ms*8N+TujD_?mt@=#dDP0Y!w3;o!=L)5b*(SL!NsTFZO`=h*^MVB-^4#fmkh#ZKCrOxxZ4xJU<~ScSXkJ3R9&q;`r<`75txzk>wTY#oOKOy%8yY6E9=X6 zYZX5&s=5nK=sna?l`3URkz{R{I;x6$H?QkrR-sNG!j&`a-wP}l;*W8m!tb$RhX$gH zZ*Sdsqf&M|I7a1^9~8!$s4G)}>I&Z4`m&51RaBKaOtQA6NC|7DCB}j3z=8Cszv66$ zC2?A4B;??n2?4076=%D!gt@f?y9mM@c!2aq+7k4YsC?|dp{`Ux1diUyNpw;?>H11< z3&5Y}pFXKdc1UiH^fU$NdUVnY-7G5W*~1;4F0MkO_O<91Ohg5pT+VY8)zq4Dy;XKFoFrx%IEw?dxQltE(=z<~&@+T@v6N zp>T^rDud@2rmN$VQzH&PJl;^6Yfcu+!X<0XF>OQh&Bp1umd^Fl9oK?SbZ?Zqc&{k6 zsQuqhBFHljRfPiS&&Zd1dq?%TaD+Ge`*ZEKEX13-gKnA(q&wJ#DpzNAcw^6Lz+(i||T@YwSiqM=VUok6BoN zsLgIur6p4(uO&N5;`hrZzpdqETK}YgHS9Zws#&Y*S=ARb6dgtzdV0ltHZndZMkfqZ zr{s?Jm}kd+8@YXZZSQh_4c)p)7+ew<(cyPptL{>&|CVO1UUhNRsC{*2R{SRkAn-3n z6l16DSr7i)o`X=dQWJ10OGd!Hx`BicS!$nGu0s@^b3D`BF13^y(a@vM1>=rp9|P0S zQjE@S3xARPPY_oojZTB49`|)8_&=JN`Mo6Sxc`3x{Tg_i1fp_vT7E#(WrQCDo z64WND>{WsP>H7DpwT~(`p-1%8Sk1UNktejW>II&}pU8AyF_>*Eg~nK|J%o@V+_m=9PCFcvG|wm+3pD4BPs7(>F-zh zjSsthXA@`y)7!O_X4{+f4T$omzyhRKRij)LHh*=JnfSwgr@xV#YX>KdB*mvC3j zHPnr+9eox5wR&f%rOClO%-6oARyw(F?n^_X)7gL6KeH-LI>cPew-JLXAIksAUq9BD zGuYozifz69OKpaLlCQhCi_9vM5v%UleBteIW@Eo-7M-4lYBHdor5Lcv>X59_F@XGkW@laheSEn5H`)z547RZ-g|*DBM* zQv~6bY_CTooQbxYbFCZSVK?M%6dQjK80*SAo&oAtF*O4i~ZtiF&`H`&Aaz72$T? z2q(}i*FzmN7D%UuCJn!4xRK4sHei3(tZ#C9NLt`g5TAZPM8H5Tp;G)BN|}Dl#z(+7 zP&Pr7ejvUen0g&v=M(b7v!|p3G7y*~L`!oW^QV;gUQ>J$d72<9uq_D7-r&2}(Z=Ru zcl=!524w-QKzz*l6fqnN_s>Gh@{?w|lpBP&2!mFmsQ&GDZAn2Q18PuhRl|8+qK$j{ z(N9$Et&HFp#`#wal;tD?w^U?d@(em zE<_J1j&wLSXvdCD{N6rh+i0RNj{Zabju@(Us9k&#Rz*&htnpn0`{DRe=|jlP%v1Sb z%Mnn<7X8$^ff=V6x4Hwro7mtsjvuId?s5AzSwW0oecrDBPQ5fS+Z<}2eCjQHMgU3O z=g#Ng()gVh;TxykMtW$x=J}l5(v04+r4*Cs6~yaygoiP?HOSg?5h=5?mG4)}Ho6>M zyzzDa-s86yhXR^XTSaqxXR<@KCMF<`#SKkQICAT!O(DSjqWJzC)zdJ?MWeN|+4P;; zYTsi>*=~J+b9X0x8Rx|JD{r9|jo>gxt3!l_Y;Ok54aa8DlpacDCe97{Xa!1|zn6Nh zJYTo@-J9*uCCFhAn6lIS-K(udD-I`c4>HQ9H&&)71H#6gkM7%QJGBWtZDJZPK-SHy zZs^KR|06_xT*z1XDTTgVrHJdHcH@iq8o5R-DsdCkZtbnEompMKCN1^Zi-l_ip-N7q zfE}O^2QVUNtb!M%MpWb$TDNT#;IIw2+p04OZ`dAp>Qt=Vc7kY!|FrgYW6gE}@>&bF zHwXka)8@@3t2{w|x7F&7fSC3KlxR_1-N*ab7niV%KT|XEXM=e)FD@)H6o26hp7gt0xsVYf;yR~&uWXROP$^CHW5~{Z@L*_GTKD+F=M&{x1nmU1A_+%C9phin6 z>d5`_dfO^UJ-OH|+grQp=Hdgj0bt3g2mweG>8|j~vdgh)27-y;him&^E*}mb{OzAM z4dAQD7T$oRUC*2AU);m@ADnr_Kc;7{1N6RQ#p>D?a=gp;E zzd;d}@GX)0M~uN4zW<)u_&1RcqaVJGaYzs<7dH9}<4|6o0}=z=EDq%_T-Yd7IwZVy z{4#H1D2ambErFt#?oWpc55paUDh3N11>yIcgnUpPyXD*lXZe0{F2=mMl6MJS?$ zTQio9iBdvU@XZLkhiN1tZbc-1tz5dHi|E(N#C17)uVnpaR)5!-t9{NfH#c9Dr*&NA zNA?P;WPwPZphV(bCkgRowKL!EA^mST%!!VX!ZNh?4F9WZoL=UZ4Y^r6Mj`tWgLxWW zLw{#Owbj+j-rK&~8v6Iv~D2D{7H%ml=t6e zX`MZL?6b8#m)>HHu+!bh7UJoRtA?Za20Ahl{))vW{IZOnY=haRjC2Y6>}@=XZ*4*H zAAl@%O^fuu!*4R;rg@PoxxX7oFGy9K&Pf?c9`h!i z9=lCE@M8orY2WyND=NzyM96s(Sf+J@-4jw5b0T*CLSf6w!i|RZFHg< z?CebJA%qrU%$YEVt_@>x=&f@%pu4{s^WVYeK@P-vAo96LL5jq)yoY1mxkdt;P$*rW z(`!x>9EpWQN5ba;%QR+VfS@L{qIYXdbxdWAYZ0CGjKBs`s{K9uq=DE`DTz3V>3+6s zTnZ5i@CzZJnBzkJU@#?y8i*kMpj0CeNdz*?z`?L~D{Rib1bvgKyS*tv|1=G2Wk+!w zo}e0_20um`8e?^rK39_wTyMXmi>+z%4Gr^+4Y8(z{2(g!13-?Adf?b@n$jpow7s)* zI`|XVGJeA6kFEm7mMx5evCyuwmhQIHD5Eio+Rba;`Q(q^MIsuPwj8TCxTZBsyaN(h zb8sql*>>e3(O1T}6}&$_u8Y_;MjVTaAG3S(aR+`@4~=!%by+5mkJzISNHq>S5X8<& z2$j%?I6lrTq=Uq`Ob0pjn#1rBER4(mbXXFi-r&0nLzllna$`R|^AomP4qy8i!KruH z05HJ@cJ+2x1`9tu%Z-J68@fztmAG`fm5VE!|0W2Kr+PDs&35xO{6Cr1Y7Jd*u%@gL)Cgp0g6S-XOL%11D&^h)E6Wf|%Y6ZPMv-BxaL6_f ztS)F`l#Xcz9LPQtH4k&p>u<3b?O2<+Ao<>EDu5N8^LTmV3D0B5h2v`k4WM35H} zRS=6{!yBi|N2oC87FJ>X$AYWJS4b%;3r-VM<=LPlU?ib(OR7A=WU)^X2In!bAw!tE^La+IPUb??}!|+GZZjC$U zf{*Q3LHcY?8lWuR;)X?S7=?2@=>$TQ0R!xNs2%aj@?EQy3gMS9aet; zVTuFui{U^MmEqxDEgvi`RR??sxQGYY?);J;bf+r8L~z0~)n0pBR_156R?m$;uA@u# zqW78&mhS3eRQ;{3U3(P+R4`i`F!6r+=QiryvmFOT0p84M6=gpD;)LoDLLp2g1C|kl zeeuwRsfzisWbx`u&LdB?tgfZkoQM7nQuApVk^)B|XTj-%>4;)-j`ey0kLzD3D6U;6Z-PBO%O&3U zL~|Lk@KW;{&3&dgSC;i`zpJIXxjC-HboLvvegJ-`tR+zVA&t7{owwXnom_0^ZP>YV z4Je}cIGcY#JU=OZj_3)`dcqZK@krTsPxy=Q3Q;P3xL~z$0O{R(DCX_g$M!ntK@CRB zCDX%4I+A*QKs@Q5dXeXPlL$zy+noIR?H(wv{A*J=I`(m{kkZ1>P zoMHu()p}QbjCS?P(3i4Xb;yV8GcYrI) zB_c)Pz|k6I>A=h&4=X8tmzZfYco=YsfZ*kL9I{a0SN)AnYeE-Nh|v&?Q&&|oCsNws zwi}Cte!2R&y5z;;Pjag$a6X?M+?iEFCvOR}UN>_n;G;y$@8U-R z^bycAP%2>5KP=p5dYjg%hF3pNwyiyaE>JfD28a|<-FZ>iT#$#-nwCTanr#@9H7lia zqBwAq=w1Od2h@g&9oIF{DkqA-6|=;c9x6x#Tct%p0VbSU6mETtpSiOwbX0aIB;4rc z?PhV&+q={@Zf8gKth>eBO8ZaFni(=(5*F-?_j*RN3QbOf=&*md!qpOCM(0V_<4H7~kuQ&so0ajxpot z60t7uP5Mk}8vb6_LXZXd$`j)vbnl^4c_c$m|0g zA`_;UYP+?D+lhdhS(>*=`as5Q17YYYzOBzH@Pm{%(2xk-<&}iq&RJ-H4EIw*n|b}L zN#!&96xvti;pF$^U9EHE%%Qlm0&05@V&f$@x-hF$X4OnZd+)8rKd}l zIAE_DB4I?@%lY%=Gptf^t%panxa+cH!4?G_iMwrGXyA9jzYl?qTcj~ch>WLZ)GgUI zDui|B~uA%L}oOcmM72-F7qZ`cYv z@Q6?7SEx^7h#viS5+WjiBXA2^?Su9+^I{{*P*l>qd7wl?Gwqw%QsC6)w|X}O2~O4K z?Y#3^;U2#vsU3LDLg@hSvYh)4v0c8^MFy}e^dQAgTW zAGf2%&gYdbrkPod*?3vN>f3tWroL^Zv3h|-50JbSsB8jZUCy0eY;rlxiN^DgiFx@@5AzxJ!W;K2o5ARTR>igS=6 zYJfuj5cA}FY+&qi5D#pBXN}C@sDWnAyhyn|7_mMu(D0#uP8KQE*JqIScDHu$$LVgg z-%Mad=UlUMl929;P^p4t99}RUs^=n(M4s#1>m2KkzHzKKqr7~?j}a+cZT*o)nq0|p zP{XzQ_E*Q0oP^32*gq6iD^ z%;p2ZbEOPut_;bhdOKPp4kT1KYSDcw#dy^Svh|o*Kj;56Gy1td=voAH~dLuDf5ou!0 z!}Pk$kQ{mRLB;iJmS3$rfchcuAJF}da3~52!$J*euDAA<1iAE0y7y3$FJzW?vx=ll zt18pEH8U)k1xs?oV5(mD>9`LPt@M(D@6{Lf)Z8oW$!|IOdr9(_;@Y>db!>0M=@;?K zcah|-=#!>Cn#$Ur41O$eNXJM+z0P7^CU0Svr9yZTwNL&|PF9N6>G!&Bek;+gZne?< zQn7ETCTY1*-HQ!wAf{ct3XGrUp`igl%X}uo*Qz2tUs_T1Qi*5tG0lpU?_M!@IS&Pa zO{~eA_kwc|dQC>E9>bpZcw7->BD;(*s)3hv>n&C97|%E5w2;#pQyS7&A5! z#$UWbxH90)FzmcWvI;tmn!LV&+!QGCcn;-ZYD>Rv9j?amnH3CGH zZ{mqcVo|L=%U}J0^TFoc!@PPoN{h*4%VfqY<`}8xs=;!<>S_9!I9k|AY6wlF)ki<< zb4^R*Y}=k}4H}H4DFE6$Y+G zMy@F^w+o`__)(5%AfBpXbI3?%wDE5-s}Gl78S6h>#@)r=8YwT%A;D9- zf_HzL4B~~IM4lVKNSb>rpD-e6qwP`bQI9ON#H%PG7lHfD#1qQzUf6D~|S)VQA)`;I*{2 z?amWNy(b5vS1--(-DcCbA^1qD-wBUmrGm;>}+gQq1#l>9o6tsB)9$D<~S>D`x_fHtynla8<3(n zx0j2}9eC4qChbf7Prfu-;V=akF9kILY3WP`eS$C5Ia^37uGmKAv&1QIWWg`1$)eE)~p@5*#&%2tkHh4%)?0M%FsvWMa` zE8VImVJzxjVTC@%8#W1qM5Qlbdq#f7CRJf+#6ovL&NZQ!%k8TwQ@c1d!;9DH#`t1D zGh=P@nb7L2K6BcjCXUjLTD~~jJ*#OFU!Y=KT>`4bt#zA?vh8Y|jGyF}%R!Eo}`Cs~FIisLGy2 z^t}j@PZGWO;nKR(*W=G#>(5wk>w-2#U_9U}<->U_C;q}cS0d^*&&G%VdxWyEboZ+N zPh<&k{{0HSPKrA>g@eJ!`NC=+NII; zMe3K^M^MtnmYG1;6wlF0#GLn%sv0TrU~8{IcmZAQ9Z%pKXR(YNfDNk^2jM2|M}8;% zXZSeUn;eab-U<88-vpH98ppnOY5v-3qvhdy|FmXb8EWRHC94+!lTZgNWJT3IEetV0 zk(%Vay}EyCPSNvZWlEEOLWYwxiihz*BcL)N<)ybxxRbRi_tt;VP>acZxNukOK` z-Xz4nD=1bf{wNyb@J_tINj=6tN&%Dvh#++Fr6Y58BTt%`NXkM443)dszVlvCef>vJ zZ(+SpZN(FLzMTw`!SWqx2V-sumu7HwpZ+lRV3Nc^+wA5#wpNEPcav_XRelR7rstr} zk7JAa3x{x>@d+yIS@fvzjfEb-jDx?b!6}G(&w1L!5$F@W|HdEND}g(4#C4}UJG)$m zwr}yh=`n!0fP5C77!0lGw7-^;z<$zbxy4r1z!(r_D|)-HCu84g=Eju1LU#&AAT)&D z7XhvaSg1+#V7d#Pc&!`5`KK91t_r6!%9jregiwQPYYLu$S!4r=vGT{|vk_fbEj8lx zxoT;a!($vV-q`+*pi?)uB~*S{r@`AGiC088(U%yUW{xN}=bu1-F>somXgf;ZrrSsF z-S*oKJOYVINQ_h0zB^^Bky{bjd*ALnarOYvhn141hB@9HRe=YA>hN~iLc_P?<72iH z3w<#wV>bBW`8Mlke5nJR)8qX#w|&)cFeDnIAA#C%x2{{evm=7C-SGHP{Em)3{;UI(wAZ#hoR+@? z5xABTOs=J0Yywz^YzrRSs-^mPXiF8)B6xjYQ$SUtw4knX^ShfO_6vPq>UX}s)tj{u1ojJtL1xzi`Q^ql zd*KN!_Jg_WGwqMN`!p4MUEwTkt?^$-qrrXAYWgMdQ zR>$*pr)})gz^z*qpWp)PDv>GHYTt_!A-&eKw-lo?6H{8V5tamD~U@$<{P^ac+ zESa5R9pMB73>;^>vo3u<`(eUH^;UTnA4HFh#ObJmZrSm)Ze?7~a!lc&2N--0|c3nZ#Wkf3m39+@v|^q~mha zi7>eK$SJOs9jC`4JQw?%GrGv!yGxb4_U>Qpux4K4o28ht3;43*oRx}GAJ!C{;{JOG)i`}xKxh^fy# z!!md8uiN_jSHt1@Pa0syb$6*t%nsKU@9)9P;19>$jgW0{hit{TMZ+Lf&sz1{8BX4{f(Z)X=DH*H0fx9fho~t?CzApto9DAir$M{3=p`UI?PUbWn1ykNCI9Ckio}H!)mGptS!2j8 zdJdF}-wYYpO|@LB8uiUrgjX`j@Z$@A^Hk`lGT5ke(f2Bb+`fY^k_yUok}?vaDoUpK zK;r>7q}9v6)@`6vG1HAt@{HPUsB<5JKplyuaAQ?CShf1vFo2~3W?V|W`Vp-mbO_W; zS&z&2o!y5P@dg1Lj9*CaYhp)|N|W1($*>kRqw2*GDayza3M!r( zV{4`?&RbM1Wi$MHC3YL>v?4b-o}4&oxRED#i0|PobkS)owa`Dw`SKS3A&YI{CtHS5 zuv%^JsNcnLtp%eEGOI+7z&q zADY%V)-XVdX~IOs98y@4a6)$%3sXBW7`IQ?IP-WSJSD?KlI@Xxz>~?xX=#hsO;tD4 zjP=)bq{py~==T?bCl>2MZj{;z1V#~<3jT3&h@Yb>R7XA_EOmkQl!dUFYQetG4TKN~ z)NwC}!zoVH7K>7Z$$?OA!A6zCvsH5mZhlMWGbG99+(E}SlTP0FfggH0i2rc#y~!au z7)e-Z%2J;~5#7b5S)HUSooe<>u`n|7nv&TM@*xrJ;joN2T_Mcm`a$+29c&FFeceY; z0KrLzU;HlDu8nxs@Ou|DojFDjKVMZjo~CCj+Tn>fzQ?3rMg06dd=r+8B28}gC zIxaFu>QrrC)Z{XT&wcPf7Ml}$KW;l1{f)V#2NelL>n_HGgto`(&>vA9z=t#<`TafX zOWlN#eg8QWi#a`}qGPQ&H9>QIj`6!}Je#1Urn+&MxVJU%)a&6J=cJ?ScJ@645RV># zR{eTPTnRyZ{+!uQv9ezo4}z^4>@vD`&^(3mRxb{OWUGsE?%WS$Lr0$QO2kt2#QWCH zq4;dweyiYR_$dvfF<%nd49F5h%l9TFYWL23ko-kkviX6iJmN)<-+$GEXXTb5$7Rf5 zlI;AaHOjW9taekLQ|$she@3K^lo48@?DU zf@r37fiKz5Fu!hib%ayrR+0RDu2K@c((k5P-onAucx>~2Rk(B@rCpDrYec?W>76ct ztzX*xUMTRbbZh~|Qnrzlz&JeYpwm5aw2*5ARj;9)VXg|}@L!HW#eECbKWK>fx5C=ZMIOCb(`RxMM~NUT?5{ukf3PseaAVrAKx z^WSa6uG(z*Rw&}aU9hQSnW1zZy3R)z!vSweTsYij;dAQWrW@jND)_8*bfg~p+A7QP zbFGuWC5nEhCt;DBe3gEHocBIOpssT2cKhk#aGFQ*=?AWDpSQJ>j~oolWgup`d0!jQ zZkC5db7T|yThGw?))RDyI)|2ZQeVQ~rI7+JQW>mVJRs$rD5d=L8R?WOr(C6BXNV<~ z93@1Z&<&@hkvfgNV=^^m()FH8An@=Df5EI%zJqgr66NFzw?>)yr?SVT9Bou7Pe68b z)K2D;&Dq>15;*%*U{C;!v6VAyFmaQjY<5=u^{CeV1?^)0SR@Y@IK+A6s>_zB z$R-8Ib++mZQus|cz}fGENdA-Mz%{$T_ve9A0s&I4V-l&TF{GXFOU)GJv*Wv~ZLaAQmT^grN!6}FfsU$*A zeHTee1VE=AePk6Z9GsloQD+nuc98vSbg=LR)?-a>ss9n)<==}*Q2A%fBmM#o!P_Ct z%ZGF2>+_88VXFAo|4jIU|0lOyrEh;eqyBj5(0BudqqZNrq5~|tPZVCG)3!+aW!f~%H=U5@vc@MmnOF--GMulEx4 zY2*=XofNujekyYJ-}D$JSz1O37JZ{M$Id$*AG;=W3Pc|hpzuXxhRXxBolV6yr_Fn2 zc^P^XoZ{F#VU!fhNR0cFmm7F0C?w=of`HxbVd2;2=kFILeGoQ6*<=N|uYS6k7CRM( zNO2y47L#7of$Thdx8vqA_*5rO--l#1KkOhG{F`MqrzxgF4_z*2G>NW(*+7t1eA(ni z#hCWAgI#$v#TN|;K~{I#($Hvxm(*{E{(KA?rl7B;Ml=6tksbRBA`TB2ri zB_9b)tOuzC*bw((1l0qJ+S@n*$|Bo*`1|%tt$O^|$51(IEe}(HCjD+s(`_`o;QN`44 z`To$6^x1SgRz;4vYwy^t%lLX8%gf2k(o&fY1KLyD@m{>^4S^7jhQzY2s4){GKbV_W z*dkHAsj1IYD|Q!lXkKsB03dyS^&TE50CjS0>dLmg@83{gPM71iog(KzO5TLDFRPgi z4@Xp`pr@nM z>wj+ad;{H9#@I+SloOgdD3JKrW10?Jg;cb{8Q3KCk(jY==j@-eULkGS2Km0bE(5OR z(xw^#>H<8=iah6MpY~cfBaAhh2LiWPBHafKo3qU{ygs=8IFny7adA%D-eb!QPPURrI z-#^7yQLMUMy>d$oNIegeFNx+`+uE*$0Fe!RaV*BT1bGH^3!QLal>dA~(@k~7(mG(M z38TEJfdGhG&o_txtx^J`vK@~xAQeF2Fc;x~1b{I_{+=T`^7k1adHkBWBm^i4FI5(X_{3m0;O_(m%&5g@6S3sA%~bMqsA6BjbpJyHwVx?kkSrDmkSUYh5>@_`zX-IeS z2KBPv#*pY#<__Wbx-0D;3EPnB#oOj0w@qg^;_aG!dAsROY2kjI z*8X5UJ^Q=R>P5R`fR+%r1UKWd!5iztbWz!dB7!jP$^{2%R(kV;^!upWC|3w)S(TWv}rL!-=RuxLtHzPf~^DcD4Mp0@jJLA3@H5`_3n#%dP zLW-hF-nJnUazfd-x!KrkAT?4^tkf?fL2&2uS5@IMIBhxEA}#ON35Q2JweeO+)$tC( z-q1|MKKedO87&!e>D=Qisf+0?`w!rxYn@3_?*`P#8!RI4(;4YIhyXLb${Dtih8v=2 zYJ8zc-V2gWcJ-mRz!1w#I-F+m#2?-yb%`w0x{c+g;zy{?H#An$q;`#;dVT%zjY8OmR#^&d=>lXgr1C3k_44;W3WPK6nipyNB zEuyRQ3qpl{`aAsQ+Nl@Wo%gxis0NuCpbZ7=YCCTAtNOnsesbo8t+CX~2w4E`IA;v9r{YHn z3?+ZazM`KaWdFMFVSafDu%K+fkL4++s_&bJhM9NM^ev{%p_UDu%_Uwk92Gv-2w(nd zO*#!;Vb^KoPBmzcuz@!lolj;kWPIKR~5=XmELnYY)*%$ZgO=!pLIa6jym| z{=4TFcVRzvW*w4*p2TlRpf;sEGWqVN{XtQmd=im{Pj%CdrkCVX8lO|rb_a!loU#>mFBvWxC#Sli`oIEVbYF@a!?z|BK+0sfyRZoT^M2c=!sqs=&aac&A|;pO5f6L76OOPfE(}PQqVRM=e94Had!Ar|dJV&y`#Qq*8Jgh_=%>E7Kfy}J5%!GW+=43lSMMpEVm|cmMN-xn` zIw2E5z^KvZ@*K$G=A@Zd#er&f3b-2BI#3P)&VIB(_YXlQ=78rv4#edfxxx!~ zTPLJ71I^E-9a`PrgtL8<-yovZJTTgcFjrd2SM!J^GfBKS4|%%y6DzCDP`NK5U_cn2 z4Ss$BnHj~$=(so%$(dLuZKes9`m&5Ze_2ezqEGa2_*6vJKDwpFu8TDI2 z1}*okCFZ-0lgVSfV`z*E`6qndbMR@)Vs|Dw?Ey*@P;F{FUnb~)+~Q(Pi6w`B;#rb}7h|CL&>s`=hz&uAcPHFmu{3IKovZ zG-VOmU8j3P3%^RA^4jr0#4?>Jt8>Wlg~|g(e5@?7ph^zs^rXr+d$`)`M7EHCPS1dA z7xUv%y7%w)&CZAD#EV}3zYs3JE>N=lrHGqVWQx-fH zEr17RZal~|ksH34za)abTFq;K;*zk2rB!FZF1gKZl7~r`e;eP-`%YA&+JP(q8h{5b zf>#AaLQt&9e55y_uqx55NnAuRqz^g2 z@G5j}4!hrnCl-{~+xL>uls`Vb0fr3x!EV>ywJ)Zbq+P8PCBsA{jSoOqmtS9J_>_Hx zKy}yCQO;l|rS zL}KSil2;D0M&sF_<{essGp$J6;2z_R7huq$b6uZBgK<3k){Wj>=cfBJ&hv7ZS_LTe z)%13z@#zbe5J(VK3$*b39lhA8a96Tv78WqQCuRkU0s&K)XF5#!4%qy6wAy)Uc>>$e z!m;;{&N1}Bf-;~`C`-RMpf%y%mba_oDDKQwi=kAqYDgbnf?*9aXe-NTM=Gp$(ugcV zDUzk$DkzkjP2+`{BrgmL{&?8!RAB2(z7Rs>9_0tyB8;Mp63N|9$7bY{Zw?`omq5z3 zX9B3Pj&ysb$Fb}5;C8dMsEYT?E>pwQ%y{*2JUjQ%{WBe~6`nJM8U>=cA;ui@OU_gy zO9xC8h-I1IC{GoMTvttTNWvAv{~SM(XzzN}F0|{N1&LlkUOl7ECd2=L0awA`rpB7? zYvN1X|7<2Y$L$csvjYrPF77x)v)p#O+gX7H*SB-3D<9we3}AQk-$PBHJRL z1hqq5)qV)C)Nc7HJU4B~?8^p{sa=guO{eo0*wR zfEK&A2TQ1(BkZG2ksH3fufTsVIH|^qUSqk+NwQo$2AA-H&zeXcy5o}D1&j)HCLlw= za@M4hef6X6D5Y1el-d`|C#cX-g9cKYESPAP#`4t57totG0gsjDrFt#Uv)dV7Fzzeg zR$RdMe;%-_n~)q>3mJu>iIP)8b#1!EUdDDt?`*_Oy_Q(%?u*e%onXjNfxq77%LOm7 zOGh&xBY_Y}Ja*ObFKe&NCPV-UZq26VPN`KU{r$UnJFG71-cc3U>~U-n?2YW=$IBQ2 z`(U-2gJhmnJR|gNyf&`#I|y{E;YtQ%g6w3_lu6iezIzz9%))a!2cj2y^GF=^rL92yzd znp8aq?ul35B~~8edk;~_@GCVsiUlkNkk9uULP6xKKFntWXYbHSIP6-lq`%ajn0>C{#}HLTw6HVKO6jYt_+?aQxv$UF!dnHg{d!+kr$$@6zDZ}{#uT%;1 z9B$9vjlLC@EAa#S?vbnVc_#U!?&T`K&HEzyZR4F5Dg-}a7jBvIFWZ#LN)D&%A2`cq%{|4l}Gfi5N%*fMgOCEGmqS3 zD>&*w5}vslA^j6W*caH1FR@Y}%7MR6r2+C% z|JtP6>7P&S(7Ei?Ru#5TA`KGl?udFo_~Md1$!-_OD(Qv1CK;`K`toOzi2Cgzx=fqh zA`}rBrjm-wi_@X=<9ce$(UPDNo&%<#O60!C+{d---NY5LU$j!dx8F`d>r>j^$MSh! zXoO#V#<^d6HaugY_vD15Ul_5V8zxZFI)BPBW$Kw<6A(1UfK&zvKuWVva?$qh!hmAj z$kQgg_hwy}YH**+=Rd6-nnLqe=zB%f6j<&bE;&mi`T}=DT+kZZ;XV8SXf1^|&~S$| zc4#4>XEfc#X}o;f2~1S-i)m(%oI27W`_WwD+}>BB$IUiqH!gLNs}k7?VFv9v=PwTm zj(=bsX|ccnZA$3YMZl*4K{H3dR=(XE@0jSfaMp3h>ZY zymc|gEvi;4yeDK@8Fm!|j(McdU0(xXfHMRzP1AudJY#AVZz$>pXa2k@2AM9<Fw=XRaVSHTXB!&}O0Rzly6hPD}(M~%C6h`#ak}63`M@c;bF>t6`&D#O^#_F+~#w@-#7v{83CVOGxO{NAg zqBWc7;p8mrhI;|Oj`FqTFnseBpqxiZ?}+A%kzQyVXez;Qc3V9FAa!*_$NQM4h3aVo ziY3K6F%Sw!L8;Huz0dpXDB-fuM}BDe+yKz#p(&z)88Yydk+3*@&PC79Fb>8UQ(|OT zFtZMLEp>_$y(u3SZKaZtAG`_@{8TPZG>PIUE0`2@c#E;pm9^=NH{P(IW_Y~5|ndh^H%(>YN z$fe|2zwvwwt+k0RLHT1*<&if5e{0EsdqXIccB?So8X#l>TpG|r+tQbtWhxzyu?;HF zZJC`<0&n8{Ge*lSrS-Rm&Ppw@jemKVYYAC-m}rR(d>C$_N@TV3j%eYs-kgM4Ro&Dh zyhyI~N>;J&0>jVru`{wkaO~>zJ4*40hi+MUl{mkdUe#wXp2>*#vX~vF46fwGe9n24 zab@3+`A7Bgh?&Hp8+-lqz^D6%^YJZJvr8|2gmIe|e6T7rRCQ>W`Qfsd2!=p6seUwGIKp9eXnCp)f3J-25+zgbR&W!jfkMo}UG z(rMK)xA$GzdG&Jf0SGY!>-!HuB4BzzWB0>Nl?7N++-H zKmK=B<3`SHJUs&cl3Ub(SRqudWZlHo-EYC9UB%Wpc<$uUYf1e1WHz)J-Z_PrfMj_q*nLVk;ne(=X`#nmQ?7Q z-@>T-8U32~_#6;cF|uFJJf4(s1G`RacL?*!9RC4UFg^=hYSXibMzD{dFM<6?cji#o z!o$a^tFC(I)d$1JPXH0(c?`&XKa65N2 z;GtcQ>h3*;=pB!6uH$ytybSTk*~R7&nDz27bfH3r!a#7jhN|RJ4Oq;;y>kIC^O?V> z_bjCtOUY+rF5h;3ZRQ}Lmh_&G{Q58{J5sC0YKuQ;e77YfvVzkwY&p+Ol4o#vH;cmf znhItcbORJ7vY2pSDW<4%MP@zL){wD9+B`*I!CJ_1w&=wKjg8hT#Gy~%7^rg183t>O z=ELbNS!uE6bS@a-*!s!@juB$F#P&Ow#~%H+)MRC*c=&NOI<@&?Hgd<3^7ic=W}x-w z=PKB%9k{XtXXz4Od;MX0-2+LaMto&hF_hqtw|Sc};*JYV_aO?1pZ)DGzMXG%v?24} zaeEW^!n(qu{gXCvhwEuAI)d--7EnK^^8&jlJ1cS>rbRl;`(HlvBgaChB=;TfxID|B$k0%B-v!1*c!S#7914%K}No31ECyN%keYM42rJASjS zF#KQfD1M$FM{a3qd;w)0d~KTAGd*#*FxPT(R|TacMV@`MyaN-h3X!H354+*9wKUa9 zS}wpWitJDU`aXQiE-6j!|h%#kvdMsMIgMUH>WWeEQ#m_pnH}_5CkK2iNzx1OjBv!6z~C;>_cC0;xy6cK^eV&xj>{s; z16Sz$@-4}8z_->k-tC-F?YRi;{1Bqbn+NUj&IWWD7wIpM&r3R6Ne%r%1q+)889-GL z1F|jkRj@MdCf6xk1~9jrWM(L%DK@Zw_!2QW;3Rsd@hARShY@^8op5Pw-byy`&bND+pKSFtm zOn3@DSl1Hu^Es#W`yF|Ut4S6m1$|eIr24g&%P&^Gq>>$fNj}R_1%jO7h`{@r-xER2 zaU#;)%VMA|o9->cGB|`R2~v&=#IKs)v1PF^?-vI-xwU$OR~!$l2BlIf1}UDBM3Dh~ z=*j`PyU5P|Je77&wZ_OKDkRKmnW6A7o82F zbU$HKZQ*halnz{aKZ(xGhG8`aak*L7{R0ms(wa1#{q3>id6eW9&&pNO-@2H{)an`g zd)4}viv7L(rCwy5a-)1}hbO0ax%MmhyL1nPt^AiA!R1CGNpk=+B(&u52Vb_>xDHYp zukvhPLjH>6rM9${ejy_}@KBzNrrDnEbBvzJ-%;bP@!B4KY}e%eqh4~!^rSayq7dDT zKl{y#f^D=_{gQv?$7wmz3Rq(6ck*R&^9uogOxrJHN9a-+IEH}Eo3DTC=CjX*$bo@3 z8~3p_9?3j70WdwzoHO7n{(+&?)icueYo_F;#LJ#Q0a67hS>!yADPP>z^Y1mqrxe~b z1hE@eCK*^A{ZX}9Y3du7Fj6rrfn%$4sESwA?6)6(`Hk zi<4HgtgD+>Mlg({8AkvB1XzP%000pG4QTT+fdiRlc?3kod7?f+q~SmiX6DA`f75N( o-IM%8o*ehr=#Iq=Q0BvwUBdJ3D{M(8^tv41d}oRU?8#IBFtJy*9zAN5dcxqGlMZGL>GG%R#)4J zDJ2;)4*E1pyHia%>lMv3X7Q`UoFyoB@|xvh^)kOE3)IL&0(G&i;g08s>c%~pHkN&6 z($7!kyv|A2DsV2mq-5Ku)D#$Kn$CzqD-wm5Q*OtEOEZe^&T$xIb0NUL}$)W)Ck`6oter6KcQG9Zcy>lXip)%e&!lQgtQ*N`#abOlytt!&i3fo)cKV zP0BWmLxS1gQv(r_r|?9>rR0ZeEJPx;Vi|h1!Eo*dohr&^lJgqJZns>&vexP@fs zkPv93Nyw$-kM5Mw^{@wPU47Y1dSkiHyl3dtHLwV&6Tm1iv{ve;sYA}Z&kmH802s9Z zyJEn+cfl7yFu#1^#DbtP7k&aR06|n{LnYFYEphKd@dJEq@)s#S)UA&8VJY@S2+{~> z(4?M();zvayyd^j`@4>xCqH|Au>Sfzb$mEOcD7e4z8pPVRTiMUWiw;|gXHw7LS#U< zsT(}Z5SJ)CRMXloh$qPnK77w_)ctHmgh}QAe<2S{DU^`!uwptCoq!Owz$u6bF)vnb zL`bM$%>baN7l#)vtS3y6h*2?xCk z>w+s)@`O4(4_I{L-!+b%)NZcQ&ND=2lyP+xI#9OzsiY8$c)ys-MI?TG6 zEP6f=vuLo!G>J7F4v|s#lJ+7A`^nEQScH3e?B_jC&{sj>m zYD?!1z4nDG_Afi$!J(<{>z{~Q)$SaXWjj~%ZvF152Hd^VoG14rFykR=_TO)mCn&K$ z-TfZ!vMBvnToyBoKRkD{3=&=qD|L!vb#jf1f}2338z)e)g>7#NPe!FoaY*jY{f)Bf>ohk-K z4{>fVS}ZCicCqgLuYR_fYx2;*-4k>kffuywghn?15s1dIOOYfl+XLf5w?wtU2Og*f z%X5x`H55F6g1>m~%F`655-W1wFJtY>>qNSdVT`M`1Mlh!5Q6#3j={n5#za;!X&^OJ zgq;d4UJV-F>gg?c3Y?d=kvn3eV)Jb^ zO5vg0G0yN0%}xy#(6oTDSVw8l=_*2k;zTP?+N=*18H5wp`s90K-C67q{W3d8vQGmr zhpW^>1HEQV2TG#8_P_0q91h8QgHT~8=-Ij5snJ3cj?Jn5_66uV=*pq(j}yHnf$Ft;5VVC?bz%9X31asJeQF2jEa47H#j` zk&uxf3t?g!tltVP|B#G_UfDD}`<#B#iY^i>oDd-LGF}A@Fno~dR72c&hs6bR z2F}9(i8+PR%R|~FV$;Ke^Q_E_Bc;$)xN4Ti>Lgg4vaip!%M z06oxAF_*)LH57w|gCW3SwoEHwjO{}}U=pKhjKSZ{u!K?1zm1q? zXyA6y@)}_sONiJopF}_}(~}d4FDyp|(@w}Vb;Fl5bZL%{1`}gdw#i{KMjp2@Fb9pg ziO|u7qP{$kxH$qh8%L+)AvwZNgUT6^zsZq-MRyZid{D?t`f|KzSAD~C?WT3d0rO`0 z=qQ6{)&UXXuHY{9g|P7l_nd-%eh}4%VVaK#Nik*tOu9lBM$<%FS@`NwGEbP0&;Xbo zObCq=y%a`jSJmx_uTLa{@2@}^&F4c%z6oe-TN&idjv+8E|$FHOvBqg5hT zMB=7SHq`_-E?5g=()*!V>rIa&LcX(RU}aLm*38U_V$C_g4)7GrW5$GnvTwJZdBmy6 z*X)wi3=R8L=esOhY0a&eH`^fSpUHV8h$J1|o^3fKO|9QzaiKu>yZ9wmRkW?HTkc<*v7i*ylJ#u#j zD1-n&{B`04oG>0Jn{5PKP*4Qsz{~`VVA3578gA+JUkiPc$Iq!^K|}*p_z3(-c&5z@ zKxmdNpp2&wg&%xL3xZNzG-5Xt7jnI@{?c z25=M>-VF|;an2Os$Nn%HgQz7m(ujC}Ii0Oesa(y#8>D+P*_m^X##E|h$M6tJr%#=P zWP*)Px>7z`E~U^2LNCNiy%Z7!!6RI%6fF@#ZY3z`CK91}^J$F!EB0YF1je9hJKU7!S5MnXV{+#K;y zF~s*H%p@vj&-ru7#(F2L+_;IH46X(z{~HTfcThqD%b{>~u@lSc<+f5#xgt9L7$gSK ziDJ6D*R%4&YeUB@yu@4+&70MBNTnjRyqMRd+@&lU#rV%0t3OmouhC`mkN}pL>tXin zY*p)mt=}$EGT2E<4Q>E2`6)gZ`QJhGDNpI}bZL9}m+R>q?l`OzFjW?)Y)P`fUH(_4 zCb?sm1=DD0+Q5v}BW#0n5;Nm(@RTEa3(Y17H2H67La+>ptQHJ@WMy2xRQT$|7l`8c zYHCxYw2o-rI?(fR2-%}pbs$I%w_&LPYE{4bo}vRoAW>3!SY_zH3`ofx3F1PsQ?&iq z*BRG>?<6%z=x#`NhlEq{K~&rU7Kc7Y-90aRnoj~rVoKae)L$3^z*Utppk?I`)CX&& zZ^@Go9fm&fN`b`XY zt0xE5aw4t@qTg_k=!-5LXU+_~DlW?53!afv6W(k@FPPX-`nA!FBMp7b!ODbL1zh58 z*69I}P_-?qSLKj}JW7gP!la}K@M}L>v?rDD!DY-tu+onu9kLoJz20M4urX_xf2dfZ zORd9Zp&28_ff=wdMpXi%IiTTNegC}~RLkdYjA39kWqlA?jO~o1`*B&85Hd%VPkYZT z48MPe62;TOq#c%H(`wX5(Bu>nlh4Fbd*Npasdhh?oRy8a;NB2(eb}6DgwXtx=n}fE zx67rYw=(s0r?EsPjaya}^Qc-_UT5|*@|$Q}*|>V3O~USkIe6a0_>vd~6kHuP8=m}_ zo2IGKbv;yA+TBtlCpnw)8hDn&eq?26gN$Bh;SdxaS04Fsaih_Cfb98s39xbv)=mS0 z6M<@pM2#pe32w*lYSWG>DYqB95XhgAA)*9dOxHr{t)er0Xugoy)!Vz#2C3FaUMzYl zCxy{igFB901*R2*F4>grPF}+G`;Yh zGi@nRjWyG3mR(BVOeBPOF=_&}2IWT%)pqdNAcL{eP`L*^FDv#Rzql5U&Suq_X%JfR_lC!S|y|xd5mQ0{0!G#9hV46S~A` z0B!{yI-4FZEtol5)mNWXcX(`x&Pc*&gh4k{w%0S#EI>rqqlH2xv7mR=9XNCI$V#NG z4wb-@u{PfQP;tTbzK>(DF(~bKp3;L1-A*HS!VB)Ae>Acnvde15Anb`h;I&0)aZBS6 z55ZS7mL5Wp!LCt45^{2_70YiI_Py=X{I3>$Px5Ez0ahLQ+ z9EWUWSyzA|+g-Axp*Lx-M{!ReQO07EG7r4^)K(xbj@%ZU=0tBC5shl)1a!ifM5OkF z0w2xQ-<+r-h1fi7B6waX15|*GGqfva)S)dVcgea`lQ~SQ$KXPR+(3Tn2I2R<0 z9tK`L*pa^+*n%>tZPiqt{_`%v?Bb7CR-!GhMON_Fbs0$#|H}G?rW|{q5fQhvw!FxI zs-5ZK>hAbnCS#ZQVi5K0X3PjL1JRdQO+&)*!oRCqB{wen60P6!7bGiWn@vD|+E@Xq zb!!_WiU^I|@1M}Hz6fN-m04x=>Exm{b@>UCW|c8vC`aNbtA@KCHujh^2RWZC}iYhL^<*Z93chIBJYU&w>$CGZDRcHuIgF&oyesDZ#&mA;?wxx4Cm#c0V$xYG?9OL(Smh}#fFuX(K;otJmvRP{h ze^f-qv;)HKC7geB92_@3a9@MGijS(hNNVd%-rZ;%@F_f7?Fjinbe1( zn#jQ*jKZTqE+AUTEd3y6t>*=;AO##cmdwU4gc2&rT8l`rtKW2JF<`_M#p>cj+)yCG zgKF)y8jrfxTjGO&ccm8RU>qn|HxQ7Z#sUo$q)P5H%8iBF$({0Ya51-rA@!It#NHN8MxqK zrYyl_&=}WVfQ?+ykV4*@F6)=u_~3BebR2G2>>mKaEBPmSW3(qYGGXj??m3L zHec{@jWCsSD8`xUy0pqT?Sw0oD?AUK*WxZn#D>-$`eI+IT)6ki>ic}W)t$V32^ITD zR497@LO}S|re%A+#vdv-?fXsQGVnP?QB_d0cGE+U84Q=aM=XrOwGFN3`Lpl@P0fL$ zKN1PqOwojH*($uaQFh8_)H#>Acl&UBSZ>!2W1Dinei`R4dJGX$;~60X=|SG6#jci} z&t4*dVDR*;+6Y(G{KGj1B2!qjvDYOyPC}%hnPbJ@g(4yBJrViG1#$$X75y+Ul1{%x zBAuD}Q@w?MFNqF-m39FGpq7RGI?%Bvyyig&oGv)lR>d<`Bqh=p>urib5DE;u$c|$J zwim~nPb19t?LJZsm{<(Iyyt@~H!a4yywmHKW&=1r5+oj*Fx6c89heW@(2R`i!Uiy* zp)=`Vr8sR!)KChE-6SEIyi(dvG3<1KoVt>kGV=zZiG7LGonH1+~yOK-`g0)r#+O|Q>)a`I2FVW%wr3lhO(P{ksNQuR!G_d zeTx(M!%brW_vS9?IF>bzZ2A3mWX-MEaOk^V|4d38{1D|KOlZSjBKrj7Fgf^>JyL0k zLoI$adZJ0T+8i_Idsuj}C;6jgx9LY#Ukh;!8eJ^B1N}q=Gn4onF*a2vY7~`x$r@rJ z`*hi&Z2lazgu{&nz>gjd>#eq*IFlXed(%$s5!HRXKNm zDZld+DwDI`O6hyn2uJ)F^{^;ESf9sjJ)wMSKD~R=DqPBHyP!?cGAvL<1|7K-(=?VO zGcKcF1spUa+ki<`6K#@QxOTsd847N8WSWztG~?~ z!gUJn>z0O=_)VCE|56hkT~n5xXTp}Ucx$Ii%bQ{5;-a4~I2e|{l9ur#*ghd*hSqO= z)GD@ev^w&5%k}YYB~!A%3*XbPPU-N6&3Lp1LxyP@|C<{qcn&?l54+zyMk&I3YDT|E z{lXH-e?C{huu<@~li+73lMOk&k)3s7Asn$t6!PtXJV!RkA`qdo4|OC_a?vR!kE_}k zK5R9KB%V@R7gt@9=TGL{=#r2gl!@3G;k-6sXp&E4u20DgvbY$iE**Xqj3TyxK>3AU z!b9}NXuINqt>Htt6fXIy5mj7oZ{A&$XJ&thR5ySE{mkxq_YooME#VCHm2+3D!f`{) zvR^WSjy_h4v^|!RJV-RaIT2Ctv=)UMMn@fAgjQV$2G+4?&dGA8vK35c-8r)z9Qqa=%k(FU)?iec14<^olkOU3p zF-6`zHiDKPafKK^USUU+D01>C&Wh{{q?>5m zGQp|z*+#>IIo=|ae8CtrN@@t~uLFOeT{}vX(IY*;>wAU=u1Qo4c+a&R);$^VCr>;! zv4L{`lHgc9$BeM)pQ#XA_(Q#=_iSZL4>L~8Hx}NmOC$&*Q*bq|9Aq}rWgFnMDl~d*;7c44GipcpH9PWaBy-G$*MI^F0 z?Tdxir1D<2ui+Q#^c4?uKvq=p>)lq56=Eb|N^qz~w7rsZu)@E4$;~snz+wIxi+980O6M#RmtgLYh@|2}9BiHSpTs zacjGKvwkUwR3lwTSsCHlwb&*(onU;)$yvdhikonn|B44JMgs*&Lo!jn`6AE>XvBiO z*LKNX3FVz9yLcsnmL!cRVO_qv=yIM#X|u&}#f%_?Tj0>8)8P_0r0!AjWNw;S44tst zv+NXY1{zRLf9OYMr6H-z?4CF$Y%MdbpFIN@a-LEnmkcOF>h16cH_;A|e)pJTuCJ4O zY7!4FxT4>4aFT8a92}84>q0&?46h>&0Vv0p>u~k&qd5$C1A6Q$I4V(5X~6{15;PD@ ze6!s9xh#^QI`J+%8*=^(-!P!@9%~buBmN2VSAp@TOo6}C?az+ALP8~&a0FWZk*F5N z^8P8IREnN`N0i@>O0?{i-FoFShYbUB`D7O4HB`Im2{yzXmyrg$k>cY6A@>bf7i3n0 z5y&cf2#`zctT>dz+hNF&+d3g;2)U!#vsb-%LC+pqKRTiiSn#FH#e!bVwR1nAf*TG^ z!RKcCy$P>?Sfq6n<%M{T0I8?p@HlgwC!HoWO>~mT+X<{Ylm+$Vtj9};H3$EB}P2wR$3y!TO#$iY8eO-!}+F&jMu4%E6S>m zB(N4w9O@2=<`WNJay5PwP8javDp~o~xkSbd4t4t8)9jqu@bHmJHq=MV~Pt|(TghCA}fhMS?s-{klV>~=VrT$nsp7mf{?cze~KKOD4 z_1Y!F)*7^W+BBTt1R2h4f1X4Oy2%?=IMhZU8c{qk3xI1=!na*Sg<=A$?K=Y=GUR9@ zQ(ylIm4Lgm>pt#%p`zHxok%vx_=8Fap1|?OM02|N%X-g5_#S~sT@A!x&8k#wVI2lo z1Uyj{tDQRpb*>c}mjU^gYA9{7mNhFAlM=wZkXcA#MHXWMEs^3>p9X)Oa?dx7b%N*y zLz@K^%1JaArjgri;8ptNHwz1<0y8tcURSbHsm=26^@CYJ3hwMaEvC7 z3Wi-@AaXIQ)%F6#i@%M>?Mw7$6(kW@?et@wbk-APcvMCC{>iew#vkZej8%9h0JSc? zCb~K|!9cBU+))^q*co(E^9jRl7gR4Jihyqa(Z(P&ID#TPyysVNL7(^;?Gan!OU>au zN}miBc&XX-M$mSv%3xs)bh>Jq9#aD_l|zO?I+p4_5qI0Ms*OZyyxA`sXcyiy>-{YN zA70%HmibZYcHW&YOHk6S&PQ+$rJ3(utuUra3V0~@=_~QZy&nc~)AS>v&<6$gErZC3 zcbC=eVkV4Vu0#}E*r=&{X)Kgq|8MGCh(wsH4geLj@#8EGYa})K2;n z{1~=ghoz=9TSCxgzr5x3@sQZZ0FZ+t{?klSI_IZa16pSx6*;=O%n!uXVZ@1IL;JEV zfOS&yyfE9dtS*^jmgt6>jQDOIJM5Gx#Y2eAcC3l^lmoJ{o0T>IHpECTbfYgPI4#LZq0PKqnPCD}_ zyKxz;(`fE0z~nA1s?d{X2!#ZP8wUHzFSOoTWQrk%;wCnBV_3D%3@EC|u$Ao)tO|AO z$4&aa!wbf}rbNcP{6=ajgg(`p5kTeu$ji20`zw)X1SH*x zN?T36{d9TY*S896Ijc^!35LLUByY4QO=ARCQ#MMCjudFc7s!z%P$6DESz%zZ#>H|i zw3Mc@v4~{Eke;FWs`5i@ifeYPh-Sb#vCa#qJPL|&quSKF%sp8*n#t?vIE7kFWjNFh zJC@u^bRQ^?ra|%39Ux^Dn4I}QICyDKF0mpe+Bk}!lFlqS^WpYm&xwIYxUoS-rJ)N9 z1Tz*6Rl9;x`4lwS1cgW^H_M*)Dt*DX*W?ArBf?-t|1~ge&S}xM0K;U9Ibf{okZHf~ z#4v4qc6s6Zgm8iKch5VMbQc~_V-ZviirnKCi*ouN^c_2lo&-M;YSA>W>>^5tlXObg zacX$k0=9Tf$Eg+#9k6yV(R5-&F{=DHP8!yvSQ`Y~XRnUx@{O$-bGCksk~3&qH^dqX zkf+ZZ?Nv5u>LBM@2?k%k&_aUb5Xjqf#!&7%zN#VZwmv65ezo^Y4S#(ed0yUn4tFOB zh1f1SJ6_s?a{)u6VdwUC!Hv=8`%T9(^c`2hc9nt$(q{Dm2X)dK49ba+KEheQ;7^0) ziFKw$%EHy_B1)M>=yK^=Z$U-LT36yX>EKT zvD8IAom2&2?bTmX@_PBR4W|p?6?LQ+&UMzXxqHC5VHzf@Eb1u)kwyfy+NOM8Wa2y@ zNNDL0PE$F;yFyf^jy&RGwDXQwYw6yz>OMWvJt98X@;yr!*RQDBE- zE*l*u=($Zi1}0-Y4lGaK?J$yQjgb+*ljUvNQ!;QYAoCq@>70=sJ{o{^21^?zT@r~hhf&O;Qiq+ ziGQQLG*D@5;LZ%09mwMiE4Q{IPUx-emo*;a6#DrmWr(zY27d@ezre)Z1BGZdo&pXn z+);gOFelKDmnjq#8dL7CTiVH)dHOqWi~uE|NM^QI3EqxE6+_n>IW67~UB#J==QOGF zp_S)c8TJ}uiaEiaER}MyB(grNn=2m&0yztA=!%3xUREyuG_jmadN*D&1nxvjZ6^+2 zORi7iX1iPi$tKasppaR9$a3IUmrrX)m*)fg1>H+$KpqeB*G>AQV((-G{}h=qItj|d zz~{5@{?&Dab6;0c7!!%Se>w($RmlG7Jlv_zV3Ru8b2rugY0MVPOOYGlokI7%nhIy& z-B&wE=lh2dtD!F?noD{z^O1~Tq4MhxvchzuT_oF3-t4YyA*MJ*n&+1X3~6quEN z@m~aEp=b2~mP+}TUP^FmkRS_PDMA{B zaSy(P=$T~R!yc^Ye0*pl5xcpm_JWI;@-di+nruhqZ4gy7cq-)I&s&Bt3BkgT(Zdjf zTvvv0)8xzntEtp4iXm}~cT+pi5k{w{(Z@l2XU9lHr4Vy~3ycA_T?V(QS{qwt?v|}k z_ST!s;C4!jyV5)^6xC#v!o*uS%a-jQ6< z)>o?z7=+zNNtIz1*F_HJ(w@=`E+T|9TqhC(g7kKDc8z~?RbKQ)LRMn7A1p*PcX2YR zUAr{);~c7I#3Ssv<0i-Woj0&Z4a!u|@Xt2J1>N-|ED<3$o2V?OwL4oQ%$@!zLamVz zB)K&Ik^~GOmDAa143{I4?XUk1<3-k{<%?&OID&>Ud%z*Rkt*)mko0RwC2=qFf-^OV z=d@47?tY=A;=2VAh0mF(3x;!#X!%{|vn;U2XW{(nu5b&8kOr)Kop3-5_xnK5oO_3y z!EaIb{r%D{7zwtGgFVri4_!yUIGwR(xEV3YWSI_+E}Gdl>TINWsIrfj+7DE?xp+5^ zlr3pM-Cbse*WGKOd3+*Qen^*uHk)+EpH-{u@i%y}Z!YSid<}~kA*IRSk|nf+I1N=2 zIKi+&ej%Al-M5`cP^XU>9A(m7G>58>o|}j0ZWbMg&x`*$B9j#Rnyo0#=BMLdo%=ks zLa3(2EinQLXQ(3zDe7Bce%Oszu%?8PO648TNst4SMFvj=+{b%)ELyB!0`B?9R6aO{i-63|s@|raSQGL~s)9R#J#duFaTSZ2M{X z1?YuM*a!!|jP^QJ(hAisJuPOM`8Y-Hzl~%d@latwj}t&0{DNNC+zJARnuQfiN`HQ# z?boY_2?*q;Qk)LUB)s8(Lz5elaW56p&fDH*AWAq7Zrbeq1!?FBGYHCnFgRu5y1jwD zc|yBz+UW|X`zDsc{W~8m$sh@VVnZD$lLnKlq@Hg^;ky!}ZuPdKNi2BI70;hrpvaA4+Q_+K)I@|)q1N-H zrycZU`*YUW``Qi^`bDX-j7j^&bO+-Xg$cz2#i##($uyW{Nl&{DK{=lLWV3|=<&si||2)l=8^8_z+Vho-#5LB0EqQ3v5U#*DF7 zxT)1j^`m+lW}p$>WSIG1eZ>L|YR-@Feu!YNWiw*IZYh03mq+2QVtQ}1ezRJM?0PA< z;mK(J5@N8>u@<6Y$QAHWNE};rR|)U_&bv8dsnsza7{=zD1VBcxrALqnOf-qW(zzTn zTAp|pEo#FsQ$~*$j|~Q;$Zy&Liu9OM;VF@#_&*nL!N2hH!Q6l*OeTxq!l>dEc{;Hw zCQni{iN%jHU*C;?M-VUaXxf0FEJ_G=C8)C-wD!DvhY+qQ#FT3}Th8;GgV&AV94F`D ztT6=w_Xm8)*)dBnDkZd~UWL|W=Glu!$hc|1w7_7l!3MAt95oIp4Xp{M%clu&TXehO z+L-1#{mjkpTF@?|w1P98OCky~S%@OR&o75P&ZHvC}Y=(2_{ib(-Al_7aZ^U?s34#H}= zGfFi5%KnFVCKtdO^>Htpb07#BeCXMDO8U}crpe1Gm`>Q=6qB4i=nLoLZ%p$TY=OcP z)r}Et-Ed??u~f09d3Nx3bS@ja!fV(Dfa5lXxRs#;8?Y8G+Qvz+iv7fiRkL3liip}) z&G0u8RdEC9c$$rdU53=MH`p!Jn|DHjhOxHK$tW_pw9wCTf0Eo<){HoN=zG!!Gq4z4 z7PwGh)VNPXW-cE#MtofE`-$9~nmmj}m zlzZscQ2+Jq%gaB9rMgVJkbhup0Ggpb)&L01T=%>n7-?v@I8!Q(p&+!fd+Y^Pu9l+u zek(_$^HYFVRRIFt@0Fp52g5Q#I`tC3li`;UtDLP*rA{-#Yoa5qp{cD)QYhldihWe+ zG~zuaqLY~$-1sjh2lkbXCX;lq+p~!2Z=76cvuQe*Fl>IFwpUBP+d^&E4BGc{m#l%Kuo6#{XGoRyFc%Hqhf|%nYd<;yiC>tyEyk z4I+a`(%%Ie=-*n z-{mg=j&t12)LH3R?@-B1tEb7FLMePI1HK0`Ae@#)KcS%!Qt9p4_fmBl5zhO10n401 zBSfnfJ;?_r{%R)hh}BBNSl=$BiAKbuWrNGQUZ)+0=Mt&5!X*D@yGCSaMNY&@`;^a4 z;v=%D_!K!WXV1!3%4P-M*s%V2b#2jF2bk!)#2GLVuGKd#vNpRMyg`kstw0GQ8@^k^ zuqK5uR<>FeRZ#3{%!|4X!hh7hgirQ@Mwg%%ez8pF!N$xhMNQN((yS(F2-OfduxxKE zxY#7O(VGfNuLv-ImAw5+h@gwn%!ER;*Q+001;W7W^waWT%@(T+5k!c3A-j)a8y11t zx4~rSN0s$M8HEOzkcWW4YbKK9GQez2XJ|Nq?TFy;jmGbg;`m&%U4hIiarKmdTHt#l zL=H;ZHE?fYxKQQXKnC+K!TAU}r086{4m}r()-QaFmU(qWhJlc$eas&y?=H9EYQy8N$8^bni9TpDp zkA^WRs?KgYgjxX4T6?`SMs$`s3vlut(YU~f2F+id(Rf_)$BIMibk9lACI~LA+i7xn z%-+=DHV*0TCTJp~-|$VZ@g2vmd*|2QXV;HeTzt530KyK>v&253N1l}bP_J#UjLy4) zBJili9#-ey8Kj(dxmW^ctorxd;te|xo)%46l%5qE-YhAjP`Cc03vT)vV&GAV%#Cgb zX~2}uWNvh`2<*AuxuJpq>SyNtZwzuU)r@@dqC@v=Ocd(HnnzytN+M&|Qi#f4Q8D=h ziE<3ziFW%+!yy(q{il8H44g^5{_+pH60Mx5Z*FgC_3hKxmeJ+wVuX?T#ZfOOD3E4C zRJsj#wA@3uvwZwHKKGN{{Ag+8^cs?S4N@6(Wkd$CkoCst(Z&hp+l=ffZ?2m%%ffI3 zdV7coR`R+*dPbNx=*ivWeNJK=Iy_vKd`-_Hng{l?hmp=|T3U&epbmgXXWs9ySE|=G zeQ|^ioL}tveN{s72_&h+F+W;G}?;?_s@h5>DX(rp#eaZ!E=NivgLI zWykLKev+}sHH41NCRm7W>K+_qdoJ8x9o5Cf!)|qLtF7Izxk*p|fX8UqEY)_sI_45O zL2u>x=r5xLE%s|d%MO>zU%KV6QKFiEeo12g#bhei4!Hm+`~Fo~4h|BJ)%ENxy9)Up zOxupSf1QZWun=)gF{L0YWJ<(r0?$bPFANrmphJ>kG`&7E+RgrWQi}ZS#-CQJ*i#8j zM_A0?w@4Mq@xvk^>QSvEU|VYQoVI=TaOrsLTa`RZfe8{9F~mM{L+C`9YP9?OknLw| zmkvz>cS6`pF0FYeLdY%>u&XpPj5$*iYkj=m7wMzHqzZ5SG~$i_^f@QEPEC+<2nf-{ zE7W+n%)q$!5@2pBuXMxhUSi*%F>e_g!$T-_`ovjBh(3jK9Q^~OR{)}!0}vdTE^M+m z9QWsA?xG>EW;U~5gEuKR)Ubfi&YWnXV;3H6Zt^NE725*`;lpSK4HS1sN?{~9a4JkD z%}23oAovytUKfRN87XTH2c=kq1)O5(fH_M3M-o{{@&~KD`~TRot-gqg7Q2U2o-iiF}K>m?CokhmODaLB z1p6(6JYGntNOg(s!(>ZU&lzDf+Ur)^Lirm%*}Z>T)9)fAZ9>k(kvnM;ab$ptA=hoh zVgsVaveXbMpm{|4*d<0>?l_JUFOO8A3xNLQOh%nVXjYI6X8h?a@6kDe5-m&;M0xqx z+1U$s>(P9P)f0!{z%M@E7|9nn#IWgEx6A6JNJ(7dk`%6$3@!C!l;JK-p2?gg+W|d- ziEzgk$w7k48NMqg$CM*4O~Abj3+_yUKTyK1p6GDsGEs;}=E_q>^LI-~pym$qhXPJf z2`!PJDp4l(TTm#|n@bN!j;-FFOM__eLl!6{*}z=)UAcGYloj?bv!-XY1TA6Xz;82J zLRaF{8ayzGa|}c--}|^xh)xgX>6R(sZD|Z|qX50gu=d`gEwHqC@WYU7{%<5VOnf9+ zB@FX?|UL%`8EIAe!*UdYl|6wRz6Y>(#8x92$#y}wMeE|ZM2X*c}dKJ^4NIf;Fm zNwzq%QcO?$NR-7`su!*$dlIKo2y(N;qgH@1|8QNo$0wbyyJ2^}$iZ>M{BhBjTdMjK z>gPEzgX4;g3$rU?jvDeOq`X=>)zdt|jk1Lv3u~bjHI=EGLfIR&+K3ldcc4D&Um&04 z3^F*}WaxR(ZyaB>DlmF_UP@+Q*h$&nsOB#gwLt{1#F4i-{A5J@`>B9@{^i?g_Ce&O z<<}_We-RUFU&&MHa1#t56u_oM(Ljn7djja!T|gcxSoR=)@?owC*NkDarpBj=W4}=i1@)@L|C) zQKA+o<(pMVp*Su(`zBC0l1yTa$MRfQ#uby|$mlOMs=G`4J|?apMzKei%jZql#gP@IkOaOjB7MJM=@1j(&!jNnyVkn5;4lvro1!vq ztXiV8HYj5%)r1PPpIOj)f!>pc^3#LvfZ(hz}C@-3R(Cx7R427*Fwd!XO z4~j&IkPHcBm0h_|iG;ZNrYdJ4HI!$rSyo&sibmwIgm1|J#g6%>=ML1r!kcEhm(XY& zD@mIJt;!O%WP7CE&wwE3?1-dt;RTHdm~LvP7K`ccWXkZ0kfFa2S;wGtx_a}S2lslw z$<4^Jg-n#Ypc(3t2N67Juasu=h)j&UNTPNDil4MQMTlnI81kY46uMH5B^U{~nmc6+ z9>(lGhhvRK9ITfpAD!XQ&BPphL3p8B4PVBN0NF6U49;ZA0Tr75AgGw7(S=Yio+xg_ zepZ*?V#KD;sHH+15ix&yCs0eSB-Z%D%uujlXvT#V$Rz@$+w!u#3GIo*AwMI#Bm^oO zLr1e}k5W~G0xaO!C%Mb{sarxWZ4%Dn9vG`KHmPC9GWZwOOm11XJp#o0-P-${3m4g( z6~)X9FXw%Xm~&99tj>a-ri})ZcnsfJtc10F@t9xF5vq6E)X!iUXHq-ohlO`gQdS&k zZl})3k||u)!_=nNlvMbz%AuIr89l#I$;rG}qvDGiK?xTd5HzMQkw*p$YvFLGyQM!J zNC^gD!kP{A84nGosi~@MLKqWQNacfs7O$dkZtm4-BZ~iA8xWZPkTK!HpA5zr!9Z&+icfAJ1)NWkTd!-9`NWU>9uXXUr;`Js#NbKFgrNhTcY4GNv*71}}T zFJh?>=EcbUd2<|fiL+H=wMw8hbX6?+_cl4XnCB#ddwdG>bki* zt*&6Dy&EIPluL@A3_;R%)shA-tDQA1!Tw4ffBRyy;2n)vm_JV06(4Or&QAOKNZB5f(MVC}&_!B>098R{Simr!UG}?CW1Ah+X+0#~0`X)od zLYablwmFxN21L))!_zc`IfzWi`5>MxPe(DmjjO1}HHt7TJtAW+VXHt!aKZk>y6PoMsbDXRJnov;D~Ur~2R_7(Xr)aa%wJwZhS3gr7IGgt%@;`jpL@gyc6bGCVx!9CE7NgIbUNZ!Ur1RHror0~ zr(j$^yM4j`#c2KxSP61;(Tk^pe7b~}LWj~SZC=MEpdKf;B@on9=?_n|R|0q;Y*1_@ z>nGq>)&q!;u-8H)WCwtL&7F4vbnnfSAlK1mwnRq2&gZrEr!b1MA z(3%vAbh3aU-IX`d7b@q`-WiT6eitu}ZH9x#d&qx}?CtDuAXak%5<-P!{a`V=$|XmJ zUn@4lX6#ulB@a=&-9HG)a>KkH=jE7>&S&N~0X0zD=Q=t|7w;kuh#cU=NN7gBGbQTT z;?bdSt8V&IIi}sDTzA0dkU}Z-Qvg;RDe8v>468p3*&hbGT1I3hi9hh~Z(!H}{+>eUyF)H&gdrX=k$aB%J6I;6+^^kn1mL+E+?A!A}@xV(Qa@M%HD5C@+-4Mb4lI=Xp=@9+^x+jhtOc zYgF2aVa(uSR*n(O)e6tf3JEg2xs#dJfhEmi1iOmDYWk|wXNHU?g23^IGKB&yHnsm7 zm_+;p?YpA#N*7vXCkeN2LTNG`{QDa#U3fcFz7SB)83=<8rF)|udrEbrZL$o6W?oDR zQx!178Ih9B#D9Ko$H(jD{4MME&<|6%MPu|TfOc#E0B}!j^MMpV69D#h2`vsEQ{(?c zJ3Lh!3&=yS5fWL~;1wCZ?)%nmK`Eqgcu)O6rD^3%ijcxL50^z?OI(LaVDvfL0#zjZ z2?cPvC$QCzpxpt5jMFp05OxhK0F!Q`rPhDi5)y=-0C} zIM~ku&S@pl1&0=jl+rlS<4`riV~LC-#pqNde@44MB(j%)On$0Ko(@q?4`1?4149Z_ zZi!5aU@2vM$dHR6WSZpj+VboK+>u-CbNi7*lw4K^ZxxM#24_Yc`jvb9NPVi75L+MlM^U~`;a7`4H0L|TYK>%hfEfXLsu1JGM zbh|8{wuc7ucV+`Ys1kqxsj`dajwyM;^X^`)#<+a~$WFy8b2t_RS{8yNYKKlnv+>vB zX(QTf$kqrJ;%I@EwEs{cIcH@Z3|#^S@M+5jsP<^`@8^I4_8MlBb`~cE^n+{{;qW2q z=p1=&+fUo%T{GhVX@;56kH8K_%?X=;$OTYqW1L*)hzelm^$*?_K;9JyIWhsn4SK(| zSmXLTUE8VQX{se#8#Rj*lz`xHtT<61V~fb;WZUpu(M)f#;I+2_zR+)y5Jv?l`CxAinx|EY!`IJ*x9_gf_k&Gx2alL!hK zUWj1T_pk|?iv}4EP#PZvYD_-LpzU!NfcLL%fK&r$W8O1KH9c2&GV~N#T$kaXGvAOl)|T zuF9%6(i=Y3q?X%VK-D2YIYFPH3f|g$TrXW->&^Ab`WT z7>Oo!u1u40?jAJ8Hy`bv}qbgs8)cF0&qeVjD?e+3Ggn1Im>K77ZSpbU*08 zfZkIFcv?y)!*B{|>nx@cE{KoutP+seQU?bCGE`tS0GKUO3PN~t=2u7q_6$l;uw^4c zVu^f{uaqsZ{*a-N?2B8ngrLS8E&s6}Xtv9rR9C^b`@q8*iH)pFzf1|kCfiLw6u{Z%aC z!X^5CzF6qofFJgklJV3oc|Qc2XdFl+y5M9*P8}A>Kh{ zWRgRwMSZ(?Jw;m%0etU5BsWT-Dj-5F;Q$OQJrQd+lv`i6>MhVo^p*^w6{~=fhe|bN z*37oV0kji)4an^%3ABbg5RC;CS50@PV5_hKfXjYx+(DqQdKC^JIEMo6X66$qDdLRc z!YJPSKnbY`#Ht6`g@xGzJmKzzn|abYbP+_Q(v?~~ z96%cd{E0BCsH^0HaWt{y(Cuto4VE7jhB1Z??#UaU(*R&Eo+J`UN+8mcb51F|I|n*J zJCZ3R*OdyeS9hWkc_mA7-br>3Tw=CX2bl(=TpVt#WP8Bg^vE_9bP&6ccAf3lFMgr` z{3=h@?Ftb$RTe&@IQtiJfV;O&4fzh)e1>7seG; z=%mA4@c7{aXeJnhEg2J@Bm;=)j=O=cl#^NNkQ<{r;Bm|8Hg}bJ-S^g4`|itx)~!LN zXtL}?f1Hs6UQ+f0-X6&TBCW=A4>bU0{rv8C4T!(wD-h>VCK4YJk`6C9$by!fxOYw- zV#n+0{E(0ttq_#16B} ze8$E#X9o{B!0vbq#WUwmv5Xz6{(!^~+}sBW{xctdNHL4^vDk!0E}(g|W_q;jR|ZK< z8w>H-8G{%R#%f!E7cO_^B?yFRKLOH)RT9GJsb+kAKq~}WIF)NRLwKZ^Q;>!2MNa|} z-mh?=B;*&D{Nd-mQRcfVnHkChI=DRHU4ga%xJ%+QkBd|-d9uRI76@BT(bjsjwS+r) zvx=lGNLv1?SzZ;P)Gnn>04fO7Culg*?LmbEF0fATG8S@)oJ>NT3pYAXa*vX!eUTDF ziBrp(QyDqr0ZMTr?4uG_Nqs6f%S0g?h`1vO5fo=5S&u#wI2d4+3hWiolEU!=3_oFo zfie?+4W#`;1dd#X@g9Yj<53S<6OB!TM8w8})7k-$&q5(smc%;r z(BlXkTp`C47+%4JA{2X}MIaPbVF!35P#p;u7+fR*46{T+LR8+j25oduCfDzDv6R-hU{TVVo9fz?^N3ShMt!t0NsH)pB zRK8-S{Dn*y3b|k^*?_B70<2gHt==l7c&cT>r`C#{S}J2;s#d{M)ncW(#Y$C*lByLQ z&?+{dR7*gpdT~(1;M(FfF==3z`^eW)=5a9RqvF-)2?S-(G zhS;p(u~_qBum*q}On@$#08}ynd0+spzyVco0%G6;<-i5&016cV5UKzhQ~)fX03|>L z8ej+HzzgVr6_5ZUpa4HW0Ca!=r1%*}Oo;2no&Zz8DfR)L!@r<5 z2viSZpmvo5XqXyAz{Ms7`7kX>fnr1gi4X~7KpznRT0{Xc5Cfz@43PjBMBoH@z_{~( z(Wd}IPJ9hH+%)Fc)0!hrV+(A;76rhtI|YHbEDeERV~Ya>SQg^IvlazFkSK(KG9&{q zkPIR~EeQaaBmwA<20}mBO?)N$(z1@p)5?%}rM| zGF()~Z&Kx@OIDRI$d0T8;JX@vj3^2%pd_+@l9~a4lntZ;AvUIjqIZbuNTR6@hNJoV zk4F;ut)LN4ARuyn2M6F~eg-e#UH%2P;8uPGFW^vq1vj8mdIayFOZo(tphk8C7hpT~ z1Fv8?b_LNR3QD9J+!v=p%}# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dist/fonts/glyphicons-halflings-regular.ttf b/dist/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/dist/fonts/glyphicons-halflings-regular.woff2 b/dist/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/dist/index.html b/dist/index.html new file mode 100644 index 000000000..f03d3e4d5 --- /dev/null +++ b/dist/index.html @@ -0,0 +1,450 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ +
You can't see this!
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/scripts/scripts.js b/dist/scripts/scripts.js new file mode 100644 index 000000000..a371066a8 --- /dev/null +++ b/dist/scripts/scripts.js @@ -0,0 +1,13962 @@ +(function( w ){ + /* We can request an image at every possible width, but let's limit it to a reasonable number + We can set these so they correspond to our more common sizes. + */ + function tmpl(text, dict) { + for (var k in dict) { + text = text.replace("{{" + k + "}}", dict[k]); + } + return text; + } + w.picturefill = function(element) { + var ps; + if (element && element.getAttribute('data-type') === 'image') { + ps = [element]; + } + else { + if (typeof element === "undefined") { + element = w.document; + } + ps = element.getElementsByTagName( "div" ); + } + + var imageData = []; + for( var i = 0, il = ps.length; i < il; i++ ){ + var el = ps[i]; + if(el.getAttribute( "data-type" ) !== "image" ){ + continue; + } + var div = el.getElementsByTagName( "div" )[0]; + if( el.getAttribute( "data-image-id" ) !== null ){ + var id = el.getAttribute( "data-image-id" ), + crop = el.getAttribute( "data-crop" ); + var _w = div.offsetWidth, + _h = div.offsetHeight; + + if (!crop || crop === "" || crop === "auto") { + crop = computeAspectRatio(_w, _h); + } + if (el.getAttribute("data-format")) { + format = el.getAttribute("data-format"); + } + else { + format = "jpg"; + } + + var element = div; + if (id) { + $(".image-css-" + id).remove(); + $.ajax({ + url: w.BC_ADMIN_URL + '/api/' + id, + headers: { + 'X-Betty-Api-Key': w.BC_API_KEY, + 'Content-Type': undefined + }, + success: $.proxy(function (res) { + var imageData = res; + if (this.crop === "original") { + createStyle('.image[data-image-id="' + this.id + '"]>div', { + 'padding-bottom': ((res.height / res.width) * 100) + '%' + }, "image-css-" + this.id); + + var cropDetails = {x0:0, x1:res.width, y0:0, y1:res.height}; + } + else { + var cropDetails = imageData.selections[this.crop] + } + + computeStyle(this.element, imageData, cropDetails) + }, {element: element, id: id, crop:crop}), + error: $.proxy(function() { + if (this.crop === "original") { + //default to 16x9 + createStyle('.image[data-image-id="' + this.id + '"]>div', { + 'padding-bottom': '56.25%', // default to 16x9 for errors + 'background-color':'rgba(200, 0,0, .5)' + }, "image-css-" + this.id); + } + }, {id: id, crop:crop}) + }); + } + } + } + }; + + function computeStyle(element, image, selection) { + var selector = '.image[data-image-id="' + image.id + '"]>div'; + var elementWidth = $(selector).width(); + + var scale, styles, + elementHeight = (image.height / image.width) * elementWidth, + s_width = selection.x1 - selection.x0, + s_height = selection.y1 - selection.y0, + tmp_selection = selection; + + + if (!s_width || !s_height) { + /* + If we have bogus selections, make + the crop equal to the whole image + */ + s_width = elementWidth; + s_height = elementHeight; + tmp_selection = { + 'x0': 0, + 'y0': 0, + 'x1': s_width, + 'y1': s_height + }; + } + + var imageUrl = w.BC_ADMIN_URL + '/' + image.id + '/original/1200.jpg'; + scale = elementWidth / s_width; + + var rules = { + 'background-image': 'url(' + imageUrl +')', + 'background-size': scaleNumber(image.width, scale) + 'px', + 'background-position': + '-' + scaleNumber(tmp_selection.x0, scale) + 'px ' + + '-' + scaleNumber(tmp_selection.y0, scale) + 'px', + 'background-repeat': 'no-repeat' + } + createStyle(selector, rules, "image-css-" + image.id); + } + + function createStyle(selector, rules, classname) { + var styleNode = document.createElement("style"); + styleNode.type = "text/css"; + styleNode.className = classname; + var css = ""; + + var temp = "" + selector + '{'; + for (var rule in rules) { + temp += rule + ':' + rules[rule] + ';'; + } + temp += '}'; + css += temp; + + if (styleNode.styleSheet) { + styleNode.styleSheet.cssText = css; + } else { + styleNode.appendChild(document.createTextNode(css)); + } + $(document).find("head").append(styleNode); + } + + + function scaleNumber(num, by_scale) { + return Math.floor(num * by_scale); + }; + + + function computeAspectRatio(_w, _h) { + if (_w !== 0 && _h !== 0) { + var aspectRatio = Math.ceil(_w/_h * 10); + //smooth out rounding issues. + switch (aspectRatio) { + case 30: + case 31: + crop = "3x1"; + break; + case 20: + crop = "2x1"; + break; + case 14: + crop = "4x3"; + break; + case 18: + crop = "16x9"; + break; + case 8: + crop = "3x4"; + break; + case 10: + crop = "1x1"; + break; + default: + crop = "original"; + } + return crop; + } + else { + return "16x9" + } + } + + +}( this ));; +'use strict'; + +// ****** External Libraries ****** \\ + +angular.module('lodash', []).constant('_', window._); +angular.module('URLify', []).constant('URLify', window.URLify); +angular.module('jquery', []).constant('$', window.$); +angular.module('moment', []).constant('moment', window.moment); +angular.module('PNotify', []).constant('PNotify', window.PNotify); +angular.module('keypress', []).constant('keypress', window.keypress); +angular.module('Raven', []).constant('Raven', window.Raven); +angular.module('OnionEditor', []).constant('OnionEditor', window.OnionEditor); + +// ****** App Config ****** \\ + +angular.module('bulbsCmsApp', [ + 'bulbs.cms.site.config', + + 'bulbs.cms.superFeatures', + + // TODO : these dependencies need to be reorganized, localized + 'bulbs.cms.currentUser', + 'bulbs.cms.dateTimeModal', + 'bulbs.cms.dateTimeFilter', + 'bulbs.cms.editor', + 'bulbs.cms.imageCropModal', + 'bulbs.cms.liveBlog', + 'bulbs.cms.sendToEditorModal', + 'bulbs.cms.staticImage', + 'ngCookies', + 'ngResource', + 'ngRoute', + 'ui.bootstrap', + 'ui.bootstrap.datetimepicker', + 'restangular', + 'BettyCropper', + 'jquery', + 'lodash', + 'URLify', + 'moment', + 'PNotify', + 'keypress', + 'Raven', + 'firebase', + 'ipCookie', + 'bulbs.api', + + // shared + 'contentServices', + 'cms.tunic', + // components + 'bettyEditable', + 'bugReporter', + 'campaigns', + 'evergreenField', + 'hideFromRssField', + 'filterWidget', + 'filterListWidget', + 'notifications', + 'polls', + 'promotedContent', + 'statusFilter', + 'templateTypeField', + 'specialCoverage', + 'sections', + 'reports' +]) +.config(function ($locationProvider, $routeProvider, $sceProvider) { + $locationProvider.html5Mode(true); + + $routeProvider + .when('/cms/app/list/', { + templateUrl: '/views/contentlist.html', + controller: 'ContentlistCtrl', + reloadOnSearch: false + }) + .when('/cms/app/edit/:id/contributions/', { + templateUrl: '/views/contributions.html', + controller: 'ContributionsCtrl' + }) + .when('/cms/app/edit/:id/:contentType?', { + templateUrl: '/views/contentedit.html', + controller: 'ContenteditCtrl', + reloadOnSearch: false + }) + .when('/cms/app/targeting/', { + templateUrl: '/views/targeting-editor.html', + controller: 'TargetingCtrl' + }) + .when('/cms/app/cms-notifications/', { + templateUrl: '/views/cms-notifications.html', + controller: 'CmsNotificationsCtrl' + }) + .when('/cms/app/reporting/', { + templateUrl: '/views/reporting.html', + controller: 'ReportingCtrl' + }) + .when('/cms/app/pzones/', { + templateUrl: '/views/pzones.html', + controller: 'PzoneCtrl' + }) + .otherwise({ + redirectTo: '/cms/app/list/' + }); + + $sceProvider.enabled(false); +}) +.config(function ($provide, $httpProvider) { + $provide.decorator('$exceptionHandler', function ($delegate) { + return function (exception, cause) { + $delegate(exception, cause); + window.Raven.captureException(exception); + }; + }); + + $httpProvider.interceptors.push('BugReportInterceptor'); + $httpProvider.interceptors.push('PermissionsInterceptor'); + $httpProvider.interceptors.push('BadRequestInterceptor'); + $httpProvider.interceptors.push('TunicInterceptor'); +}) +.run(function ($rootScope, $http, $cookies) { + // set the CSRF token here + $http.defaults.headers.common['X-CSRFToken'] = $cookies.csrftoken; + var deleteHeaders = $http.defaults.headers.delete || {}; + deleteHeaders['X-CSRFToken'] = $cookies.csrftoken; + $http.defaults.headers.delete = deleteHeaders; +}); + +angular.module('bulbs.api', ['restangular', 'moment']); + +'use strict'; + +angular.module('bulbs.api') + .factory('AuthorService', function (Restangular) { + Restangular.setBaseUrl('/cms/api/v1/'); + Restangular.setRequestSuffix('/'); + Restangular.extendModel('author', function (obj) { + return angular.extend(obj, { + getFullName: function () { + return obj.first_name + ' ' + obj.last_name; + } + }); + }); + return Restangular.all('author'); + }); + +'use strict'; + +angular.module('bulbs.api') + .factory('ContentService', function (Restangular) { + Restangular.setBaseUrl('/cms/api/v1/'); + Restangular.setRequestSuffix('/'); + + Restangular.extendModel('content', function (obj) { + + var extendAuthor = function (author) { + return angular.extend(author, { + getFullName: function () { + return obj.contributor.first_name + ' ' + obj.contributor.last_name; + } + }); + }; + + for (var i in obj.authors) { + obj.authors[i] = extendAuthor(obj.authors[i]); + } + return obj; + }); + + Restangular.extendModel('contributions', function (obj) { + if (obj && obj.contributor) { + obj.contributor = angular.extend(obj.contributor, { + getFullName: function () { + return obj.contributor.first_name + ' ' + obj.contributor.last_name; + } + }); + } + return obj; + }); + + Restangular.extendCollection('contributions', function (collection) { + collection.save = function (data) { + return collection.post(data).then(function (contributions) { + return Restangular.restangularizeCollection('contributions', contributions); + }); + }; + return collection; + }); + + return Restangular.service('content'); + }); + +'use strict'; + +angular.module('bulbs.api') + .factory('ContributionRoleService', function (Restangular) { + return Restangular.withConfig(function (RestangularConfigurer) { + RestangularConfigurer.setBaseUrl('/cms/api/v1/contributions/'); + RestangularConfigurer.setRequestSuffix('/'); + }).service('role'); + }) + .factory('ContentReportingService', function (Restangular) { + return Restangular.withConfig(function (RestangularConfigurer) { + RestangularConfigurer.setBaseUrl('/cms/api/v1/contributions/'); + RestangularConfigurer.setRequestSuffix('/'); + }).service('contentreporting'); + }) + .factory('FreelancePayReportingService', function(Restangular, moment) { + return Restangular.withConfig(function (RestangularConfigurer) { + RestangularConfigurer.setBaseUrl('/cms/api/v1/contributions/'); + RestangularConfigurer.setRequestSuffix('/'); + }).service('freelancereporting'); + }) + .factory('ContributionReportingService', function (Restangular, moment) { + + Restangular.extendModel('reporting', function (obj) { + obj.user = angular.extend(obj.user, { + toString: function () { + return obj.user.full_name || obj.user.username; + } + }); + + obj.content = angular.extend(obj.content, { + toString: function () { + return obj.content.title + ' (' + moment(obj.content.published).format('MM/DD/YYYY h:mm a') + ')'; + }, + }); + return obj; + }); + + return Restangular.withConfig(function (RestangularConfigurer) { + RestangularConfigurer.setBaseUrl('/cms/api/v1/contributions/'); + RestangularConfigurer.setRequestSuffix('/'); + }).service('reporting'); + }); + +'use strict'; +(function () { + angular.module('BettyCropper', [ + 'bulbs.cms.site.config', + 'restangular', + 'jquery' + ]) + .factory('Selection', SelectionFactory) + .factory('BettyImage', BettyImageFactory) + .service('BettyCropper', BettyCropperService); + + function BettyCropperService($http, $interpolate, $q, CmsConfig, BettyImage, $) { + var fileInputId = '#bulbs-cms-hidden-image-file-input'; + var inputTemplate = ''; + + this.upload = upload; + this.get = get; + this.detail = get; + this.detailPatch = detailPatch; + this.updateSelection = updateSelection; + + function upload() { + var uploadImageDeferred = $q.defer(); + + angular.element(fileInputId).remove(); + var fileInput = angular.element(inputTemplate); + angular.element('body').append(fileInput); + + fileInput.click(); + + fileInput.unbind('change'); + fileInput.bind('change', function (e) { + if (e.target.files.length !== 1) { + uploadImageDeferred.reject('We need exactly one image!'); + } + var file = e.target.files[0]; + if (file.type.indexOf('image/') !== 0) { + uploadImageDeferred.reject('Not an image!'); + } + + if (file.size > 10 * 1024 * 1024) { // MAGIC! + uploadImageDeferred.reject('The file is too large!'); + } + + var imageData = new FormData(); + imageData.append('image', file); + + $http({ + method: 'POST', + url: CmsConfig.buildImageApiUrl('api/new'), + headers: { + 'X-Betty-Api-Key': CmsConfig.getImageApiKey(), + 'Content-Type': undefined, + 'X-CSRFToken': undefined + }, + data: imageData, + transformRequest: angular.identity, + transformResponse: function (data, headersGetter) { + // So, sometimes the browser doesn't think that JSON data is JSON. + if (typeof data === 'string') { + data = $.parseJSON(data); + } + var image = new BettyImage(data); + return image; + } + }).success(function (success) { + uploadImageDeferred.resolve(success); + }).error(function (error) { + uploadImageDeferred.reject(error); + }); + + }); + + return uploadImageDeferred.promise; + } + + function get(id) { + return $http({ + method: 'GET', + url: CmsConfig.buildImageApiUrl('api/' + id), + headers: { + 'X-Betty-Api-Key': CmsConfig.getImageApiKey(), + 'Content-Type': undefined, + 'X-CSRFToken': undefined + }, + transformRequest: angular.identity, + transformResponse: function (data, headersGetter) { + if (typeof data === 'string') { + data = $.parseJSON(data); + } + return new BettyImage(data); + } + }); + } + + function detailPatch(id, name, credit, selections) { + return $http({ + method: 'PATCH', + url: CmsConfig.buildImageApiUrl('api/' + id), + headers: { + 'X-Betty-Api-Key': CmsConfig.getImageApiKey(), + 'Content-Type': undefined, + 'X-CSRFToken': undefined + }, + data: { + name: name, + credit: credit, + selections: selections + }, + transformRequest: angular.identity, + transformResponse: function (data, headersGetter) { + if (typeof data === 'string') { + data = $.parseJSON(data); + } + return new BettyImage(data); + } + }); + } + + function updateSelection(id, ratio, selections) { + return $http({ + method: 'POST', + url: CmsConfig.buildImageApiUrl('api/' + id + '/' + ratio), + headers: { + 'X-Betty-Api-Key': CmsConfig.getImageApiKey(), + 'Content-Type': undefined, + 'X-CSRFToken': undefined + }, + data: selections + }); + } + } + + function BettyImageFactory($interpolate, $http, CmsConfig, Selection, $) { + function BettyImage(data) { + this.id = data.id; + this.name = data.name; + this.width = data.width; + this.height = data.height; + this.selections = {}; + for (var ratio in data.selections) { + this.selections[ratio] = new Selection(data.selections[ratio]); + } + } + + BettyImage.prototype.scaleToFit = function (width, height) { + var scale; + if (width && height) { + var fitRatio = width / height; + var thisRatio = this.width / this.height; + if (fitRatio > thisRatio) { + scale = height / this.height; + } else { + scale = width / this.width; + } + } else { + if (width) { + scale = width / this.width; + } + if (height) { + scale = height / this.height; + } + } + var scaled = { + width: Math.round(this.width * scale), + height: Math.round(this.height * scale), + scale: scale + }; + return scaled; + }; + + BettyImage.prototype.getStyles = function (width, height, ratio) { + if (height === 0) { + height = null; + } + + var selection = this.selections[ratio]; + var scaledSelection = selection.scaleToFit(width, height); + + return { + 'background-image': 'url(' + this.url('original', 1200, 'jpg') + ')', + 'background-size': Math.floor(scaledSelection.width() / selection.width() * this.width) + 'px', + 'background-position': '-' + scaledSelection.x0 + 'px -' + scaledSelection.y0 + 'px', + 'height': scaledSelection.height() + 'px', + 'width': scaledSelection.width() + 'px', + 'background-repeat': 'no-repeat', + 'position': 'relative' + }; + }; + + BettyImage.prototype.url = function (ratio, width, format) { + var exp = $interpolate( + '{{ base_url }}/{{ id }}/{{ ratio }}/{{ width }}.{{ format }}' + ); + var idStr = this.id.toString(); + var segmentedId = ''; + for (var i = 0; i < idStr.length; i++) { + if (i % 4 === 0 && i !== 0) { + segmentedId += '/'; + } + segmentedId += idStr.substr(i, 1); + } + return exp({ + base_url: CmsConfig.buildImageApiUrl(), + id: segmentedId, + ratio: ratio, + width: width, + format: format + }); + }; + + BettyImage.prototype.updateSelection = function (ratio, selection) { + var data = { + x0: selection.x0, + x1: selection.x1, + y0: selection.y0, + y1: selection.y1 + }; + if (selection.source) { + data.source = selection.source; + } + return $http({ + method: 'POST', + url: CmsConfig.buildImageApiUrl('api/' + this.id + '/' + ratio), + headers: { + 'X-Betty-Api-Key': CmsConfig.getImageApiKey(), + 'Content-Type': undefined, + 'X-CSRFToken': undefined + }, + data: data, + transformResponse: function (data, headersGetter) { + if (typeof data === 'string') { + data = $.parseJSON(data); + } + return [ratio, new Selection(data.selections[ratio])]; + } + }); + }; + + return BettyImage; + } + + function SelectionFactory() { + function Selection(data) { + this.x0 = data.x0; + this.x1 = data.x1; + this.y0 = data.y0; + this.y1 = data.y1; + this.source = data.source; + } + + Selection.prototype.width = function () { + return this.x1 - this.x0; + }; + + Selection.prototype.height = function () { + return this.y1 - this.y0; + }; + + Selection.prototype.scaleBy = function (scale) { + var scaledToFit = new Selection({ + x0: Math.round(this.x0 * scale), + x1: Math.round(this.x1 * scale), + y0: Math.round(this.y0 * scale), + y1: Math.round(this.y1 * scale) + }); + return scaledToFit; + }; + + Selection.prototype.scaleToFit = function (width, height) { + + var scale; + if (width && height) { + var fitRatio = width / height; + var thisRatio = this.width() / this.height(); + if (fitRatio > thisRatio) { + scale = height / this.height(); + } else { + scale = width / this.width(); + } + } else { + if (width) { + scale = width / this.width(); + } + if (height) { + scale = height / this.height(); + } + } + return this.scaleBy(scale); + }; + + return Selection; + } +})(); + +'use strict'; + +/** + * Autocomplete directive that should cover most autocomplete situations. + */ +angular.module('autocompleteBasic', [ + 'bulbs.cms.site.config', + 'BulbsAutocomplete', + 'BulbsAutocomplete.suggest', + 'lodash' +]) + .value('AUTOCOMPLETE_BASIC_DEBOUNCE', 200) + .directive('autocompleteBasic', [ + '_', 'CmsConfig', + function (_, CmsConfig) { + return { + controller: [ + '$scope', 'BULBS_AUTOCOMPLETE_EVENT_KEYPRESS', + 'AUTOCOMPLETE_BASIC_DEBOUNCE', + function ($scope, BULBS_AUTOCOMPLETE_EVENT_KEYPRESS, + AUTOCOMPLETE_BASIC_DEBOUNCE) { + + $scope.writables = { + searchTerm: '' + }; + + $scope.autocompleteItems = []; + + var $getItems = function () { + return $scope.searchFunction($scope.writables.searchTerm) + .then(function (data) { + return _.map(data, function (item) { + return { + name: $scope.displayFormatter(item), + value: item + }; + }); + }); + }; + + $scope.updateAutocomplete = _.debounce(function () { + if ($scope.writables.searchTerm) { + $getItems().then(function (results) { + $scope.autocompleteItems = results; + }); + } + }, AUTOCOMPLETE_BASIC_DEBOUNCE); + + $scope.delayClearAutocomplete = function () { + _.delay(function () { + $scope.clearAutocomplete(); + $scope.$digest(); + }, 200); + }; + + $scope.clearAutocomplete = function () { + $scope.writables.searchTerm = ''; + $scope.autocompleteItems = []; + }; + + $scope.clearSelectionOverlay = function () { + $scope.clearAutocomplete(); + $scope.showSelectionOverlay = false; + $scope.updateNgModel(); + $scope.onSelect({}); + }; + + $scope.handleKeypress = function ($event) { + if ($event.keyCode === 27) { + // esc, close dropdown + $scope.clearAutocomplete(); + } else if ($event.keyCode === 40 && _.isEmpty($scope.autocompleteItems)) { + // down key and no items in autocomplete, redo search + $scope.updateAutocomplete(); + } else { + $scope.$broadcast(BULBS_AUTOCOMPLETE_EVENT_KEYPRESS, $event); + } + }; + + $scope.handleSelect = function (selection) { + if (selection && $scope.updateNgModel) { + $scope.updateNgModel(selection); + $scope.showSelectionOverlay = true; + } + + $scope.clearAutocomplete(); + $scope.onSelect({selection: selection}); + }; + } + ], + link: function (scope, iElement, iAttrs, ngModelCtrl) { + var defaultFormatter = function (context) { + return context.item; + }; + + scope.valueFormatter = function (viewValue) { + return (scope.itemValueFormatter || defaultFormatter)({ item: viewValue }); + }; + + scope.displayFormatter = function (modelValue) { + return (scope.itemDisplayFormatter || defaultFormatter)({ item: modelValue }); + }; + + if (ngModelCtrl) { + + ngModelCtrl.$formatters.push(function (modelValue) { + return scope.displayFormatter(modelValue); + }); + + ngModelCtrl.$render = function () { + scope.selectedValue = ngModelCtrl.$viewValue; + }; + + ngModelCtrl.$parsers.push(function (viewValue) { + return scope.valueFormatter(viewValue); + }); + + var unbindInitialValue = scope.$watch('initialValue', function () { + scope.selectedValue = scope.initialValue; + }); + + scope.updateNgModel = function (selection) { + unbindInitialValue(); + var newValue = _.isUndefined(selection) ? null : angular.copy(selection.value); + ngModelCtrl.$setViewValue(angular.copy(newValue)); + scope.selectedValue = scope.displayFormatter(newValue); + }; + } + }, + require: '?ngModel', // optionally provide ng-model to have bind with an actual property + restrict: 'E', + scope: { + hideSearchIcon: '&', // true to hide search icon inside autocomplete + inputId: '@', // id to give input, useful if input has a label + inputPlaceholder: '@', // placeholder for input + initialValue: '=', // initial representation of selected value + itemDisplayFormatter: '&', // formatter to transform the display name of result + itemValueFormatter: '&', // formatter to transform the value of the result + onSelect: '&', // selection callback, recieves selection as argument + searchFunction: '=' // function to use for searching autocomplete results + }, + templateUrl: CmsConfig.buildComponentPath('autocomplete-basic/autocomplete-basic.html') + }; + } + ]); + +'use strict'; + +angular.module('bettyEditable', [ + 'BettyCropper', + 'bulbs.cms.imageCropModal', + 'bulbs.cms.site.config', + 'ui.bootstrap.modal' +]) + .directive('bettyEditable',[ + '$http', 'CmsConfig', 'BettyCropper', 'openImageCropModal', + function ($http, CmsConfig, BettyCropper, openImageCropModal) { + return { + restrict: 'E', + templateUrl: CmsConfig.buildComponentPath('betty-editable/betty-editable.html'), + scope: { + addStyles: '@', + editable: '=?', + hideMetas: '=', + image: '=', + placeholderText: '@', + ratio: '@', + onChange: '&' + }, + controller: function ($scope, $element) { + $scope.editable = angular.isDefined($scope.editable) ? $scope.editable : true; + $scope.upload = function (e) { + BettyCropper.upload().then( + function (success) { + $scope.image = { + id: success.id, + caption: null, + alt: null + }; + $scope.bettyImage = success; + }, + function (error) { + console.log(error); + }, + function (progress) { + console.log(progress); + } + ); + }; + + $scope.edit = function (e) { + openImageCropModal($scope.image).then(function (image) { + if (image.id === null) { + $scope.image = null; + } else { + $scope.image = image; + BettyCropper.get($scope.image.id).then(function (response) { + $scope.bettyImage = response.data; + $scope.setStyles(); + }); + } + }); + }; + }, + + link: function (scope, element, attrs) { + + if (scope.bettyImage === undefined) { + scope.bettyImage = null; + } + + scope.setStyles = function () { + if (scope.bettyImage) { + scope.imageStyling = scope.bettyImage.getStyles(element.parent().width(), null, scope.ratio); + } else { + var ratioWidth = parseInt(scope.ratio.split('x')[0], 10); + var ratioHeight = parseInt(scope.ratio.split('x')[1], 10); + scope.imageStyling = { + 'background-color': '#333', + 'position': 'relative', + 'width': element.parent().width(), + 'height': Math.floor(element.parent().width() * ratioHeight / ratioWidth) + 'px', + }; + } + }; + + scope.$watch('image', function (newImage, oldImage) { + if (newImage && newImage.id) { + BettyCropper.get(newImage.id).then(function (response) { + scope.bettyImage = response.data; + if (!oldImage || parseInt(response.data.id, 10) !== oldImage.id) { + scope.onChange(); + } + }); + } else if (!angular.equals(newImage, oldImage)) { + // image cleared out + scope.onChange(); + } + }); + + scope.$watch('bettyImage', function (newImage, oldImage) { + scope.setStyles(); + }, true); + + element.resize(scope.setStyles); + + scope.removeImage = function () { + scope.image = null; + }; + + scope.editImage = function () { + openImageCropModal(scope.image) + .then(function (success) { + console.log(success); + }); + }; + + } + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.breadcrumb', [ + 'bulbs.cms.site.config', + 'bulbs.cms.superFeatures.api' +]) + .directive('breadcrumb', [ + '$sce', 'CmsConfig', + function ($sce, CmsConfig) { + return { + scope: { + linksList: '=' + }, + link: function (scope, element, attrs) { + scope.renderValue = function (value) { + return $sce.trustAsHtml(angular.isFunction(value) ? value() : value); + }; + }, + templateUrl: CmsConfig.buildComponentPath( + 'breadcrumb', + 'breadcrumb.html' + ) + }; + } + ]); + +'use strict'; + +angular.module('bugReporter', [ + 'bulbs.cms.config' +]) + .directive('bugReporter', [ + '$http', '$window', 'CmsConfig', + function ($http, $window, CmsConfig) { + return { + restrict: 'E', + templateUrl: CmsConfig.buildComponentPath('bug-reporter/bug-reporter-button.html'), + scope: {}, + controller: function ($scope, $element, $timeout) { + $scope.report = {}; + $scope.reportButton = { + idle: 'Submit', + busy: 'Sending', + finished: 'Sent!', + error: 'Error!' + }; + + $scope.modalVisible = false; + $scope.showThankYou = false; + + $scope.showModal = function () { + $scope.modalVisible = true; + }; + + $scope.dismissModal = function () { + $scope.modalVisible = false; + $scope.showThankYou = false; + }; + + $scope.sendToWebtech = function () { + var report = + 'When I tried to:\n\n' + $scope.report.firstRes + '\n\n' + + 'I thought this would happen:\n\n' + $scope.report.secondRes + '\n\n' + + '...but this happened instead:\n\n' + $scope.report.thirdRes + ; + var data = { + report: report, + url: $window.location.href, + user_agent: $window.navigator.userAgent + }; + return $http.post('/cms/api/v1/report-bug/', data); + }; + + $scope.sendToWebtechCbk = function (promise) { + promise + .then(function () { + $scope.showThankYou = true; + $timeout(function () { + $scope.dismissModal(); + for (var entry in $scope.report) { + $scope.report[entry] = ''; + } + }, 5000); + }); + }; + + /* + Exposing this globally for PNotify. + Will revisit when we review how to + report bugs on the CMS. + */ + $window.showBugReportModal = function () { + $scope.$apply($scope.showModal()); + }; + + }, + link: function (scope, element) { + + } + }; + } + ]); + +'use strict'; + +angular.module('campaignAutocomplete', [ + 'autocompleteBasic', + 'bulbs.cms.site.config', + 'cms.tunic.config', + 'lodash', + 'uuid4' +]) + .directive('campaignAutocomplete', [ + '$http', 'CmsConfig', 'TunicConfig', 'uuid4', '_', + function ($http, CmsConfig, TunicConfig, uuid4, _) { + return { + controller: [ + '$scope', + function ($scope) { + + $scope.itemDisplayFormatter = function (campaign) { + if (_.isObject(campaign)) { + return campaign.name + ' - ' + campaign.id; + } + }; + + $scope.itemValueFormatter = function (campaign) { + return _.isObject(campaign) ? campaign.id : null; + }; + + $scope.searchCampaigns = function (searchTerm) { + return $http + .get(TunicConfig.buildBackendApiUrl('campaign/'), { + params: { search: searchTerm } + }) + .then(function (response) { + return response.data.results; + }); + }; + } + ], + link: function (scope, iElement, iAttrs, ngModelCtrl) { + scope.uuid = uuid4.generate(); + + if (ngModelCtrl) { + + scope.ngModel = ngModelCtrl; + + ngModelCtrl.$render = function () { + if (_.isNumber(ngModelCtrl.$modelValue) && !scope.initialValue) { + $http + .get(TunicConfig.buildBackendApiUrl('campaign/' + ngModelCtrl.$modelValue + '/')) + .then(function (result) { + scope.initialValue = scope.itemDisplayFormatter(result.data); + }); + } + }; + + scope.onSelect = function (selection) { + ngModelCtrl.$commitViewValue(); + }; + } + }, + restrict: 'E', + templateUrl: CmsConfig.buildComponentPath('campaign-autocomplete/campaign-autocomplete.html'), + require: 'ngModel', + scope: { + label: '@campaignAutocompleteLabel', // label for the autocomplete imput + onSelect: '&campaignAutocompleteOnSelect' // selection handler for auto completions + } + }; + } + ]); + +'use strict'; + +angular.module('campaigns.edit.directive', [ + 'apiServices.campaign.factory', + 'BettyCropper', + 'bulbs.cms.site.config', + 'campaigns.edit.sponsorPixel', + 'lodash', + 'saveButton.directive', + 'topBar' +]) + .directive('campaignsEdit', function (CmsConfig) { + return { + controller: function (_, $location, $q, $routeParams, $scope, Campaign) { + + // populate model for use + if ($routeParams.id === 'new') { + $scope.model = Campaign.$build(); + $scope.isNew = true; + } else { + $scope.model = Campaign.$find($routeParams.id); + } + + window.onbeforeunload = function (e) { + if (!_.isEmpty($scope.model.$dirty()) || $scope.isNew || $scope.needsSave) { + // unsaved changes, show confirmation alert + return 'You have unsaved changes.'; + } + }; + + $scope.$on('$destroy', function() { + // ensure even is cleaned up when we leave + delete window.onbeforeunload; + }); + + $scope.addPixel = function () { + var pixel = { + url: '', + campaign_type: '' + }; + $scope.model.pixels.push(pixel); + }; + + $scope.deletePixel = function (pixel) { + $scope.model.pixels = _.without($scope.model.pixels, pixel); + }; + + // set up save state function + $scope.saveModel = function () { + var promise; + + if ($scope.model) { + // have model, use save promise as deferred + promise = $scope.model.$save().$asPromise().then(function (data) { + $location.path('/cms/app/campaigns/edit/' + data.id + '/'); + }); + } else { + // no model, this is an error, defer and reject + var deferred = $q.defer(); + deferred.reject(); + promise = deferred.promise; + } + + return promise; + }; + }, + restrict: 'E', + scope: { + getModelId: '&modelId' + }, + templateUrl: CmsConfig.buildComponentPath('campaigns/campaigns-edit/campaigns-edit.html'), + }; + }); + +'use strict'; + +angular.module('campaigns.edit.sponsorPixel.directive', [ + 'bulbs.cms.config' +]) + .constant('PIXEL_TYPES', [{ + name: 'Listing', + value: 'Listing' + }, { + name: 'Detail', + value: 'Detail' + }]) + .directive('campaignsEditSponsorPixel', function (CmsConfig) { + return { + controller: function($scope, PIXEL_TYPES) { + $scope.PIXEL_TYPES = PIXEL_TYPES; + }, + restrict: 'E', + scope: { + model: '=' + }, + templateUrl: CmsConfig.buildComponentPath('campaigns/campaigns-edit/campaigns-edit-sponsor-pixel/campaigns-edit-sponsor-pixel.html') + }; + }); + +'use strict'; + +angular.module('campaigns.edit.sponsorPixel', [ + 'campaigns.edit.sponsorPixel.directive' +]); + +'use strict'; + +angular.module('campaigns.edit', [ + 'bulbs.cms.site.config', + 'campaigns.edit.directive' +]) + .config(function ($routeProvider) { + $routeProvider + .when('/cms/app/campaigns/edit/:id/', { + controller: function ($routeParams, $scope, $window, CmsConfig) { + $window.document.title = CmsConfig.getCmsName() + ' | Edit Campaign'; + $scope.routeId = $routeParams.id; + }, + template: '', + reloadOnSearch: false + }); + }); + +'use strict'; + +angular.module('campaigns.list', [ + 'apiServices.campaign.factory', + 'bulbs.cms.site.config', + 'listPage', + 'moment' +]) + .config(function ($injector, $routeProvider, CmsConfigProvider) { + var CmsConfig = $injector.invoke(CmsConfigProvider.$get); + + $routeProvider + .when('/cms/app/campaigns/', { + controller: function ($scope, $window, Campaign) { + $window.document.title = CmsConfig.getCmsName() + ' | Campaign'; + $scope.modelFactory = Campaign; + }, + templateUrl: CmsConfig.buildComponentPath('campaigns/campaigns-list/campaigns-list-page.html') + }); + }); + +'use strict'; + +angular.module('campaigns', [ + 'campaigns.edit', + 'campaigns.list' +]); + +'use strict'; + +angular.module('confirmationModal', [ + 'confirmationModal.factory', + 'ui.bootstrap' +]) + .directive('confirmationModalOpener', function (ConfirmationModal) { + return { + restrict: 'A', + scope: { + modalBody: '@', + modalCancelText: '@', + modalOkText: '@', + modalOnCancel: '&', + modalOnOk: '&', + modalTitle: '@' + }, + link: function (scope, element) { + var modalInstance = null; + element.addClass('confirmation-modal-opener'); + element.on('click', function () { + modalInstance = new ConfirmationModal(scope); + }); + } + }; + }); + +'use strict'; + +angular.module('confirmationModal.factory', [ + 'bulbs.cms.site.config', + 'ui.bootstrap.modal' +]) + .factory('ConfirmationModal', function ($modal, CmsConfig) { + + var ConfirmationModal = function (scope) { + return (function (scope) { + $modal + .open({ + controller: function ($scope, $modalInstance) { + $scope.confirm = function () { + $scope.$close(); + $scope.modalOnOk(); + }; + + $scope.cancel = function () { + $scope.$dismiss(); + $scope.modalOnCancel(); + }; + }, + scope: scope, + templateUrl: CmsConfig.buildComponentPath('confirmation-modal/confirmation-modal.html') + }); + })(scope); + }; + + return ConfirmationModal; + }); + +'use strict'; + +angular.module('bulbs.cms.currentUser.api', [ + 'bulbs.cms.site.config', + 'lodash' +]) + .service('CurrentUserApi', [ + '_', '$http', '$q', 'CmsConfig', + function (_, $http, $q, CmsConfig) { + + var currentUser; + var pendingGetCurrentUserRequest; + + var parsePayload = function (payload) { + var data = _.cloneDeep(payload); + + data.displayName = + data.first_name && data.last_name ? + (data.first_name + ' ' + data.last_name) : + (data.email || data.username); + + return data; + }; + + var getCurrentUser = function () { + if (!pendingGetCurrentUserRequest) { + pendingGetCurrentUserRequest = $http.get(CmsConfig.buildApiUrlRoot('me/')) + .then(function (response) { + currentUser = parsePayload(response.data); + return currentUser; + }) + .finally(function () { + pendingGetCurrentUserRequest = null; + }); + } + + return pendingGetCurrentUserRequest; + }; + + return { + getCurrentUserWithCache: function () { + if (currentUser) { + return $q.when(currentUser); + } + return getCurrentUser(); + }, + logout: function () { + return $http.get(CmsConfig.buildApiUrlRoot('me', 'logout/')) + .then(function () { + currentUser = null; + }); + } + }; + }] + ); + +'use strict'; + +angular.module('bulbs.cms.currentUser', [ + 'bulbs.cms.currentUser.api', + 'bulbs.cms.user.nameDisplayFilter' +]); + +'use strict'; + +angular.module('bulbs.cms.user.nameDisplayFilter', []) + .filter('userNameDisplay', [ + function () { + + return function (user) { + if (!user) { return ''; } + if (user.full_name) { + return user.full_name; + } else if (user.first_name && user.last_name) { + return user.first_name + ' ' + user.last_name; + } else { + return user.username; + } + }; + }] + ); + +'use strict'; + +angular.module('bulbs.cms.customSearch.config', [ + 'lodash' +]) + .provider('CustomSearchConfig', [ + '_', + function (_) { + + var CustomSearchConfigError = BulbsCmsConfigError.build('CustomSearchConfig'); + var checkOrError = function (value, test, errorMsg) { + if (test(value)) { + return value; + } + throw new CustomSearchConfigError(errorMsg); + }; + + // condition fields to display + var conditionFieldMappings = []; + // condition types to display + var conditionTypes = []; + // time periods to display + var timePeriodMappings = []; + // maximum number of milliseconds to wait for a request to complete + var requestCapMs = 150; + + this.addConditionField = function (name, endpoint, + valueStructureName, valueStructureValue) { + + conditionFieldMappings.push({ + name: checkOrError( + name, _.isString, + 'condition field name must be a string!' + ), + endpoint: checkOrError( + endpoint, _.isString, + 'condition field endpoint must be a string!' + ), + value_structure: { + name: checkOrError( + valueStructureName, _.isString, + 'condition field value structure name must be a string!' + ), + value: checkOrError( + valueStructureValue, _.isString, + 'condition field value structure value must be a string!' + ) + } + }); + return this; + }; + + this.addConditionType = function (name, value) { + conditionTypes.push({ + name: checkOrError( + name, _.isString, + 'condition type name must be a string!' + ), + value: checkOrError( + value, _.isString, + 'condition type value must be a string!' + ) + }); + return this; + }; + + this.addTimePeriod = function (name, value) { + timePeriodMappings.push({ + name: checkOrError( + name, _.isString, + 'time period name must be a string!' + ), + value: checkOrError( + value, _.isString, + 'time period value must be a string!' + ) + }); + return this; + }; + + this.setRequestCapMs = function (value) { + requestCapMs = checkOrError( + value, _.isNumber, + 'request cap milliseconds must be a number!' + ); + return this; + }; + + this.$get = [ + function () { + return { + getConditionFields: _.constant(conditionFieldMappings), + getConditionTypes: _.constant(conditionTypes), + getRequestCapMs: _.constant(requestCapMs), + getTimePeriods: _.constant(timePeriodMappings) + }; + } + ]; + } + ]); + +'use strict'; + +angular.module('customSearch.contentItem.directive', [ + 'bulbs.cms.site.config' +]) + .directive('customSearchContentItem', function (CmsConfig) { + return { + restrict: 'E', + scope: { + model: '=', + controllerService: '=', + onUpdate: '&' + }, + templateUrl: CmsConfig.buildComponentPath('custom-search/custom-search-content-item/custom-search-content-item.html') + }; + }); + +'use strict'; + +angular.module('customSearch.contentItem', [ + 'customSearch.contentItem.directive' +]); + +'use strict'; + +angular.module('customSearch.directive', [ + 'bulbs.cms.site.config', + 'customSearch.contentItem', + 'customSearch.group', + 'customSearch.service', + 'customSearch.simpleContentSearch' +]) + .directive('customSearch', function (CmsConfig) { + return { + controller: function (_, $scope, CustomSearchService) { + + $scope.customSearchService = new CustomSearchService(); + + $scope.resetFilters = function () { + $scope.customSearchService.setPage(1); + $scope.customSearchService.setQuery(''); + $scope.addedFilterOn = false; + $scope.removedFilterOn = false; + }; + + $scope.$conditionalContentRetrieve = function () { + if ($scope.addedFilterOn) { + // included filter is on, use retrieval by included + $scope.customSearchService.$filterContentByIncluded(); + } else if ($scope.removedFilterOn) { + // excluded filter is on, use retrieval by excluded + $scope.customSearchService.$filterContentByExcluded(); + } else { + // no query entered, any request should go to page one + $scope.customSearchService.$retrieveContent(); + } + }; + + $scope.$contentRetrieve = function () { + $scope.customSearchService.$retrieveContent(); + $scope.onUpdate(); + }; + }, + link: function(scope, iElement, iAttrs, ngModelCtrl) { + + ngModelCtrl.$formatters.push(function (modelValue) { + scope.customSearchService.data(modelValue); + scope.customSearchService.$retrieveContent(); + }); + + }, + require: 'ngModel', + restrict: 'E', + scope: { + onUpdate: '&' + }, + templateUrl: CmsConfig.buildComponentPath('custom-search/custom-search.html') + }; + }); + +'use strict'; + +angular.module('customSearch.group.condition.directive', [ + 'bulbs.cms.site.config', + 'BulbsAutocomplete.suggest', + 'BulbsAutocomplete', + 'contentServices.factory' +]) + .directive('customSearchGroupCondition', function (CmsConfig) { + return { + controller: function (_, $q, $scope, BULBS_AUTOCOMPLETE_EVENT_KEYPRESS, + ContentFactory, CustomSearchConfig) { + + $scope.conditionTypes = CustomSearchConfig.getConditionTypes(); + $scope.fieldTypes = CustomSearchConfig.getConditionFields(); + + $scope.writables = { + searchTerm: '' + }; + + $scope.autocompleteItems = []; + + $scope.data = $scope.controllerService.groupsConditionsGet($scope.groupIndex, $scope.conditionIndex); + + var $getItems = function () { + return ContentFactory.all($scope.data.field) + .getList({search: $scope.writables.searchTerm}) + .then(function (items) { + var field = _.find($scope.fieldTypes, function (type) { + return type.endpoint === $scope.data.field; + }); + + return _.map(items, function (item) { + return { + name: item[field.value_structure.name], + value: item[field.value_structure.value] + }; + }); + }); + }; + + $scope.updateAutocomplete = function () { + if ($scope.writables.searchTerm) { + $getItems().then(function (results) { + $scope.autocompleteItems = results; + }); + } + }; + + $scope.delayClearAutocomplete = function () { + _.delay(function () { + $scope.clearAutocomplete(); + $scope.$digest(); + }, 200); + }; + + $scope.clearAutocomplete = function () { + $scope.writables.searchTerm = ''; + $scope.autocompleteItems = []; + }; + + $scope.handleKeypress = function ($event) { + if ($event.keyCode === 27) { + // esc, close dropdown + $scope.clearAutocomplete(); + } else { + $scope.$broadcast(BULBS_AUTOCOMPLETE_EVENT_KEYPRESS, $event); + } + }; + }, + restrict: 'E', + scope: { + controllerService: '=', + groupIndex: '=', + conditionIndex: '=', + onUpdate: '&', + remove: '&' + }, + templateUrl: CmsConfig.buildComponentPath('custom-search/custom-search-group/custom-search-group-condition/custom-search-group-condition.html') + }; + }); + +'use strict'; + +angular.module('customSearch.group.condition', [ + 'customSearch.group.condition.directive' +]); + +'use strict'; + +angular.module('customSearch.group.directive', [ + 'bulbs.cms.site.config', + 'uuid4' +]) + .directive('customSearchGroup', function (CmsConfig) { + return { + controller: function ($scope, CustomSearchConfig, uuid4) { + $scope.data = $scope.controllerService.groupsGet($scope.groupIndex); + $scope.timePeriods = CustomSearchConfig.getTimePeriods(); + $scope.uuid = uuid4.generate(); + + $scope.$update = function () { + $scope.controllerService.$groupsUpdateResultCountFor($scope.groupIndex).then(function () { + $scope.onUpdate(); + }); + }; + + $scope.controllerService.$groupsUpdateResultCountFor($scope.groupIndex); + }, + restrict: 'E', + scope: { + controllerService: '=', + groupIndex: '=', + remove: '&', + onUpdate: '&' + }, + templateUrl: CmsConfig.buildComponentPath('custom-search/custom-search-group/custom-search-group.html') + }; + }); + +'use strict'; + +angular.module('customSearch.group', [ + 'customSearch.group.directive', + 'customSearch.group.condition' +]); + +'use strict'; + +angular.module('customSearch.service', [ + 'bulbs.cms.site.config', + 'apiServices.customSearch.factory' +]) + .factory('CustomSearchService', function (_, CustomSearch, CustomSearchConfig) { + + var defaultData = { + groups: [], + includedIds: [], + excludedIds: [], + pinnedIds: [] + }; + + /** + * Create custom search service. + * + * @returns service wrapper around given endpoint. + */ + var CustomSearchService = function (data) { + + this.data(data); + + this.$page = 1; + this.$query = ''; + + this.content = {}; + }; + + CustomSearchService.prototype.data = function (data) { + + if (_.isUndefined(data)) { + this._data = defaultData; + } else { + this._data = _.defaults(data, defaultData); + } + + return this._data; + }; + + CustomSearchService.prototype._$getContent = _.debounce(function (queryData) { + var self = this; + return CustomSearch.$retrieveContent(queryData) + .then(function (data) { + self.content = data; + }); + }, CustomSearchConfig.getRequestCapMs()); + + CustomSearchService.prototype.$filterContentByIncluded = function () { + var contentQuery = { + includedIds: this._data.includedIds, + page: this.$page, + query: this.$query + }; + return this._$getContent(contentQuery); + }; + + CustomSearchService.prototype.$filterContentByExcluded = function () { + var contentQuery = { + includedIds: this._data.excludedIds, + page: this.$page, + query: this.$query + }; + return this._$getContent(contentQuery); + }; + + CustomSearchService.prototype.$retrieveContent = function () { + var contentQuery = _.assign({ + page: this.$page, + query: this.$query, + preview: true + }, this._data); + return this._$getContent(contentQuery); + }; + + CustomSearchService.prototype.$groupsUpdateResultCountFor = function (index) { + var self = this; + return (function (index) { + return CustomSearch.$retrieveGroupCount(self._data.groups[index]) + .then(function (count) { + self._data.groups[index].$result_count = count; + }); + })(index); + }; + + CustomSearchService.prototype.groupsResultCountGet = function (index) { + return this._data.groups[index].$result_count || 0; + }; + + CustomSearchService.prototype.groupsList = function () { + return this._data.groups; + }; + + CustomSearchService.prototype.groupsAdd = function (data) { + if (_.isUndefined(data)) { + data = {}; + } + + data = _.defaults(data, { + conditions: [], + time: null, + $result_count: 0 + }); + + this._data.groups.push(data); + return data; + }; + + CustomSearchService.prototype.groupsGet = function (index) { + return this._data.groups[index]; + }; + + CustomSearchService.prototype.groupsRemove = function (index) { + return this._data.groups.splice(index, 1).length > 0; + }; + + CustomSearchService.prototype.groupsClear = function () { + this._data.groups = []; + }; + + CustomSearchService.prototype.groupsConditionsAdd = function (groupIndex, data) { + if (_.isUndefined(data)) { + data = {}; + } + + data = _.defaults(data, { + field: CustomSearchConfig.getConditionFields()[0].endpoint, + type: CustomSearchConfig.getConditionTypes()[0].value, + values: [] + }); + + this._data.groups[groupIndex].conditions.push(data); + return data; + }; + + CustomSearchService.prototype.groupsConditionsGet = function (groupIndex, conditionIndex) { + return this._data.groups[groupIndex].conditions[conditionIndex]; + }; + + CustomSearchService.prototype.groupsConditionsList = function (groupIndex) { + return this._data.groups[groupIndex].conditions; + }; + + CustomSearchService.prototype.groupsConditionsRemove = function (groupIndex, conditionIndex) { + return this._data.groups[groupIndex].conditions.splice(conditionIndex, 1).length > 0; + }; + + CustomSearchService.prototype.groupsTimePeriodSet = function (groupIndex) { + var value = CustomSearchConfig.getTimePeriods()[0].value; + this._data.groups[groupIndex].time = value; + return value; + }; + + CustomSearchService.prototype.groupsTimePeriodGet = function (groupIndex) { + return this._data.groups[groupIndex].time || null; + }; + + CustomSearchService.prototype.groupsTimePeriodRemove = function (groupIndex) { + this._data.groups[groupIndex].time = null; + }; + + CustomSearchService.prototype.groupsConditionsValuesAdd = function (groupIndex, conditionIndex, value) { + var values = this._data.groups[groupIndex].conditions[conditionIndex].values; + var matches = _.find(values, function (existingValue) { + return existingValue.name === value.name && existingValue.value === value.value; + }); + + if (!matches) { + values.push(value); + } + }; + + CustomSearchService.prototype.groupsConditionsValuesClear = function (groupIndex, conditionIndex) { + this._data.groups[groupIndex].conditions[conditionIndex].values = []; + }; + + CustomSearchService.prototype.groupsConditionsValuesList = function (groupIndex, conditionIndex) { + return this._data.groups[groupIndex].conditions[conditionIndex].values; + }; + + CustomSearchService.prototype.groupsConditionsValuesRemove = function (groupIndex, conditionIndex, valueIndex) { + return this._data.groups[groupIndex].conditions[conditionIndex].values.splice(valueIndex, 1).length > 0; + }; + + CustomSearchService.prototype.includesList = function () { + return this._data.includedIds; + }; + + CustomSearchService.prototype.includesAdd = function (id) { + // add id, ensure uniqueness + this._data.includedIds.push(id); + this._data.includedIds = _.uniq(this._data.includedIds); + + // remove from exclude list + this.excludesRemove(id); + }; + + CustomSearchService.prototype.includesRemove = function (id) { + this._data.includedIds = _.without(this._data.includedIds, id); + }; + + CustomSearchService.prototype.includesHas = function (id) { + return _.includes(this._data.includedIds, id); + }; + + CustomSearchService.prototype.excludesList = function () { + return this._data.excludedIds; + }; + + CustomSearchService.prototype.excludesAdd = function (id) { + // exclude id, ensure unqiueness + this._data.excludedIds.push(id); + this._data.excludedIds = _.uniq(this._data.excludedIds); + + // remove from include list and pinned list + this.includesRemove(id); + this.pinsRemove(id); + }; + + CustomSearchService.prototype.excludesRemove = function (id) { + this._data.excludedIds = _.without(this._data.excludedIds, id); + }; + + CustomSearchService.prototype.excludesHas = function (id) { + return _.includes(this._data.excludedIds, id); + }; + + CustomSearchService.prototype.pinsList = function () { + return this._data.pinnedIds; + }; + + CustomSearchService.prototype.pinsAdd = function (id) { + // pin id, ensure unqiueness + this._data.pinnedIds.push(id); + this._data.pinnedIds = _.uniq(this._data.pinnedIds); + + // remove from exclude list + this.excludesRemove(id); + }; + + CustomSearchService.prototype.pinsRemove = function (id) { + this._data.pinnedIds = _.without(this._data.pinnedIds, id); + }; + + CustomSearchService.prototype.pinsHas = function (id) { + return _.includes(this._data.pinnedIds, id); + }; + + CustomSearchService.prototype.getPage = function () { + return this.$page; + }; + + CustomSearchService.prototype.setPage = function (page) { + this.$page = page; + }; + + CustomSearchService.prototype.getQuery = function () { + return this.$query; + }; + + CustomSearchService.prototype.setQuery = function (query) { + this.$query = query; + }; + + return CustomSearchService; + }); + +'use strict'; + +angular.module('customSearch.simpleContentSearch.directive', [ + 'bulbs.cms.site.config', + 'BulbsAutocomplete', + 'BulbsAutocomplete.suggest' +]) + .directive('customSearchSimpleContentSearch', function (CmsConfig) { + return { + controller: function (_, $scope, BULBS_AUTOCOMPLETE_EVENT_KEYPRESS, + ContentFactory) { + + $scope.writables = { + searchTerm: '' + }; + + $scope.autocompleteItems = []; + + var $getItems = function () { + return ContentFactory.all('content') + .getList({search: $scope.writables.searchTerm}) + .then(function (results) { + return _.chain(results) + .take(10) + .map(function (item) { + return { + name: 'ID: ' + item.id + ' | ' + item.title, + value: item.id + }; + }) + .value(); + }); + }; + + $scope.updateAutocomplete = function () { + if ($scope.writables.searchTerm) { + $getItems().then(function (results) { + $scope.autocompleteItems = results; + }); + } + }; + + $scope.delayClearAutocomplete = function () { + _.delay(function () { + $scope.clearAutocomplete(); + $scope.$digest(); + }, 200); + }; + + $scope.clearAutocomplete = function () { + $scope.writables.searchTerm = ''; + $scope.autocompleteItems = []; + }; + + $scope.handleKeypress = function ($event) { + if ($event.keyCode === 27) { + // esc, close dropdown + $scope.clearAutocomplete(); + } else { + $scope.$broadcast(BULBS_AUTOCOMPLETE_EVENT_KEYPRESS, $event); + } + }; + }, + restrict: 'E', + scope: { + onSelect: '&' + }, + templateUrl: CmsConfig.buildComponentPath('custom-search/custom-search-simple-content-search/custom-search-simple-content-search.html') + }; + }); + +'use strict'; + +angular.module('customSearch.simpleContentSearch', [ + 'customSearch.simpleContentSearch.directive' +]); + +'use strict'; + +angular.module('customSearch', [ + 'customSearch.directive' +]); + +'use strict'; + +angular.module('bulbs.cms.dateTimeFilter', [ + 'bulbs.cms.site.config', + 'lodash', + 'moment' +]) + .filter('dateTimeFormat', [ + '_', 'moment', 'CmsConfig', + function (_, moment, CmsConfig) { + return function (date, format) { + + if (!_.isString(date) && !moment.isMoment(date)) { + return ''; + } + + if (!_.isString(format)) { + format = CmsConfig.getDateTimeFormatHumanReadable(); + } + + return moment.tz(date, CmsConfig.getTimezoneName()).format(format); + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dateTimeModal.controller', [ + 'bulbs.cms.site.config', + 'moment', + 'ui.bootstrap.modal' +]) + .controller('DatetimeSelectionModalCtrl', [ + '$scope', '$modalInstance', 'CmsConfig', 'moment', + function ($scope, $modalInstance, CmsConfig, moment) { + + $scope.TIMEZONE_LABEL = moment.tz(CmsConfig.getTimezoneName()).format('z'); + + // ensure that we can't choose a time if date is invalid + $scope.dateValid = true; + $scope.$watch('tempDatetime', function () { + $scope.dateValid = $scope.tempDatetime.isValid(); + }); + + // watch temp time to update date + $scope.$watch('tempTime', function () { + var newTime = moment($scope.tempTime); + + if (newTime.isValid()) { + $scope.tempDatetime.hour(newTime.hour()); + $scope.tempDatetime.minute (newTime.minute()); + $scope.tempDatetime.second(newTime.second()); + } + }); + + // copy date temporarily so user has to actually verify change to the date + $scope.tempDatetime = angular.copy($scope.modDatetime); + if (!$scope.tempDatetime) { + // default to now if no time given + $scope.tempDatetime = moment(); + } + $scope.tempTime = angular.copy($scope.tempDatetime); + + var timeNowWithOffset = function () { + return moment.tz(CmsConfig.getTimezoneName()); + }; + + // callback function for using datetimepicker calendar because it doesn't + // modify the given ngModel + $scope.setDate = function (newDate) { + var newDateAsMoment = moment(newDate); + $scope.tempDatetime = ($scope.tempDatetime || moment()) + .year(newDateAsMoment.year()) + .month(newDateAsMoment.month()) + .date(newDateAsMoment.date()); + }; + + $scope.setDateToday = function () { + $scope.setDate(timeNowWithOffset()); + }; + + $scope.setDateTomorrow = function () { + $scope.setDate(timeNowWithOffset().add(1, 'day')); + }; + + $scope.setTimeNow = function () { + $scope.tempDatetime = timeNowWithOffset(); + }; + + $scope.setTimeMidnight = function () { + $scope.tempDatetime = timeNowWithOffset() + .hour(24) + .minute(0) + .second(0); + }; + + $scope.clearDatetime = function () { + $modalInstance.close(null); + }; + + $scope.chooseDatetime = function () { + if ($scope.dateValid) { + // close modal, ensuring that output date is a moment + var retMoment = moment($scope.tempDatetime); + $modalInstance.close(retMoment); + } else { + console.error('Attempting to choose invalid date.'); + } + }; + + } + ]); + +'use strict'; + +/** + * Directive to apply as an attribute to an element, that when clicked, will open a datetime selection modal. Modal + * functionality is dependent on all dates being moment objects. + */ +angular.module('bulbs.cms.dateTimeModal.opener', [ + 'bulbs.cms.dateTimeModal.controller', + 'bulbs.cms.site.config', + 'ui.bootstrap.modal' +]) + .directive('datetimeSelectionModalOpener', [ + '$modal', '$q', 'CmsConfig', + function ($modal, $q, CmsConfig) { + return { + restrict: 'A', + scope: { + modalClearText: '@', + modalOkText: '@', + modDatetime: '=?ngModel', + modalTitle: '@', + modalOnBeforeClose: '&', + modalOnClear: '&', + modalOnClose: '&' + }, + link: function (scope, element) { + var modalInstance = null; + element.addClass('datetime-selection-modal-opener'); + element.on('click', function () { + + modalInstance = $modal + .open({ + templateUrl: CmsConfig.buildComponentPath( + 'date-time-modal', + 'date-time-modal.html' + ), + controller: 'DatetimeSelectionModalCtrl', + scope: scope + }); + + modalInstance.result + .then(function (newDate) { + return $q.when(scope.modalOnBeforeClose({ newDate: newDate })) + .then(function (result) { + + if (result !== false) { + scope.modDatetime = newDate; + if (newDate) { + scope.modalOnClose({ newDate: newDate }); + } else { + scope.modalOnClear(); + } + } + }); + }); + }); + } + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dateTimeModal', [ + 'bulbs.cms.dateTimeModal.opener' +]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.api', [ + 'bulbs.cms.site.config' +]) + .service('DynamicContentApi', [ + '$http', 'CmsConfig', + function ($http, CmsConfig) { + return { + retrieveSchema: function (url) { + return $http({ + method: 'OPTIONS', + url: url + }); + } + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.form.field.boolean', [ + 'bulbs.cms.site.config', + 'bulbs.cms.dynamicContent.form.input.label', + 'bulbs.cms.dynamicContent.form.input.errors' +]) + .directive('dynamicContentFormFieldBoolean', [ + 'CmsConfig', + function (CmsConfig) { + return { + require: ['ngModel', '^^form'], + restrict: 'E', + scope: { + uuid: '@', + name: '@', + ngModel: '=', + schema: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'dynamic-content', + 'dynamic-content-form', + 'dynamic-content-form-field', + 'dynamic-content-form-field-boolean', + 'dynamic-content-form-field-boolean.html' + ) + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.form.field.color', [ + 'bulbs.cms.site.config', + 'bulbs.cms.dynamicContent.form.input.label', + 'bulbs.cms.dynamicContent.form.input.errors' +]) + .directive('dynamicContentFormFieldColor', [ + 'CmsConfig', + function (CmsConfig) { + return { + require: ['ngModel', '^^form'], + restrict: 'E', + scope: { + uuid: '@', + name: '@', + ngModel: '=', + schema: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'dynamic-content', + 'dynamic-content-form', + 'dynamic-content-form-field', + 'dynamic-content-form-field-color', + 'dynamic-content-form-field-color.html' + ), + link: function (scope, element, attr, ctrls) { + var formField = ctrls[1][scope.name]; + formField.$validators.rgbhex = function (modelValue) { + if (!modelValue) { + return true; + } + else { + return /^#[0-9a-fA-F]{6}$/.test(modelValue); + } + }; + } + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.form.field.dateTime', [ + 'bulbs.cms.dateTimeFilter', + 'bulbs.cms.dateTimeModal', + 'bulbs.cms.dynamicContent.form.input.label', + 'bulbs.cms.dynamicContent.form.input.errors', + 'bulbs.cms.site.config' +]) + .directive('dynamicContentFormFieldDateTime', [ + 'CmsConfig', + function (CmsConfig) { + return { + controller: [ + '$scope', + function ($scope) { + $scope.setDate = function (newDate) { + $scope.ngModel[$scope.name] = newDate.format(); + }; + + $scope.clearDate = function () { + $scope.ngModel[$scope.name] = null; + }; + } + ], + require: ['ngModel', '^^form'], + restrict: 'E', + scope: { + uuid: '@', + name: '@', + ngModel: '=', + schema: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'dynamic-content', + 'dynamic-content-form', + 'dynamic-content-form-field', + 'dynamic-content-form-field-date-time', + 'dynamic-content-form-field-date-time.html' + ) + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.form.field.image', [ + 'bettyEditable', + 'bulbs.cms.site.config', + 'bulbs.cms.staticImage', + 'bulbs.cms.dynamicContent.form.input.errors', + 'bulbs.cms.dynamicContent.form.input.label' +]) + .directive('dynamicContentFormFieldImage', [ + 'CmsConfig', + function (CmsConfig) { + + return { + require: ['ngModel', '^^form'], + restrict: 'E', + scope: { + name: '@', + ngModel: '=', + schema: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'dynamic-content', + 'dynamic-content-form', + 'dynamic-content-form-field', + 'dynamic-content-form-field-image', + 'dynamic-content-form-field-image.html' + ) + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.form.input.errors', [ + 'bulbs.cms.site.config' +]) + .directive('dynamicContentFormFieldInputErrors', [ + 'CmsConfig', + function (CmsConfig) { + return { + link: function (scope, element, attrs, formCtrl) { + scope.form = formCtrl; + }, + require: '^^form', + restrict: 'E', + scope: { + name: '@', + schema: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'dynamic-content', + 'dynamic-content-form', + 'dynamic-content-form-field', + 'dynamic-content-form-field-input-errors', + 'dynamic-content-form-field-input-errors.html' + ) + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.form.input.label', [ + 'bulbs.cms.site.config', + 'lodash' +]) + .directive('dynamicContentFormFieldInputLabel', [ + '_', 'CmsConfig', + function (_, CmsConfig) { + return { + link: function (scope, element, attrs, formCtrl) { + scope.form = formCtrl; + + scope.isEmpty = _.isEmpty; + }, + require: '^^form', + restrict: 'E', + scope: { + inputId: '@', + name: '@', + schema: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'dynamic-content', + 'dynamic-content-form', + 'dynamic-content-form-field', + 'dynamic-content-form-field-input-label', + 'dynamic-content-form-field-input-label.html' + ) + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.form.field.integer', [ + 'bulbs.cms.site.config', + 'bulbs.cms.dynamicContent.form.input.label', + 'bulbs.cms.dynamicContent.form.input.errors' +]) + .directive('dynamicContentFormFieldInteger', [ + 'CmsConfig', + function (CmsConfig) { + return { + require: ['ngModel', '^^form'], + restrict: 'E', + scope: { + uuid: '@', + name: '@', + ngModel: '=', + schema: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'dynamic-content', + 'dynamic-content-form', + 'dynamic-content-form-field', + 'dynamic-content-form-field-integer', + 'dynamic-content-form-field-integer.html' + ), + link: function (scope, element, attr, ctrls) { + var formField = ctrls[1][scope.name]; + formField.$validators.integer = function (modelValue) { + if (!modelValue) { + return true; + } else { + return parseInt(modelValue, 10) === modelValue; + } + }; + } + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.form.field.invalid', [ + 'bulbs.cms.dynamicContent.form.input.label', + 'bulbs.cms.site.config' +]) + .directive('dynamicContentFormFieldInvalid', [ + 'CmsConfig', + function (CmsConfig) { + + return { + require: '^^form', + restrict: 'E', + scope: { + name: '@', + schema: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'dynamic-content', + 'dynamic-content-form', + 'dynamic-content-form-field', + 'dynamic-content-form-field-invalid', + 'dynamic-content-form-field-invalid.html' + ) + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.form.field.list', [ + 'bulbs.cms.dynamicContent.form.field.object', + 'bulbs.cms.dynamicContent.form.input.label', + 'bulbs.cms.dynamicContent.form.types', + 'bulbs.cms.site.config', + 'bulbs.cms.utils', + 'lodash' +]) + .directive('dynamicContentFormFieldList', [ + 'CmsConfig', 'FIELD_TYPES_META', 'Utils', + function (CmsConfig, FIELD_TYPES_META, Utils) { + return { + controller: [ + '_', '$scope', + function (_, $scope) { + if (_.isUndefined($scope.ngModel[$scope.name])) { + $scope.ngModel[$scope.name] = []; + } + + $scope.itemOrderingMemory = []; + $scope.redoOrdering = function () { + $scope.itemOrderingMemory = $scope.ngModel[$scope.name].map(function (v, i) { + return i + 1; + }); + }; + $scope.redoOrdering(); + + $scope.newItem = function () { + if ($scope.readOnly) { + return; + } + $scope.ngModel[$scope.name].push({}); + $scope.redoOrdering(); + }; + + $scope.moveItem = function (fromIndex, toIndex) { + Utils.moveTo($scope.ngModel[$scope.name], fromIndex, toIndex, true); + + $scope.redoOrdering(); + }; + + $scope.removeItem = function (index) { + Utils.removeFrom($scope.ngModel[$scope.name], index); + + $scope.redoOrdering(); + }; + } + ], + link: function (scope, elements, attrs, ctrls) { + scope.form = ctrls[1]; + + if (scope.ngModel[scope.name].length === 0) { + scope.newItem(); + } + }, + require: ['ngModel', '^^form'], + restrict: 'E', + scope: { + name: '@', + schema: '=', + ngModel: '=', + readOnly: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'dynamic-content', + 'dynamic-content-form', + 'dynamic-content-form-field', + 'dynamic-content-form-field-list', + 'dynamic-content-form-field-list.html' + ) + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.form.field.object', [ + 'bulbs.cms.dynamicContent.form.field.boolean', + 'bulbs.cms.dynamicContent.form.field.color', + 'bulbs.cms.dynamicContent.form.field.dateTime', + 'bulbs.cms.dynamicContent.form.field.image', + 'bulbs.cms.dynamicContent.form.field.list', + 'bulbs.cms.dynamicContent.form.field.integer', + 'bulbs.cms.dynamicContent.form.field.invalid', + 'bulbs.cms.dynamicContent.form.field.richtext', + 'bulbs.cms.dynamicContent.form.field.text', + 'bulbs.cms.dynamicContent.form.types', + 'bulbs.cms.site.config', + 'lodash', + 'uuid4' +]) + .directive('dynamicContentFormFieldObject', [ + '_', '$compile', 'CmsConfig', 'FIELD_TYPES_META', 'uuid4', + function (_, $compile, CmsConfig, FIELD_TYPES_META, uuid4) { + + return { + link: function (scope, element, attrs) { + var $form = element.find('ng-form'); + + scope.$watch('form.$valid', function (isValid) { + scope.onValidityChange({ + isValid: isValid, + internalForm: scope.form + }); + }); + + scope.$watch('schema', function () { + if (_.has(scope.schema, 'fields')) { + var fieldKeys = Object.keys(scope.schema.fields); + + if (_.isArray(scope.includeOnly)) { + fieldKeys = _.intersection(fieldKeys, scope.includeOnly); + } + + fieldKeys.forEach(function (id) { + var fieldSchema = scope.schema.fields[id]; + var fieldMeta = FIELD_TYPES_META[fieldSchema.type]; + + if (_.isUndefined(fieldMeta)) { + if (_.has(fieldSchema, 'fields')) { + fieldMeta = FIELD_TYPES_META.object; + } else { + fieldMeta = FIELD_TYPES_META.invalid; + } + } + + var tagName = fieldMeta.tagName; + var html = angular.element('<' + tagName + '>'); + + html.attr('uuid', uuid4.generate()); + html.attr('name', id); + html.attr('schema', 'schema.fields.' + id); + html.attr('class', 'dynamic-content-form-field'); + + // NOTE : Angular is not able to bind primitives properly when + // passed into isolate scopes. See + // https://github.com/angular/angular.js/issues/1924. The + // parent object is passed in in its entirety and the child + // directive is responsible for accessing the key it needs to + // be able to modify. + if (_.isString(scope.name)) { + // when we're at a nested object, scope.name will be defined + html.attr('ng-model', 'ngModel[name]'); + } else { + html.attr('ng-model', 'ngModel'); + } + + $form.append(html); + $compile(html)(scope); + }); + } + }, true); + }, + require: 'ngModel', + restrict: 'E', + scope: { + name: '@', + schema: '=', + ngModel: '=', + onValidityChange: '&', + includeOnly: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'dynamic-content', + 'dynamic-content-form', + 'dynamic-content-form-field', + 'dynamic-content-form-field-object', + 'dynamic-content-form-field-object.html' + ) + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.form.field.richtext', [ + 'bulbs.cms.site.config', + 'bulbs.cms.dynamicContent.form.input.label', + 'bulbs.cms.dynamicContent.form.input.errors', + 'OnionEditor' +]) + .directive('dynamicContentFormFieldRichtext', [ + 'CmsConfig', + function (CmsConfig) { + return { + link: function (scope, element, attr, ctrls) { + scope.formField = ctrls[1][scope.name]; + }, + require: ['ngModel', '^^form'], + restrict: 'E', + scope: { + name: '@', + ngModel: '=', + schema: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'dynamic-content', + 'dynamic-content-form', + 'dynamic-content-form-field', + 'dynamic-content-form-field-richtext', + 'dynamic-content-form-field-richtext.html' + ) + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.form.field.text', [ + 'bulbs.cms.site.config', + 'bulbs.cms.dynamicContent.form.input.label', + 'bulbs.cms.dynamicContent.form.input.errors', + 'jquery' +]) + .directive('dynamicContentFormFieldText', [ + 'CmsConfig', + function (CmsConfig) { + return { + link: function (scope, element, attr, ctrls) { + scope.formField = ctrls[1][scope.name]; + + if (scope.schema.max_length > 0) { + var input = element.find('input'); + input.css('width', scope.schema.max_length + 'em'); + + if (element.width() <= input.width()) { + input.css('width', ''); + } + } + }, + require: ['ngModel', '^^form'], + restrict: 'E', + scope: { + uuid: '@', + name: '@', + ngModel: '=', + schema: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'dynamic-content', + 'dynamic-content-form', + 'dynamic-content-form-field', + 'dynamic-content-form-field-text', + 'dynamic-content-form-field-text.html' + ) + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.form.types', []) + .constant('FIELD_TYPES_META', { + array: { + tagName: 'dynamic-content-form-field-list' + }, + boolean: { + tagName: 'dynamic-content-form-field-boolean' + }, + color: { + tagName: 'dynamic-content-form-field-color' + }, + datetime: { + tagName: 'dynamic-content-form-field-date-time' + }, + image: { + tagName: 'dynamic-content-form-field-image' + }, + invalid: { + tagName: 'dynamic-content-form-field-invalid' + }, + object: { + tagName: 'dynamic-content-form-field-object' + }, + richtext: { + tagName: 'dynamic-content-form-field-richtext' + }, + string: { + tagName: 'dynamic-content-form-field-text' + }, + integer: { + tagName: 'dynamic-content-form-field-integer' + } + }); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent.form', [ + 'bulbs.cms.dynamicContent.api', + 'bulbs.cms.dynamicContent.form.field.object', + 'bulbs.cms.site.config', + 'lodash' +]) + .directive('dynamicContentForm', [ + '_', 'CmsConfig', + function (_, CmsConfig) { + + var DynamicContentFormError = BulbsCmsError.build(''); + var template = function (name) { + return CmsConfig.buildComponentPath( + 'dynamic-content', + 'dynamic-content-form', + name + ); + }; + + return { + controller: [ + '$scope', 'DynamicContentApi', + function ($scope, DynamicContentApi) { + if (!_.isString($scope.schemaSrc)) { + throw new DynamicContentFormError('must be provided a schema url!'); + } + + if (!_.isObject($scope.ngModel)) { + throw new DynamicContentFormError('must be provided an object for ng-model!'); + } + + $scope.template = template('dynamic-content-form-loading.html'); + $scope.schema = {}; + $scope.validityCallback = function (isValid) { + $scope.onValidityChange({ isValid: isValid }); + }; + + DynamicContentApi.retrieveSchema($scope.schemaSrc) + .then(function (response) { + $scope.template = template('dynamic-content-form-loaded.html'); + $scope.schema = response.data; + }) + .catch(function () { + $scope.template = template('dynamic-content-form-error.html'); + $scope.errorMessage = 'Unable to retrieve schema'; + }); + } + ], + require: 'ngModel', + restrict: 'E', + scope: { + schemaSrc: '@', + ngModel: '=', + onValidityChange: '&', + includeOnly: '=' + }, + template: '' + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.dynamicContent', [ + 'bulbs.cms.dynamicContent.form' +]); + +'use strict'; + +angular.module('bulbs.cms.editor.wrapper', [ + 'BettyCropper', + 'bulbs.cms.imageCropModal', + 'bulbs.cms.site.config', + 'jquery', + 'OnionEditor', +]) + .run([ + '$', + function ($) { + // NOTE : this is the old editor-cms-bridge.js + /* + Image + This bridges the embed module that the editor exposes & our custom image implementation. + */ + /* prevents backspace from accidentally triggering a back event */ + $(document).unbind('keydown').bind('keydown', function (event) { + var doPrevent = false; + if (event.keyCode === 8) { + var d = event.srcElement || event.target; + if (['TEXTAREA', 'INPUT'].indexOf(d.tagName.toUpperCase() !== -1)) { + doPrevent = d.readOnly || d.disabled; + } else if (d.isContentEditable) { + //we're in a content editable field + doPrevent = false; + } else { + doPrevent = true; + } + } + if (doPrevent) { + event.preventDefault(); + } + }); + } + ]) + .directive('onionEditor', [ + '$', 'BettyCropper', 'CmsConfig', 'OnionEditor', 'openImageCropModal', + 'Zencoder', + function ($, BettyCropper, CmsConfig, OnionEditor, openImageCropModal, + Zencoder) { + + var safeApply = function (scope, fn) { + if (scope.$$phase || scope.$root.$$phase) { + fn(); + } else { + scope.$apply(function () { + fn(); + }); + } + }; + + return { + controller: [ + '$scope', + function ($scope) { + $scope.editor = null; + + this.getEditor = function () { + return $scope.editor; + }; + } + ], + require: 'ngModel', + replace: true, + restrict: 'E', + templateUrl: CmsConfig.buildComponentPath( + 'editor', + 'editor-wrapper', + 'editor-wrapper.html' + ), + scope: { + ngModel: '=' + }, + link: function (scope, element, attrs, ngModel) { + + if (!ngModel) { + return; + } + + var formatting; + if (attrs.formatting) { + formatting = attrs.formatting.split(','); + } + + var options = {}; + var defaultValue = ''; + + if (attrs.role === 'multiline') { + defaultValue = '


'; + options = { + // global options + multiline: true, + formatting: formatting || ['link', 'bold', 'italic', 'blockquote', 'heading', 'list', 'strike', 'underline'], + placeholder: { + text: attrs.placeholder || '

Write here

', + container: $('.editorPlaceholder', element[0])[0], + }, + link: { + domain: attrs.linkDomain || false, + // Sean, you can figure out a nicer way to handle the search handler. + searchHandler: window[attrs.linkSearchHandler] || false + }, + statsContainer: '.wordcount', + inlineObjects: attrs.inlineObjects || CmsConfig.getInlineObjecsPath(), + image: { + insertDialog: BettyCropper.upload, + editDialog: openImageCropModal, + }, + video: { + insertDialog: Zencoder.onVideoFileUpload, + editDialog: Zencoder.openVideoThumbnailModal, + videoEmbedUrl: CmsConfig.buildVideoUrl() + } + }; + } else { + $('.document-tools, .embed-tools', element).hide(); + defaultValue = ''; + options = { + // global options + multiline: false, + placeholder: { + text: attrs.placeholder || 'Write here', + container: $('.editorPlaceholder', element[0])[0], + }, + formatting: formatting || [] + }; + } + + scope.editor = new OnionEditor($('.editor', element[0])[0], options); + + ngModel.$render = function () { + scope.editor.setContent(ngModel.$viewValue || defaultValue); + // register on change here, after the initial load so angular doesn't get mad... + setTimeout(function () { + scope.editor.setChangeHandler(read); + }); + }; + + // Redefine what empty looks like + ngModel.$isEmpty = function (value) { + return ! value || scope.editor.scribe.allowsBlockElements() && value === defaultValue; + }; + + // Write data to the model + function read() { + safeApply(scope, function () { + var html = scope.editor.getContent(); + if (html === defaultValue) { + html = ''; + } + ngModel.$setViewValue(html); + }); + } + + scope.$watch(ngModel, function () { + scope.editor.setContent(ngModel.$viewValue || defaultValue); + if (window.picturefill) { + window.picturefill(element[0]); + } + }); + } + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.editor', [ + 'bulbs.cms.editor.wrapper' +]); + +'use strict'; + +angular.module('EditorsPick', [ + 'bulbs.cms.site.config', + 'customSearch' +]) + .config(function ($injector, $routeProvider, CmsConfigProvider) { + var CmsConfig = $injector.invoke(CmsConfigProvider.$get); + + $routeProvider + .when('/cms/app/sod/', { + controller: function ($scope, $window) { + + $window.document.title = CmsConfig.getCmsName() + ' | SoD'; + + $scope.$watch('queryData', function () { console.log(arguments); }); + + $scope.queryData = {}; + $scope.updateQueryData = function () { + $scope.queryData = { + groups: [{ + conditions: [{ + field: 'content-type', + type: 'all', + values: [{ + name: 'for display', + value: 'actually-use-this-value-123' + }] + }], + time: '1 day' + }], + included_ids: [1], + excluded_ids: [2], + pinned_ids: [3], + page: 1, + query: 'query balh blah blahb' + }; + }; + + $scope.updateConditionData = function () { + $scope.queryData.groups[0].conditions = [{ + field: 'content-type', + type: 'all', + values: [{ + name: 'ANOTHER THIGN', + value: 'actually-use-this-value-123' + }] + }]; + }; + + }, + templateUrl: CmsConfig.buildComponentPath('editors-pick/editors-pick.html'), + reloadOnSearch: false + }); + }); + +'use strict'; + +angular.module('evergreenField.directive', [ + 'lodash', + 'saveButton.directive' +]) + .directive('evergreenField', [ + 'CmsConfig', + function (CmsConfig) { + return { + restrict: 'E', + scope: { + article: '=' + }, + templateUrl: CmsConfig.buildComponentPath('evergreen-field/evergreen-field.html') + }; + } + ]); + +'use strict'; + +angular.module('evergreenField', [ + 'evergreenField.directive' +]); + +'use strict'; + +angular.module('filterListWidget.directive', [ + 'bulbs.cms.site.config' +]) + .directive('filterListWidget', function (_, $http, $location, $timeout, $, CmsConfig) { + return { + restrict: 'E', + scope: { + filters: '=' + }, + templateUrl: CmsConfig.buildComponentPath('filter-list-widget/filter-list-widget.html'), + link: function (scope, element, attrs) { + var $element = $(element); + var $input = $element.find('input'); + + scope.autocompleteArray = []; + + var filterInputCounter = 0, filterInputTimeout; + + $input.on('input', function (e) { + var search = $input.val(); + scope.searchTerm = search; + + $timeout.cancel(filterInputTimeout); + filterInputTimeout = $timeout(function () { getAutocompletes(search); }, 200); + + if (filterInputCounter > 2) { + getAutocompletes(search); + } + }); + function getAutocompletes(search) { + $timeout.cancel(filterInputTimeout); + filterInputCounter = 0; + if (search.length < 1) { + scope.autocompleteArray = []; + scope.$apply(); + return; + } + + $http({ + url: '/cms/api/v1/things/?type=tag&type=feature_type&type=author', + method: 'GET', + params: {'q': search} + }).success(function (data) { + scope.autocompleteArray = data; + }); + } + + $input.on('keyup', function (e) { + if (e.keyCode === 38) { arrowSelect('up'); }//up + if (e.keyCode === 40) { arrowSelect('down'); } //down + if (e.keyCode === 13) { //enter + if ($element.find('.selected').length > 0) { + // To trigger the click we need to first break out of the + // current $apply() cycle. Hence the $timeout() + $timeout(function () { + angular.element('.selected > a').triggerHandler('click'); + }, 0); + } else { + scope.addFilter('search', $input.val()); + } + } + }); + + scope.search = function () { + scope.addFilter('search', scope.filterInputValue); + }; + + scope.clearSearch = function () { + scope.filterInputValue = ''; + }; + + scope.clearFilters = function () { + scope.filters = {}; + scope.filterInputValue = ''; + return applyFilterChange({}); + }; + + $element.on('mouseover', '.entry', function () { + scope.selectEntry(this); + }); + + function arrowSelect(direction) { + var $entries = $element.find('.entry'); + var $selected = $element.find('.entry.selected'); + var $toSelect; + if ($selected.length > 0) { + if (direction === 'up') { $toSelect = $selected.first().prev(); } + if (direction === 'down') { $toSelect = $selected.first().next(); } + } else { + if (direction === 'up') { $toSelect = $entries.last(); } + if (direction === 'down') { $toSelect = $entries.first(); } + } + scope.selectEntry($toSelect); + } + scope.selectEntry = function (entry) { + $element.find('.selected').removeClass('selected'); + $(entry).addClass('selected'); + }; + + $input.on('blur', function () { + $element.find('.dropdown-menu').fadeOut(200); + }); + $input.on('focus', function () { + $element.find('.dropdown-menu').fadeIn(200); + }); + + scope.addFilter = function (type, newFilterValue) { + var filterObject = $location.search(); + if (type === 'search') { + filterObject.search = newFilterValue; + } else { + if (!filterObject[type]) { + filterObject[type] = []; + } + if (typeof(filterObject[type]) === 'string') { + filterObject[type] = [filterObject[type]]; + } + if (!_.contains(filterObject[type], newFilterValue)) { + // this value is not already in + filterObject[type].push(newFilterValue); + } + } + return applyFilterChange(filterObject); + }; + + scope.deleteFilter = function (key) { + var filterObject = $location.search(); + var toDelete = scope.filters[key]; + if (typeof(filterObject[toDelete.type]) === 'string') { + filterObject[toDelete.type] = [filterObject[toDelete.type]]; + } + var toSplice; + for (var i in filterObject[toDelete.type]) { + if (filterObject[toDelete.type][i] === toDelete.query) { + toSplice = i; + break; + } + } + filterObject[toDelete.type].splice(i, 1); + filterObject.search = $input.val(); + delete scope.filters[key]; + return applyFilterChange(filterObject); + }; + + function applyFilterChange(filterObject) { + filterObject.page = 1; + $location.search(filterObject); + scope.autocompleteArray = []; + $input.trigger('blur'); + } + + function getFilterObjects() { + var search = $location.search(); + scope.filters = {}; + if (typeof(search) === 'undefined') { console.log('undefined'); return; } + //TODO: this sucks + var filterParamsToTypes = {'authors': 'author', 'tags': 'tag', 'feature_types': 'feature_type'}; + for (var filterParam in filterParamsToTypes) { + var filterType = filterParamsToTypes[filterParam]; + if (typeof(search[filterParam]) === 'string') { search[filterParam] = [search[filterParam]]; } + for (var i in search[filterParam]) { + var value = search[filterParam][i]; + scope.filters[filterType + value] = {'query': value, 'type': filterParam}; + getQueryToLabelMappings(filterType, value); + } + } + if (search.search) { + scope.filterInputValue = search.search; + } + } + + scope.$on('$routeUpdate', function () { + getFilterObjects(); + }); + + getFilterObjects(); + + function getQueryToLabelMappings(type, query) { + //this is pretty stupid + //TODO: Maybe do this with some localStorage caching? + //TODO: Maybe just dont do this at all? I dont know if thats possible + // because there is no guarantee of any state (like if a user comes + // directly to a filtered search page via URL) + scope.queryToLabelMappings = scope.queryToLabelMappings || {}; + + if (query in scope.queryToLabelMappings) { return; } + + $http({ + url: '/cms/api/v1/things/?type=' + type, + method: 'GET', + params: {'q': query} + }).success(function (data) { + for (var i in data) { + scope.queryToLabelMappings[data[i].value] = data[i].name; + } + }); + + } + + } + + }; + }); + +'use strict'; + +angular.module('filterListWidget', [ + 'filterListWidget.directive' +]); +'use strict'; + +angular.module('filterWidget.directive', [ + 'contentServices.listService' +]) + .directive('filterWidget', function (_, $http, $location, $timeout, $, + ContentListService, CmsConfig) { + return { + restrict: 'E', + scope: {}, + templateUrl: CmsConfig.buildComponentPath('filter-widget/filter-widget.html'), + link: function (scope, element, attrs) { + var $element = $(element); + var $input = $element.find('input'); + + scope.autocompleteArray = []; + + var filterInputCounter = 0, filterInputTimeout; + + $input.on('input', function (e) { + var search = $input.val(); + scope.searchTerm = search; + + $timeout.cancel(filterInputTimeout); + filterInputTimeout = $timeout(function () { getAutocompletes(search); }, 200); + + if (filterInputCounter > 2) { + getAutocompletes(search); + } + }); + function getAutocompletes(search) { + $timeout.cancel(filterInputTimeout); + filterInputCounter = 0; + if (search.length < 1) { + scope.autocompleteArray = []; + scope.$apply(); + return; + } + + $http({ + url: '/cms/api/v1/things/?type=tag&type=feature_type&type=author', + method: 'GET', + params: {'q': search} + }).success(function (data) { + scope.autocompleteArray = data; + }); + } + + $input.on('keyup', function (e) { + if (e.keyCode === 38) { arrowSelect('up'); }//up + if (e.keyCode === 40) { arrowSelect('down'); } //down + if (e.keyCode === 13) { //enter + if ($element.find('.selected').length > 0) { + // To trigger the click we need to first break out of the + // current $apply() cycle. Hence the $timeout() + $timeout(function () { + angular.element('.selected > a').triggerHandler('click'); + }, 0); + } else { + scope.addFilter('search', $input.val()); + } + } + }); + + scope.search = function () { + scope.addFilter('search', scope.filterInputValue); + }; + + scope.clearSearch = function () { + scope.filterInputValue = ''; + }; + + scope.clearFilters = function () { + scope.filterObjects = {}; + scope.filterInputValue = ''; + return applyFilterChange({}); + }; + + $element.on('mouseover', '.entry', function () { + scope.selectEntry(this); + }); + + function arrowSelect(direction) { + var $entries = $element.find('.entry'); + var $selected = $element.find('.entry.selected'); + var $toSelect; + if ($selected.length > 0) { + if (direction === 'up') { $toSelect = $selected.first().prev(); } + if (direction === 'down') { $toSelect = $selected.first().next(); } + } else { + if (direction === 'up') { $toSelect = $entries.last(); } + if (direction === 'down') { $toSelect = $entries.first(); } + } + scope.selectEntry($toSelect); + } + scope.selectEntry = function (entry) { + $element.find('.selected').removeClass('selected'); + $(entry).addClass('selected'); + }; + + $input.on('blur', function () { + $element.find('.dropdown-menu').fadeOut(200); + }); + $input.on('focus', function () { + $element.find('.dropdown-menu').fadeIn(200); + }); + + scope.addFilter = function (type, newFilterValue) { + var filterObject = $location.search(); + if (type === 'search') { + filterObject.search = newFilterValue; + } else { + if (!filterObject[type]) { + filterObject[type] = []; + } + if (typeof(filterObject[type]) === 'string') { + filterObject[type] = [filterObject[type]]; + } + if (!_.contains(filterObject[type], newFilterValue)) { + // this value is not already in + filterObject[type].push(newFilterValue); + } + } + return applyFilterChange(filterObject); + }; + + scope.deleteFilter = function (key) { + var filterObject = $location.search(); + var toDelete = scope.filterObjects[key]; + if (typeof(filterObject[toDelete.type]) === 'string') { + filterObject[toDelete.type] = [filterObject[toDelete.type]]; + } + var toSplice; + for (var i in filterObject[toDelete.type]) { + if (filterObject[toDelete.type][i] === toDelete.query) { + toSplice = i; + break; + } + } + filterObject[toDelete.type].splice(i, 1); + filterObject.search = $input.val(); + delete scope.filterObjects[key]; + return applyFilterChange(filterObject); + }; + + function applyFilterChange(filterObject) { + filterObject.page = 1; + $location.search(filterObject); + scope.autocompleteArray = []; + $input.trigger('blur'); + + return ContentListService.$updateContent(filterObject); + } + + function getFilterObjects() { + var search = $location.search(); + scope.filterObjects = {}; + if (typeof(search) === 'undefined') { console.log('undefined'); return; } + //TODO: this sucks + var filterParamsToTypes = {'authors': 'author', 'tags': 'tag', 'feature_types': 'feature_type'}; + for (var filterParam in filterParamsToTypes) { + var filterType = filterParamsToTypes[filterParam]; + if (typeof(search[filterParam]) === 'string') { search[filterParam] = [search[filterParam]]; } + for (var i in search[filterParam]) { + var value = search[filterParam][i]; + scope.filterObjects[filterType + value] = {'query': value, 'type': filterParam}; + getQueryToLabelMappings(filterType, value); + } + } + if (search.search) { + scope.filterInputValue = search.search; + } + } + + scope.$on('$routeUpdate', function () { + getFilterObjects(); + }); + + getFilterObjects(); + + function getQueryToLabelMappings(type, query) { + //this is pretty stupid + //TODO: Maybe do this with some localStorage caching? + //TODO: Maybe just dont do this at all? I dont know if thats possible + // because there is no guarantee of any state (like if a user comes + // directly to a filtered search page via URL) + scope.queryToLabelMappings = scope.queryToLabelMappings || {}; + + if (query in scope.queryToLabelMappings) { return; } + + $http({ + url: '/cms/api/v1/things/?type=' + type, + method: 'GET', + params: {'q': query} + }).success(function (data) { + for (var i in data) { + scope.queryToLabelMappings[data[i].value] = data[i].name; + } + }); + + } + + } + + }; + }); + +'use strict'; + +angular.module('filterWidget', [ + 'filterWidget.directive' +]); + +'use strict'; + +angular.module('genericAjaxButton.controller', []) + .controller('GenericAjaxButtonController', function ($scope) { + $scope.STATES = { + DONE: 'done', + PROGRESS: 'in-progress', + ERROR: 'error' + }; + $scope.doClick = function () { + $scope.state = $scope.STATES.PROGRESS; + $scope.clickFunction() + .then(function () { + $scope.state = $scope.STATES.DONE; + }) + .catch(function () { + $scope.state = $scope.STATES.ERROR; + }); + }; + }); + +'use strict'; + +/** + * Highly customizable four state ajax button. Useful for buttons which require + * different displays for disabled/action/progress/complete states. + */ +angular.module('genericAjaxButton.directive', [ + 'bulbs.cms.site.config', + 'genericAjaxButton.controller' +]) + .directive('genericAjaxButton', function (CmsConfig) { + return { + controller: 'GenericAjaxButtonController', + restrict: 'E', + scope: { + disableWhen: '&', + clickFunction: '=', + cssBtnClassComplete: '@', + cssBtnClassError: '@', + cssBtnClassProgress: '@', + cssIconComplete: '@', + textError: '@', + textProgress: '@', + textComplete: '@' + }, + templateUrl: CmsConfig.buildComponentPath('generic-ajax-button/generic-ajax-button.html') + }; + }); + +'use strict'; + +angular.module('genericAjaxButton', [ + 'genericAjaxButton.directive' +]); + +'use strict'; + +angular.module('saveButton.directive', [ + 'bulbs.cms.site.config', + 'genericAjaxButton' +]) + .directive('saveButton', function (CmsConfig) { + return { + controller: 'GenericAjaxButtonController', + link: { + pre: function (scope) { + scope.cssIconComplete = 'glyphicon-floppy-disk'; + scope.textProgress = 'Saving...'; + scope.textComplete = 'Save'; + } + }, + restrict: 'E', + scope: { + disableWhen: '&', + clickFunction: '=', + }, + templateUrl: CmsConfig.buildComponentPath('generic-ajax-button/generic-ajax-button.html') + }; + }); + +'use strict'; + +angular.module('hideFromRssField.directive', [ + 'bulbs.cms.site.config' +]) + .directive('hideFromRssField', [ + 'CmsConfig', + function (CmsConfig) { + return { + restrict: 'E', + scope: { + article: '=' + }, + templateUrl: CmsConfig.buildComponentPath('hide-from-rss-field', 'hide-from-rss-field.html') + }; + } + ]); + +'use strict'; + +angular.module('hideFromRssField', [ + 'hideFromRssField.directive' +]); + +'use strict'; + +angular.module('bulbs.cms.imageCropModal.controller', [ + 'BettyCropper', + 'jquery', + 'ui.bootstrap.modal' +]) + .controller('ImageCropModalCtrl', [ + '$', '$modalInstance', '$scope', '$timeout', 'BettyCropper', 'Selection', + 'imageData', 'ratios', + function ($, $modalInstance, $scope, $timeout, BettyCropper, Selection, + imageData, ratios) { + + $scope.selectedCrop = null; + $scope.cropMode = false; + $scope.ratios = ratios; + $scope.finished = false; + $scope.thumb_container_styles = {}; + $scope.imageData = imageData; + + if (!$scope.image) { + $scope.image = null; + BettyCropper.get(imageData.id) + .then(function (success) { + $scope.image = success.data; + }); + } + + $scope.$watch('image', function (image) { + if (!image) { + return; + } + + var finished = true; + for (var ratio in image.selections) { + if (image.selections[ratio].source === 'auto') { + finished = false; + break; + } + } + $scope.finished = finished; + + $scope.scaleData = image.scaleToFit(550, 400); + + angular.element('.crop-image-container img').one('load', function () { + $(this).Jcrop({ + allowSelect: false, + allowMove: true, + allowResize: true, + keySupport: false + }, function () { + $scope.jcrop_api = this; + }); + }); + + $scope.image_url = image.url('original', 1200, 'jpg'); + if (!$scope.ratios) { + $scope.ratios = Object.keys(image.selections); + } + + $scope.setThumbStyles(); + }); + + $scope.$watch('selectedCrop', function (crop) { + if (!$scope.image) { + return; + } + var finished = true; + for (var ratio in $scope.image.selections) { + if ($scope.image.selections[ratio].source === 'auto' && ratio !== crop) { + finished = false; + break; + } + } + $scope.finished = finished; + }); + + $scope.selectCrop = function (ratio) { + if (!ratio) { + ratio = Object.keys($scope.image.selections)[0]; + for (var key in $scope.image.selections) { + if ($scope.image.selections[key].source === 'auto') { + ratio = key; + break; + } + } + } + var selection = $scope.image.selections[ratio].scaleBy($scope.scaleData.scale); + + if ($scope.jcrop_api) { + $scope.jcrop_api.setOptions({ + aspectRatio: selection.width() / selection.height() + }); + + $scope.jcrop_api.setSelect([ + selection.x0, + selection.y0, + selection.x1, + selection.y1 + ]); + } + + $scope.cropMode = true; + $scope.selectedCrop = ratio; + }; + + $scope.setThumbStyles = function () { + $scope.thumb_styles = $scope.thumb_styles || {}; + + for (var ratio in $scope.image.selections) { + var scaledSelection = $scope.image.selections[ratio].scaleToFit(170, 170); + $scope.thumb_container_styles[ratio] = { + 'padding-top': Math.round((180 - scaledSelection.height()) / 2) + 'px', + 'padding-bottom': '5px', + 'padding-left': Math.round((180 - scaledSelection.width()) / 2) + 'px', + 'padding-right': '5px' + }; + + $scope.thumb_styles[ratio] = $scope.image.getStyles(170, 170, ratio); + } + }; + + $scope.save = function (ratio) { + + var jcrop_selection = $scope.jcrop_api.tellSelect(); + + var newSelection = new Selection({ + x0: jcrop_selection.x, + x1: jcrop_selection.x2, + y0: jcrop_selection.y, + y1: jcrop_selection.y2, + source: 'user' + }); + newSelection = newSelection.scaleBy(1 / $scope.scaleData.scale); + if (newSelection.x1 > $scope.image.width) { + newSelection.x1 = $scope.image.width; + } + if (newSelection.y1 > $scope.image.height) { + newSelection.y1 = $scope.image.height; + } + + return this.image.updateSelection(ratio, newSelection); + }; + + $scope.saveAndQuit = function () { + var ratio = $scope.selectedCrop; + this.save(ratio).then(function (success) { + var ratio = success.data[0]; + var selection = success.data[1]; + $scope.image.selections[ratio] = selection; + }); + $scope.cropMode = false; + $modalInstance.close(imageData); + }; + + $scope.saveAndNext = function () { + var ratio = $scope.selectedCrop; + this.save(ratio).then(function (success) { + var ratio = success.data[0]; + var selection = success.data[1]; + $scope.image.selections[ratio] = selection; + + var nextRatioIndex = ($scope.ratios.indexOf(ratio) + 1) % $scope.ratios.length; + + $scope.selectCrop($scope.ratios[nextRatioIndex]); + }); + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.imageCropModal', [ + 'bulbs.cms.imageCropModal.controller', + 'bulbs.cms.site.config', + 'ui.bootstrap.modal' +]) + .factory('openImageCropModal', [ + '$modal', 'CmsConfig', + function ($modal, CmsConfig) { + + return function (imageData, ratios) { + return $modal.open({ + templateUrl: CmsConfig.buildComponentPath( + 'image-crop-modal', + 'image-crop-modal.html' + ), + controller: 'ImageCropModalCtrl', + resolve: { + imageData: function () { return imageData; }, + ratios: function () { return ratios || false; } + }, + backdrop: 'static' + }).result; + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.liveBlog.api', [ + 'bulbs.cms.site.config', + 'bulbs.cms.utils', + 'lodash', + 'moment' +]) + .service('LiveBlogApi', [ + '_', '$http', 'CmsConfig', 'moment', 'Utils', + function (_, $http, CmsConfig, moment, Utils) { + + var liveBlogEndpoint = CmsConfig.buildApiUrlRoot.bind(null, 'liveblog'); + var liveBlogEntryEndpoint = liveBlogEndpoint.bind(null, 'entry'); + + var parsePayload = function (payload) { + var data = _.cloneDeep(payload); + + if (payload.published) { + data.published = moment.tz(payload.published, CmsConfig.getTimezoneName()); + } + + if (payload.created) { + data.created = moment.tz(payload.created, CmsConfig.getTimezoneName()); + } + + if (payload.updated) { + data.updated = moment.tz(payload.updated, CmsConfig.getTimezoneName()); + } + + return data; + }; + + var cleanData = function (data) { + var payload = _.chain(data) + .omit('published') + .cloneDeep() + .value(); + + if (data.published) { + payload.published = data.published.format(); + } + + if (data.created) { + payload.created = data.created.format(); + } + + if (data.updated) { + payload.updated = data.updated.format(); + } + + return payload; + }; + + return { + createEntry: function (data) { + var payload = cleanData(data); + return $http.post(liveBlogEntryEndpoint('/'), payload) + .then(function (response) { + return parsePayload(response.data); + }); + }, + updateEntry: function (entry) { + var payload = cleanData(entry); + return $http.put(liveBlogEntryEndpoint(payload.id, '/'), payload) + .then(function (response) { + return parsePayload(response.data); + }); + }, + deleteEntry: function (entry) { + return $http.delete(liveBlogEntryEndpoint(entry.id, '/')); + }, + getEntries: function (id) { + var params; + if (id) { + params = Utils.param({ liveblog: id }); + } + + return $http.get(liveBlogEntryEndpoint('/', params)) + .then(function (response) { + return { + results: response.data.results.map(function (result) { + return parsePayload(result); + }) + }; + }); + } + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.liveBlog.entries.authorBridge', [ + 'bulbs.cms.site.config' +]) + .directive('liveBlogEntriesAuthorBridge', [ + '$compile', 'CmsConfig', + function ($compile, CmsConfig) { + + return { + link: function (scope, element) { + var name = CmsConfig.getLiveBlogAuthorSelectorDirectiveName(); + + scope.authors = scope.ngModel; + + if (name) { + var html = angular.element('<' + name + ' ng-model="authors">'); + + element.find('> div').html($compile(html)(scope)); + } + + scope.$watch('authors', function (newValue, oldValue) { + if (!angular.equals(newValue, oldValue)) { + scope.onUpdate({ newValue: newValue }); + scope.ngModel = newValue; + } + }, true); + }, + restrict: 'E', + scope: { + ngModel: '=', + onUpdate: '&' + }, + template: + '
' + + ' ' + + 'No live blog author selector has been configured!' + + '
' + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.liveBlog.entries', [ + 'bulbs.cms.currentUser', + 'bulbs.cms.dateTimeFilter', + 'bulbs.cms.dateTimeModal', + 'bulbs.cms.dateTimeModal', + 'bulbs.cms.liveBlog.api', + 'bulbs.cms.liveBlog.entries.authorBridge', + 'bulbs.cms.site.config', + 'bulbs.cms.utils', + 'confirmationModal', + 'OnionEditor', + 'Raven' +]) + .directive('liveBlogEntries', [ + '$q', 'CmsConfig', 'CurrentUserApi', 'LiveBlogApi', 'Raven', 'Utils', + function ($q, CmsConfig, CurrentUserApi, LiveBlogApi, Raven, Utils) { + return { + link: function (scope) { + var reportError = function (message, data) { + Raven.captureMessage(message, data); + scope.errorMessage = message; + }; + + var titleDisplay = function (entry) { + return entry.headline ? '"' + entry.headline + '"' : 'an entry'; + }; + + scope.clearError = function () { + scope.errorMessage = ''; + }; + + LiveBlogApi.getEntries(scope.article.id) + .then(function (response) { + scope.entries = response.results; + }) + .catch(function (response) { + var message = 'An error occurred retrieving entries!'; + reportError(message, { response: response }); + }); + + var panelOpen = {}; + scope.isPanelOpen = function (entry) { + if (angular.isUndefined(panelOpen[entry.id])) { + panelOpen[entry.id] = true; + } + return panelOpen[entry.id]; + }; + scope.togglePanel = function (entry) { + panelOpen[entry.id] = !panelOpen[entry.id]; + }; + scope.collapseAll = function () { + scope.entries.forEach(function (entry) { + panelOpen[entry.id] = false; + }); + }; + scope.expandAll = function () { + scope.entries.forEach(function (entry) { + panelOpen[entry.id] = true; + }); + }; + + var entryForm = 'entryForm_'; + + scope.wrapperForm = {}; + scope.makeEntryFormName = function (entry) { + return entryForm + entry.id; + }; + scope.getEntryForm = function (entry) { + var name = scope.makeEntryFormName(entry); + + if (scope.wrapperForm[name]) { + return scope.wrapperForm[name]; + } + scope.wrapperForm[name] = {}; + return scope.wrapperForm[name]; + }; + scope.isEntryFormSaveDisabled = function (entry) { + return scope.transactionsLocked() || scope.getEntryForm(entry).$pristine; + }; + + var lock = Utils.buildLock(); + scope.transactionsLocked = lock.isLocked; + + scope.addEntry = lock(function () { + + return CurrentUserApi.getCurrentUserWithCache() + .then(function (user) { + var now = moment(); + + return LiveBlogApi.createEntry({ + liveblog: scope.article.id, + created_by: user, + created: now, + updated_by: user, + updated: now + }) + .then(function (entry) { + scope.entries.unshift(entry); + }) + .catch(function (response) { + var message = 'An error occurred attempting to add an entry!'; + reportError(message, { response: response }); + }); + }); + }); + + scope.saveEntry = lock(function (entry) { + + return CurrentUserApi.getCurrentUserWithCache() + .then(function (user) { + var oldUpdateBy = entry.updated_by; + var oldUpdated = entry.updated; + + entry.updated_by = user; + entry.updated = moment(); + + return LiveBlogApi.updateEntry(entry) + .then(function () { + scope.getEntryForm(entry).$setPristine(); + }) + .catch(function (response) { + entry.updated_by = oldUpdateBy; + entry.updated = oldUpdated; + + var message = 'An error occurred attempting to save ' + titleDisplay(entry) + '!'; + reportError(message, { response: response }); + + return $q.reject(); + }); + }); + }); + + scope.publishAndSave = function (entry, newDate) { + var oldDate = entry.published; + + entry.published = newDate; + + return scope.saveEntry(entry) + .then(function () { + // sort entries from falsy to newest publish date to oldest publish date + scope.entries.sort(function (entry1, entry2) { + var entry1IsMoment = moment.isMoment(entry1.published); + var entry2IsMoment = moment.isMoment(entry2.published); + + if (entry1IsMoment && + (!entry2IsMoment || entry1.published.isBefore(entry2.published))) { + return 1; + } else if (entry2IsMoment && + (!entry1IsMoment || entry2.published.isBefore(entry1.published))) { + return -1; + } + + return 0; + }); + }) + .catch(function () { + entry.published = oldDate; + return false; + }); + }; + + scope.deleteEntry = lock(function (entry) { + + return LiveBlogApi.deleteEntry(entry) + .then(function () { + var index = scope.entries.indexOf(entry); + Utils.removeFrom(scope.entries, index); + }) + .catch(function (response) { + var message = 'An error occurred attempting to delete ' + titleDisplay(entry) + '!'; + reportError(message, { response: response }); + }); + }); + }, + restrict: 'E', + scope: { + article: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'live-blog', + 'live-blog-entries', + 'live-blog-entries.html' + ) + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.liveBlog', [ + 'bulbs.cms.liveBlog.entries' +]); + +'use strict'; + +angular.module('notifications.edit.directive', [ + 'apiServices.notification.factory', + 'BettyCropper', + 'bulbs.cms.site.config', + 'copyButton', + 'customSearch', + 'lodash', + 'saveButton.directive', + 'notifications.settings', + 'topBar' +]) + .directive('notificationsEdit', function (CmsConfig) { + return { + controller: function (_, $location, $q, $scope, NOTIFICATIONS_LIST_REL_PATH, Notification) { + + $scope.LIST_URL = CmsConfig.buildExternalUrl(NOTIFICATIONS_LIST_REL_PATH); + + $scope.needsSave = false; + + var modelId = $scope.getModelId(); + if (modelId === 'new') { + // this is a new notification, build it + $scope.model = Notification.$build(); + $scope.isNew = true; + } else { + // this is an existing notification, find it + $scope.model = Notification.$find($scope.getModelId()); + } + + window.onbeforeunload = function (e) { + if (!_.isEmpty($scope.model.$dirty()) || $scope.isNew || $scope.needsSave) { + // unsaved changes, show confirmation alert + return 'You have unsaved changes.'; + } + }; + + $scope.$on('$destroy', function() { + // ensure even is cleaned up when we leave + delete window.onbeforeunload; + }); + + $scope.saveModel = function () { + var promise; + + if ($scope.model) { + // have model, use save promise as deferred + promise = $scope.model.$save().$asPromise().then(function (data) { + if (modelId === 'new') { + $location.path('/cms/app/notification/edit/' + data.id + '/'); + } + $scope.isNew = false; + $scope.needsSave = false; + }); + } else { + // no model, this is an error, defer and reject + var deferred = $q.defer(); + deferred.reject(); + promise = deferred.promise; + } + + return promise; + }; + }, + restrict: 'E', + scope: { + getModelId: '&modelId' + }, + templateUrl: CmsConfig.buildComponentPath('notifications/notifications-edit/notifications-edit.html') + }; + }); + +'use strict'; + +angular.module('notifications.edit', [ + 'bulbs.cms.site.config', + 'notifications.edit.directive' +]) + .config(function ($routeProvider) { + $routeProvider + .when('/cms/app/notifications/edit/:id/', { + controller: function ($routeParams, $scope, $window, CmsConfig) { + $window.document.title = CmsConfig.getCmsName() + ' | Edit Notification'; + $scope.routeId = $routeParams.id; + }, + template: '', + reloadOnSearch: false + }); + }); + +'use strict'; + +angular.module('notifications.list', [ + 'apiServices.notification.factory', + 'bulbs.cms.site.config', + 'listPage', + 'moment', + 'notifications.settings' +]) + .config(function ($injector, $routeProvider, CmsConfigProvider) { + var CmsConfig = $injector.invoke(CmsConfigProvider.$get); + + $routeProvider + .when('/cms/app/notifications/', { + controller: function ($scope, $window, NOTIFICATIONS_LIST_REL_PATH, Notification) { + $window.document.title = CmsConfig.getCmsName() + ' | Notification'; + $scope.modelFactory = Notification; + $scope.LIST_URL = CmsConfig.buildExternalUrl(NOTIFICATIONS_LIST_REL_PATH); + }, + templateUrl: CmsConfig.buildComponentPath('notifications/notifications-list/notifications-list-page.html') + }); + }); + +'use strict'; + +angular.module('notifications.settings', []) + .value('NOTIFICATIONS_LIST_REL_PATH', '/notification/'); + +'use strict'; + +angular.module('notifications', [ + 'notifications.list', + 'notifications.edit' +]); + +'use strict'; + +angular.module('polls.edit.directive', [ + 'apiServices.answer.factory', + 'apiServices.poll.factory', + 'BettyCropper', + 'bulbs.cms.site.config', + 'lodash', + 'saveButton.directive', + 'topBar' +]).constant('RESPONSE_TYPES', [ + { + name: 'Text Only', + value: 'Text' + }, + { + name: 'Image + Text', + value: 'Image' + } +]) +.directive('pollsEdit', function (CmsConfig) { + return { + templateUrl: CmsConfig.buildComponentPath('polls/polls-edit/polls-edit.html'), + controller: function (_, $http, $location, $q, $routeParams, $scope, $timeout, Answer, Poll) { + // populate model for use + if ($routeParams.id === 'new') { + $scope.model = {}; + $scope.isNew = true; + } else { + Poll.getPoll($routeParams.id) + .then(function successCallback(response) { + $scope.model = response; + $scope.answers = _.cloneDeep(response.answers); + }); + } + + window.onbeforeunload = function (e) { + if(!_.isEmpty($scope.model.$dirty()) || $scope.isNew || $scope.needsSave) { + // show confirmation alert + return 'You have unsaved changes.'; + } + }; + + $scope.$on('$destroy', function () { + // remove alert when we go + delete window.onbeforeunload; + }); + + $scope.embedCode = function () { + return ''; + }; + + $scope.validatePublication = function () { + // The datetime-selection-modal-opener interacts with scope + // in such a way that modal-on-close="validatePublication()" + // fires before the scope model data has changed. + $timeout(function () { + var published = $scope.model.published; + var endDate = $scope.model.end_date; + var publishedField = $scope.pollForm.published; + var endDateField = $scope.pollForm.endDate; + + publishedField.$setValidity( + 'requiredWithEndDate', + !(endDate && !published) + ); + + var comesAfterPublishedValid = true; + if (endDate && published) { + comesAfterPublishedValid = published.isBefore(endDate); + } + endDateField.$setValidity( + 'comesAfterPublished', + comesAfterPublishedValid + ); + }); + }; + + $scope.saveModel = function () { + if ($scope.model) { + + if(!$scope.isNew) { + Answer.updatePollAnswers($scope); + // reset deleted answers + $scope.deletedAnswers = []; + return Poll.updatePoll($scope.model); + + } else { + return Poll.postPoll($scope.model).then(function (data) { + var answerPromise = _.map($scope.answers, function (answer) { + return Answer.postAnswer(answer, data.id); + }); + + return $q.all(answerPromise).then(function () { + $location.path('/cms/app/polls/edit/' + data.id + '/'); + }); + }); + } + } else { + return $q.reject('Save failed'); + } + }; + + $scope.deletedAnswers = []; + var newId = ($scope.answers) ? $scope.answers.length : 0; + + $scope.addAnswer = function () { + $scope.answers.push({id: newId++, notOnSodahead: true}); + }; + + // create 3 blank answer objects if this is a new poll + if($scope.isNew) { + $scope.answers = []; + _.times(3, $scope.addAnswer); + } + + + $scope.removeAnswer = function (answerId) { + var deletedAnswer = _.remove($scope.answers, function (a) { + return a.id === answerId; + }); + if(deletedAnswer[0].notOnSodahead) { return; } + $scope.deletedAnswers.push(deletedAnswer[0]); + }; + }, + restrict: 'E', + scope: { getModelId: '&modelId' }, + }; +}); + +'use strict'; + +angular.module('polls.edit', [ + 'bulbs.cms.site.config', + 'polls.edit.directive' +]) + .config(function ($routeProvider) { + $routeProvider + .when('/cms/app/polls/edit/:id/', { + controller: function ($routeParams, $scope, $window, CmsConfig) { + $window.document.title = CmsConfig.getCmsName() + ' | Edit Poll'; + $scope.routeId = $routeParams.id; + }, + template: '', + reloadOnSearch: false + }); + }); + +'use strict'; + +angular.module('polls.list', [ + 'apiServices.poll.factory', + 'bulbs.cms.site.config', + 'bulbsCmsApp.nonRestmodListPage', + 'moment' +]) + .config(function ($injector, $routeProvider, CmsConfigProvider) { + var CmsConfig = $injector.invoke(CmsConfigProvider.$get); + + $routeProvider + .when('/cms/app/polls/', { + controller: function ($scope, $window, Poll) { + $window.document.title = CmsConfig.getCmsName() + ' | Poll'; + $scope.modelFactory = Poll; + }, + templateUrl: CmsConfig.buildComponentPath('polls/polls-list/polls-list-page.html') + }); + }); + +'use strict'; + +angular.module('polls', [ + 'polls.list', + 'polls.edit' +]); + +'use strict'; + +angular.module('promotedContentArticle.directive', [ + 'bulbs.cms.site.config' +]) + .directive('promotedContentArticle', function (CmsConfig) { + return { + restrict: 'E', + scope: { + article: '=' + }, + templateUrl: CmsConfig.buildComponentPath('promoted-content/promoted-content-article/promoted-content-article.html') + }; + }); + +'use strict'; + +angular.module('promotedContentArticle', [ + 'promotedContentArticle.directive' +]); + +'use strict'; + +angular.module('promotedContentList.directive', [ + 'bulbs.cms.site.config', + 'promotedContentArticle', + 'promotedContentSave', + 'ui.sortable' +]) + .directive('promotedContentList', function ($, CmsConfig) { + return { + controller: function ($scope, PromotedContentService) { + + $scope.pzoneData = PromotedContentService.getData(); + + $scope.moveUp = function (index) { + PromotedContentService.moveContentUp(index); + }; + + $scope.moveDown = function (index) { + PromotedContentService.moveContentDn(index); + }; + + $scope.remove = function (article) { + PromotedContentService.$removeContentFromPZone(article.id); + }; + + $scope.completeAction = function (index) { + PromotedContentService.$completeContentAction(index); + }; + + $scope.stopAction = function () { + PromotedContentService.stopContentAction(); + }; + + $scope.markDirty = function () { + PromotedContentService.markDirtySelectedPZone(); + }; + + $scope.disableControls = function () { + return PromotedContentService.isPZoneRefreshPending(); + }; + }, + link: function (scope, element, attr) { + + scope.sortableOptions = { + beforeStop: function (e, ui) { + ui.helper.css('margin-top', 0); + ui.item.parent().removeClass('ui-sortable-dragging'); + }, + cancel: '.ui-sortable-unsortable', + change: function (e, ui) { + ui.helper.css('margin-top', $(window).scrollTop()); + }, + containment: 'promoted-content-list', + distance: 3, + opacity: 0.75, + placeholder: 'dropzone', + start: function (e, ui) { + ui.item.parent().addClass('ui-sortable-dragging'); + ui.helper.css('margin-top', $(window).scrollTop()); + }, + stop: function () { + scope.markDirty(); + } + }; + }, + restrict: 'E', + scope: {}, + templateUrl: CmsConfig.buildComponentPath('promoted-content/promoted-content-list/promoted-content-list.html') + }; + }); + +'use strict'; + +angular.module('promotedContentList', [ + 'promotedContentList.directive' +]); + +'use strict'; + +angular.module('promotedContentOperationsList.directive', [ + 'bulbs.cms.site.config', + 'promotedContent.service' +]) + .directive('promotedContentOperationsList', function (_, CmsConfig, moment) { + return { + controller: function (moment, $scope, PromotedContentService) { + + $scope.pzoneData = PromotedContentService.getData(); + $scope.scheduleDateFrom = moment(); + $scope.scheduleDateTo = moment().add(3, 'days'); + $scope.deleteStatus = { + message: '', + isError: false + }; + + PromotedContentService.$ready() + .then(function () { + $scope.aggregatedOperations = $scope.pzoneData.operations.concat($scope.pzoneData.unsavedOperations); + }); + + $scope.removeOperation = function (operation) { + PromotedContentService.$removeOperation(operation.id) + .then(function () { + $scope.deleteStatus = { + message: 'Operation successfully removed!', + isError: false + }; + }) + .catch(function (err) { + $scope.deleteStatus = { + message: err, + isError: true + }; + }); + }; + + $scope.clearDeleteStatus = function () { + $scope.deleteStatus.message = ''; + }; + + $scope.setPreviewTime = function (time) { + // set preview time to time plus a minute so that all operations occuring in that + // minute can be previewed + PromotedContentService.setPreviewTime(time.add(1, 'minute')); + }; + + $scope.disableControls = function () { + return PromotedContentService.isPZoneRefreshPending(); + }; + + $scope.operationsStale = function () { + return PromotedContentService.isPZoneOperationsStale(); + }; + + $scope.refreshingOperations = false; + $scope.refreshOperations = function () { + + if (!$scope.refreshingOperations) { + $scope.refreshingOperations = true; + PromotedContentService.$refreshOperations({ + from: $scope.scheduleDateFrom.toISOString(), + to: $scope.scheduleDateTo.toISOString() + }) + .finally(function () { + $scope.refreshingOperations = false; + }); + } + }; + }, + link: function (scope, element, attr) { + + var operationTime = function (operation) { + var compTime; + if (operation.whenAsMoment) { + // has a time, use that + compTime = operation.whenAsMoment; + } else if (scope.pzoneData.previewTime){ + // has no time, but preview time is set, use that + compTime = scope.pzoneData.previewTime; + } else { + // this is an immediate operation + compTime = moment(); + } + return compTime; + }; + + scope.aggregatedOperations = {}; + scope.groupDateFormat = 'M/D/YY @ h:mma'; + var aggregator = function () { + var tempAggregate = scope.pzoneData.operations.concat(scope.pzoneData.unsavedOperations); + + scope.aggregatedOperations = _.chain(tempAggregate) + .sortBy(operationTime) + .groupBy(function (operation) { + return operationTime(operation).format(scope.groupDateFormat); + }) + .pairs() + .map(function (pair) { + return [moment(pair[0], scope.groupDateFormat), pair[1]]; + }) + .sortBy(function (pair) { + return pair[0]; + }) + .value(); + }; + + scope.$watchCollection('pzoneData.operations', aggregator); + scope.$watchCollection('pzoneData.unsavedOperations', aggregator); + + }, + restrict: 'E', + scope: {}, + templateUrl: CmsConfig.buildComponentPath('promoted-content/promoted-content-operations-list/promoted-content-operations-list.html') + }; + }); + +'use strict'; + +angular.module('promotedContentOperationsList', [ + 'promotedContentOperationsList.directive' +]); + +'use strict'; + +angular.module('promotedContentPzoneSelect.directive', [ + 'bulbs.cms.site.config', + 'promotedContent.service' +]) + .directive('promotedContentPzoneSelect', function (CmsConfig) { + return { + controller: function ($scope, PromotedContentService) { + + $scope.pzoneData = PromotedContentService.getData(); + $scope.selectedPZoneName = ''; + + PromotedContentService.$ready() + .then(function () { + $scope.selectedPZoneName = $scope.pzoneData.selectedPZone.name; + }); + + $scope.changePZone = function (name) { + (function (name) { + PromotedContentService.$refreshPZones() + .then(function () { + PromotedContentService.$selectPZone(name); + }); + })(name); + }; + + $scope.disableControls = function () { + return PromotedContentService.isPZoneRefreshPending(); + }; + }, + restrict: 'E', + scope: {}, + templateUrl: CmsConfig.buildComponentPath('promoted-content/promoted-content-pzone-select/promoted-content-pzone-select.html') + }; + }); + +'use strict'; + +angular.module('promotedContentPzoneSelect', [ + 'promotedContentPzoneSelect.directive' +]); + +'use strict'; + +angular.module('promotedContentSave.directive', [ + 'bulbs.cms.site.config', + 'promotedContent.service' +]) + .directive('promotedContentSave', function (CmsConfig) { + return { + controller: function ($scope, PromotedContentService) { + + $scope.pzoneData = PromotedContentService.getData(); + + $scope.savePZone = function () { + PromotedContentService.$saveSelectedPZone(); + }; + + $scope.clearOperations = function () { + // clear any unsaved operations + PromotedContentService.clearUnsavedOperations(); + + // refresh selected pzone + PromotedContentService.$refreshSelectedPZone($scope.pzoneData.previewTime); + }; + + $scope.disableControls = function () { + return PromotedContentService.isPZoneRefreshPending(); + }; + }, + restrict: 'E', + scope: {}, + templateUrl: CmsConfig.buildComponentPath('promoted-content/promoted-content-save/promoted-content-save.html') + }; + }); + +'use strict'; + +angular.module('promotedContentSave', [ + 'promotedContentSave.directive' +]); + +'use strict'; + +angular.module('promotedContentSearch.directive', [ + 'bulbs.cms.site.config', + 'statusFilter', + 'filterWidget', + 'promotedContent.service', + 'promotedContentArticle' +]) + .directive('promotedContentSearch', function (CmsConfig) { + return { + controller: function (_, moment, $scope, $location, PromotedContentService) { + + $scope.pzoneData = PromotedContentService.getData(); + $scope.pageNumber = $location.search().page || '1'; + + $scope.goToPage = function () { + PromotedContentService.$refreshAllContent({page: $scope.pageNumber}, true); + }; + + /** + * Check if an content is enabled. Actions are allowed if preview time is + * set to immediate and the content is already published, or if a preview + * time is set into the future and the content will be published before that. + * In either case, content is only draggable if it is not already listed. + * + * @param {object} content - content to check if enabled. + * @returns {Boolean} true if content is enabled, false otherwise. + */ + $scope.contentIsEnabled = function (content) { + var notAlreadyInList = + ($scope.pzoneData.selectedPZone && + _.isUndefined(_.find($scope.pzoneData.selectedPZone.content, {id: content.id}))); + var immediateDraggable = + ($scope.pzoneData.previewTime === null && + moment().isAfter(content.published)); + var futureDraggable = + ($scope.pzoneData.previewTime !== null && + moment().isBefore($scope.pzoneData.previewTime) && + $scope.pzoneData.previewTime.isAfter(content.published)); + + return notAlreadyInList && (immediateDraggable || futureDraggable); + }; + + $scope.beginInsert = function (article) { + PromotedContentService.beginContentInsert(article); + }; + + $scope.beginReplace = function (article) { + PromotedContentService.beginContentReplace(article); + }; + + $scope.stopAction = function () { + PromotedContentService.stopContentAction(); + }; + + $scope.disableControls = function () { + return PromotedContentService.isPZoneRefreshPending(); + }; + }, + link: function (scope, element, attr) { + + scope.tools = null; + scope.openToolsFor = function (article) { + var doOpen = false; + if (!scope.disableControls()) { + scope.tools = article.id; + doOpen = true; + } + return doOpen; + }; + + scope.closeTools = function () { + scope.tools = null; + return true; + }; + + scope.toolsOpenFor = function (article) { + return scope.tools === article.id; + }; + }, + restrict: 'E', + scope: {}, + templateUrl: CmsConfig.buildComponentPath('promoted-content/promoted-content-search/promoted-content-search.html') + }; + }); + +'use strict'; + +angular.module('promotedContentSearch', [ + 'promotedContentSearch.directive' +]); + +'use strict'; + +/** + * Main service for promoted content page. Handles all data, all data modifications + * for this page should be done through this service. + */ +angular.module('promotedContent.service', [ + 'contentServices', + 'moment', + 'restangular' +]) + .service('PromotedContentService', function ($, _, moment, $q, Restangular, + ContentFactory, ContentListService) { + + var PromotedContentService = this; + PromotedContentService._serviceData = { + allContent: ContentListService.getData(), + actionContent: null, + action: null, + pzones: [], + unsavedOperations: [], + operations: [], + selectedPZone: null, + previewTime: null + }; + var _data = PromotedContentService._serviceData; + + // promise that resolves once this service is done setting up + var setupDefer = $q.defer(); + + var readableOperationTypes = { + INSERT: 'INSERT', + DELETE: 'DELETE', + REPLACE: 'REPLACE' + }; + PromotedContentService.readableOperationTypes = readableOperationTypes; + + var operationTypeToReadable = { + 'promotion_insertoperation': readableOperationTypes.INSERT, + 'promotion_deleteoperation': readableOperationTypes.DELETE, + 'promotion_replaceoperation': readableOperationTypes.REPLACE + }; + var readableToOperationType = + _.reduce(operationTypeToReadable, function (result, val, key) { + result[val] = key; + return result; + }, {}); + + // flag to check if there's a pzone data refresh pending + var pzoneRefreshPending = false; + // flag to check if operations data is stale + var pzoneOperationsStale = true; + + /** + * Getter for refresh pending flag. Use this to check if a pzone is in the + * process of loading its data, to prevent editing. + * + * @returns {Boolean} true if pzone data is refreshing, false otherwise. + */ + PromotedContentService.isPZoneRefreshPending = function () { + return pzoneRefreshPending; + }; + + /** + * Getter for pzone operations stale flag. Use this to check if operations list + * is out of sync and needs to be refreshed before data is accurate. + * + * @returns {Boolean} ture if pzone operations are stale, false otherwise. + */ + PromotedContentService.isPZoneOperationsStale = function () { + return pzoneOperationsStale; + }; + + /** + * Refresh pzone data, given the following parameters: + * + * @param {Object} filters - filter zones with these parameters. + * @returns {Promise} resolves with pzone data, or rejects with an error message. + */ + PromotedContentService.$refreshPZones = function (filters) { + var deferred = $q.defer(); + + // start a new request if one isn't already pending + if (!pzoneRefreshPending) { + pzoneRefreshPending = true; + + return ContentFactory.all('pzone').getList(filters) + .then(function (data) { + _data.pzones = data; + // mark everything as saved + _.each(_data.pzones, function (pzone) { + pzone.saved = true; + }); + + deferred.resolve(); + + // resolve with pzones + return _data.pzones; + }) + .catch(function (err) { + deferred.reject(); + return err; + }) + .finally(function () { + pzoneRefreshPending = false; + }); + } else { + deferred.reject(); + } + + return deferred.promise; + }; + + /** + * Mark selected pzone as dirty. + */ + PromotedContentService.markDirtySelectedPZone = function () { + delete _data.selectedPZone.saved; + }; + + /** + * Mark selected pzone as saved (not dirty). + */ + PromotedContentService.markSavedSelectedPZone = function () { + _data.selectedPZone.saved = true; + }; + + /** + * Make the list of operations stale, meaning the user will have to manually + * refresh it. + */ + PromotedContentService.makeOperationsStale = function () { + _data.operations = []; + pzoneOperationsStale = true; + }; + + /** + * Save the currently selected pzone by posting all operations at currently + * selected time. If no time is selected, pzone will be immediately updated. + * + * @returns {Promise} resolves with selected pzone once saving is done. + */ + PromotedContentService.$saveSelectedPZone = function () { + var defer = $q.defer(); + + if (_data.previewTime && _data.previewTime.isAfter(moment())) { + PromotedContentService.makeOperationsStale(); + + // grab operations out of unsaved operations and post them into operations list + _.each(_data.unsavedOperations, function (operation) { + // use preview time, or send null if immediate + operation.when = _data.previewTime ? _data.previewTime.toISOString() : null; + // remove client side client_id + delete operation.client_id; + }); + + // post all operations as an array + _data.selectedPZone.all('operations').post(_data.unsavedOperations) + .then(function () { + defer.resolve(_data.selectedPZone); + }); + + // clear whatever unsaved operations we have, shouldn't be any in this case + PromotedContentService.clearUnsavedOperations(); + + } else if (!_data.previewTime){ + // clear whatever unsaved operations we have, shouldn't be an in this case + PromotedContentService.clearUnsavedOperations(); + + PromotedContentService.makeOperationsStale(); + + // no preview time is set, post pzone immediately + _data.selectedPZone.put() + .then(function () { + defer.resolve(_data.selectedPZone); + }) + .catch(function (err) { + defer.reject(err); + }); + } else { + // preview time is in the past, error out + defer.reject('Cannot save operations in the past.'); + } + + return defer.promise; + }; + + /** + * Refresh content data using ContentListService. + * + * @param {...object} var_args - arguments taken by [ContentListService.$updateContent]{@link ContentListService#$updateContent}. + * @returns {Promise} resolves based on [ContentListService.$updateContent]{@link ContentListService#$updateContent}. + */ + PromotedContentService.$refreshAllContent = function () { + return ContentListService.$updateContent.apply(ContentListService, arguments); + }; + + /** + * Create a new operation. Note, this will not be saved until user clicks + * save, at which point the new item should be posted to the operations list. + * If preview time is set to immediate, no operation will be created, and this + * function will resolve with nothing. + * + * @param {Object} props - properties of new operation. + * @returns {Promise} resolves with new operation or nothing, or rejects with an error message. + */ + PromotedContentService.$addOperation = function (props) { + var defer = $q.defer(); + + if (!PromotedContentService.isPreviewTimeImmediate()) { + if (!PromotedContentService.isPreviewTimePast()) { + var lastId = _.max(_data.unsavedOperations, 'client_id').client_id; + var nextId = lastId ? lastId + 1 : 0; + var allProps = _.assign({ + client_id: nextId, + type_name: readableToOperationType[props.cleanType] || '', + pzone: _data.selectedPZone.id, + applied: false, + content: null, + content_title: '', + index: null + }, props); + + var operation = Restangular.restangularizeElement( + _data.selectedPZone.all('operations'), allProps + ); + _data.unsavedOperations.push(operation); + + defer.resolve(operation); + } else { + // we are looking at the past, we cannot add new operations + defer.reject('Cannot add operations in the past.'); + } + } else { + // preview time is immediate, don't add an operation + defer.resolve(); + } + + return defer.promise; + }; + + /** + * Remove an operation from operation list. Only saved, future operations are removable. + * + * @param {Number} id - id of operation to remove. + * @returns {Promise} promise that resolves with nothing, or rejects with an + * error message. + */ + PromotedContentService.$removeOperation = function (id) { + var defer = $q.defer(); + + // delete this from the saved operations list + var index = _.findIndex(_data.operations, {id: id}); + var operation = _data.operations[index]; + if (operation) { + if (operation.whenAsMoment.isAfter(moment())) { + operation.remove() + .then(function () { + // remove operation and resolve + _data.operations.splice(index, 1); + defer.resolve(); + }) + .catch(function (err) { + if (err.status === 404) { + defer.reject('Cannot find operation to delete.'); + } else { + defer.reject(err); + } + }); + } else { + defer.reject('Cannot delete an operation in the past.'); + } + } else { + defer.reject('Could not find saved operation with id ' + id + ' to delete.'); + } + + return defer.promise; + }; + + /** + * Clear unsaved operations list. + */ + PromotedContentService.clearUnsavedOperations = function () { + _data.unsavedOperations = []; + PromotedContentService.markSavedSelectedPZone(); + }; + + /** + * Refresh operations data for selected pzone. Each operation returned will + * contain an additional property called cleanType that is the clean, + * displayable representation of the operation type. + * + * GOD DAMN IT RACE CONDITIONS NOTE: To avoid race conditions, only call + * this function as a result of user interaction. + * + * @param {object} params - query parameters to append to request. + * @returns {Promise} resolves with operation data, or rejects with an error message. + */ + PromotedContentService.$refreshOperations = function (params) { + return _data.selectedPZone.getList('operations', params) + .then(function (data) { + + _data.operations = data; + + _.each(_data.operations, function (operation) { + operation.cleanType = operationTypeToReadable[operation.type_name]; + operation.whenAsMoment = moment(operation.when); + }); + + pzoneOperationsStale = false; + + return _data.operations; + }) + .catch(function (err) { + return err; + }); + }; + + /** + * Select a pzone with the given name. Will refresh operations list. + * + * @param {string} [name] - name of pzone to select, selects first pzone if + * name not provided. + * @returns {Promise} resolves based on $refreshSelectedPZone Promise. + */ + PromotedContentService.$selectPZone = function (name) { + // select pzone to edit + _data.selectedPZone = _.find(_data.pzones, {name: name}) || _data.pzones[0]; + + // immediately clear any unsaved operations + PromotedContentService.clearUnsavedOperations(); + + // begin refreshing interface with new pzone data + return PromotedContentService.$refreshSelectedPZone(_data.previewTime); + }; + + /** + * Remove content from currently selected pzone. + * + * @param {Number} contentId - id of content to delete. + * @returns {Promise} resolves if content removed, or rejects with an error message. + */ + PromotedContentService.$removeContentFromPZone = function (contentId) { + var defer = $q.defer(); + var i = _.findIndex(_data.selectedPZone.content, {id: contentId}); + if (i >= 0) { + // found it, splice away + PromotedContentService.$addOperation({ + cleanType: readableOperationTypes.DELETE, + content: contentId, + content_title: _data.selectedPZone.content[i].title + }).then(function () { + PromotedContentService.markDirtySelectedPZone(); + _data.selectedPZone.content.splice(i, 1); + defer.resolve(); + }).catch(function (err) { + defer.reject(err); + }); + } else { + defer.reject('Could not find content with given id to delete.'); + } + return defer.promise; + }; + + /** + * Content moving function. + * + * @param {Number} indexFrom - Index to move content from. + * @param {Number} indexTo - Index to move content to. + * @returns {Boolean} true if content moved, false otherwise. + */ + var moveTo = function (indexFrom, indexTo) { + var ret = false; + var content = _data.selectedPZone.content; + if (indexFrom >= 0 && indexFrom < content.length && + indexTo >= 0 && indexTo < content.length) { + var splicer = content.splice(indexFrom, 1, content[indexTo]); + if (splicer.length > 0) { + content[indexTo] = splicer[0]; + ret = true; + PromotedContentService.markDirtySelectedPZone(); + } + } + return ret; + }; + + /** + * Move content up in the currently selected pzone. + * + * @param {Number} index - index of content to move up. + * @returns {Boolean} true if moved up, false otherwise. + */ + PromotedContentService.moveContentUp = function (index) { + return moveTo(index, index - 1); + }; + + /** + * Move content down in the currently selected pzone. + * + * @param {Number} index - index of content to move down. + * @return {Boolean} true if moved down, false otherwise. + */ + PromotedContentService.moveContentDn = function (index) { + return moveTo(index, index + 1); + }; + + /** + * Begin content insert action. + * + * @param {Object} article - article to be inserted. + */ + PromotedContentService.beginContentInsert = function (article) { + _data.actionContent = article; + _data.action = readableOperationTypes.INSERT; + }; + + /** + * Begin content replace operation. + * + * @param {Object} article - article to be replaced. + */ + PromotedContentService.beginContentReplace = function (article) { + _data.actionContent = article; + _data.action = readableOperationTypes.REPLACE; + }; + + /** + * Stop doing current action. + */ + PromotedContentService.stopContentAction = function () { + _data.actionContent = null; + _data.action = null; + }; + + /** + * Complete insert or replace operation. + * + * @param {Number} index - index where operation will occur. + * @returns {Promise} resolves with nothing or rejects with an error message. + */ + PromotedContentService.$completeContentAction = function (index) { + var deferred = $q.defer(); + + if (_data.action) { + PromotedContentService.$addOperation({ + cleanType: _data.action, + content: _data.actionContent.id, + content_title: _data.actionContent.title, + index: index + }) + .then(function () { + // find index of duplicate if there is one + var duplicateIndex = _.findIndex(_data.selectedPZone.content, {id: _data.actionContent.id}); + + // ensure that duplicate is deleted + if (index !== duplicateIndex && duplicateIndex >= 0) { + _data.selectedPZone.content.splice(duplicateIndex, 1); + } + + // add item to pzone + var replace = _data.action === readableOperationTypes.REPLACE; + _data.selectedPZone.content.splice(index, (replace ? 1 : 0), _data.actionContent); + + // stop action + PromotedContentService.stopContentAction(); + + // ensure pzone is marked dirty + PromotedContentService.markDirtySelectedPZone(); + + deferred.resolve(); + }) + .catch(deferred.reject); + } else { + deferred.reject('No action to complete in progress.'); + } + + return deferred.promise; + }; + + /** + * Set preview time to some moment. Applying this operation will cause the + * unsaved operations list to clear out. + * + * @param {moment} time - moment to set _data.preview time as. + */ + PromotedContentService.setPreviewTime = function (time) { + // set time to edit + _data.previewTime = time; + + // clear all unsaved operations + PromotedContentService.clearUnsavedOperations(); + + // begin requesting pzone to edit + return PromotedContentService.$refreshSelectedPZone(_data.previewTime); + }; + + /** + * Set preview time to now, effectively causing all operations to be + * immediately applied when saved. + */ + PromotedContentService.setPreviewTimeToImmediate = function () { + PromotedContentService.setPreviewTime(null); + }; + + /** + * Check if preview time is set to immediate. + * + * @returns true if preview time is immediate, false otherwise. + */ + PromotedContentService.isPreviewTimeImmediate = function () { + return _data.previewTime === null; + }; + + /** + * Check if set preview time is in the past. + * + * @returns true if preview time is in the past, false otherwise. + */ + PromotedContentService.isPreviewTimePast = function () { + return !PromotedContentService.isPreviewTimeImmediate() && + _data.previewTime.isBefore(moment()); + }; + + /** + * Refresh the currently selected pzone. Prevents new requests until the + * current one has resolved. + * + * @param {moment} [time] - optional time parameter to pass to get a preview. + * @returns {Promise} resolves with selected pzone data or reject with an error. + */ + PromotedContentService.$refreshSelectedPZone = function (time) { + var params = {}; + if (time) { + params.preview = time.toISOString(); + } + + PromotedContentService.makeOperationsStale(); + + var deferred = $q.defer(); + + // start a new request if one isn't already pending + if (!pzoneRefreshPending) { + pzoneRefreshPending = true; + _data.selectedPZone.get(params) + .then(function (data) { + deferred.resolve(); + _data.selectedPZone = data; + return _data.selectedPZone; + }) + .catch(function (err) { + deferred.reject(); + return err; + }) + .finally(function () { + PromotedContentService.markSavedSelectedPZone(); + pzoneRefreshPending = false; + }); + } else { + deferred.reject(); + } + + return deferred.promise; + }; + + /** + * Get the service's data. This function MUST be used to retrieve service + * data, accessing service data via the _serviceData variable could + * potentially destroy some two-way databinding magic. + * + * @returns {Object} service data. + */ + PromotedContentService.getData = function () { + return _data; + }; + + /** + * @returns {Promise} resolves when service is ready. + */ + PromotedContentService.$ready = function () { + return setupDefer.promise; + }; + + // setup initial datas + PromotedContentService.$refreshPZones() + .then(function () { + return PromotedContentService.$refreshAllContent(); + }) + .then(function () { + return PromotedContentService.$selectPZone(); + }) + .then(function () { + // service is ready to go + setupDefer.resolve(); + }); + + }); + +'use strict'; + +angular.module('promotedContentTimePicker.directive', [ + 'bulbs.cms.site.config', + 'promotedContent.service' +]) + .directive('promotedContentTimePicker', function (CmsConfig) { + return { + controller: function (moment, $scope, PromotedContentService) { + + $scope.contentData = PromotedContentService.getData(); + + $scope.setPreviewTime = function (previewTime) { + PromotedContentService.setPreviewTime(previewTime); + }; + + $scope.setPreviewTimeToImmediate = function () { + $scope.previewTime = null; + PromotedContentService.setPreviewTimeToImmediate(); + }; + + $scope.disableControls = function () { + return PromotedContentService.isPZoneRefreshPending(); + }; + }, + restrict: 'E', + scope: {}, + templateUrl: CmsConfig.buildComponentPath('promoted-content/promoted-content-time-picker/promoted-content-time-picker.html') + }; + }); + +'use strict'; + +angular.module('promotedContentTimePicker', [ + 'promotedContentTimePicker.directive' +]); + +'use strict'; + +angular.module('promotedContent', [ + 'bulbs.cms.site.config', + 'promotedContentPzoneSelect', + 'promotedContentList', + 'promotedContentSearch', + 'promotedContentTimePicker', + 'promotedContentOperationsList', +]) + .config(function ($injector, $routeProvider, CmsConfigProvider) { + var CmsConfig = $injector.invoke(CmsConfigProvider.$get); + + $routeProvider + .when('/cms/app/promotion/', { + controller: [ + '$window', 'CmsConfig', + function ($window) { + $window.document.title = CmsConfig.getCmsName() + ' | Promotion Tool'; + } + ], + templateUrl: CmsConfig.buildComponentPath('promoted-content/promoted-content.html'), + reloadOnSearch: false + }); + }); + +'use strict'; + +angular.module('lineItems.edit.directive', [ + 'apiServices.lineItem.factory', + 'bulbs.cms.site.config', + 'lodash', + 'saveButton.directive', + 'topBar' +]) + .directive('lineItemsEdit', function (CmsConfig) { + return { + controller: function (_, $location, $q, $routeParams, $scope, LineItem) { + if ($routeParams.id === 'new') { + $scope.model = LineItem.$build(); + $scope.isNew = true; + } else { + $scope.model = LineItem.$find($routeParams.id); + } + + window.onbeforeunload = function (e) { + if (!_.isEmpty($scope.model.$dirty()) || $scope.isNew || $scope.needsSave) { + return 'You have unsaved changes.'; + } + }; + + $scope.$on('$destroy', function() { + delete window.onbeforeunload; + }); + + $scope.saveModel = function () { + var promise; + + if ($scope.model) { + promise = $scope.model.$save().$asPromise().then(function (data) { + $location.path('/cms/app/line-items/edit/' + data.id + '/'); + }); + } else { + var deferred = $q.defer(); + deferred.reject(); + promise = deferred.promise; + } + + return promise; + }; + }, + restrict: 'E', + scope: { + getModelId: '&modelId' + }, + templateUrl: CmsConfig.buildComponentPath('reporting/reporting-line-items-edit/reporting-line-items-edit.html') + }; + }); + +'use strict'; + +angular.module('lineItems.edit', [ + 'bulbs.cms.site.config', + 'lineItems.edit.directive' +]) + .config(function ($routeProvider) { + $routeProvider + .when('/cms/app/line-items/edit/:id/', { + controller: function ($routeParams, $scope, $window, CmsConfig) { + $window.document.title = CmsConfig.getCmsName() + ' | Edit Line Item'; + $scope.routeId = $routeParams.id; + }, + template: '', + reloadOnSearch: false + }); + }); + +'use strict'; + +angular.module('lineItems.list', [ + 'apiServices.lineItem.factory', + 'bulbs.cms.site.config', + 'listPage' + ]) + .config(function ($injector, $routeProvider, CmsConfigProvider) { + var CmsConfig = $injector.invoke(CmsConfigProvider.$get); + + $routeProvider + .when('/cms/app/line-items/', { + controller: function($modal, $scope, $window, LineItem) { + $window.document.title = CmsConfig.getCmsName() + ' | Line Items'; + + $scope.modelFactory = LineItem; + + $scope.LineItemExportModal = function () { + return $modal.open({ + templateUrl: '/views/modals/line-item-export-modal.html', + controller: 'LineitemexportmodalCtrl', + }); + }; + + $scope.utilityButtons = [{ + title: 'Export CSV', + click: function () { + $scope.LineItemExportModal(); + }, + buttonClasses: 'add-item btn btn-primary', + iconClasses: 'font-awesome' + }]; + }, + + templateUrl: CmsConfig.buildComponentPath('reporting/reporting-line-items-list/reporting-line-items-list.html') + }); + }); + +'use strict'; + +angular.module('rateOverrides.edit.directive', [ + 'apiServices.rateOverride.factory', + 'apiServices.featureType.factory', + 'bulbs.cms.site.config', + 'lodash', + 'saveButton.directive', + 'topBar' +]) + .directive('rateOverridesEdit', function (CmsConfig) { + return { + controller: function (_, $location, $http, $q, $routeParams, $scope, ContentFactory, FeatureType, RateOverride, Raven) { + var resourceUrl = '/cms/api/v1/contributions/role/'; + + if ($routeParams.id === 'new') { + $scope.model = RateOverride.$build(); + $scope.isNew = true; + } else { + $scope.model = RateOverride.$find($routeParams.id); + $scope.model.$promise.then(function () { + if (($scope.model.hasOwnProperty('role')) && ($scope.model.role !== null)){ + $scope.model.role = $scope.model.role.id; + } + }); + } + + window.onbeforeunload = function (e) { + if (!_.isEmpty($scope.model.$dirty()) || $scope.isNew || $scope.needsSave) { + return 'You have unsaved changes.'; + } + }; + + $scope.$on('$destroy', function() { + delete window.onbeforeunload; + }); + + $scope.getPaymentType = function (roleId) { + if ($scope.hasOwnProperty('roles')) { + for (var i = 0; i < $scope.roles.length; i++) { + if ($scope.roles[i].id === roleId) { + return $scope.roles[i].payment_type; + } + } + return null; + } + }; + + $scope.isFeatureRated = function () { + if ($scope.getPaymentType($scope.model.role) === 'FeatureType'){ + return true; + } + return false; + }; + + $scope.isHourlyRated = function () { + if ($scope.getPaymentType($scope.model.role) === 'Hourly'){ + return true; + } + return false; + }; + + $scope.isFlatRated = function () { + if ($scope.getPaymentType($scope.model.role) === 'Flat Rate'){ + return true; + } + return false; + }; + + $scope.addFeatureType = function () { + if (!$scope.model.hasOwnProperty('featureTypes')) { + $scope.model.featureTypes = []; + } + + $scope.model.featureTypes.push({ + featureType: null, + rate: 0, + }); + }; + + $scope.getFeatureTypes = function () { + $http({ + method: 'GET', + url: resourceUrl + }).success(function (data) { + $scope.featureTypes = data.results || data; + }).error(function (data, status, headers, config) { + Raven.captureMessage('Error fetching FeatureTypes', {extra: data}); + }); + }; + + $scope.getRoles = function () { + $http({ + method: 'GET', + url: resourceUrl + }).success(function (data) { + $scope.roles = data.results || data; + }).error(function (data, status, headers, config) { + Raven.captureMessage('Error fetching Roles', {extra: data}); + }); + }; + + $scope.searchFeatureTypes = function (searchTerm) { + return FeatureType.simpleSearch(searchTerm); + }; + + $scope.saveModel = function () { + var promise; + + if ($scope.model) { + promise = $scope.model.$save().$asPromise().then(function (data) { + $location.path('/cms/app/rate-overrides/edit/' + data.id + '/'); + if (($scope.model.hasOwnProperty('role')) && ($scope.model.role !== null)){ + $scope.model.role = $scope.model.role.id; + } + }); + } else { + var deferred = $q.defer(); + deferred.reject(); + promise = deferred.promise; + } + + return promise; + }; + + $scope.getRoles(); + $scope.getFeatureTypes(); + }, + restrict: 'E', + scope: { + getModelId: '&modelId' + }, + templateUrl: CmsConfig.buildComponentPath('reporting/reporting-rate-overrides-edit/reporting-rate-overrides-edit.html') + }; + }); + +'use strict'; + +angular.module('rateOverrides.edit', [ + 'bulbs.cms.site.config', + 'rateOverrides.edit.directive' +]) + .config(function ($routeProvider) { + $routeProvider + .when('/cms/app/rate-overrides/edit/:id/', { + controller: function ($routeParams, $scope, $window, CmsConfig) { + $window.document.title = CmsConfig.getCmsName() + ' | Edit Rate Override'; + $scope.routeId = $routeParams.id; + }, + template: '', + reloadOnSearch: false + }); + }); + +'use strict'; + +angular.module('rateOverrides.list', [ + 'apiServices.rateOverride.factory', + 'bulbs.cms.site.config', + 'listPage' + ]) + .config(function ($injector, $routeProvider, CmsConfigProvider) { + var CmsConfig = $injector.invoke(CmsConfigProvider.$get); + + $routeProvider + .when('/cms/app/rate-overrides/', { + controller: function($scope, $window, RateOverride) { + $window.document.title = CmsConfig.getCmsName() + ' | Rate Overrides'; + $scope.modelFactory = RateOverride; + }, + + templateUrl: CmsConfig.buildComponentPath('reporting/reporting-rate-overrides-list/reporting-rate-overrides-list.html') + }); + }); + +'use strict'; + +angular.module('roles.edit.directive', [ + 'apiServices.reporting.factory', + 'bulbs.cms.site.config', + 'lodash', + 'saveButton.directive', + 'topBar' +]) + .constant('PAYMENT_TYPES', [ + { + name: 'Flat Rate', + value: 'Flat Rate' + }, + { + name: 'FeatureType', + value: 'FeatureType' + }, + { + name: 'Hourly', + value: 'Hourly' + }, + { + name: 'Manual', + value: 'Manual' + } + ]) + .directive('rolesEdit', function (CmsConfig) { + return { + controller: function (_, $location, $q, $routeParams, $scope, Role, PAYMENT_TYPES) { + + $scope.page = 'contributions'; + $scope.PAYMENT_TYPES = PAYMENT_TYPES; + + if ($routeParams.id === 'new') { + $scope.model = Role.$build(); + $scope.isNew = true; + } else { + $scope.model = Role.$find($routeParams.id).$then(function () { + $scope.model.feature_type_rates.$fetch(); + $scope.model.flat_rates.$fetch(); + $scope.model.hourly_rates.$fetch(); + }); + } + + window.onbeforeunload = function (e) { + if (!_.isEmpty($scope.model.$dirty()) || $scope.isNew || $scope.needsSave) { + return 'You have unsaved changes.'; + } + }; + + $scope.$on('$destroy', function() { + delete window.onbeforeunload; + }); + + $scope.rateEditable = function () { + var paymentTypes = PAYMENT_TYPES.slice(0, 3); + if (paymentTypes.indexOf($scope.model.paymentType >= 0)) { + return true; + } + + return false; + }; + + $scope.getDirtyRates = function () { + var dirty = []; + // // Validate if flat_rate is dirty + if ($scope.model.hasOwnProperty('flat_rate') && !_.isEmpty($scope.model.flat_rate.$dirty())) { + dirty.push($scope.model.flat_rate); + } + + // Validate if hourly_rate is dirty + if ($scope.model.hasOwnProperty('hourly_rate') && !_.isEmpty($scope.model.hourly_rate.$dirty())) { + dirty.push($scope.model.hourly_rate); + } + + // Validate if feature_type_rates are dirty + $scope.model.feature_type_rates.forEach(function (rate) { + if (!_.isEmpty(rate.$dirty())) { + dirty.push(rate); + } + }); + + return dirty; + }; + + $scope.saveDirtyRates = function () { + var dirtyRates = $scope.getDirtyRates(); + dirtyRates.forEach(function (rate) { + rate.$save(); + }); + }; + + $scope.saveModel = function () { + var promise; + $scope.saveDirtyRates(); + if ($scope.model) { + promise = $scope.model.$save().$asPromise().then(function (data) { + $location.path('/cms/app/roles/edit/' + data.id + '/'); + }); + } else { + var deferred = $q.defer(); + deferred.reject(); + promise = deferred.promise; + } + return promise; + }; + }, + restrict: 'E', + scope: { + getModelId: '&modelId' + }, + templateUrl: CmsConfig.buildComponentPath('reporting/reporting-roles-edit/reporting-roles-edit.html') + }; + }); + +'use strict'; + +angular.module('roles.edit', [ + 'bulbs.cms.site.config', + 'roles.edit.directive' +]) + .config(function ($routeProvider) { + $routeProvider + .when('/cms/app/roles/edit/:id/', { + controller: function ($routeParams, $scope, $window, CmsConfig) { + $window.document.title = CmsConfig.getCmsName() + ' | Edit Role'; + $scope.routeId = $routeParams.id; + }, + template: '', + reloadOnSearch: false + }); + }); + +'use strict'; + +angular.module('roles.list', [ + 'apiServices.reporting.factory', + 'bulbs.cms.site.config', + 'listPage' + ]) + .config(function ($injector, $routeProvider, CmsConfigProvider) { + var CmsConfig = $injector.invoke(CmsConfigProvider.$get); + + $routeProvider + .when('/cms/app/roles/', { + controller: function($scope, $window, Role) { + $window.document.title = CmsConfig.getCmsName() + ' | Roles'; + $scope.modelFactory = Role; + }, + templateUrl: CmsConfig.buildComponentPath('reporting/reporting-roles-list/reporting-roles-list.html') + }); + }); + +'use strict'; + +angular.module('reports', [ + 'lineItems.edit', + 'lineItems.list', + 'rateOverrides.edit', + 'rateOverrides.list', + 'roles.edit', + 'roles.list' +]); + +'use strict'; + +angular.module('sections.edit.directive', [ + 'apiServices.section.factory', + 'BettyCropper', + 'bulbs.cms.site.config', + 'copyButton', + 'customSearch', + 'lodash', + 'saveButton.directive', + 'sections.settings', + 'topBar' +]) + .directive('sectionsEdit', function (CmsConfig) { + return { + controller: function (_, $location, $q, $scope, SECTIONS_LIST_REL_PATH, Section) { + + $scope.LIST_URL = CmsConfig.buildExternalUrl(SECTIONS_LIST_REL_PATH); + + $scope.needsSave = false; + + var modelId = $scope.getModelId(); + if (modelId === 'new') { + // this is a new section, build it + $scope.model = Section.$build(); + $scope.isNew = true; + } else { + // this is an existing special coverage, find it + $scope.model = Section.$find($scope.getModelId()); + } + + window.onbeforeunload = function (e) { + if (!_.isEmpty($scope.model.$dirty()) || $scope.isNew || $scope.needsSave) { + // unsaved changes, show confirmation alert + return 'You have unsaved changes.'; + } + }; + + $scope.$on('$destroy', function() { + // ensure even is cleaned up when we leave + delete window.onbeforeunload; + }); + + $scope.saveModel = function () { + var promise; + + if ($scope.model) { + // have model, use save promise as deferred + promise = $scope.model.$save().$asPromise().then(function (data) { + if (modelId === 'new') { + $location.path('/cms/app/section/edit/' + data.id + '/'); + } + $scope.isNew = false; + $scope.needsSave = false; + }); + } else { + // no model, this is an error, defer and reject + var deferred = $q.defer(); + deferred.reject(); + promise = deferred.promise; + } + + return promise; + }; + }, + restrict: 'E', + scope: { + getModelId: '&modelId' + }, + templateUrl: CmsConfig.buildComponentPath('sections/sections-edit/sections-edit.html') + }; + }); + +'use strict'; + +angular.module('sections.edit', [ + 'bulbs.cms.site.config', + 'sections.edit.directive' +]) + .config(function ($routeProvider) { + $routeProvider + .when('/cms/app/section/edit/:id/', { + controller: function ($routeParams, $scope, $window, CmsConfig) { + $window.document.title = CmsConfig.getCmsName() + ' | Edit Section'; + $scope.routeId = $routeParams.id; + }, + template: '', + reloadOnSearch: false + }); + }); + +'use strict'; + +angular.module('sections.list', [ + 'apiServices.section.factory', + 'bulbs.cms.site.config', + 'listPage', + 'sections.settings' +]) + .config(function ($injector, $routeProvider, CmsConfigProvider) { + var CmsConfig = $injector.invoke(CmsConfigProvider.$get); + + $routeProvider + .when('/cms/app/section/', { + controller: function ($scope, $window, SECTIONS_LIST_REL_PATH, Section) { + $window.document.title = CmsConfig.getCmsName() + ' | Section'; + $scope.modelFactory = Section; + $scope.LIST_URL = CmsConfig.buildExternalUrl(SECTIONS_LIST_REL_PATH); + }, + templateUrl: CmsConfig.buildComponentPath('sections/sections-list/sections-list-page.html') + }); + }); + +'use strict'; + +angular.module('sections.settings', []) + .value('SECTIONS_LIST_REL_PATH', '/section/'); + +'use strict'; + +angular.module('sections', [ + 'sections.list', + 'sections.edit' +]); + +'use strict'; + +angular.module('bulbs.cms.sendToEditorModal.api', [ + 'bulbs.cms.dateTimeFilter', + 'bulbs.cms.site.config', + 'bulbs.cms.utils', + 'lodash', +]) + .service('SendToEditorApi', [ + '_', '$http', 'CmsConfig', 'dateTimeFormatFilter', 'moment', 'Utils', + function (_, $http, CmsConfig, dateTimeFormatFilter, moment, Utils) { + + var endpoint = function (article) { + return CmsConfig.buildApiUrlRoot('content', article.id, 'send/'); + }; + + var parsePayload = function (payload) { + var data = _.cloneDeep(payload.data); + return data; + }; + + return { + sendToEditor: function (article, status, notes) { + return $http.post( + endpoint(article), { + status: status, + notes: notes + } + ).then(function (response) { + return parsePayload(response); + }); + } + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.sendToEditorModal', [ + 'bulbs.cms.sendToEditorModal.api', + 'bulbs.cms.site.config', + 'Raven', + 'ui.bootstrap', + 'ui.bootstrap.modal' +]) + .directive('sendToEditorModalOpener', [ + '$modal', '$q', 'CmsConfig', 'SendToEditorApi', 'Raven', + function ($modal, $q, CmsConfig, SendToEditorApi, Raven) { + return { + restrict: 'A', + scope: { + modalArticle: '=', + modalOnBeforeOpen: '&', + modalOnCancel: '&', + modalOnOk: '&' + }, + link: function (scope, element) { + + scope.statuses = CmsConfig.getArticleEditoralStatuses(); + scope.modalInstance = false; + + var setupAndOpenModal = function () { + scope.clearError = function () { + scope.errorMessage = ''; + }; + + scope.sendToEditor = function (status, note) { + scope.clearError(); + + return SendToEditorApi.sendToEditor( + scope.modalArticle, + status, + 'Status: ' + status + '\n\n' + note + ) + .then(scope.modalInstance.close) + .catch(function (response) { + Raven.captureMessage('Error attempting to send to editor', { + response: response + }); + scope.errorMessage = 'An error occurred!'; + }); + }; + + scope.modalInstance = $modal + .open({ + scope: scope, + templateUrl: CmsConfig.buildComponentPath( + 'send-to-editor-modal', + 'send-to-editor-modal.html' + ) + }); + + scope.modalInstance.result + .then(scope.modalOnOk) + .catch(scope.modalOnCancel) + .finally(function () { + scope.modalInstance = false; + }); + }; + + element.addClass('send-to-editor-modal-opener'); + element.on('click', function () { + + if (!scope.modalInstance) { + + $q.when(scope.modalOnBeforeOpen()) + .then(function (result) { + + if (result !== false) { + setupAndOpenModal(); + } + }); + } + }); + } + }; + } + ]); + +'use strict'; + +angular.module('specialCoverage.edit.directive', [ + 'apiServices.campaign.factory', + 'apiServices.specialCoverage.factory', + 'bulbs.cms.site.config', + 'campaignAutocomplete', + 'copyButton', + 'customSearch', + 'lodash', + 'specialCoverage.settings', + 'topBar', + 'ui.bootstrap.tooltip', + 'videoList', + 'bulbs.cms.superFeatures.tab', +]) + .directive('specialCoverageEdit', function (CmsConfig) { + return { + controller: function (_, $location, $q, $scope, $modal, Campaign, + SPECIAL_COVERAGE_LIST_REL_PATH, SpecialCoverage) { + + $scope.ACTIVE_STATES = SpecialCoverage.ACTIVE_STATES; + $scope.LIST_URL = CmsConfig.buildExternalUrl(SPECIAL_COVERAGE_LIST_REL_PATH); + + $scope.needsSave = false; + + $scope.tunicCampaignIdMapping = {}; + + var modelId = $scope.getModelId(); + if (modelId === 'new') { + // this is a new special coverage, build it + $scope.model = SpecialCoverage.$build(); + $scope.isNew = true; + } else { + // this is an existing special coverage, find it + $scope.model = SpecialCoverage.$find($scope.getModelId()).$then(function () { + $scope.model.$loadTunicCampaign().then(function (campaign) { + $scope.tunicCampaignIdMapping[campaign.id] = campaign; + }); + }); + } + + + window.onbeforeunload = function (e) { + if (!_.isEmpty($scope.model.$dirty()) || $scope.isNew || $scope.needsSave) { + // unsaved changes, show confirmation alert + return 'You have unsaved changes.'; + } + }; + + $scope.$on('$destroy', function() { + // ensure even is cleaned up when we leave + delete window.onbeforeunload; + }); + + $scope.saveModel = function () { + var promise; + + if ($scope.model) { + // have model, use save promise as deferred + promise = $scope.model.$save().$asPromise().then(function (data) { + if (modelId === 'new') { + $location.path('/cms/app/special-coverage/edit/' + data.id + '/'); + } + $scope.isNew = false; + $scope.needsSave = false; + }); + } else { + // no model, this is an error, defer and reject + var deferred = $q.defer(); + deferred.reject(); + promise = deferred.promise; + } + + return promise; + }; + + $scope.previewLinkModal = function () { + return $modal.open({ + templateUrl: '/views/modals/preview-link-modal.html', + scope: $scope, + resolve: {} + }); + }; + + $scope.tunicCampaignFormatter = function (campaignId) { + if (campaignId in $scope.tunicCampaignIdMapping) { + var campaign = $scope.tunicCampaignIdMapping[campaignId]; + return campaign.name + ' - ' + campaign.number; + } + }; + + $scope.searchCampaigns = function (searchTerm) { + return $scope.model.$searchCampaigns({search: searchTerm}).then(function (campaigns) { + campaigns.forEach(function (campaign) { + $scope.tunicCampaignIdMapping[campaign.id] = campaign; + }); + // Formatter expects list of IDs + return campaigns.map(function (campaign) { return campaign.id; }); + }); + }; + }, + restrict: 'E', + scope: { + getModelId: '&modelId' + }, + templateUrl: CmsConfig.buildComponentPath('special-coverage/special-coverage-edit/special-coverage-edit.html') + }; + }); + +'use strict'; + +angular.module('specialCoverage.edit', [ + 'bulbs.cms.site.config', + 'specialCoverage.edit.directive' +]) + .config(function ($routeProvider) { + $routeProvider + .when('/cms/app/special-coverage/edit/:id/', { + controller: function ($routeParams, $scope, $window, CmsConfig) { + $window.document.title = CmsConfig.getCmsName() + ' | Edit Special Coverage'; + $scope.routeId = $routeParams.id; + }, + template: '' + }); + }); + +'use strict'; + +angular.module('specialCoverage.list', [ + 'apiServices.specialCoverage.factory', + 'bulbs.cms.site.config', + 'listPage', + 'moment', + 'specialCoverage.settings' +]) + .config(function ($injector, $routeProvider, CmsConfigProvider) { + var CmsConfig = $injector.invoke(CmsConfigProvider.$get); + + $routeProvider + .when('/cms/app/special-coverage/', { + controller: function ($scope, $window, CmsConfig, + SPECIAL_COVERAGE_LIST_REL_PATH, SpecialCoverage) { + $window.document.title = CmsConfig.getCmsName() + ' | Special Coverage'; + $scope.modelFactory = SpecialCoverage; + $scope.LIST_URL = CmsConfig.buildExternalUrl(SPECIAL_COVERAGE_LIST_REL_PATH); + }, + templateUrl: CmsConfig.buildComponentPath('special-coverage/special-coverage-list/special-coverage-list-page.html') + }); + }); + +'use strict'; + +angular.module('specialCoverage.settings', []) + .value('SPECIAL_COVERAGE_LIST_REL_PATH', '/special/'); + +'use strict'; + +angular.module('specialCoverage', [ + 'specialCoverage.list', + 'specialCoverage.edit' +]); + +'use strict'; + +angular.module('bulbs.cms.staticImage', [ + 'bulbs.cms.site.config' +]) + .directive('staticImage', [ + 'CmsConfig', + function (CmsConfig) { + return { + templateUrl: CmsConfig.buildComponentPath( + 'static-image', + 'static-image.html' + ), + restrict: 'E', + scope: { + image: '=', + ratio: '@' + }, + link: function (scope, element, attrs) { + + scope.$watch('image', function () { + if (scope.image && scope.image.id) { + scope.imageUrl = CmsConfig.buildImageApiUrl( + scope.image.id, + scope.ratio || '16x9', + '1200.jpg' + ); + } else { + scope.imageUrl = false; + } + }); + } + }; + } + ]); + +'use strict'; + +angular.module('statusFilter.config', [ + 'bulbs.cms.site.config', + 'contentServices.listService', + 'moment' +]) + .provider('StatusFilterOptions', function (moment) { + var _statuses = [ + {label: 'Draft', key: 'status', value: 'Draft'}, + {label: 'Awaiting Review', key: 'status', value: 'Waiting for Editor'}, + {label: 'Published', key: 'before', value: function () { return moment().format('YYYY-MM-DDTHH:mmZ'); }}, + {label: 'Scheduled', key: 'after', value: function () { return moment().format('YYYY-MM-DDTHH:mmZ'); }}, + {label: 'All', key: null, value: null} + ]; + + this.setStatuses = function (statuses) { + _statuses = statuses; + }; + + this.$get = function () { + return { + getStatuses: function () { + return _statuses; + } + }; + }; + }); + +'use strict'; + +angular.module('statusFilter.directive', [ + 'bulbs.cms.site.config', + 'contentServices.listService', + 'statusFilter.config' +]) + .directive('statusFilter', function ($location, _, StatusFilterOptions, ContentListService, CmsConfig) { + return { + templateUrl: CmsConfig.buildComponentPath('status-filter/status-filter.html'), + restrict: 'E', + scope: {}, + controller: 'ContentlistCtrl', + link: function postLink(scope, element, attrs) { + scope.options = StatusFilterOptions.getStatuses(); + + /** + * Test if a particular option is currently active by comparing it to + * $location.search(). + * + * @param {object} option - option parameters to test for. + * @returns true if option is in $location.search, false otherwise. + */ + scope.isActive = function (option) { + if (option.key && option.key in $location.search() && + $location.search()[option.key] === getValue(option)) { + return true; + } else if (!option.key) { //all + var possibleKeys = _.pluck(scope.options, 'key'); + var searchKeys = _.keys($location.search()); + if (_.intersection(possibleKeys, searchKeys).length > 0) { + return false; + } else { + return true; + } + } + return false; + }; + + scope.filterByStatus = function (option) { + var search = {}; + var value; + if (option.key) { + value = getValue(option); + search[option.key] = value; + } + + return ContentListService.$updateContent(search, false); + }; + + function getValue(option) { + var value; + if (typeof option.value === 'function') { + value = option.value(); + } else { + value = option.value; + } + return value; + } + + } + }; + }); + +'use strict'; + +angular.module('statusFilter', [ + 'statusFilter.directive' +]); + +'use strict'; + +angular.module('bulbs.cms.superFeatures.api', [ + 'bulbs.cms.dateTimeFilter', + 'bulbs.cms.site.config', + 'bulbs.cms.utils', + 'lodash', + 'moment' +]) + .service('SuperFeaturesApi', [ + '_', '$http', '$sce', 'CmsConfig', 'dateTimeFormatFilter', 'moment', 'Utils', + function (_, $http, $sce, CmsConfig, dateTimeFormatFilter, moment, Utils) { + + var superFeatureEndpoint = CmsConfig.buildApiUrlRoot.bind(null, 'super-feature'); + var contentEndpoint = CmsConfig.buildApiUrlRoot.bind(null, 'content'); + + var parsePayload = function (payload) { + var data = _.cloneDeep(payload); + + if (payload.published) { + data.published = moment.tz(payload.published, CmsConfig.getTimezoneName()); + } + + return data; + }; + + var cleanData = function (data) { + var payload = _.chain(data) + .omit('published') + .cloneDeep() + .value(); + + if (data.published) { + payload.published = data.published.format(); + } + + return payload; + }; + + return { + createSuperFeature: function (data) { + var payload = cleanData(data); + return $http.post( + contentEndpoint(Utils.param({ + doctype: CmsConfig.getSuperFeaturesType() + })), + payload) + .then(function (response) { + return parsePayload(response.data); + }); + }, + deleteSuperFeature: function (data) { + return $http.delete(contentEndpoint(data.id, '/')); + }, + fields: [{ + title: 'Super Feature Name', + sorts: 'title', + content: function (superFeature) { + return $sce.trustAsHtml(superFeature.title); + } + }, { + title: 'Total Nested Pages', + content: 'children_count' + }, { + title: 'Publish Date', + content: function (superFeature) { + var now = moment(); + var cellContent = ''; + + if (!superFeature.published) { + cellContent = 'Draft'; + } else if (now.isSameOrAfter(superFeature.published)) { + cellContent = dateTimeFormatFilter(superFeature.published); + } else if (now.isBefore(superFeature.published)) { + cellContent = dateTimeFormatFilter( + superFeature.published, + '[Scheduled for] M/D/YY h:mma z' + ); + } + + return cellContent; + } + }], + getSuperFeature: function (id) { + return $http.get(superFeatureEndpoint(id, '/')).then(function (response) { + return parsePayload(response.data); + }); + }, + getSuperFeatures: function (params) { + return $http.get(superFeatureEndpoint(Utils.param(params))) + .then(function (response) { + return { + results: response.data.results.map(function (result) { + return parsePayload(result); + }) + }; + }); + }, + getSuperFeatureRelations: function (id) { + return $http.get(superFeatureEndpoint(id, 'relations/')) + .then(function (response) { + return { + results: response.data.map(function (result) { + return parsePayload(result); + }) + }; + }); + }, + name: 'Super Feature', + namePlural: 'Super Features', + updateSuperFeature: function (data) { + var payload = cleanData(data); + return $http.put(contentEndpoint(data.id, '/'), payload) + .then(function (response) { + return parsePayload(response.data); + }); + }, + updateSuperFeatureRelationsOrdering: function (id, relations) { + var remappedRelations = relations.map(function (relation) { + return _.pick(relation, 'id', 'ordering'); + }); + return $http.put( + superFeatureEndpoint(id, 'relations', 'ordering/'), + remappedRelations + ); + }, + updateAllRelationPublishDates: function (id) { + return $http.put(superFeatureEndpoint(id, 'set-children-dates/')); + } + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.superFeatures.edit', [ + 'bulbs.cms.breadcrumb', + 'bulbs.cms.dynamicContent', + 'bulbs.cms.site.config', + 'bulbs.cms.superFeatures.api', + 'bulbs.cms.superFeatures.relations' +]) + .directive('superFeaturesEdit', [ + 'CmsConfig', 'SuperFeaturesApi', + function (CmsConfig, SuperFeaturesApi) { + return { + link: function (scope, element, attrs) { + scope.breadcrumbs = [{ + label: 'Super Features', + href: '/cms/app/super-features' + }, { + label: function () { + return scope.article.title; + } + }]; + + var addParentToBreadcrumb = function (article) { + if (angular.isNumber(article.parent)) { + SuperFeaturesApi.getSuperFeature(article.parent) + .then(function (superFeature) { + scope.breadcrumbs.splice(1, 0, { + label: superFeature.title, + href: '/cms/app/edit/' + superFeature.id + '/' + CmsConfig.getSuperFeaturesType() + }); + + addParentToBreadcrumb(superFeature); + }); + } + }; + + addParentToBreadcrumb(scope.article); + }, + // no scope here so we have access to the content edit scope without + // having to make changes to the brittle content edit controller, + // maybe we remove this wrapper someday when we refactor content edit + scope: false, + restrict: 'E', + templateUrl: CmsConfig.buildComponentPath( + 'super-features', + 'super-features-edit', + 'super-features-edit.html' + ) + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.superFeatures.list', [ + 'bulbs.cms.site.config', + 'bulbs.cms.superFeatures.api', + 'bulbsCmsApp.nonRestmodListPage', + 'lodash', + 'moment', + 'ngRoute', + 'statusFilter.config' +]) + .config([ + '_', '$injector', '$routeProvider', 'CmsConfigProvider', + 'StatusFilterOptionsProvider', + function (_, $injector, $routeProvider, CmsConfigProvider, + StatusFilterOptionsProvider) { + + var CmsConfig = $injector.invoke(CmsConfigProvider.$get); + var StatusFilterOptions = $injector.invoke(StatusFilterOptionsProvider.$get); + + $routeProvider + .when('/cms/app/super-features/', { + controller: [ + '$scope', '$window', 'SuperFeaturesApi', + function ($scope, $window, SuperFeaturesApi) { + $window.document.title = CmsConfig.getCmsName() + ' | Super Feature'; + $scope.modelFactory = SuperFeaturesApi; + + $scope.editPageUrlBuilder = function (item) { + return '/cms/app/edit/' + item.id + '/' + (item.polymorphic_ctype || CmsConfig.getSuperFeaturesType()); + }; + + // TODO: using status filters from content page here since list + // page needs them in a different format. when we move content + // list page to the generic list page directive, this can be + // removed. + $scope.statusFilterOptions = StatusFilterOptions.getStatuses() + .filter(function (option) { + return option.label !== 'All'; + }) + .map(function (option) { + var params = {}; + + if (option.key) { + params[option.key] = _.isFunction(option.value) ? option.value() : option.value; + } + + return { + title: option.label, + params: params + }; + }); + } + ], + templateUrl: CmsConfig.buildComponentPath( + 'super-features', + 'super-features-list', + 'super-features-list.html' + ) + }); + } + ]); + +'use strict'; + +angular.module('bulbs.cms.superFeatures.relations', [ + 'bettyEditable', + 'bulbs.cms.dateTimeFilter', + 'bulbs.cms.site.config', + 'bulbs.cms.superFeatures.api', + 'bulbs.cms.sendToEditorModal', + 'bulbs.cms.titleModal', + 'bulbs.cms.utils', + 'confirmationModal', + 'lodash', + 'moment', + 'Raven', + 'statusFilter.config' +]) + .directive('superFeaturesRelations', [ + '_', '$q', 'CmsConfig', 'moment', 'Raven', 'SuperFeaturesApi', + 'StatusFilterOptions', 'Utils', + function (_, $q, CmsConfig, moment, Raven, SuperFeaturesApi, + StatusFilterOptions, Utils) { + + return { + link: function (scope, element, attrs) { + var reportError = function (message, data) { + Raven.captureMessage(message, data); + scope.errorMessage = message; + }; + + scope.clearError = function () { + scope.errorMessage = ''; + }; + + scope.$watch('relations', function (newRelations, oldRelations) { + if (!angular.equals(newRelations, oldRelations)) { + scope.clearError(); + } + }, true); + + var normalizeOrderings = function (relations) { + relations.forEach(function (relation, i) { + relation.ordering = i + 1; + }); + }; + + SuperFeaturesApi.getSuperFeatureRelations(scope.article.id) + .then(function (response) { + scope.relations = response.results; + normalizeOrderings(scope.relations); + }) + .catch(function (response) { + var message = 'An error occurred retrieving relations!'; + reportError(message, { response: response }); + }); + + scope.statuses = StatusFilterOptions.getStatuses() + .filter(function (status) { + // remove default status + return !!status.value; + }); + + var relationFormPrefix = 'relationForm_'; + var orderingFormPrefix = 'orderingInputForm_'; + + scope.wrapperForm = {}; + scope.makeRelationFormName = function (relation) { + return relationFormPrefix + relation.id; + }; + scope.makeOrderingFormName = function (relation) { + return orderingFormPrefix + relation.id; + }; + scope.getRelationForm = function (relation) { + return scope.wrapperForm[scope.makeRelationFormName(relation)]; + }; + scope.getOrderingForm = function (relation) { + return scope.wrapperForm[scope.makeOrderingFormName(relation)]; + }; + + scope.isAtLeastOneRelationFormDirty = function () { + return Object.keys(scope.wrapperForm) + .reduce(function (isDirty, key) { + if (key.startsWith(relationFormPrefix)) { + return isDirty || scope.wrapperForm[key].$dirty; + } + return isDirty; + }, false); + }; + + var lock = Utils.buildLock(); + scope.transactionsLocked = lock.isLocked; + var reorder = function (operation) { + + return function () { + var funcArgs = arguments; + + var payload = scope.relations.map(function (relation) { + return _.pick(relation, 'id', 'ordering'); + }); + + operation.bind(null, payload).apply(null, funcArgs); + normalizeOrderings(payload); + + return SuperFeaturesApi.updateSuperFeatureRelationsOrdering( + scope.article.id, + payload + ) + .then(function () { + operation.bind(null, scope.relations).apply(null, funcArgs); + normalizeOrderings(scope.relations); + }) + .catch(function (response) { + var message = 'An error occurred attempting to reorder a child!'; + reportError(message, { response: response }); + }); + }; + }; + + scope.moveRelation = lock(reorder(Utils.moveTo)); + + scope.addRelation = lock(function (title) { + + return SuperFeaturesApi.createSuperFeature({ + parent: scope.article.id, + superfeature_type: scope.article.default_child_type, + title: title, + ordering: (_.max(scope.relations, 'ordering').ordering || 0) + 1 + }) + .then(function (relation) { + scope.relations.push(relation); + }) + .catch(function (response) { + var message = 'An error occurred attempting to add a child page!'; + reportError(message, { response: response }); + }); + }); + + scope.updateRelationsPublishDates = lock(function () { + + return SuperFeaturesApi + .updateAllRelationPublishDates(scope.article.id) + .then(function (response) { + scope.relations.forEach(function (relation) { + relation.published = moment.tz( + scope.article.published, + CmsConfig.getTimezoneName() + ); + }); + }) + .catch(function (response) { + var message = 'An error occurred attempting to update child publish dates!'; + reportError(message, { response: response }); + }); + }); + + scope.saveRelation = lock(function (relation) { + + var relationCopy = angular.copy(relation); + relationCopy.parent = scope.article.id; + + return SuperFeaturesApi.updateSuperFeature(relationCopy) + .catch(function (response) { + var titleDisplay = relation.title ? '"' + relation.title + '"' : 'a relation'; + var message = 'An error occurred attempting to update ' + titleDisplay + '!'; + reportError(message, { response: response }); + }) + .finally(function () { + scope.getRelationForm(relation).$setPristine(); + }); + }); + + scope.deleteRelation = lock(function (relation) { + + return SuperFeaturesApi.deleteSuperFeature(relation) + .then(function () { + var index = scope.relations.indexOf(relation); + reorder(Utils.removeFrom)(index); + }) + .catch(function (response) { + var titleDisplay = relation.title ? '"' + relation.title + '"' : 'a relation'; + var message = 'An error occurred attempting to delete ' + titleDisplay + '!'; + reportError(message, { response: response }); + }); + }); + }, + restrict: 'E', + scope: { + article: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'super-features', + 'super-features-relations', + 'super-features-relations.html' + ) + }; + } + ]); + +'use strict'; + +angular.module('bulbs.cms.superFeatures.tab.item', [ + 'bulbs.cms.site.config', + 'bulbs.cms.superFeatures.api', + 'filters.moment' +]) + .directive('superFeaturesTabItem', function (CmsConfig, SuperFeaturesApi) { + return { + link: function (scope) { + + var requestSuperFeature = function () { + + if (angular.isNumber(scope.model)) { + SuperFeaturesApi.getSuperFeature(scope.model) + .then(function (superFeature) { + scope.superFeature = superFeature; + }); + } + }; + + scope.$watch('model', requestSuperFeature); + }, + restrict: 'E', + scope: { + model: '=' + }, + templateUrl: CmsConfig.buildComponentPath( + 'super-features', + 'super-features-tab', + 'super-features-tab-item', + 'super-features-tab-item.html' + ) + }; + }); + +'use strict'; + +angular.module('bulbs.cms.superFeatures.tab', [ + 'autocompleteBasic', + 'bulbs.cms.site.config', + 'bulbs.cms.utils', + 'jquery', + 'ui.sortable', + 'bulbs.cms.superFeatures.tab.item', + 'bulbs.cms.superFeatures.api' +]) + .directive('superFeaturesTab', function ($, SuperFeaturesApi, CmsConfig) { + return { + controller: function (_, $scope, Utils, Video) { + + $scope.moveUp = function (index) { + Utils.moveTo($scope.superFeatures, index, index - 1); + $scope.onUpdate(); + }; + + $scope.moveDown = function (index) { + Utils.moveTo($scope.superFeatures, index, index + 1); + $scope.onUpdate(); + }; + + $scope.delete = function (index) { + Utils.removeFrom($scope.superFeatures, index); + $scope.onUpdate(); + }; + + $scope.addSuperFeature = function (superFeature) { + $scope.addSuperFeatureCallback({ superFeature: superFeature }); + $scope.onUpdate(); + }; + + $scope.searchSuperFeature = function (query) { + return SuperFeaturesApi.getSuperFeatures({search:query}).then( + function(response) { + return response.results; + }); + }; + + }, + link: function (scope, element, attr) { + + scope.sortableOptions = { + beforeStop: function (e, ui) { + ui.helper.css('margin-top', 0); + }, + change: function (e, ui) { + ui.helper.css('margin-top', $(window).scrollTop()); + }, + containment: 'super-feature-list', + distance: 3, + opacity: 0.75, + placeholder: 'dropzone', + start: function (e, ui) { + ui.helper.css('margin-top', $(window).scrollTop()); + } + }; + }, + restrict: 'E', + scope: { + addSuperFeatureCallback: '&addSuperFeature', + superFeatures: '=', + onUpdate: '&' + }, + templateUrl: CmsConfig.buildComponentPath( + 'super-features', + 'super-features-tab', + 'super-features-tab.html' + ) + }; + }); + +'use strict'; + +angular.module('bulbs.cms.superFeatures', [ + 'bulbs.cms.superFeatures.list', + 'bulbs.cms.superFeatures.edit' +]); + +'use strict'; + +angular.module('templateTypeField.directive', [ + 'bulbs.cms.site.config' +]) + .directive('templateTypeField', function (CmsConfig) { + return { + controller: function (_, $scope, ContentFactory, TEMPLATE_TYPES) { + $scope.templateTypes = _.filter(TEMPLATE_TYPES, {content_type: $scope.content.polymorphic_ctype}); + }, + restrict: 'E', + scope: { + content: '=' + }, + templateUrl: CmsConfig.buildComponentPath('template-type-field/template-type-field.html') + }; + }); + +'use strict'; + +angular.module('templateTypeField', [ + 'templateTypeField.directive' +]) + .value('TEMPLATE_TYPES', [{ + name: 'Small Width', + slug: 'small-width', + content_type: 'content_content' + }, { + name: 'Large Width', + slug: 'large-width', + content_type: 'content_content' + }]); + +'use strict'; + +angular.module('bulbs.cms.titleModal', [ + 'bulbs.cms.site.config', + 'ui.bootstrap', + 'ui.bootstrap.modal' +]) + .directive('titleModalOpener', [ + '$modal', 'CmsConfig', + function ($modal, CmsConfig) { + return { + restrict: 'A', + scope: { + modalBodyBefore: '@', + modalBodyAfter: '@', + modalCancelText: '@', + modalOkText: '@', + modalOnCancel: '&', + modalOnOk: '&', + modalTitle: '@' + }, + link: function (scope, element) { + + element.addClass('title-modal-opener'); + element.on('click', function () { + + if (!scope.modalInstance) { + + scope.modalInstance = $modal + .open({ + scope: scope, + templateUrl: CmsConfig.buildComponentPath( + 'title-modal', + 'title-modal.html' + ) + }); + + scope.modalInstance.result + .then(scope.modalOnOk) + .catch(scope.modalOnCancel) + .finally(function () { + scope.modalInstance = false; + }); + } + }); + } + }; + } + ]); + +'use strict'; + +/** + * Renders a topbar template based on a given path relative to "/components/". + */ +angular.module('topBar.directive', [ + 'bulbs.cms.site.config' +]) + .directive('topBar', function (CmsConfig) { + return { + restrict: 'E', + scope: { + logoHref: '@', + itemsDropdownTitle: '@', + itemsDropdown: '=', + itemsTop: '=', + saveFunction: '=', + saveDisableWhen: '&' + }, + templateUrl: CmsConfig.buildComponentPath('top-bar/top-bar-base.html'), + link: function (scope) { + scope.NAV_LOGO = CmsConfig.getNavLogoPath(); + } + }; + }); + +'use strict'; + +angular.module('topBar.item.factory', []) + .factory('TopBarItem', function () { + + var TopBarItem = function (params) { + this.displayText = params.displayText || ''; + this.displayIconClasses = params.displayIconClasses || ''; + this.containerClasses = params.containerClasses || ''; + this.clickFunction = params.clickFunction || function () {}; + }; + + return TopBarItem; + }); + +'use strict'; + +angular.module('topBar', [ + 'topBar.directive', + 'topBar.item.factory' +]); + +'use strict'; + +/** + * Restmod mixin that looks for fieldDisplays in $configs, objects with a title and + * optionally a value and sorts property. + * + * title is used to label a given field, should be unique. + * + * value is an optional field transformed into a new property function called + * evalute; when invoked with a record, value string will evaluate with $parse, + * where 'record' is the given record. + * + * sorts is an optional field that can be a string or a function. As a string it + * should be the name of a property to order by. As a function, it should take + * a direction--'asc'/undefined for the default direction, 'desc' for the opposite + * direction--and return an ordering string. + * + * Field display objects are available at the model level as the $fieldDisplays function. + * Returns a list of field displays to be used in templates. + */ +angular.module('apiServices.mixins.fieldDisplay', [ + 'restmod' +]) + .factory('FieldDisplay', function($parse, restmod) { + + /** + * Generates a function that can be passed a record and evalutes given value + * string agaist that record to return the string to be displayed to the user. + * + * @param {string} value - string that will be evaluted with record as an instance + * of model, e.g. the value string 'record.name' would print out the instance's + * name property. + * @returns {function} takes a record and is evaluates the given value with given + * record. + */ + var parserWrap = function (value) { + // return a function that can be called with given string to generate parser + return (function (value) { + // return a function that will be called in template + var parsed = $parse(value); + return function (record) { + // use angular's $parse to create a function that will eval in the correct scope + return parsed({record: record}); + }; + })(value); + }; + + /** + * Default sorting string builder. If field display object sorts property is a + * function, that will override the functionality provided by this function. Use + * this for more complex sorting strings, such as those that have multiple paramters. + * + * @param {String} sorts - sorts property provided by field display object. Should be + * the non-negated property name to sort on. + * @returns {function} evaluated with a direction string, either 'asc'/undefined for the + * default sorting direction, or 'desc' for opposite sorting direction. + */ + var getOrdering = function (sorts) { + return (function (sorts) { + return function (direction) { + var ordering = ''; + if (direction === 'desc') { + // do opposite of default sort + ordering = '-' + sorts; + } else { + // do default sort, only supports 1 parameter + ordering = sorts; + } + return ordering; + }; + })(sorts); + }; + + return restmod.mixin(function () { + + this.define('Scope.$fieldDisplays', function () { + var fieldDisplays = this.getProperty('fieldDisplays'); + if (fieldDisplays) { + var i; + for (i = 0; i < fieldDisplays.length; i++) { + var fieldDisplay = fieldDisplays[i]; + + // set up evaluation function if a value was provided + if (fieldDisplay.value) { + fieldDisplay.evaluate = parserWrap(fieldDisplay.value); + } + + // set up storting function if sorts was provided + if (fieldDisplay.sorts) { + if (typeof fieldDisplay.sorts === 'function') { + // sort function was provided, use that + fieldDisplay.getOrdering = fieldDisplay.sorts; + } else { + // function not provided, use default one + fieldDisplay.getOrdering = getOrdering(fieldDisplay.sorts); + } + } + } + } + return fieldDisplays; + }); + + }); + }); + +'use strict'; + +angular.module('apiServices', [ + 'restmod', + 'restmod.styles.drfPaged' +]) + .constant('API_URL_ROOT', '/cms/api/v1/') + .config(function (API_URL_ROOT, restmodProvider) { + restmodProvider.rebase('DjangoDRFPagedApi', { + $config: { + style: 'BulbsApi', + urlPrefix: API_URL_ROOT + } + }); + }); + +'use strict'; + +angular.module('apiServices.campaign.factory', [ + 'apiServices', + 'apiServices.mixins.fieldDisplay', + 'filters.moment' +]) + .factory('Campaign', function (restmod) { + return restmod.model('campaign').mix('FieldDisplay', 'NestedDirtyModel', { + $config: { + name: 'Campaign', + plural: 'Campaigns', + primaryKey: 'id', + fieldDisplays: [{ + title: 'Campaign', + value: 'record.campaignLabel', + sorts: 'campaign_label' + }, { + title: 'Sponsor', + value: 'record.sponsorName', + sorts: 'sponsor_name' + }, { + title: 'Start Date', + value: 'record.startDate.format("MM/DD/YY") || "--"', + sorts: 'start_date' + }, { + title: 'End Date', + value: 'record.endDate.format("MM/DD/YY") || "--"', + sorts: 'end_date' + }] + }, + + pixels: { + init: [{}], + }, + + // fields from frontend to backend + end_date: { + encode: 'moment_to_date_string', + }, + start_date: { + encode: 'moment_to_date_string', + }, + + // fields from backend to frontend + endDate: { + decode: 'date_string_to_moment', + }, + startDate: { + decode: 'date_string_to_moment' + }, + + $extend: { + Model: { + simpleSearch: function (searchTerm) { + return this.$search({search: searchTerm, ordering: 'campaign_label'}).$asPromise(); + } + } + } + }); + }); + +'use strict'; + +angular.module('apiServices.customSearch.count.factory', [ + 'apiServices', + 'apiServices.customSearch.settings' +]) + .factory('CustomSearchCount', function (_, CustomSearchSettings, restmod) { + + var Count = restmod.model(CustomSearchSettings.countEndpoint).mix({ + count: 0 + }); + + return { + $retrieveResultCount: function (query) { + return Count.$create(query).$asPromise() + .then(function (model) { + return model.$response.data.root.count; + }); + } + }; + }); + +'use strict'; + +/** + * Wrapper functions for custom search endpoints. + */ +angular.module('apiServices.customSearch.factory', [ + 'apiServices.customSearch.count.factory', + 'apiServices.customSearch.groupCount.factory', + 'apiServices.customSearch.settings', + 'lodash', + 'restmod' +]) + .factory('CustomSearch', function (_, restmod, CustomSearchCount, CustomSearchGroupCount, + CustomSearchSettings) { + + var CustomSearch = restmod.model(CustomSearchSettings.searchEndpoint).mix({ + $config: { + jsonRootSingle: 'results' + }, + $hooks: { + 'before-save': function (_req) { + _req.url += '/?page=' + _req.data.page; + } + } + }); + + return { + $retrieveResultCount: CustomSearchCount.$retrieveResultCount, + $retrieveGroupCount: CustomSearchGroupCount.$retrieveResultCount, + $retrieveContent: function (query) { + return CustomSearch.$create(query).$asPromise() + .then(function (model) { + return model.$response.data; + }); + } + }; + }); + +'use strict'; + +angular.module('apiServices.customSearch.groupCount.factory', [ + 'apiServices', + 'apiServices.customSearch.settings' +]) + .factory('CustomSearchGroupCount', function (_, CustomSearchSettings, restmod) { + + var Count = restmod.model(CustomSearchSettings.groupCountEndpoint).mix({ + count: 0 + }); + + return { + $retrieveResultCount: function (query) { + return Count.$create(query).$asPromise() + .then(function (model) { + return model.$response.data.root.count; + }); + } + }; + }); + +'use strict'; + +angular.module('apiServices.customSearch.settings', []) + .service('CustomSearchSettings', function () { + + return { + searchEndpoint: 'custom-search-content', + groupCountEndpoint: 'custom-search-content/group_count', + countEndpoint: 'custom-search-content/count' + }; + }); + +'use strict'; + +angular.module('apiServices.featureType.factory', [ + 'apiServices' +]) + .factory('FeatureType', [ + 'restmod', + function (restmod) { + return restmod.model('things').mix('NestedDirtyModel', { + $config: { + name: 'FeatureType', + plural: 'FeatureTypes', + primaryKey: 'id', + }, + + $extend: { + Model: { + simpleSearch: function (searchTerm) { + return this.$search({type: 'feature_type', q: searchTerm}).$asPromise(); + } + } + } + }); + }] + ); +'use strict'; + +angular.module('apiServices.notification.factory', [ + 'apiServices', + 'apiServices.customSearch.count.factory', + 'apiServices.mixins.fieldDisplay', + 'filters.moment', +]) + .factory('Notification', function (_, CustomSearchCount, restmod) { + var notificationEndpoint = 'notification'; + + return restmod.model(notificationEndpoint).mix('FieldDisplay', 'NestedDirtyModel', { + $config: { + name: 'Notification', + plural: 'Notifications', + primaryKey: 'id', + fieldDisplays: [{ + title: 'Internal Name', + value: 'record.internalTitle || "--"', + sorts: 'internal_title' + }, { + title: 'State', + value: 'record.isPublished ? "Published" : "Unpublished"', + sorts: 'is_published' + }, { + title: 'Created On', + value: 'record.createdOn.format("MM/DD/YYYY")', + sorts: 'created_on' + }] + }, + + // fields from frontend to backend + created_on: { + encode: 'moment_to_date_string', + }, + + // fields from backend to frontend + createdOn: { + decode: 'date_string_to_moment' + } + + }); + }); + +'use strict'; + +angular.module('apiServices.answer.factory', [ + 'apiServices', + 'bulbs.cms.config', + 'lodash' +]) +.factory('Answer', ['$http', '$q', '_', 'CmsConfig', function ($http, $q, _, CmsConfig) { + + var answerUrl = CmsConfig.buildApiUrlRoot('poll-answer/'); + var error = function(message) { + return new Error('Poll Error: ' + message); + }; + + function deleteAnswers(deletedAnswers) { + var deletePromise = _.map(deletedAnswers, function(deletedAnswer) { + return $http.delete(answerUrl + deletedAnswer.id); + }); + $q.all(deletePromise).then(function(response) { + return response; + }); + } + + function putAnswer(oldAnswers, newAnswer) { + var oldAnswer = _.filter(oldAnswers, {id: newAnswer.id})[0]; + if(newAnswer.answer_text !== oldAnswer.answer_text) { + return $http.put(answerUrl + newAnswer.id, { + answer_text: newAnswer.answer_text + }).then(function(response) { + return response.data; + }); + } + } + + function postAnswer(answer, pollId) { + if(!_.isNumber(pollId) || _.isUndefined(answer.answer_text)) { + throw error('poll id and answer_text fields required'); + } + return $http.post(answerUrl, { + poll: pollId, + answer_text: answer.answer_text + }).then(function(response) { + return response.data; + }); + } + + function updatePollAnswers(scope) { + deleteAnswers(scope.deletedAnswers); + _.forEach(scope.answers, function(answer) { + if(answer.notOnSodahead) { + postAnswer(answer, scope.model.id); + } else { + putAnswer(scope.model.answers, answer); + } + }); + } + + return { + postAnswer: postAnswer, + updatePollAnswers: updatePollAnswers + }; +}]); + +'use strict'; + +angular.module('apiServices.poll.factory', [ + 'apiServices', + 'apiServices.mixins.fieldDisplay', + 'bulbsCmsApp.nonRestmodListPage', + 'filters.moment', + 'lodash' +]) +.factory('Poll', + ['$filter', '$http', '$q', '_', 'moment', 'Utils', + function ($filter, $http, $q, _, moment, Utils) { + + var error = function(message) { + return new Error('Poll Error: ' + message); + }; + + var fields = [{ + title: 'Poll Name', + sorts: 'title', + }, { + title: 'Publish Date', + sorts: 'publish_date', + content: function (poll) { + return poll.published ? poll.published.format('MM/DD/YY h:mma') : '—'; + }, + }, { + title: 'Close Date', + sorts: 'end_date', + content: function (poll) { + return poll.end_date ? poll.end_date.format('MM/DD/YY h:mma') : '—'; + }, + }]; + var name = 'Poll'; + var namePlural = 'Polls'; + var pollUrl = '/cms/api/v1/poll/'; + + function parsePayload (payload) { + var data = _.clone(payload); + var filter = $filter('date_string_to_moment'); + data.end_date = filter(data.end_date); + data.published = filter(data.published); + return data; + } + + function cleanPayload (originalPayload) { + var momentToDateString = $filter('moment_to_date_string'); + var payload = _.clone(originalPayload); + + if(_.isUndefined(payload.title) && _.isUndefined(payload.question_text)) { + throw error('title and question text required'); + } + + if(payload.end_date) { + if(!moment.isMoment(payload.end_date)) { + throw error('end_date must be a moment object'); + } + payload.end_date = momentToDateString(payload.end_date); + } + + if (payload.published) { + if(!moment.isMoment(payload.published)) { + throw error('published must be a moment object'); + } + payload.published = momentToDateString(payload.published); + } + + return _.pick(payload, [ + 'title', + 'question_text', + 'published', + 'end_date' + ]); + } + + function getPoll(pollId) { + return $http.get(pollUrl + pollId + '/') + .then(function (response) { + return parsePayload(response.data); + }); + } + + function getPolls(params) { + var url = pollUrl + Utils.param(params); + return $http.get(url) + .then(function (response) { + response.data.results = response.data.results.map(function (poll) { + return parsePayload(poll); + }); + return response.data; + }); + } + + function postPoll(data) { + var payload = cleanPayload(data); + + return $http.post(pollUrl, payload) + .then(function(response) { + return response.data; + }); + } + + function updatePoll(data) { + var payload = cleanPayload(data); + + return $http.put(pollUrl + data.id + '/', payload) + .then(function(response) { + return response.data; + }); + } + + function deletePoll(pollId) { + return $http.delete(pollUrl + pollId + '/') + .then(function(response) { + return response; + }); + } + + return { + getPoll: getPoll, + getPolls: getPolls, + fields: fields, + name: name, + namePlural: namePlural, + postPoll: postPoll, + updatePoll: updatePoll, + deletePoll: deletePoll + }; +}]); + +'use strict'; + +angular.module('apiServices.lineItem.factory', [ + 'apiServices', + 'apiServices.mixins.fieldDisplay' +]) + .factory('LineItem', function (_, restmod) { + var contributorEndpoint = 'contributions/line-items'; + + return restmod.model(contributorEndpoint).mix('FieldDisplay', 'NestedDirtyModel', { + $config: { + name: 'Line Item', + plural: 'Line Items', + primaryKey: 'id', + fieldDisplays: [ + { + title: 'Contributor', + value: 'record.contributor.fullName' + }, + { + title: 'Amount $', + value: 'record.amount' + }, + { + title: 'Note', + value: 'record.note' + }, + { + title: 'Date', + value: 'record.paymentDate.format("MM/DD/YY") || "--"', + } + ] + }, + + paymentDate: { + decode: 'date_string_to_moment', + encode: 'moment_to_date_string' + }, + payment_date: { + decode: 'date_string_to_moment', + encode: 'moment_to_date_string', + } + + }); + }); +'use strict'; + +angular.module('apiServices.rateOverride.factory', [ + 'apiServices', + 'apiServices.mixins.fieldDisplay' +]) + .factory('RateOverride', function (_, restmod) { + var rateOverrideEndpoint = 'contributions/rate-overrides'; + + return restmod.model(rateOverrideEndpoint).mix('FieldDisplay', 'NestedDirtyModel', { + $config: { + name: 'Rate Override', + plural: 'Rate Overrides', + primaryKey: 'id', + fieldDisplays: [ + { + title: 'Name', + value: 'record.contributor.fullName' + }, + { + title: 'Role', + value: 'record.role.name' + } + ] + }, + role: { + init: {} + }, + $hooks: { + 'before-save': function(_req) { + var featureTypes = _req.data.feature_types; + if (featureTypes.length > 0) { + for (var key in featureTypes) { + var obj = featureTypes[key]; + if (obj.hasOwnProperty('featureType')) { + if (obj.featureType.hasOwnProperty('name')) { + _req.data.feature_types[key].feature_type = obj.featureType.name; + } else if (obj.featureType.hasOwnProperty('value')) { + _req.data.feature_types[key].feature_type.slug = obj.featureType.value; + } + } + } + } + }, + 'before-render': function(record) { + if (record.hasOwnProperty('feature_types')) { + for (var key in record.feature_types) { + if (record.feature_types[key].hasOwnProperty('feature_type')){ + if (record.feature_types[key].feature_type.hasOwnProperty('name')) { + record.feature_types[key].feature_type = record.feature_types[key].feature_type.name; + } + } + } + } + } + } + }); + }); +'use strict'; + +angular.module('apiServices.reporting.factory', [ + 'apiServices', + 'apiServices.mixins.fieldDisplay' +]) + .factory('Role', function (_, restmod) { + var roleEndpoint = 'contributions/role'; + return restmod.model(roleEndpoint).mix('FieldDisplay', 'NestedDirtyModel', { + flat_rates: { + hasMany: restmod.model(null, {}).mix('NestedDirtyModel'), + path: 'flat_rates', + params: {}, + hooks: { + 'after-fetch-many': function() { + if (this.length > 0) { + this.$owner.flat_rate = this[0]; + } else { + this.$owner.flat_rate = this.$owner.flat_rates.$create({ rate: 0 }); + } + } + } + }, + hourly_rates: { + hasMany: restmod.model(null, {rate: 0}).mix('NestedDirtyModel'), + path: 'hourly_rates', + params: {}, + hooks: { + 'after-fetch-many': function() { + if (this.length > 0) { + this.$owner.hourly_rate = this[0]; + } else { + this.$owner.hourly_rate = this.$owner.hourly_rates.$create({ rate: 0 }); + } + } + } + }, + feature_type_rates: { + hasMany: restmod.model(null, {}).mix('NestedDirtyModel'), + path: 'feature_type_rates', + params: {}, + hooks: { + 'after-fetch-many': function() { + var next = this.$metadata.next; + if (!_.isUndefined(next) && next !== null) { + this.$owner.feature_type_rates.$page++; + this.$owner.feature_type_rates.$fetch(); + } + } + } + }, + $config: { + name: 'Role', + plural: 'Roles', + primaryKey: 'id', + fieldDisplays: [ + { + title: 'Role', + value: 'record.name' + }, + { + title: 'Payment Type', + value: 'record.paymentType' + } + ] + }, + }); + }); +'use strict'; + +angular.module('apiServices.section.factory', [ + 'apiServices', + 'apiServices.customSearch.count.factory', + 'apiServices.mixins.fieldDisplay' +]) + .factory('Section', function (_, CustomSearchCount, restmod) { + var sectionEndpoint = 'section'; + + return restmod.model(sectionEndpoint).mix('FieldDisplay', 'NestedDirtyModel', { + $config: { + name: 'Section', + plural: 'Sections', + primaryKey: 'id', + fieldDisplays: [{ + title: 'Section Name', + value: 'record.name', + sorts: 'name' + }, { + title: 'Article Count', + value: 'record.$resultCount' + }] + }, + query: { + init: {} + }, + promoted: { + init: true + }, + $hooks: { + 'after-fetch': function () { + this.$refreshResultCount(); + }, + 'after-fetch-many': function () { + _.each(this, function (record) { + record.$refreshResultCount(); + }); + } + }, + $extend: { + Record: { + /** + * Getter for section content count. + * + * @returns {String} section content count. + */ + $refreshResultCount: function () { + var record = this; + return CustomSearchCount.$retrieveResultCount(this.query) + .then(function (count) { + record.$resultCount = count; + }); + } + } + }, + }); + }); + +'use strict'; + +angular.module('apiServices.specialCoverage.factory', [ + 'apiServices', + 'apiServices.campaign.factory', + 'apiServices.mixins.fieldDisplay', + 'cms.tunic.config', + 'filters.moment', + 'VideohubClient.api' +]) + .factory('SpecialCoverage', function (_, $http, $parse, $q, restmod, TunicConfig, Video) { + var ACTIVE_STATES = { + INACTIVE: 'Inactive', + PROMOTED: 'Pin to HP' + }; + + return restmod.model('special-coverage').mix('FieldDisplay', 'NestedDirtyModel', { + $config: { + name: 'Special Coverage', + plural: 'Special Coverages', + primaryKey: 'id', + fieldDisplays: [{ + title: 'List Title', + value: 'record.name', + sorts: 'name' + }, { + title: 'Sponsor', + value: 'record.campaign.sponsorName || "--"', + sorts: 'campaign__sponsor_name' + }, { + title: 'Campaign', + value: 'record.campaign.campaignLabel || "--"', + sorts: 'campaign__campaign_label' + }, { + title: 'Start Date', + value: 'record.startDate.format("MM/DD/YY") || "--"', + sorts: 'start_date' + }, { + title: 'End Date', + value: 'record.endDate.format("MM/DD/YY") || "--"', + sorts: 'end_date' + }] + }, + + // fields from frontend to backend + end_date: { + encode: 'moment_to_date_string', + }, + start_date: { + encode: 'moment_to_date_string', + }, + + // fields from backend to frontend + endDate: { + decode: 'date_string_to_moment', + }, + startDate: { + decode: 'date_string_to_moment' + }, + + campaign: { + belongsTo: 'Campaign', + prefetch: true, + key: 'campaign' + }, + listUrl: { + mask: 'CU' + }, + query: { + init: {} + }, + videos: { + belongsToMany: 'Video', + keys: 'videos' + }, + super_features: { + init: [], + keys: 'super_features' + }, + active: { + init: true + }, + promoted: { + init: false + }, + + $hooks: { + 'after-fetch': function () { + // auto fetch all video records when first fetching + this.$loadVideosData(); + }, + 'after-save': function () { + // auto fetch all video records when saving/updating + this.$loadVideosData(); + } + }, + + $extend: { + Record: { + /** + * Load video data by filling in video models listed in videos property. + */ + $loadVideosData: function () { + _.each(this.videos, function (video) { + video.$fetch(); + }); + }, + /** + * Load campaign data from Tunic endpoint + */ + $loadTunicCampaign: function () { + if (_.isNumber(this.tunicCampaignId)) { + return $http.get(TunicConfig.buildBackendApiUrl('campaign/' + this.tunicCampaignId + '/')).then(function (result) { + return result.data; + }); + } + return $q.reject(); + }, + /** + * Load campaign search results from Tunic endpoint + */ + $searchCampaigns: function (params) { + + return $http.get(TunicConfig.buildBackendApiUrl('campaign/'), { + params: params, + }).then(function (response) { + return response.data.results; + }); + }, + /** + * Add a video by id. + * + * @param {Number} id - id of video to add. + * @returns {Boolean} true if video was added, false otherwise. + */ + addVideo: function (video) { + var added = false; + + // check that video is not already in list + var existingVideo = _.find(this.videos, function (existingVideo) { + return video.id === existingVideo.id; + }); + + if (!existingVideo) { + // not in list, add it to list + this.videos.push(video); + added = true; + } + + return added; + }, + addSuperFeature: function (superFeature) { + + var existingSuperFeature = this.superFeatures + .find(function(existingSuperFeatureId) { + return superFeature.id === existingSuperFeatureId; + }); + + if (!existingSuperFeature) { + this.superFeatures.push(superFeature.id); + } + }, + /** + * Getter/setter for active state, a front end standin for the active + * and promoted flags. + * + * @param {String} [activeState] - set this value when using as setter. + * @returns {String} current activeState. + */ + $activeState: function (activeState) { + if (_.isString(activeState)) { + if (activeState === ACTIVE_STATES.ACTIVE) { + this.active = true; + this.promoted = false; + } else if (activeState === ACTIVE_STATES.PROMOTED) { + this.active = true; + this.promoted = true; + } else { + this.active = false; + this.promoted = false; + } + } else { + activeState = ACTIVE_STATES.INACTIVE; + if (this.active && this.promoted) { + activeState = ACTIVE_STATES.PROMOTED; + } else if (this.active) { + activeState = ACTIVE_STATES.ACTIVE; + } + } + return activeState; + } + }, + Model: { + ACTIVE_STATES: _.clone(ACTIVE_STATES) + } + }, + }); + }); + +'use strict'; + +angular.module('bulbs.cms.base.config', [ + 'bulbs.cms.config', + 'bulbs.cms.customSearch.config', + 'ngClipboard' +]) + .config([ + 'CmsConfigProvider', 'CustomSearchConfigProvider', 'ngClipProvider', + function (CmsConfigProvider, CustomSearchConfigProvider, ngClipProvider) { + + CmsConfigProvider + .setContentPartialsPath('/content_type_views') + .setComponentPath('/components') + .setDateTimeFormatHumanReadable('M/D/YY h:mma z') + .setDirectivePartialsPath('/views') + .setSharedPath('/shared') + .setTopBarMapping('nav', '/views/nav.html') + .setTopBarMapping('reportbar', '/views/reportbar.html') + .setTopBarMapping('toolbar', '/views/toolbar.html') + .setUnpublishedPath('unpublished'); + + CustomSearchConfigProvider + .addConditionField('Content Type', 'content-type', 'name', 'doctype') + .addConditionField('Feature Type', 'feature-type', 'name', 'slug') + .addConditionField('Tag', 'tag', 'name', 'slug') + .addConditionType('is any of', 'any') + .addConditionType('is all of', 'all') + .addConditionType('is none of', 'none') + .addTimePeriod('Past Day', 'Past day') + .addTimePeriod('Past Week', 'Past week') + .addTimePeriod('Past Month', 'Past month'); + + ngClipProvider.setPath('/bower_components/zeroclipboard/dist/ZeroClipboard.swf'); + } + ]); + +'use strict'; + +angular.module('bulbs.cms.config', [ + 'bulbs.cms.utils', + 'lodash' +]) + .provider('CmsConfig', [ + '_', 'UtilsProvider', + function (_, Utils) { + + var CmsConfigError = BulbsCmsConfigError.build('CmsConfig'); + var checkOrError = function (value, test, errorMsg) { + if (test(value)) { + return value; + } + throw new CmsConfigError(errorMsg); + }; + var pathBuilder = function (start) { + return function () { + return Utils.path.join(arguments); + }.bind(null, start); + }; + + // url for api root + var apiUrlRoot = ''; + // article statuses for sending to editoral + var articleEditoralStatuses = []; + // true to automatically add current user to author list when creating content + var autoAddAuthor = false; + // path to components + var componentPath = ''; + // path to edit pages for specific types of content, maps to ctype + var contentPartialsPath = ''; + // human readable date time format to use around the CMS + var dateTimeFormatHumanReadable = ''; + // path to directives from backend + // TODO : remove once apps are pulled into here + var directivePartialsPath = ''; + // name of CMS to display in title and in interface + var cmsName = ''; + // url for content + var contentApiUrl = ''; + // url for external links, those that are accessible to the public + var externalUrl = ''; + // max number of states to store in an article's history + var firebaseMaxArticleHistory = 25; + // path to site root in firebase instance + var firebaseSiteRoot = ''; + // url of firebase instance to use + var firebaseUrl = ''; + // url of image api + var imageApiUrl = ''; + // key to access image api + var imageApiKey = ''; + // path to inline editor buttons configuration + var inlineObjectsPath = ''; + // url for internal links, those that are not accessible to the public + var internalUrl = ''; + // name of directive to use for live blog author selection + var liveBlogAuthorSelectorDirectiveName = ''; + // path to cms logo static asset + var navLogoPath = ''; + // path to shared directory + // TODO : remove once app is fully in pods + var sharedPath = ''; + // super features ctype + var superFeaturesType = ''; + // name of timezone for to use for times in the cms + var timezoneName = 'America/Chicago'; + // mappings for top bar templates + var topBarMappings = {}; + // path from internal url that points to an endpoint for unpublished content + var unpublishedPath = ''; + // path to video embeds + var videoPath = ''; + // thumbnail for inline video uploads + var videoThumbnailUrl = ''; + + this.addArticleEditoralStatus = function (label, value) { + checkOrError(label, _.isString, 'article editoral status label must be a string!'); + checkOrError(value, _.isString, 'article editoral status value must be a string!'); + + articleEditoralStatuses.push({ + label: label, + value: value + }); + + return this; + }; + + this.setApiUrlRoot = function (value) { + apiUrlRoot = checkOrError( + value, _.isString, + 'api url root must be a string!' + ); + return this; + }; + + this.setAutoAddAuthor = function (value) { + autoAddAuthor = checkOrError( + value, _.isBoolean, + 'auto add author must be a boolean!' + ); + return this; + }; + + this.setComponentPath = function (value) { + componentPath = checkOrError( + value, _.isString, + 'component path must be a string!' + ); + return this; + }; + + this.setContentPartialsPath = function (value) { + contentPartialsPath = checkOrError( + value, _.isString, + 'content partials path must be a string!' + ); + return this; + }; + + this.setDateTimeFormatHumanReadable = function (value) { + dateTimeFormatHumanReadable = checkOrError( + value, _.isString, + 'date time format human readable must be a string!' + ); + return this; + }; + + this.setDirectivePartialsPath = function (value) { + directivePartialsPath = checkOrError( + value, _.isString, + 'directive partials path must be a string!' + ); + return this; + }; + + this.setCmsName = function (value) { + cmsName = checkOrError( + value, _.isString, + 'cms name must be a string!' + ); + return this; + }; + + this.setContentApiUrl = function (value) { + contentApiUrl = checkOrError( + value, _.isString, + 'content api url must be a string!' + ); + return this; + }; + + this.setExternalUrl = function (value) { + externalUrl = checkOrError( + value, _.isString, + 'external url must be a string!' + ); + return this; + }; + + this.setFirebaseMaxArticleHistory = function (value) { + firebaseMaxArticleHistory = checkOrError( + value, _.isNumber, + 'firebase max article history must be a number!' + ); + return this; + }; + + this.setFirebaseSiteRoot = function (value) { + firebaseSiteRoot = checkOrError( + value, _.isString, + 'firebase site url must be a string!' + ); + return this; + }; + + this.setFirebaseUrl = function (value) { + firebaseUrl = checkOrError( + value, _.isString, + 'firebase url must be a string!' + ); + return this; + }; + + this.setImageApiUrl = function (value) { + imageApiUrl = checkOrError( + value, _.isString, + 'image api url must be a string!' + ); + window.BC_ADMIN_URL = imageApiUrl; + return this; + }; + + this.setImageApiKey = function (value) { + imageApiKey = checkOrError( + value, _.isString, + 'image api key must be a string!' + ); + window.BC_API_KEY = imageApiKey; + return this; + }; + + this.setInlineObjectsPath = function (value) { + inlineObjectsPath = checkOrError( + value, _.isString, + 'inline objects path must be a string!' + ); + return this; + }; + + this.setInternalUrl = function (value) { + internalUrl = checkOrError( + value, _.isString, + 'internal url must be a string!' + ); + return this; + }; + + this.setLiveBlogAuthorSelectorDirectiveName = function (value) { + liveBlogAuthorSelectorDirectiveName = checkOrError( + value, _.isString, + 'live blog author selector directive name must be a string!' + ); + return this; + }; + + this.setNavLogoPath = function (value) { + navLogoPath = checkOrError( + value, _.isString, + 'nav logo path must be a string!' + ); + return this; + }; + + this.setSharedPath = function (value) { + sharedPath = checkOrError( + value, _.isString, + 'shared path must be a string!' + ); + return this; + }; + + this.setSuperFeaturesType = function (value) { + superFeaturesType = checkOrError( + value, _.isString, + 'super features type must be a string!' + ); + return this; + }; + + this.setTimezoneName = function (name) { + timezoneName = checkOrError( + name, moment.tz.zone, + 'given timezone name "' + name + '" is not a valid timezone!' + ); + return this; + }; + + this.setTopBarMapping = function (name, template) { + var key = checkOrError( + name, _.isString, + 'top bar mapping name must be a string!' + ); + var value = checkOrError( + template, _.isString, + 'top bar mapping template must be a string!' + ); + topBarMappings[key] = value; + return this; + }; + + this.setUnpublishedPath = function (value) { + unpublishedPath = checkOrError( + value, _.isString, + 'unpublished path must be a string!' + ); + return this; + }; + + this.setVideoPath = function (value) { + videoPath = checkOrError( + value, _.isString, + 'video path must be a string!' + ); + return this; + }; + + this.setVideoThumbnailUrl = function (value) { + videoThumbnailUrl = checkOrError( + value, _.isString, + 'video thumbnail url must be a string!' + ); + return this; + }; + + this.$get = [ + function () { + return { + buildApiUrlRoot: pathBuilder(apiUrlRoot), + buildComponentPath: pathBuilder(componentPath), + buildContentApiUrl: pathBuilder(contentApiUrl), + buildContentPartialsPath: pathBuilder(contentPartialsPath), + buildDirectivePartialsPath: pathBuilder(directivePartialsPath), + buildExternalUrl: pathBuilder(externalUrl), + buildFirebaseSiteUrl: pathBuilder(Utils.path.join(firebaseUrl, firebaseSiteRoot)), + buildFirebaseUrl: pathBuilder(firebaseUrl), + buildImageApiUrl: pathBuilder(imageApiUrl), + buildInternalUrl: pathBuilder(internalUrl), + buildSharedPath: pathBuilder(sharedPath), + buildUnpublishedUrl: pathBuilder(Utils.path.join(internalUrl, unpublishedPath)), + buildVideoUrl: pathBuilder(Utils.path.join(externalUrl, videoPath)), + buildVideoThumbnailUrl: pathBuilder(videoThumbnailUrl), + getAutoAddAuthor: _.constant(autoAddAuthor), + getCmsName: _.constant(cmsName), + getDateTimeFormatHumanReadable: _.constant(dateTimeFormatHumanReadable), + getFirebaseMaxArticleHistory: _.constant(firebaseMaxArticleHistory), + getImageApiKey: _.constant(imageApiKey), + getInlineObjecsPath: _.constant(inlineObjectsPath), + getLiveBlogAuthorSelectorDirectiveName: _.constant(liveBlogAuthorSelectorDirectiveName), + getNavLogoPath: _.constant(navLogoPath), + getSuperFeaturesType: _.constant(superFeaturesType), + getTimezoneName: _.constant(timezoneName), + getArticleEditoralStatuses: _.constant(_.cloneDeep(articleEditoralStatuses)), + getTopBarMapping: function (name) { + if (_.has(topBarMappings, name)) { + return topBarMappings[name]; + } + throw new CmsConfigError('no top bar mapping exists for name "' + name + '"!'); + } + }; + } + ]; + + return this; + } + ]); + +'use strict'; + +window.BulbsCmsError = function (name, message) { + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(this, this.constructor); + } else { + this.stack = (new Error()).stack; + } + + this.name = name || 'CMS Error'; + this.message = message || 'Something was misconfigured.'; +}; +BulbsCmsError.prototype = Object.create(Error.prototype); +BulbsCmsError.prototype.constructor = window.BulbsCmsError; + +/** + * Create an error factory for a given provider. + * + * @param {string} name - used as name for instances. + * @returns factory that produces BulbsCmsError with the given name. + */ +BulbsCmsError.build = function (name) { + return function (message) { + return new BulbsCmsError(name, message); + }; +}; + +window.BulbsCmsConfigError = function (name, message) { + window.BulbsCmsError.call(this, name, message); +}; + +BulbsCmsConfigError.prototype = Object.create(window.BulbsCmsError.prototype); +BulbsCmsConfigError.prototype.constructor = window.BulbsCmsConfigError; + +BulbsCmsConfigError.build = function (name) { + return function (message) { + return new BulbsCmsConfigError( + 'Configuration Error (' + (name || 'name not given!') + ')', + message + ); + }; +}; + +'use strict'; + +angular.module('contentServices.factory', []) + .factory('ContentFactory', function (Restangular, contentApiConfig) { + return Restangular.withConfig(function (RestangularConfigurer) { + RestangularConfigurer.setBaseUrl(contentApiConfig.baseUrl); + }); + }) + .constant('contentApiConfig', { + baseUrl: '/cms/api/v1' + }); + +'use strict'; + +angular.module('contentServices.listService', [ + 'contentServices.factory' +]) + .service('ContentListService', function (_, $location, $q, ContentFactory) { + + var ContentListService = this; + // bind data object to service so we can use 2-way data binding + // WARNING: DO NOT ACCESS THIS DIRECTLY! + this._serviceData = { + filters: $location.search() || {}, + content: [], + totalItems: 0 + }; + // shorthand + var _data = this._serviceData; + + /** + * Update filters used for searching content data. Note: this does not actually + * update content. + * + * @param {object} addFilters - filters to append to current filters. + * @param {Boolean} [merge=false] - false to overwrite current filters. + */ + ContentListService.updateFilters = function (addFilters, merge) { + if (merge) { + _data.filters = + _.assign($location.search() || {}, addFilters); + } else { + _data.filters = addFilters; + } + $location.search(_data.filters); + return _data.filters; + }; + + /** + * Update content by performing a search. + * + * @param {object} addFilters - filters to append to current filters before search. + * @param {Boolean} [merge=false] - true to merge query parameters. + * @returns {Promise} resolves with new content data. + */ + ContentListService.$updateContent = function (addFilters, merge) { + var updateParams = ContentListService.updateFilters(addFilters || _data.filters, merge); + return ContentFactory.all('content').getList(updateParams) + .then(function (data) { + _data.content = data; + _data.totalItems = data.metadata.count; + // resolve promise with updated content list service data + return _data; + }); + }; + + /** + * Access data object, this will have a two-way data binding. + */ + ContentListService.getData = function () { + return _data; + }; + + }); + +'use strict'; + +angular.module('contentServices', [ + 'contentServices.factory', + 'contentServices.listService' +]); + +'use strict'; + +angular.module('copyButton', [ + 'bulbs.cms.site.config' +]) + .directive('copyButton', function (CmsConfig) { + return { + controller: function ($scope, $timeout) { + + $scope.okCopy = false; + $scope.okCopyButton = function () { + $scope.okCopy = true; + $timeout(function () { + $scope.okCopy = false; + }, 1000); + }; + }, + restrict: 'E', + scope: { + buttonClassesDefault: '@', + buttonClassesSuccess: '@', + buttonText: '@', + content: '@' + }, + templateUrl: CmsConfig.buildSharedPath('copy-button/copy-button.html') + }; + }); + +'use strict'; + +angular.module('filters.moment', [ + 'moment' +]) + .filter('date_string_to_moment', function(moment) { + return function (dateStr) { + // Try to parse non-empty strings + if (dateStr && dateStr.length) { + var m = moment(new Date(dateStr)); + if (m.isValid()) { + return m; + } + } + return null; + }; + }) + .filter('moment_to_date_string', function(moment) { + return function (momentObj) { + if (moment.isMoment(momentObj) && momentObj.isValid()) { + return momentObj.format(); + } else { + // Blank time string == not set + return ''; + } + }; + }); + +'use strict'; + +angular.module('listPage', [ + 'bulbs.cms.site.config', + 'bulbs.cms.utils', + 'confirmationModal', + 'copyButton', + 'lodash' +]) + .directive('listPage', function (CmsConfig) { + return { + controller: function (_, $scope, $location, $parse, Utils) { + $scope.pathJoin = Utils.path.join; + + $scope.name = $scope.modelFactory.identity(); + $scope.namePlural = $scope.modelFactory.identity(true); + $scope.fields = $scope.modelFactory.$fieldDisplays(); + $scope.$list = $scope.modelFactory.$collection(); + + // different types of filters that get combined to make seach query params + $scope.orderingFilter = {}; + $scope.searchFilter = {}; + $scope.toggledFilters = {}; + + $scope.copyContentInContext = function (record) { + var value = ''; + if ($scope.toolCopyContent) { + value = $parse($scope.toolCopyContent)({record: record}); + } + return value; + }; + + $scope.$retrieve = _.debounce(function (addParams) { + $scope.loadingResults = true; + var allParams = _.merge( + {}, + $scope.orderingFilter, + $scope.toggledFilters, + $scope.searchFilter, + addParams + ); + return $scope.$list.$refresh(allParams) + .$then(function () { + $scope.loadingResults = false; + }); + }, 250); + + // search functionality + $scope.$search = function (query) { + $scope.searchFilter = {}; + + if (query) { + $scope.searchFilter[$scope.searchParameter] = query; + } + + // go to page 1, new results may not have more than 1 page + $scope.$list.$page = 1; + + $scope.$retrieve(); + }; + + // toggled filters, only one set of these can be applied at a time + $scope.filterButtonsParsed = $scope.filterButtons(); + $scope.$toggleFilters = function (params) { + $scope.toggledFilters = params; + + // go to page 1, new results may not have more than 1 page + $scope.$list.$page = 1; + + $scope.$retrieve(); + }; + + // sorting functionality, only one field can be sorted at a time + $scope.sortingField = null; + $scope.sortDirection = 'asc'; + $scope.$sort = function (field) { + var direction; + if (field.title === $scope.sortingField) { + // clicked on same field, make direction opposite of what it is now + direction = $scope.sortDirection === 'desc' ? 'asc' : 'desc'; + } else { + // clicked on a different field, start with the opposite of default + direction = 'desc'; + } + + // do ordering request + (function (field, direction) { + $scope.orderingFilter = {ordering: field.getOrdering(direction)}; + $scope.$retrieve() + .$then(function () { + $scope.sortingField = field.title; + $scope.sortDirection = direction; + }); + })(field, direction); + }; + + $scope.$add = function () { + $location.path($scope.cmsEditPageUrl({ item: { id: 'new' } })); + }; + + $scope.$remove = function (item) { + item.$destroy(); + }; + + $scope.goToEditPage = function (item) { + $location.path($scope.cmsEditPageUrl({ item: item })); + }; + + // set the active filter, either the first button with active === true, + // or empty string for all + $scope.activeFilterButton = + _.chain($scope.filterButtonsParsed) + .findWhere({active: true}) + .tap(function (button) { + // cheat here and set the params for the first retrieve + if (button) { + $scope.toggledFilters = button.params; + } + }) + .result('title') + .value() || + ''; + // do initial retrieval + $scope.$retrieve(); + }, + link: function (scope, element, attrs) { + scope.showAddButton = !('disableAddButton' in attrs); + }, + restrict: 'E', + scope: { + cmsEditPageUrl: '&', + filterButtons: '&', + modelFactory: '=', + searchParameter: '@', + toolCopyContent: '@', + utilityButtons: '=' + }, + templateUrl: CmsConfig.buildSharedPath('list-page/list-page.html') + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp.nonRestmodListPage', [ + 'bulbs.cms.site.config', + 'confirmationModal', + 'copyButton', + 'lodash', + 'bulbs.cms.utils' +]) + .directive('nonRestmodListPage', function (CmsConfig) { + return { + controller: function (_, $scope, $location, $parse, Utils) { + + $scope.pathJoin = Utils.path.join; + + // different types of filters that get combined to make seach query params + $scope.orderingFilter = {}; + $scope.searchFilter = {}; + $scope.toggledFilters = {}; + $scope.pageNumber = 1; + + $scope.copyContentInContext = function (record) { + var value = ''; + if ($scope.toolCopyContent) { + value = $parse($scope.toolCopyContent)({record: record}); + } + return value; + }; + + $scope.$retrieve = _.debounce(function (addParams) { + $scope.loadingResults = true; + var allParams = _.merge( + {}, + $scope.orderingFilter, + $scope.toggledFilters, + $scope.searchFilter, + addParams + ); + return $scope.getItems({params: allParams}) + .then(function (response) { + $scope.items = response.results; + $scope.loadingResults = false; + }); + }, 250); + + // search functionality + $scope.$search = function (query) { + $scope.searchFilter = {}; + + if (query) { + $scope.searchFilter[$scope.searchParameter] = query; + } + + // go to page 1, new results may not have more than 1 page + $scope.pageNumber = 1; + + $scope.$retrieve(); + }; + + // toggled filters, only one set of these can be applied at a time + $scope.filterButtonsParsed = $scope.filterButtons(); + $scope.$toggleFilters = function (params) { + $scope.toggledFilters = params; + + // go to page 1, new results may not have more than 1 page + $scope.pageNumber = 1; + + $scope.$retrieve(); + }; + + // sorting functionality, only one field can be sorted at a time + $scope.sortingField = null; + $scope.sortDirection = 'asc'; + $scope.$sort = function (fieldName) { + var direction; + if (fieldName === $scope.sortingField) { + // clicked on same field, make direction opposite of what it is now + direction = $scope.sortDirection === 'desc' ? '' : '-'; + } else { + // clicked on a different field, start with the opposite of default + direction = '-'; + } + + // do ordering request + $scope.orderingFilter = {ordering: direction + fieldName}; + $scope.$retrieve($scope.orderingFilter.ordering) + .then(function () { + $scope.sortingField = fieldName; + $scope.sortDirection = direction === '-' ? 'desc' : 'asc'; + }); + }; + + $scope.cellContents = function (item, field) { + var cellContents = '-'; + + if (_.isFunction(field.content)) { + cellContents = field.content(item); + } else if (_.isString(field.content)) { + cellContents = item[field.content]; + } else if (field.sorts) { + cellContents = item[field.sorts]; + } + return cellContents; + }; + + $scope.$add = function () { + $location.path($scope.cmsEditPageUrl({ item: { id: 'new' } })); + }; + + $scope.$remove = function (removedItem) { + $scope.destroyItem({item: removedItem}); + _.remove($scope.items, function(item) { + return item === removedItem; + }); + }; + + $scope.goToEditPage = function (item) { + $location.path($scope.cmsEditPageUrl({ item: item })); + }; + + // set the active filter, either the first button with active === true, + // or empty string for all + $scope.activeFilterButton = + _.chain($scope.filterButtonsParsed) + .findWhere({active: true}) + .tap(function (button) { + // cheat here and set the params for the first retrieve + if (button) { + $scope.toggledFilters = button.params; + } + }) + .result('title') + .value() || + ''; + + // do initial retrieval + $scope.$retrieve(); + }, + link: function (scope, element, attrs) { + scope.showAddButton = !('disableAddButton' in attrs); + }, + restrict: 'E', + scope: { + cmsEditPageUrl: '&', // url to edit page, will be postfixed with id or 'new' + destroyItem: '&', // returns promise, deletes given item + getItems: '&', // function returns promise, recieves search params + filterButtons: '&', // settings for filter buttons + // { title:'human readable', active:true, params:queryParams object } + modelFields: '&', // list of objects { sorts: x, title: y} + modelName: '&', // list page title + modelNamePlural: '&', // list page title pluralized + searchParameter: '@', // key for text search param + toolCopyContent: '@', // content to copy with copy buttons, where `record` is the record being copied, leave empty to hide copy button + }, + templateUrl: CmsConfig.buildSharedPath('non-restmod-list-page/non-restmod-list-page.html') + }; + }); + +'use strict'; + +angular.module('cms.tunic.config', [ + 'lodash' +]) + .provider('TunicConfig', [ + '_', + function TunicConfigProvider (_) { + // relative api path, rel to backendRoot + var apiPath = ''; + // root for all backend requests + var backendRoot = ''; + // Tunic API request token + var requestToken = ''; + + var error = function (message) { + return new Error('Configuration Error (TunicConfig) ' + message); + }; + + this.setApiPath = function (value) { + if (_.isString(value)) { + apiPath = value; + } else { + throw error('apiPath must be a string!'); + } + return this; + }; + + this.setBackendRoot = function (value) { + if (_.isString(value)) { + backendRoot = value; + } else { + throw error('backendRoot must be a string!'); + } + return this; + }; + + this.setRequestToken = function (value) { + if (_.isString(value)) { + requestToken = value; + } else { + throw error('requestToken must be a string!'); + } + return this; + }; + + this.$get = function () { + return { + getRequestToken: _.constant(requestToken), + /** + * Create an absolute api url. + * + * @param {string} relUrl - relative url to get the absolute api url for. + * @returns absolute api url. + */ + buildBackendApiUrl: function (relUrl) { + return backendRoot + apiPath + (relUrl || ''); + }, + + /** + * Check if a given url should be intercepted by this library's interceptor. + * + * @param {string} url - Url to test against matchers. + * @returns {boolean} true if url should be intercepted, false otherwise. + */ + shouldBeIntercepted: function (url) { + var urlTest = backendRoot + apiPath; + return urlTest !== '' && url.startsWith(urlTest); + } + }; + }; + } + ]); + +'use strict'; + +angular.module('cms.tunic.interceptor', [ + 'cms.tunic.config' +]) + .service('TunicInterceptor', [ + 'TunicConfig', + function (TunicConfig) { + + this.request = function (config) { + if (TunicConfig.shouldBeIntercepted(config.url)) { + config.headers = config.headers || {}; + config.headers.Authorization = 'Token ' + TunicConfig.getRequestToken(); + } + return config; + }; + + return this; + } + ]); + +'use strict'; + +angular.module('cms.tunic', [ + 'cms.tunic.config', + 'cms.tunic.interceptor' +]); + +'use strict'; + +angular.module('bulbs.cms.utils', [ + 'lodash' +]) + .provider('Utils', [ + '_', + function (_) { + + var Utils = this; + + Utils.slugify = function (text) { + // https://gist.github.com/mathewbyrne/1280286 + return text.toString().toLowerCase() + .replace(/\s+/g, '-') // Replace spaces with - + .replace(/[^\w\-]+/g, '') // Remove all non-word chars + .replace(/\-\-+/g, '-') // Replace multiple - with single - + .replace(/^-+/, '') // Trim - from start of text + .replace(/-+$/, ''); // Trim - from end of text + }; + + /** + * In given list, swaps item at indexFrom with item at indexTo. + * + * @param {Array} list - list to swap items in. + * @param {Number} indexFrom - Index to move content from. + * @param {Number} indexTo - Index to move content to. + * @param {Boolean} allowOutOfBounds - true to perform move when given + * indexTo that's out of bounds. + * @returns {Boolean} true if item was moved, false otherwise. + */ + Utils.moveTo = function (list, indexFrom, indexTo, allowOutOfBounds) { + var ret = false; + var modIndexTo = indexTo; + + if (allowOutOfBounds) { + if (indexTo < 0) { + modIndexTo = 0; + } else if (indexTo >= list.length) { + modIndexTo = list.length - 1; + } + } + + if (indexFrom >= 0 && indexFrom < list.length && + modIndexTo >= 0 && modIndexTo < list.length) { + var splicer = list.splice(indexFrom, 1, list[modIndexTo]); + if (splicer.length > 0) { + list[modIndexTo] = splicer[0]; + ret = true; + } + } + + return ret; + }; + + /** + * In given list, remove an item at given index. + * + * @param {Array} list - list to remove item from. + * @param {Number} index - index of item to remove. + * @returns {Boolean} true if item was removed, false otherwise. + */ + Utils.removeFrom = function (list, index) { + return list.splice(index, 1).length > 0; + }; + + /** + * Transform an object into url params. + * ONLY knows what to do with a flat params object. + * Similar to jQuery.param + * @param {Object} params - Object of params to serialize. + * @returns {String} query - a url querystring (is prefixed with '?') + */ + Utils.param = function (params) { + if (!params) { + params = {}; + } + var keys = Object.keys(params); + var query = ''; + if (keys.length > 0) { + query += '?'; + query += keys.map(function (key) { + return key + '=' + params[key]; + }) + .join('&'); + } + return query; + }; + + Utils.path = { + /** + * Join path strings. + * + * @param {...String} A variable number of strings to join into path. + * @returns {String} joined path. + */ + join: function () { + var sep = '/'; + var replace = new RegExp(sep + '{1,}', 'g'); + var argsArr = _.flattenDeep(arguments); + + // if there's a protocol, make sure to ignore it when replacing sep + var protocolPrefix = ''; + if (argsArr.length > 0 && typeof(argsArr[0]) === 'string') { + var matches = argsArr[0].match(/^(https?:)?\/\//); + if (matches) { + protocolPrefix = matches[0]; + argsArr[0] = argsArr[0].replace(protocolPrefix, ''); + } + } + return protocolPrefix + argsArr.join(sep).replace(replace, sep); + } + }; + + Utils.$get = [ + '$q', + function ($q) { + /** + * Create a lock to apply to wrapped functions so that only one of the + * functions using this lock can be run at a time. + * + * @returns {function} function that can be used to wrap functions that + * should be locked by this instance of a lock. The wrapped function can + * then be called as the original function would be called, but the result + * will be wrapped in a promise. + */ + Utils.buildLock = function () { + var locked = false; + + var wrapper = function (func) { + + return function () { + if (!locked) { + locked = true; + + return $q + .when(func.apply(null, arguments)) + .finally(function () { + locked = false; + }); + } else { + return $q.reject(); + } + }; + }; + + wrapper.isLocked = function () { + return locked; + }; + + return wrapper; + }; + + return Utils; + } + ]; + + return Utils; + } + ]); + +'use strict'; + +angular.module('videoList.video.directive', [ + 'bulbs.cms.site.config', + 'filters.moment' +]) + .directive('videoListVideo', function (CmsConfig) { + return { + restrict: 'E', + scope: { + model: '=' + }, + templateUrl: CmsConfig.buildSharedPath('video-list/video-list-video/video-list-video.html') + }; + }); + +'use strict'; + +angular.module('videoList', [ + 'autocompleteBasic', + 'bulbs.cms.site.config', + 'bulbs.cms.utils', + 'jquery', + 'ui.sortable', + 'VideohubClient.api', + 'VideohubClient.settings', + 'videoList.video.directive' +]) + .directive('videoList', function ($, CmsConfig) { + return { + controller: function (_, $scope, Utils, Video, VIDEOHUB_DEFAULT_CHANNEL) { + + $scope.videoChannel = VIDEOHUB_DEFAULT_CHANNEL; + + $scope.moveUp = function (index) { + Utils.moveTo($scope.videos, index, index - 1); + $scope.onUpdate(); + }; + + $scope.moveDown = function (index) { + Utils.moveTo($scope.videos, index, index + 1); + $scope.onUpdate(); + }; + + $scope.delete = function (index) { + Utils.removeFrom($scope.videos, index); + $scope.onUpdate(); + }; + + $scope.addVideo = function (video) { + $scope.addVideoCallback({video: video}); + $scope.onUpdate(); + }; + + $scope.searchVideos = function (query) { + return Video.$postSearch({ + query: query, + channel: VIDEOHUB_DEFAULT_CHANNEL + }); + }; + + }, + link: function (scope, element, attr) { + + scope.sortableOptions = { + beforeStop: function (e, ui) { + ui.helper.css('margin-top', 0); + }, + change: function (e, ui) { + ui.helper.css('margin-top', $(window).scrollTop()); + }, + containment: 'video-list', + distance: 3, + opacity: 0.75, + placeholder: 'dropzone', + start: function (e, ui) { + ui.helper.css('margin-top', $(window).scrollTop()); + } + }; + }, + restrict: 'E', + scope: { + addVideoCallback: '&addVideo', + videos: '=', + onUpdate: '&' + }, + templateUrl: CmsConfig.buildSharedPath('video-list/video-list.html') + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('activeNav', function ($location) { + return { + template: '
  • {{label}}
  • ', + restrict: 'E', + scope: {}, + replace: true, + link: function postLink(scope, element, attrs) { + scope.href = attrs.href; + scope.label = attrs.label; + if ($location.path().indexOf(scope.href) === 0) { + element.addClass('active'); + } + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('addImage', function ($http, $window) { + return { + restrict: 'E', + templateUrl: '/views/add-image.html', + scope: { + article: '=' + }, + link: function (scope, element, attrs) { + var attrName = attrs.attrName || 'images'; + scope.article[attrName] = scope.article[attrName] || []; + + if (attrs.caption === 'false') { scope.hideCaption = true; } + scope.format = attrs.format || 'jpg'; + scope.crop = attrs.crop || '16x9'; + scope.placeholderText = attrs.placeholderText || 'Optional Image'; + + scope.addAnImage = function () { + $window.uploadImage({ + onSuccess: function (data) { + scope.$apply(function () { + scope.article[attrName].push({ + id: data.id.toString(), + alt: null, + caption: null + }); + setTimeout($window.picturefill, 200); + }); + }, + onError: function (data) { + scope.$apply(function () { + $window.alert('Error: ', data); + }); + }, + onProgress: function (data) { + + } + }); + }; + } + + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('articlecontainer', function () { + return { + restrict: 'E', + templateUrl: '/views/promotion-tool-article-container.html', + scope: { + 'article': '=' + }, + link: function postLink(scope, element, attrs) { + scope.ratio = attrs.ratio; + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('authorsField', function ($, CmsConfig, userNameDisplayFilter, Utils) { + return { + templateUrl: '/views/taglike-autocomplete-field.html', + restrict: 'E', + replace: true, + scope: { + article: '=', + inputLabelText: '@', + inputLabelTextSub: '@' + }, + link: function postLink(scope, element, attrs) { + scope.name = 'author'; + scope.label = scope.inputLabelText || 'Authors'; + scope.labelSub = scope.inputLabelTextSub; + scope.placeholder = 'Authors'; + scope.resourceUrl = CmsConfig.buildApiUrlRoot( + 'author', + Utils.param({ + ordering: 'name', + search: '' + }) + ); + scope.display = userNameDisplayFilter; + + scope.$watch('article.authors', function () { + scope.objects = scope.article.authors; + }, true); + + scope.add = function (o, input) { + for (var t in scope.article.authors) { + if (scope.article.authors[t].id === o.id) { return; } + } + scope.article.authors.push(o); + $(input).val(''); + }; + + scope.delete = function (e) { + var author = $(e.target).parents('[data-taglikeobject]').data('taglikeobject'); + var id = author.id; + var newauthors = []; + for (var i in scope.article.authors) { + if (scope.article.authors[i].id !== id) { + newauthors.push(scope.article.authors[i]); + } + } + scope.article.authors = newauthors; + }; + + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('bulbsAutocomplete', function ($http, $location, $compile, $timeout, $, Login, Raven) { + + var autocomplete_dropdown_template = + ''; + + return { + restrict: 'AC', + link: function postLink(scope, element, attrs) { + var $elem = $(element).find('input'); + $elem.attr('autocomplete', 'off'); + var dropdown = $($compile(autocomplete_dropdown_template)(scope)); + + $(dropdown).css({ + position: 'absolute', + top: $elem.position().top + $elem.outerHeight(), + left: $elem.position().left, + minWidth: $elem.outerWidth(), + display: 'none' + }); + $elem.parent().append(dropdown); + $(dropdown).fadeIn('fast'); + + // Observe the element's dimensions. + scope.$watch( + function () { + return { + top: $elem.position().top + $elem.outerHeight(), + left: $elem.position().left, + minWidth: $elem.outerWidth() + }; + }, + function (newValue, oldValue) { + $(dropdown).css({ + top: newValue.top, + left: newValue.left, + minWidth: newValue.minWidth + }); + }, + true + ); + + var inputCounter = 0, inputTimeout; + + $elem.on('focus', function (e) { + $elem.on('input', function () { + var val = $elem.val(); + if (val === '') { + scope.autocomplete_list = []; + } else { + $timeout.cancel(inputTimeout); + inputTimeout = $timeout(function () { getAutocompletes(val); }, 200); + + if (inputCounter > 2) { + getAutocompletes(val); + } + } + }); + $(dropdown).fadeIn('fast'); + }); + + function getAutocompletes(val) { + $timeout.cancel(inputTimeout); + inputCounter = 0; + $http({ + method: 'GET', + url: scope.resourceUrl + val + }).success(function (data) { + var results = data.results || data; + scope.autocomplete_list = results.splice(0, 5); + }).error(function (data, status, headers, config) { + Raven.captureMessage('Error in getAutocompletes', {extra: data}); + }); + } + + $elem.on('blur', function (e) { + $(dropdown).fadeOut('fast'); + }); + + $(dropdown).on('mouseover', '.entry', function (e) { + $(dropdown).find('.selected').removeClass('selected'); + $(this).addClass('selected'); + }); + + $elem.on('keyup', function (e) { + if (e.keyCode === 40) { //down + if ($('div.selected', dropdown).length === 0) { + $('div.entry', dropdown).first().addClass('selected'); + } else { + var curDownSelect = $('div.selected', dropdown); + var curDownSelectNext = curDownSelect.next('div'); + if (curDownSelectNext.length === 0) { + $('div.entry', dropdown).first().addClass('selected'); + } else { + curDownSelectNext.addClass('selected'); + } + curDownSelect.removeClass('selected'); + } + } + if (e.keyCode === 38) { //up + if ($('div.selected', dropdown).length === 0) { + $('div.entry', dropdown).last().addClass('selected'); + } else { + var curSelect = $('div.selected', dropdown); + var curSelectNext = curSelect.prev('div'); + if (curSelectNext.length === 0) { + $('div.entry', dropdown).last().addClass('selected'); + } else { + curSelectNext.addClass('selected'); + } + curSelect.removeClass('selected'); + } + } + if (e.keyCode === 13) { + var selected = $('div.selected', dropdown); + if (selected.length === 0) { scope.onClick($elem.val(), true); } + selected.click(); + } + }); + + scope.onClick = function (o, freeForm) { + scope.add(o, $elem, freeForm || false); + scope.autocomplete_list = []; + //if (!scope.$$phase) scope.$apply(); + }; + + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('cmsNotification', function () { + return { + restrict: 'E', + templateUrl: '/views/cms-notification.html', + scope: { + cmsNotification: '=' + }, + controller: 'CmsNotificationCtrl' + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('cmsNotifyContainer', function () { + return { + restrict: 'E', + scope: {}, + templateUrl: '/views/cms-notify-container.html', + controller: 'CmsNotifyContainerCtrl' + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('contributorField', function ($) { + return { + templateUrl: '/views/textlike-autocomplete-field.html', + restrict: 'E', + replace: true, + scope: { + override: '=' + }, + link: function postLink(scope, element, attrs) { + scope.name = 'contributor'; + scope.label = 'Contributors'; + scope.placeholder = 'Contributors'; + scope.resourceUrl = '/cms/api/v1/author/?ordering=name&search='; + + scope.$watch('override.contributor', function () { + if ((scope.override.hasOwnProperty('contributor')) && (scope.override.contributor !== null)) { + scope.model = scope.override.contributor.full_name || scope.override.contributor.fullName; + } + }); + + scope.display = function (o) { + return (o && o.full_name) || ''; + }; + + scope.add = function(o, input) { + if ((scope.override.hasOwnProperty('contributor')) && scope.override.contributor !== null) { + if (scope.override.contributor.id === o.id) { + return; + } + } + + scope.override.contributor = o; + $('#feature-type-container').removeClass('newtag'); + $('#feature-type-container').addClass('newtag'); + }; + + scope.delete = function (e) { + scope.override.contributor = null; + scope.model = null; + }; + + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('createContent', function ($http, $window, $, IfExistsElse, Login, + ContentFactory, CmsConfig, Raven) { + return { + restrict: 'E', + templateUrl: CmsConfig.buildDirectivePartialsPath('create-content.html'), + controller: function ($scope) { + $scope.gotTags = false; + $scope.gotUser = false; + $scope.gotSave = false; + $scope.$watch(function () { + return $scope.gotTags && $scope.gotUser && $scope.gotSave; + }, function (val) { + if (val) { + saveArticle($scope.init); + } + }); + + $scope.newArticle = function (e) { + var init = {'title': $scope.newTitle}; + angular.extend($scope.init, init); + + if ($scope.tag) { + IfExistsElse.ifExistsElse( + ContentFactory.all('tag').getList({ + ordering: 'name', + search: $scope.tag, + types: 'core_section' + }), + {slug: $scope.tag}, + function (tag) { $scope.init.tags = [tag]; $scope.gotTags = true; }, + function (value) { console.log('couldnt find tag ' + value.slug + ' for initial value'); }, + function (data, status, headers, config) { Raven.captureMessage('Error Creating Article', {extra: data}); } + ); + } else { + $scope.gotTags = true; + } + + if (CmsConfig.getAutoAddAuthor()) { + ContentFactory.one('me').get().then(function (data) { + $scope.init.authors = [data]; + $scope.gotUser = true; + }); + } else { + $scope.gotUser = true; + } + + $scope.gotSave = true; + }; + + function saveArticle() { + $('button.go').removeClass('btn-danger').addClass('btn-success').html(' Going'); + $http({ + url: '/cms/api/v1/content/?doctype=' + $scope.contentType, + method: 'POST', + data: $scope.init + }).success(function (resp) { + var new_id = resp.id; + var new_path = '/cms/app/edit/' + new_id + '/'; + if ($scope.rating_type) { + new_path += '?rating_type=' + $scope.rating_type; + } + $window.location.href = $window.location.origin + new_path; + }).error(function (data, status, headers, config) { + if (status === 403) { + $('button.go') + .html(' Please Log In'); + } else { + $('button.go').removeClass('btn-success').addClass('btn-danger').html(' Error'); + } + $scope.gotSave = false; + }); + } + + + }, + link: function (scope, element, attrs) { + //HEY THIS SUCKS + //TODO: This sucks! + scope.panel = 1; + + $(element).find('a.create-content').on('click', function (e) { + $('a.create-content.active').removeClass('active'); + $(this).addClass('active'); + }); + + $(element).find('a.create-content').on('click', function (e) { + scope.contentTypeLabel = $(this).text(); + scope.contentType = $(this).data('content_type') || null; + scope.init = $(this).data('init') || {}; + scope.tag = $(this).data('tag') || null; + scope.rating_type = $(this).data('rating_type') || null; + scope.$apply(); + + if ($(this).hasClass('go-next')) { + e.preventDefault(); + + $('#create button.next-pane').click(); + return false; + } + + return true; + }); + + $('button.next-pane:not(.hide)').on('click', function (e) { + scope.panel = 2; + $('.new-title').focus(); + }); + + $(element).on('keydown', '.editor', function (e) { + if (e.keyCode === 13 && scope.newTitle) { + $(element).find('.go').click(); + } + }); + + $('#create').on('hidden.bs.modal', function () { + scope.newTitle = ''; + scope.panel = 1; + }); + + } + + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('devicepreview', function ($) { + return { + restrict: 'E', + templateUrl: '/views/devicepreview.html', + link: function (scope, element, attrs) { + + var pP = $('#page-prev'), + tN = pP.find('.nav a'), + cO = pP.find('.tab-content .active'); + + tN.click(function (e) { + var newId = $(this).attr('href').split('#')[1]; + e.preventDefault(); + cO.attr('id', newId); + }); + + $('#page-prev').on('show.bs.collapse', function () { + $(this).find('.fa').removeClass('fa-plus-square-o').addClass('fa-minus-square-o'); + }); + + $('#page-prev').on('hide.bs.collapse', function () { + $(this).find('.fa').removeClass('fa-minus-square-o').addClass('fa-plus-square-o'); + }); + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('encodeStatus', function ($http, $interval, $, Zencoder) { + return { + templateUrl: '/views/encode-status.html', + restrict: 'E', + link: function postLink(scope, element, attrs) { + scope.encodingVideos = {}; + + scope.$watch(function () { + return Zencoder.encodingVideos; + }, function () { + updateEncodeStatuses(); + }, true); + + $interval(function () { + $('iframe').filter(function () { return this.src.match(/\/video\/embed\/?/); }).each(function () { + var idRegex = /\/video\/embed\/?\?id=(\d+)/; + var id = idRegex.exec(this.src)[1]; + if (!(id in Zencoder.encodingVideos)) { + Zencoder.getVideo(id).then(function (data) { + Zencoder.encodingVideos[id] = data.data; + }); + } + }); + updateEncodeStatuses(); + }, 5000); + + function updateEncodeStatuses() { + var updateEncodeStatus = function (i) { + return (function (videoid) { + if (Zencoder.encodingVideos[videoid].encode_status_endpoints && + Zencoder.encodingVideos[videoid].encode_status_endpoints.json) { + + $http({ + method: 'GET', + url: Zencoder.encodingVideos[videoid].encode_status_endpoints.json, + headers: { + 'X-CSRFToken': undefined + }, + }).success(function (data) { + scope.encodingVideos[videoid].job_status = data; + if (data.state === 'finished') { + scope.encodingVideos[videoid].finished = true; + } + + }); + } + })(i); + }; + + for (var i in Zencoder.encodingVideos) { + if (scope.encodingVideos[i] && scope.encodingVideos[i].finished) { + continue; + } + scope.encodingVideos[i] = Zencoder.encodingVideos[i]; + updateEncodeStatus(i); + } + } + + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('featuretypeField', function (IfExistsElse, ContentFactory, Raven, $) { + return { + templateUrl: '/views/textlike-autocomplete-field.html', + restrict: 'E', + scope: { + article: '=', + hideLabel: '=' + }, + replace: true, + link: function postLink(scope, element, attrs) { + scope.name = 'feature_type'; + scope.label = 'Feature Type'; + scope.placeholder = 'Feature Type'; + scope.resourceUrl = '/cms/api/v1/things/?type=feature_type&q='; + + scope.$watch('article.feature_type', function () { + scope.model = scope.article.feature_type; + }); + + scope.display = function (o) { + return (o && o.name) || ''; + }; + + scope.add = function (o, input, freeForm) { + var fVal = freeForm ? o : o.name; + IfExistsElse.ifExistsElse( + ContentFactory.all('things').getList({ + type: 'feature_type', + q: fVal + }), + {name: fVal}, + function (ft) { scope.article.feature_type = ft.name; $('#feature-type-container').removeClass('newtag'); }, + function (value) { scope.article.feature_type = value.name; $('#feature-type-container').addClass('newtag'); }, + function (data, status) { Raven.captureMessage('Error Adding Feature Type', {extra: data}); } + ); + }; + + scope.delete = function (e) { + scope.article.feature_type = null; + }; + + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('hideIfForbidden', function ($http) { + function hideElement(element) { + element.addClass('hidden'); + } + + return { + restrict: 'A', + link: function postLink(scope, element, attrs) { + $http({ + method: 'OPTIONS', + url: attrs.optionsUrl, + noPermissionIntercept: true + }).success(function (data, status) { + //I guess 403s aren't errors? I dont know. + if (status === 403) { + hideElement(element); + } + }).error(function (data, status) { + if (status === 403) { + hideElement(element); + } + }); + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('lazyInclude', function ($, $compile, $q, $http, $templateCache, + Gettemplate) { + /* + this is like ng-include but it doesn't compile/render the included template + until the child element is visible + intended to help with responsiveness by cutting down requests and rendering time + */ + + return { + restrict: 'A', + scope: true, + link: function (scope, element, attrs) { + var templateUrl = '/views/' + attrs.template; + var $element = $(element); + + scope.$evalAsync(function () { + scope.$watch(function () { + return $element.is(':visible'); + }, function (visible) { + if (visible && !scope.loaded) { + scope.loaded = true; + Gettemplate.get(templateUrl).then(function (html) { + var template = angular.element(html); + var compiledEl = $compile(template)(scope); + element.html(compiledEl); + element.css('height', 'auto'); + }); + } + }); + }); + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('loggedInUser', function (CurrentUserApi) { + return { + restrict: 'E', + replace: true, + templateUrl: '/views/logged-in-user.html', + scope: {}, + link: function (scope, element, attrs) { + CurrentUserApi.getCurrentUserWithCache() + .then(function (user) { + scope.currentUser = user; + + scope.logout = CurrentUserApi.logout; + }); + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('navBar', function (CmsConfig, CurrentUserApi) { + return { + restrict: 'E', + scope: false, + templateUrl: function (tElement, tAttrs) { + return CmsConfig.getTopBarMapping(tAttrs.view); + }, + link: function (scope) { + scope.NAV_LOGO = CmsConfig.getNavLogoPath(); + + CurrentUserApi.getCurrentUserWithCache() + .then(function (user) { + scope.currentUser = user; + }); + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('responsiveImage', function ($window, $) { + return { + link: function (scope, element, attrs) { + attrs.$observe('imageId', function (val) { + $(element).find('img').remove(); + element.attr('data-image-id', attrs.imageId); + element.attr('data-crop', attrs.crop); + if (!attrs.imageId || !$(element).is(':visible')) { + return; + } + $window.pictureFillElement(element[0]); + element.show(); + }); + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('roleField', function ($http, $, Raven) { + return { + templateUrl: '/views/rolefield.html', + restrict: 'E', + replace: true, + scope: { + model: '=' + }, + + link: function (scope, element, attrs) { + var resourceUrl = '/cms/api/v1/contributions/role/'; + + scope.roleValue = null; + scope.roleOptions = []; + + scope.$watch('model.role', function () { + for (var i = 0; i < scope.roleOptions.length; i++) { + if (scope.roleOptions[i].id === Number(scope.roleValue)) { + scope.model.role = scope.roleOptions[i]; + } + } + scope.roleValue = scope.model.role.id; + }); + + $http({ + method: 'GET', + url: resourceUrl + }).success(function (data) { + scope.roleOptions = data.results || data; + }).error(function (data, status, headers, config) { + Raven.captureMessage('Error fetching Roles', {extra: data}); + }); + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('saveButtonOld', function ($q, $timeout, $window) { + return { + replace: true, + restrict: 'E', + templateUrl: '/views/save-button.html', + scope: { + 'getPromise': '&', + 'saveCbk': '&onSave', + 'config': '=?', + 'colors': '@?colorStyling' + }, + link: function (scope, element, attrs) { + scope.colors_tmp = scope.colors; + + attrs.$observe('config', function (val) { + if (!angular.isDefined(val)) { + scope.config = { + idle: ' Save', + busy: 'Saving', + finished: 'Saved', + error: 'Error' + }; + } + }); + + scope.save = function () { + if (attrs.confirmClickWith) { + var message = attrs.confirmClickWith; + if (!$window.confirm(message)) { return; } + } + + scope.colors = scope.colors_tmp; + element + .prop('disabled', true) + .html(' ' + scope.config.busy); + + var save_promise = scope.getPromise(); + + var saveSuccess = function (result) { + scope.colors = scope.colors_tmp; + element + .prop('disabled', false) + .html(' ' + scope.config.finished); + + return $timeout(function () { + element.html(scope.config.idle); + }, 1000) + .then(function () { + return result; + }); + }; + + if (save_promise) { + var promise = save_promise + .then(saveSuccess) + .catch( + function (reason) { + scope.colors = 'btn-danger'; + element + .prop('disabled', false) + .html(' ' + scope.config.error); + + return $q.reject(reason); + }); + if (scope.saveCbk) { + scope.saveCbk({promise: promise}); + } + } else { + // no save promise was set, just run success function + saveSuccess(); + } + }; + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('sectionsField', function (_, IfExistsElse, ContentFactory, Raven, + $) { + return { + templateUrl: '/views/taglike-autocomplete-field.html', + restrict: 'E', + replace: true, + link: function postLink(scope, element, attrs) { + scope.name = 'section'; + scope.label = 'Sections'; + scope.placeholder = 'Enter a section'; + scope.resourceUrl = '/cms/api/v1/tag/?ordering=name&types=core_section&search='; + scope.display = function (o) { + return o.name; + }; + + scope.$watch('article.tags', function () { + scope.objects = _.where(scope.article.tags, {type: 'core_section'}); + }, true); + + scope.add = function (o, input, freeForm) { + var tagVal = freeForm ? o : o.name; + IfExistsElse.ifExistsElse( + ContentFactory.all('tag').getList({ + ordering: 'name', + search: tagVal, + types: 'core_section' + }), + {name: tagVal}, + function (tag) { scope.article.tags.push(tag); }, + function () { console.log('Can\'t create sections.'); }, + function (data, status) { Raven.captureMessage('Error Adding Section', {extra: data}); } + ); + $(input).val(''); + }; + + scope.delete = function (e) { + var tag = $(e.target).parents('[data-taglikeobject]').data('taglikeobject'); + var name = tag.name; + var newtags = []; + for (var i in scope.article.tags) { + if (scope.article.tags[i].name !== name) { + newtags.push(scope.article.tags[i]); + } + } + scope.article.tags = newtags; + }; + + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('slideshowPane', function ($http, $window, $compile, $) { + return { + restrict: 'E', + templateUrl: '/views/slideshow-pane.html', + scope: { + article: '=', + image: '=', + index: '=' + }, + link: function (scope, element, attrs) { + var $element = $(element); + + if (attrs.caption === 'false') { + scope.hideCaption = true; + } + + scope.format = attrs.format || 'jpg'; + scope.crop = attrs.crop || '16x9'; + + scope.removeImage = function (index) { + scope.article.slides.splice(index, 1); + }; + + scope.editImage = function (index) { + var loadingClass = 'loading-class'; + + $window.openImageDrawer( + scope.article.slides[index].id, + function (data) { + function removeLoadingGif() { + $element.find('.image .' + loadingClass).remove(); + } + + removeLoadingGif(); + + if ($element.find('.image').data('imageId') === data.id) { + return; + } + + $element.find('.image img').on('load', removeLoadingGif); + $element.find('.image img').after( + '' + ); + + scope.article.slides[index].id = data.id.toString(); + scope.$apply(); + $window.picturefill(); + if ($element.find('.image img')[0].complete) { removeLoadingGif(); } + }, + function () { return; }, + function (oldImage) { + scope.article.slides[index] = oldImage; + $window.picturefill(); + } + ); + }; + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('tagsField', function (_, IfExistsElse, ContentFactory, Raven, $) { + return { + templateUrl: '/views/taglike-autocomplete-field.html', + restrict: 'E', + scope: { + article: '=' + }, + replace: true, + link: function postLink(scope, element, attrs) { + scope.name = 'tag'; + scope.label = 'Tags'; + scope.placeholder = 'Enter a tag'; + scope.resourceUrl = '/cms/api/v1/tag/?ordering=name&types=content_tag&search='; + scope.display = function (o) { + return o.name; + }; + + scope.$watch('article.tags', function () { + scope.objects = _.where(scope.article.tags, {type: 'content_tag'}); + }, true); + + scope.add = function (o, input, freeForm) { + var tagVal = freeForm ? o : o.name; + IfExistsElse.ifExistsElse( + ContentFactory.all('tag').getList({ + ordering: 'name', + search: tagVal + }), + {name: tagVal}, + function (tag) { scope.article.tags.push(tag); }, + function (value) { scope.article.tags.push({name: value.name, type: 'content_tag', new: true}); }, + function (data, status) { Raven.captureMessage('Error Adding Tag', {extra: data}); } + ); + $(input).val(''); + }; + + scope.delete = function (e) { + var tag = $(e.target).parents('[data-taglikeobject]').data('taglikeobject'); + var name = tag.name; + var newtags = []; + for (var i in scope.article.tags) { + if (scope.article.tags[i].name !== name) { + newtags.push(scope.article.tags[i]); + } + } + scope.article.tags = newtags; + }; + + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('targeting', function () { + return { + restrict: 'E', + templateUrl: '/views/targeting.html', + link: function (scope, element, attrs) { + scope.addTargetingRow = function (index) { + scope.targetingArray.push([]); + }; + scope.removeTargetingRow = function (index) { + scope.targetingArray.splice(index, 1); + }; + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp').directive( + 'videoUpload', + function ($http, $window, $timeout, $sce, $) { + return { + templateUrl: '/views/mainvideo.html', + scope: { + 'article': '=' + }, + restrict: 'E', + link: function (scope, element, attrs) { + console.log('video upload here'); + console.log(scope.video_id); + scope.$watch('article.video', function () { + if (scope.article.video) { + scope.embedUrl = $sce.trustAsUrl('/video/embed?id=' + scope.article.video); + $http({ + method: 'GET', + url: '/videos/api/video/' + scope.article.video + '/' + }).success(function (data) { + console.log('getting video from API'); + console.log(data); + scope.video = data; + $window.initVideoWidget(data.id); + }); + } + }); + + scope.$watch('video', function () { + + }); + + var progressEl = element.find('div.progress'); + var progressBar = element.find('div.progress-bar'); + var fakeInput = element.find('input.fake-input'); + scope.lastProgress = 0; + + scope.addVideo = function () { + console.log('chooseFile'); + $window.uploadVideo(element.find('.video-container')[0], { + onSuccess: function (videoid) { + scope.$apply(function () { + console.log('addVideo onSuccess callback'); + console.log(videoid); + scope.article.video = videoid; + }); + }, + onError: function (data) { + console.log('addVideo onError callback'); + console.log(data); + }, + onProgress: function (data) { + console.log('addVideo onProgress callback'); + console.log(data); + } + }); + }; + + scope.clearVideo = function (areYouSure) { + if (areYouSure) { + $('#s3upload-file-input').val(''); + scope.article.video = null; + } else { + $('#confirm-clear-video-modal').modal('show'); + } + }; + + function abortUpload() { + setProgress(0); + if (scope.req) { + scope.req.abort(); + } + scope.video = {}; + setProgress(0); + } + + function abortEncode() { + $.ajax('https://app.zencoder.com/api/v2/jobs/' + scope.video.job_id + '/cancel.json?api_key=' + $window.videoAttrs.zencoderApiKey, { + type: 'PUT', + success: function (data) { + scope.video.status = 3; + fakeInput.val('Encoding failed! Please try again.'); + } + }); + } + + scope.abort = function () { + if (scope.encoding) { + abortEncode(); + return; + } else { + abortUpload(); + return; + } + }; + + function setProgress(progress) { + if (progress === 0 || progress === 100) { + progressEl.hide(); + return; + } + if (scope.lastProgress === 0 || Math.abs(progress - scope.lastProgress) > 2) { + progressBar.css('width', Math.floor(progress) + '%'); + scope.lastProgress = progress; + progressEl.show(); + } + } + + function updateEncodeProgress() { + progressBar.addClass('progress-bar-success'); + + delete $http.defaults.headers.common['X-Requested-With']; + $http({ + url: 'https://app.zencoder.com/api/v2/jobs/' + scope.video.job_id + '/progress.json', + method: 'GET', + params: { + api_key: $window.videoAttrs.zencoderApiKey + }, + useXDomain: true + }).success(function (data) { + if (data.state === 'waiting' || data.state === 'pending' || data.state === 'processing') { + scope.video.status = 2; + if (data.progress > 5) { + setProgress(data.progress); + $timeout(updateEncodeProgress, 500); + } else { + $timeout(updateEncodeProgress, 2000); + } + } else { + setProgress(0); + if (data.state === 'finished') { + scope.video.status = 1; + } + if (data.state === 'failed' || data.state === 'cancelled') { + scope.video.status = 3; + fakeInput.val('Encoding failed! Please try again.'); + } + } + }).error(function (data) { + $('.alert-danger').fadeIn().delay(1000).fadeOut(); + }); + } + + var initialCheckRan = false; + scope.$watch('video', function () { + if (scope.video && scope.video.job_id && !initialCheckRan) { + updateEncodeProgress(); + initialCheckRan = true; + } + }); + + + } + + + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('videoEmbed', function (CmsConfig) { + return { + template: '
    ', + restrict: 'E', + link: function postLink(scope, element, attrs) { + scope.videoUrl = CmsConfig.buildVideoUrl(attrs.videoId); + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('videoField', function (Zencoder) { + return { + templateUrl: '/views/video-field.html', + restrict: 'E', + scope: { + article: '=' + }, + link: function postLink(scope, element, attrs) { + scope.removeVideo = function () { + scope.article.video = null; + }; + + scope.uploadVideo = function () { + Zencoder.onVideoFileUpload().then( + function (success) { + console.log(success); + scope.article.video = success.attrs.id; + }, + angular.noop, + function (progress) { + console.log(progress); + scope.uploadProgress = progress; + } + ); + }; + + scope.thumbnailModal = function () { + Zencoder.openVideoThumbnailModal(scope.article.video).result.then( + function (resolve) { + console.log('thumbnail modal resolve'); + console.log(resolve); + //article.poster_url = resolve; + }, + function (reject) { + console.log('thumbnail modal rejected'); + } + ); + }; + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('autocompleteMenu', function ($timeout, $animate, $compile) { + return { + restrict: 'E', + replace: true, + transclude: true, + controller: angular.noop, + scope: { + items: '=items', + pIndex: '=index', + select: '&select', + }, + link: function ($scope, element, attrs) { + + $scope.selectItem = function (index) { + $scope.select(index); + } + + $scope.setIndex = function (index) { + $scope.index = index; + + if (attrs.index) { + $scope.pIndex = parseInt(index, 10); + } + } + + if (attrs.index) { + $scope.$watch('pIndex', function(value){ + $scope.index = parseInt(value, 10); + }) + } + + $scope.label = function(index) { + var viewValue = $scope.items[index][attrs.labelAttr]; + if (typeof(viewValue) === "function") { + viewValue = viewValue(); + } + return viewValue; + } + + }, + template: '
    • {{ label($index) }}
    ' + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .directive('autocomplete', function ($timeout, $animate, $compile) { + return { + restrict: 'E', + replace: true, + require: 'ngModel', + transclude: true, + controller: function ($scope, $element, $attrs, $injector) { + $scope.service = $injector.get($attrs.service); + $scope.placeholder = $attrs.placeholder || ''; + }, + link: function ($scope, element, attrs, ngModel, transclude) { + + var isMenuAppended = false; + var inputEl = element.find('input'); + var timeoutId = null; + + ngModel.$render = function() { + if (ngModel.$viewValue) { + var viewValue = ngModel.$viewValue[attrs.labelAttr]; + if (typeof(viewValue) === "function") { + viewValue = viewValue(); + } + element.find('input').val(viewValue); + inputEl.attr('disabled', 'disabled'); + } + } + + $scope.openMenu = function(e) { + inputEl.removeAttr('disabled'); + inputEl[0].focus(); + } + + inputEl.on('blur keyup change', function() { + if (inputEl.attr('disabled') !== undefined) { + return; + } + appendMenu(); + var value = inputEl.val(); + if (value) { + if (timeoutId) { + $timeout.cancel(timeoutId); + } + timeoutId = $timeout(function(){ queryData(value)}, 150); + } + }); + + var menuScope = $scope.$new(); + menuScope.items = []; + menuScope.index = 0; + menuScope.select = function(index) { + ngModel.$setViewValue(menuScope.items[index]); + reset(); + } + + var menuEl = angular.element(document.createElement('autocomplete-menu')); + menuEl.attr({ + 'items': 'items', + 'select': 'select(index)', + 'index': 'index', + 'label-attr': attrs.labelAttr, + }); + transclude(menuScope, function(clone){ menuEl.append(clone) }); + $compile(menuEl)(menuScope); + + element.find('input').on('keyup', function(e) { + switch(e.which) { + case 27: // ESC + if (inputEl.val() === '') { + reset(); + } else { + inputEl.val(''); + } + break; + case 40: // DOWN + $scope.$apply(function() { + menuScope.index = (menuScope.index + 1) % menuScope.items.length; + }); + break; + case 38: // UP + $scope.$apply(function() { + if(menuScope.index) { + menuScope.index = menuScope.index - 1; + } else { + menuScope.index = menuScope.items.length - 1; + } + }); + break; + case 13: // RETURN + if (menuScope.index >= 0) { + ngModel.$setViewValue(menuScope.items[menuScope.index]); + reset(); + } + break; + default: + return; + } + }); + + function queryData(query) { + var searchParams = {} + searchParams[attrs.searchParam || 'search'] = query; + $scope['service'].getList(searchParams).then(function (results) { + + if(results.length > 5) { + menuScope.items = results.slice(0, 5); + } else { + menuScope.items = results; + } + timeoutId = null; + }); + } + + function appendMenu() { + if (!isMenuAppended) { + isMenuAppended = true; + menuScope.index = 0; + $animate.enter(menuEl, element.parent(), element); + } + styleMenu(); + } + + function reset() { + ngModel.$render(); + menuScope.items = []; + menuScope.index = 0; + $animate.leave(menuEl).finally(function() { + isMenuAppended = false; + }); + } + + function styleMenu() { + var parentStyles = window.getComputedStyle(element[0]); + var offset = element.offset(); + + offset.left = 'auto'; + offset.right = 'auto'; + offset.top = element.outerHeight(); + offset.minWidth = element.outerWidth(); + + angular.forEach(offset, function (value, key) { + if (!isNaN(value) && angular.isNumber(value)) { + value = value + "px" + } + menuEl[0].style[key] = value; + menuEl.css('z-index', 1000); + }); + } + }, + templateUrl: '/views/autocomplete.html' + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('BadrequestmodalCtrl', function ($scope, $modalInstance, detail) { + $scope.detail = detail; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('ChangelogmodalCtrl', function ($scope, $modalInstance, _, ContentFactory, article) { + $scope.article = article; + $scope.users = {}; + + ContentFactory.all('log').getList({content: article.id}).then(function (data) { + $scope.changelog = data; + + var userIds = _.unique(_.pluck(data, 'user')); + var resp = function (data) { + $scope.users[data.id] = data; + }; + + for (var i in userIds) { + ContentFactory.one('author', userIds[i]).get().then(resp); + } + }); + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('CmsNotificationCtrl', function ($scope, moment) { + + var valid = function () { + $scope.postDateValid = $scope.postDate && (!$scope.notifyEndDate || $scope.postDate < $scope.notifyEndDate); + $scope.notifyEndDateValid = $scope.notifyEndDate && $scope.postDate && $scope.notifyEndDate > $scope.postDate; + $scope.titleValid = $scope.cmsNotification.title && $scope.cmsNotification.title.length > 0 && $scope.cmsNotification.title.length <= 110; + + $scope.cmsNotificationValid = $scope.postDateValid && $scope.notifyEndDateValid && $scope.titleValid; + }; + + // Note: use middle man for handling dates since a bug in angular.js version causes moment to not work with + // angular.copy. So instead of keeping notification dates as moments, keep them as strings and use moment objects + // for interactions. + + $scope.postDate = $scope.cmsNotification.post_date ? moment($scope.cmsNotification.post_date) : null; + $scope.$watch('postDate', function () { + if ($scope.postDate) { + // set notification's post date as the string version of the moment object + $scope.cmsNotification.post_date = $scope.postDate.format(); + // automatically set the notify end date as 3 days after post date + $scope.notifyEndDate = $scope.postDate.clone().add({days: 3}); + } else { + $scope.cmsNotification.post_date = null; + } + }); + + $scope.notifyEndDate = $scope.cmsNotification.notify_end_date ? moment($scope.cmsNotification.notify_end_date) : null; + $scope.$watch('notifyEndDate', function () { + if ($scope.notifyEndDate) { + // set notification's post date as the string version of the moment object + $scope.cmsNotification.notify_end_date = $scope.notifyEndDate.format(); + } else { + $scope.cmsNotification.notify_end_date = null; + } + }); + + // keep track of changes to this notification + $scope.cmsNotificationDirty = false; + $scope.$watch('cmsNotification', function (newValue, oldValue) { + if (!angular.equals(newValue, oldValue)) { + $scope.cmsNotificationDirty = true; + + // do some validation here + valid(); + + } + }, true); + + // do initial validation + valid(); + + /** + * Save this notification using the parent scope. + */ + $scope.saveCmsNotification = function () { + + if ($scope.$parent.userIsSuperuser && $scope.cmsNotificationDirty && $scope.cmsNotificationValid) { + + $scope.$parent.$saveCmsNotification($scope.cmsNotification) + .then(function (newCmsNotification) { + $scope.cmsNotification = newCmsNotification; + $scope.cmsNotificationDirty = false; + }) + .catch(function (error) { + console.log('CMS Alert save failed', error); + }); + + } + + }; + + /** + * Delete this notification using the parent scope. + */ + $scope.deleteCmsNotification = function () { + + if ($scope.$parent.userIsSuperuser) { + + $scope.$parent.$deleteCmsNotification($scope.cmsNotification) + .catch(function (error) { + console.log('CMS Alert delete failed', error); + }); + + } + + }; + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('CmsNotificationsCtrl', function ($q, $window, $scope, CmsConfig, + CmsNotificationsApi, CurrentUserApi, _, moment) { + + $window.document.title = CmsConfig.getCmsName() + ' | CMS Alerts'; + + // get user info + CurrentUserApi.getCurrentUserWithCache().then(function (user) { + if (user.is_superuser) { + $scope.userIsSuperuser = true; + } + + // get list of CMS notifications + CmsNotificationsApi.getList().then(function (cmsNotifications) { + // filter out CMS notifications for regular users that have a post date in the future + var removeIndicies = []; + _.each(cmsNotifications, function (cmsNotification, i) { + if (!user.is_superuser && moment(cmsNotification.post_date).isAfter(moment())) { + removeIndicies.push(i); + } + }); + _.each(removeIndicies, function (i) { + cmsNotifications.splice(i, 1); + }); + + $scope.cmsNotifications = cmsNotifications; + }); + }); + + /** + * Create a new notification, plain old object since we don't want to save invalid objects to the db. + * + * @return new notification with only nulled date properties. + */ + $scope.newCmsNotification = function () { + + var cmsNotification = { + post_date: null, + notify_end_date: null + }; + + $scope.cmsNotifications.unshift(cmsNotification); + + return cmsNotification; + + }; + + /** + * Save given notification to the database. + * + * @param notification Notification to save. + * @return promise that resolves when notification is saved. + */ + $scope.$saveCmsNotification = function (cmsNotification) { + + var saveDefer = $q.defer(), + savePromise = saveDefer.promise; + + if ($scope.userIsSuperuser) { + if ('id' in cmsNotification) { + // this thing already exists, update it + cmsNotification.put().then(function (updatedCmsNotification) { + saveDefer.resolve(updatedCmsNotification); + }); + } else { + // a new notification, post it to the list + $scope.cmsNotifications.post(cmsNotification) + .then(function (newCmsNotification) { + // save succeeded, replace notification with restangularized notification + var i = $scope.cmsNotifications.indexOf(cmsNotification); + $scope.cmsNotifications[i] = newCmsNotification; + saveDefer.resolve(newCmsNotification); + }) + .catch(function (error) { + saveDefer.reject(error); + }); + } + } else { + saveDefer.reject('Insufficient permissions.'); + } + + return savePromise; + + }; + + /** + * Delete given notification from the database. + * + * @param cmsNotification Notification to delete. + * @return promise that resolves when notification is deleted. + */ + $scope.$deleteCmsNotification = function (cmsNotification) { + + var deleteDefer = $q.defer(), + deletePromise = deleteDefer.promise, + removeFromList = function (index) { + $scope.cmsNotifications.splice(index, 1); + deleteDefer.resolve(); + }; + + if ($scope.userIsSuperuser) { + // find notification in list + var i = $scope.cmsNotifications.indexOf(cmsNotification); + if (i > -1) { + // notification in list, check if it is a restangular object and has a remove function + if (_.isFunction(cmsNotification.remove)) { + // has remove, call it and resolve promise + cmsNotification.remove() + .then(function () { + removeFromList(i); + }) + .catch(function (error) { + deleteDefer.reject(error); + }); + } else { + // does not have remove, this is a previously unsaved notification, just remove it from list + removeFromList(i); + } + } else { + deleteDefer.reject('Cannot find notification in notification list. Unable to delete.'); + } + } else { + deleteDefer.reject('You do not have sufficient permissions to delete a notification.'); + } + + return deletePromise; + + }; + + }); + +'use strict'; + +// note: this jshint exception is for URLify, which is just a function not a constructor +/* jshint newcap: false */ + +/** + * Controller for CMS notifications bar that is displayed to users. + */ +angular.module('bulbsCmsApp') + .controller('CmsNotifyContainerCtrl', function ($scope, ipCookie, moment, CmsNotificationsApi, URLify, _) { + + var genCookieKey = function (id) { + return 'dismissed-cms-notification-' + id; + }; + var updateCmsNotificationsDisplay = function (cmsNotifications) { + var now = moment(); + $scope.cmsNotifications = _.filter(cmsNotifications, function (cmsNotification) { + // show CMS notifications where there is no dismiss cookie and post_date < now < notify_end_date + if (!ipCookie(genCookieKey(cmsNotification.id)) && + moment(cmsNotification.post_date).isBefore(now) && + moment(cmsNotification.notify_end_date).isAfter(now)) { + return true; + } + }); + }; + + // show CMS notifications + CmsNotificationsApi.getList().then(function (cmsNotifications) { + updateCmsNotificationsDisplay(cmsNotifications); + }); + + $scope.dismissCmsNotification = function (cmsNotification) { + // add dismiss cookie + var cookieKey = URLify(genCookieKey(cmsNotification.id)); + ipCookie(cookieKey, true, { + expires: moment(cmsNotification.notify_end_date).add({days: 1}).diff(moment(), 'days'), + path: '/cms/app' + }); + + // hide notification + updateCmsNotificationsDisplay($scope.cmsNotifications); + }; + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('ContenteditCtrl', function ( + $scope, $routeParams, $http, $window, + $location, $timeout, $interval, $compile, $q, $modal, + $, _, CmsConfig, moment, keypress, Raven, PNotify, + IfExistsElse, VersionStorageApi, ContentFactory, FirebaseApi, + FirebaseArticleFactory, Login, VersionBrowserModalOpener) + { + var listener = new keypress.Listener(); + listener.simple_combo('cmd s', function (e) { $scope.saveArticle(); }); + listener.simple_combo('ctrl s', function (e) { $scope.saveArticle(); }); + + var saveHTML = ' Save'; + var navbarSave = '.navbar-save'; + + var getArticleCallback = function (data) { + $window.article = $scope.article = data; //exposing article on window for debugging + + $scope.last_saved_article = angular.copy(data); + + FirebaseApi.$connection + .onConnect(function () { + $scope.firebaseConnected = true; + }) + .onDisconnect(function () { + $scope.firebaseConnected = false; + }); + + // get article and active users, register current user as active + FirebaseArticleFactory + .$retrieveCurrentArticle() + .then(function ($article) { + + var $activeUsers = $article.$activeUsers(), + $versions = $article.$versions(), + currentUser, + savePNotify; + + $versions.$loaded(function () { + $versions.$watch(function (e) { + if (e.event === 'child_added') { + + // order versions newest to oldest then grab the top one which should be the new version + var newVersion = _.sortBy($versions, function (version) { + return -version.timestamp; + })[0]; + + if (currentUser && newVersion.user.id !== currentUser.id) { + + // close any existing save pnotify + if (savePNotify) { + savePNotify.remove(); + } + + var msg = '' + + newVersion.user.displayName + + ' -- ' + + moment(newVersion.timestamp).format('MMM Do YYYY, h:mma') + + '
    '; + if ($scope.articleIsDirty) { + msg += ' You have unsaved changes that may conflict when you save.'; + } + msg += ' Open the version browser to see their latest version.'; + + // this isn't the current user that saved, so someone else must have saved, notify this user + savePNotify = new PNotify({ + title: 'Another User Saved!', + text: msg, + type: 'error', + mouse_reset: false, + hide: false, + confirm: { + confirm: true, + buttons: [{ + text: 'Open Version Browser', + addClass: 'btn-primary', + click: function (notice) { + notice.mouse_reset = false; + notice.remove(); + VersionBrowserModalOpener.open($scope, $scope.article); + } + }, { + addClass: 'hide' + }] + }, + buttons: { + closer_hover: false, + sticker: false + } + }); + } + } + }); + }); + + // register a watch on active users so we can update the list in real time + $activeUsers.$watch(function () { + + // unionize user data so that we don't have a bunch of the same users in the list + $scope.activeUsers = + _.chain($activeUsers) + // group users by their id + .groupBy(function (user) { + return user.id; + }) + // take first user in grouping and use that data along with a count of the number of times they show + // up in the list (number of sessions they have running) + .map(function (group) { + var groupedUser = group[0]; + groupedUser.count = group.length; + + if (currentUser && groupedUser.id === currentUser.id) { + groupedUser.displayName = 'You'; + } + + return groupedUser; + }) + // sort users by their display names + .sortBy(function (user) { + return user.displayName === 'You' ? '' : user.displayName; + }) + // now we have a list of unique users along with the number of sessions they have running, sorted by + // their display names + .value(); + + }); + + // register current user active with this article + $article.$registerCurrentUserActive() + .then(function (user) { + currentUser = user; + }); + + // who knows what kind of promises you might have in the future? so return the article object for chains + return $article; + + }); + + }; + + var getContent = function () { + return ContentFactory.one('content', $routeParams.id) + .get() + .then(getArticleCallback); + }; + + var saveArticleErrorCbk = function (data) { + $(navbarSave) + .removeClass('btn-success') + .addClass('btn-danger') + .html(' Error'); + if (status === 400) { + $scope.errors = data; + } + $scope.saveArticleDeferred.reject(); + }; + + /** + * Last thing to happen on a successful save. + */ + var saveArticleSuccessCbk = function (resp) { + // store a version with version api + VersionStorageApi.$create($scope.article, $scope.articleIsDirty); + + $(navbarSave).html(' Saved!'); + setTimeout(function () { + $(navbarSave).html(saveHTML); + }, 2500); + $window.article = $scope.article = resp; + $scope.last_saved_article = angular.copy(resp); + $scope.articleIsDirty = false; + $scope.articleIsNew = false; + $scope.errors = null; + + if ($routeParams.id === 'new') { + $location.path('/cms/app/edit/' + $scope.article.id + '/' + $routeParams.contentType); + } + + $location.search('rating_type', null); //maybe just kill the whole query string with $location.url($location.path()) + $scope.saveArticleDeferred.resolve(resp); + }; + + $scope.PARTIALS_URL = '/views/'; + $scope.buildContentPartialsPath = CmsConfig.buildContentPartialsPath; + $scope.page = 'edit'; + $scope.contentEditGlobals = { + canSave: true + }; + + $scope.$watch('article.title', function () { + $window.document.title = CmsConfig.getCmsName() + ' | Editing ' + ($scope.article && $('' + $scope.article.title + '').text()); + }); + + $scope.saveArticleDeferred = $q.defer(); + + $scope.saveArticleIfDirty = function () { + /*this is only for operations that trigger a saveArticle (e.g. send to editor) + if the article isn't dirty, we don't want to fire saveArticle + and possibly trigger the last-modified-guard or whatever else*/ + if ($scope.articleIsDirty) { + return $scope.saveArticle(); + } else { + //resolves immediately with article as the resolved value + //(saveArticle resolves to article as well) + return $q.when($scope.article); + } + }; + + $scope.saveArticle = function () { + if ($scope.contentEditGlobals.saveError) { + return $scope.saveArticleDeferred.reject(); + } + + $(navbarSave) + .removeClass('btn-danger') + .addClass('btn-success') + .html(' Saving'); + + if ($routeParams.id === 'new') { + $scope.postValidationSaveArticle(); + } else { + ContentFactory.one('content', $routeParams.id).get() + .then(function (data) { + if (data.last_modified && + $scope.article.last_modified && + moment(data.last_modified) > moment($scope.article.last_modified)) { + $scope.saveArticleDeferred.reject(); + $modal.open({ + templateUrl: '/views/modals/last-modified-guard-modal.html', + controller: 'LastmodifiedguardmodalCtrl', + scope: $scope, + resolve: { + articleOnPage: function () { return $scope.article; }, + articleOnServer: function () { return data; } + } + }); + } else { + $scope.postValidationSaveArticle(); + } + }) + .catch(saveArticleErrorCbk); + } + + return $scope.saveArticleDeferred.promise; + }; + + $scope.postValidationSaveArticle = function () { + if ($scope.article.status !== 'Published' && + $scope.article.polymorphic_ctype !== CmsConfig.getSuperFeaturesType()) { + $scope.article.slug = $window.URLify($scope.article.title, 50); + } + + var params = {}; + if ($routeParams.id === 'new') { + params['doctype'] = $scope.article.polymorphic_ctype; + } + + $scope.article.save(params) + .then(saveArticleSuccessCbk) + .catch(saveArticleErrorCbk); + + return $scope.saveArticleDeferred.promise; + }; + + // keep track of if article is dirty or not + $scope.articleIsDirty = $routeParams.id === 'new'; + $scope.$watch(function () { + return !angular.equals($scope.article, $scope.last_saved_article); + }, function (isDirty) { + $scope.articleIsDirty = isDirty; + }); + + $scope.$watch('articleIsDirty', function () { + if ($scope.articleIsDirty) { + $window.onbeforeunload = function () { + return 'You have unsaved changes. Do you want to continue?'; + }; + } else { + $window.onbeforeunload = function () {}; + } + }); + + $scope.publishSuccessCbk = function () { + return getContent(); + }; + + $scope.trashSuccessCbk = function () { + //delaying this so the user isn't sent back before the trashed content is removed from the listing view + $timeout(function () { + $window.history.back(); + }, 1500); + }; + + var initialize = function () { + if ($routeParams.id === 'new') { + $scope.articleIsNew = true; + $scope.article = ContentFactory.oneUrl('content'); + $scope.article['polymorphic_ctype'] = $routeParams.contentType; + } else { + getContent(); + } + }; + + initialize(); + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('ContentlistCtrl', function ( + $scope, $http, $timeout, $location, $window, $q, $, CmsConfig, + ContentListService) { + + $scope.contentData = []; + ContentListService.$updateContent({ + page: 1, + exclude: CmsConfig.getSuperFeaturesType() + }) + .then(function (data) { + $scope.contentData = data; + }); + + $window.document.title = CmsConfig.getCmsName() + ' | Content'; + + $scope.pageNumber = $location.search().page || '1'; + $scope.myStuff = false; + $scope.search = $location.search().search; + $scope.collapse = {}; + + $scope.goToPage = function () { + ContentListService.$updateContent({page: $scope.pageNumber}, true); + }; + + $scope.publishSuccessCbk = function (data) { + var i; + for (i = 0; i < $scope.contentData.content.length; i++) { + if ($scope.contentData.content[i].id === data.article.id) { + break; + } + } + + for (var field in data.response) { + $scope.contentData.content[i][field] = data.response[field]; + } + + return $q.when(); + }; + + $scope.trashSuccessCbk = function () { + $timeout(function () { + ContentListService.$updateContent(); + $('#confirm-trash-modal').modal('hide'); + }, 1500); + }; + + $('body').on('shown.bs.collapse', '.panel-collapse', function (e) { + $scope.$digest(); + }); + + }) + .directive('ngConfirmClick', [ // Used on the unpublish button + function () { + return { + link: function (scope, element, attr) { + var msg = attr.ngConfirmClick || 'Are you sure?'; + var clickAction = attr.confirmedClick; + element.bind('click', function () { + if (window.confirm(msg)) { + scope.$eval(clickAction); + } + }); + } + }; + } + ]); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('ContentworkflowCtrl', function ($scope, $http, $modal, $window, moment, + VersionBrowserModalOpener, TemporaryUrlModalOpener, + CmsConfig) { + $scope.TIMEZONE_LABEL = moment.tz(CmsConfig.getTimezoneName()).format('z'); + + $scope.trashContentModal = function (articleId) { + return $modal.open({ + templateUrl: '/views/modals/confirm-trash-modal.html', + controller: 'TrashcontentmodalCtrl', + scope: $scope, + resolve: { + articleId: function () { + return articleId; + } + } + }); + }; + + $scope.pubTimeModal = function (article) { + return $modal.open({ + templateUrl: '/views/modals/publish-date-modal.html', + controller: 'PubtimemodalCtrl', + scope: $scope, + resolve: { + article: function () { return article; } + } + }); + }; + + $scope.sendToEditorModal = function (article) { + return $modal.open({ + templateUrl: '/views/modals/send-to-editor-modal.html', + controller: 'SendtoeditormodalCtrl', + scope: $scope, + resolve: { + article: function () { return article; } + } + }); + }; + + $scope.changelogModal = function (article) { + return $modal.open({ + templateUrl: '/views/modals/changelog-modal.html', + controller: 'ChangelogmodalCtrl', + scope: $scope, + resolve: { + article: function () { return article; } + } + }); + }; + + $scope.thumbnailModal = function (article) { + // open thumbnail modal along with its controller + return $modal.open({ + templateUrl: '/views/modals/thumbnail-modal.html', + controller: 'ThumbnailModalCtrl', + scope: $scope, + resolve: { + article: function () { return article; } + } + }); + }; + + $scope.versionBrowserModal = function (article) { + VersionBrowserModalOpener.open($scope, article); + }; + + $scope.temporaryUrlModal = function (article) { + TemporaryUrlModalOpener.open($scope, article); + }; + + $scope.descriptionModal = function (article) { + return $modal.open({ + templateUrl: '/views/modals/description-modal.html', + controller: 'DescriptionModalCtrl', + scope: $scope, + size: 'lg', + resolve: { + article: function () { return article; } + } + }); + }; + + $scope.getStatus = function (article) { + if (!article || !article.published) { + return 'unpublished'; + } else if (moment(article.published) > moment()) { + return 'scheduled'; + } else { + return 'published'; + } + }; + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('ContributionsCtrl', function ( + $scope, $routeParams, $http, $window, + $location, $timeout, $compile, $q, $modal, + _, CmsConfig, ContributionRoleService, ContentService) + { + + $scope.NAV_LOGO = CmsConfig.getNavLogoPath(); + $scope.contentId = parseInt($routeParams.id, 10); + $scope.paymentType = ''; + $scope.contributions = []; + $scope.contributionLabels = []; + $scope.roles = []; + $scope.collapsed = []; + $scope.page = 'contributions'; + + $scope.clean = true; + + $scope.save = save; + $scope.add = add; + $scope.remove = remove; + $scope.updateLabel = updateLabel; + + $scope.isFlatRate = function(contribution) { + if (contribution.hasOwnProperty('roleObject')) { + if (contribution.roleObject.payment_type === 'Flat Rate'){ + return true; + } + } + + return false; + }; + + $scope.isFeatureType = function(contribution) { + if (contribution.hasOwnProperty('roleObject')) { + if (contribution.roleObject.payment_type === 'FeatureType'){ + $scope.setFeatureRate(contribution); + return true; + } + } + + return false; + }; + + $scope.setFeatureRate = function(contribution) { + for (var i in contribution.roleObject.rates.feature_type) { + var featureTypeRate = contribution.roleObject.rates.feature_type[i]; + if ($scope.content.feature_type === featureTypeRate.feature_type) { + contribution.featureTypeRate = featureTypeRate.rate; + } + } + }; + + $scope.isHourly = function(contribution) { + if (contribution.hasOwnProperty('roleObject')) { + if (contribution.roleObject.payment_type === 'Hourly') { + return true; + } + } + + return false; + }; + + $scope.isManual = function(contribution) { + if (contribution.hasOwnProperty('roleObject')) { + if (contribution.roleObject.payment_type === 'Manual') { + return true; + } + } + + return false; + }; + + $scope.getHourlyPay = function (contribution) { + if (contribution.roleObject) { + if (!contribution.roleObject.rate) { + return 0; + } + return ((contribution.roleObject.rate/60) * (contribution.minutes_worked || 0)); + } + }; + + function save() { + // I know, I'm not supposed to do DOM manipulation in controllers. TOO BAD. + angular.element('#save-btn').html(' Saving'); + $scope.contributions.save($scope.contributions).then(function (contributions) { + angular.element('#save-btn').addClass('btn-success').removeClass('btn-danger'); + angular.element('#save-btn').html(' Save'); + $scope.clean = true; + }, function(res) { + angular.element('#save-btn').addClass('btn-danger').removeClass('btn-success'); + angular.element('#save-btn').html(' Error'); + }); + } + + function add() { + $scope.contributions.push({ + contributor: null, + content: $scope.contentId, + rate: { + rate: 0 + }, + role: null + }); + $scope.collapsed.push(false); + } + + $scope.$watch('contributions', function(newContributions, oldContributions) { + if (oldContributions.length > 0) { + $scope.clean = false; + } + }, true); + + function getRoles() { + return ContributionRoleService.getList().then(function (roles) { + $scope.roles = roles; + getContributions(); + }); + } + + function getContributions() { + return ContentService.one($scope.contentId).all('contributions').getList().then(function (contributions) { + for (var i in contributions) { + if (contributions[i] === null || contributions[i].role === undefined) { + continue; + } else { + + if ((contributions[i].hasOwnProperty('rate')) && + (typeof(contributions[i].rate) === 'object') && + (contributions[i].rate !== null)) { + contributions[i].rate = contributions[i].rate.rate; + } + + if (typeof(contributions[i].role) === 'object') { + contributions[i].paymentType = contributions[i].role.payment_type; + contributions[i].roleObject = contributions[i].role; + contributions[i].role = contributions[i].role.id; + } + } + } + $scope.contributions = contributions; + $scope.collapsed = new Array(contributions.length); + $scope.contributions.forEach(function (item, index) { + + $scope.contributionLabels[index] = _.find($scope.roles, function (role) { + return role.id === item.role; + }).name; + $scope.collapsed[index] = true; + }); + }); + } + + function getContent() { + ContentService.one($scope.contentId).get().then(function (content) { + $scope.content = content; + $scope.article = { + id: content.id + }; + }); + } + + function remove(index) { + $scope.contributions.splice(index, 1); + $scope.collapsed.splice(index, 1); + } + + function updateLabel(index) { + $scope.contributionLabels[index] = _.find($scope.roles, function (role) { + + $scope.contributions[index].roleObject = role; + $scope.contributions[index].paymentType = role.payment_type; + return role.id === $scope.contributions[index].role; + }).name; + } + + getRoles(); + getContent(); + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('DescriptionModalCtrl', function ($scope, $modalInstance, article) { + $scope.article = article; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('ForbiddenmodalCtrl', function ($scope, detail) { + $scope.detail = detail; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('LastmodifiedguardmodalCtrl', function ($scope, $modalInstance, _, moment, ContentFactory, articleOnPage, articleOnServer) { + $scope.articleOnServer = articleOnServer; + + ContentFactory.all('log').getList({content: articleOnPage.id}).then(function (log) { + var latest = _.max(log, function (entry) { return moment(entry.action_time); }); + var lastSavedById = latest.user; + ContentFactory.one('author', lastSavedById).get().then(function (data) { + $scope.lastSavedBy = data; + }); + }); + + $scope.loadFromServer = function () { + + // pull article from server and replace whatever data we need to show the newest version + _.each($scope.articleOnServer, function (value, key) { + $scope.article[key] = value; + }); + $scope.articleIsDirty = true; + + $modalInstance.close(); + + }; + + $scope.saveAnyway = function () { + $modalInstance.close(); + $scope.$parent.postValidationSaveArticle(); + }; + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('LineitemexportmodalCtrl', function ($scope, $http, CmsConfig, moment) { + var now = moment().tz(CmsConfig.getTimezoneName()); + $scope.start = moment([now.year(), now.month()]); + $scope.end = moment([now.year(), now.month() + 1]); + + $scope.apiUrl = '/cms/api/v1/contributions/line-item-reporting/?format=csv'; + + $scope.updateDownloadUrl = function () { + var start_string = $scope.start.format('YYYY-MM-DD'); + var end_string = $scope.end.format('YYYY-MM-DD'); + return $scope.apiUrl + '&start=' + start_string + '&end=' + end_string; + }; + + $scope.downloadUrl = $scope.updateDownloadUrl(); + + $scope.$watchCollection('[start, end]', function () { + $scope.downloadUrl = $scope.updateDownloadUrl(); + }); + + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('LoginmodalCtrl', function ($scope, Login, $modalInstance, $) { + $scope.login = function () { + var username = $('input[name=\'username\']').val(); + var password = $('input[name=\'password\']').val(); + Login.login(username, password).then( + function () { $modalInstance.close(); }, + function () { $modalInstance.dismiss(); } + ); + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('PubtimemodalCtrl', function ($scope, $http, $modal, + $modalInstance, $, CmsConfig, moment, Login, article, Raven) { + + $scope.article = article; + + $scope.pubButton = { + idle: 'Publish', + busy: 'Publishing', + finished: 'Published!', + error: 'Error!' + }; + + $scope.$watch('pickerValue', function (newVal) { + var pubTimeMoment = moment(newVal); + $scope.datePickerValue = moment() + .year(pubTimeMoment.year()) + .month(pubTimeMoment.month()) + .date(pubTimeMoment.date()); + $scope.timePickerValue = moment() + .hour(pubTimeMoment.hour()) + .minute(pubTimeMoment.minute()); + }); + + var modelDateFormat = 'YYYY-MM-DDTHH:mmZ'; + + $scope.setTimeShortcut = function (shortcut) { + if (shortcut === 'now') { + var now = moment(); + $scope.pickerValue = now; + } + if (shortcut === 'midnight') { + var midnight = moment().hour(24).minute(0); + $scope.pickerValue = midnight; + } + }; + + $scope.setDateShortcut = function (shortcut) { + var today = moment.tz(CmsConfig.getTimezoneName()); + if (shortcut === 'today') { + $scope.datePickerValue = moment().year(today.year()).month(today.month()).date(today.date()); + } + if (shortcut === 'tomorrow') { + $scope.datePickerValue = moment().year(today.year()).month(today.month()).date(today.date() + 1); + } + }; + + $scope.setPubTime = function () { + //we're planning on making feature_type a db required field + //but for now we're just validating on the front-end on publish + if (!$scope.article.feature_type) { + $modalInstance.dismiss(); + $modal.open({ + templateUrl: '/views/modals/pubtime-validation-modal.html' + }); + return; + } + + var newDate = moment($scope.datePickerValue); + var newTime = moment($scope.timePickerValue); + var newDateTime = moment.tz(CmsConfig.getTimezoneName()) + .year(newDate.year()) + .month(newDate.month()) + .date(newDate.date()) + .hour(newTime.hour()) + .minute(newTime.minute()) + .format(modelDateFormat); + var data = {published: newDateTime}; + + return $http({ + url: '/cms/api/v1/content/' + $scope.article.id + '/publish/', + method: 'POST', + data: data + }); + }; + + $scope.setPubTimeCbk = function (publish_promise) { + publish_promise + .then(function (result) { + $scope.article.published = result.data.published; + if ($scope.publishSuccessCbk) { + $scope.publishSuccessCbk({article: $scope.article, response: result.data}); + } + $modalInstance.close(); + }) + .catch(function (reason) { + Raven.captureMessage('Error Setting Pubtime', {extra: reason.data}); + $modalInstance.dismiss(); + }); + }; + + $scope.unpubButton = { + idle: 'Unpublish', + busy: 'Unpublishing', + finished: 'Unpublished!', + error: 'Error' + }; + + + $scope.unpublish = function () { + return $http({ + url: '/cms/api/v1/content/' + $scope.article.id + '/publish/', + method: 'POST', + data: {published: false} + }); + }; + + $scope.unpublishCbk = function (unpub_promise) { + unpub_promise + .then(function (result) { + if ($scope.publishSuccessCbk) { + $scope.publishSuccessCbk({article: $scope.article, response: result.data}); + } + $modalInstance.close(); + }) + .catch(function (reason) { + if ($scope.publishSuccessCbk) { + $scope.publishSuccessCbk({article: $scope.article, response: reason.data}); + } + $modalInstance.dismiss(); + }); + }; + + if ($scope.article.published) { + $scope.pickerValue = moment.tz($scope.article.published, CmsConfig.getTimezoneName()); + } else { + $scope.setTimeShortcut('now'); + } + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('ReportemailmodalCtrl', function ($scope, $http, moment) { + var reportEmailURL = '/cms/api/v1/contributor-email/'; + var now = moment().tz('America/Chicago'); + + $scope.monthOptions = moment.monthsShort(); + $scope.reportDeadline = now.add(1, 'days'); + $scope.reportMonth = $scope.monthOptions[now.month() - 1]; + $scope.reportYear = now.year(); + + $scope.openReportDeadline = function($event) { + $event.preventDefault(); + $event.stopPropagation(); + $scope.startReportDeadline = true; + }; + + var getReportStart = function() { + return moment().month($scope.reportMonth).year($scope.reportYear).startOf('month'); + }; + + $scope.sendEmail = function () { + var data = { + deadline: $scope.reportDeadline, + start: getReportStart() + }; + $http.post(reportEmailURL, data); + }; + }); +'use strict'; + +angular.module('bulbsCmsApp') + .controller('ReportingCtrl', function ($http, $scope, $modal, $window, $, + $location, $filter, $interpolate, Login, moment, CmsConfig, + ContributionReportingService, ContentReportingService, + FreelancePayReportingService) { + + $window.document.title = CmsConfig.getCmsName() + ' | Reporting'; + + $scope.userFilter = ''; + $scope.userFilters = [ + { + name: 'All', + value: '' + }, + { + name: 'Staff', + value: 'staff' + }, + { + name: 'Freelance', + value: 'freelance' + } + ]; + + $scope.publishedFilter = ''; + $scope.publishedFilters = [ + { + name: 'All Content', + value: '' + }, + { + name: 'Published', + value: 'published' + } + ]; + + $scope.reports = { + 'Contributions': { + service: ContributionReportingService, + headings: [ + {'title': 'Content ID', 'expression': 'content.id'}, + {'title': 'Headline', 'expression': 'content.title'}, + {'title': 'FeatureType', 'expression': 'content.feature_type'}, + {'title': 'Contributor', 'expression': 'user.payroll_name'}, + {'title': 'Role', 'expression': 'role'}, + {'title': 'Pay', 'expression': 'pay'}, + {'title': 'Date', 'expression': 'content.published | date: \'MM/dd/yyyy\''} + ], + downloadURL: '/cms/api/v1/contributions/reporting/', + orderOptions: [ + { + label: 'Order by User', + key: 'user' + }, + { + label: 'Order by Content', + key: 'content' + }, + ] + }, + 'Content': { + service: ContentReportingService, + headings: [ + {'title': 'Content ID', 'expression': 'id'}, + {'title': 'Headline', 'expression': 'title'}, + {'title': 'Feature Type', 'expression': 'feature_type'}, + {'title': 'Video', 'expression': 'video_id'}, + {'title': 'Article Cost', 'expression': 'value'}, + {'title': 'Date Published', 'expression': 'published | date: \'MM/dd/yyyy\''} + ], + orderOptions: [], + downloadURL: '/cms/api/v1/contributions/contentreporting/', + }, + 'Freelance Pay': { + service: FreelancePayReportingService, + headings: [ + {'title': 'Contributor', 'expression': 'contributor.full_name'}, + {'title': 'Contribution #', 'expression': 'contributions_count'}, + {'title': 'Pay', 'expression': 'pay'}, + {'title': 'Payment Date', 'expression': 'payment_date | date: \'MM/dd/yyyy\''} + ], + orderOptions: [], + downloadURL: '/cms/api/v1/contributions/freelancereporting/' + } + }; + $scope.items = []; + $scope.headings = []; + $scope.orderOptions = []; + + $scope.startInitial = moment().startOf('month').format('YYYY-MM-DD'); + $scope.endInitial = moment().endOf('month').format('YYYY-MM-DD'); + + $scope.reportParams = { + pageNumber: 1, + start: $scope.startInitial, + end: $scope.endInitial, + }; + $scope.reportDisabled = true; + + $scope.pageTotal = null; + $scope.moreFilters = []; + + $scope.startOpen = false; + $scope.endOpen = false; + + $scope.setReport = function ($reportingService) { + if ($scope.reportDisabled === true) { + $scope.reportDisabled = false; + } + $scope.reportParams.pageNumber = 1; + $scope.report = $reportingService; + }; + + $scope.setUserFilter = function (value) { + $scope.userFilter = value; + loadReport($scope.report, $scope.reportParams.start, $scope.reportParams.end, $scope.orderBy); + }; + + $scope.setPublishedFilter = function (value) { + $scope.publishedFilter = value; + if (value === 'published') { + $scope.reportParams.end = moment().format('YYYY-MM-DD'); + } + loadReport($scope.report, $scope.reportParams.start, $scope.reportParams.end, $scope.orderBy); + }; + + $scope.openStart = function ($event) { + $event.preventDefault(); + $event.stopPropagation(); + $scope.startOpen = true; + }; + + $scope.openEnd = function ($event) { + $event.preventDefault(); + $event.stopPropagation(); + $scope.endOpen = true; + }; + + $scope.orderingChange = function () { + loadReport($scope.report, $scope.reportParams.start, $scope.reportParams.end, $scope.orderBy); + }; + + $scope.downloadIsValid = function () { + if ($scope.report !== 'undefined') { + return true; + } + return false; + }; + + $scope.$watch('report', function (report) { + if (!report) { + return; + } + $scope.orderOptions = report.orderOptions; + if(report.orderOptions.length > 0) { + $scope.orderBy = report.orderOptions[0]; + } else { + $scope.orderBy = null; + } + $scope.headings = []; + report.headings.forEach(function (heading) { + $scope.headings.push(heading.title); + }); + + loadReport(report, $scope.reportParams.start, $scope.reportParams.end, $scope.orderBy); + }); + + $scope.$watchCollection('[reportParams.start, reportParams.end]', function (params) { + if (!$scope.report) { + return; + } + var start = params[0]; + var end = params[1]; + + loadReport($scope.report, start, end, $scope.orderBy); + }); + + function loadReport(report, start, end, order, apiUrl) { + $scope.items = []; + + if (typeof(apiUrl) === 'undefined') { + $scope.apiURL = report.downloadURL; + } else { + $scope.apiURL = apiUrl; + } + + $scope.apiURL += ('?page=' + $scope.reportParams.pageNumber); + + + $scope.downloadURL = report.downloadURL + '?format=csv'; + if (end) { + var endParam = $filter('date')(end, 'yyyy-MM-dd'); + $scope.reportParams.end = endParam; + $scope.apiURL += ('&end=' + endParam); + $scope.downloadURL += ('&end=' + endParam); + } + + if (start) { + var startParam = $filter('date')(start, 'yyyy-MM-dd'); + $scope.reportParams.start = startParam; + $scope.apiURL += ('&start=' + startParam); + $scope.downloadURL += ('&start=' + startParam); + } + + if (order) { + $scope.apiURL += ('&ordering=' + order.key); + // $scope.downloadURL += ('&ordering=' + order.key); + // $scope.reportParams.ordering = order.key; + } + + if ($scope.publishedFilter) { + $scope.apiURL += ('&published=' + $scope.publishedFilter); + $scope.downloadURL += ('&published=' + $scope.publishedFilter); + $scope.reportParams.published = $scope.publishedFilter; + } + + if ($scope.userFilter) { + $scope.apiURL += ('&staff=' + $scope.userFilter); + $scope.downloadURL += ('&staff=' + $scope.userFilter); + $scope.reportParams.staff = $scope.userFilter; + } + + if ($scope.moreFilters) { + for (var key in $scope.moreFilters) { + if ($scope.moreFilters[key].type === 'authors') { + $scope.apiURL += ('&' + 'contributors=' + $scope.moreFilters[key].query); + $scope.downloadURL += ('&' + 'contributors=' + $scope.moreFilters[key].query); + $scope.reportParams.contributors = $scope.moreFilters[key].query; + } else { + $scope.apiURL += ('&' + $scope.moreFilters[key].type + '=' + $scope.moreFilters[key].query); + $scope.downloadURL += ('&' + $scope.moreFilters[key].type + '=' + $scope.moreFilters[key].query); + $scope.reportParams[$scope.moreFilters[key].type] = $scope.moreFilters[key].query; + } + } + } + + $http({ + method: 'GET', + url: $scope.apiURL + }).then(function (data) { + $scope.items = []; + $scope.pageTotal = data.data.count; + data.data.results.forEach(function (lineItem) { + var item = []; + report.headings.forEach(function (heading) { + var exp = $interpolate('{{item.' + heading.expression + '}}'); + var value = exp({item: lineItem}); + item.push(value); + }); + $scope.items.push(item); + }); + }); + } + + $scope.reportEmailModal = function () { + return $modal.open({ + templateUrl: '/views/modals/report-email-modal.html', + controller: 'ReportemailmodalCtrl', + }); + }; + + $scope.goToPage = function () { + loadReport($scope.report, $scope.reportParams.start, $scope.reportParams.end); + }; + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('TargetingCtrl', function ($scope, $http, $window, $q, $location, + CmsConfig) { + + $window.document.title = CmsConfig.getCmsName() + ' | Targeting Editor'; + + var canceller; + $scope.search = function (url) { + if (!url) { return; } + + if (typeof(canceller) === 'undefined') { + canceller = $q.defer(); + } else { + canceller.resolve(); + canceller = $q.defer(); + } + + $http({ + method: 'GET', + url: '/ads/targeting', + timeout: canceller.promise, + params: {url: $scope.url} + }).success(function (data) { + $scope.targetingArray = []; + for (var k in data) { + $scope.targetingArray.push([k, data[k]]); + } + }).error(function (data, status, headers, config) { + if (status === 404) { + $scope.targetingArray = []; + $scope.targetingArray.push(['', '']); + } + }); + }; + + $scope.save = function () { + var data = {}; + for (var i in $scope.targetingArray) { + data[$scope.targetingArray[i][0]] = $scope.targetingArray[i][1]; + } + + return $http({ + method: 'POST', + url: '/ads/targeting?url=' + $scope.url, + data: data + }).success(function (data) { + $scope.targetingArray = []; + for (var k in data) { + $scope.targetingArray.push([k, data[k]]); + } + }); + + }; + + $scope.keyHandler = function (event, url) { + if (event.keyCode === 13) { // enter + this.search(url); + } else if (event.keyCode === 27) { // escape + event.currentTarget.value = ''; + } + }; + + //grab url query key + var search = $location.search(); + if (search && search.url) { + $scope.url = decodeURIComponent(search.url); + } + } +); + +'use strict'; + +angular.module('bulbsCmsApp') + .value('ARTICLE_TEMPORARY_URL_DAYS_VALID', 7) + .controller('TemporaryUrlModalCtrl', function ($scope, $routeParams, + CmsConfig, ContentFactory, ARTICLE_TEMPORARY_URL_DAYS_VALID, _, moment) { + + var content = ContentFactory.one('content', $routeParams.id); + + $scope.TEMP_LINK_DAYS_VALID = ARTICLE_TEMPORARY_URL_DAYS_VALID; + $scope.TEMP_URL_BASE = CmsConfig.buildUnpublishedUrl(); + + $scope.tokens = []; + content.getList('list_tokens').then(function (tokenList) { + $scope.tokens = tokenList; + + // make dates moments + var expiredIndicies = []; + _.each($scope.tokens, function (token, i) { + token.create_date = moment(token.create_date); + token.expire_date = moment(token.expire_date); + + if (moment().isAfter(token.expire_date)) { + // keep track of expired tokens for later removal + expiredIndicies.push(i); + } else { + // this is not expired, keep track of day diff + token.daysTillExpire = token.expire_date.diff(moment(), 'days') + 1; + } + }); + + // remove expired tokens from list, done this way so objects remain restangularized + for (var i = expiredIndicies.length - 1; i >= 0; i--) { + $scope.tokens.splice(expiredIndicies[i], 1); + } + }); + + $scope.createToken = function () { + + var now = moment(); + ContentFactory.one('content', $routeParams.id).post('create_token', { + 'create_date': now, + 'expire_date': now.clone().add({days: ARTICLE_TEMPORARY_URL_DAYS_VALID}) + }).then(function (token) { + // make dates moments + token.create_date = moment(token.create_date); + token.expire_date = moment(token.expire_date); + token.daysTillExpire = token.expire_date.diff(moment(), 'days') + 1; + + $scope.tokens.push(token); + $scope.newestToken = token; + }); + + }; + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('ThumbnailModalCtrl', function ($scope, BettyCropper, $modalInstance, article) { + + $scope.article = article; + + /** + * Upload a new image to BettyCropper and set the scope's thumbnailTemp to that new image. + */ + $scope.selectCustomThumbnail = function () { + + // user is choosing a custom thumbnail + BettyCropper.upload().then(function (success) { + + $scope.article.thumbnail_override = success; + + }, function (error) { + console.log(error); + }, function (progress) { + console.log(progress); + }); + + }; + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('TrashcontentmodalCtrl', function ($scope, $http, $modalInstance, $, Login, articleId, Raven) { + $scope.deleteButton = { + idle: 'Delete', + busy: 'Trashing', + finished: 'Trashed', + error: 'Error!' + }; + + $scope.trashContent = function () { + return $http({ + 'method': 'POST', + 'url': '/cms/api/v1/content/' + articleId + '/trash/' + }); + }; + + $scope.trashCbk = function (trash_promise) { + trash_promise + .then(function (result) { + console.log('trash success'); + $scope.trashSuccessCbk(); + $modalInstance.close(); + }) + .catch(function (reason) { + if (reason.status === 404) { + $scope.trashSuccessCbk(); + $modalInstance.close(); + return; + } + Raven.captureMessage('Error Deleting Article', {extra: reason}); + $modalInstance.dismiss(); + }); + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('UnpublishCtrl', function ($scope, $http, $q) { + + $scope.unpubButton = { + idle: 'Unpublish', + busy: 'Unpublishing', + finished: 'Unpublished!', + error: 'Error' + }; + + + $scope.unpublish = function () { + return $http({ + url: '/cms/api/v1/content/' + $scope.article.id + '/publish/', + method: 'POST', + data: {published: false} + }); + }; + + $scope.unpublishCbk = function (unpub_promise) { + unpub_promise + .then(function (result) { + if ($scope.publishSuccessCbk) { + $scope.publishSuccessCbk({article: $scope.article, response: result.data}); + } + }) + .catch(function (reason) { + if ($scope.publishSuccessCbk) { + $scope.publishSuccessCbk({article: $scope.article, response: reason.data}); + } + }); + }; + + }); + +'use strict'; + +/** + * This is a modal for browsing versions stored in localStorage by the LocalStorageBackup service. + */ +angular.module('bulbsCmsApp') + .controller('VersionBrowserModalCtrl', function ($scope, $modalInstance, _, moment, VersionStorageApi, + FirebaseApi, CmsConfig) { + + // if we have fire base, show the maximum number of versions allowed + FirebaseApi.$authorize().then(function () { + $scope.maxVersions = CmsConfig.getFirebaseMaxArticleHistory(); + }); + + VersionStorageApi.$all() + .then(function (versions) { + + // doubley ensure timestamp in desc since modal functionality depends on it, add some extra display stuff + $scope.versions = + _.chain(versions) + // loop through each version and add timestamp display property + .each(function (version) { + version.timestamp_display = moment(version.timestamp).format('MMM Do YYYY, h:mma'); + }) + // sort by timestamps desc, so most recent is on top + .sortBy(function (version) { + return -version.timestamp; + }) + .value(); + + // set initial preview to top item which should be the most recent + $scope.selectedVersion = $scope.versions[0]; + + // set preview in modal window based on timestamp + $scope.setPreview = function (version) { + $scope.selectedVersion = version; + }; + + // restore selected version preview + $scope.restoreSelected = function () { + + // loop through each key of selected version and replace corresponding value in article + _.each($scope.selectedVersion.content, function (value, key) { + $scope.article[key] = value; + }); + + // mark article as dirty now that we've restored an old version + $scope.articleIsDirty = true; + + // close modal + $modalInstance.close(); + }; + + }); + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .controller('VideothumbnailmodalCtrl', function ($scope, $http, + $modalInstance, CmsConfig, Zencoder, videoId) { + var DEFAULT_THUMBNAIL = 4; + var MAX_THUMBNAIL = 19; + $scope.uploadedImage = {id: null}; + $scope.mode = 'still'; + + Zencoder.getVideo(videoId).then( + function (response) { + $scope.video = response.data; + if (response.data.status === 'In Progress') { + $scope.inProgress = true; + $scope.video.poster = $scope.video.poster || null; + } else { + $scope.video.poster = $scope.video.poster || compilePosterUrl(DEFAULT_THUMBNAIL); + } + } + ); + + $scope.$watch('video.poster', function () { + if (!$scope.video || !$scope.video.poster) { return; } + var defaultUrl = CmsConfig.buildVideoThumbnailUrl(videoId, 'thumbnail_{{thumbnail}}.png'); + var thumbnailIndex = defaultUrl.indexOf('{{thumbnail}}'); + if ($scope.video.poster.indexOf(defaultUrl.substr(0, thumbnailIndex)) === 0) { + $scope.currentThumbnail = Number($scope.video.poster.substr(thumbnailIndex, 4)); + $scope.uploadedImage.id = null; + } else { + $scope.currentThumbnail = false; + } + }); + + $scope.$watch('uploadedImage.id', function () { + if ($scope.uploadedImage.id) { + $scope.video.poster = + CmsConfig.buildImageApiUrl('16x9', $scope.uploadedImage.id, '1200.jpg'); + } + }); + + $scope.nextThumb = function () { + $scope.video.poster = compilePosterUrl($scope.currentThumbnail < MAX_THUMBNAIL ? $scope.currentThumbnail + 1 : 0); + }; + + $scope.prevThumb = function () { + $scope.video.poster = compilePosterUrl($scope.currentThumbnail > 0 ? $scope.currentThumbnail - 1 : MAX_THUMBNAIL); + }; + + $scope.defaultThumb = function () { + $scope.video.poster = compilePosterUrl(DEFAULT_THUMBNAIL); + }; + + $scope.setPoster = function () { + Zencoder.setVideo($scope.video); + $modalInstance.close($scope.video.poster); + }; + + $scope.reencode = function () { + Zencoder.encode(videoId); + }; + + function compilePosterUrl(thumbnail) { + return CmsConfig.buildVideoThumbnailUrl(videoId, 'thumbnail_' + pad4(thumbnail) + '.png'); + } + + function pad4(num) { + var s = '0000' + num; + return s.substr(s.length - 4); + } + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .factory('AdApi', function (Restangular, adApiConfig) { + return Restangular.withConfig(function (RestangularConfigurer) { + RestangularConfigurer.setBaseUrl(adApiConfig.baseUrl); + }); + }) + .constant('adApiConfig', { + baseUrl: '/ads' + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .factory('BadRequestInterceptor', function ($q, $injector) { + return { + responseError: function (rejection) { + $injector.invoke(function ($modal) { + if (rejection.status === 400) { + var detail = rejection.data || {'something': ['Something was wrong with your request.']}; + $modal.open({ + templateUrl: '/views/modals/400-modal.html', + controller: 'BadrequestmodalCtrl', + resolve: { + detail: function () { return detail; } + } + }); + } + }); + return $q.reject(rejection); + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp').factory('BugReportInterceptor', function ($q, $window, PNotify) { + return { + responseError: function (rejection) { + if (rejection.status >= 500) { + var stack = { + animation: true, + dir1: 'up', + dir2: 'left' + }; + new PNotify({ + title: 'You found a bug!', + text: + 'Looks like something just went wrong, and we need your help to fix it! Report it, and we\'ll make sure it never happens again.', + type: 'error', + confirm: { + confirm: true, + align: 'left', + buttons: [{ + text: 'Report Bug', + addClass: 'btn-danger pnotify-report-bug', + click: function (notice) { + notice.remove(); + $window.showBugReportModal(); // see bugreporter.js + } + }, {addClass: 'hidden'}] // removing the "Cancel" button + }, + buttons: { + sticker: false + }, + icon: 'fa fa-bug pnotify-error-icon', + addclass: 'stack-bottomright', + stack: stack + }); + } + return $q.reject(rejection); + } + }; + }); +'use strict'; + +angular.module('bulbsCmsApp') + .config(function (RestangularProvider, bulbsApiConfig) { + // This is specific to Django Rest Framework + RestangularProvider.setResponseExtractor(function (response, operation, what, url) { + var newResponse = response; + if (operation === 'getList') { + if (typeof response.results !== 'undefined') { + newResponse = response.results; + newResponse.metadata = { + count: response.count, + next: response.next, + previous: response.previous + }; + } + } + return newResponse; + }); + if (bulbsApiConfig.requestSuffix) { + RestangularProvider.setRequestSuffix(bulbsApiConfig.requestSuffix); + } + }) + .constant('bulbsApiConfig', { + requestSuffix: '/' + }); +'use strict'; + +angular.module('bulbsCmsApp') + .factory('CmsNotificationsApi', function ($q, ContentFactory) { + return ContentFactory.service('cms_notifications'); + }); + +'use strict'; + +/** + * Service for authenticating and interacting with the root of this site in firebase. + */ +angular.module('bulbsCmsApp') + .factory('FirebaseApi', function (FirebaseRefFactory, $firebase, $rootScope, + $q, CurrentUserApi, CmsConfig) { + + // get root reference in firebase for this site + var rootRef = FirebaseRefFactory.newRef(CmsConfig.buildFirebaseSiteUrl()); + + // set up a promise for authorization + var authDefer = $q.defer(), + $authorize = authDefer.promise; + + // set up catch all for logging auth errors + $authorize + .catch(function (error) { + // if there's an error message log it + if (error) { + console.error('Firebase login failed:', error); + } + }); + + // log current session in when their current user data is available + CurrentUserApi.getCurrentUserWithCache().then(function (user) { + + // attempt to login if user has firebase token, if they don't auth promise will reject with no error message + // which is okay if we're in an environment where firebase isn't set up yet + if ('firebase_token' in user && user.firebase_token) { + + // authorize user + rootRef.auth(user.firebase_token, function (error) { + + if (error) { + + // authorization failed + authDefer.reject(error); + + } else { + + // authorization success, resolve deferred authorization with rootRef + authDefer.resolve(rootRef); + + } + + }); + + } else { + + // user doesn't have a firebase token, reject authorization without an error message + authDefer.reject(); + + } + + }); + + // emit events when firebase reconnects or disconnects, disconnect event should not be used in place of onDisconnect + // function provided by firebase reference objects + var connectedRef = FirebaseRefFactory.newRef(CmsConfig.buildFirebaseUrl('.info/connected')); + connectedRef.on('value', function (connected) { + + if (connected.val()) { + + $rootScope.$emit('firebase-reconnected'); + + } else { + + $rootScope.$emit('firebase-disconnected'); + + } + + $rootScope.$emit('firebase-connection-state-changed'); + + }); + + // connection object + var $connection = { + onConnect: function (callback) { + $rootScope.$on('firebase-reconnected', callback); + return $connection; + }, + onDisconnect: function (callback) { + $rootScope.$on('firebase-disconnected', callback); + return $connection; + }, + onChange: function (callback) { + $rootScope.$on('firebase-connection-state-changed', callback); + } + }; + + return { + + /** + * Authorization deferred promise that resolves with the root firebase reference, or rejects with an error + * message. + */ + $authorize: function () { return $authorize; }, + + /** + * Provides access to Firebase connection and disconnection event listeners. + */ + $connection: $connection + + }; + + }); + +'use strict'; + +/** + * Factory for getting references to articles as they are stored in firebase. + */ +angular.module('bulbsCmsApp') + .factory('FirebaseArticleFactory', function ($q, $firebase, $routeParams, _, moment, + FirebaseApi, CurrentUserApi, CmsConfig) { + + /** + * Create a new article. + * + * @param rootRef root reference of firebase db. + * @param articleId id of article to create. + * @return article object. + */ + var createArticle = function (rootRef, articleId) { + + var articleRef = rootRef.child('articles/' + articleId), + $activeUsers = $firebase(articleRef.child('users')).$asArray(), + $versions = $firebase(articleRef.child('versions')).$asArray(); + + var addCurrentUserToActiveUsers = function () { + + var registeredDeferred = $q.defer(), + registeredPromise = registeredDeferred.promise; + + CurrentUserApi.getCurrentUserWithCache() + .then(function (user) { + + var simplifiedUser = _.pick(user, [ + 'id', + 'displayName' + ]); + + $activeUsers + .$add(simplifiedUser) + .then(function (userRef) { + + // ensure user is removed on disconnect + userRef.onDisconnect().remove(); + + // resolve registration + registeredDeferred.resolve(simplifiedUser); + + }) + .catch(function (error) { + registeredDeferred.reject(error); + }); + + }) + .catch(function (error) { + registeredDeferred.reject(error); + }); + + return registeredPromise; + + }; + + var registerCurrentUserActive = function () { + + // ensure when reconnection occurs, user is added back to active users + FirebaseApi.$connection.onConnect(addCurrentUserToActiveUsers); + + // add current user and return promise + return addCurrentUserToActiveUsers(); + + }; + + return { + + /** + * Raw firebase article reference. + */ + ref: articleRef, + /** + * Get angularfire live array of article's currently active users. + */ + $activeUsers: function () { return $activeUsers; }, + /** + * Get angularfire live array of article versions. + */ + $versions: function () { return $versions; }, + /** + * Register a user as active with this article. + * + * @returns deferred promise that will resolve with the user reference as added to the active user list. + */ + $registerCurrentUserActive: registerCurrentUserActive, + + /** + * Create a new version for this article. + * + * @param articleData Content to store in the version. + * @returns deferred promise that will resolve with the version reference as added to the versions list. + * Promise is rejected if for some reason create did not occur (eg nothing changed since last version). + */ + $createVersion: function (articleData) { + + // defer for creation of version + var createDefer = $q.defer(), + $createPromise = createDefer.promise; + + // get simplified version of user then use that when creating version + CurrentUserApi.getCurrentUserWithCache().then(function (user) { + + var simplifiedUser = _.pick(user, [ + 'id', + 'displayName' + ]); + + // if we will have more than the max versions allowed, delete until we're one below the max + var numVersions = $versions.length; + if (numVersions + 1 > CmsConfig.getFirebaseMaxArticleHistory()) { + _.chain($versions) + // sort oldest to newest + .sortBy(function (version) { + return version.timestamp; + }) + // remove oldest versions until we're 1 below max versions + .every(function (version) { + $versions.$remove(version); + numVersions--; + return numVersions + 1 > CmsConfig.getFirebaseMaxArticleHistory(); + }); + } + + // make version data + var versionData = { + timestamp: moment().valueOf(), + user: simplifiedUser, + content: articleData + }; + + // add version to version data + $versions.$add(versionData) + .then(createDefer.resolve) + .catch(createDefer.reject); + + }); + + // return promise for this create + return $createPromise; + + } + + }; + + }; + + return { + + /** + * Retrieve an article object that is connected to firebase. + * + * @param articleId id of article to retrieve. + * @returns deferred promise that will resolve with the article object. + */ + $retrieveArticle: function (articleId) { + + var retrieveDeferred = $q.defer(), + retrievePromise = retrieveDeferred.promise; + + FirebaseApi.$authorize() + .then(function (rootRef) { + retrieveDeferred.resolve(createArticle(rootRef, articleId)); + }) + .catch(function (error) { + retrieveDeferred.reject(error); + }); + + return retrievePromise; + + }, + /** + * Retrieve current article object that is connected to firebase. + * + * @returns deferred promise that will resolve with the current article object. + */ + $retrieveCurrentArticle: function () { + + return this.$retrieveArticle($routeParams.id); + + } + + }; + + }); + +'use strict'; + +/** + * Factory for creating new references to firebase. + */ +angular.module('bulbsCmsApp') + .service('FirebaseRefFactory', function (Firebase) { + + return { + newRef: function (url) { + return new Firebase(url); + } + }; + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .service('Gettemplate', function Gettemplate($templateCache, $q, $http) { + this.get = function (templateUrl) { + var template = $templateCache.get(templateUrl); + if (template) { + return $q.when(template); + } else { + var deferred = $q.defer(); + $http.get(templateUrl, {cache: true}).success(function (html) { + $templateCache.put(templateUrl, html); + deferred.resolve(html); + }); + + return deferred.promise; + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .service('IfExistsElse', function IfExistsElse($window, $http) { + // AngularJS will instantiate a singleton by calling "new" on this function + this.ifExistsElse = function (restQ, propertiesToValues, existsCbk, elseCbk, errorCbk) { + //another place where I need to figure out promises and make this way better + restQ.then(function (data) { + var resList = data.results || data; + for (var j = 0; j < resList.length; j++) { + var allFieldsMatch = true; + var datum = resList[j]; + for (var property in propertiesToValues) { + if (!datum.hasOwnProperty(property)) { + allFieldsMatch = false; + break; + } + //console.log("property: " + property) + if (datum[property] !== propertiesToValues[property]) { + //console.log(resList[j][property] + " != " + propertiesToValues[property]) + allFieldsMatch = false; + break; + } + } + if (allFieldsMatch) { + existsCbk(datum); + return; + } + } + elseCbk(propertiesToValues); + }).catch(errorCbk); + }; + }); + +'use strict'; + +/** + * Methods to create and retrieve versions in local storage. Articles are stored as json strings under the keys + * 'article.{timestamp}.{article id}'. When local storage is full, it will attempt to remove values older than + * yesterday. + */ +angular.module('bulbsCmsApp') + .factory('LocalStorageBackup', function ($q, $routeParams, $window, moment, _, + CurrentUserApi) { + + var keyPrefixArticle = 'article'; + var keyPrefix = keyPrefixArticle + '.' + $routeParams.id + '.'; + + return { + + /** + * Save content to local storage. + * + * @param articleData Content to save to local storage. + * @return New version data or null if no version was created. + */ + $create: function (articleData) { + + var createDefer = $q.defer(), + createPromise = createDefer.promise; + + // check if we have local storage + if ($window.localStorage) { + CurrentUserApi.getCurrentUserWithCache().then(function (user) { + + var simplifiedUser = _.pick(user, [ + 'id', + 'displayName' + ]); + + // create new version object + var version = { + timestamp: moment().valueOf(), + user: simplifiedUser, + content: articleData + }; + + try { + + // create new local storage item with version content + $window.localStorage.setItem(keyPrefix + moment().valueOf(), JSON.stringify(version)); + createDefer.resolve(version); + + } catch (error) { + + // some error occurred, prune entries older than yesterday + console.log('Caught localStorage error: ' + error); + console.log('Pruning old entries...'); + + // loop through local storage keys and see if they're old + _.chain($window.localStorage) + // pick keys that are articles and that are older than yesterday + .pick(function (value, key) { + var keySplit = key.split('.'), + pickForRemoval = false; + // check that this is an article in storage + if (keySplit.length === 3 && keySplit[0] === keyPrefixArticle) { + var yesterday = moment().subtract({days: 1}).valueOf(), + keyTime = Number(keySplit[2]); + // if older than yesterday, pick the key for removal + pickForRemoval = keyTime < yesterday; + } + // return our result + return pickForRemoval; + }) + // these keys should be removed from local storage + .each(function (value, key) { + $window.localStorage.removeItem(key); + }); + + // now try to add entry again + try { + $window.localStorage.setItem(version.timestamp, JSON.stringify(version.content)); + createDefer.resolve(version); + } catch (error) { + // total failure, reject with an error. + console.log('Maybe you\'ve been saving too much? Failed again at adding entry, no more retries: ' + error); + createDefer.reject('Maybe you\'ve been saving too much? Failed again at adding entry, no more retries: ' + error); + } + } + }); + + } else { + // no local storage, why are we here? + createDefer.reject('You don\'t have local storage capabilities in your browser. Use a better browser.'); + } + + return createPromise; + + }, + /** + * Get all versions for this article in local storage. No guarantee of order. + * + * @return objects returned contain a timestamp and a content variable which holds the version's content. + */ + $versions: function () { + + // note: using a promise here to better match the version api functionality + var retrieveDefer = $q.defer(), + retrievePromise = retrieveDefer.promise, + versions = + // loop through entries of local storage + _.chain($window.localStorage) + // pick only entries that are for this particular article + .pick(function (stored, key) { + var keySplit = key.split('.'); + return keySplit.length === 3 && keySplit[0] === keyPrefixArticle && keySplit[1] === $routeParams.id; + }) + // parse and map these entries into an array + .map(function (stored) { + return JSON.parse(stored); + }) + // return the array of version objects + .value(); + + retrieveDefer.resolve(versions); + + return retrievePromise; + + } + + }; + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .service('Login', function Login($rootScope, $http, $cookies, $window, $) { + + $rootScope.$watch(function () { + return $cookies.csrftoken; + }, function (newCsrf, oldCsrf) { + $http.defaults.headers.common['X-CSRFToken'] = newCsrf; + if ($window.jqueryCsrfSetup) { + $window.jqueryCsrfSetup(); + } + }); + + return { + login: function (username, password) { + var data = $.param({username: username, password: password}); + return $http({ + method: 'POST', + url: '/login/', + data: data, + headers: {'Content-Type': 'application/x-www-form-urlencoded'} + }); + } + }; + }); + +'use strict'; + /* helpful SO question on injecting $modal into interceptor and doing intercept pass-through + http://stackoverflow.com/questions/14681654/i-need-two-instances-of-angularjs-http-service-or-what + */ +angular.module('bulbsCmsApp').factory('PermissionsInterceptor', function ($q, $injector) { + return { + responseError: function (rejection) { + if (rejection.config && rejection.config.noPermissionIntercept) { + return $q.when(rejection); + } else { + $injector.invoke(function ($modal) { + if (rejection.status === 403) { + if (rejection.data && rejection.data.detail && rejection.data.detail.indexOf('credentials') > 0) { + $modal.open({ + templateUrl: '/views/modals/login-modal.html', + controller: 'LoginmodalCtrl' + }); + } else { + var detail = rejection.data && rejection.data.detail || 'Forbidden'; + $modal.open({ + templateUrl: '/views/modals/403-modal.html', + controller: 'ForbiddenmodalCtrl', + resolve: { + detail: function () { return detail; } + } + }); + } + } + }); + return $q.reject(rejection); + } + } + }; +}); + +'use strict'; + +angular.module('bulbsCmsApp') + .factory('TemporaryUrlModalOpener', function ($modal) { + + var modal = null; + + return { + open: function ($scope, article) { + // ensure only one version browser is open at a time + if (modal) { + modal.close(); + } + + modal = $modal.open({ + templateUrl: '/views/modals/temporary-url-modal.html', + controller: 'TemporaryUrlModalCtrl', + scope: $scope, + resolve: { + article: function () { + return article; + } + } + }); + + return modal; + } + }; + + }); + +'use strict'; + +/** + * Api for saving article versions. Will automatically detect and attempt to use firebase, otherwise local storage + * will be used for versions. + * + * This API expects all version objects to be in at least the following form: + * + * { + * timestamp: Number - timestamp in ms for this version + * content: Object - content this version holds, which in this case is an article object + * } + */ +angular.module('bulbsCmsApp') + .factory('VersionStorageApi', function ($q, FirebaseApi, FirebaseArticleFactory, LocalStorageBackup, _) { + + // set up a promise for checking if we can authorize with firebase + var firebaseAvailableDefer = $q.defer(), + $firebaseAvailable = firebaseAvailableDefer.promise; + FirebaseApi.$authorize() + .then(function () { + + // we have a firebase connection, use firebase for versioning + firebaseAvailableDefer.resolve(FirebaseArticleFactory.$retrieveCurrentArticle()); + + }) + .catch(function () { + + // we don't have a firebase connection, use local storage for versioning + firebaseAvailableDefer.reject(); + + }); + + /** + * Memoized omitting function for deep scrubbing. + */ + var _omitter = _.memoize( + function (value, key) { + return _.isFunction(value) || + _.find(key, function (c) { + return c === '.' || c === '#' || c === '$' || c === '/' || c === '[' || c === ']'; + }); + }, + function (value, key) { + return [key, value]; + }); + + /** + * Recursively scrub object of functions and turn undefines into null, makes object valid for saving in firebase. + * + * @param obj object to recurse through + */ + var _deepScrub = function (obj) { + + var clone, transValue; + + if (_.isUndefined(obj)) { + // turn undefineds into nulls, this allows deletion of property values + clone = null; + } else if (_.isPlainObject(obj)) { + // this is an object, use omit to recurse through its members + clone = {}; + _.forOwn(obj, function (value, key) { + // run value through recursive omit call + transValue = _deepScrub(value); + // check if this should be omitted, if not clone it over + if (!_omitter(transValue, key)) { + clone[key] = transValue; + } + }); + } else if (_.isArray(obj)) { + // this is an array, loop through items use omit to decide what to do with them + clone = []; + _.each(obj, function (value, key) { + // run value through recursive omit call + transValue = _deepScrub(value); + // check if this should be omitted, if not clone over + if (!_omitter(transValue, key)) { + clone.push(transValue); + } + }); + } else { + // not a special case, just return object + clone = obj; + } + + return clone; + + }; + + /** + * Keep only the data we want to persist for an article. Does a deep clone to scrub sub-objects. + * + * @param articleData data to scrub. + */ + var scrubArticle = function (articleData) { + + return _deepScrub(articleData); + + }; + + return { + + /** + * Create a new version either in firebase or in local storage. + * + * @param rawArticleData raw article data to copy and transform before saving. + * @param articleIsDirty true if the article has unsaved changes, false otherwise. + * @return a promise that resolves on creation with a version object that contains timestamp and content + * properties. + */ + $create: function (rawArticleData, articleIsDirty) { + + // get article data that we want to save + var articleData = scrubArticle(rawArticleData); + + // create deferred to return + var createDefer = $q.defer(), + createPromise = createDefer.promise; + + // article is dirty and should be saved, check if firebase is being used + $firebaseAvailable + .then(function ($currentArticle) { + + // if article is dirty or there are no versions, attempt to create one using firebase + if (articleIsDirty || $currentArticle.$versions().length < 1) { + + // we do have firebase, so use firebase + $currentArticle.$createVersion(articleData) + .then(function (versionData) { + // create occurred, resolve it with new version data + createDefer.resolve(versionData); + }) + .catch(function () { + // create didn't occur, reject promise + createDefer.reject(); + }); + + } else { + + // article is not dirty, reject create + createDefer.reject(); + + } + + }) + .catch(function () { + + LocalStorageBackup.$versions().then(function (versions) { + + // if article is dirty or there are no versions, attempt to create one using local storage + if (articleIsDirty || versions.length < 1) { + + // create version with local storage + LocalStorageBackup.$create(articleData) + .then(function (versionData) { + // version was created, resolve create defer with version data + createDefer.resolve(versionData); + }) + .catch(function (error) { + // version was not created, pass on error + createDefer.reject(error); + }); + + } else { + + // article is not dirty, reject create + createDefer.reject(); + + } + + }); + + }); + + // return create promise + return createPromise; + + }, + /** + * Retrieve all versions either from firebase or local storage. + * @return list of version objects sorted by timestamp descending. + */ + $all: function () { + + // set up deferred objects for all retrieval + var allDefer = $q.defer(), + allPromise = allDefer.promise; + + // check if we have firebase + $firebaseAvailable + .then(function ($currentArticle) { + + // we do have firebase, so use firebase + $currentArticle.$versions().$loaded(function (versions) { + allDefer.resolve(versions); + }); + + }) + .catch(function () { + + // we don't have firebase so use local storage + LocalStorageBackup.$versions().then(function (versions) { + allDefer.resolve(versions); + }).catch(function (error) { + allDefer.reject(error); + }); + + }); + + // ensure versions are ordered by timestamp desc when they return + return allPromise.then(function (versions) { + return _.sortBy(versions, function (version) { + return -version.timestamp; + }); + }); + + } + + }; + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .factory('VersionBrowserModalOpener', function ($modal) { + + var modal = null; + + return { + open: function ($scope, article) { + // ensure only one version browser modal is open at a time + if (modal) { + modal.close(); + } + + modal = $modal.open({ + templateUrl: '/views/modals/version-browser-modal.html', + controller: 'VersionBrowserModalCtrl', + scope: $scope, + size: 'lg', + resolve: { + article: function () { + return article; + } + } + }); + + return modal; + } + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .service('Zencoder', function Zencoder($http, $q, $modal, $) { + var newVideoUrl = '/video/new'; + var fileInputId = '#bulbs-cms-hidden-video-file-input'; + var inputTemplate = ''; + + this.onVideoFileUpload = function () { + var clickDeferred = $q.defer(); + + angular.element(fileInputId).remove(); + var fileInput = angular.element(inputTemplate); + var file; + angular.element('body').append(fileInput); + fileInput.click(); + fileInput.unbind('change'); + fileInput.bind('change', function (elem) { + if (this.files.length !== 0) { + file = this.files[0]; + + // We have a file upload limit of 1024MB + if (file.size > (1024 * 1024 * 1024)) { + clickDeferred.reject('Upload file cannot be larger than 1024MB.'); + } + + if (file.type.indexOf('video/') !== 0) { + clickDeferred.reject('You must upload a video file.'); + } + } else { + clickDeferred.reject('Please select a file.'); + } + + getNewVideoUploadCredentials(file) + .then(uploadToS3) + .then(encode, angular.noop, function (uploadPercentComplete) { clickDeferred.notify(uploadPercentComplete); }) + .then( + function (videoObject) { + clickDeferred.resolve(videoObject); + }, + function (error) { + clickDeferred.reject(error); + } + ); + + }); + + return clickDeferred.promise; + }; + + function getNewVideoUploadCredentials(file) { + var data = {name: file.name}; + data = $.param(data); + + var newVideoDeferred = $q.defer(); + + $http({ + method: 'POST', + url: newVideoUrl, + data: data, + headers: {'Content-Type': 'application/x-www-form-urlencoded'} + }).success(function (data) { + newVideoDeferred.resolve({ + file: file, + attrs: data + }); + }).error(function (data) { + newVideoDeferred.reject(data); + }); + + return newVideoDeferred.promise; + } + + function uploadToS3(videoObject) { + var s3deferred = $q.defer(); + + var formData = new FormData(); + + formData.append('key', videoObject.attrs.key); + formData.append('AWSAccessKeyId', videoObject.attrs.AWSAccessKeyId); + formData.append('acl', videoObject.attrs.acl); + formData.append('success_action_status', videoObject.attrs.success_action_status); + formData.append('policy', videoObject.attrs.policy); + formData.append('signature', videoObject.attrs.signature); + formData.append('file', videoObject.file); + + //todo: use a vanilla XMLHttpRequest in heyea + $.ajax(videoObject.attrs.upload_endpoint, { + processData: false, + contentType: false, + data: formData, + type: 'POST', + xhr: function () { + var req = $.ajaxSettings.xhr(); + if (req) { + req.upload.addEventListener('progress', function (e) { + var percent = (e.loaded / e.total) * 100; + s3deferred.notify(percent); + }, false); + } + return req; + }, + success: function (data) { + s3deferred.resolve(videoObject); + }, + error: function (data) { + s3deferred.reject(data); + } + }); + + return s3deferred.promise; + + } + + function encode(videoObject) { + var encodeDeferred = $q.defer(); + + $http({ + method: 'POST', + url: '/video/' + videoObject.attrs.id + '/encode' + }).success(function (data) { + videoObject.attrs['encode_status_endpoints'] = data; + _encodingVideos[videoObject.attrs.id] = videoObject.attrs; + + encodeDeferred.resolve(videoObject); + }).error(function (data) { + encodeDeferred.reject(data); + }); + + return encodeDeferred.promise; + } + this.encode = function (videoId) { + encode({attrs: {id: videoId}}); + }; + + this.openVideoThumbnailModal = function (videoId) { + return $modal.open({ + templateUrl: '/views/modals/video-thumbnail-modal.html', + controller: 'VideothumbnailmodalCtrl', + resolve: { + videoId: function () { return videoId; } + } + }); + }; + + this.getVideo = function (videoId) { + var url = '/video/' + videoId; + return $http({ + method: 'GET', + url: url + }); + }; + + this.setVideo = function (video) { + var url = '/video/' + video.id; + var data = $.param(video); + return $http({ + method: 'POST', + url: url, + data: data, + headers: {'Content-Type': 'application/x-www-form-urlencoded'} + }); + }; + + var _encodingVideos = {}; + this.encodingVideos = _encodingVideos; + + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .filter('truncateByCharacters', function () { + return function (input, chars, breakOnWord) { + if (isNaN(chars)) { return input; } + if (chars <= 0) { return ''; } + if (input && input.length >= chars) { + input = input.substring(0, chars); + if (!breakOnWord) { + var lastspace = input.lastIndexOf(' '); + //get last space + if (lastspace !== -1) { + input = input.substr(0, lastspace); + } + } else { + while (input.charAt(input.length - 1) === ' ') { + input = input.substr(0, input.length - 1); + } + } + if (chars === 1) { + return input + '.'; + } else { + return input + '...'; + } + } + return input; + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .filter('truncateByWords', function () { + return function (input, words) { + if (isNaN(words)) { return input; } + if (words <= 0) { return ''; } + if (input) { + var inputWords = input.split(/\s+/); + if (inputWords.length > words) { + input = inputWords.slice(0, words).join(' ') + '...'; + } + } + return input; + }; + }); + +'use strict'; + +angular.module('bulbsCmsApp') + .filter('tzDate', function (dateFilter, moment, CmsConfig) { + return function (input, format) { + if (!input) { + return ''; + } + var inDate = moment.tz(input, CmsConfig.getTimezoneName()); + var newdate = inDate.format('YYYY-MM-DDTHH:mm'); + var formattedDate = dateFilter(newdate, format); + if (format.toLowerCase().indexOf('h') > -1) { + formattedDate += ' ' + inDate.format('z'); + } + return formattedDate; + }; + }); diff --git a/dist/scripts/scripts.min.js b/dist/scripts/scripts.min.js new file mode 100644 index 000000000..26ddd9979 --- /dev/null +++ b/dist/scripts/scripts.min.js @@ -0,0 +1,9 @@ +!function(w){function computeStyle(element,image,selection){var scale,selector='.image[data-image-id="'+image.id+'"]>div',elementWidth=$(selector).width(),elementHeight=image.height/image.width*elementWidth,s_width=selection.x1-selection.x0,s_height=selection.y1-selection.y0,tmp_selection=selection;s_width&&s_height||(s_width=elementWidth,s_height=elementHeight,tmp_selection={x0:0,y0:0,x1:s_width,y1:s_height});var imageUrl=w.BC_ADMIN_URL+"/"+image.id+"/original/1200.jpg";scale=elementWidth/s_width;var rules={"background-image":"url("+imageUrl+")","background-size":scaleNumber(image.width,scale)+"px","background-position":"-"+scaleNumber(tmp_selection.x0,scale)+"px -"+scaleNumber(tmp_selection.y0,scale)+"px","background-repeat":"no-repeat"};createStyle(selector,rules,"image-css-"+image.id)}function createStyle(selector,rules,classname){var styleNode=document.createElement("style");styleNode.type="text/css",styleNode.className=classname;var css="",temp=""+selector+"{";for(var rule in rules)temp+=rule+":"+rules[rule]+";";temp+="}",css+=temp,styleNode.styleSheet?styleNode.styleSheet.cssText=css:styleNode.appendChild(document.createTextNode(css)),$(document).find("head").append(styleNode)}function scaleNumber(num,by_scale){return Math.floor(num*by_scale)}function computeAspectRatio(_w,_h){if(0!==_w&&0!==_h){var aspectRatio=Math.ceil(_w/_h*10);switch(aspectRatio){case 30:case 31:crop="3x1";break;case 20:crop="2x1";break;case 14:crop="4x3";break;case 18:crop="16x9";break;case 8:crop="3x4";break;case 10:crop="1x1";break;default:crop="original"}return crop}return"16x9"}w.picturefill=function(element){var ps;element&&"image"===element.getAttribute("data-type")?ps=[element]:("undefined"==typeof element&&(element=w.document),ps=element.getElementsByTagName("div"));for(var i=0,il=ps.length;idiv',{"padding-bottom":res.height/res.width*100+"%"},"image-css-"+this.id);var cropDetails={x0:0,x1:res.width,y0:0,y1:res.height}}else var cropDetails=imageData.selections[this.crop];computeStyle(this.element,imageData,cropDetails)},{element:element,id:id,crop:crop}),error:$.proxy(function(){"original"===this.crop&&createStyle('.image[data-image-id="'+this.id+'"]>div',{"padding-bottom":"56.25%","background-color":"rgba(200, 0,0, .5)"},"image-css-"+this.id)},{id:id,crop:crop})}))}}}}}(this),angular.module("lodash",[]).constant("_",window._),angular.module("URLify",[]).constant("URLify",window.URLify),angular.module("jquery",[]).constant("$",window.$),angular.module("moment",[]).constant("moment",window.moment),angular.module("PNotify",[]).constant("PNotify",window.PNotify),angular.module("keypress",[]).constant("keypress",window.keypress),angular.module("Raven",[]).constant("Raven",window.Raven),angular.module("OnionEditor",[]).constant("OnionEditor",window.OnionEditor),angular.module("bulbsCmsApp",["bulbs.cms.site.config","bulbs.cms.superFeatures","bulbs.cms.currentUser","bulbs.cms.dateTimeModal","bulbs.cms.dateTimeFilter","bulbs.cms.editor","bulbs.cms.imageCropModal","bulbs.cms.liveBlog","bulbs.cms.sendToEditorModal","bulbs.cms.staticImage","ngCookies","ngResource","ngRoute","ui.bootstrap","ui.bootstrap.datetimepicker","restangular","BettyCropper","jquery","lodash","URLify","moment","PNotify","keypress","Raven","firebase","ipCookie","bulbs.api","contentServices","cms.tunic","bettyEditable","bugReporter","campaigns","evergreenField","hideFromRssField","filterWidget","filterListWidget","notifications","polls","promotedContent","statusFilter","templateTypeField","specialCoverage","sections","reports"]).config(function($locationProvider,$routeProvider,$sceProvider){$locationProvider.html5Mode(!0),$routeProvider.when("/cms/app/list/",{templateUrl:"/views/contentlist.html",controller:"ContentlistCtrl",reloadOnSearch:!1}).when("/cms/app/edit/:id/contributions/",{templateUrl:"/views/contributions.html",controller:"ContributionsCtrl"}).when("/cms/app/edit/:id/:contentType?",{templateUrl:"/views/contentedit.html",controller:"ContenteditCtrl",reloadOnSearch:!1}).when("/cms/app/targeting/",{templateUrl:"/views/targeting-editor.html",controller:"TargetingCtrl"}).when("/cms/app/cms-notifications/",{templateUrl:"/views/cms-notifications.html",controller:"CmsNotificationsCtrl"}).when("/cms/app/reporting/",{templateUrl:"/views/reporting.html",controller:"ReportingCtrl"}).when("/cms/app/pzones/",{templateUrl:"/views/pzones.html",controller:"PzoneCtrl"}).otherwise({redirectTo:"/cms/app/list/"}),$sceProvider.enabled(!1)}).config(function($provide,$httpProvider){$provide.decorator("$exceptionHandler",function($delegate){return function(exception,cause){$delegate(exception,cause),window.Raven.captureException(exception)}}),$httpProvider.interceptors.push("BugReportInterceptor"),$httpProvider.interceptors.push("PermissionsInterceptor"),$httpProvider.interceptors.push("BadRequestInterceptor"),$httpProvider.interceptors.push("TunicInterceptor")}).run(function($rootScope,$http,$cookies){$http.defaults.headers.common["X-CSRFToken"]=$cookies.csrftoken;var deleteHeaders=$http.defaults.headers.delete||{};deleteHeaders["X-CSRFToken"]=$cookies.csrftoken,$http.defaults.headers.delete=deleteHeaders}),angular.module("bulbs.api",["restangular","moment"]),angular.module("bulbs.api").factory("AuthorService",function(Restangular){return Restangular.setBaseUrl("/cms/api/v1/"),Restangular.setRequestSuffix("/"),Restangular.extendModel("author",function(obj){return angular.extend(obj,{getFullName:function(){return obj.first_name+" "+obj.last_name}})}),Restangular.all("author")}),angular.module("bulbs.api").factory("ContentService",function(Restangular){return Restangular.setBaseUrl("/cms/api/v1/"),Restangular.setRequestSuffix("/"),Restangular.extendModel("content",function(obj){var extendAuthor=function(author){return angular.extend(author,{getFullName:function(){return obj.contributor.first_name+" "+obj.contributor.last_name}})};for(var i in obj.authors)obj.authors[i]=extendAuthor(obj.authors[i]);return obj}),Restangular.extendModel("contributions",function(obj){return obj&&obj.contributor&&(obj.contributor=angular.extend(obj.contributor,{getFullName:function(){return obj.contributor.first_name+" "+obj.contributor.last_name}})),obj}),Restangular.extendCollection("contributions",function(collection){return collection.save=function(data){return collection.post(data).then(function(contributions){return Restangular.restangularizeCollection("contributions",contributions)})},collection}),Restangular.service("content")}),angular.module("bulbs.api").factory("ContributionRoleService",function(Restangular){return Restangular.withConfig(function(RestangularConfigurer){RestangularConfigurer.setBaseUrl("/cms/api/v1/contributions/"),RestangularConfigurer.setRequestSuffix("/")}).service("role")}).factory("ContentReportingService",function(Restangular){return Restangular.withConfig(function(RestangularConfigurer){RestangularConfigurer.setBaseUrl("/cms/api/v1/contributions/"),RestangularConfigurer.setRequestSuffix("/")}).service("contentreporting")}).factory("FreelancePayReportingService",function(Restangular,moment){return Restangular.withConfig(function(RestangularConfigurer){RestangularConfigurer.setBaseUrl("/cms/api/v1/contributions/"),RestangularConfigurer.setRequestSuffix("/")}).service("freelancereporting")}).factory("ContributionReportingService",function(Restangular,moment){return Restangular.extendModel("reporting",function(obj){return obj.user=angular.extend(obj.user,{toString:function(){return obj.user.full_name||obj.user.username}}),obj.content=angular.extend(obj.content,{toString:function(){return obj.content.title+" ("+moment(obj.content.published).format("MM/DD/YYYY h:mm a")+")"}}),obj}),Restangular.withConfig(function(RestangularConfigurer){RestangularConfigurer.setBaseUrl("/cms/api/v1/contributions/"),RestangularConfigurer.setRequestSuffix("/")}).service("reporting")}),function(){function BettyCropperService($http,$interpolate,$q,CmsConfig,BettyImage,$){function upload(){var uploadImageDeferred=$q.defer();angular.element(fileInputId).remove();var fileInput=angular.element(inputTemplate);return angular.element("body").append(fileInput),fileInput.click(),fileInput.unbind("change"),fileInput.bind("change",function(e){1!==e.target.files.length&&uploadImageDeferred.reject("We need exactly one image!");var file=e.target.files[0];0!==file.type.indexOf("image/")&&uploadImageDeferred.reject("Not an image!"),file.size>10485760&&uploadImageDeferred.reject("The file is too large!");var imageData=new FormData;imageData.append("image",file),$http({method:"POST",url:CmsConfig.buildImageApiUrl("api/new"),headers:{"X-Betty-Api-Key":CmsConfig.getImageApiKey(),"Content-Type":void 0,"X-CSRFToken":void 0},data:imageData,transformRequest:angular.identity,transformResponse:function(data,headersGetter){"string"==typeof data&&(data=$.parseJSON(data));var image=new BettyImage(data);return image}}).success(function(success){uploadImageDeferred.resolve(success)}).error(function(error){uploadImageDeferred.reject(error)})}),uploadImageDeferred.promise}function get(id){return $http({method:"GET",url:CmsConfig.buildImageApiUrl("api/"+id),headers:{"X-Betty-Api-Key":CmsConfig.getImageApiKey(),"Content-Type":void 0,"X-CSRFToken":void 0},transformRequest:angular.identity,transformResponse:function(data,headersGetter){return"string"==typeof data&&(data=$.parseJSON(data)),new BettyImage(data)}})}function detailPatch(id,name,credit,selections){return $http({method:"PATCH",url:CmsConfig.buildImageApiUrl("api/"+id),headers:{"X-Betty-Api-Key":CmsConfig.getImageApiKey(),"Content-Type":void 0,"X-CSRFToken":void 0},data:{name:name,credit:credit,selections:selections},transformRequest:angular.identity,transformResponse:function(data,headersGetter){return"string"==typeof data&&(data=$.parseJSON(data)),new BettyImage(data)}})}function updateSelection(id,ratio,selections){return $http({method:"POST",url:CmsConfig.buildImageApiUrl("api/"+id+"/"+ratio),headers:{"X-Betty-Api-Key":CmsConfig.getImageApiKey(),"Content-Type":void 0,"X-CSRFToken":void 0},data:selections})}var fileInputId="#bulbs-cms-hidden-image-file-input",inputTemplate='';this.upload=upload,this.get=get,this.detail=get,this.detailPatch=detailPatch,this.updateSelection=updateSelection}function BettyImageFactory($interpolate,$http,CmsConfig,Selection,$){function BettyImage(data){this.id=data.id,this.name=data.name,this.width=data.width,this.height=data.height,this.selections={};for(var ratio in data.selections)this.selections[ratio]=new Selection(data.selections[ratio])}return BettyImage.prototype.scaleToFit=function(width,height){var scale;if(width&&height){var fitRatio=width/height,thisRatio=this.width/this.height;scale=fitRatio>thisRatio?height/this.height:width/this.width}else width&&(scale=width/this.width),height&&(scale=height/this.height);var scaled={width:Math.round(this.width*scale),height:Math.round(this.height*scale),scale:scale};return scaled},BettyImage.prototype.getStyles=function(width,height,ratio){0===height&&(height=null);var selection=this.selections[ratio],scaledSelection=selection.scaleToFit(width,height);return{"background-image":"url("+this.url("original",1200,"jpg")+")","background-size":Math.floor(scaledSelection.width()/selection.width()*this.width)+"px","background-position":"-"+scaledSelection.x0+"px -"+scaledSelection.y0+"px",height:scaledSelection.height()+"px",width:scaledSelection.width()+"px","background-repeat":"no-repeat",position:"relative"}},BettyImage.prototype.url=function(ratio,width,format){for(var exp=$interpolate("{{ base_url }}/{{ id }}/{{ ratio }}/{{ width }}.{{ format }}"),idStr=this.id.toString(),segmentedId="",i=0;ithisRatio?height/this.height():width/this.width()}else width&&(scale=width/this.width()),height&&(scale=height/this.height());return this.scaleBy(scale)},Selection}angular.module("BettyCropper",["bulbs.cms.site.config","restangular","jquery"]).factory("Selection",SelectionFactory).factory("BettyImage",BettyImageFactory).service("BettyCropper",BettyCropperService)}(),angular.module("autocompleteBasic",["bulbs.cms.site.config","BulbsAutocomplete","BulbsAutocomplete.suggest","lodash"]).value("AUTOCOMPLETE_BASIC_DEBOUNCE",200).directive("autocompleteBasic",["_","CmsConfig",function(_,CmsConfig){return{controller:["$scope","BULBS_AUTOCOMPLETE_EVENT_KEYPRESS","AUTOCOMPLETE_BASIC_DEBOUNCE",function($scope,BULBS_AUTOCOMPLETE_EVENT_KEYPRESS,AUTOCOMPLETE_BASIC_DEBOUNCE){$scope.writables={searchTerm:""},$scope.autocompleteItems=[];var $getItems=function(){return $scope.searchFunction($scope.writables.searchTerm).then(function(data){return _.map(data,function(item){return{name:$scope.displayFormatter(item),value:item}})})};$scope.updateAutocomplete=_.debounce(function(){$scope.writables.searchTerm&&$getItems().then(function(results){$scope.autocompleteItems=results})},AUTOCOMPLETE_BASIC_DEBOUNCE),$scope.delayClearAutocomplete=function(){_.delay(function(){$scope.clearAutocomplete(),$scope.$digest()},200)},$scope.clearAutocomplete=function(){$scope.writables.searchTerm="",$scope.autocompleteItems=[]},$scope.clearSelectionOverlay=function(){$scope.clearAutocomplete(),$scope.showSelectionOverlay=!1,$scope.updateNgModel(),$scope.onSelect({})},$scope.handleKeypress=function($event){27===$event.keyCode?$scope.clearAutocomplete():40===$event.keyCode&&_.isEmpty($scope.autocompleteItems)?$scope.updateAutocomplete():$scope.$broadcast(BULBS_AUTOCOMPLETE_EVENT_KEYPRESS,$event)},$scope.handleSelect=function(selection){selection&&$scope.updateNgModel&&($scope.updateNgModel(selection),$scope.showSelectionOverlay=!0),$scope.clearAutocomplete(),$scope.onSelect({selection:selection})}}],link:function(scope,iElement,iAttrs,ngModelCtrl){var defaultFormatter=function(context){return context.item};if(scope.valueFormatter=function(viewValue){return(scope.itemValueFormatter||defaultFormatter)({item:viewValue})},scope.displayFormatter=function(modelValue){return(scope.itemDisplayFormatter||defaultFormatter)({item:modelValue})},ngModelCtrl){ngModelCtrl.$formatters.push(function(modelValue){return scope.displayFormatter(modelValue)}),ngModelCtrl.$render=function(){scope.selectedValue=ngModelCtrl.$viewValue},ngModelCtrl.$parsers.push(function(viewValue){return scope.valueFormatter(viewValue)});var unbindInitialValue=scope.$watch("initialValue",function(){scope.selectedValue=scope.initialValue});scope.updateNgModel=function(selection){unbindInitialValue();var newValue=_.isUndefined(selection)?null:angular.copy(selection.value);ngModelCtrl.$setViewValue(angular.copy(newValue)),scope.selectedValue=scope.displayFormatter(newValue)}}},require:"?ngModel",restrict:"E",scope:{hideSearchIcon:"&",inputId:"@",inputPlaceholder:"@",initialValue:"=",itemDisplayFormatter:"&",itemValueFormatter:"&",onSelect:"&",searchFunction:"="},templateUrl:CmsConfig.buildComponentPath("autocomplete-basic/autocomplete-basic.html")}}]),angular.module("bettyEditable",["BettyCropper","bulbs.cms.imageCropModal","bulbs.cms.site.config","ui.bootstrap.modal"]).directive("bettyEditable",["$http","CmsConfig","BettyCropper","openImageCropModal",function($http,CmsConfig,BettyCropper,openImageCropModal){return{restrict:"E",templateUrl:CmsConfig.buildComponentPath("betty-editable/betty-editable.html"),scope:{addStyles:"@",editable:"=?",hideMetas:"=",image:"=",placeholderText:"@",ratio:"@",onChange:"&"},controller:function($scope,$element){$scope.editable=!angular.isDefined($scope.editable)||$scope.editable,$scope.upload=function(e){BettyCropper.upload().then(function(success){$scope.image={id:success.id,caption:null,alt:null},$scope.bettyImage=success},function(error){console.log(error)},function(progress){console.log(progress)})},$scope.edit=function(e){openImageCropModal($scope.image).then(function(image){null===image.id?$scope.image=null:($scope.image=image,BettyCropper.get($scope.image.id).then(function(response){$scope.bettyImage=response.data,$scope.setStyles()}))})}},link:function(scope,element,attrs){void 0===scope.bettyImage&&(scope.bettyImage=null),scope.setStyles=function(){if(scope.bettyImage)scope.imageStyling=scope.bettyImage.getStyles(element.parent().width(),null,scope.ratio);else{var ratioWidth=parseInt(scope.ratio.split("x")[0],10),ratioHeight=parseInt(scope.ratio.split("x")[1],10);scope.imageStyling={"background-color":"#333",position:"relative",width:element.parent().width(),height:Math.floor(element.parent().width()*ratioHeight/ratioWidth)+"px"}}},scope.$watch("image",function(newImage,oldImage){newImage&&newImage.id?BettyCropper.get(newImage.id).then(function(response){scope.bettyImage=response.data,oldImage&&parseInt(response.data.id,10)===oldImage.id||scope.onChange()}):angular.equals(newImage,oldImage)||scope.onChange()}),scope.$watch("bettyImage",function(newImage,oldImage){scope.setStyles()},!0),element.resize(scope.setStyles),scope.removeImage=function(){scope.image=null},scope.editImage=function(){openImageCropModal(scope.image).then(function(success){console.log(success)})}}}}]),angular.module("bulbs.cms.breadcrumb",["bulbs.cms.site.config","bulbs.cms.superFeatures.api"]).directive("breadcrumb",["$sce","CmsConfig",function($sce,CmsConfig){return{scope:{linksList:"="},link:function(scope,element,attrs){scope.renderValue=function(value){return $sce.trustAsHtml(angular.isFunction(value)?value():value)}},templateUrl:CmsConfig.buildComponentPath("breadcrumb","breadcrumb.html")}}]),angular.module("bugReporter",["bulbs.cms.config"]).directive("bugReporter",["$http","$window","CmsConfig",function($http,$window,CmsConfig){return{restrict:"E",templateUrl:CmsConfig.buildComponentPath("bug-reporter/bug-reporter-button.html"),scope:{},controller:function($scope,$element,$timeout){$scope.report={},$scope.reportButton={idle:"Submit",busy:"Sending",finished:"Sent!",error:"Error!"},$scope.modalVisible=!1,$scope.showThankYou=!1,$scope.showModal=function(){$scope.modalVisible=!0},$scope.dismissModal=function(){$scope.modalVisible=!1,$scope.showThankYou=!1},$scope.sendToWebtech=function(){var report="When I tried to:\n\n"+$scope.report.firstRes+"\n\nI thought this would happen:\n\n"+$scope.report.secondRes+"\n\n...but this happened instead:\n\n"+$scope.report.thirdRes,data={report:report,url:$window.location.href,user_agent:$window.navigator.userAgent};return $http.post("/cms/api/v1/report-bug/",data)},$scope.sendToWebtechCbk=function(promise){promise.then(function(){$scope.showThankYou=!0,$timeout(function(){$scope.dismissModal();for(var entry in $scope.report)$scope.report[entry]=""},5e3)})},$window.showBugReportModal=function(){$scope.$apply($scope.showModal())}},link:function(scope,element){}}}]),angular.module("campaignAutocomplete",["autocompleteBasic","bulbs.cms.site.config","cms.tunic.config","lodash","uuid4"]).directive("campaignAutocomplete",["$http","CmsConfig","TunicConfig","uuid4","_",function($http,CmsConfig,TunicConfig,uuid4,_){return{controller:["$scope",function($scope){$scope.itemDisplayFormatter=function(campaign){if(_.isObject(campaign))return campaign.name+" - "+campaign.id},$scope.itemValueFormatter=function(campaign){return _.isObject(campaign)?campaign.id:null},$scope.searchCampaigns=function(searchTerm){return $http.get(TunicConfig.buildBackendApiUrl("campaign/"),{params:{search:searchTerm}}).then(function(response){return response.data.results})}}],link:function(scope,iElement,iAttrs,ngModelCtrl){scope.uuid=uuid4.generate(),ngModelCtrl&&(scope.ngModel=ngModelCtrl,ngModelCtrl.$render=function(){_.isNumber(ngModelCtrl.$modelValue)&&!scope.initialValue&&$http.get(TunicConfig.buildBackendApiUrl("campaign/"+ngModelCtrl.$modelValue+"/")).then(function(result){scope.initialValue=scope.itemDisplayFormatter(result.data)})},scope.onSelect=function(selection){ngModelCtrl.$commitViewValue()})},restrict:"E",templateUrl:CmsConfig.buildComponentPath("campaign-autocomplete/campaign-autocomplete.html"),require:"ngModel",scope:{label:"@campaignAutocompleteLabel",onSelect:"&campaignAutocompleteOnSelect"}}}]),angular.module("campaigns.edit.directive",["apiServices.campaign.factory","BettyCropper","bulbs.cms.site.config","campaigns.edit.sponsorPixel","lodash","saveButton.directive","topBar"]).directive("campaignsEdit",function(CmsConfig){return{controller:function(_,$location,$q,$routeParams,$scope,Campaign){"new"===$routeParams.id?($scope.model=Campaign.$build(),$scope.isNew=!0):$scope.model=Campaign.$find($routeParams.id),window.onbeforeunload=function(e){if(!_.isEmpty($scope.model.$dirty())||$scope.isNew||$scope.needsSave)return"You have unsaved changes."},$scope.$on("$destroy",function(){delete window.onbeforeunload}),$scope.addPixel=function(){var pixel={url:"",campaign_type:""};$scope.model.pixels.push(pixel)},$scope.deletePixel=function(pixel){$scope.model.pixels=_.without($scope.model.pixels,pixel)},$scope.saveModel=function(){var promise;if($scope.model)promise=$scope.model.$save().$asPromise().then(function(data){$location.path("/cms/app/campaigns/edit/"+data.id+"/")});else{var deferred=$q.defer();deferred.reject(),promise=deferred.promise}return promise}},restrict:"E",scope:{getModelId:"&modelId"},templateUrl:CmsConfig.buildComponentPath("campaigns/campaigns-edit/campaigns-edit.html")}}),angular.module("campaigns.edit.sponsorPixel.directive",["bulbs.cms.config"]).constant("PIXEL_TYPES",[{name:"Listing",value:"Listing"},{name:"Detail",value:"Detail"}]).directive("campaignsEditSponsorPixel",function(CmsConfig){return{controller:function($scope,PIXEL_TYPES){$scope.PIXEL_TYPES=PIXEL_TYPES},restrict:"E",scope:{model:"="},templateUrl:CmsConfig.buildComponentPath("campaigns/campaigns-edit/campaigns-edit-sponsor-pixel/campaigns-edit-sponsor-pixel.html")}}),angular.module("campaigns.edit.sponsorPixel",["campaigns.edit.sponsorPixel.directive"]),angular.module("campaigns.edit",["bulbs.cms.site.config","campaigns.edit.directive"]).config(function($routeProvider){$routeProvider.when("/cms/app/campaigns/edit/:id/",{controller:function($routeParams,$scope,$window,CmsConfig){$window.document.title=CmsConfig.getCmsName()+" | Edit Campaign",$scope.routeId=$routeParams.id},template:'',reloadOnSearch:!1})}),angular.module("campaigns.list",["apiServices.campaign.factory","bulbs.cms.site.config","listPage","moment"]).config(function($injector,$routeProvider,CmsConfigProvider){var CmsConfig=$injector.invoke(CmsConfigProvider.$get);$routeProvider.when("/cms/app/campaigns/",{controller:function($scope,$window,Campaign){$window.document.title=CmsConfig.getCmsName()+" | Campaign",$scope.modelFactory=Campaign},templateUrl:CmsConfig.buildComponentPath("campaigns/campaigns-list/campaigns-list-page.html")})}),angular.module("campaigns",["campaigns.edit","campaigns.list"]),angular.module("confirmationModal",["confirmationModal.factory","ui.bootstrap"]).directive("confirmationModalOpener",function(ConfirmationModal){return{restrict:"A",scope:{modalBody:"@",modalCancelText:"@",modalOkText:"@",modalOnCancel:"&",modalOnOk:"&",modalTitle:"@"},link:function(scope,element){var modalInstance=null;element.addClass("confirmation-modal-opener"),element.on("click",function(){modalInstance=new ConfirmationModal(scope)})}}}),angular.module("confirmationModal.factory",["bulbs.cms.site.config","ui.bootstrap.modal"]).factory("ConfirmationModal",function($modal,CmsConfig){var ConfirmationModal=function(scope){return function(scope){$modal.open({controller:function($scope,$modalInstance){$scope.confirm=function(){$scope.$close(),$scope.modalOnOk()},$scope.cancel=function(){$scope.$dismiss(),$scope.modalOnCancel()}},scope:scope,templateUrl:CmsConfig.buildComponentPath("confirmation-modal/confirmation-modal.html")})}(scope)};return ConfirmationModal}),angular.module("bulbs.cms.currentUser.api",["bulbs.cms.site.config","lodash"]).service("CurrentUserApi",["_","$http","$q","CmsConfig",function(_,$http,$q,CmsConfig){var currentUser,pendingGetCurrentUserRequest,parsePayload=function(payload){var data=_.cloneDeep(payload);return data.displayName=data.first_name&&data.last_name?data.first_name+" "+data.last_name:data.email||data.username,data},getCurrentUser=function(){return pendingGetCurrentUserRequest||(pendingGetCurrentUserRequest=$http.get(CmsConfig.buildApiUrlRoot("me/")).then(function(response){return currentUser=parsePayload(response.data)}).finally(function(){pendingGetCurrentUserRequest=null})),pendingGetCurrentUserRequest};return{getCurrentUserWithCache:function(){return currentUser?$q.when(currentUser):getCurrentUser()},logout:function(){return $http.get(CmsConfig.buildApiUrlRoot("me","logout/")).then(function(){currentUser=null})}}}]),angular.module("bulbs.cms.currentUser",["bulbs.cms.currentUser.api","bulbs.cms.user.nameDisplayFilter"]),angular.module("bulbs.cms.user.nameDisplayFilter",[]).filter("userNameDisplay",[function(){return function(user){return user?user.full_name?user.full_name:user.first_name&&user.last_name?user.first_name+" "+user.last_name:user.username:""}}]),angular.module("bulbs.cms.customSearch.config",["lodash"]).provider("CustomSearchConfig",["_",function(_){var CustomSearchConfigError=BulbsCmsConfigError.build("CustomSearchConfig"),checkOrError=function(value,test,errorMsg){if(test(value))return value;throw new CustomSearchConfigError(errorMsg)},conditionFieldMappings=[],conditionTypes=[],timePeriodMappings=[],requestCapMs=150;this.addConditionField=function(name,endpoint,valueStructureName,valueStructureValue){return conditionFieldMappings.push({name:checkOrError(name,_.isString,"condition field name must be a string!"),endpoint:checkOrError(endpoint,_.isString,"condition field endpoint must be a string!"),value_structure:{name:checkOrError(valueStructureName,_.isString,"condition field value structure name must be a string!"),value:checkOrError(valueStructureValue,_.isString,"condition field value structure value must be a string!")}}),this},this.addConditionType=function(name,value){return conditionTypes.push({name:checkOrError(name,_.isString,"condition type name must be a string!"),value:checkOrError(value,_.isString,"condition type value must be a string!")}),this},this.addTimePeriod=function(name,value){return timePeriodMappings.push({name:checkOrError(name,_.isString,"time period name must be a string!"),value:checkOrError(value,_.isString,"time period value must be a string!")}),this},this.setRequestCapMs=function(value){return requestCapMs=checkOrError(value,_.isNumber,"request cap milliseconds must be a number!"),this},this.$get=[function(){return{getConditionFields:_.constant(conditionFieldMappings),getConditionTypes:_.constant(conditionTypes),getRequestCapMs:_.constant(requestCapMs),getTimePeriods:_.constant(timePeriodMappings)}}]}]),angular.module("customSearch.contentItem.directive",["bulbs.cms.site.config"]).directive("customSearchContentItem",function(CmsConfig){return{restrict:"E",scope:{model:"=",controllerService:"=",onUpdate:"&"},templateUrl:CmsConfig.buildComponentPath("custom-search/custom-search-content-item/custom-search-content-item.html")}}),angular.module("customSearch.contentItem",["customSearch.contentItem.directive"]),angular.module("customSearch.directive",["bulbs.cms.site.config","customSearch.contentItem","customSearch.group","customSearch.service","customSearch.simpleContentSearch"]).directive("customSearch",function(CmsConfig){return{controller:function(_,$scope,CustomSearchService){$scope.customSearchService=new CustomSearchService,$scope.resetFilters=function(){$scope.customSearchService.setPage(1),$scope.customSearchService.setQuery(""),$scope.addedFilterOn=!1,$scope.removedFilterOn=!1},$scope.$conditionalContentRetrieve=function(){$scope.addedFilterOn?$scope.customSearchService.$filterContentByIncluded():$scope.removedFilterOn?$scope.customSearchService.$filterContentByExcluded():$scope.customSearchService.$retrieveContent()},$scope.$contentRetrieve=function(){$scope.customSearchService.$retrieveContent(),$scope.onUpdate()}},link:function(scope,iElement,iAttrs,ngModelCtrl){ngModelCtrl.$formatters.push(function(modelValue){scope.customSearchService.data(modelValue),scope.customSearchService.$retrieveContent()})},require:"ngModel",restrict:"E",scope:{onUpdate:"&"},templateUrl:CmsConfig.buildComponentPath("custom-search/custom-search.html")}}),angular.module("customSearch.group.condition.directive",["bulbs.cms.site.config","BulbsAutocomplete.suggest","BulbsAutocomplete","contentServices.factory"]).directive("customSearchGroupCondition",function(CmsConfig){return{controller:function(_,$q,$scope,BULBS_AUTOCOMPLETE_EVENT_KEYPRESS,ContentFactory,CustomSearchConfig){$scope.conditionTypes=CustomSearchConfig.getConditionTypes(),$scope.fieldTypes=CustomSearchConfig.getConditionFields(),$scope.writables={searchTerm:""},$scope.autocompleteItems=[],$scope.data=$scope.controllerService.groupsConditionsGet($scope.groupIndex,$scope.conditionIndex);var $getItems=function(){return ContentFactory.all($scope.data.field).getList({search:$scope.writables.searchTerm}).then(function(items){var field=_.find($scope.fieldTypes,function(type){return type.endpoint===$scope.data.field});return _.map(items,function(item){return{name:item[field.value_structure.name],value:item[field.value_structure.value]}})})};$scope.updateAutocomplete=function(){$scope.writables.searchTerm&&$getItems().then(function(results){$scope.autocompleteItems=results})},$scope.delayClearAutocomplete=function(){_.delay(function(){$scope.clearAutocomplete(),$scope.$digest()},200)},$scope.clearAutocomplete=function(){$scope.writables.searchTerm="",$scope.autocompleteItems=[]},$scope.handleKeypress=function($event){27===$event.keyCode?$scope.clearAutocomplete():$scope.$broadcast(BULBS_AUTOCOMPLETE_EVENT_KEYPRESS,$event)}},restrict:"E",scope:{controllerService:"=",groupIndex:"=",conditionIndex:"=",onUpdate:"&",remove:"&"},templateUrl:CmsConfig.buildComponentPath("custom-search/custom-search-group/custom-search-group-condition/custom-search-group-condition.html") +}}),angular.module("customSearch.group.condition",["customSearch.group.condition.directive"]),angular.module("customSearch.group.directive",["bulbs.cms.site.config","uuid4"]).directive("customSearchGroup",function(CmsConfig){return{controller:function($scope,CustomSearchConfig,uuid4){$scope.data=$scope.controllerService.groupsGet($scope.groupIndex),$scope.timePeriods=CustomSearchConfig.getTimePeriods(),$scope.uuid=uuid4.generate(),$scope.$update=function(){$scope.controllerService.$groupsUpdateResultCountFor($scope.groupIndex).then(function(){$scope.onUpdate()})},$scope.controllerService.$groupsUpdateResultCountFor($scope.groupIndex)},restrict:"E",scope:{controllerService:"=",groupIndex:"=",remove:"&",onUpdate:"&"},templateUrl:CmsConfig.buildComponentPath("custom-search/custom-search-group/custom-search-group.html")}}),angular.module("customSearch.group",["customSearch.group.directive","customSearch.group.condition"]),angular.module("customSearch.service",["bulbs.cms.site.config","apiServices.customSearch.factory"]).factory("CustomSearchService",function(_,CustomSearch,CustomSearchConfig){var defaultData={groups:[],includedIds:[],excludedIds:[],pinnedIds:[]},CustomSearchService=function(data){this.data(data),this.$page=1,this.$query="",this.content={}};return CustomSearchService.prototype.data=function(data){return _.isUndefined(data)?this._data=defaultData:this._data=_.defaults(data,defaultData),this._data},CustomSearchService.prototype._$getContent=_.debounce(function(queryData){var self=this;return CustomSearch.$retrieveContent(queryData).then(function(data){self.content=data})},CustomSearchConfig.getRequestCapMs()),CustomSearchService.prototype.$filterContentByIncluded=function(){var contentQuery={includedIds:this._data.includedIds,page:this.$page,query:this.$query};return this._$getContent(contentQuery)},CustomSearchService.prototype.$filterContentByExcluded=function(){var contentQuery={includedIds:this._data.excludedIds,page:this.$page,query:this.$query};return this._$getContent(contentQuery)},CustomSearchService.prototype.$retrieveContent=function(){var contentQuery=_.assign({page:this.$page,query:this.$query,preview:!0},this._data);return this._$getContent(contentQuery)},CustomSearchService.prototype.$groupsUpdateResultCountFor=function(index){var self=this;return function(index){return CustomSearch.$retrieveGroupCount(self._data.groups[index]).then(function(count){self._data.groups[index].$result_count=count})}(index)},CustomSearchService.prototype.groupsResultCountGet=function(index){return this._data.groups[index].$result_count||0},CustomSearchService.prototype.groupsList=function(){return this._data.groups},CustomSearchService.prototype.groupsAdd=function(data){return _.isUndefined(data)&&(data={}),data=_.defaults(data,{conditions:[],time:null,$result_count:0}),this._data.groups.push(data),data},CustomSearchService.prototype.groupsGet=function(index){return this._data.groups[index]},CustomSearchService.prototype.groupsRemove=function(index){return this._data.groups.splice(index,1).length>0},CustomSearchService.prototype.groupsClear=function(){this._data.groups=[]},CustomSearchService.prototype.groupsConditionsAdd=function(groupIndex,data){return _.isUndefined(data)&&(data={}),data=_.defaults(data,{field:CustomSearchConfig.getConditionFields()[0].endpoint,type:CustomSearchConfig.getConditionTypes()[0].value,values:[]}),this._data.groups[groupIndex].conditions.push(data),data},CustomSearchService.prototype.groupsConditionsGet=function(groupIndex,conditionIndex){return this._data.groups[groupIndex].conditions[conditionIndex]},CustomSearchService.prototype.groupsConditionsList=function(groupIndex){return this._data.groups[groupIndex].conditions},CustomSearchService.prototype.groupsConditionsRemove=function(groupIndex,conditionIndex){return this._data.groups[groupIndex].conditions.splice(conditionIndex,1).length>0},CustomSearchService.prototype.groupsTimePeriodSet=function(groupIndex){var value=CustomSearchConfig.getTimePeriods()[0].value;return this._data.groups[groupIndex].time=value,value},CustomSearchService.prototype.groupsTimePeriodGet=function(groupIndex){return this._data.groups[groupIndex].time||null},CustomSearchService.prototype.groupsTimePeriodRemove=function(groupIndex){this._data.groups[groupIndex].time=null},CustomSearchService.prototype.groupsConditionsValuesAdd=function(groupIndex,conditionIndex,value){var values=this._data.groups[groupIndex].conditions[conditionIndex].values,matches=_.find(values,function(existingValue){return existingValue.name===value.name&&existingValue.value===value.value});matches||values.push(value)},CustomSearchService.prototype.groupsConditionsValuesClear=function(groupIndex,conditionIndex){this._data.groups[groupIndex].conditions[conditionIndex].values=[]},CustomSearchService.prototype.groupsConditionsValuesList=function(groupIndex,conditionIndex){return this._data.groups[groupIndex].conditions[conditionIndex].values},CustomSearchService.prototype.groupsConditionsValuesRemove=function(groupIndex,conditionIndex,valueIndex){return this._data.groups[groupIndex].conditions[conditionIndex].values.splice(valueIndex,1).length>0},CustomSearchService.prototype.includesList=function(){return this._data.includedIds},CustomSearchService.prototype.includesAdd=function(id){this._data.includedIds.push(id),this._data.includedIds=_.uniq(this._data.includedIds),this.excludesRemove(id)},CustomSearchService.prototype.includesRemove=function(id){this._data.includedIds=_.without(this._data.includedIds,id)},CustomSearchService.prototype.includesHas=function(id){return _.includes(this._data.includedIds,id)},CustomSearchService.prototype.excludesList=function(){return this._data.excludedIds},CustomSearchService.prototype.excludesAdd=function(id){this._data.excludedIds.push(id),this._data.excludedIds=_.uniq(this._data.excludedIds),this.includesRemove(id),this.pinsRemove(id)},CustomSearchService.prototype.excludesRemove=function(id){this._data.excludedIds=_.without(this._data.excludedIds,id)},CustomSearchService.prototype.excludesHas=function(id){return _.includes(this._data.excludedIds,id)},CustomSearchService.prototype.pinsList=function(){return this._data.pinnedIds},CustomSearchService.prototype.pinsAdd=function(id){this._data.pinnedIds.push(id),this._data.pinnedIds=_.uniq(this._data.pinnedIds),this.excludesRemove(id)},CustomSearchService.prototype.pinsRemove=function(id){this._data.pinnedIds=_.without(this._data.pinnedIds,id)},CustomSearchService.prototype.pinsHas=function(id){return _.includes(this._data.pinnedIds,id)},CustomSearchService.prototype.getPage=function(){return this.$page},CustomSearchService.prototype.setPage=function(page){this.$page=page},CustomSearchService.prototype.getQuery=function(){return this.$query},CustomSearchService.prototype.setQuery=function(query){this.$query=query},CustomSearchService}),angular.module("customSearch.simpleContentSearch.directive",["bulbs.cms.site.config","BulbsAutocomplete","BulbsAutocomplete.suggest"]).directive("customSearchSimpleContentSearch",function(CmsConfig){return{controller:function(_,$scope,BULBS_AUTOCOMPLETE_EVENT_KEYPRESS,ContentFactory){$scope.writables={searchTerm:""},$scope.autocompleteItems=[];var $getItems=function(){return ContentFactory.all("content").getList({search:$scope.writables.searchTerm}).then(function(results){return _.chain(results).take(10).map(function(item){return{name:"ID: "+item.id+" | "+item.title,value:item.id}}).value()})};$scope.updateAutocomplete=function(){$scope.writables.searchTerm&&$getItems().then(function(results){$scope.autocompleteItems=results})},$scope.delayClearAutocomplete=function(){_.delay(function(){$scope.clearAutocomplete(),$scope.$digest()},200)},$scope.clearAutocomplete=function(){$scope.writables.searchTerm="",$scope.autocompleteItems=[]},$scope.handleKeypress=function($event){27===$event.keyCode?$scope.clearAutocomplete():$scope.$broadcast(BULBS_AUTOCOMPLETE_EVENT_KEYPRESS,$event)}},restrict:"E",scope:{onSelect:"&"},templateUrl:CmsConfig.buildComponentPath("custom-search/custom-search-simple-content-search/custom-search-simple-content-search.html")}}),angular.module("customSearch.simpleContentSearch",["customSearch.simpleContentSearch.directive"]),angular.module("customSearch",["customSearch.directive"]),angular.module("bulbs.cms.dateTimeFilter",["bulbs.cms.site.config","lodash","moment"]).filter("dateTimeFormat",["_","moment","CmsConfig",function(_,moment,CmsConfig){return function(date,format){return _.isString(date)||moment.isMoment(date)?(_.isString(format)||(format=CmsConfig.getDateTimeFormatHumanReadable()),moment.tz(date,CmsConfig.getTimezoneName()).format(format)):""}}]),angular.module("bulbs.cms.dateTimeModal.controller",["bulbs.cms.site.config","moment","ui.bootstrap.modal"]).controller("DatetimeSelectionModalCtrl",["$scope","$modalInstance","CmsConfig","moment",function($scope,$modalInstance,CmsConfig,moment){$scope.TIMEZONE_LABEL=moment.tz(CmsConfig.getTimezoneName()).format("z"),$scope.dateValid=!0,$scope.$watch("tempDatetime",function(){$scope.dateValid=$scope.tempDatetime.isValid()}),$scope.$watch("tempTime",function(){var newTime=moment($scope.tempTime);newTime.isValid()&&($scope.tempDatetime.hour(newTime.hour()),$scope.tempDatetime.minute(newTime.minute()),$scope.tempDatetime.second(newTime.second()))}),$scope.tempDatetime=angular.copy($scope.modDatetime),$scope.tempDatetime||($scope.tempDatetime=moment()),$scope.tempTime=angular.copy($scope.tempDatetime);var timeNowWithOffset=function(){return moment.tz(CmsConfig.getTimezoneName())};$scope.setDate=function(newDate){var newDateAsMoment=moment(newDate);$scope.tempDatetime=($scope.tempDatetime||moment()).year(newDateAsMoment.year()).month(newDateAsMoment.month()).date(newDateAsMoment.date())},$scope.setDateToday=function(){$scope.setDate(timeNowWithOffset())},$scope.setDateTomorrow=function(){$scope.setDate(timeNowWithOffset().add(1,"day"))},$scope.setTimeNow=function(){$scope.tempDatetime=timeNowWithOffset()},$scope.setTimeMidnight=function(){$scope.tempDatetime=timeNowWithOffset().hour(24).minute(0).second(0)},$scope.clearDatetime=function(){$modalInstance.close(null)},$scope.chooseDatetime=function(){if($scope.dateValid){var retMoment=moment($scope.tempDatetime);$modalInstance.close(retMoment)}else console.error("Attempting to choose invalid date.")}}]),angular.module("bulbs.cms.dateTimeModal.opener",["bulbs.cms.dateTimeModal.controller","bulbs.cms.site.config","ui.bootstrap.modal"]).directive("datetimeSelectionModalOpener",["$modal","$q","CmsConfig",function($modal,$q,CmsConfig){return{restrict:"A",scope:{modalClearText:"@",modalOkText:"@",modDatetime:"=?ngModel",modalTitle:"@",modalOnBeforeClose:"&",modalOnClear:"&",modalOnClose:"&"},link:function(scope,element){var modalInstance=null;element.addClass("datetime-selection-modal-opener"),element.on("click",function(){modalInstance=$modal.open({templateUrl:CmsConfig.buildComponentPath("date-time-modal","date-time-modal.html"),controller:"DatetimeSelectionModalCtrl",scope:scope}),modalInstance.result.then(function(newDate){return $q.when(scope.modalOnBeforeClose({newDate:newDate})).then(function(result){result!==!1&&(scope.modDatetime=newDate,newDate?scope.modalOnClose({newDate:newDate}):scope.modalOnClear())})})})}}}]),angular.module("bulbs.cms.dateTimeModal",["bulbs.cms.dateTimeModal.opener"]),angular.module("bulbs.cms.dynamicContent.api",["bulbs.cms.site.config"]).service("DynamicContentApi",["$http","CmsConfig",function($http,CmsConfig){return{retrieveSchema:function(url){return $http({method:"OPTIONS",url:url})}}}]),angular.module("bulbs.cms.dynamicContent.form.field.boolean",["bulbs.cms.site.config","bulbs.cms.dynamicContent.form.input.label","bulbs.cms.dynamicContent.form.input.errors"]).directive("dynamicContentFormFieldBoolean",["CmsConfig",function(CmsConfig){return{require:["ngModel","^^form"],restrict:"E",scope:{uuid:"@",name:"@",ngModel:"=",schema:"="},templateUrl:CmsConfig.buildComponentPath("dynamic-content","dynamic-content-form","dynamic-content-form-field","dynamic-content-form-field-boolean","dynamic-content-form-field-boolean.html")}}]),angular.module("bulbs.cms.dynamicContent.form.field.color",["bulbs.cms.site.config","bulbs.cms.dynamicContent.form.input.label","bulbs.cms.dynamicContent.form.input.errors"]).directive("dynamicContentFormFieldColor",["CmsConfig",function(CmsConfig){return{require:["ngModel","^^form"],restrict:"E",scope:{uuid:"@",name:"@",ngModel:"=",schema:"="},templateUrl:CmsConfig.buildComponentPath("dynamic-content","dynamic-content-form","dynamic-content-form-field","dynamic-content-form-field-color","dynamic-content-form-field-color.html"),link:function(scope,element,attr,ctrls){var formField=ctrls[1][scope.name];formField.$validators.rgbhex=function(modelValue){return!modelValue||/^#[0-9a-fA-F]{6}$/.test(modelValue)}}}}]),angular.module("bulbs.cms.dynamicContent.form.field.dateTime",["bulbs.cms.dateTimeFilter","bulbs.cms.dateTimeModal","bulbs.cms.dynamicContent.form.input.label","bulbs.cms.dynamicContent.form.input.errors","bulbs.cms.site.config"]).directive("dynamicContentFormFieldDateTime",["CmsConfig",function(CmsConfig){return{controller:["$scope",function($scope){$scope.setDate=function(newDate){$scope.ngModel[$scope.name]=newDate.format()},$scope.clearDate=function(){$scope.ngModel[$scope.name]=null}}],require:["ngModel","^^form"],restrict:"E",scope:{uuid:"@",name:"@",ngModel:"=",schema:"="},templateUrl:CmsConfig.buildComponentPath("dynamic-content","dynamic-content-form","dynamic-content-form-field","dynamic-content-form-field-date-time","dynamic-content-form-field-date-time.html")}}]),angular.module("bulbs.cms.dynamicContent.form.field.image",["bettyEditable","bulbs.cms.site.config","bulbs.cms.staticImage","bulbs.cms.dynamicContent.form.input.errors","bulbs.cms.dynamicContent.form.input.label"]).directive("dynamicContentFormFieldImage",["CmsConfig",function(CmsConfig){return{require:["ngModel","^^form"],restrict:"E",scope:{name:"@",ngModel:"=",schema:"="},templateUrl:CmsConfig.buildComponentPath("dynamic-content","dynamic-content-form","dynamic-content-form-field","dynamic-content-form-field-image","dynamic-content-form-field-image.html")}}]),angular.module("bulbs.cms.dynamicContent.form.input.errors",["bulbs.cms.site.config"]).directive("dynamicContentFormFieldInputErrors",["CmsConfig",function(CmsConfig){return{link:function(scope,element,attrs,formCtrl){scope.form=formCtrl},require:"^^form",restrict:"E",scope:{name:"@",schema:"="},templateUrl:CmsConfig.buildComponentPath("dynamic-content","dynamic-content-form","dynamic-content-form-field","dynamic-content-form-field-input-errors","dynamic-content-form-field-input-errors.html")}}]),angular.module("bulbs.cms.dynamicContent.form.input.label",["bulbs.cms.site.config","lodash"]).directive("dynamicContentFormFieldInputLabel",["_","CmsConfig",function(_,CmsConfig){return{link:function(scope,element,attrs,formCtrl){scope.form=formCtrl,scope.isEmpty=_.isEmpty},require:"^^form",restrict:"E",scope:{inputId:"@",name:"@",schema:"="},templateUrl:CmsConfig.buildComponentPath("dynamic-content","dynamic-content-form","dynamic-content-form-field","dynamic-content-form-field-input-label","dynamic-content-form-field-input-label.html")}}]),angular.module("bulbs.cms.dynamicContent.form.field.integer",["bulbs.cms.site.config","bulbs.cms.dynamicContent.form.input.label","bulbs.cms.dynamicContent.form.input.errors"]).directive("dynamicContentFormFieldInteger",["CmsConfig",function(CmsConfig){return{require:["ngModel","^^form"],restrict:"E",scope:{uuid:"@",name:"@",ngModel:"=",schema:"="},templateUrl:CmsConfig.buildComponentPath("dynamic-content","dynamic-content-form","dynamic-content-form-field","dynamic-content-form-field-integer","dynamic-content-form-field-integer.html"),link:function(scope,element,attr,ctrls){var formField=ctrls[1][scope.name];formField.$validators.integer=function(modelValue){return!modelValue||parseInt(modelValue,10)===modelValue}}}}]),angular.module("bulbs.cms.dynamicContent.form.field.invalid",["bulbs.cms.dynamicContent.form.input.label","bulbs.cms.site.config"]).directive("dynamicContentFormFieldInvalid",["CmsConfig",function(CmsConfig){return{require:"^^form",restrict:"E",scope:{name:"@",schema:"="},templateUrl:CmsConfig.buildComponentPath("dynamic-content","dynamic-content-form","dynamic-content-form-field","dynamic-content-form-field-invalid","dynamic-content-form-field-invalid.html")}}]),angular.module("bulbs.cms.dynamicContent.form.field.list",["bulbs.cms.dynamicContent.form.field.object","bulbs.cms.dynamicContent.form.input.label","bulbs.cms.dynamicContent.form.types","bulbs.cms.site.config","bulbs.cms.utils","lodash"]).directive("dynamicContentFormFieldList",["CmsConfig","FIELD_TYPES_META","Utils",function(CmsConfig,FIELD_TYPES_META,Utils){return{controller:["_","$scope",function(_,$scope){_.isUndefined($scope.ngModel[$scope.name])&&($scope.ngModel[$scope.name]=[]),$scope.itemOrderingMemory=[],$scope.redoOrdering=function(){$scope.itemOrderingMemory=$scope.ngModel[$scope.name].map(function(v,i){return i+1})},$scope.redoOrdering(),$scope.newItem=function(){$scope.readOnly||($scope.ngModel[$scope.name].push({}),$scope.redoOrdering())},$scope.moveItem=function(fromIndex,toIndex){Utils.moveTo($scope.ngModel[$scope.name],fromIndex,toIndex,!0),$scope.redoOrdering()},$scope.removeItem=function(index){Utils.removeFrom($scope.ngModel[$scope.name],index),$scope.redoOrdering()}}],link:function(scope,elements,attrs,ctrls){scope.form=ctrls[1],0===scope.ngModel[scope.name].length&&scope.newItem()},require:["ngModel","^^form"],restrict:"E",scope:{name:"@",schema:"=",ngModel:"=",readOnly:"="},templateUrl:CmsConfig.buildComponentPath("dynamic-content","dynamic-content-form","dynamic-content-form-field","dynamic-content-form-field-list","dynamic-content-form-field-list.html")}}]),angular.module("bulbs.cms.dynamicContent.form.field.object",["bulbs.cms.dynamicContent.form.field.boolean","bulbs.cms.dynamicContent.form.field.color","bulbs.cms.dynamicContent.form.field.dateTime","bulbs.cms.dynamicContent.form.field.image","bulbs.cms.dynamicContent.form.field.list","bulbs.cms.dynamicContent.form.field.integer","bulbs.cms.dynamicContent.form.field.invalid","bulbs.cms.dynamicContent.form.field.richtext","bulbs.cms.dynamicContent.form.field.text","bulbs.cms.dynamicContent.form.types","bulbs.cms.site.config","lodash","uuid4"]).directive("dynamicContentFormFieldObject",["_","$compile","CmsConfig","FIELD_TYPES_META","uuid4",function(_,$compile,CmsConfig,FIELD_TYPES_META,uuid4){return{link:function(scope,element,attrs){var $form=element.find("ng-form");scope.$watch("form.$valid",function(isValid){scope.onValidityChange({isValid:isValid,internalForm:scope.form})}),scope.$watch("schema",function(){if(_.has(scope.schema,"fields")){var fieldKeys=Object.keys(scope.schema.fields);_.isArray(scope.includeOnly)&&(fieldKeys=_.intersection(fieldKeys,scope.includeOnly)),fieldKeys.forEach(function(id){var fieldSchema=scope.schema.fields[id],fieldMeta=FIELD_TYPES_META[fieldSchema.type];_.isUndefined(fieldMeta)&&(fieldMeta=_.has(fieldSchema,"fields")?FIELD_TYPES_META.object:FIELD_TYPES_META.invalid);var tagName=fieldMeta.tagName,html=angular.element("<"+tagName+">");html.attr("uuid",uuid4.generate()),html.attr("name",id),html.attr("schema","schema.fields."+id),html.attr("class","dynamic-content-form-field"),_.isString(scope.name)?html.attr("ng-model","ngModel[name]"):html.attr("ng-model","ngModel"),$form.append(html),$compile(html)(scope)})}},!0)},require:"ngModel",restrict:"E",scope:{name:"@",schema:"=",ngModel:"=",onValidityChange:"&",includeOnly:"="},templateUrl:CmsConfig.buildComponentPath("dynamic-content","dynamic-content-form","dynamic-content-form-field","dynamic-content-form-field-object","dynamic-content-form-field-object.html")}}]),angular.module("bulbs.cms.dynamicContent.form.field.richtext",["bulbs.cms.site.config","bulbs.cms.dynamicContent.form.input.label","bulbs.cms.dynamicContent.form.input.errors","OnionEditor"]).directive("dynamicContentFormFieldRichtext",["CmsConfig",function(CmsConfig){return{link:function(scope,element,attr,ctrls){scope.formField=ctrls[1][scope.name]},require:["ngModel","^^form"],restrict:"E",scope:{name:"@",ngModel:"=",schema:"="},templateUrl:CmsConfig.buildComponentPath("dynamic-content","dynamic-content-form","dynamic-content-form-field","dynamic-content-form-field-richtext","dynamic-content-form-field-richtext.html")}}]),angular.module("bulbs.cms.dynamicContent.form.field.text",["bulbs.cms.site.config","bulbs.cms.dynamicContent.form.input.label","bulbs.cms.dynamicContent.form.input.errors","jquery"]).directive("dynamicContentFormFieldText",["CmsConfig",function(CmsConfig){return{link:function(scope,element,attr,ctrls){if(scope.formField=ctrls[1][scope.name],scope.schema.max_length>0){var input=element.find("input");input.css("width",scope.schema.max_length+"em"),element.width()<=input.width()&&input.css("width","")}},require:["ngModel","^^form"],restrict:"E",scope:{uuid:"@",name:"@",ngModel:"=",schema:"="},templateUrl:CmsConfig.buildComponentPath("dynamic-content","dynamic-content-form","dynamic-content-form-field","dynamic-content-form-field-text","dynamic-content-form-field-text.html")}}]),angular.module("bulbs.cms.dynamicContent.form.types",[]).constant("FIELD_TYPES_META",{array:{tagName:"dynamic-content-form-field-list"},boolean:{tagName:"dynamic-content-form-field-boolean"},color:{tagName:"dynamic-content-form-field-color"},datetime:{tagName:"dynamic-content-form-field-date-time"},image:{tagName:"dynamic-content-form-field-image"},invalid:{tagName:"dynamic-content-form-field-invalid"},object:{tagName:"dynamic-content-form-field-object"},richtext:{tagName:"dynamic-content-form-field-richtext"},string:{tagName:"dynamic-content-form-field-text"},integer:{tagName:"dynamic-content-form-field-integer"}}),angular.module("bulbs.cms.dynamicContent.form",["bulbs.cms.dynamicContent.api","bulbs.cms.dynamicContent.form.field.object","bulbs.cms.site.config","lodash"]).directive("dynamicContentForm",["_","CmsConfig",function(_,CmsConfig){var DynamicContentFormError=BulbsCmsError.build(""),template=function(name){return CmsConfig.buildComponentPath("dynamic-content","dynamic-content-form",name)};return{controller:["$scope","DynamicContentApi",function($scope,DynamicContentApi){if(!_.isString($scope.schemaSrc))throw new DynamicContentFormError("must be provided a schema url!");if(!_.isObject($scope.ngModel))throw new DynamicContentFormError("must be provided an object for ng-model!");$scope.template=template("dynamic-content-form-loading.html"),$scope.schema={},$scope.validityCallback=function(isValid){$scope.onValidityChange({isValid:isValid})},DynamicContentApi.retrieveSchema($scope.schemaSrc).then(function(response){$scope.template=template("dynamic-content-form-loaded.html"),$scope.schema=response.data}).catch(function(){$scope.template=template("dynamic-content-form-error.html"),$scope.errorMessage="Unable to retrieve schema"})}],require:"ngModel",restrict:"E",scope:{schemaSrc:"@",ngModel:"=",onValidityChange:"&",includeOnly:"="},template:''}}]),angular.module("bulbs.cms.dynamicContent",["bulbs.cms.dynamicContent.form"]),angular.module("bulbs.cms.editor.wrapper",["BettyCropper","bulbs.cms.imageCropModal","bulbs.cms.site.config","jquery","OnionEditor"]).run(["$",function($){$(document).unbind("keydown").bind("keydown",function(event){var doPrevent=!1;if(8===event.keyCode){var d=event.srcElement||event.target;doPrevent=["TEXTAREA","INPUT"].indexOf(d.tagName.toUpperCase()!==-1)?d.readOnly||d.disabled:!d.isContentEditable}doPrevent&&event.preventDefault()})}]).directive("onionEditor",["$","BettyCropper","CmsConfig","OnionEditor","openImageCropModal","Zencoder",function($,BettyCropper,CmsConfig,OnionEditor,openImageCropModal,Zencoder){var safeApply=function(scope,fn){scope.$$phase||scope.$root.$$phase?fn():scope.$apply(function(){fn()})};return{controller:["$scope",function($scope){$scope.editor=null,this.getEditor=function(){return $scope.editor}}],require:"ngModel",replace:!0,restrict:"E",templateUrl:CmsConfig.buildComponentPath("editor","editor-wrapper","editor-wrapper.html"),scope:{ngModel:"="},link:function(scope,element,attrs,ngModel){function read(){safeApply(scope,function(){var html=scope.editor.getContent();html===defaultValue&&(html=""),ngModel.$setViewValue(html)})}if(ngModel){var formatting;attrs.formatting&&(formatting=attrs.formatting.split(","));var options={},defaultValue="";"multiline"===attrs.role?(defaultValue="


    ",options={multiline:!0,formatting:formatting||["link","bold","italic","blockquote","heading","list","strike","underline"],placeholder:{text:attrs.placeholder||"

    Write here

    ",container:$(".editorPlaceholder",element[0])[0]},link:{domain:attrs.linkDomain||!1,searchHandler:window[attrs.linkSearchHandler]||!1},statsContainer:".wordcount",inlineObjects:attrs.inlineObjects||CmsConfig.getInlineObjecsPath(),image:{insertDialog:BettyCropper.upload,editDialog:openImageCropModal},video:{insertDialog:Zencoder.onVideoFileUpload,editDialog:Zencoder.openVideoThumbnailModal,videoEmbedUrl:CmsConfig.buildVideoUrl()}}):($(".document-tools, .embed-tools",element).hide(),defaultValue="",options={multiline:!1,placeholder:{text:attrs.placeholder||"Write here",container:$(".editorPlaceholder",element[0])[0]},formatting:formatting||[]}),scope.editor=new OnionEditor($(".editor",element[0])[0],options),ngModel.$render=function(){scope.editor.setContent(ngModel.$viewValue||defaultValue),setTimeout(function(){scope.editor.setChangeHandler(read)})},ngModel.$isEmpty=function(value){return!value||scope.editor.scribe.allowsBlockElements()&&value===defaultValue},scope.$watch(ngModel,function(){scope.editor.setContent(ngModel.$viewValue||defaultValue),window.picturefill&&window.picturefill(element[0])})}}}}]),angular.module("bulbs.cms.editor",["bulbs.cms.editor.wrapper"]),angular.module("EditorsPick",["bulbs.cms.site.config","customSearch"]).config(function($injector,$routeProvider,CmsConfigProvider){var CmsConfig=$injector.invoke(CmsConfigProvider.$get);$routeProvider.when("/cms/app/sod/",{controller:function($scope,$window){$window.document.title=CmsConfig.getCmsName()+" | SoD",$scope.$watch("queryData",function(){console.log(arguments)}),$scope.queryData={},$scope.updateQueryData=function(){$scope.queryData={groups:[{conditions:[{field:"content-type",type:"all",values:[{name:"for display",value:"actually-use-this-value-123"}]}],time:"1 day"}],included_ids:[1],excluded_ids:[2],pinned_ids:[3],page:1,query:"query balh blah blahb"}},$scope.updateConditionData=function(){$scope.queryData.groups[0].conditions=[{field:"content-type",type:"all",values:[{name:"ANOTHER THIGN",value:"actually-use-this-value-123"}]}]}},templateUrl:CmsConfig.buildComponentPath("editors-pick/editors-pick.html"),reloadOnSearch:!1})}),angular.module("evergreenField.directive",["lodash","saveButton.directive"]).directive("evergreenField",["CmsConfig",function(CmsConfig){return{restrict:"E",scope:{article:"="},templateUrl:CmsConfig.buildComponentPath("evergreen-field/evergreen-field.html")}}]),angular.module("evergreenField",["evergreenField.directive"]),angular.module("filterListWidget.directive",["bulbs.cms.site.config"]).directive("filterListWidget",function(_,$http,$location,$timeout,$,CmsConfig){return{restrict:"E",scope:{filters:"="},templateUrl:CmsConfig.buildComponentPath("filter-list-widget/filter-list-widget.html"),link:function(scope,element,attrs){function getAutocompletes(search){return $timeout.cancel(filterInputTimeout),filterInputCounter=0,search.length<1?(scope.autocompleteArray=[],void scope.$apply()):void $http({url:"/cms/api/v1/things/?type=tag&type=feature_type&type=author",method:"GET",params:{q:search}}).success(function(data){scope.autocompleteArray=data})}function arrowSelect(direction){var $toSelect,$entries=$element.find(".entry"),$selected=$element.find(".entry.selected");$selected.length>0?("up"===direction&&($toSelect=$selected.first().prev()),"down"===direction&&($toSelect=$selected.first().next())):("up"===direction&&($toSelect=$entries.last()),"down"===direction&&($toSelect=$entries.first())),scope.selectEntry($toSelect)}function applyFilterChange(filterObject){filterObject.page=1,$location.search(filterObject),scope.autocompleteArray=[],$input.trigger("blur")}function getFilterObjects(){var search=$location.search();if(scope.filters={},"undefined"==typeof search)return void console.log("undefined");var filterParamsToTypes={authors:"author",tags:"tag",feature_types:"feature_type"};for(var filterParam in filterParamsToTypes){var filterType=filterParamsToTypes[filterParam];"string"==typeof search[filterParam]&&(search[filterParam]=[search[filterParam]]);for(var i in search[filterParam]){var value=search[filterParam][i];scope.filters[filterType+value]={query:value,type:filterParam},getQueryToLabelMappings(filterType,value)}}search.search&&(scope.filterInputValue=search.search)}function getQueryToLabelMappings(type,query){scope.queryToLabelMappings=scope.queryToLabelMappings||{},query in scope.queryToLabelMappings||$http({url:"/cms/api/v1/things/?type="+type,method:"GET",params:{q:query}}).success(function(data){for(var i in data)scope.queryToLabelMappings[data[i].value]=data[i].name})}var $element=$(element),$input=$element.find("input");scope.autocompleteArray=[];var filterInputTimeout,filterInputCounter=0;$input.on("input",function(e){var search=$input.val();scope.searchTerm=search,$timeout.cancel(filterInputTimeout),filterInputTimeout=$timeout(function(){getAutocompletes(search)},200),filterInputCounter>2&&getAutocompletes(search)}),$input.on("keyup",function(e){38===e.keyCode&&arrowSelect("up"),40===e.keyCode&&arrowSelect("down"),13===e.keyCode&&($element.find(".selected").length>0?$timeout(function(){angular.element(".selected > a").triggerHandler("click")},0):scope.addFilter("search",$input.val()))}),scope.search=function(){scope.addFilter("search",scope.filterInputValue)},scope.clearSearch=function(){scope.filterInputValue=""},scope.clearFilters=function(){return scope.filters={},scope.filterInputValue="",applyFilterChange({})},$element.on("mouseover",".entry",function(){scope.selectEntry(this)}),scope.selectEntry=function(entry){$element.find(".selected").removeClass("selected"),$(entry).addClass("selected")},$input.on("blur",function(){$element.find(".dropdown-menu").fadeOut(200)}),$input.on("focus",function(){$element.find(".dropdown-menu").fadeIn(200)}),scope.addFilter=function(type,newFilterValue){var filterObject=$location.search();return"search"===type?filterObject.search=newFilterValue:(filterObject[type]||(filterObject[type]=[]),"string"==typeof filterObject[type]&&(filterObject[type]=[filterObject[type]]),_.contains(filterObject[type],newFilterValue)||filterObject[type].push(newFilterValue)),applyFilterChange(filterObject)},scope.deleteFilter=function(key){var filterObject=$location.search(),toDelete=scope.filters[key];"string"==typeof filterObject[toDelete.type]&&(filterObject[toDelete.type]=[filterObject[toDelete.type]]);var toSplice;for(var i in filterObject[toDelete.type])if(filterObject[toDelete.type][i]===toDelete.query){toSplice=i;break}return filterObject[toDelete.type].splice(i,1),filterObject.search=$input.val(),delete scope.filters[key],applyFilterChange(filterObject)},scope.$on("$routeUpdate",function(){getFilterObjects()}),getFilterObjects()}}}),angular.module("filterListWidget",["filterListWidget.directive"]),angular.module("filterWidget.directive",["contentServices.listService"]).directive("filterWidget",function(_,$http,$location,$timeout,$,ContentListService,CmsConfig){return{restrict:"E",scope:{},templateUrl:CmsConfig.buildComponentPath("filter-widget/filter-widget.html"),link:function(scope,element,attrs){function getAutocompletes(search){return $timeout.cancel(filterInputTimeout),filterInputCounter=0,search.length<1?(scope.autocompleteArray=[], +void scope.$apply()):void $http({url:"/cms/api/v1/things/?type=tag&type=feature_type&type=author",method:"GET",params:{q:search}}).success(function(data){scope.autocompleteArray=data})}function arrowSelect(direction){var $toSelect,$entries=$element.find(".entry"),$selected=$element.find(".entry.selected");$selected.length>0?("up"===direction&&($toSelect=$selected.first().prev()),"down"===direction&&($toSelect=$selected.first().next())):("up"===direction&&($toSelect=$entries.last()),"down"===direction&&($toSelect=$entries.first())),scope.selectEntry($toSelect)}function applyFilterChange(filterObject){return filterObject.page=1,$location.search(filterObject),scope.autocompleteArray=[],$input.trigger("blur"),ContentListService.$updateContent(filterObject)}function getFilterObjects(){var search=$location.search();if(scope.filterObjects={},"undefined"==typeof search)return void console.log("undefined");var filterParamsToTypes={authors:"author",tags:"tag",feature_types:"feature_type"};for(var filterParam in filterParamsToTypes){var filterType=filterParamsToTypes[filterParam];"string"==typeof search[filterParam]&&(search[filterParam]=[search[filterParam]]);for(var i in search[filterParam]){var value=search[filterParam][i];scope.filterObjects[filterType+value]={query:value,type:filterParam},getQueryToLabelMappings(filterType,value)}}search.search&&(scope.filterInputValue=search.search)}function getQueryToLabelMappings(type,query){scope.queryToLabelMappings=scope.queryToLabelMappings||{},query in scope.queryToLabelMappings||$http({url:"/cms/api/v1/things/?type="+type,method:"GET",params:{q:query}}).success(function(data){for(var i in data)scope.queryToLabelMappings[data[i].value]=data[i].name})}var $element=$(element),$input=$element.find("input");scope.autocompleteArray=[];var filterInputTimeout,filterInputCounter=0;$input.on("input",function(e){var search=$input.val();scope.searchTerm=search,$timeout.cancel(filterInputTimeout),filterInputTimeout=$timeout(function(){getAutocompletes(search)},200),filterInputCounter>2&&getAutocompletes(search)}),$input.on("keyup",function(e){38===e.keyCode&&arrowSelect("up"),40===e.keyCode&&arrowSelect("down"),13===e.keyCode&&($element.find(".selected").length>0?$timeout(function(){angular.element(".selected > a").triggerHandler("click")},0):scope.addFilter("search",$input.val()))}),scope.search=function(){scope.addFilter("search",scope.filterInputValue)},scope.clearSearch=function(){scope.filterInputValue=""},scope.clearFilters=function(){return scope.filterObjects={},scope.filterInputValue="",applyFilterChange({})},$element.on("mouseover",".entry",function(){scope.selectEntry(this)}),scope.selectEntry=function(entry){$element.find(".selected").removeClass("selected"),$(entry).addClass("selected")},$input.on("blur",function(){$element.find(".dropdown-menu").fadeOut(200)}),$input.on("focus",function(){$element.find(".dropdown-menu").fadeIn(200)}),scope.addFilter=function(type,newFilterValue){var filterObject=$location.search();return"search"===type?filterObject.search=newFilterValue:(filterObject[type]||(filterObject[type]=[]),"string"==typeof filterObject[type]&&(filterObject[type]=[filterObject[type]]),_.contains(filterObject[type],newFilterValue)||filterObject[type].push(newFilterValue)),applyFilterChange(filterObject)},scope.deleteFilter=function(key){var filterObject=$location.search(),toDelete=scope.filterObjects[key];"string"==typeof filterObject[toDelete.type]&&(filterObject[toDelete.type]=[filterObject[toDelete.type]]);var toSplice;for(var i in filterObject[toDelete.type])if(filterObject[toDelete.type][i]===toDelete.query){toSplice=i;break}return filterObject[toDelete.type].splice(i,1),filterObject.search=$input.val(),delete scope.filterObjects[key],applyFilterChange(filterObject)},scope.$on("$routeUpdate",function(){getFilterObjects()}),getFilterObjects()}}}),angular.module("filterWidget",["filterWidget.directive"]),angular.module("genericAjaxButton.controller",[]).controller("GenericAjaxButtonController",function($scope){$scope.STATES={DONE:"done",PROGRESS:"in-progress",ERROR:"error"},$scope.doClick=function(){$scope.state=$scope.STATES.PROGRESS,$scope.clickFunction().then(function(){$scope.state=$scope.STATES.DONE}).catch(function(){$scope.state=$scope.STATES.ERROR})}}),angular.module("genericAjaxButton.directive",["bulbs.cms.site.config","genericAjaxButton.controller"]).directive("genericAjaxButton",function(CmsConfig){return{controller:"GenericAjaxButtonController",restrict:"E",scope:{disableWhen:"&",clickFunction:"=",cssBtnClassComplete:"@",cssBtnClassError:"@",cssBtnClassProgress:"@",cssIconComplete:"@",textError:"@",textProgress:"@",textComplete:"@"},templateUrl:CmsConfig.buildComponentPath("generic-ajax-button/generic-ajax-button.html")}}),angular.module("genericAjaxButton",["genericAjaxButton.directive"]),angular.module("saveButton.directive",["bulbs.cms.site.config","genericAjaxButton"]).directive("saveButton",function(CmsConfig){return{controller:"GenericAjaxButtonController",link:{pre:function(scope){scope.cssIconComplete="glyphicon-floppy-disk",scope.textProgress="Saving...",scope.textComplete="Save"}},restrict:"E",scope:{disableWhen:"&",clickFunction:"="},templateUrl:CmsConfig.buildComponentPath("generic-ajax-button/generic-ajax-button.html")}}),angular.module("hideFromRssField.directive",["bulbs.cms.site.config"]).directive("hideFromRssField",["CmsConfig",function(CmsConfig){return{restrict:"E",scope:{article:"="},templateUrl:CmsConfig.buildComponentPath("hide-from-rss-field","hide-from-rss-field.html")}}]),angular.module("hideFromRssField",["hideFromRssField.directive"]),angular.module("bulbs.cms.imageCropModal.controller",["BettyCropper","jquery","ui.bootstrap.modal"]).controller("ImageCropModalCtrl",["$","$modalInstance","$scope","$timeout","BettyCropper","Selection","imageData","ratios",function($,$modalInstance,$scope,$timeout,BettyCropper,Selection,imageData,ratios){$scope.selectedCrop=null,$scope.cropMode=!1,$scope.ratios=ratios,$scope.finished=!1,$scope.thumb_container_styles={},$scope.imageData=imageData,$scope.image||($scope.image=null,BettyCropper.get(imageData.id).then(function(success){$scope.image=success.data})),$scope.$watch("image",function(image){if(image){var finished=!0;for(var ratio in image.selections)if("auto"===image.selections[ratio].source){finished=!1;break}$scope.finished=finished,$scope.scaleData=image.scaleToFit(550,400),angular.element(".crop-image-container img").one("load",function(){$(this).Jcrop({allowSelect:!1,allowMove:!0,allowResize:!0,keySupport:!1},function(){$scope.jcrop_api=this})}),$scope.image_url=image.url("original",1200,"jpg"),$scope.ratios||($scope.ratios=Object.keys(image.selections)),$scope.setThumbStyles()}}),$scope.$watch("selectedCrop",function(crop){if($scope.image){var finished=!0;for(var ratio in $scope.image.selections)if("auto"===$scope.image.selections[ratio].source&&ratio!==crop){finished=!1;break}$scope.finished=finished}}),$scope.selectCrop=function(ratio){if(!ratio){ratio=Object.keys($scope.image.selections)[0];for(var key in $scope.image.selections)if("auto"===$scope.image.selections[key].source){ratio=key;break}}var selection=$scope.image.selections[ratio].scaleBy($scope.scaleData.scale);$scope.jcrop_api&&($scope.jcrop_api.setOptions({aspectRatio:selection.width()/selection.height()}),$scope.jcrop_api.setSelect([selection.x0,selection.y0,selection.x1,selection.y1])),$scope.cropMode=!0,$scope.selectedCrop=ratio},$scope.setThumbStyles=function(){$scope.thumb_styles=$scope.thumb_styles||{};for(var ratio in $scope.image.selections){var scaledSelection=$scope.image.selections[ratio].scaleToFit(170,170);$scope.thumb_container_styles[ratio]={"padding-top":Math.round((180-scaledSelection.height())/2)+"px","padding-bottom":"5px","padding-left":Math.round((180-scaledSelection.width())/2)+"px","padding-right":"5px"},$scope.thumb_styles[ratio]=$scope.image.getStyles(170,170,ratio)}},$scope.save=function(ratio){var jcrop_selection=$scope.jcrop_api.tellSelect(),newSelection=new Selection({x0:jcrop_selection.x,x1:jcrop_selection.x2,y0:jcrop_selection.y,y1:jcrop_selection.y2,source:"user"});return newSelection=newSelection.scaleBy(1/$scope.scaleData.scale),newSelection.x1>$scope.image.width&&(newSelection.x1=$scope.image.width),newSelection.y1>$scope.image.height&&(newSelection.y1=$scope.image.height),this.image.updateSelection(ratio,newSelection)},$scope.saveAndQuit=function(){var ratio=$scope.selectedCrop;this.save(ratio).then(function(success){var ratio=success.data[0],selection=success.data[1];$scope.image.selections[ratio]=selection}),$scope.cropMode=!1,$modalInstance.close(imageData)},$scope.saveAndNext=function(){var ratio=$scope.selectedCrop;this.save(ratio).then(function(success){var ratio=success.data[0],selection=success.data[1];$scope.image.selections[ratio]=selection;var nextRatioIndex=($scope.ratios.indexOf(ratio)+1)%$scope.ratios.length;$scope.selectCrop($scope.ratios[nextRatioIndex])})}}]),angular.module("bulbs.cms.imageCropModal",["bulbs.cms.imageCropModal.controller","bulbs.cms.site.config","ui.bootstrap.modal"]).factory("openImageCropModal",["$modal","CmsConfig",function($modal,CmsConfig){return function(imageData,ratios){return $modal.open({templateUrl:CmsConfig.buildComponentPath("image-crop-modal","image-crop-modal.html"),controller:"ImageCropModalCtrl",resolve:{imageData:function(){return imageData},ratios:function(){return ratios||!1}},backdrop:"static"}).result}}]),angular.module("bulbs.cms.liveBlog.api",["bulbs.cms.site.config","bulbs.cms.utils","lodash","moment"]).service("LiveBlogApi",["_","$http","CmsConfig","moment","Utils",function(_,$http,CmsConfig,moment,Utils){var liveBlogEndpoint=CmsConfig.buildApiUrlRoot.bind(null,"liveblog"),liveBlogEntryEndpoint=liveBlogEndpoint.bind(null,"entry"),parsePayload=function(payload){var data=_.cloneDeep(payload);return payload.published&&(data.published=moment.tz(payload.published,CmsConfig.getTimezoneName())),payload.created&&(data.created=moment.tz(payload.created,CmsConfig.getTimezoneName())),payload.updated&&(data.updated=moment.tz(payload.updated,CmsConfig.getTimezoneName())),data},cleanData=function(data){var payload=_.chain(data).omit("published").cloneDeep().value();return data.published&&(payload.published=data.published.format()),data.created&&(payload.created=data.created.format()),data.updated&&(payload.updated=data.updated.format()),payload};return{createEntry:function(data){var payload=cleanData(data);return $http.post(liveBlogEntryEndpoint("/"),payload).then(function(response){return parsePayload(response.data)})},updateEntry:function(entry){var payload=cleanData(entry);return $http.put(liveBlogEntryEndpoint(payload.id,"/"),payload).then(function(response){return parsePayload(response.data)})},deleteEntry:function(entry){return $http.delete(liveBlogEntryEndpoint(entry.id,"/"))},getEntries:function(id){var params;return id&&(params=Utils.param({liveblog:id})),$http.get(liveBlogEntryEndpoint("/",params)).then(function(response){return{results:response.data.results.map(function(result){return parsePayload(result)})}})}}}]),angular.module("bulbs.cms.liveBlog.entries.authorBridge",["bulbs.cms.site.config"]).directive("liveBlogEntriesAuthorBridge",["$compile","CmsConfig",function($compile,CmsConfig){return{link:function(scope,element){var name=CmsConfig.getLiveBlogAuthorSelectorDirectiveName();if(scope.authors=scope.ngModel,name){var html=angular.element("<"+name+' ng-model="authors">");element.find("> div").html($compile(html)(scope))}scope.$watch("authors",function(newValue,oldValue){angular.equals(newValue,oldValue)||(scope.onUpdate({newValue:newValue}),scope.ngModel=newValue)},!0)},restrict:"E",scope:{ngModel:"=",onUpdate:"&"},template:'
    No live blog author selector has been configured!
    '}}]),angular.module("bulbs.cms.liveBlog.entries",["bulbs.cms.currentUser","bulbs.cms.dateTimeFilter","bulbs.cms.dateTimeModal","bulbs.cms.dateTimeModal","bulbs.cms.liveBlog.api","bulbs.cms.liveBlog.entries.authorBridge","bulbs.cms.site.config","bulbs.cms.utils","confirmationModal","OnionEditor","Raven"]).directive("liveBlogEntries",["$q","CmsConfig","CurrentUserApi","LiveBlogApi","Raven","Utils",function($q,CmsConfig,CurrentUserApi,LiveBlogApi,Raven,Utils){return{link:function(scope){var reportError=function(message,data){Raven.captureMessage(message,data),scope.errorMessage=message},titleDisplay=function(entry){return entry.headline?'"'+entry.headline+'"':"an entry"};scope.clearError=function(){scope.errorMessage=""},LiveBlogApi.getEntries(scope.article.id).then(function(response){scope.entries=response.results}).catch(function(response){var message="An error occurred retrieving entries!";reportError(message,{response:response})});var panelOpen={};scope.isPanelOpen=function(entry){return angular.isUndefined(panelOpen[entry.id])&&(panelOpen[entry.id]=!0),panelOpen[entry.id]},scope.togglePanel=function(entry){panelOpen[entry.id]=!panelOpen[entry.id]},scope.collapseAll=function(){scope.entries.forEach(function(entry){panelOpen[entry.id]=!1})},scope.expandAll=function(){scope.entries.forEach(function(entry){panelOpen[entry.id]=!0})};var entryForm="entryForm_";scope.wrapperForm={},scope.makeEntryFormName=function(entry){return entryForm+entry.id},scope.getEntryForm=function(entry){var name=scope.makeEntryFormName(entry);return scope.wrapperForm[name]?scope.wrapperForm[name]:(scope.wrapperForm[name]={},scope.wrapperForm[name])},scope.isEntryFormSaveDisabled=function(entry){return scope.transactionsLocked()||scope.getEntryForm(entry).$pristine};var lock=Utils.buildLock();scope.transactionsLocked=lock.isLocked,scope.addEntry=lock(function(){return CurrentUserApi.getCurrentUserWithCache().then(function(user){var now=moment();return LiveBlogApi.createEntry({liveblog:scope.article.id,created_by:user,created:now,updated_by:user,updated:now}).then(function(entry){scope.entries.unshift(entry)}).catch(function(response){var message="An error occurred attempting to add an entry!";reportError(message,{response:response})})})}),scope.saveEntry=lock(function(entry){return CurrentUserApi.getCurrentUserWithCache().then(function(user){var oldUpdateBy=entry.updated_by,oldUpdated=entry.updated;return entry.updated_by=user,entry.updated=moment(),LiveBlogApi.updateEntry(entry).then(function(){scope.getEntryForm(entry).$setPristine()}).catch(function(response){entry.updated_by=oldUpdateBy,entry.updated=oldUpdated;var message="An error occurred attempting to save "+titleDisplay(entry)+"!";return reportError(message,{response:response}),$q.reject()})})}),scope.publishAndSave=function(entry,newDate){var oldDate=entry.published;return entry.published=newDate,scope.saveEntry(entry).then(function(){scope.entries.sort(function(entry1,entry2){var entry1IsMoment=moment.isMoment(entry1.published),entry2IsMoment=moment.isMoment(entry2.published);return!entry1IsMoment||entry2IsMoment&&!entry1.published.isBefore(entry2.published)?!entry2IsMoment||entry1IsMoment&&!entry2.published.isBefore(entry1.published)?0:-1:1})}).catch(function(){return entry.published=oldDate,!1})},scope.deleteEntry=lock(function(entry){return LiveBlogApi.deleteEntry(entry).then(function(){var index=scope.entries.indexOf(entry);Utils.removeFrom(scope.entries,index)}).catch(function(response){var message="An error occurred attempting to delete "+titleDisplay(entry)+"!";reportError(message,{response:response})})})},restrict:"E",scope:{article:"="},templateUrl:CmsConfig.buildComponentPath("live-blog","live-blog-entries","live-blog-entries.html")}}]),angular.module("bulbs.cms.liveBlog",["bulbs.cms.liveBlog.entries"]),angular.module("notifications.edit.directive",["apiServices.notification.factory","BettyCropper","bulbs.cms.site.config","copyButton","customSearch","lodash","saveButton.directive","notifications.settings","topBar"]).directive("notificationsEdit",function(CmsConfig){return{controller:function(_,$location,$q,$scope,NOTIFICATIONS_LIST_REL_PATH,Notification){$scope.LIST_URL=CmsConfig.buildExternalUrl(NOTIFICATIONS_LIST_REL_PATH),$scope.needsSave=!1;var modelId=$scope.getModelId();"new"===modelId?($scope.model=Notification.$build(),$scope.isNew=!0):$scope.model=Notification.$find($scope.getModelId()),window.onbeforeunload=function(e){if(!_.isEmpty($scope.model.$dirty())||$scope.isNew||$scope.needsSave)return"You have unsaved changes."},$scope.$on("$destroy",function(){delete window.onbeforeunload}),$scope.saveModel=function(){var promise;if($scope.model)promise=$scope.model.$save().$asPromise().then(function(data){"new"===modelId&&$location.path("/cms/app/notification/edit/"+data.id+"/"),$scope.isNew=!1,$scope.needsSave=!1});else{var deferred=$q.defer();deferred.reject(),promise=deferred.promise}return promise}},restrict:"E",scope:{getModelId:"&modelId"},templateUrl:CmsConfig.buildComponentPath("notifications/notifications-edit/notifications-edit.html")}}),angular.module("notifications.edit",["bulbs.cms.site.config","notifications.edit.directive"]).config(function($routeProvider){$routeProvider.when("/cms/app/notifications/edit/:id/",{controller:function($routeParams,$scope,$window,CmsConfig){$window.document.title=CmsConfig.getCmsName()+" | Edit Notification",$scope.routeId=$routeParams.id},template:'',reloadOnSearch:!1})}),angular.module("notifications.list",["apiServices.notification.factory","bulbs.cms.site.config","listPage","moment","notifications.settings"]).config(function($injector,$routeProvider,CmsConfigProvider){var CmsConfig=$injector.invoke(CmsConfigProvider.$get);$routeProvider.when("/cms/app/notifications/",{controller:function($scope,$window,NOTIFICATIONS_LIST_REL_PATH,Notification){$window.document.title=CmsConfig.getCmsName()+" | Notification",$scope.modelFactory=Notification,$scope.LIST_URL=CmsConfig.buildExternalUrl(NOTIFICATIONS_LIST_REL_PATH)},templateUrl:CmsConfig.buildComponentPath("notifications/notifications-list/notifications-list-page.html")})}),angular.module("notifications.settings",[]).value("NOTIFICATIONS_LIST_REL_PATH","/notification/"),angular.module("notifications",["notifications.list","notifications.edit"]),angular.module("polls.edit.directive",["apiServices.answer.factory","apiServices.poll.factory","BettyCropper","bulbs.cms.site.config","lodash","saveButton.directive","topBar"]).constant("RESPONSE_TYPES",[{name:"Text Only",value:"Text"},{name:"Image + Text",value:"Image"}]).directive("pollsEdit",function(CmsConfig){return{templateUrl:CmsConfig.buildComponentPath("polls/polls-edit/polls-edit.html"),controller:function(_,$http,$location,$q,$routeParams,$scope,$timeout,Answer,Poll){"new"===$routeParams.id?($scope.model={},$scope.isNew=!0):Poll.getPoll($routeParams.id).then(function(response){$scope.model=response,$scope.answers=_.cloneDeep(response.answers)}),window.onbeforeunload=function(e){if(!_.isEmpty($scope.model.$dirty())||$scope.isNew||$scope.needsSave)return"You have unsaved changes."},$scope.$on("$destroy",function(){delete window.onbeforeunload}),$scope.embedCode=function(){return''},$scope.validatePublication=function(){$timeout(function(){var published=$scope.model.published,endDate=$scope.model.end_date,publishedField=$scope.pollForm.published,endDateField=$scope.pollForm.endDate;publishedField.$setValidity("requiredWithEndDate",!(endDate&&!published));var comesAfterPublishedValid=!0;endDate&&published&&(comesAfterPublishedValid=published.isBefore(endDate)),endDateField.$setValidity("comesAfterPublished",comesAfterPublishedValid)})},$scope.saveModel=function(){return $scope.model?$scope.isNew?Poll.postPoll($scope.model).then(function(data){var answerPromise=_.map($scope.answers,function(answer){return Answer.postAnswer(answer,data.id)});return $q.all(answerPromise).then(function(){$location.path("/cms/app/polls/edit/"+data.id+"/")})}):(Answer.updatePollAnswers($scope),$scope.deletedAnswers=[],Poll.updatePoll($scope.model)):$q.reject("Save failed")},$scope.deletedAnswers=[];var newId=$scope.answers?$scope.answers.length:0;$scope.addAnswer=function(){$scope.answers.push({id:newId++,notOnSodahead:!0})},$scope.isNew&&($scope.answers=[],_.times(3,$scope.addAnswer)),$scope.removeAnswer=function(answerId){var deletedAnswer=_.remove($scope.answers,function(a){return a.id===answerId});deletedAnswer[0].notOnSodahead||$scope.deletedAnswers.push(deletedAnswer[0])}},restrict:"E",scope:{getModelId:"&modelId"}}}),angular.module("polls.edit",["bulbs.cms.site.config","polls.edit.directive"]).config(function($routeProvider){$routeProvider.when("/cms/app/polls/edit/:id/",{controller:function($routeParams,$scope,$window,CmsConfig){$window.document.title=CmsConfig.getCmsName()+" | Edit Poll",$scope.routeId=$routeParams.id},template:'',reloadOnSearch:!1})}),angular.module("polls.list",["apiServices.poll.factory","bulbs.cms.site.config","bulbsCmsApp.nonRestmodListPage","moment"]).config(function($injector,$routeProvider,CmsConfigProvider){var CmsConfig=$injector.invoke(CmsConfigProvider.$get);$routeProvider.when("/cms/app/polls/",{controller:function($scope,$window,Poll){$window.document.title=CmsConfig.getCmsName()+" | Poll",$scope.modelFactory=Poll},templateUrl:CmsConfig.buildComponentPath("polls/polls-list/polls-list-page.html")})}),angular.module("polls",["polls.list","polls.edit"]),angular.module("promotedContentArticle.directive",["bulbs.cms.site.config"]).directive("promotedContentArticle",function(CmsConfig){return{restrict:"E",scope:{article:"="},templateUrl:CmsConfig.buildComponentPath("promoted-content/promoted-content-article/promoted-content-article.html")}}),angular.module("promotedContentArticle",["promotedContentArticle.directive"]),angular.module("promotedContentList.directive",["bulbs.cms.site.config","promotedContentArticle","promotedContentSave","ui.sortable"]).directive("promotedContentList",function($,CmsConfig){return{controller:function($scope,PromotedContentService){$scope.pzoneData=PromotedContentService.getData(),$scope.moveUp=function(index){PromotedContentService.moveContentUp(index)},$scope.moveDown=function(index){PromotedContentService.moveContentDn(index)},$scope.remove=function(article){PromotedContentService.$removeContentFromPZone(article.id)},$scope.completeAction=function(index){PromotedContentService.$completeContentAction(index)},$scope.stopAction=function(){PromotedContentService.stopContentAction()},$scope.markDirty=function(){PromotedContentService.markDirtySelectedPZone()},$scope.disableControls=function(){return PromotedContentService.isPZoneRefreshPending()}},link:function(scope,element,attr){scope.sortableOptions={beforeStop:function(e,ui){ui.helper.css("margin-top",0),ui.item.parent().removeClass("ui-sortable-dragging")},cancel:".ui-sortable-unsortable",change:function(e,ui){ui.helper.css("margin-top",$(window).scrollTop())},containment:"promoted-content-list",distance:3,opacity:.75,placeholder:"dropzone",start:function(e,ui){ui.item.parent().addClass("ui-sortable-dragging"),ui.helper.css("margin-top",$(window).scrollTop())},stop:function(){scope.markDirty()}}},restrict:"E",scope:{},templateUrl:CmsConfig.buildComponentPath("promoted-content/promoted-content-list/promoted-content-list.html")}}),angular.module("promotedContentList",["promotedContentList.directive"]),angular.module("promotedContentOperationsList.directive",["bulbs.cms.site.config","promotedContent.service"]).directive("promotedContentOperationsList",function(_,CmsConfig,moment){return{controller:function(moment,$scope,PromotedContentService){$scope.pzoneData=PromotedContentService.getData(),$scope.scheduleDateFrom=moment(),$scope.scheduleDateTo=moment().add(3,"days"),$scope.deleteStatus={message:"",isError:!1},PromotedContentService.$ready().then(function(){$scope.aggregatedOperations=$scope.pzoneData.operations.concat($scope.pzoneData.unsavedOperations)}),$scope.removeOperation=function(operation){PromotedContentService.$removeOperation(operation.id).then(function(){$scope.deleteStatus={message:"Operation successfully removed!",isError:!1}}).catch(function(err){$scope.deleteStatus={message:err,isError:!0}})},$scope.clearDeleteStatus=function(){$scope.deleteStatus.message=""},$scope.setPreviewTime=function(time){PromotedContentService.setPreviewTime(time.add(1,"minute"))},$scope.disableControls=function(){return PromotedContentService.isPZoneRefreshPending()},$scope.operationsStale=function(){return PromotedContentService.isPZoneOperationsStale()},$scope.refreshingOperations=!1,$scope.refreshOperations=function(){$scope.refreshingOperations||($scope.refreshingOperations=!0,PromotedContentService.$refreshOperations({from:$scope.scheduleDateFrom.toISOString(),to:$scope.scheduleDateTo.toISOString()}).finally(function(){$scope.refreshingOperations=!1}))}},link:function(scope,element,attr){var operationTime=function(operation){var compTime;return compTime=operation.whenAsMoment?operation.whenAsMoment:scope.pzoneData.previewTime?scope.pzoneData.previewTime:moment()};scope.aggregatedOperations={},scope.groupDateFormat="M/D/YY @ h:mma";var aggregator=function(){var tempAggregate=scope.pzoneData.operations.concat(scope.pzoneData.unsavedOperations);scope.aggregatedOperations=_.chain(tempAggregate).sortBy(operationTime).groupBy(function(operation){return operationTime(operation).format(scope.groupDateFormat)}).pairs().map(function(pair){return[moment(pair[0],scope.groupDateFormat),pair[1]]}).sortBy(function(pair){return pair[0]}).value()};scope.$watchCollection("pzoneData.operations",aggregator),scope.$watchCollection("pzoneData.unsavedOperations",aggregator)},restrict:"E",scope:{},templateUrl:CmsConfig.buildComponentPath("promoted-content/promoted-content-operations-list/promoted-content-operations-list.html")}}),angular.module("promotedContentOperationsList",["promotedContentOperationsList.directive"]),angular.module("promotedContentPzoneSelect.directive",["bulbs.cms.site.config","promotedContent.service"]).directive("promotedContentPzoneSelect",function(CmsConfig){return{controller:function($scope,PromotedContentService){$scope.pzoneData=PromotedContentService.getData(),$scope.selectedPZoneName="",PromotedContentService.$ready().then(function(){$scope.selectedPZoneName=$scope.pzoneData.selectedPZone.name}),$scope.changePZone=function(name){!function(name){PromotedContentService.$refreshPZones().then(function(){PromotedContentService.$selectPZone(name)})}(name)},$scope.disableControls=function(){return PromotedContentService.isPZoneRefreshPending()}},restrict:"E",scope:{},templateUrl:CmsConfig.buildComponentPath("promoted-content/promoted-content-pzone-select/promoted-content-pzone-select.html")}}),angular.module("promotedContentPzoneSelect",["promotedContentPzoneSelect.directive"]),angular.module("promotedContentSave.directive",["bulbs.cms.site.config","promotedContent.service"]).directive("promotedContentSave",function(CmsConfig){return{controller:function($scope,PromotedContentService){$scope.pzoneData=PromotedContentService.getData(),$scope.savePZone=function(){PromotedContentService.$saveSelectedPZone()},$scope.clearOperations=function(){PromotedContentService.clearUnsavedOperations(),PromotedContentService.$refreshSelectedPZone($scope.pzoneData.previewTime)},$scope.disableControls=function(){return PromotedContentService.isPZoneRefreshPending()}},restrict:"E",scope:{},templateUrl:CmsConfig.buildComponentPath("promoted-content/promoted-content-save/promoted-content-save.html")}}),angular.module("promotedContentSave",["promotedContentSave.directive"]),angular.module("promotedContentSearch.directive",["bulbs.cms.site.config","statusFilter","filterWidget","promotedContent.service","promotedContentArticle"]).directive("promotedContentSearch",function(CmsConfig){return{controller:function(_,moment,$scope,$location,PromotedContentService){$scope.pzoneData=PromotedContentService.getData(),$scope.pageNumber=$location.search().page||"1",$scope.goToPage=function(){PromotedContentService.$refreshAllContent({page:$scope.pageNumber},!0)},$scope.contentIsEnabled=function(content){var notAlreadyInList=$scope.pzoneData.selectedPZone&&_.isUndefined(_.find($scope.pzoneData.selectedPZone.content,{id:content.id})),immediateDraggable=null===$scope.pzoneData.previewTime&&moment().isAfter(content.published),futureDraggable=null!==$scope.pzoneData.previewTime&&moment().isBefore($scope.pzoneData.previewTime)&&$scope.pzoneData.previewTime.isAfter(content.published);return notAlreadyInList&&(immediateDraggable||futureDraggable)},$scope.beginInsert=function(article){PromotedContentService.beginContentInsert(article)},$scope.beginReplace=function(article){PromotedContentService.beginContentReplace(article)},$scope.stopAction=function(){PromotedContentService.stopContentAction()},$scope.disableControls=function(){return PromotedContentService.isPZoneRefreshPending()}},link:function(scope,element,attr){scope.tools=null,scope.openToolsFor=function(article){var doOpen=!1;return scope.disableControls()||(scope.tools=article.id,doOpen=!0),doOpen},scope.closeTools=function(){return scope.tools=null,!0},scope.toolsOpenFor=function(article){return scope.tools===article.id}},restrict:"E",scope:{},templateUrl:CmsConfig.buildComponentPath("promoted-content/promoted-content-search/promoted-content-search.html")}}),angular.module("promotedContentSearch",["promotedContentSearch.directive"]),angular.module("promotedContent.service",["contentServices","moment","restangular"]).service("PromotedContentService",function($,_,moment,$q,Restangular,ContentFactory,ContentListService){var PromotedContentService=this;PromotedContentService._serviceData={allContent:ContentListService.getData(),actionContent:null,action:null,pzones:[],unsavedOperations:[],operations:[],selectedPZone:null,previewTime:null};var _data=PromotedContentService._serviceData,setupDefer=$q.defer(),readableOperationTypes={INSERT:"INSERT",DELETE:"DELETE",REPLACE:"REPLACE"};PromotedContentService.readableOperationTypes=readableOperationTypes;var operationTypeToReadable={promotion_insertoperation:readableOperationTypes.INSERT,promotion_deleteoperation:readableOperationTypes.DELETE,promotion_replaceoperation:readableOperationTypes.REPLACE},readableToOperationType=_.reduce(operationTypeToReadable,function(result,val,key){return result[val]=key,result},{}),pzoneRefreshPending=!1,pzoneOperationsStale=!0;PromotedContentService.isPZoneRefreshPending=function(){return pzoneRefreshPending},PromotedContentService.isPZoneOperationsStale=function(){return pzoneOperationsStale},PromotedContentService.$refreshPZones=function(filters){var deferred=$q.defer();return pzoneRefreshPending?(deferred.reject(),deferred.promise):(pzoneRefreshPending=!0,ContentFactory.all("pzone").getList(filters).then(function(data){return _data.pzones=data,_.each(_data.pzones,function(pzone){pzone.saved=!0}),deferred.resolve(),_data.pzones}).catch(function(err){return deferred.reject(),err}).finally(function(){pzoneRefreshPending=!1}))},PromotedContentService.markDirtySelectedPZone=function(){delete _data.selectedPZone.saved},PromotedContentService.markSavedSelectedPZone=function(){_data.selectedPZone.saved=!0},PromotedContentService.makeOperationsStale=function(){_data.operations=[],pzoneOperationsStale=!0},PromotedContentService.$saveSelectedPZone=function(){var defer=$q.defer();return _data.previewTime&&_data.previewTime.isAfter(moment())?(PromotedContentService.makeOperationsStale(),_.each(_data.unsavedOperations,function(operation){operation.when=_data.previewTime?_data.previewTime.toISOString():null,delete operation.client_id}),_data.selectedPZone.all("operations").post(_data.unsavedOperations).then(function(){defer.resolve(_data.selectedPZone)}),PromotedContentService.clearUnsavedOperations()):_data.previewTime?defer.reject("Cannot save operations in the past."):(PromotedContentService.clearUnsavedOperations(),PromotedContentService.makeOperationsStale(), +_data.selectedPZone.put().then(function(){defer.resolve(_data.selectedPZone)}).catch(function(err){defer.reject(err)})),defer.promise},PromotedContentService.$refreshAllContent=function(){return ContentListService.$updateContent.apply(ContentListService,arguments)},PromotedContentService.$addOperation=function(props){var defer=$q.defer();if(PromotedContentService.isPreviewTimeImmediate())defer.resolve();else if(PromotedContentService.isPreviewTimePast())defer.reject("Cannot add operations in the past.");else{var lastId=_.max(_data.unsavedOperations,"client_id").client_id,nextId=lastId?lastId+1:0,allProps=_.assign({client_id:nextId,type_name:readableToOperationType[props.cleanType]||"",pzone:_data.selectedPZone.id,applied:!1,content:null,content_title:"",index:null},props),operation=Restangular.restangularizeElement(_data.selectedPZone.all("operations"),allProps);_data.unsavedOperations.push(operation),defer.resolve(operation)}return defer.promise},PromotedContentService.$removeOperation=function(id){var defer=$q.defer(),index=_.findIndex(_data.operations,{id:id}),operation=_data.operations[index];return operation?operation.whenAsMoment.isAfter(moment())?operation.remove().then(function(){_data.operations.splice(index,1),defer.resolve()}).catch(function(err){404===err.status?defer.reject("Cannot find operation to delete."):defer.reject(err)}):defer.reject("Cannot delete an operation in the past."):defer.reject("Could not find saved operation with id "+id+" to delete."),defer.promise},PromotedContentService.clearUnsavedOperations=function(){_data.unsavedOperations=[],PromotedContentService.markSavedSelectedPZone()},PromotedContentService.$refreshOperations=function(params){return _data.selectedPZone.getList("operations",params).then(function(data){return _data.operations=data,_.each(_data.operations,function(operation){operation.cleanType=operationTypeToReadable[operation.type_name],operation.whenAsMoment=moment(operation.when)}),pzoneOperationsStale=!1,_data.operations}).catch(function(err){return err})},PromotedContentService.$selectPZone=function(name){return _data.selectedPZone=_.find(_data.pzones,{name:name})||_data.pzones[0],PromotedContentService.clearUnsavedOperations(),PromotedContentService.$refreshSelectedPZone(_data.previewTime)},PromotedContentService.$removeContentFromPZone=function(contentId){var defer=$q.defer(),i=_.findIndex(_data.selectedPZone.content,{id:contentId});return i>=0?PromotedContentService.$addOperation({cleanType:readableOperationTypes.DELETE,content:contentId,content_title:_data.selectedPZone.content[i].title}).then(function(){PromotedContentService.markDirtySelectedPZone(),_data.selectedPZone.content.splice(i,1),defer.resolve()}).catch(function(err){defer.reject(err)}):defer.reject("Could not find content with given id to delete."),defer.promise};var moveTo=function(indexFrom,indexTo){var ret=!1,content=_data.selectedPZone.content;if(indexFrom>=0&&indexFrom=0&&indexTo0&&(content[indexTo]=splicer[0],ret=!0,PromotedContentService.markDirtySelectedPZone())}return ret};PromotedContentService.moveContentUp=function(index){return moveTo(index,index-1)},PromotedContentService.moveContentDn=function(index){return moveTo(index,index+1)},PromotedContentService.beginContentInsert=function(article){_data.actionContent=article,_data.action=readableOperationTypes.INSERT},PromotedContentService.beginContentReplace=function(article){_data.actionContent=article,_data.action=readableOperationTypes.REPLACE},PromotedContentService.stopContentAction=function(){_data.actionContent=null,_data.action=null},PromotedContentService.$completeContentAction=function(index){var deferred=$q.defer();return _data.action?PromotedContentService.$addOperation({cleanType:_data.action,content:_data.actionContent.id,content_title:_data.actionContent.title,index:index}).then(function(){var duplicateIndex=_.findIndex(_data.selectedPZone.content,{id:_data.actionContent.id});index!==duplicateIndex&&duplicateIndex>=0&&_data.selectedPZone.content.splice(duplicateIndex,1);var replace=_data.action===readableOperationTypes.REPLACE;_data.selectedPZone.content.splice(index,replace?1:0,_data.actionContent),PromotedContentService.stopContentAction(),PromotedContentService.markDirtySelectedPZone(),deferred.resolve()}).catch(deferred.reject):deferred.reject("No action to complete in progress."),deferred.promise},PromotedContentService.setPreviewTime=function(time){return _data.previewTime=time,PromotedContentService.clearUnsavedOperations(),PromotedContentService.$refreshSelectedPZone(_data.previewTime)},PromotedContentService.setPreviewTimeToImmediate=function(){PromotedContentService.setPreviewTime(null)},PromotedContentService.isPreviewTimeImmediate=function(){return null===_data.previewTime},PromotedContentService.isPreviewTimePast=function(){return!PromotedContentService.isPreviewTimeImmediate()&&_data.previewTime.isBefore(moment())},PromotedContentService.$refreshSelectedPZone=function(time){var params={};time&&(params.preview=time.toISOString()),PromotedContentService.makeOperationsStale();var deferred=$q.defer();return pzoneRefreshPending?deferred.reject():(pzoneRefreshPending=!0,_data.selectedPZone.get(params).then(function(data){return deferred.resolve(),_data.selectedPZone=data,_data.selectedPZone}).catch(function(err){return deferred.reject(),err}).finally(function(){PromotedContentService.markSavedSelectedPZone(),pzoneRefreshPending=!1})),deferred.promise},PromotedContentService.getData=function(){return _data},PromotedContentService.$ready=function(){return setupDefer.promise},PromotedContentService.$refreshPZones().then(function(){return PromotedContentService.$refreshAllContent()}).then(function(){return PromotedContentService.$selectPZone()}).then(function(){setupDefer.resolve()})}),angular.module("promotedContentTimePicker.directive",["bulbs.cms.site.config","promotedContent.service"]).directive("promotedContentTimePicker",function(CmsConfig){return{controller:function(moment,$scope,PromotedContentService){$scope.contentData=PromotedContentService.getData(),$scope.setPreviewTime=function(previewTime){PromotedContentService.setPreviewTime(previewTime)},$scope.setPreviewTimeToImmediate=function(){$scope.previewTime=null,PromotedContentService.setPreviewTimeToImmediate()},$scope.disableControls=function(){return PromotedContentService.isPZoneRefreshPending()}},restrict:"E",scope:{},templateUrl:CmsConfig.buildComponentPath("promoted-content/promoted-content-time-picker/promoted-content-time-picker.html")}}),angular.module("promotedContentTimePicker",["promotedContentTimePicker.directive"]),angular.module("promotedContent",["bulbs.cms.site.config","promotedContentPzoneSelect","promotedContentList","promotedContentSearch","promotedContentTimePicker","promotedContentOperationsList"]).config(function($injector,$routeProvider,CmsConfigProvider){var CmsConfig=$injector.invoke(CmsConfigProvider.$get);$routeProvider.when("/cms/app/promotion/",{controller:["$window","CmsConfig",function($window){$window.document.title=CmsConfig.getCmsName()+" | Promotion Tool"}],templateUrl:CmsConfig.buildComponentPath("promoted-content/promoted-content.html"),reloadOnSearch:!1})}),angular.module("lineItems.edit.directive",["apiServices.lineItem.factory","bulbs.cms.site.config","lodash","saveButton.directive","topBar"]).directive("lineItemsEdit",function(CmsConfig){return{controller:function(_,$location,$q,$routeParams,$scope,LineItem){"new"===$routeParams.id?($scope.model=LineItem.$build(),$scope.isNew=!0):$scope.model=LineItem.$find($routeParams.id),window.onbeforeunload=function(e){if(!_.isEmpty($scope.model.$dirty())||$scope.isNew||$scope.needsSave)return"You have unsaved changes."},$scope.$on("$destroy",function(){delete window.onbeforeunload}),$scope.saveModel=function(){var promise;if($scope.model)promise=$scope.model.$save().$asPromise().then(function(data){$location.path("/cms/app/line-items/edit/"+data.id+"/")});else{var deferred=$q.defer();deferred.reject(),promise=deferred.promise}return promise}},restrict:"E",scope:{getModelId:"&modelId"},templateUrl:CmsConfig.buildComponentPath("reporting/reporting-line-items-edit/reporting-line-items-edit.html")}}),angular.module("lineItems.edit",["bulbs.cms.site.config","lineItems.edit.directive"]).config(function($routeProvider){$routeProvider.when("/cms/app/line-items/edit/:id/",{controller:function($routeParams,$scope,$window,CmsConfig){$window.document.title=CmsConfig.getCmsName()+" | Edit Line Item",$scope.routeId=$routeParams.id},template:'',reloadOnSearch:!1})}),angular.module("lineItems.list",["apiServices.lineItem.factory","bulbs.cms.site.config","listPage"]).config(function($injector,$routeProvider,CmsConfigProvider){var CmsConfig=$injector.invoke(CmsConfigProvider.$get);$routeProvider.when("/cms/app/line-items/",{controller:function($modal,$scope,$window,LineItem){$window.document.title=CmsConfig.getCmsName()+" | Line Items",$scope.modelFactory=LineItem,$scope.LineItemExportModal=function(){return $modal.open({templateUrl:"/views/modals/line-item-export-modal.html",controller:"LineitemexportmodalCtrl"})},$scope.utilityButtons=[{title:"Export CSV",click:function(){$scope.LineItemExportModal()},buttonClasses:"add-item btn btn-primary",iconClasses:"font-awesome"}]},templateUrl:CmsConfig.buildComponentPath("reporting/reporting-line-items-list/reporting-line-items-list.html")})}),angular.module("rateOverrides.edit.directive",["apiServices.rateOverride.factory","apiServices.featureType.factory","bulbs.cms.site.config","lodash","saveButton.directive","topBar"]).directive("rateOverridesEdit",function(CmsConfig){return{controller:function(_,$location,$http,$q,$routeParams,$scope,ContentFactory,FeatureType,RateOverride,Raven){var resourceUrl="/cms/api/v1/contributions/role/";"new"===$routeParams.id?($scope.model=RateOverride.$build(),$scope.isNew=!0):($scope.model=RateOverride.$find($routeParams.id),$scope.model.$promise.then(function(){$scope.model.hasOwnProperty("role")&&null!==$scope.model.role&&($scope.model.role=$scope.model.role.id)})),window.onbeforeunload=function(e){if(!_.isEmpty($scope.model.$dirty())||$scope.isNew||$scope.needsSave)return"You have unsaved changes."},$scope.$on("$destroy",function(){delete window.onbeforeunload}),$scope.getPaymentType=function(roleId){if($scope.hasOwnProperty("roles")){for(var i=0;i<$scope.roles.length;i++)if($scope.roles[i].id===roleId)return $scope.roles[i].payment_type;return null}},$scope.isFeatureRated=function(){return"FeatureType"===$scope.getPaymentType($scope.model.role)},$scope.isHourlyRated=function(){return"Hourly"===$scope.getPaymentType($scope.model.role)},$scope.isFlatRated=function(){return"Flat Rate"===$scope.getPaymentType($scope.model.role)},$scope.addFeatureType=function(){$scope.model.hasOwnProperty("featureTypes")||($scope.model.featureTypes=[]),$scope.model.featureTypes.push({featureType:null,rate:0})},$scope.getFeatureTypes=function(){$http({method:"GET",url:resourceUrl}).success(function(data){$scope.featureTypes=data.results||data}).error(function(data,status,headers,config){Raven.captureMessage("Error fetching FeatureTypes",{extra:data})})},$scope.getRoles=function(){$http({method:"GET",url:resourceUrl}).success(function(data){$scope.roles=data.results||data}).error(function(data,status,headers,config){Raven.captureMessage("Error fetching Roles",{extra:data})})},$scope.searchFeatureTypes=function(searchTerm){return FeatureType.simpleSearch(searchTerm)},$scope.saveModel=function(){var promise;if($scope.model)promise=$scope.model.$save().$asPromise().then(function(data){$location.path("/cms/app/rate-overrides/edit/"+data.id+"/"),$scope.model.hasOwnProperty("role")&&null!==$scope.model.role&&($scope.model.role=$scope.model.role.id)});else{var deferred=$q.defer();deferred.reject(),promise=deferred.promise}return promise},$scope.getRoles(),$scope.getFeatureTypes()},restrict:"E",scope:{getModelId:"&modelId"},templateUrl:CmsConfig.buildComponentPath("reporting/reporting-rate-overrides-edit/reporting-rate-overrides-edit.html")}}),angular.module("rateOverrides.edit",["bulbs.cms.site.config","rateOverrides.edit.directive"]).config(function($routeProvider){$routeProvider.when("/cms/app/rate-overrides/edit/:id/",{controller:function($routeParams,$scope,$window,CmsConfig){$window.document.title=CmsConfig.getCmsName()+" | Edit Rate Override",$scope.routeId=$routeParams.id},template:'',reloadOnSearch:!1})}),angular.module("rateOverrides.list",["apiServices.rateOverride.factory","bulbs.cms.site.config","listPage"]).config(function($injector,$routeProvider,CmsConfigProvider){var CmsConfig=$injector.invoke(CmsConfigProvider.$get);$routeProvider.when("/cms/app/rate-overrides/",{controller:function($scope,$window,RateOverride){$window.document.title=CmsConfig.getCmsName()+" | Rate Overrides",$scope.modelFactory=RateOverride},templateUrl:CmsConfig.buildComponentPath("reporting/reporting-rate-overrides-list/reporting-rate-overrides-list.html")})}),angular.module("roles.edit.directive",["apiServices.reporting.factory","bulbs.cms.site.config","lodash","saveButton.directive","topBar"]).constant("PAYMENT_TYPES",[{name:"Flat Rate",value:"Flat Rate"},{name:"FeatureType",value:"FeatureType"},{name:"Hourly",value:"Hourly"},{name:"Manual",value:"Manual"}]).directive("rolesEdit",function(CmsConfig){return{controller:function(_,$location,$q,$routeParams,$scope,Role,PAYMENT_TYPES){$scope.page="contributions",$scope.PAYMENT_TYPES=PAYMENT_TYPES,"new"===$routeParams.id?($scope.model=Role.$build(),$scope.isNew=!0):$scope.model=Role.$find($routeParams.id).$then(function(){$scope.model.feature_type_rates.$fetch(),$scope.model.flat_rates.$fetch(),$scope.model.hourly_rates.$fetch()}),window.onbeforeunload=function(e){if(!_.isEmpty($scope.model.$dirty())||$scope.isNew||$scope.needsSave)return"You have unsaved changes."},$scope.$on("$destroy",function(){delete window.onbeforeunload}),$scope.rateEditable=function(){var paymentTypes=PAYMENT_TYPES.slice(0,3);return!!paymentTypes.indexOf($scope.model.paymentType>=0)},$scope.getDirtyRates=function(){var dirty=[];return $scope.model.hasOwnProperty("flat_rate")&&!_.isEmpty($scope.model.flat_rate.$dirty())&&dirty.push($scope.model.flat_rate),$scope.model.hasOwnProperty("hourly_rate")&&!_.isEmpty($scope.model.hourly_rate.$dirty())&&dirty.push($scope.model.hourly_rate),$scope.model.feature_type_rates.forEach(function(rate){_.isEmpty(rate.$dirty())||dirty.push(rate)}),dirty},$scope.saveDirtyRates=function(){var dirtyRates=$scope.getDirtyRates();dirtyRates.forEach(function(rate){rate.$save()})},$scope.saveModel=function(){var promise;if($scope.saveDirtyRates(),$scope.model)promise=$scope.model.$save().$asPromise().then(function(data){$location.path("/cms/app/roles/edit/"+data.id+"/")});else{var deferred=$q.defer();deferred.reject(),promise=deferred.promise}return promise}},restrict:"E",scope:{getModelId:"&modelId"},templateUrl:CmsConfig.buildComponentPath("reporting/reporting-roles-edit/reporting-roles-edit.html")}}),angular.module("roles.edit",["bulbs.cms.site.config","roles.edit.directive"]).config(function($routeProvider){$routeProvider.when("/cms/app/roles/edit/:id/",{controller:function($routeParams,$scope,$window,CmsConfig){$window.document.title=CmsConfig.getCmsName()+" | Edit Role",$scope.routeId=$routeParams.id},template:'',reloadOnSearch:!1})}),angular.module("roles.list",["apiServices.reporting.factory","bulbs.cms.site.config","listPage"]).config(function($injector,$routeProvider,CmsConfigProvider){var CmsConfig=$injector.invoke(CmsConfigProvider.$get);$routeProvider.when("/cms/app/roles/",{controller:function($scope,$window,Role){$window.document.title=CmsConfig.getCmsName()+" | Roles",$scope.modelFactory=Role},templateUrl:CmsConfig.buildComponentPath("reporting/reporting-roles-list/reporting-roles-list.html")})}),angular.module("reports",["lineItems.edit","lineItems.list","rateOverrides.edit","rateOverrides.list","roles.edit","roles.list"]),angular.module("sections.edit.directive",["apiServices.section.factory","BettyCropper","bulbs.cms.site.config","copyButton","customSearch","lodash","saveButton.directive","sections.settings","topBar"]).directive("sectionsEdit",function(CmsConfig){return{controller:function(_,$location,$q,$scope,SECTIONS_LIST_REL_PATH,Section){$scope.LIST_URL=CmsConfig.buildExternalUrl(SECTIONS_LIST_REL_PATH),$scope.needsSave=!1;var modelId=$scope.getModelId();"new"===modelId?($scope.model=Section.$build(),$scope.isNew=!0):$scope.model=Section.$find($scope.getModelId()),window.onbeforeunload=function(e){if(!_.isEmpty($scope.model.$dirty())||$scope.isNew||$scope.needsSave)return"You have unsaved changes."},$scope.$on("$destroy",function(){delete window.onbeforeunload}),$scope.saveModel=function(){var promise;if($scope.model)promise=$scope.model.$save().$asPromise().then(function(data){"new"===modelId&&$location.path("/cms/app/section/edit/"+data.id+"/"),$scope.isNew=!1,$scope.needsSave=!1});else{var deferred=$q.defer();deferred.reject(),promise=deferred.promise}return promise}},restrict:"E",scope:{getModelId:"&modelId"},templateUrl:CmsConfig.buildComponentPath("sections/sections-edit/sections-edit.html")}}),angular.module("sections.edit",["bulbs.cms.site.config","sections.edit.directive"]).config(function($routeProvider){$routeProvider.when("/cms/app/section/edit/:id/",{controller:function($routeParams,$scope,$window,CmsConfig){$window.document.title=CmsConfig.getCmsName()+" | Edit Section",$scope.routeId=$routeParams.id},template:'',reloadOnSearch:!1})}),angular.module("sections.list",["apiServices.section.factory","bulbs.cms.site.config","listPage","sections.settings"]).config(function($injector,$routeProvider,CmsConfigProvider){var CmsConfig=$injector.invoke(CmsConfigProvider.$get);$routeProvider.when("/cms/app/section/",{controller:function($scope,$window,SECTIONS_LIST_REL_PATH,Section){$window.document.title=CmsConfig.getCmsName()+" | Section",$scope.modelFactory=Section,$scope.LIST_URL=CmsConfig.buildExternalUrl(SECTIONS_LIST_REL_PATH)},templateUrl:CmsConfig.buildComponentPath("sections/sections-list/sections-list-page.html")})}),angular.module("sections.settings",[]).value("SECTIONS_LIST_REL_PATH","/section/"),angular.module("sections",["sections.list","sections.edit"]),angular.module("bulbs.cms.sendToEditorModal.api",["bulbs.cms.dateTimeFilter","bulbs.cms.site.config","bulbs.cms.utils","lodash"]).service("SendToEditorApi",["_","$http","CmsConfig","dateTimeFormatFilter","moment","Utils",function(_,$http,CmsConfig,dateTimeFormatFilter,moment,Utils){var endpoint=function(article){return CmsConfig.buildApiUrlRoot("content",article.id,"send/")},parsePayload=function(payload){var data=_.cloneDeep(payload.data);return data};return{sendToEditor:function(article,status,notes){return $http.post(endpoint(article),{status:status,notes:notes}).then(function(response){return parsePayload(response)})}}}]),angular.module("bulbs.cms.sendToEditorModal",["bulbs.cms.sendToEditorModal.api","bulbs.cms.site.config","Raven","ui.bootstrap","ui.bootstrap.modal"]).directive("sendToEditorModalOpener",["$modal","$q","CmsConfig","SendToEditorApi","Raven",function($modal,$q,CmsConfig,SendToEditorApi,Raven){return{restrict:"A",scope:{modalArticle:"=",modalOnBeforeOpen:"&",modalOnCancel:"&",modalOnOk:"&"},link:function(scope,element){scope.statuses=CmsConfig.getArticleEditoralStatuses(),scope.modalInstance=!1;var setupAndOpenModal=function(){scope.clearError=function(){scope.errorMessage=""},scope.sendToEditor=function(status,note){return scope.clearError(),SendToEditorApi.sendToEditor(scope.modalArticle,status,"Status: "+status+"\n\n"+note).then(scope.modalInstance.close).catch(function(response){Raven.captureMessage("Error attempting to send to editor",{response:response}),scope.errorMessage="An error occurred!"})},scope.modalInstance=$modal.open({scope:scope,templateUrl:CmsConfig.buildComponentPath("send-to-editor-modal","send-to-editor-modal.html")}),scope.modalInstance.result.then(scope.modalOnOk).catch(scope.modalOnCancel).finally(function(){scope.modalInstance=!1})};element.addClass("send-to-editor-modal-opener"),element.on("click",function(){scope.modalInstance||$q.when(scope.modalOnBeforeOpen()).then(function(result){result!==!1&&setupAndOpenModal()})})}}}]),angular.module("specialCoverage.edit.directive",["apiServices.campaign.factory","apiServices.specialCoverage.factory","bulbs.cms.site.config","campaignAutocomplete","copyButton","customSearch","lodash","specialCoverage.settings","topBar","ui.bootstrap.tooltip","videoList","bulbs.cms.superFeatures.tab"]).directive("specialCoverageEdit",function(CmsConfig){return{controller:function(_,$location,$q,$scope,$modal,Campaign,SPECIAL_COVERAGE_LIST_REL_PATH,SpecialCoverage){$scope.ACTIVE_STATES=SpecialCoverage.ACTIVE_STATES,$scope.LIST_URL=CmsConfig.buildExternalUrl(SPECIAL_COVERAGE_LIST_REL_PATH),$scope.needsSave=!1,$scope.tunicCampaignIdMapping={};var modelId=$scope.getModelId();"new"===modelId?($scope.model=SpecialCoverage.$build(),$scope.isNew=!0):$scope.model=SpecialCoverage.$find($scope.getModelId()).$then(function(){$scope.model.$loadTunicCampaign().then(function(campaign){$scope.tunicCampaignIdMapping[campaign.id]=campaign})}),window.onbeforeunload=function(e){if(!_.isEmpty($scope.model.$dirty())||$scope.isNew||$scope.needsSave)return"You have unsaved changes."},$scope.$on("$destroy",function(){delete window.onbeforeunload}),$scope.saveModel=function(){var promise;if($scope.model)promise=$scope.model.$save().$asPromise().then(function(data){"new"===modelId&&$location.path("/cms/app/special-coverage/edit/"+data.id+"/"),$scope.isNew=!1,$scope.needsSave=!1});else{var deferred=$q.defer();deferred.reject(),promise=deferred.promise}return promise},$scope.previewLinkModal=function(){return $modal.open({templateUrl:"/views/modals/preview-link-modal.html",scope:$scope,resolve:{}})},$scope.tunicCampaignFormatter=function(campaignId){if(campaignId in $scope.tunicCampaignIdMapping){var campaign=$scope.tunicCampaignIdMapping[campaignId];return campaign.name+" - "+campaign.number}},$scope.searchCampaigns=function(searchTerm){return $scope.model.$searchCampaigns({search:searchTerm}).then(function(campaigns){return campaigns.forEach(function(campaign){$scope.tunicCampaignIdMapping[campaign.id]=campaign}),campaigns.map(function(campaign){return campaign.id})})}},restrict:"E",scope:{getModelId:"&modelId"},templateUrl:CmsConfig.buildComponentPath("special-coverage/special-coverage-edit/special-coverage-edit.html")}}),angular.module("specialCoverage.edit",["bulbs.cms.site.config","specialCoverage.edit.directive"]).config(function($routeProvider){$routeProvider.when("/cms/app/special-coverage/edit/:id/",{controller:function($routeParams,$scope,$window,CmsConfig){$window.document.title=CmsConfig.getCmsName()+" | Edit Special Coverage",$scope.routeId=$routeParams.id},template:''})}),angular.module("specialCoverage.list",["apiServices.specialCoverage.factory","bulbs.cms.site.config","listPage","moment","specialCoverage.settings"]).config(function($injector,$routeProvider,CmsConfigProvider){var CmsConfig=$injector.invoke(CmsConfigProvider.$get);$routeProvider.when("/cms/app/special-coverage/",{controller:function($scope,$window,CmsConfig,SPECIAL_COVERAGE_LIST_REL_PATH,SpecialCoverage){$window.document.title=CmsConfig.getCmsName()+" | Special Coverage",$scope.modelFactory=SpecialCoverage,$scope.LIST_URL=CmsConfig.buildExternalUrl(SPECIAL_COVERAGE_LIST_REL_PATH)},templateUrl:CmsConfig.buildComponentPath("special-coverage/special-coverage-list/special-coverage-list-page.html")})}),angular.module("specialCoverage.settings",[]).value("SPECIAL_COVERAGE_LIST_REL_PATH","/special/"),angular.module("specialCoverage",["specialCoverage.list","specialCoverage.edit"]),angular.module("bulbs.cms.staticImage",["bulbs.cms.site.config"]).directive("staticImage",["CmsConfig",function(CmsConfig){return{templateUrl:CmsConfig.buildComponentPath("static-image","static-image.html"),restrict:"E",scope:{image:"=",ratio:"@"},link:function(scope,element,attrs){scope.$watch("image",function(){scope.image&&scope.image.id?scope.imageUrl=CmsConfig.buildImageApiUrl(scope.image.id,scope.ratio||"16x9","1200.jpg"):scope.imageUrl=!1})}}}]),angular.module("statusFilter.config",["bulbs.cms.site.config","contentServices.listService","moment"]).provider("StatusFilterOptions",function(moment){var _statuses=[{label:"Draft",key:"status",value:"Draft"},{label:"Awaiting Review",key:"status",value:"Waiting for Editor"},{label:"Published",key:"before",value:function(){return moment().format("YYYY-MM-DDTHH:mmZ")}},{label:"Scheduled",key:"after",value:function(){return moment().format("YYYY-MM-DDTHH:mmZ")}},{label:"All",key:null,value:null}];this.setStatuses=function(statuses){_statuses=statuses},this.$get=function(){return{getStatuses:function(){return _statuses}}}}),angular.module("statusFilter.directive",["bulbs.cms.site.config","contentServices.listService","statusFilter.config"]).directive("statusFilter",function($location,_,StatusFilterOptions,ContentListService,CmsConfig){return{templateUrl:CmsConfig.buildComponentPath("status-filter/status-filter.html"),restrict:"E",scope:{},controller:"ContentlistCtrl",link:function(scope,element,attrs){function getValue(option){var value;return value="function"==typeof option.value?option.value():option.value}scope.options=StatusFilterOptions.getStatuses(),scope.isActive=function(option){if(option.key&&option.key in $location.search()&&$location.search()[option.key]===getValue(option))return!0;if(!option.key){var possibleKeys=_.pluck(scope.options,"key"),searchKeys=_.keys($location.search());return!(_.intersection(possibleKeys,searchKeys).length>0)}return!1},scope.filterByStatus=function(option){var value,search={};return option.key&&(value=getValue(option),search[option.key]=value),ContentListService.$updateContent(search,!1)}}}}),angular.module("statusFilter",["statusFilter.directive"]),angular.module("bulbs.cms.superFeatures.api",["bulbs.cms.dateTimeFilter","bulbs.cms.site.config","bulbs.cms.utils","lodash","moment"]).service("SuperFeaturesApi",["_","$http","$sce","CmsConfig","dateTimeFormatFilter","moment","Utils",function(_,$http,$sce,CmsConfig,dateTimeFormatFilter,moment,Utils){var superFeatureEndpoint=CmsConfig.buildApiUrlRoot.bind(null,"super-feature"),contentEndpoint=CmsConfig.buildApiUrlRoot.bind(null,"content"),parsePayload=function(payload){var data=_.cloneDeep(payload);return payload.published&&(data.published=moment.tz(payload.published,CmsConfig.getTimezoneName())),data},cleanData=function(data){var payload=_.chain(data).omit("published").cloneDeep().value();return data.published&&(payload.published=data.published.format()),payload};return{createSuperFeature:function(data){var payload=cleanData(data);return $http.post(contentEndpoint(Utils.param({doctype:CmsConfig.getSuperFeaturesType()})),payload).then(function(response){return parsePayload(response.data)})},deleteSuperFeature:function(data){return $http.delete(contentEndpoint(data.id,"/"))},fields:[{title:"Super Feature Name",sorts:"title",content:function(superFeature){return $sce.trustAsHtml(superFeature.title)}},{title:"Total Nested Pages",content:"children_count"},{title:"Publish Date",content:function(superFeature){var now=moment(),cellContent="";return superFeature.published?now.isSameOrAfter(superFeature.published)?cellContent=dateTimeFormatFilter(superFeature.published):now.isBefore(superFeature.published)&&(cellContent=dateTimeFormatFilter(superFeature.published,"[Scheduled for] M/D/YY h:mma z")):cellContent="Draft",cellContent}}],getSuperFeature:function(id){return $http.get(superFeatureEndpoint(id,"/")).then(function(response){return parsePayload(response.data)})},getSuperFeatures:function(params){return $http.get(superFeatureEndpoint(Utils.param(params))).then(function(response){return{results:response.data.results.map(function(result){return parsePayload(result)})}})},getSuperFeatureRelations:function(id){return $http.get(superFeatureEndpoint(id,"relations/")).then(function(response){return{results:response.data.map(function(result){return parsePayload(result)})}})},name:"Super Feature",namePlural:"Super Features",updateSuperFeature:function(data){var payload=cleanData(data);return $http.put(contentEndpoint(data.id,"/"),payload).then(function(response){return parsePayload(response.data)})},updateSuperFeatureRelationsOrdering:function(id,relations){var remappedRelations=relations.map(function(relation){return _.pick(relation,"id","ordering")});return $http.put(superFeatureEndpoint(id,"relations","ordering/"),remappedRelations)},updateAllRelationPublishDates:function(id){return $http.put(superFeatureEndpoint(id,"set-children-dates/"))}}}]),angular.module("bulbs.cms.superFeatures.edit",["bulbs.cms.breadcrumb","bulbs.cms.dynamicContent","bulbs.cms.site.config","bulbs.cms.superFeatures.api","bulbs.cms.superFeatures.relations"]).directive("superFeaturesEdit",["CmsConfig","SuperFeaturesApi",function(CmsConfig,SuperFeaturesApi){return{link:function(scope,element,attrs){scope.breadcrumbs=[{label:"Super Features",href:"/cms/app/super-features"},{label:function(){return scope.article.title}}];var addParentToBreadcrumb=function(article){angular.isNumber(article.parent)&&SuperFeaturesApi.getSuperFeature(article.parent).then(function(superFeature){scope.breadcrumbs.splice(1,0,{label:superFeature.title,href:"/cms/app/edit/"+superFeature.id+"/"+CmsConfig.getSuperFeaturesType()}),addParentToBreadcrumb(superFeature)})};addParentToBreadcrumb(scope.article)},scope:!1,restrict:"E",templateUrl:CmsConfig.buildComponentPath("super-features","super-features-edit","super-features-edit.html")}}]),angular.module("bulbs.cms.superFeatures.list",["bulbs.cms.site.config","bulbs.cms.superFeatures.api","bulbsCmsApp.nonRestmodListPage","lodash","moment","ngRoute","statusFilter.config"]).config(["_","$injector","$routeProvider","CmsConfigProvider","StatusFilterOptionsProvider",function(_,$injector,$routeProvider,CmsConfigProvider,StatusFilterOptionsProvider){var CmsConfig=$injector.invoke(CmsConfigProvider.$get),StatusFilterOptions=$injector.invoke(StatusFilterOptionsProvider.$get);$routeProvider.when("/cms/app/super-features/",{controller:["$scope","$window","SuperFeaturesApi",function($scope,$window,SuperFeaturesApi){$window.document.title=CmsConfig.getCmsName()+" | Super Feature",$scope.modelFactory=SuperFeaturesApi,$scope.editPageUrlBuilder=function(item){return"/cms/app/edit/"+item.id+"/"+(item.polymorphic_ctype||CmsConfig.getSuperFeaturesType())},$scope.statusFilterOptions=StatusFilterOptions.getStatuses().filter(function(option){return"All"!==option.label}).map(function(option){var params={};return option.key&&(params[option.key]=_.isFunction(option.value)?option.value():option.value),{title:option.label,params:params}})}],templateUrl:CmsConfig.buildComponentPath("super-features","super-features-list","super-features-list.html")})}]),angular.module("bulbs.cms.superFeatures.relations",["bettyEditable","bulbs.cms.dateTimeFilter","bulbs.cms.site.config","bulbs.cms.superFeatures.api","bulbs.cms.sendToEditorModal","bulbs.cms.titleModal","bulbs.cms.utils","confirmationModal","lodash","moment","Raven","statusFilter.config"]).directive("superFeaturesRelations",["_","$q","CmsConfig","moment","Raven","SuperFeaturesApi","StatusFilterOptions","Utils",function(_,$q,CmsConfig,moment,Raven,SuperFeaturesApi,StatusFilterOptions,Utils){return{link:function(scope,element,attrs){var reportError=function(message,data){Raven.captureMessage(message,data),scope.errorMessage=message};scope.clearError=function(){scope.errorMessage=""},scope.$watch("relations",function(newRelations,oldRelations){ +angular.equals(newRelations,oldRelations)||scope.clearError()},!0);var normalizeOrderings=function(relations){relations.forEach(function(relation,i){relation.ordering=i+1})};SuperFeaturesApi.getSuperFeatureRelations(scope.article.id).then(function(response){scope.relations=response.results,normalizeOrderings(scope.relations)}).catch(function(response){var message="An error occurred retrieving relations!";reportError(message,{response:response})}),scope.statuses=StatusFilterOptions.getStatuses().filter(function(status){return!!status.value});var relationFormPrefix="relationForm_",orderingFormPrefix="orderingInputForm_";scope.wrapperForm={},scope.makeRelationFormName=function(relation){return relationFormPrefix+relation.id},scope.makeOrderingFormName=function(relation){return orderingFormPrefix+relation.id},scope.getRelationForm=function(relation){return scope.wrapperForm[scope.makeRelationFormName(relation)]},scope.getOrderingForm=function(relation){return scope.wrapperForm[scope.makeOrderingFormName(relation)]},scope.isAtLeastOneRelationFormDirty=function(){return Object.keys(scope.wrapperForm).reduce(function(isDirty,key){return key.startsWith(relationFormPrefix)?isDirty||scope.wrapperForm[key].$dirty:isDirty},!1)};var lock=Utils.buildLock();scope.transactionsLocked=lock.isLocked;var reorder=function(operation){return function(){var funcArgs=arguments,payload=scope.relations.map(function(relation){return _.pick(relation,"id","ordering")});return operation.bind(null,payload).apply(null,funcArgs),normalizeOrderings(payload),SuperFeaturesApi.updateSuperFeatureRelationsOrdering(scope.article.id,payload).then(function(){operation.bind(null,scope.relations).apply(null,funcArgs),normalizeOrderings(scope.relations)}).catch(function(response){var message="An error occurred attempting to reorder a child!";reportError(message,{response:response})})}};scope.moveRelation=lock(reorder(Utils.moveTo)),scope.addRelation=lock(function(title){return SuperFeaturesApi.createSuperFeature({parent:scope.article.id,superfeature_type:scope.article.default_child_type,title:title,ordering:(_.max(scope.relations,"ordering").ordering||0)+1}).then(function(relation){scope.relations.push(relation)}).catch(function(response){var message="An error occurred attempting to add a child page!";reportError(message,{response:response})})}),scope.updateRelationsPublishDates=lock(function(){return SuperFeaturesApi.updateAllRelationPublishDates(scope.article.id).then(function(response){scope.relations.forEach(function(relation){relation.published=moment.tz(scope.article.published,CmsConfig.getTimezoneName())})}).catch(function(response){var message="An error occurred attempting to update child publish dates!";reportError(message,{response:response})})}),scope.saveRelation=lock(function(relation){var relationCopy=angular.copy(relation);return relationCopy.parent=scope.article.id,SuperFeaturesApi.updateSuperFeature(relationCopy).catch(function(response){var titleDisplay=relation.title?'"'+relation.title+'"':"a relation",message="An error occurred attempting to update "+titleDisplay+"!";reportError(message,{response:response})}).finally(function(){scope.getRelationForm(relation).$setPristine()})}),scope.deleteRelation=lock(function(relation){return SuperFeaturesApi.deleteSuperFeature(relation).then(function(){var index=scope.relations.indexOf(relation);reorder(Utils.removeFrom)(index)}).catch(function(response){var titleDisplay=relation.title?'"'+relation.title+'"':"a relation",message="An error occurred attempting to delete "+titleDisplay+"!";reportError(message,{response:response})})})},restrict:"E",scope:{article:"="},templateUrl:CmsConfig.buildComponentPath("super-features","super-features-relations","super-features-relations.html")}}]),angular.module("bulbs.cms.superFeatures.tab.item",["bulbs.cms.site.config","bulbs.cms.superFeatures.api","filters.moment"]).directive("superFeaturesTabItem",function(CmsConfig,SuperFeaturesApi){return{link:function(scope){var requestSuperFeature=function(){angular.isNumber(scope.model)&&SuperFeaturesApi.getSuperFeature(scope.model).then(function(superFeature){scope.superFeature=superFeature})};scope.$watch("model",requestSuperFeature)},restrict:"E",scope:{model:"="},templateUrl:CmsConfig.buildComponentPath("super-features","super-features-tab","super-features-tab-item","super-features-tab-item.html")}}),angular.module("bulbs.cms.superFeatures.tab",["autocompleteBasic","bulbs.cms.site.config","bulbs.cms.utils","jquery","ui.sortable","bulbs.cms.superFeatures.tab.item","bulbs.cms.superFeatures.api"]).directive("superFeaturesTab",function($,SuperFeaturesApi,CmsConfig){return{controller:function(_,$scope,Utils,Video){$scope.moveUp=function(index){Utils.moveTo($scope.superFeatures,index,index-1),$scope.onUpdate()},$scope.moveDown=function(index){Utils.moveTo($scope.superFeatures,index,index+1),$scope.onUpdate()},$scope.delete=function(index){Utils.removeFrom($scope.superFeatures,index),$scope.onUpdate()},$scope.addSuperFeature=function(superFeature){$scope.addSuperFeatureCallback({superFeature:superFeature}),$scope.onUpdate()},$scope.searchSuperFeature=function(query){return SuperFeaturesApi.getSuperFeatures({search:query}).then(function(response){return response.results})}},link:function(scope,element,attr){scope.sortableOptions={beforeStop:function(e,ui){ui.helper.css("margin-top",0)},change:function(e,ui){ui.helper.css("margin-top",$(window).scrollTop())},containment:"super-feature-list",distance:3,opacity:.75,placeholder:"dropzone",start:function(e,ui){ui.helper.css("margin-top",$(window).scrollTop())}}},restrict:"E",scope:{addSuperFeatureCallback:"&addSuperFeature",superFeatures:"=",onUpdate:"&"},templateUrl:CmsConfig.buildComponentPath("super-features","super-features-tab","super-features-tab.html")}}),angular.module("bulbs.cms.superFeatures",["bulbs.cms.superFeatures.list","bulbs.cms.superFeatures.edit"]),angular.module("templateTypeField.directive",["bulbs.cms.site.config"]).directive("templateTypeField",function(CmsConfig){return{controller:function(_,$scope,ContentFactory,TEMPLATE_TYPES){$scope.templateTypes=_.filter(TEMPLATE_TYPES,{content_type:$scope.content.polymorphic_ctype})},restrict:"E",scope:{content:"="},templateUrl:CmsConfig.buildComponentPath("template-type-field/template-type-field.html")}}),angular.module("templateTypeField",["templateTypeField.directive"]).value("TEMPLATE_TYPES",[{name:"Small Width",slug:"small-width",content_type:"content_content"},{name:"Large Width",slug:"large-width",content_type:"content_content"}]),angular.module("bulbs.cms.titleModal",["bulbs.cms.site.config","ui.bootstrap","ui.bootstrap.modal"]).directive("titleModalOpener",["$modal","CmsConfig",function($modal,CmsConfig){return{restrict:"A",scope:{modalBodyBefore:"@",modalBodyAfter:"@",modalCancelText:"@",modalOkText:"@",modalOnCancel:"&",modalOnOk:"&",modalTitle:"@"},link:function(scope,element){element.addClass("title-modal-opener"),element.on("click",function(){scope.modalInstance||(scope.modalInstance=$modal.open({scope:scope,templateUrl:CmsConfig.buildComponentPath("title-modal","title-modal.html")}),scope.modalInstance.result.then(scope.modalOnOk).catch(scope.modalOnCancel).finally(function(){scope.modalInstance=!1}))})}}}]),angular.module("topBar.directive",["bulbs.cms.site.config"]).directive("topBar",function(CmsConfig){return{restrict:"E",scope:{logoHref:"@",itemsDropdownTitle:"@",itemsDropdown:"=",itemsTop:"=",saveFunction:"=",saveDisableWhen:"&"},templateUrl:CmsConfig.buildComponentPath("top-bar/top-bar-base.html"),link:function(scope){scope.NAV_LOGO=CmsConfig.getNavLogoPath()}}}),angular.module("topBar.item.factory",[]).factory("TopBarItem",function(){var TopBarItem=function(params){this.displayText=params.displayText||"",this.displayIconClasses=params.displayIconClasses||"",this.containerClasses=params.containerClasses||"",this.clickFunction=params.clickFunction||function(){}};return TopBarItem}),angular.module("topBar",["topBar.directive","topBar.item.factory"]),angular.module("apiServices.mixins.fieldDisplay",["restmod"]).factory("FieldDisplay",function($parse,restmod){var parserWrap=function(value){return function(value){var parsed=$parse(value);return function(record){return parsed({record:record})}}(value)},getOrdering=function(sorts){return function(sorts){return function(direction){var ordering="";return ordering="desc"===direction?"-"+sorts:sorts}}(sorts)};return restmod.mixin(function(){this.define("Scope.$fieldDisplays",function(){var fieldDisplays=this.getProperty("fieldDisplays");if(fieldDisplays){var i;for(i=0;i0)for(var key in featureTypes){var obj=featureTypes[key];obj.hasOwnProperty("featureType")&&(obj.featureType.hasOwnProperty("name")?_req.data.feature_types[key].feature_type=obj.featureType.name:obj.featureType.hasOwnProperty("value")&&(_req.data.feature_types[key].feature_type.slug=obj.featureType.value))}},"before-render":function(record){if(record.hasOwnProperty("feature_types"))for(var key in record.feature_types)record.feature_types[key].hasOwnProperty("feature_type")&&record.feature_types[key].feature_type.hasOwnProperty("name")&&(record.feature_types[key].feature_type=record.feature_types[key].feature_type.name)}}})}),angular.module("apiServices.reporting.factory",["apiServices","apiServices.mixins.fieldDisplay"]).factory("Role",function(_,restmod){var roleEndpoint="contributions/role";return restmod.model(roleEndpoint).mix("FieldDisplay","NestedDirtyModel",{flat_rates:{hasMany:restmod.model(null,{}).mix("NestedDirtyModel"),path:"flat_rates",params:{},hooks:{"after-fetch-many":function(){this.length>0?this.$owner.flat_rate=this[0]:this.$owner.flat_rate=this.$owner.flat_rates.$create({rate:0})}}},hourly_rates:{hasMany:restmod.model(null,{rate:0}).mix("NestedDirtyModel"),path:"hourly_rates",params:{},hooks:{"after-fetch-many":function(){this.length>0?this.$owner.hourly_rate=this[0]:this.$owner.hourly_rate=this.$owner.hourly_rates.$create({rate:0})}}},feature_type_rates:{hasMany:restmod.model(null,{}).mix("NestedDirtyModel"),path:"feature_type_rates",params:{},hooks:{"after-fetch-many":function(){var next=this.$metadata.next;_.isUndefined(next)||null===next||(this.$owner.feature_type_rates.$page++,this.$owner.feature_type_rates.$fetch())}}},$config:{name:"Role",plural:"Roles",primaryKey:"id",fieldDisplays:[{title:"Role",value:"record.name"},{title:"Payment Type",value:"record.paymentType"}]}})}),angular.module("apiServices.section.factory",["apiServices","apiServices.customSearch.count.factory","apiServices.mixins.fieldDisplay"]).factory("Section",function(_,CustomSearchCount,restmod){var sectionEndpoint="section";return restmod.model(sectionEndpoint).mix("FieldDisplay","NestedDirtyModel",{$config:{name:"Section",plural:"Sections",primaryKey:"id",fieldDisplays:[{title:"Section Name",value:"record.name",sorts:"name"},{title:"Article Count",value:"record.$resultCount"}]},query:{init:{}},promoted:{init:!0},$hooks:{"after-fetch":function(){this.$refreshResultCount()},"after-fetch-many":function(){_.each(this,function(record){record.$refreshResultCount()})}},$extend:{Record:{$refreshResultCount:function(){var record=this;return CustomSearchCount.$retrieveResultCount(this.query).then(function(count){record.$resultCount=count})}}}})}),angular.module("apiServices.specialCoverage.factory",["apiServices","apiServices.campaign.factory","apiServices.mixins.fieldDisplay","cms.tunic.config","filters.moment","VideohubClient.api"]).factory("SpecialCoverage",function(_,$http,$parse,$q,restmod,TunicConfig,Video){var ACTIVE_STATES={INACTIVE:"Inactive",PROMOTED:"Pin to HP"};return restmod.model("special-coverage").mix("FieldDisplay","NestedDirtyModel",{$config:{name:"Special Coverage",plural:"Special Coverages",primaryKey:"id",fieldDisplays:[{title:"List Title",value:"record.name",sorts:"name"},{title:"Sponsor",value:'record.campaign.sponsorName || "--"',sorts:"campaign__sponsor_name"},{title:"Campaign",value:'record.campaign.campaignLabel || "--"',sorts:"campaign__campaign_label"},{title:"Start Date",value:'record.startDate.format("MM/DD/YY") || "--"',sorts:"start_date"},{title:"End Date",value:'record.endDate.format("MM/DD/YY") || "--"',sorts:"end_date"}]},end_date:{encode:"moment_to_date_string"},start_date:{encode:"moment_to_date_string"},endDate:{decode:"date_string_to_moment"},startDate:{decode:"date_string_to_moment"},campaign:{belongsTo:"Campaign",prefetch:!0,key:"campaign"},listUrl:{mask:"CU"},query:{init:{}},videos:{belongsToMany:"Video",keys:"videos"},super_features:{init:[],keys:"super_features"},active:{init:!0},promoted:{init:!1},$hooks:{"after-fetch":function(){this.$loadVideosData()},"after-save":function(){this.$loadVideosData()}},$extend:{Record:{$loadVideosData:function(){_.each(this.videos,function(video){video.$fetch()})},$loadTunicCampaign:function(){return _.isNumber(this.tunicCampaignId)?$http.get(TunicConfig.buildBackendApiUrl("campaign/"+this.tunicCampaignId+"/")).then(function(result){return result.data}):$q.reject()},$searchCampaigns:function(params){return $http.get(TunicConfig.buildBackendApiUrl("campaign/"),{params:params}).then(function(response){return response.data.results})},addVideo:function(video){var added=!1,existingVideo=_.find(this.videos,function(existingVideo){return video.id===existingVideo.id});return existingVideo||(this.videos.push(video),added=!0),added},addSuperFeature:function(superFeature){var existingSuperFeature=this.superFeatures.find(function(existingSuperFeatureId){return superFeature.id===existingSuperFeatureId});existingSuperFeature||this.superFeatures.push(superFeature.id)},$activeState:function(activeState){return _.isString(activeState)?activeState===ACTIVE_STATES.ACTIVE?(this.active=!0,this.promoted=!1):activeState===ACTIVE_STATES.PROMOTED?(this.active=!0,this.promoted=!0):(this.active=!1,this.promoted=!1):(activeState=ACTIVE_STATES.INACTIVE,this.active&&this.promoted?activeState=ACTIVE_STATES.PROMOTED:this.active&&(activeState=ACTIVE_STATES.ACTIVE)),activeState}},Model:{ACTIVE_STATES:_.clone(ACTIVE_STATES)}}})}),angular.module("bulbs.cms.base.config",["bulbs.cms.config","bulbs.cms.customSearch.config","ngClipboard"]).config(["CmsConfigProvider","CustomSearchConfigProvider","ngClipProvider",function(CmsConfigProvider,CustomSearchConfigProvider,ngClipProvider){CmsConfigProvider.setContentPartialsPath("/content_type_views").setComponentPath("/components").setDateTimeFormatHumanReadable("M/D/YY h:mma z").setDirectivePartialsPath("/views").setSharedPath("/shared").setTopBarMapping("nav","/views/nav.html").setTopBarMapping("reportbar","/views/reportbar.html").setTopBarMapping("toolbar","/views/toolbar.html").setUnpublishedPath("unpublished"),CustomSearchConfigProvider.addConditionField("Content Type","content-type","name","doctype").addConditionField("Feature Type","feature-type","name","slug").addConditionField("Tag","tag","name","slug").addConditionType("is any of","any").addConditionType("is all of","all").addConditionType("is none of","none").addTimePeriod("Past Day","Past day").addTimePeriod("Past Week","Past week").addTimePeriod("Past Month","Past month"),ngClipProvider.setPath("/bower_components/zeroclipboard/dist/ZeroClipboard.swf")}]),angular.module("bulbs.cms.config",["bulbs.cms.utils","lodash"]).provider("CmsConfig",["_","UtilsProvider",function(_,Utils){var CmsConfigError=BulbsCmsConfigError.build("CmsConfig"),checkOrError=function(value,test,errorMsg){if(test(value))return value;throw new CmsConfigError(errorMsg)},pathBuilder=function(start){return function(){return Utils.path.join(arguments)}.bind(null,start)},apiUrlRoot="",articleEditoralStatuses=[],autoAddAuthor=!1,componentPath="",contentPartialsPath="",dateTimeFormatHumanReadable="",directivePartialsPath="",cmsName="",contentApiUrl="",externalUrl="",firebaseMaxArticleHistory=25,firebaseSiteRoot="",firebaseUrl="",imageApiUrl="",imageApiKey="",inlineObjectsPath="",internalUrl="",liveBlogAuthorSelectorDirectiveName="",navLogoPath="",sharedPath="",superFeaturesType="",timezoneName="America/Chicago",topBarMappings={},unpublishedPath="",videoPath="",videoThumbnailUrl="";return this.addArticleEditoralStatus=function(label,value){return checkOrError(label,_.isString,"article editoral status label must be a string!"),checkOrError(value,_.isString,"article editoral status value must be a string!"),articleEditoralStatuses.push({label:label,value:value}),this},this.setApiUrlRoot=function(value){return apiUrlRoot=checkOrError(value,_.isString,"api url root must be a string!"),this},this.setAutoAddAuthor=function(value){return autoAddAuthor=checkOrError(value,_.isBoolean,"auto add author must be a boolean!"),this},this.setComponentPath=function(value){return componentPath=checkOrError(value,_.isString,"component path must be a string!"),this},this.setContentPartialsPath=function(value){return contentPartialsPath=checkOrError(value,_.isString,"content partials path must be a string!"),this},this.setDateTimeFormatHumanReadable=function(value){return dateTimeFormatHumanReadable=checkOrError(value,_.isString,"date time format human readable must be a string!"),this},this.setDirectivePartialsPath=function(value){return directivePartialsPath=checkOrError(value,_.isString,"directive partials path must be a string!"),this},this.setCmsName=function(value){return cmsName=checkOrError(value,_.isString,"cms name must be a string!"),this},this.setContentApiUrl=function(value){return contentApiUrl=checkOrError(value,_.isString,"content api url must be a string!"),this},this.setExternalUrl=function(value){return externalUrl=checkOrError(value,_.isString,"external url must be a string!"),this},this.setFirebaseMaxArticleHistory=function(value){return firebaseMaxArticleHistory=checkOrError(value,_.isNumber,"firebase max article history must be a number!"),this},this.setFirebaseSiteRoot=function(value){return firebaseSiteRoot=checkOrError(value,_.isString,"firebase site url must be a string!"),this},this.setFirebaseUrl=function(value){return firebaseUrl=checkOrError(value,_.isString,"firebase url must be a string!"),this},this.setImageApiUrl=function(value){return imageApiUrl=checkOrError(value,_.isString,"image api url must be a string!"),window.BC_ADMIN_URL=imageApiUrl,this},this.setImageApiKey=function(value){return imageApiKey=checkOrError(value,_.isString,"image api key must be a string!"),window.BC_API_KEY=imageApiKey,this},this.setInlineObjectsPath=function(value){return inlineObjectsPath=checkOrError(value,_.isString,"inline objects path must be a string!"),this},this.setInternalUrl=function(value){return internalUrl=checkOrError(value,_.isString,"internal url must be a string!"),this},this.setLiveBlogAuthorSelectorDirectiveName=function(value){return liveBlogAuthorSelectorDirectiveName=checkOrError(value,_.isString,"live blog author selector directive name must be a string!"),this},this.setNavLogoPath=function(value){return navLogoPath=checkOrError(value,_.isString,"nav logo path must be a string!"),this},this.setSharedPath=function(value){return sharedPath=checkOrError(value,_.isString,"shared path must be a string!"),this},this.setSuperFeaturesType=function(value){return superFeaturesType=checkOrError(value,_.isString,"super features type must be a string!"),this},this.setTimezoneName=function(name){return timezoneName=checkOrError(name,moment.tz.zone,'given timezone name "'+name+'" is not a valid timezone!'),this},this.setTopBarMapping=function(name,template){var key=checkOrError(name,_.isString,"top bar mapping name must be a string!"),value=checkOrError(template,_.isString,"top bar mapping template must be a string!");return topBarMappings[key]=value,this},this.setUnpublishedPath=function(value){return unpublishedPath=checkOrError(value,_.isString,"unpublished path must be a string!"),this},this.setVideoPath=function(value){return videoPath=checkOrError(value,_.isString,"video path must be a string!"),this},this.setVideoThumbnailUrl=function(value){return videoThumbnailUrl=checkOrError(value,_.isString,"video thumbnail url must be a string!"),this},this.$get=[function(){return{buildApiUrlRoot:pathBuilder(apiUrlRoot),buildComponentPath:pathBuilder(componentPath),buildContentApiUrl:pathBuilder(contentApiUrl),buildContentPartialsPath:pathBuilder(contentPartialsPath),buildDirectivePartialsPath:pathBuilder(directivePartialsPath),buildExternalUrl:pathBuilder(externalUrl),buildFirebaseSiteUrl:pathBuilder(Utils.path.join(firebaseUrl,firebaseSiteRoot)),buildFirebaseUrl:pathBuilder(firebaseUrl),buildImageApiUrl:pathBuilder(imageApiUrl),buildInternalUrl:pathBuilder(internalUrl),buildSharedPath:pathBuilder(sharedPath),buildUnpublishedUrl:pathBuilder(Utils.path.join(internalUrl,unpublishedPath)),buildVideoUrl:pathBuilder(Utils.path.join(externalUrl,videoPath)),buildVideoThumbnailUrl:pathBuilder(videoThumbnailUrl),getAutoAddAuthor:_.constant(autoAddAuthor),getCmsName:_.constant(cmsName),getDateTimeFormatHumanReadable:_.constant(dateTimeFormatHumanReadable),getFirebaseMaxArticleHistory:_.constant(firebaseMaxArticleHistory),getImageApiKey:_.constant(imageApiKey),getInlineObjecsPath:_.constant(inlineObjectsPath),getLiveBlogAuthorSelectorDirectiveName:_.constant(liveBlogAuthorSelectorDirectiveName),getNavLogoPath:_.constant(navLogoPath),getSuperFeaturesType:_.constant(superFeaturesType),getTimezoneName:_.constant(timezoneName),getArticleEditoralStatuses:_.constant(_.cloneDeep(articleEditoralStatuses)),getTopBarMapping:function(name){if(_.has(topBarMappings,name))return topBarMappings[name];throw new CmsConfigError('no top bar mapping exists for name "'+name+'"!')}}}],this}]),window.BulbsCmsError=function(name,message){"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.name=name||"CMS Error",this.message=message||"Something was misconfigured."},BulbsCmsError.prototype=Object.create(Error.prototype),BulbsCmsError.prototype.constructor=window.BulbsCmsError,BulbsCmsError.build=function(name){return function(message){return new BulbsCmsError(name,message)}},window.BulbsCmsConfigError=function(name,message){window.BulbsCmsError.call(this,name,message)},BulbsCmsConfigError.prototype=Object.create(window.BulbsCmsError.prototype),BulbsCmsConfigError.prototype.constructor=window.BulbsCmsConfigError,BulbsCmsConfigError.build=function(name){return function(message){return new BulbsCmsConfigError("Configuration Error ("+(name||"name not given!")+")",message)}},angular.module("contentServices.factory",[]).factory("ContentFactory",function(Restangular,contentApiConfig){ +return Restangular.withConfig(function(RestangularConfigurer){RestangularConfigurer.setBaseUrl(contentApiConfig.baseUrl)})}).constant("contentApiConfig",{baseUrl:"/cms/api/v1"}),angular.module("contentServices.listService",["contentServices.factory"]).service("ContentListService",function(_,$location,$q,ContentFactory){var ContentListService=this;this._serviceData={filters:$location.search()||{},content:[],totalItems:0};var _data=this._serviceData;ContentListService.updateFilters=function(addFilters,merge){return merge?_data.filters=_.assign($location.search()||{},addFilters):_data.filters=addFilters,$location.search(_data.filters),_data.filters},ContentListService.$updateContent=function(addFilters,merge){var updateParams=ContentListService.updateFilters(addFilters||_data.filters,merge);return ContentFactory.all("content").getList(updateParams).then(function(data){return _data.content=data,_data.totalItems=data.metadata.count,_data})},ContentListService.getData=function(){return _data}}),angular.module("contentServices",["contentServices.factory","contentServices.listService"]),angular.module("copyButton",["bulbs.cms.site.config"]).directive("copyButton",function(CmsConfig){return{controller:function($scope,$timeout){$scope.okCopy=!1,$scope.okCopyButton=function(){$scope.okCopy=!0,$timeout(function(){$scope.okCopy=!1},1e3)}},restrict:"E",scope:{buttonClassesDefault:"@",buttonClassesSuccess:"@",buttonText:"@",content:"@"},templateUrl:CmsConfig.buildSharedPath("copy-button/copy-button.html")}}),angular.module("filters.moment",["moment"]).filter("date_string_to_moment",function(moment){return function(dateStr){if(dateStr&&dateStr.length){var m=moment(new Date(dateStr));if(m.isValid())return m}return null}}).filter("moment_to_date_string",function(moment){return function(momentObj){return moment.isMoment(momentObj)&&momentObj.isValid()?momentObj.format():""}}),angular.module("listPage",["bulbs.cms.site.config","bulbs.cms.utils","confirmationModal","copyButton","lodash"]).directive("listPage",function(CmsConfig){return{controller:function(_,$scope,$location,$parse,Utils){$scope.pathJoin=Utils.path.join,$scope.name=$scope.modelFactory.identity(),$scope.namePlural=$scope.modelFactory.identity(!0),$scope.fields=$scope.modelFactory.$fieldDisplays(),$scope.$list=$scope.modelFactory.$collection(),$scope.orderingFilter={},$scope.searchFilter={},$scope.toggledFilters={},$scope.copyContentInContext=function(record){var value="";return $scope.toolCopyContent&&(value=$parse($scope.toolCopyContent)({record:record})),value},$scope.$retrieve=_.debounce(function(addParams){$scope.loadingResults=!0;var allParams=_.merge({},$scope.orderingFilter,$scope.toggledFilters,$scope.searchFilter,addParams);return $scope.$list.$refresh(allParams).$then(function(){$scope.loadingResults=!1})},250),$scope.$search=function(query){$scope.searchFilter={},query&&($scope.searchFilter[$scope.searchParameter]=query),$scope.$list.$page=1,$scope.$retrieve()},$scope.filterButtonsParsed=$scope.filterButtons(),$scope.$toggleFilters=function(params){$scope.toggledFilters=params,$scope.$list.$page=1,$scope.$retrieve()},$scope.sortingField=null,$scope.sortDirection="asc",$scope.$sort=function(field){var direction;direction=field.title===$scope.sortingField&&"desc"===$scope.sortDirection?"asc":"desc",function(field,direction){$scope.orderingFilter={ordering:field.getOrdering(direction)},$scope.$retrieve().$then(function(){$scope.sortingField=field.title,$scope.sortDirection=direction})}(field,direction)},$scope.$add=function(){$location.path($scope.cmsEditPageUrl({item:{id:"new"}}))},$scope.$remove=function(item){item.$destroy()},$scope.goToEditPage=function(item){$location.path($scope.cmsEditPageUrl({item:item}))},$scope.activeFilterButton=_.chain($scope.filterButtonsParsed).findWhere({active:!0}).tap(function(button){button&&($scope.toggledFilters=button.params)}).result("title").value()||"",$scope.$retrieve()},link:function(scope,element,attrs){scope.showAddButton=!("disableAddButton"in attrs)},restrict:"E",scope:{cmsEditPageUrl:"&",filterButtons:"&",modelFactory:"=",searchParameter:"@",toolCopyContent:"@",utilityButtons:"="},templateUrl:CmsConfig.buildSharedPath("list-page/list-page.html")}}),angular.module("bulbsCmsApp.nonRestmodListPage",["bulbs.cms.site.config","confirmationModal","copyButton","lodash","bulbs.cms.utils"]).directive("nonRestmodListPage",function(CmsConfig){return{controller:function(_,$scope,$location,$parse,Utils){$scope.pathJoin=Utils.path.join,$scope.orderingFilter={},$scope.searchFilter={},$scope.toggledFilters={},$scope.pageNumber=1,$scope.copyContentInContext=function(record){var value="";return $scope.toolCopyContent&&(value=$parse($scope.toolCopyContent)({record:record})),value},$scope.$retrieve=_.debounce(function(addParams){$scope.loadingResults=!0;var allParams=_.merge({},$scope.orderingFilter,$scope.toggledFilters,$scope.searchFilter,addParams);return $scope.getItems({params:allParams}).then(function(response){$scope.items=response.results,$scope.loadingResults=!1})},250),$scope.$search=function(query){$scope.searchFilter={},query&&($scope.searchFilter[$scope.searchParameter]=query),$scope.pageNumber=1,$scope.$retrieve()},$scope.filterButtonsParsed=$scope.filterButtons(),$scope.$toggleFilters=function(params){$scope.toggledFilters=params,$scope.pageNumber=1,$scope.$retrieve()},$scope.sortingField=null,$scope.sortDirection="asc",$scope.$sort=function(fieldName){var direction;direction=fieldName===$scope.sortingField&&"desc"===$scope.sortDirection?"":"-",$scope.orderingFilter={ordering:direction+fieldName},$scope.$retrieve($scope.orderingFilter.ordering).then(function(){$scope.sortingField=fieldName,$scope.sortDirection="-"===direction?"desc":"asc"})},$scope.cellContents=function(item,field){var cellContents="-";return _.isFunction(field.content)?cellContents=field.content(item):_.isString(field.content)?cellContents=item[field.content]:field.sorts&&(cellContents=item[field.sorts]),cellContents},$scope.$add=function(){$location.path($scope.cmsEditPageUrl({item:{id:"new"}}))},$scope.$remove=function(removedItem){$scope.destroyItem({item:removedItem}),_.remove($scope.items,function(item){return item===removedItem})},$scope.goToEditPage=function(item){$location.path($scope.cmsEditPageUrl({item:item}))},$scope.activeFilterButton=_.chain($scope.filterButtonsParsed).findWhere({active:!0}).tap(function(button){button&&($scope.toggledFilters=button.params)}).result("title").value()||"",$scope.$retrieve()},link:function(scope,element,attrs){scope.showAddButton=!("disableAddButton"in attrs)},restrict:"E",scope:{cmsEditPageUrl:"&",destroyItem:"&",getItems:"&",filterButtons:"&",modelFields:"&",modelName:"&",modelNamePlural:"&",searchParameter:"@",toolCopyContent:"@"},templateUrl:CmsConfig.buildSharedPath("non-restmod-list-page/non-restmod-list-page.html")}}),angular.module("cms.tunic.config",["lodash"]).provider("TunicConfig",["_",function(_){var apiPath="",backendRoot="",requestToken="",error=function(message){return new Error("Configuration Error (TunicConfig) "+message)};this.setApiPath=function(value){if(!_.isString(value))throw error("apiPath must be a string!");return apiPath=value,this},this.setBackendRoot=function(value){if(!_.isString(value))throw error("backendRoot must be a string!");return backendRoot=value,this},this.setRequestToken=function(value){if(!_.isString(value))throw error("requestToken must be a string!");return requestToken=value,this},this.$get=function(){return{getRequestToken:_.constant(requestToken),buildBackendApiUrl:function(relUrl){return backendRoot+apiPath+(relUrl||"")},shouldBeIntercepted:function(url){var urlTest=backendRoot+apiPath;return""!==urlTest&&url.startsWith(urlTest)}}}}]),angular.module("cms.tunic.interceptor",["cms.tunic.config"]).service("TunicInterceptor",["TunicConfig",function(TunicConfig){return this.request=function(config){return TunicConfig.shouldBeIntercepted(config.url)&&(config.headers=config.headers||{},config.headers.Authorization="Token "+TunicConfig.getRequestToken()),config},this}]),angular.module("cms.tunic",["cms.tunic.config","cms.tunic.interceptor"]),angular.module("bulbs.cms.utils",["lodash"]).provider("Utils",["_",function(_){var Utils=this;return Utils.slugify=function(text){return text.toString().toLowerCase().replace(/\s+/g,"-").replace(/[^\w\-]+/g,"").replace(/\-\-+/g,"-").replace(/^-+/,"").replace(/-+$/,"")},Utils.moveTo=function(list,indexFrom,indexTo,allowOutOfBounds){var ret=!1,modIndexTo=indexTo;if(allowOutOfBounds&&(indexTo<0?modIndexTo=0:indexTo>=list.length&&(modIndexTo=list.length-1)),indexFrom>=0&&indexFrom=0&&modIndexTo0&&(list[modIndexTo]=splicer[0],ret=!0)}return ret},Utils.removeFrom=function(list,index){return list.splice(index,1).length>0},Utils.param=function(params){params||(params={});var keys=Object.keys(params),query="";return keys.length>0&&(query+="?",query+=keys.map(function(key){return key+"="+params[key]}).join("&")),query},Utils.path={join:function(){var sep="/",replace=new RegExp(sep+"{1,}","g"),argsArr=_.flattenDeep(arguments),protocolPrefix="";if(argsArr.length>0&&"string"==typeof argsArr[0]){var matches=argsArr[0].match(/^(https?:)?\/\//);matches&&(protocolPrefix=matches[0],argsArr[0]=argsArr[0].replace(protocolPrefix,""))}return protocolPrefix+argsArr.join(sep).replace(replace,sep)}},Utils.$get=["$q",function($q){return Utils.buildLock=function(){var locked=!1,wrapper=function(func){return function(){return locked?$q.reject():(locked=!0,$q.when(func.apply(null,arguments)).finally(function(){locked=!1}))}};return wrapper.isLocked=function(){return locked},wrapper},Utils}],Utils}]),angular.module("videoList.video.directive",["bulbs.cms.site.config","filters.moment"]).directive("videoListVideo",function(CmsConfig){return{restrict:"E",scope:{model:"="},templateUrl:CmsConfig.buildSharedPath("video-list/video-list-video/video-list-video.html")}}),angular.module("videoList",["autocompleteBasic","bulbs.cms.site.config","bulbs.cms.utils","jquery","ui.sortable","VideohubClient.api","VideohubClient.settings","videoList.video.directive"]).directive("videoList",function($,CmsConfig){return{controller:function(_,$scope,Utils,Video,VIDEOHUB_DEFAULT_CHANNEL){$scope.videoChannel=VIDEOHUB_DEFAULT_CHANNEL,$scope.moveUp=function(index){Utils.moveTo($scope.videos,index,index-1),$scope.onUpdate()},$scope.moveDown=function(index){Utils.moveTo($scope.videos,index,index+1),$scope.onUpdate()},$scope.delete=function(index){Utils.removeFrom($scope.videos,index),$scope.onUpdate()},$scope.addVideo=function(video){$scope.addVideoCallback({video:video}),$scope.onUpdate()},$scope.searchVideos=function(query){return Video.$postSearch({query:query,channel:VIDEOHUB_DEFAULT_CHANNEL})}},link:function(scope,element,attr){scope.sortableOptions={beforeStop:function(e,ui){ui.helper.css("margin-top",0)},change:function(e,ui){ui.helper.css("margin-top",$(window).scrollTop())},containment:"video-list",distance:3,opacity:.75,placeholder:"dropzone",start:function(e,ui){ui.helper.css("margin-top",$(window).scrollTop())}}},restrict:"E",scope:{addVideoCallback:"&addVideo",videos:"=",onUpdate:"&"},templateUrl:CmsConfig.buildSharedPath("video-list/video-list.html")}}),angular.module("bulbsCmsApp").directive("activeNav",function($location){return{template:'
  • {{label}}
  • ',restrict:"E",scope:{},replace:!0,link:function(scope,element,attrs){scope.href=attrs.href,scope.label=attrs.label,0===$location.path().indexOf(scope.href)&&element.addClass("active")}}}),angular.module("bulbsCmsApp").directive("addImage",function($http,$window){return{restrict:"E",templateUrl:"/views/add-image.html",scope:{article:"="},link:function(scope,element,attrs){var attrName=attrs.attrName||"images";scope.article[attrName]=scope.article[attrName]||[],"false"===attrs.caption&&(scope.hideCaption=!0),scope.format=attrs.format||"jpg",scope.crop=attrs.crop||"16x9",scope.placeholderText=attrs.placeholderText||"Optional Image",scope.addAnImage=function(){$window.uploadImage({onSuccess:function(data){scope.$apply(function(){scope.article[attrName].push({id:data.id.toString(),alt:null,caption:null}),setTimeout($window.picturefill,200)})},onError:function(data){scope.$apply(function(){$window.alert("Error: ",data)})},onProgress:function(data){}})}}}}),angular.module("bulbsCmsApp").directive("articlecontainer",function(){return{restrict:"E",templateUrl:"/views/promotion-tool-article-container.html",scope:{article:"="},link:function(scope,element,attrs){scope.ratio=attrs.ratio}}}),angular.module("bulbsCmsApp").directive("authorsField",function($,CmsConfig,userNameDisplayFilter,Utils){return{templateUrl:"/views/taglike-autocomplete-field.html",restrict:"E",replace:!0,scope:{article:"=",inputLabelText:"@",inputLabelTextSub:"@"},link:function(scope,element,attrs){scope.name="author",scope.label=scope.inputLabelText||"Authors",scope.labelSub=scope.inputLabelTextSub,scope.placeholder="Authors",scope.resourceUrl=CmsConfig.buildApiUrlRoot("author",Utils.param({ordering:"name",search:""})),scope.display=userNameDisplayFilter,scope.$watch("article.authors",function(){scope.objects=scope.article.authors},!0),scope.add=function(o,input){for(var t in scope.article.authors)if(scope.article.authors[t].id===o.id)return;scope.article.authors.push(o),$(input).val("")},scope.delete=function(e){var author=$(e.target).parents("[data-taglikeobject]").data("taglikeobject"),id=author.id,newauthors=[];for(var i in scope.article.authors)scope.article.authors[i].id!==id&&newauthors.push(scope.article.authors[i]);scope.article.authors=newauthors}}}}),angular.module("bulbsCmsApp").directive("bulbsAutocomplete",function($http,$location,$compile,$timeout,$,Login,Raven){var autocomplete_dropdown_template='';return{restrict:"AC",link:function(scope,element,attrs){function getAutocompletes(val){$timeout.cancel(inputTimeout),inputCounter=0,$http({method:"GET",url:scope.resourceUrl+val}).success(function(data){var results=data.results||data;scope.autocomplete_list=results.splice(0,5)}).error(function(data,status,headers,config){Raven.captureMessage("Error in getAutocompletes",{extra:data})})}var $elem=$(element).find("input");$elem.attr("autocomplete","off");var dropdown=$($compile(autocomplete_dropdown_template)(scope));$(dropdown).css({position:"absolute",top:$elem.position().top+$elem.outerHeight(),left:$elem.position().left,minWidth:$elem.outerWidth(),display:"none"}),$elem.parent().append(dropdown),$(dropdown).fadeIn("fast"),scope.$watch(function(){return{top:$elem.position().top+$elem.outerHeight(),left:$elem.position().left,minWidth:$elem.outerWidth()}},function(newValue,oldValue){$(dropdown).css({top:newValue.top,left:newValue.left,minWidth:newValue.minWidth})},!0);var inputTimeout,inputCounter=0;$elem.on("focus",function(e){$elem.on("input",function(){var val=$elem.val();""===val?scope.autocomplete_list=[]:($timeout.cancel(inputTimeout),inputTimeout=$timeout(function(){getAutocompletes(val)},200),inputCounter>2&&getAutocompletes(val))}),$(dropdown).fadeIn("fast")}),$elem.on("blur",function(e){$(dropdown).fadeOut("fast")}),$(dropdown).on("mouseover",".entry",function(e){$(dropdown).find(".selected").removeClass("selected"),$(this).addClass("selected")}),$elem.on("keyup",function(e){if(40===e.keyCode)if(0===$("div.selected",dropdown).length)$("div.entry",dropdown).first().addClass("selected");else{var curDownSelect=$("div.selected",dropdown),curDownSelectNext=curDownSelect.next("div");0===curDownSelectNext.length?$("div.entry",dropdown).first().addClass("selected"):curDownSelectNext.addClass("selected"),curDownSelect.removeClass("selected")}if(38===e.keyCode)if(0===$("div.selected",dropdown).length)$("div.entry",dropdown).last().addClass("selected");else{var curSelect=$("div.selected",dropdown),curSelectNext=curSelect.prev("div");0===curSelectNext.length?$("div.entry",dropdown).last().addClass("selected"):curSelectNext.addClass("selected"),curSelect.removeClass("selected")}if(13===e.keyCode){var selected=$("div.selected",dropdown);0===selected.length&&scope.onClick($elem.val(),!0),selected.click()}}),scope.onClick=function(o,freeForm){scope.add(o,$elem,freeForm||!1),scope.autocomplete_list=[]}}}}),angular.module("bulbsCmsApp").directive("cmsNotification",function(){return{restrict:"E",templateUrl:"/views/cms-notification.html",scope:{cmsNotification:"="},controller:"CmsNotificationCtrl"}}),angular.module("bulbsCmsApp").directive("cmsNotifyContainer",function(){return{restrict:"E",scope:{},templateUrl:"/views/cms-notify-container.html",controller:"CmsNotifyContainerCtrl"}}),angular.module("bulbsCmsApp").directive("contributorField",function($){return{templateUrl:"/views/textlike-autocomplete-field.html",restrict:"E",replace:!0,scope:{override:"="},link:function(scope,element,attrs){scope.name="contributor",scope.label="Contributors",scope.placeholder="Contributors",scope.resourceUrl="/cms/api/v1/author/?ordering=name&search=",scope.$watch("override.contributor",function(){scope.override.hasOwnProperty("contributor")&&null!==scope.override.contributor&&(scope.model=scope.override.contributor.full_name||scope.override.contributor.fullName)}),scope.display=function(o){return o&&o.full_name||""},scope.add=function(o,input){scope.override.hasOwnProperty("contributor")&&null!==scope.override.contributor&&scope.override.contributor.id===o.id||(scope.override.contributor=o,$("#feature-type-container").removeClass("newtag"),$("#feature-type-container").addClass("newtag"))},scope.delete=function(e){scope.override.contributor=null,scope.model=null}}}}),angular.module("bulbsCmsApp").directive("createContent",function($http,$window,$,IfExistsElse,Login,ContentFactory,CmsConfig,Raven){return{restrict:"E",templateUrl:CmsConfig.buildDirectivePartialsPath("create-content.html"),controller:function($scope){function saveArticle(){$("button.go").removeClass("btn-danger").addClass("btn-success").html(' Going'),$http({url:"/cms/api/v1/content/?doctype="+$scope.contentType,method:"POST",data:$scope.init}).success(function(resp){var new_id=resp.id,new_path="/cms/app/edit/"+new_id+"/";$scope.rating_type&&(new_path+="?rating_type="+$scope.rating_type),$window.location.href=$window.location.origin+new_path}).error(function(data,status,headers,config){403===status?$("button.go").html(' Please Log In'):$("button.go").removeClass("btn-success").addClass("btn-danger").html(' Error'),$scope.gotSave=!1})}$scope.gotTags=!1,$scope.gotUser=!1,$scope.gotSave=!1,$scope.$watch(function(){return $scope.gotTags&&$scope.gotUser&&$scope.gotSave},function(val){val&&saveArticle($scope.init)}),$scope.newArticle=function(e){var init={title:$scope.newTitle};angular.extend($scope.init,init),$scope.tag?IfExistsElse.ifExistsElse(ContentFactory.all("tag").getList({ordering:"name",search:$scope.tag,types:"core_section"}),{slug:$scope.tag},function(tag){$scope.init.tags=[tag],$scope.gotTags=!0},function(value){console.log("couldnt find tag "+value.slug+" for initial value")},function(data,status,headers,config){Raven.captureMessage("Error Creating Article",{extra:data})}):$scope.gotTags=!0,CmsConfig.getAutoAddAuthor()?ContentFactory.one("me").get().then(function(data){$scope.init.authors=[data],$scope.gotUser=!0}):$scope.gotUser=!0,$scope.gotSave=!0}},link:function(scope,element,attrs){scope.panel=1,$(element).find("a.create-content").on("click",function(e){$("a.create-content.active").removeClass("active"),$(this).addClass("active")}),$(element).find("a.create-content").on("click",function(e){return scope.contentTypeLabel=$(this).text(),scope.contentType=$(this).data("content_type")||null,scope.init=$(this).data("init")||{},scope.tag=$(this).data("tag")||null,scope.rating_type=$(this).data("rating_type")||null,scope.$apply(),!$(this).hasClass("go-next")||(e.preventDefault(),$("#create button.next-pane").click(),!1)}),$("button.next-pane:not(.hide)").on("click",function(e){scope.panel=2,$(".new-title").focus()}),$(element).on("keydown",".editor",function(e){13===e.keyCode&&scope.newTitle&&$(element).find(".go").click()}),$("#create").on("hidden.bs.modal",function(){scope.newTitle="",scope.panel=1})}}}),angular.module("bulbsCmsApp").directive("devicepreview",function($){return{restrict:"E",templateUrl:"/views/devicepreview.html",link:function(scope,element,attrs){var pP=$("#page-prev"),tN=pP.find(".nav a"),cO=pP.find(".tab-content .active");tN.click(function(e){var newId=$(this).attr("href").split("#")[1];e.preventDefault(),cO.attr("id",newId)}),$("#page-prev").on("show.bs.collapse",function(){$(this).find(".fa").removeClass("fa-plus-square-o").addClass("fa-minus-square-o")}),$("#page-prev").on("hide.bs.collapse",function(){$(this).find(".fa").removeClass("fa-minus-square-o").addClass("fa-plus-square-o")})}}}),angular.module("bulbsCmsApp").directive("encodeStatus",function($http,$interval,$,Zencoder){return{templateUrl:"/views/encode-status.html",restrict:"E",link:function(scope,element,attrs){function updateEncodeStatuses(){var updateEncodeStatus=function(i){return function(videoid){Zencoder.encodingVideos[videoid].encode_status_endpoints&&Zencoder.encodingVideos[videoid].encode_status_endpoints.json&&$http({method:"GET",url:Zencoder.encodingVideos[videoid].encode_status_endpoints.json,headers:{"X-CSRFToken":void 0}}).success(function(data){scope.encodingVideos[videoid].job_status=data,"finished"===data.state&&(scope.encodingVideos[videoid].finished=!0)})}(i)};for(var i in Zencoder.encodingVideos)scope.encodingVideos[i]&&scope.encodingVideos[i].finished||(scope.encodingVideos[i]=Zencoder.encodingVideos[i],updateEncodeStatus(i))}scope.encodingVideos={},scope.$watch(function(){return Zencoder.encodingVideos},function(){updateEncodeStatuses()},!0),$interval(function(){$("iframe").filter(function(){return this.src.match(/\/video\/embed\/?/)}).each(function(){var idRegex=/\/video\/embed\/?\?id=(\d+)/,id=idRegex.exec(this.src)[1];id in Zencoder.encodingVideos||Zencoder.getVideo(id).then(function(data){Zencoder.encodingVideos[id]=data.data})}),updateEncodeStatuses()},5e3)}}}),angular.module("bulbsCmsApp").directive("featuretypeField",function(IfExistsElse,ContentFactory,Raven,$){return{templateUrl:"/views/textlike-autocomplete-field.html",restrict:"E",scope:{article:"=",hideLabel:"="},replace:!0,link:function(scope,element,attrs){scope.name="feature_type",scope.label="Feature Type",scope.placeholder="Feature Type",scope.resourceUrl="/cms/api/v1/things/?type=feature_type&q=",scope.$watch("article.feature_type",function(){scope.model=scope.article.feature_type}),scope.display=function(o){return o&&o.name||""},scope.add=function(o,input,freeForm){var fVal=freeForm?o:o.name;IfExistsElse.ifExistsElse(ContentFactory.all("things").getList({type:"feature_type",q:fVal}),{name:fVal},function(ft){scope.article.feature_type=ft.name,$("#feature-type-container").removeClass("newtag")},function(value){scope.article.feature_type=value.name,$("#feature-type-container").addClass("newtag")},function(data,status){Raven.captureMessage("Error Adding Feature Type",{extra:data})})},scope.delete=function(e){scope.article.feature_type=null}}}}),angular.module("bulbsCmsApp").directive("hideIfForbidden",function($http){function hideElement(element){element.addClass("hidden")}return{restrict:"A",link:function(scope,element,attrs){$http({method:"OPTIONS",url:attrs.optionsUrl,noPermissionIntercept:!0}).success(function(data,status){403===status&&hideElement(element)}).error(function(data,status){403===status&&hideElement(element)})}}});angular.module("bulbsCmsApp").directive("lazyInclude",function($,$compile,$q,$http,$templateCache,Gettemplate){return{restrict:"A",scope:!0,link:function(scope,element,attrs){var templateUrl="/views/"+attrs.template,$element=$(element);scope.$evalAsync(function(){scope.$watch(function(){return $element.is(":visible")},function(visible){visible&&!scope.loaded&&(scope.loaded=!0,Gettemplate.get(templateUrl).then(function(html){var template=angular.element(html),compiledEl=$compile(template)(scope);element.html(compiledEl),element.css("height","auto")}))})})}}});angular.module("bulbsCmsApp").directive("loggedInUser",function(CurrentUserApi){return{restrict:"E",replace:!0,templateUrl:"/views/logged-in-user.html",scope:{},link:function(scope,element,attrs){CurrentUserApi.getCurrentUserWithCache().then(function(user){scope.currentUser=user,scope.logout=CurrentUserApi.logout})}}}),angular.module("bulbsCmsApp").directive("navBar",function(CmsConfig,CurrentUserApi){return{restrict:"E",scope:!1,templateUrl:function(tElement,tAttrs){return CmsConfig.getTopBarMapping(tAttrs.view)},link:function(scope){scope.NAV_LOGO=CmsConfig.getNavLogoPath(),CurrentUserApi.getCurrentUserWithCache().then(function(user){scope.currentUser=user})}}}),angular.module("bulbsCmsApp").directive("responsiveImage",function($window,$){return{link:function(scope,element,attrs){attrs.$observe("imageId",function(val){$(element).find("img").remove(),element.attr("data-image-id",attrs.imageId),element.attr("data-crop",attrs.crop),attrs.imageId&&$(element).is(":visible")&&($window.pictureFillElement(element[0]),element.show())})}}}),angular.module("bulbsCmsApp").directive("roleField",function($http,$,Raven){return{templateUrl:"/views/rolefield.html",restrict:"E",replace:!0,scope:{model:"="},link:function(scope,element,attrs){var resourceUrl="/cms/api/v1/contributions/role/";scope.roleValue=null,scope.roleOptions=[],scope.$watch("model.role",function(){for(var i=0;i
    Save",busy:"Saving",finished:"Saved",error:"Error"})}),scope.save=function(){if(attrs.confirmClickWith){var message=attrs.confirmClickWith;if(!$window.confirm(message))return}scope.colors=scope.colors_tmp,element.prop("disabled",!0).html(" "+scope.config.busy);var save_promise=scope.getPromise(),saveSuccess=function(result){return scope.colors=scope.colors_tmp,element.prop("disabled",!1).html(" "+scope.config.finished),$timeout(function(){element.html(scope.config.idle)},1e3).then(function(){return result})};if(save_promise){var promise=save_promise.then(saveSuccess).catch(function(reason){return scope.colors="btn-danger",element.prop("disabled",!1).html(" "+scope.config.error),$q.reject(reason)});scope.saveCbk&&scope.saveCbk({promise:promise})}else saveSuccess()}}}}),angular.module("bulbsCmsApp").directive("sectionsField",function(_,IfExistsElse,ContentFactory,Raven,$){return{templateUrl:"/views/taglike-autocomplete-field.html",restrict:"E",replace:!0,link:function(scope,element,attrs){scope.name="section",scope.label="Sections",scope.placeholder="Enter a section",scope.resourceUrl="/cms/api/v1/tag/?ordering=name&types=core_section&search=",scope.display=function(o){return o.name},scope.$watch("article.tags",function(){scope.objects=_.where(scope.article.tags,{type:"core_section"})},!0),scope.add=function(o,input,freeForm){var tagVal=freeForm?o:o.name;IfExistsElse.ifExistsElse(ContentFactory.all("tag").getList({ordering:"name",search:tagVal,types:"core_section"}),{name:tagVal},function(tag){scope.article.tags.push(tag)},function(){console.log("Can't create sections.")},function(data,status){Raven.captureMessage("Error Adding Section",{extra:data})}),$(input).val("")},scope.delete=function(e){var tag=$(e.target).parents("[data-taglikeobject]").data("taglikeobject"),name=tag.name,newtags=[];for(var i in scope.article.tags)scope.article.tags[i].name!==name&&newtags.push(scope.article.tags[i]);scope.article.tags=newtags}}}}),angular.module("bulbsCmsApp").directive("slideshowPane",function($http,$window,$compile,$){return{restrict:"E",templateUrl:"/views/slideshow-pane.html",scope:{article:"=",image:"=",index:"="},link:function(scope,element,attrs){var $element=$(element);"false"===attrs.caption&&(scope.hideCaption=!0),scope.format=attrs.format||"jpg",scope.crop=attrs.crop||"16x9",scope.removeImage=function(index){scope.article.slides.splice(index,1)},scope.editImage=function(index){var loadingClass="loading-class";$window.openImageDrawer(scope.article.slides[index].id,function(data){function removeLoadingGif(){$element.find(".image ."+loadingClass).remove()}removeLoadingGif(),$element.find(".image").data("imageId")!==data.id&&($element.find(".image img").on("load",removeLoadingGif),$element.find(".image img").after(''),scope.article.slides[index].id=data.id.toString(),scope.$apply(),$window.picturefill(),$element.find(".image img")[0].complete&&removeLoadingGif())},function(){},function(oldImage){scope.article.slides[index]=oldImage,$window.picturefill()})}}}}),angular.module("bulbsCmsApp").directive("tagsField",function(_,IfExistsElse,ContentFactory,Raven,$){return{templateUrl:"/views/taglike-autocomplete-field.html",restrict:"E",scope:{article:"="},replace:!0,link:function(scope,element,attrs){scope.name="tag",scope.label="Tags",scope.placeholder="Enter a tag",scope.resourceUrl="/cms/api/v1/tag/?ordering=name&types=content_tag&search=",scope.display=function(o){return o.name},scope.$watch("article.tags",function(){scope.objects=_.where(scope.article.tags,{type:"content_tag"})},!0),scope.add=function(o,input,freeForm){var tagVal=freeForm?o:o.name;IfExistsElse.ifExistsElse(ContentFactory.all("tag").getList({ordering:"name",search:tagVal}),{name:tagVal},function(tag){scope.article.tags.push(tag)},function(value){scope.article.tags.push({name:value.name,type:"content_tag",new:!0})},function(data,status){Raven.captureMessage("Error Adding Tag",{extra:data})}),$(input).val("")},scope.delete=function(e){var tag=$(e.target).parents("[data-taglikeobject]").data("taglikeobject"),name=tag.name,newtags=[];for(var i in scope.article.tags)scope.article.tags[i].name!==name&&newtags.push(scope.article.tags[i]);scope.article.tags=newtags}}}}),angular.module("bulbsCmsApp").directive("targeting",function(){return{restrict:"E",templateUrl:"/views/targeting.html",link:function(scope,element,attrs){scope.addTargetingRow=function(index){scope.targetingArray.push([])},scope.removeTargetingRow=function(index){scope.targetingArray.splice(index,1)}}}}),angular.module("bulbsCmsApp").directive("videoUpload",function($http,$window,$timeout,$sce,$){return{templateUrl:"/views/mainvideo.html",scope:{article:"="},restrict:"E",link:function(scope,element,attrs){function abortUpload(){setProgress(0),scope.req&&scope.req.abort(),scope.video={},setProgress(0)}function abortEncode(){$.ajax("https://app.zencoder.com/api/v2/jobs/"+scope.video.job_id+"/cancel.json?api_key="+$window.videoAttrs.zencoderApiKey,{type:"PUT",success:function(data){scope.video.status=3,fakeInput.val("Encoding failed! Please try again.")}})}function setProgress(progress){return 0===progress||100===progress?void progressEl.hide():void((0===scope.lastProgress||Math.abs(progress-scope.lastProgress)>2)&&(progressBar.css("width",Math.floor(progress)+"%"), +scope.lastProgress=progress,progressEl.show()))}function updateEncodeProgress(){progressBar.addClass("progress-bar-success"),delete $http.defaults.headers.common["X-Requested-With"],$http({url:"https://app.zencoder.com/api/v2/jobs/"+scope.video.job_id+"/progress.json",method:"GET",params:{api_key:$window.videoAttrs.zencoderApiKey},useXDomain:!0}).success(function(data){"waiting"===data.state||"pending"===data.state||"processing"===data.state?(scope.video.status=2,data.progress>5?(setProgress(data.progress),$timeout(updateEncodeProgress,500)):$timeout(updateEncodeProgress,2e3)):(setProgress(0),"finished"===data.state&&(scope.video.status=1),"failed"!==data.state&&"cancelled"!==data.state||(scope.video.status=3,fakeInput.val("Encoding failed! Please try again.")))}).error(function(data){$(".alert-danger").fadeIn().delay(1e3).fadeOut()})}console.log("video upload here"),console.log(scope.video_id),scope.$watch("article.video",function(){scope.article.video&&(scope.embedUrl=$sce.trustAsUrl("/video/embed?id="+scope.article.video),$http({method:"GET",url:"/videos/api/video/"+scope.article.video+"/"}).success(function(data){console.log("getting video from API"),console.log(data),scope.video=data,$window.initVideoWidget(data.id)}))}),scope.$watch("video",function(){});var progressEl=element.find("div.progress"),progressBar=element.find("div.progress-bar"),fakeInput=element.find("input.fake-input");scope.lastProgress=0,scope.addVideo=function(){console.log("chooseFile"),$window.uploadVideo(element.find(".video-container")[0],{onSuccess:function(videoid){scope.$apply(function(){console.log("addVideo onSuccess callback"),console.log(videoid),scope.article.video=videoid})},onError:function(data){console.log("addVideo onError callback"),console.log(data)},onProgress:function(data){console.log("addVideo onProgress callback"),console.log(data)}})},scope.clearVideo=function(areYouSure){areYouSure?($("#s3upload-file-input").val(""),scope.article.video=null):$("#confirm-clear-video-modal").modal("show")},scope.abort=function(){return scope.encoding?void abortEncode():void abortUpload()};var initialCheckRan=!1;scope.$watch("video",function(){scope.video&&scope.video.job_id&&!initialCheckRan&&(updateEncodeProgress(),initialCheckRan=!0)})}}}),angular.module("bulbsCmsApp").directive("videoEmbed",function(CmsConfig){return{template:'
    ',restrict:"E",link:function(scope,element,attrs){scope.videoUrl=CmsConfig.buildVideoUrl(attrs.videoId)}}}),angular.module("bulbsCmsApp").directive("videoField",function(Zencoder){return{templateUrl:"/views/video-field.html",restrict:"E",scope:{article:"="},link:function(scope,element,attrs){scope.removeVideo=function(){scope.article.video=null},scope.uploadVideo=function(){Zencoder.onVideoFileUpload().then(function(success){console.log(success),scope.article.video=success.attrs.id},angular.noop,function(progress){console.log(progress),scope.uploadProgress=progress})},scope.thumbnailModal=function(){Zencoder.openVideoThumbnailModal(scope.article.video).result.then(function(resolve){console.log("thumbnail modal resolve"),console.log(resolve)},function(reject){console.log("thumbnail modal rejected")})}}}}),angular.module("bulbsCmsApp").directive("autocompleteMenu",function($timeout,$animate,$compile){return{restrict:"E",replace:!0,transclude:!0,controller:angular.noop,scope:{items:"=items",pIndex:"=index",select:"&select"},link:function($scope,element,attrs){$scope.selectItem=function(index){$scope.select(index)},$scope.setIndex=function(index){$scope.index=index,attrs.index&&($scope.pIndex=parseInt(index,10))},attrs.index&&$scope.$watch("pIndex",function(value){$scope.index=parseInt(value,10)}),$scope.label=function(index){var viewValue=$scope.items[index][attrs.labelAttr];return"function"==typeof viewValue&&(viewValue=viewValue()),viewValue}},template:'
    • {{ label($index) }}
    '}}),angular.module("bulbsCmsApp").directive("autocomplete",function($timeout,$animate,$compile){return{restrict:"E",replace:!0,require:"ngModel",transclude:!0,controller:function($scope,$element,$attrs,$injector){$scope.service=$injector.get($attrs.service),$scope.placeholder=$attrs.placeholder||""},link:function($scope,element,attrs,ngModel,transclude){function queryData(query){var searchParams={};searchParams[attrs.searchParam||"search"]=query,$scope.service.getList(searchParams).then(function(results){results.length>5?menuScope.items=results.slice(0,5):menuScope.items=results,timeoutId=null})}function appendMenu(){isMenuAppended||(isMenuAppended=!0,menuScope.index=0,$animate.enter(menuEl,element.parent(),element)),styleMenu()}function reset(){ngModel.$render(),menuScope.items=[],menuScope.index=0,$animate.leave(menuEl).finally(function(){isMenuAppended=!1})}function styleMenu(){var offset=(window.getComputedStyle(element[0]),element.offset());offset.left="auto",offset.right="auto",offset.top=element.outerHeight(),offset.minWidth=element.outerWidth(),angular.forEach(offset,function(value,key){!isNaN(value)&&angular.isNumber(value)&&(value+="px"),menuEl[0].style[key]=value,menuEl.css("z-index",1e3)})}var isMenuAppended=!1,inputEl=element.find("input"),timeoutId=null;ngModel.$render=function(){if(ngModel.$viewValue){var viewValue=ngModel.$viewValue[attrs.labelAttr];"function"==typeof viewValue&&(viewValue=viewValue()),element.find("input").val(viewValue),inputEl.attr("disabled","disabled")}},$scope.openMenu=function(e){inputEl.removeAttr("disabled"),inputEl[0].focus()},inputEl.on("blur keyup change",function(){if(void 0===inputEl.attr("disabled")){appendMenu();var value=inputEl.val();value&&(timeoutId&&$timeout.cancel(timeoutId),timeoutId=$timeout(function(){queryData(value)},150))}});var menuScope=$scope.$new();menuScope.items=[],menuScope.index=0,menuScope.select=function(index){ngModel.$setViewValue(menuScope.items[index]),reset()};var menuEl=angular.element(document.createElement("autocomplete-menu"));menuEl.attr({items:"items",select:"select(index)",index:"index","label-attr":attrs.labelAttr}),transclude(menuScope,function(clone){menuEl.append(clone)}),$compile(menuEl)(menuScope),element.find("input").on("keyup",function(e){switch(e.which){case 27:""===inputEl.val()?reset():inputEl.val("");break;case 40:$scope.$apply(function(){menuScope.index=(menuScope.index+1)%menuScope.items.length});break;case 38:$scope.$apply(function(){menuScope.index?menuScope.index=menuScope.index-1:menuScope.index=menuScope.items.length-1});break;case 13:menuScope.index>=0&&(ngModel.$setViewValue(menuScope.items[menuScope.index]),reset());break;default:return}})},templateUrl:"/views/autocomplete.html"}}),angular.module("bulbsCmsApp").controller("BadrequestmodalCtrl",function($scope,$modalInstance,detail){$scope.detail=detail}),angular.module("bulbsCmsApp").controller("ChangelogmodalCtrl",function($scope,$modalInstance,_,ContentFactory,article){$scope.article=article,$scope.users={},ContentFactory.all("log").getList({content:article.id}).then(function(data){$scope.changelog=data;var userIds=_.unique(_.pluck(data,"user")),resp=function(data){$scope.users[data.id]=data};for(var i in userIds)ContentFactory.one("author",userIds[i]).get().then(resp)})}),angular.module("bulbsCmsApp").controller("CmsNotificationCtrl",function($scope,moment){var valid=function(){$scope.postDateValid=$scope.postDate&&(!$scope.notifyEndDate||$scope.postDate<$scope.notifyEndDate),$scope.notifyEndDateValid=$scope.notifyEndDate&&$scope.postDate&&$scope.notifyEndDate>$scope.postDate,$scope.titleValid=$scope.cmsNotification.title&&$scope.cmsNotification.title.length>0&&$scope.cmsNotification.title.length<=110,$scope.cmsNotificationValid=$scope.postDateValid&&$scope.notifyEndDateValid&&$scope.titleValid};$scope.postDate=$scope.cmsNotification.post_date?moment($scope.cmsNotification.post_date):null,$scope.$watch("postDate",function(){$scope.postDate?($scope.cmsNotification.post_date=$scope.postDate.format(),$scope.notifyEndDate=$scope.postDate.clone().add({days:3})):$scope.cmsNotification.post_date=null}),$scope.notifyEndDate=$scope.cmsNotification.notify_end_date?moment($scope.cmsNotification.notify_end_date):null,$scope.$watch("notifyEndDate",function(){$scope.notifyEndDate?$scope.cmsNotification.notify_end_date=$scope.notifyEndDate.format():$scope.cmsNotification.notify_end_date=null}),$scope.cmsNotificationDirty=!1,$scope.$watch("cmsNotification",function(newValue,oldValue){angular.equals(newValue,oldValue)||($scope.cmsNotificationDirty=!0,valid())},!0),valid(),$scope.saveCmsNotification=function(){$scope.$parent.userIsSuperuser&&$scope.cmsNotificationDirty&&$scope.cmsNotificationValid&&$scope.$parent.$saveCmsNotification($scope.cmsNotification).then(function(newCmsNotification){$scope.cmsNotification=newCmsNotification,$scope.cmsNotificationDirty=!1}).catch(function(error){console.log("CMS Alert save failed",error)})},$scope.deleteCmsNotification=function(){$scope.$parent.userIsSuperuser&&$scope.$parent.$deleteCmsNotification($scope.cmsNotification).catch(function(error){console.log("CMS Alert delete failed",error)})}}),angular.module("bulbsCmsApp").controller("CmsNotificationsCtrl",function($q,$window,$scope,CmsConfig,CmsNotificationsApi,CurrentUserApi,_,moment){$window.document.title=CmsConfig.getCmsName()+" | CMS Alerts",CurrentUserApi.getCurrentUserWithCache().then(function(user){user.is_superuser&&($scope.userIsSuperuser=!0),CmsNotificationsApi.getList().then(function(cmsNotifications){var removeIndicies=[];_.each(cmsNotifications,function(cmsNotification,i){!user.is_superuser&&moment(cmsNotification.post_date).isAfter(moment())&&removeIndicies.push(i)}),_.each(removeIndicies,function(i){cmsNotifications.splice(i,1)}),$scope.cmsNotifications=cmsNotifications})}),$scope.newCmsNotification=function(){var cmsNotification={post_date:null,notify_end_date:null};return $scope.cmsNotifications.unshift(cmsNotification),cmsNotification},$scope.$saveCmsNotification=function(cmsNotification){var saveDefer=$q.defer(),savePromise=saveDefer.promise;return $scope.userIsSuperuser?"id"in cmsNotification?cmsNotification.put().then(function(updatedCmsNotification){saveDefer.resolve(updatedCmsNotification)}):$scope.cmsNotifications.post(cmsNotification).then(function(newCmsNotification){var i=$scope.cmsNotifications.indexOf(cmsNotification);$scope.cmsNotifications[i]=newCmsNotification,saveDefer.resolve(newCmsNotification)}).catch(function(error){saveDefer.reject(error)}):saveDefer.reject("Insufficient permissions."),savePromise},$scope.$deleteCmsNotification=function(cmsNotification){var deleteDefer=$q.defer(),deletePromise=deleteDefer.promise,removeFromList=function(index){$scope.cmsNotifications.splice(index,1),deleteDefer.resolve()};if($scope.userIsSuperuser){var i=$scope.cmsNotifications.indexOf(cmsNotification);i>-1?_.isFunction(cmsNotification.remove)?cmsNotification.remove().then(function(){removeFromList(i)}).catch(function(error){deleteDefer.reject(error)}):removeFromList(i):deleteDefer.reject("Cannot find notification in notification list. Unable to delete.")}else deleteDefer.reject("You do not have sufficient permissions to delete a notification.");return deletePromise}}),angular.module("bulbsCmsApp").controller("CmsNotifyContainerCtrl",function($scope,ipCookie,moment,CmsNotificationsApi,URLify,_){var genCookieKey=function(id){return"dismissed-cms-notification-"+id},updateCmsNotificationsDisplay=function(cmsNotifications){var now=moment();$scope.cmsNotifications=_.filter(cmsNotifications,function(cmsNotification){if(!ipCookie(genCookieKey(cmsNotification.id))&&moment(cmsNotification.post_date).isBefore(now)&&moment(cmsNotification.notify_end_date).isAfter(now))return!0})};CmsNotificationsApi.getList().then(function(cmsNotifications){updateCmsNotificationsDisplay(cmsNotifications)}),$scope.dismissCmsNotification=function(cmsNotification){var cookieKey=URLify(genCookieKey(cmsNotification.id));ipCookie(cookieKey,!0,{expires:moment(cmsNotification.notify_end_date).add({days:1}).diff(moment(),"days"),path:"/cms/app"}),updateCmsNotificationsDisplay($scope.cmsNotifications)}}),angular.module("bulbsCmsApp").controller("ContenteditCtrl",function($scope,$routeParams,$http,$window,$location,$timeout,$interval,$compile,$q,$modal,$,_,CmsConfig,moment,keypress,Raven,PNotify,IfExistsElse,VersionStorageApi,ContentFactory,FirebaseApi,FirebaseArticleFactory,Login,VersionBrowserModalOpener){var listener=new keypress.Listener;listener.simple_combo("cmd s",function(e){$scope.saveArticle()}),listener.simple_combo("ctrl s",function(e){$scope.saveArticle()});var saveHTML=" Save",navbarSave=".navbar-save",getArticleCallback=function(data){$window.article=$scope.article=data,$scope.last_saved_article=angular.copy(data),FirebaseApi.$connection.onConnect(function(){$scope.firebaseConnected=!0}).onDisconnect(function(){$scope.firebaseConnected=!1}),FirebaseArticleFactory.$retrieveCurrentArticle().then(function($article){var currentUser,savePNotify,$activeUsers=$article.$activeUsers(),$versions=$article.$versions();return $versions.$loaded(function(){$versions.$watch(function(e){if("child_added"===e.event){var newVersion=_.sortBy($versions,function(version){return-version.timestamp})[0];if(currentUser&&newVersion.user.id!==currentUser.id){savePNotify&&savePNotify.remove();var msg=""+newVersion.user.displayName+" -- "+moment(newVersion.timestamp).format("MMM Do YYYY, h:mma")+"
    ";$scope.articleIsDirty&&(msg+=" You have unsaved changes that may conflict when you save."),msg+=" Open the version browser to see their latest version.",savePNotify=new PNotify({title:"Another User Saved!",text:msg,type:"error",mouse_reset:!1,hide:!1,confirm:{confirm:!0,buttons:[{text:"Open Version Browser",addClass:"btn-primary",click:function(notice){notice.mouse_reset=!1,notice.remove(),VersionBrowserModalOpener.open($scope,$scope.article)}},{addClass:"hide"}]},buttons:{closer_hover:!1,sticker:!1}})}}})}),$activeUsers.$watch(function(){$scope.activeUsers=_.chain($activeUsers).groupBy(function(user){return user.id}).map(function(group){var groupedUser=group[0];return groupedUser.count=group.length,currentUser&&groupedUser.id===currentUser.id&&(groupedUser.displayName="You"),groupedUser}).sortBy(function(user){return"You"===user.displayName?"":user.displayName}).value()}),$article.$registerCurrentUserActive().then(function(user){currentUser=user}),$article})},getContent=function(){return ContentFactory.one("content",$routeParams.id).get().then(getArticleCallback)},saveArticleErrorCbk=function(data){$(navbarSave).removeClass("btn-success").addClass("btn-danger").html(" Error"),400===status&&($scope.errors=data),$scope.saveArticleDeferred.reject()},saveArticleSuccessCbk=function(resp){VersionStorageApi.$create($scope.article,$scope.articleIsDirty),$(navbarSave).html(" Saved!"),setTimeout(function(){$(navbarSave).html(saveHTML)},2500),$window.article=$scope.article=resp,$scope.last_saved_article=angular.copy(resp),$scope.articleIsDirty=!1,$scope.articleIsNew=!1,$scope.errors=null,"new"===$routeParams.id&&$location.path("/cms/app/edit/"+$scope.article.id+"/"+$routeParams.contentType),$location.search("rating_type",null),$scope.saveArticleDeferred.resolve(resp)};$scope.PARTIALS_URL="/views/",$scope.buildContentPartialsPath=CmsConfig.buildContentPartialsPath,$scope.page="edit",$scope.contentEditGlobals={canSave:!0},$scope.$watch("article.title",function(){$window.document.title=CmsConfig.getCmsName()+" | Editing "+($scope.article&&$(""+$scope.article.title+"").text())}),$scope.saveArticleDeferred=$q.defer(),$scope.saveArticleIfDirty=function(){return $scope.articleIsDirty?$scope.saveArticle():$q.when($scope.article)},$scope.saveArticle=function(){return $scope.contentEditGlobals.saveError?$scope.saveArticleDeferred.reject():($(navbarSave).removeClass("btn-danger").addClass("btn-success").html(" Saving"),"new"===$routeParams.id?$scope.postValidationSaveArticle():ContentFactory.one("content",$routeParams.id).get().then(function(data){data.last_modified&&$scope.article.last_modified&&moment(data.last_modified)>moment($scope.article.last_modified)?($scope.saveArticleDeferred.reject(),$modal.open({templateUrl:"/views/modals/last-modified-guard-modal.html",controller:"LastmodifiedguardmodalCtrl",scope:$scope,resolve:{articleOnPage:function(){return $scope.article},articleOnServer:function(){return data}}})):$scope.postValidationSaveArticle()}).catch(saveArticleErrorCbk),$scope.saveArticleDeferred.promise)},$scope.postValidationSaveArticle=function(){"Published"!==$scope.article.status&&$scope.article.polymorphic_ctype!==CmsConfig.getSuperFeaturesType()&&($scope.article.slug=$window.URLify($scope.article.title,50));var params={};return"new"===$routeParams.id&&(params.doctype=$scope.article.polymorphic_ctype),$scope.article.save(params).then(saveArticleSuccessCbk).catch(saveArticleErrorCbk),$scope.saveArticleDeferred.promise},$scope.articleIsDirty="new"===$routeParams.id,$scope.$watch(function(){return!angular.equals($scope.article,$scope.last_saved_article)},function(isDirty){$scope.articleIsDirty=isDirty}),$scope.$watch("articleIsDirty",function(){$scope.articleIsDirty?$window.onbeforeunload=function(){return"You have unsaved changes. Do you want to continue?"}:$window.onbeforeunload=function(){}}),$scope.publishSuccessCbk=function(){return getContent()},$scope.trashSuccessCbk=function(){$timeout(function(){$window.history.back()},1500)};var initialize=function(){"new"===$routeParams.id?($scope.articleIsNew=!0,$scope.article=ContentFactory.oneUrl("content"),$scope.article.polymorphic_ctype=$routeParams.contentType):getContent()};initialize()}),angular.module("bulbsCmsApp").controller("ContentlistCtrl",function($scope,$http,$timeout,$location,$window,$q,$,CmsConfig,ContentListService){$scope.contentData=[],ContentListService.$updateContent({page:1,exclude:CmsConfig.getSuperFeaturesType()}).then(function(data){$scope.contentData=data}),$window.document.title=CmsConfig.getCmsName()+" | Content",$scope.pageNumber=$location.search().page||"1",$scope.myStuff=!1,$scope.search=$location.search().search,$scope.collapse={},$scope.goToPage=function(){ContentListService.$updateContent({page:$scope.pageNumber},!0)},$scope.publishSuccessCbk=function(data){var i;for(i=0;i<$scope.contentData.content.length&&$scope.contentData.content[i].id!==data.article.id;i++);for(var field in data.response)$scope.contentData.content[i][field]=data.response[field];return $q.when()},$scope.trashSuccessCbk=function(){$timeout(function(){ContentListService.$updateContent(),$("#confirm-trash-modal").modal("hide")},1500)},$("body").on("shown.bs.collapse",".panel-collapse",function(e){$scope.$digest()})}).directive("ngConfirmClick",[function(){return{link:function(scope,element,attr){var msg=attr.ngConfirmClick||"Are you sure?",clickAction=attr.confirmedClick;element.bind("click",function(){window.confirm(msg)&&scope.$eval(clickAction)})}}}]),angular.module("bulbsCmsApp").controller("ContentworkflowCtrl",function($scope,$http,$modal,$window,moment,VersionBrowserModalOpener,TemporaryUrlModalOpener,CmsConfig){$scope.TIMEZONE_LABEL=moment.tz(CmsConfig.getTimezoneName()).format("z"),$scope.trashContentModal=function(articleId){return $modal.open({templateUrl:"/views/modals/confirm-trash-modal.html",controller:"TrashcontentmodalCtrl",scope:$scope,resolve:{articleId:function(){return articleId}}})},$scope.pubTimeModal=function(article){return $modal.open({templateUrl:"/views/modals/publish-date-modal.html",controller:"PubtimemodalCtrl",scope:$scope,resolve:{article:function(){return article}}})},$scope.sendToEditorModal=function(article){return $modal.open({templateUrl:"/views/modals/send-to-editor-modal.html",controller:"SendtoeditormodalCtrl",scope:$scope,resolve:{article:function(){return article}}})},$scope.changelogModal=function(article){return $modal.open({templateUrl:"/views/modals/changelog-modal.html",controller:"ChangelogmodalCtrl",scope:$scope,resolve:{article:function(){return article}}})},$scope.thumbnailModal=function(article){return $modal.open({templateUrl:"/views/modals/thumbnail-modal.html",controller:"ThumbnailModalCtrl",scope:$scope,resolve:{article:function(){return article}}})},$scope.versionBrowserModal=function(article){VersionBrowserModalOpener.open($scope,article)},$scope.temporaryUrlModal=function(article){TemporaryUrlModalOpener.open($scope,article)},$scope.descriptionModal=function(article){return $modal.open({templateUrl:"/views/modals/description-modal.html",controller:"DescriptionModalCtrl",scope:$scope,size:"lg",resolve:{article:function(){return article}}})},$scope.getStatus=function(article){return article&&article.published?moment(article.published)>moment()?"scheduled":"published":"unpublished"}}),angular.module("bulbsCmsApp").controller("ContributionsCtrl",function($scope,$routeParams,$http,$window,$location,$timeout,$compile,$q,$modal,_,CmsConfig,ContributionRoleService,ContentService){function save(){angular.element("#save-btn").html(' Saving'),$scope.contributions.save($scope.contributions).then(function(contributions){angular.element("#save-btn").addClass("btn-success").removeClass("btn-danger"),angular.element("#save-btn").html(' Save'),$scope.clean=!0},function(res){angular.element("#save-btn").addClass("btn-danger").removeClass("btn-success"),angular.element("#save-btn").html(' Error')})}function add(){$scope.contributions.push({contributor:null,content:$scope.contentId,rate:{rate:0},role:null}),$scope.collapsed.push(!1)}function getRoles(){return ContributionRoleService.getList().then(function(roles){$scope.roles=roles,getContributions()})}function getContributions(){return ContentService.one($scope.contentId).all("contributions").getList().then(function(contributions){for(var i in contributions)null!==contributions[i]&&void 0!==contributions[i].role&&(contributions[i].hasOwnProperty("rate")&&"object"==typeof contributions[i].rate&&null!==contributions[i].rate&&(contributions[i].rate=contributions[i].rate.rate),"object"==typeof contributions[i].role&&(contributions[i].paymentType=contributions[i].role.payment_type,contributions[i].roleObject=contributions[i].role,contributions[i].role=contributions[i].role.id));$scope.contributions=contributions,$scope.collapsed=new Array(contributions.length),$scope.contributions.forEach(function(item,index){$scope.contributionLabels[index]=_.find($scope.roles,function(role){return role.id===item.role}).name,$scope.collapsed[index]=!0})})}function getContent(){ContentService.one($scope.contentId).get().then(function(content){$scope.content=content,$scope.article={id:content.id}})}function remove(index){$scope.contributions.splice(index,1),$scope.collapsed.splice(index,1)}function updateLabel(index){$scope.contributionLabels[index]=_.find($scope.roles,function(role){return $scope.contributions[index].roleObject=role,$scope.contributions[index].paymentType=role.payment_type,role.id===$scope.contributions[index].role}).name}$scope.NAV_LOGO=CmsConfig.getNavLogoPath(),$scope.contentId=parseInt($routeParams.id,10),$scope.paymentType="",$scope.contributions=[],$scope.contributionLabels=[],$scope.roles=[],$scope.collapsed=[],$scope.page="contributions",$scope.clean=!0,$scope.save=save,$scope.add=add,$scope.remove=remove,$scope.updateLabel=updateLabel,$scope.isFlatRate=function(contribution){return!(!contribution.hasOwnProperty("roleObject")||"Flat Rate"!==contribution.roleObject.payment_type)},$scope.isFeatureType=function(contribution){return!(!contribution.hasOwnProperty("roleObject")||"FeatureType"!==contribution.roleObject.payment_type)&&($scope.setFeatureRate(contribution),!0)},$scope.setFeatureRate=function(contribution){for(var i in contribution.roleObject.rates.feature_type){var featureTypeRate=contribution.roleObject.rates.feature_type[i];$scope.content.feature_type===featureTypeRate.feature_type&&(contribution.featureTypeRate=featureTypeRate.rate)}},$scope.isHourly=function(contribution){return!(!contribution.hasOwnProperty("roleObject")||"Hourly"!==contribution.roleObject.payment_type)},$scope.isManual=function(contribution){return!(!contribution.hasOwnProperty("roleObject")||"Manual"!==contribution.roleObject.payment_type)},$scope.getHourlyPay=function(contribution){if(contribution.roleObject)return contribution.roleObject.rate?contribution.roleObject.rate/60*(contribution.minutes_worked||0):0},$scope.$watch("contributions",function(newContributions,oldContributions){oldContributions.length>0&&($scope.clean=!1)},!0),getRoles(),getContent()}),angular.module("bulbsCmsApp").controller("DescriptionModalCtrl",function($scope,$modalInstance,article){$scope.article=article}),angular.module("bulbsCmsApp").controller("ForbiddenmodalCtrl",function($scope,detail){$scope.detail=detail}),angular.module("bulbsCmsApp").controller("LastmodifiedguardmodalCtrl",function($scope,$modalInstance,_,moment,ContentFactory,articleOnPage,articleOnServer){$scope.articleOnServer=articleOnServer,ContentFactory.all("log").getList({content:articleOnPage.id}).then(function(log){var latest=_.max(log,function(entry){return moment(entry.action_time)}),lastSavedById=latest.user;ContentFactory.one("author",lastSavedById).get().then(function(data){$scope.lastSavedBy=data})}),$scope.loadFromServer=function(){_.each($scope.articleOnServer,function(value,key){$scope.article[key]=value}),$scope.articleIsDirty=!0,$modalInstance.close()},$scope.saveAnyway=function(){$modalInstance.close(),$scope.$parent.postValidationSaveArticle()}}),angular.module("bulbsCmsApp").controller("LineitemexportmodalCtrl",function($scope,$http,CmsConfig,moment){var now=moment().tz(CmsConfig.getTimezoneName());$scope.start=moment([now.year(),now.month()]),$scope.end=moment([now.year(),now.month()+1]),$scope.apiUrl="/cms/api/v1/contributions/line-item-reporting/?format=csv",$scope.updateDownloadUrl=function(){var start_string=$scope.start.format("YYYY-MM-DD"),end_string=$scope.end.format("YYYY-MM-DD");return $scope.apiUrl+"&start="+start_string+"&end="+end_string},$scope.downloadUrl=$scope.updateDownloadUrl(),$scope.$watchCollection("[start, end]",function(){$scope.downloadUrl=$scope.updateDownloadUrl()})}),angular.module("bulbsCmsApp").controller("LoginmodalCtrl",function($scope,Login,$modalInstance,$){$scope.login=function(){var username=$("input[name='username']").val(),password=$("input[name='password']").val();Login.login(username,password).then(function(){$modalInstance.close()},function(){$modalInstance.dismiss()})}}),angular.module("bulbsCmsApp").controller("PubtimemodalCtrl",function($scope,$http,$modal,$modalInstance,$,CmsConfig,moment,Login,article,Raven){$scope.article=article,$scope.pubButton={idle:"Publish",busy:"Publishing",finished:"Published!",error:"Error!"},$scope.$watch("pickerValue",function(newVal){var pubTimeMoment=moment(newVal);$scope.datePickerValue=moment().year(pubTimeMoment.year()).month(pubTimeMoment.month()).date(pubTimeMoment.date()),$scope.timePickerValue=moment().hour(pubTimeMoment.hour()).minute(pubTimeMoment.minute())});var modelDateFormat="YYYY-MM-DDTHH:mmZ";$scope.setTimeShortcut=function(shortcut){if("now"===shortcut){var now=moment();$scope.pickerValue=now}if("midnight"===shortcut){var midnight=moment().hour(24).minute(0);$scope.pickerValue=midnight}},$scope.setDateShortcut=function(shortcut){var today=moment.tz(CmsConfig.getTimezoneName());"today"===shortcut&&($scope.datePickerValue=moment().year(today.year()).month(today.month()).date(today.date())),"tomorrow"===shortcut&&($scope.datePickerValue=moment().year(today.year()).month(today.month()).date(today.date()+1))},$scope.setPubTime=function(){if(!$scope.article.feature_type)return $modalInstance.dismiss(),void $modal.open({templateUrl:"/views/modals/pubtime-validation-modal.html"});var newDate=moment($scope.datePickerValue),newTime=moment($scope.timePickerValue),newDateTime=moment.tz(CmsConfig.getTimezoneName()).year(newDate.year()).month(newDate.month()).date(newDate.date()).hour(newTime.hour()).minute(newTime.minute()).format(modelDateFormat),data={published:newDateTime};return $http({url:"/cms/api/v1/content/"+$scope.article.id+"/publish/",method:"POST",data:data})},$scope.setPubTimeCbk=function(publish_promise){publish_promise.then(function(result){$scope.article.published=result.data.published,$scope.publishSuccessCbk&&$scope.publishSuccessCbk({article:$scope.article,response:result.data}),$modalInstance.close()}).catch(function(reason){Raven.captureMessage("Error Setting Pubtime",{extra:reason.data}),$modalInstance.dismiss()})},$scope.unpubButton={idle:"Unpublish",busy:"Unpublishing",finished:"Unpublished!",error:"Error"},$scope.unpublish=function(){return $http({url:"/cms/api/v1/content/"+$scope.article.id+"/publish/",method:"POST",data:{published:!1}})},$scope.unpublishCbk=function(unpub_promise){unpub_promise.then(function(result){$scope.publishSuccessCbk&&$scope.publishSuccessCbk({article:$scope.article,response:result.data}),$modalInstance.close()}).catch(function(reason){$scope.publishSuccessCbk&&$scope.publishSuccessCbk({article:$scope.article,response:reason.data}),$modalInstance.dismiss()})},$scope.article.published?$scope.pickerValue=moment.tz($scope.article.published,CmsConfig.getTimezoneName()):$scope.setTimeShortcut("now")}),angular.module("bulbsCmsApp").controller("ReportemailmodalCtrl",function($scope,$http,moment){var reportEmailURL="/cms/api/v1/contributor-email/",now=moment().tz("America/Chicago");$scope.monthOptions=moment.monthsShort(),$scope.reportDeadline=now.add(1,"days"),$scope.reportMonth=$scope.monthOptions[now.month()-1],$scope.reportYear=now.year(),$scope.openReportDeadline=function($event){$event.preventDefault(),$event.stopPropagation(),$scope.startReportDeadline=!0};var getReportStart=function(){return moment().month($scope.reportMonth).year($scope.reportYear).startOf("month")};$scope.sendEmail=function(){var data={deadline:$scope.reportDeadline,start:getReportStart()};$http.post(reportEmailURL,data)}}),angular.module("bulbsCmsApp").controller("ReportingCtrl",function($http,$scope,$modal,$window,$,$location,$filter,$interpolate,Login,moment,CmsConfig,ContributionReportingService,ContentReportingService,FreelancePayReportingService){function loadReport(report,start,end,order,apiUrl){if($scope.items=[],"undefined"==typeof apiUrl?$scope.apiURL=report.downloadURL:$scope.apiURL=apiUrl,$scope.apiURL+="?page="+$scope.reportParams.pageNumber,$scope.downloadURL=report.downloadURL+"?format=csv",end){var endParam=$filter("date")(end,"yyyy-MM-dd");$scope.reportParams.end=endParam,$scope.apiURL+="&end="+endParam,$scope.downloadURL+="&end="+endParam}if(start){var startParam=$filter("date")(start,"yyyy-MM-dd");$scope.reportParams.start=startParam,$scope.apiURL+="&start="+startParam,$scope.downloadURL+="&start="+startParam}if(order&&($scope.apiURL+="&ordering="+order.key),$scope.publishedFilter&&($scope.apiURL+="&published="+$scope.publishedFilter,$scope.downloadURL+="&published="+$scope.publishedFilter,$scope.reportParams.published=$scope.publishedFilter),$scope.userFilter&&($scope.apiURL+="&staff="+$scope.userFilter,$scope.downloadURL+="&staff="+$scope.userFilter,$scope.reportParams.staff=$scope.userFilter),$scope.moreFilters)for(var key in $scope.moreFilters)"authors"===$scope.moreFilters[key].type?($scope.apiURL+="&contributors="+$scope.moreFilters[key].query,$scope.downloadURL+="&contributors="+$scope.moreFilters[key].query,$scope.reportParams.contributors=$scope.moreFilters[key].query):($scope.apiURL+="&"+$scope.moreFilters[key].type+"="+$scope.moreFilters[key].query, +$scope.downloadURL+="&"+$scope.moreFilters[key].type+"="+$scope.moreFilters[key].query,$scope.reportParams[$scope.moreFilters[key].type]=$scope.moreFilters[key].query);$http({method:"GET",url:$scope.apiURL}).then(function(data){$scope.items=[],$scope.pageTotal=data.data.count,data.data.results.forEach(function(lineItem){var item=[];report.headings.forEach(function(heading){var exp=$interpolate("{{item."+heading.expression+"}}"),value=exp({item:lineItem});item.push(value)}),$scope.items.push(item)})})}$window.document.title=CmsConfig.getCmsName()+" | Reporting",$scope.userFilter="",$scope.userFilters=[{name:"All",value:""},{name:"Staff",value:"staff"},{name:"Freelance",value:"freelance"}],$scope.publishedFilter="",$scope.publishedFilters=[{name:"All Content",value:""},{name:"Published",value:"published"}],$scope.reports={Contributions:{service:ContributionReportingService,headings:[{title:"Content ID",expression:"content.id"},{title:"Headline",expression:"content.title"},{title:"FeatureType",expression:"content.feature_type"},{title:"Contributor",expression:"user.payroll_name"},{title:"Role",expression:"role"},{title:"Pay",expression:"pay"},{title:"Date",expression:"content.published | date: 'MM/dd/yyyy'"}],downloadURL:"/cms/api/v1/contributions/reporting/",orderOptions:[{label:"Order by User",key:"user"},{label:"Order by Content",key:"content"}]},Content:{service:ContentReportingService,headings:[{title:"Content ID",expression:"id"},{title:"Headline",expression:"title"},{title:"Feature Type",expression:"feature_type"},{title:"Video",expression:"video_id"},{title:"Article Cost",expression:"value"},{title:"Date Published",expression:"published | date: 'MM/dd/yyyy'"}],orderOptions:[],downloadURL:"/cms/api/v1/contributions/contentreporting/"},"Freelance Pay":{service:FreelancePayReportingService,headings:[{title:"Contributor",expression:"contributor.full_name"},{title:"Contribution #",expression:"contributions_count"},{title:"Pay",expression:"pay"},{title:"Payment Date",expression:"payment_date | date: 'MM/dd/yyyy'"}],orderOptions:[],downloadURL:"/cms/api/v1/contributions/freelancereporting/"}},$scope.items=[],$scope.headings=[],$scope.orderOptions=[],$scope.startInitial=moment().startOf("month").format("YYYY-MM-DD"),$scope.endInitial=moment().endOf("month").format("YYYY-MM-DD"),$scope.reportParams={pageNumber:1,start:$scope.startInitial,end:$scope.endInitial},$scope.reportDisabled=!0,$scope.pageTotal=null,$scope.moreFilters=[],$scope.startOpen=!1,$scope.endOpen=!1,$scope.setReport=function($reportingService){$scope.reportDisabled===!0&&($scope.reportDisabled=!1),$scope.reportParams.pageNumber=1,$scope.report=$reportingService},$scope.setUserFilter=function(value){$scope.userFilter=value,loadReport($scope.report,$scope.reportParams.start,$scope.reportParams.end,$scope.orderBy)},$scope.setPublishedFilter=function(value){$scope.publishedFilter=value,"published"===value&&($scope.reportParams.end=moment().format("YYYY-MM-DD")),loadReport($scope.report,$scope.reportParams.start,$scope.reportParams.end,$scope.orderBy)},$scope.openStart=function($event){$event.preventDefault(),$event.stopPropagation(),$scope.startOpen=!0},$scope.openEnd=function($event){$event.preventDefault(),$event.stopPropagation(),$scope.endOpen=!0},$scope.orderingChange=function(){loadReport($scope.report,$scope.reportParams.start,$scope.reportParams.end,$scope.orderBy)},$scope.downloadIsValid=function(){return"undefined"!==$scope.report},$scope.$watch("report",function(report){report&&($scope.orderOptions=report.orderOptions,report.orderOptions.length>0?$scope.orderBy=report.orderOptions[0]:$scope.orderBy=null,$scope.headings=[],report.headings.forEach(function(heading){$scope.headings.push(heading.title)}),loadReport(report,$scope.reportParams.start,$scope.reportParams.end,$scope.orderBy))}),$scope.$watchCollection("[reportParams.start, reportParams.end]",function(params){if($scope.report){var start=params[0],end=params[1];loadReport($scope.report,start,end,$scope.orderBy)}}),$scope.reportEmailModal=function(){return $modal.open({templateUrl:"/views/modals/report-email-modal.html",controller:"ReportemailmodalCtrl"})},$scope.goToPage=function(){loadReport($scope.report,$scope.reportParams.start,$scope.reportParams.end)}}),angular.module("bulbsCmsApp").controller("TargetingCtrl",function($scope,$http,$window,$q,$location,CmsConfig){$window.document.title=CmsConfig.getCmsName()+" | Targeting Editor";var canceller;$scope.search=function(url){url&&("undefined"==typeof canceller?canceller=$q.defer():(canceller.resolve(),canceller=$q.defer()),$http({method:"GET",url:"/ads/targeting",timeout:canceller.promise,params:{url:$scope.url}}).success(function(data){$scope.targetingArray=[];for(var k in data)$scope.targetingArray.push([k,data[k]])}).error(function(data,status,headers,config){404===status&&($scope.targetingArray=[],$scope.targetingArray.push(["",""]))}))},$scope.save=function(){var data={};for(var i in $scope.targetingArray)data[$scope.targetingArray[i][0]]=$scope.targetingArray[i][1];return $http({method:"POST",url:"/ads/targeting?url="+$scope.url,data:data}).success(function(data){$scope.targetingArray=[];for(var k in data)$scope.targetingArray.push([k,data[k]])})},$scope.keyHandler=function(event,url){13===event.keyCode?this.search(url):27===event.keyCode&&(event.currentTarget.value="")};var search=$location.search();search&&search.url&&($scope.url=decodeURIComponent(search.url))}),angular.module("bulbsCmsApp").value("ARTICLE_TEMPORARY_URL_DAYS_VALID",7).controller("TemporaryUrlModalCtrl",function($scope,$routeParams,CmsConfig,ContentFactory,ARTICLE_TEMPORARY_URL_DAYS_VALID,_,moment){var content=ContentFactory.one("content",$routeParams.id);$scope.TEMP_LINK_DAYS_VALID=ARTICLE_TEMPORARY_URL_DAYS_VALID,$scope.TEMP_URL_BASE=CmsConfig.buildUnpublishedUrl(),$scope.tokens=[],content.getList("list_tokens").then(function(tokenList){$scope.tokens=tokenList;var expiredIndicies=[];_.each($scope.tokens,function(token,i){token.create_date=moment(token.create_date),token.expire_date=moment(token.expire_date),moment().isAfter(token.expire_date)?expiredIndicies.push(i):token.daysTillExpire=token.expire_date.diff(moment(),"days")+1});for(var i=expiredIndicies.length-1;i>=0;i--)$scope.tokens.splice(expiredIndicies[i],1)}),$scope.createToken=function(){var now=moment();ContentFactory.one("content",$routeParams.id).post("create_token",{create_date:now,expire_date:now.clone().add({days:ARTICLE_TEMPORARY_URL_DAYS_VALID})}).then(function(token){token.create_date=moment(token.create_date),token.expire_date=moment(token.expire_date),token.daysTillExpire=token.expire_date.diff(moment(),"days")+1,$scope.tokens.push(token),$scope.newestToken=token})}}),angular.module("bulbsCmsApp").controller("ThumbnailModalCtrl",function($scope,BettyCropper,$modalInstance,article){$scope.article=article,$scope.selectCustomThumbnail=function(){BettyCropper.upload().then(function(success){$scope.article.thumbnail_override=success},function(error){console.log(error)},function(progress){console.log(progress)})}}),angular.module("bulbsCmsApp").controller("TrashcontentmodalCtrl",function($scope,$http,$modalInstance,$,Login,articleId,Raven){$scope.deleteButton={idle:"Delete",busy:"Trashing",finished:"Trashed",error:"Error!"},$scope.trashContent=function(){return $http({method:"POST",url:"/cms/api/v1/content/"+articleId+"/trash/"})},$scope.trashCbk=function(trash_promise){trash_promise.then(function(result){console.log("trash success"),$scope.trashSuccessCbk(),$modalInstance.close()}).catch(function(reason){return 404===reason.status?($scope.trashSuccessCbk(),void $modalInstance.close()):(Raven.captureMessage("Error Deleting Article",{extra:reason}),void $modalInstance.dismiss())})}}),angular.module("bulbsCmsApp").controller("UnpublishCtrl",function($scope,$http,$q){$scope.unpubButton={idle:"Unpublish",busy:"Unpublishing",finished:"Unpublished!",error:"Error"},$scope.unpublish=function(){return $http({url:"/cms/api/v1/content/"+$scope.article.id+"/publish/",method:"POST",data:{published:!1}})},$scope.unpublishCbk=function(unpub_promise){unpub_promise.then(function(result){$scope.publishSuccessCbk&&$scope.publishSuccessCbk({article:$scope.article,response:result.data})}).catch(function(reason){$scope.publishSuccessCbk&&$scope.publishSuccessCbk({article:$scope.article,response:reason.data})})}}),angular.module("bulbsCmsApp").controller("VersionBrowserModalCtrl",function($scope,$modalInstance,_,moment,VersionStorageApi,FirebaseApi,CmsConfig){FirebaseApi.$authorize().then(function(){$scope.maxVersions=CmsConfig.getFirebaseMaxArticleHistory()}),VersionStorageApi.$all().then(function(versions){$scope.versions=_.chain(versions).each(function(version){version.timestamp_display=moment(version.timestamp).format("MMM Do YYYY, h:mma")}).sortBy(function(version){return-version.timestamp}).value(),$scope.selectedVersion=$scope.versions[0],$scope.setPreview=function(version){$scope.selectedVersion=version},$scope.restoreSelected=function(){_.each($scope.selectedVersion.content,function(value,key){$scope.article[key]=value}),$scope.articleIsDirty=!0,$modalInstance.close()}})}),angular.module("bulbsCmsApp").controller("VideothumbnailmodalCtrl",function($scope,$http,$modalInstance,CmsConfig,Zencoder,videoId){function compilePosterUrl(thumbnail){return CmsConfig.buildVideoThumbnailUrl(videoId,"thumbnail_"+pad4(thumbnail)+".png")}function pad4(num){var s="0000"+num;return s.substr(s.length-4)}var DEFAULT_THUMBNAIL=4,MAX_THUMBNAIL=19;$scope.uploadedImage={id:null},$scope.mode="still",Zencoder.getVideo(videoId).then(function(response){$scope.video=response.data,"In Progress"===response.data.status?($scope.inProgress=!0,$scope.video.poster=$scope.video.poster||null):$scope.video.poster=$scope.video.poster||compilePosterUrl(DEFAULT_THUMBNAIL)}),$scope.$watch("video.poster",function(){if($scope.video&&$scope.video.poster){var defaultUrl=CmsConfig.buildVideoThumbnailUrl(videoId,"thumbnail_{{thumbnail}}.png"),thumbnailIndex=defaultUrl.indexOf("{{thumbnail}}");0===$scope.video.poster.indexOf(defaultUrl.substr(0,thumbnailIndex))?($scope.currentThumbnail=Number($scope.video.poster.substr(thumbnailIndex,4)),$scope.uploadedImage.id=null):$scope.currentThumbnail=!1}}),$scope.$watch("uploadedImage.id",function(){$scope.uploadedImage.id&&($scope.video.poster=CmsConfig.buildImageApiUrl("16x9",$scope.uploadedImage.id,"1200.jpg"))}),$scope.nextThumb=function(){$scope.video.poster=compilePosterUrl($scope.currentThumbnail0?$scope.currentThumbnail-1:MAX_THUMBNAIL)},$scope.defaultThumb=function(){$scope.video.poster=compilePosterUrl(DEFAULT_THUMBNAIL)},$scope.setPoster=function(){Zencoder.setVideo($scope.video),$modalInstance.close($scope.video.poster)},$scope.reencode=function(){Zencoder.encode(videoId)}}),angular.module("bulbsCmsApp").factory("AdApi",function(Restangular,adApiConfig){return Restangular.withConfig(function(RestangularConfigurer){RestangularConfigurer.setBaseUrl(adApiConfig.baseUrl)})}).constant("adApiConfig",{baseUrl:"/ads"}),angular.module("bulbsCmsApp").factory("BadRequestInterceptor",function($q,$injector){return{responseError:function(rejection){return $injector.invoke(function($modal){if(400===rejection.status){var detail=rejection.data||{something:["Something was wrong with your request."]};$modal.open({templateUrl:"/views/modals/400-modal.html",controller:"BadrequestmodalCtrl",resolve:{detail:function(){return detail}}})}}),$q.reject(rejection)}}}),angular.module("bulbsCmsApp").factory("BugReportInterceptor",function($q,$window,PNotify){return{responseError:function(rejection){if(rejection.status>=500){var stack={animation:!0,dir1:"up",dir2:"left"};new PNotify({title:"You found a bug!",text:"Looks like something just went wrong, and we need your help to fix it! Report it, and we'll make sure it never happens again.",type:"error",confirm:{confirm:!0,align:"left",buttons:[{text:"Report Bug",addClass:"btn-danger pnotify-report-bug",click:function(notice){notice.remove(),$window.showBugReportModal()}},{addClass:"hidden"}]},buttons:{sticker:!1},icon:"fa fa-bug pnotify-error-icon",addclass:"stack-bottomright",stack:stack})}return $q.reject(rejection)}}}),angular.module("bulbsCmsApp").config(function(RestangularProvider,bulbsApiConfig){RestangularProvider.setResponseExtractor(function(response,operation,what,url){var newResponse=response;return"getList"===operation&&"undefined"!=typeof response.results&&(newResponse=response.results,newResponse.metadata={count:response.count,next:response.next,previous:response.previous}),newResponse}),bulbsApiConfig.requestSuffix&&RestangularProvider.setRequestSuffix(bulbsApiConfig.requestSuffix)}).constant("bulbsApiConfig",{requestSuffix:"/"}),angular.module("bulbsCmsApp").factory("CmsNotificationsApi",function($q,ContentFactory){return ContentFactory.service("cms_notifications")}),angular.module("bulbsCmsApp").factory("FirebaseApi",function(FirebaseRefFactory,$firebase,$rootScope,$q,CurrentUserApi,CmsConfig){var rootRef=FirebaseRefFactory.newRef(CmsConfig.buildFirebaseSiteUrl()),authDefer=$q.defer(),$authorize=authDefer.promise;$authorize.catch(function(error){error&&console.error("Firebase login failed:",error)}),CurrentUserApi.getCurrentUserWithCache().then(function(user){"firebase_token"in user&&user.firebase_token?rootRef.auth(user.firebase_token,function(error){error?authDefer.reject(error):authDefer.resolve(rootRef)}):authDefer.reject()});var connectedRef=FirebaseRefFactory.newRef(CmsConfig.buildFirebaseUrl(".info/connected"));connectedRef.on("value",function(connected){connected.val()?$rootScope.$emit("firebase-reconnected"):$rootScope.$emit("firebase-disconnected"),$rootScope.$emit("firebase-connection-state-changed")});var $connection={onConnect:function(callback){return $rootScope.$on("firebase-reconnected",callback),$connection},onDisconnect:function(callback){return $rootScope.$on("firebase-disconnected",callback),$connection},onChange:function(callback){$rootScope.$on("firebase-connection-state-changed",callback)}};return{$authorize:function(){return $authorize},$connection:$connection}}),angular.module("bulbsCmsApp").factory("FirebaseArticleFactory",function($q,$firebase,$routeParams,_,moment,FirebaseApi,CurrentUserApi,CmsConfig){var createArticle=function(rootRef,articleId){var articleRef=rootRef.child("articles/"+articleId),$activeUsers=$firebase(articleRef.child("users")).$asArray(),$versions=$firebase(articleRef.child("versions")).$asArray(),addCurrentUserToActiveUsers=function(){var registeredDeferred=$q.defer(),registeredPromise=registeredDeferred.promise;return CurrentUserApi.getCurrentUserWithCache().then(function(user){var simplifiedUser=_.pick(user,["id","displayName"]);$activeUsers.$add(simplifiedUser).then(function(userRef){userRef.onDisconnect().remove(),registeredDeferred.resolve(simplifiedUser)}).catch(function(error){registeredDeferred.reject(error)})}).catch(function(error){registeredDeferred.reject(error)}),registeredPromise},registerCurrentUserActive=function(){return FirebaseApi.$connection.onConnect(addCurrentUserToActiveUsers),addCurrentUserToActiveUsers()};return{ref:articleRef,$activeUsers:function(){return $activeUsers},$versions:function(){return $versions},$registerCurrentUserActive:registerCurrentUserActive,$createVersion:function(articleData){var createDefer=$q.defer(),$createPromise=createDefer.promise;return CurrentUserApi.getCurrentUserWithCache().then(function(user){var simplifiedUser=_.pick(user,["id","displayName"]),numVersions=$versions.length;numVersions+1>CmsConfig.getFirebaseMaxArticleHistory()&&_.chain($versions).sortBy(function(version){return version.timestamp}).every(function(version){return $versions.$remove(version),numVersions--,numVersions+1>CmsConfig.getFirebaseMaxArticleHistory()});var versionData={timestamp:moment().valueOf(),user:simplifiedUser,content:articleData};$versions.$add(versionData).then(createDefer.resolve).catch(createDefer.reject)}),$createPromise}}};return{$retrieveArticle:function(articleId){var retrieveDeferred=$q.defer(),retrievePromise=retrieveDeferred.promise;return FirebaseApi.$authorize().then(function(rootRef){retrieveDeferred.resolve(createArticle(rootRef,articleId))}).catch(function(error){retrieveDeferred.reject(error)}),retrievePromise},$retrieveCurrentArticle:function(){return this.$retrieveArticle($routeParams.id)}}}),angular.module("bulbsCmsApp").service("FirebaseRefFactory",function(Firebase){return{newRef:function(url){return new Firebase(url)}}}),angular.module("bulbsCmsApp").service("Gettemplate",function($templateCache,$q,$http){this.get=function(templateUrl){var template=$templateCache.get(templateUrl);if(template)return $q.when(template);var deferred=$q.defer();return $http.get(templateUrl,{cache:!0}).success(function(html){$templateCache.put(templateUrl,html),deferred.resolve(html)}),deferred.promise}}),angular.module("bulbsCmsApp").service("IfExistsElse",function($window,$http){this.ifExistsElse=function(restQ,propertiesToValues,existsCbk,elseCbk,errorCbk){restQ.then(function(data){for(var resList=data.results||data,j=0;j0)$modal.open({templateUrl:"/views/modals/login-modal.html",controller:"LoginmodalCtrl"});else{var detail=rejection.data&&rejection.data.detail||"Forbidden";$modal.open({templateUrl:"/views/modals/403-modal.html",controller:"ForbiddenmodalCtrl",resolve:{detail:function(){return detail}}})}}),$q.reject(rejection))}}}),angular.module("bulbsCmsApp").factory("TemporaryUrlModalOpener",function($modal){var modal=null;return{open:function($scope,article){return modal&&modal.close(),modal=$modal.open({templateUrl:"/views/modals/temporary-url-modal.html",controller:"TemporaryUrlModalCtrl",scope:$scope,resolve:{article:function(){return article}}})}}}),angular.module("bulbsCmsApp").factory("VersionStorageApi",function($q,FirebaseApi,FirebaseArticleFactory,LocalStorageBackup,_){var firebaseAvailableDefer=$q.defer(),$firebaseAvailable=firebaseAvailableDefer.promise;FirebaseApi.$authorize().then(function(){firebaseAvailableDefer.resolve(FirebaseArticleFactory.$retrieveCurrentArticle())}).catch(function(){firebaseAvailableDefer.reject()});var _omitter=_.memoize(function(value,key){return _.isFunction(value)||_.find(key,function(c){return"."===c||"#"===c||"$"===c||"/"===c||"["===c||"]"===c})},function(value,key){return[key,value]}),_deepScrub=function(obj){var clone,transValue;return _.isUndefined(obj)?clone=null:_.isPlainObject(obj)?(clone={},_.forOwn(obj,function(value,key){transValue=_deepScrub(value),_omitter(transValue,key)||(clone[key]=transValue)})):_.isArray(obj)?(clone=[],_.each(obj,function(value,key){transValue=_deepScrub(value),_omitter(transValue,key)||clone.push(transValue)})):clone=obj,clone},scrubArticle=function(articleData){return _deepScrub(articleData)};return{$create:function(rawArticleData,articleIsDirty){var articleData=scrubArticle(rawArticleData),createDefer=$q.defer(),createPromise=createDefer.promise;return $firebaseAvailable.then(function($currentArticle){articleIsDirty||$currentArticle.$versions().length<1?$currentArticle.$createVersion(articleData).then(function(versionData){createDefer.resolve(versionData)}).catch(function(){createDefer.reject()}):createDefer.reject()}).catch(function(){LocalStorageBackup.$versions().then(function(versions){articleIsDirty||versions.length<1?LocalStorageBackup.$create(articleData).then(function(versionData){createDefer.resolve(versionData)}).catch(function(error){createDefer.reject(error)}):createDefer.reject()})}),createPromise},$all:function(){var allDefer=$q.defer(),allPromise=allDefer.promise;return $firebaseAvailable.then(function($currentArticle){$currentArticle.$versions().$loaded(function(versions){allDefer.resolve(versions)})}).catch(function(){LocalStorageBackup.$versions().then(function(versions){allDefer.resolve(versions)}).catch(function(error){allDefer.reject(error)})}),allPromise.then(function(versions){return _.sortBy(versions,function(version){return-version.timestamp})})}}}),angular.module("bulbsCmsApp").factory("VersionBrowserModalOpener",function($modal){var modal=null;return{open:function($scope,article){return modal&&modal.close(),modal=$modal.open({templateUrl:"/views/modals/version-browser-modal.html",controller:"VersionBrowserModalCtrl",scope:$scope,size:"lg",resolve:{article:function(){return article}}})}}}),angular.module("bulbsCmsApp").service("Zencoder",function($http,$q,$modal,$){function getNewVideoUploadCredentials(file){var data={name:file.name};data=$.param(data);var newVideoDeferred=$q.defer();return $http({method:"POST",url:newVideoUrl,data:data,headers:{"Content-Type":"application/x-www-form-urlencoded"}}).success(function(data){newVideoDeferred.resolve({file:file,attrs:data})}).error(function(data){newVideoDeferred.reject(data)}),newVideoDeferred.promise}function uploadToS3(videoObject){var s3deferred=$q.defer(),formData=new FormData;return formData.append("key",videoObject.attrs.key),formData.append("AWSAccessKeyId",videoObject.attrs.AWSAccessKeyId),formData.append("acl",videoObject.attrs.acl),formData.append("success_action_status",videoObject.attrs.success_action_status),formData.append("policy",videoObject.attrs.policy),formData.append("signature",videoObject.attrs.signature),formData.append("file",videoObject.file),$.ajax(videoObject.attrs.upload_endpoint,{processData:!1,contentType:!1,data:formData,type:"POST",xhr:function(){var req=$.ajaxSettings.xhr();return req&&req.upload.addEventListener("progress",function(e){var percent=e.loaded/e.total*100;s3deferred.notify(percent)},!1),req},success:function(data){s3deferred.resolve(videoObject)},error:function(data){s3deferred.reject(data)}}),s3deferred.promise}function encode(videoObject){var encodeDeferred=$q.defer();return $http({method:"POST",url:"/video/"+videoObject.attrs.id+"/encode"}).success(function(data){videoObject.attrs.encode_status_endpoints=data,_encodingVideos[videoObject.attrs.id]=videoObject.attrs,encodeDeferred.resolve(videoObject)}).error(function(data){encodeDeferred.reject(data)}),encodeDeferred.promise}var newVideoUrl="/video/new",fileInputId="#bulbs-cms-hidden-video-file-input",inputTemplate='';this.onVideoFileUpload=function(){var clickDeferred=$q.defer();angular.element(fileInputId).remove();var file,fileInput=angular.element(inputTemplate);return angular.element("body").append(fileInput),fileInput.click(),fileInput.unbind("change"),fileInput.bind("change",function(elem){0!==this.files.length?(file=this.files[0],file.size>1073741824&&clickDeferred.reject("Upload file cannot be larger than 1024MB."),0!==file.type.indexOf("video/")&&clickDeferred.reject("You must upload a video file.")):clickDeferred.reject("Please select a file."),getNewVideoUploadCredentials(file).then(uploadToS3).then(encode,angular.noop,function(uploadPercentComplete){clickDeferred.notify(uploadPercentComplete)}).then(function(videoObject){clickDeferred.resolve(videoObject)},function(error){clickDeferred.reject(error)})}),clickDeferred.promise},this.encode=function(videoId){encode({attrs:{id:videoId}})},this.openVideoThumbnailModal=function(videoId){return $modal.open({templateUrl:"/views/modals/video-thumbnail-modal.html",controller:"VideothumbnailmodalCtrl",resolve:{videoId:function(){return videoId}}})},this.getVideo=function(videoId){var url="/video/"+videoId;return $http({method:"GET",url:url})},this.setVideo=function(video){var url="/video/"+video.id,data=$.param(video);return $http({method:"POST",url:url,data:data,headers:{"Content-Type":"application/x-www-form-urlencoded"}})};var _encodingVideos={};this.encodingVideos=_encodingVideos}),angular.module("bulbsCmsApp").filter("truncateByCharacters",function(){return function(input,chars,breakOnWord){if(isNaN(chars))return input;if(chars<=0)return"";if(input&&input.length>=chars){if(input=input.substring(0,chars),breakOnWord)for(;" "===input.charAt(input.length-1);)input=input.substr(0,input.length-1);else{var lastspace=input.lastIndexOf(" ");lastspace!==-1&&(input=input.substr(0,lastspace))}return 1===chars?input+".":input+"..."}return input}}),angular.module("bulbsCmsApp").filter("truncateByWords",function(){return function(input,words){if(isNaN(words))return input;if(words<=0)return"";if(input){var inputWords=input.split(/\s+/);inputWords.length>words&&(input=inputWords.slice(0,words).join(" ")+"...")}return input}}),angular.module("bulbsCmsApp").filter("tzDate",function(dateFilter,moment,CmsConfig){return function(input,format){if(!input)return"";var inDate=moment.tz(input,CmsConfig.getTimezoneName()),newdate=inDate.format("YYYY-MM-DDTHH:mm"),formattedDate=dateFilter(newdate,format);return format.toLowerCase().indexOf("h")>-1&&(formattedDate+=" "+inDate.format("z")),formattedDate}}); +//# sourceMappingURL=scripts.min.js.1475009181079.map \ No newline at end of file diff --git a/dist/scripts/scripts.min.js.1475009181079.map b/dist/scripts/scripts.min.js.1475009181079.map new file mode 100644 index 000000000..540463135 --- /dev/null +++ b/dist/scripts/scripts.min.js.1475009181079.map @@ -0,0 +1 @@ +{"version":3,"sources":["scripts.js"],"names":["w","computeStyle","element","image","selection","scale","selector","id","elementWidth","$","width","elementHeight","height","s_width","x1","x0","s_height","y1","y0","tmp_selection","imageUrl","BC_ADMIN_URL","rules","background-image","background-size","scaleNumber","background-position","background-repeat","createStyle","classname","styleNode","document","createElement","type","className","css","temp","rule","styleSheet","cssText","appendChild","createTextNode","find","append","num","by_scale","Math","floor","computeAspectRatio","_w","_h","aspectRatio","ceil","crop","picturefill","ps","getAttribute","getElementsByTagName","i","il","length","el","div","offsetWidth","offsetHeight","format","remove","ajax","url","headers","X-Betty-Api-Key","BC_API_KEY","Content-Type","undefined","success","proxy","res","imageData","this","padding-bottom","cropDetails","selections","error","background-color","angular","module","constant","window","_","URLify","moment","PNotify","keypress","Raven","OnionEditor","config","$locationProvider","$routeProvider","$sceProvider","html5Mode","when","templateUrl","controller","reloadOnSearch","otherwise","redirectTo","enabled","$provide","$httpProvider","decorator","$delegate","exception","cause","captureException","interceptors","push","run","$rootScope","$http","$cookies","defaults","common","csrftoken","deleteHeaders","delete","factory","Restangular","setBaseUrl","setRequestSuffix","extendModel","obj","extend","getFullName","first_name","last_name","all","extendAuthor","author","contributor","authors","extendCollection","collection","save","data","post","then","contributions","restangularizeCollection","service","withConfig","RestangularConfigurer","user","toString","full_name","username","content","title","published","BettyCropperService","$interpolate","$q","CmsConfig","BettyImage","upload","uploadImageDeferred","defer","fileInputId","fileInput","inputTemplate","click","unbind","bind","e","target","files","reject","file","indexOf","size","FormData","method","buildImageApiUrl","getImageApiKey","X-CSRFToken","transformRequest","identity","transformResponse","headersGetter","parseJSON","resolve","promise","get","detailPatch","name","credit","updateSelection","ratio","detail","BettyImageFactory","Selection","prototype","scaleToFit","fitRatio","thisRatio","scaled","round","getStyles","scaledSelection","position","exp","idStr","segmentedId","substr","base_url","source","SelectionFactory","scaleBy","scaledToFit","value","directive","$scope","BULBS_AUTOCOMPLETE_EVENT_KEYPRESS","AUTOCOMPLETE_BASIC_DEBOUNCE","writables","searchTerm","autocompleteItems","$getItems","searchFunction","map","item","displayFormatter","updateAutocomplete","debounce","results","delayClearAutocomplete","delay","clearAutocomplete","$digest","clearSelectionOverlay","showSelectionOverlay","updateNgModel","onSelect","handleKeypress","$event","keyCode","isEmpty","$broadcast","handleSelect","link","scope","iElement","iAttrs","ngModelCtrl","defaultFormatter","context","valueFormatter","viewValue","itemValueFormatter","modelValue","itemDisplayFormatter","$formatters","$render","selectedValue","$viewValue","$parsers","unbindInitialValue","$watch","initialValue","newValue","isUndefined","copy","$setViewValue","require","restrict","hideSearchIcon","inputId","inputPlaceholder","buildComponentPath","BettyCropper","openImageCropModal","addStyles","editable","hideMetas","placeholderText","onChange","$element","isDefined","caption","alt","bettyImage","console","log","progress","edit","response","setStyles","attrs","imageStyling","parent","ratioWidth","parseInt","split","ratioHeight","newImage","oldImage","equals","resize","removeImage","editImage","$sce","linksList","renderValue","trustAsHtml","isFunction","$window","$timeout","report","reportButton","idle","busy","finished","modalVisible","showThankYou","showModal","dismissModal","sendToWebtech","firstRes","secondRes","thirdRes","location","href","user_agent","navigator","userAgent","sendToWebtechCbk","entry","showBugReportModal","$apply","TunicConfig","uuid4","campaign","isObject","searchCampaigns","buildBackendApiUrl","params","search","uuid","generate","ngModel","isNumber","$modelValue","result","$commitViewValue","label","$location","$routeParams","Campaign","model","$build","isNew","$find","onbeforeunload","$dirty","needsSave","$on","addPixel","pixel","campaign_type","pixels","deletePixel","without","saveModel","$save","$asPromise","path","deferred","getModelId","PIXEL_TYPES","getCmsName","routeId","template","$injector","CmsConfigProvider","invoke","$get","modelFactory","ConfirmationModal","modalBody","modalCancelText","modalOkText","modalOnCancel","modalOnOk","modalTitle","modalInstance","addClass","on","$modal","open","$modalInstance","confirm","$close","cancel","$dismiss","currentUser","pendingGetCurrentUserRequest","parsePayload","payload","cloneDeep","displayName","email","getCurrentUser","buildApiUrlRoot","finally","getCurrentUserWithCache","logout","filter","provider","CustomSearchConfigError","BulbsCmsConfigError","build","checkOrError","test","errorMsg","conditionFieldMappings","conditionTypes","timePeriodMappings","requestCapMs","addConditionField","endpoint","valueStructureName","valueStructureValue","isString","value_structure","addConditionType","addTimePeriod","setRequestCapMs","getConditionFields","getConditionTypes","getRequestCapMs","getTimePeriods","controllerService","onUpdate","CustomSearchService","customSearchService","resetFilters","setPage","setQuery","addedFilterOn","removedFilterOn","$conditionalContentRetrieve","$filterContentByIncluded","$filterContentByExcluded","$retrieveContent","$contentRetrieve","ContentFactory","CustomSearchConfig","fieldTypes","groupsConditionsGet","groupIndex","conditionIndex","field","getList","items","groupsGet","timePeriods","$update","$groupsUpdateResultCountFor","CustomSearch","defaultData","groups","includedIds","excludedIds","pinnedIds","$page","$query","_data","_$getContent","queryData","self","contentQuery","page","query","assign","preview","index","$retrieveGroupCount","count","$result_count","groupsResultCountGet","groupsList","groupsAdd","conditions","time","groupsRemove","splice","groupsClear","groupsConditionsAdd","values","groupsConditionsList","groupsConditionsRemove","groupsTimePeriodSet","groupsTimePeriodGet","groupsTimePeriodRemove","groupsConditionsValuesAdd","matches","existingValue","groupsConditionsValuesClear","groupsConditionsValuesList","groupsConditionsValuesRemove","valueIndex","includesList","includesAdd","uniq","excludesRemove","includesRemove","includesHas","includes","excludesList","excludesAdd","pinsRemove","excludesHas","pinsList","pinsAdd","pinsHas","getPage","getQuery","chain","take","date","isMoment","getDateTimeFormatHumanReadable","tz","getTimezoneName","TIMEZONE_LABEL","dateValid","tempDatetime","isValid","newTime","tempTime","hour","minute","second","modDatetime","timeNowWithOffset","setDate","newDate","newDateAsMoment","year","month","setDateToday","setDateTomorrow","add","setTimeNow","setTimeMidnight","clearDatetime","close","chooseDatetime","retMoment","modalClearText","modalOnBeforeClose","modalOnClear","modalOnClose","retrieveSchema","schema","attr","ctrls","formField","$validators","rgbhex","clearDate","formCtrl","form","integer","FIELD_TYPES_META","Utils","itemOrderingMemory","redoOrdering","v","newItem","readOnly","moveItem","fromIndex","toIndex","moveTo","removeItem","removeFrom","elements","$compile","$form","onValidityChange","internalForm","has","fieldKeys","Object","keys","fields","isArray","includeOnly","intersection","forEach","fieldSchema","fieldMeta","object","invalid","tagName","html","max_length","input","array","boolean","color","datetime","richtext","string","DynamicContentFormError","BulbsCmsError","DynamicContentApi","schemaSrc","validityCallback","catch","errorMessage","event","doPrevent","d","srcElement","toUpperCase","disabled","isContentEditable","preventDefault","Zencoder","safeApply","fn","$$phase","$root","editor","getEditor","replace","read","getContent","defaultValue","formatting","options","role","multiline","placeholder","text","container","domain","linkDomain","searchHandler","linkSearchHandler","statsContainer","inlineObjects","getInlineObjecsPath","insertDialog","editDialog","video","onVideoFileUpload","openVideoThumbnailModal","videoEmbedUrl","buildVideoUrl","hide","setContent","setTimeout","setChangeHandler","$isEmpty","scribe","allowsBlockElements","arguments","updateQueryData","included_ids","excluded_ids","pinned_ids","updateConditionData","article","filters","getAutocompletes","filterInputTimeout","filterInputCounter","autocompleteArray","q","arrowSelect","direction","$toSelect","$entries","$selected","first","prev","next","last","selectEntry","applyFilterChange","filterObject","$input","trigger","getFilterObjects","filterParamsToTypes","tags","feature_types","filterParam","filterType","getQueryToLabelMappings","filterInputValue","queryToLabelMappings","val","triggerHandler","addFilter","clearSearch","clearFilters","removeClass","fadeOut","fadeIn","newFilterValue","contains","deleteFilter","key","toDelete","toSplice","ContentListService","$updateContent","filterObjects","STATES","DONE","PROGRESS","ERROR","doClick","state","clickFunction","disableWhen","cssBtnClassComplete","cssBtnClassError","cssBtnClassProgress","cssIconComplete","textError","textProgress","textComplete","pre","ratios","selectedCrop","cropMode","thumb_container_styles","scaleData","one","Jcrop","allowSelect","allowMove","allowResize","keySupport","jcrop_api","image_url","setThumbStyles","selectCrop","setOptions","setSelect","thumb_styles","padding-top","padding-left","padding-right","jcrop_selection","tellSelect","newSelection","x","x2","y","y2","saveAndQuit","saveAndNext","nextRatioIndex","backdrop","liveBlogEndpoint","liveBlogEntryEndpoint","created","updated","cleanData","omit","createEntry","updateEntry","put","deleteEntry","getEntries","param","liveblog","getLiveBlogAuthorSelectorDirectiveName","oldValue","CurrentUserApi","LiveBlogApi","reportError","message","captureMessage","titleDisplay","headline","clearError","entries","panelOpen","isPanelOpen","togglePanel","collapseAll","expandAll","entryForm","wrapperForm","makeEntryFormName","getEntryForm","isEntryFormSaveDisabled","transactionsLocked","$pristine","lock","buildLock","isLocked","addEntry","now","created_by","updated_by","unshift","saveEntry","oldUpdateBy","oldUpdated","$setPristine","publishAndSave","oldDate","sort","entry1","entry2","entry1IsMoment","entry2IsMoment","isBefore","NOTIFICATIONS_LIST_REL_PATH","Notification","LIST_URL","buildExternalUrl","modelId","Answer","Poll","getPoll","answers","embedCode","validatePublication","endDate","end_date","publishedField","pollForm","endDateField","$setValidity","comesAfterPublishedValid","postPoll","answerPromise","answer","postAnswer","updatePollAnswers","deletedAnswers","updatePoll","newId","addAnswer","notOnSodahead","times","removeAnswer","answerId","deletedAnswer","a","PromotedContentService","pzoneData","getData","moveUp","moveContentUp","moveDown","moveContentDn","$removeContentFromPZone","completeAction","$completeContentAction","stopAction","stopContentAction","markDirty","markDirtySelectedPZone","disableControls","isPZoneRefreshPending","sortableOptions","beforeStop","ui","helper","change","scrollTop","containment","distance","opacity","start","stop","scheduleDateFrom","scheduleDateTo","deleteStatus","isError","$ready","aggregatedOperations","operations","concat","unsavedOperations","removeOperation","operation","$removeOperation","err","clearDeleteStatus","setPreviewTime","operationsStale","isPZoneOperationsStale","refreshingOperations","refreshOperations","$refreshOperations","from","toISOString","to","operationTime","compTime","whenAsMoment","previewTime","groupDateFormat","aggregator","tempAggregate","sortBy","groupBy","pairs","pair","$watchCollection","selectedPZoneName","selectedPZone","changePZone","$refreshPZones","$selectPZone","savePZone","$saveSelectedPZone","clearOperations","clearUnsavedOperations","$refreshSelectedPZone","pageNumber","goToPage","$refreshAllContent","contentIsEnabled","notAlreadyInList","immediateDraggable","isAfter","futureDraggable","beginInsert","beginContentInsert","beginReplace","beginContentReplace","tools","openToolsFor","doOpen","closeTools","toolsOpenFor","_serviceData","allContent","actionContent","action","pzones","setupDefer","readableOperationTypes","INSERT","DELETE","REPLACE","operationTypeToReadable","promotion_insertoperation","promotion_deleteoperation","promotion_replaceoperation","readableToOperationType","reduce","pzoneRefreshPending","pzoneOperationsStale","each","pzone","saved","markSavedSelectedPZone","makeOperationsStale","client_id","apply","$addOperation","props","isPreviewTimeImmediate","isPreviewTimePast","lastId","max","nextId","allProps","type_name","cleanType","applied","content_title","restangularizeElement","findIndex","status","contentId","indexFrom","indexTo","ret","splicer","duplicateIndex","setPreviewTimeToImmediate","contentData","LineItem","LineItemExportModal","utilityButtons","buttonClasses","iconClasses","FeatureType","RateOverride","resourceUrl","$promise","hasOwnProperty","getPaymentType","roleId","roles","payment_type","isFeatureRated","isHourlyRated","isFlatRated","addFeatureType","featureTypes","featureType","rate","getFeatureTypes","extra","getRoles","searchFeatureTypes","simpleSearch","Role","PAYMENT_TYPES","$then","feature_type_rates","$fetch","flat_rates","hourly_rates","rateEditable","paymentTypes","slice","paymentType","getDirtyRates","dirty","flat_rate","hourly_rate","saveDirtyRates","dirtyRates","SECTIONS_LIST_REL_PATH","Section","dateTimeFormatFilter","sendToEditor","notes","SendToEditorApi","modalArticle","modalOnBeforeOpen","statuses","getArticleEditoralStatuses","setupAndOpenModal","note","SPECIAL_COVERAGE_LIST_REL_PATH","SpecialCoverage","ACTIVE_STATES","tunicCampaignIdMapping","$loadTunicCampaign","previewLinkModal","tunicCampaignFormatter","campaignId","number","$searchCampaigns","campaigns","_statuses","setStatuses","getStatuses","StatusFilterOptions","getValue","option","isActive","possibleKeys","pluck","searchKeys","filterByStatus","superFeatureEndpoint","contentEndpoint","createSuperFeature","doctype","getSuperFeaturesType","deleteSuperFeature","sorts","superFeature","cellContent","isSameOrAfter","getSuperFeature","getSuperFeatures","getSuperFeatureRelations","namePlural","updateSuperFeature","updateSuperFeatureRelationsOrdering","relations","remappedRelations","relation","pick","updateAllRelationPublishDates","SuperFeaturesApi","breadcrumbs","addParentToBreadcrumb","StatusFilterOptionsProvider","editPageUrlBuilder","polymorphic_ctype","statusFilterOptions","newRelations","oldRelations","normalizeOrderings","ordering","relationFormPrefix","orderingFormPrefix","makeRelationFormName","makeOrderingFormName","getRelationForm","getOrderingForm","isAtLeastOneRelationFormDirty","isDirty","startsWith","reorder","funcArgs","moveRelation","addRelation","superfeature_type","default_child_type","updateRelationsPublishDates","saveRelation","relationCopy","deleteRelation","requestSuperFeature","Video","superFeatures","addSuperFeature","addSuperFeatureCallback","searchSuperFeature","TEMPLATE_TYPES","templateTypes","content_type","slug","modalBodyBefore","modalBodyAfter","logoHref","itemsDropdownTitle","itemsDropdown","itemsTop","saveFunction","saveDisableWhen","NAV_LOGO","getNavLogoPath","TopBarItem","displayText","displayIconClasses","containerClasses","$parse","restmod","parserWrap","parsed","record","getOrdering","mixin","define","fieldDisplays","getProperty","fieldDisplay","evaluate","API_URL_ROOT","restmodProvider","rebase","$config","style","urlPrefix","mix","plural","primaryKey","init","encode","start_date","decode","startDate","$extend","Model","$search","CustomSearchSettings","Count","countEndpoint","$retrieveResultCount","$create","$response","root","CustomSearchCount","CustomSearchGroupCount","searchEndpoint","jsonRootSingle","$hooks","before-save","_req","groupCountEndpoint","notificationEndpoint","created_on","createdOn","deleteAnswers","deletePromise","answerUrl","putAnswer","oldAnswers","newAnswer","oldAnswer","answer_text","pollId","poll","Error","$filter","clone","cleanPayload","originalPayload","momentToDateString","question_text","pollUrl","getPolls","deletePoll","contributorEndpoint","paymentDate","payment_date","rateOverrideEndpoint","feature_type","before-render","roleEndpoint","hasMany","hooks","after-fetch-many","$owner","$metadata","sectionEndpoint","promoted","after-fetch","$refreshResultCount","Record","$resultCount","INACTIVE","PROMOTED","belongsTo","prefetch","listUrl","mask","videos","belongsToMany","super_features","active","$loadVideosData","after-save","tunicCampaignId","addVideo","added","existingVideo","existingSuperFeature","existingSuperFeatureId","$activeState","activeState","ACTIVE","CustomSearchConfigProvider","ngClipProvider","setContentPartialsPath","setComponentPath","setDateTimeFormatHumanReadable","setDirectivePartialsPath","setSharedPath","setTopBarMapping","setUnpublishedPath","setPath","CmsConfigError","pathBuilder","join","apiUrlRoot","articleEditoralStatuses","autoAddAuthor","componentPath","contentPartialsPath","dateTimeFormatHumanReadable","directivePartialsPath","cmsName","contentApiUrl","externalUrl","firebaseMaxArticleHistory","firebaseSiteRoot","firebaseUrl","imageApiUrl","imageApiKey","inlineObjectsPath","internalUrl","liveBlogAuthorSelectorDirectiveName","navLogoPath","sharedPath","superFeaturesType","timezoneName","topBarMappings","unpublishedPath","videoPath","videoThumbnailUrl","addArticleEditoralStatus","setApiUrlRoot","setAutoAddAuthor","isBoolean","setCmsName","setContentApiUrl","setExternalUrl","setFirebaseMaxArticleHistory","setFirebaseSiteRoot","setFirebaseUrl","setImageApiUrl","setImageApiKey","setInlineObjectsPath","setInternalUrl","setLiveBlogAuthorSelectorDirectiveName","setNavLogoPath","setSuperFeaturesType","setTimezoneName","zone","setVideoPath","setVideoThumbnailUrl","buildContentApiUrl","buildContentPartialsPath","buildDirectivePartialsPath","buildFirebaseSiteUrl","buildFirebaseUrl","buildInternalUrl","buildSharedPath","buildUnpublishedUrl","buildVideoThumbnailUrl","getAutoAddAuthor","getFirebaseMaxArticleHistory","getTopBarMapping","captureStackTrace","constructor","stack","create","call","contentApiConfig","baseUrl","totalItems","updateFilters","addFilters","merge","updateParams","metadata","okCopy","okCopyButton","buttonClassesDefault","buttonClassesSuccess","buttonText","dateStr","m","Date","momentObj","pathJoin","$fieldDisplays","$list","$collection","orderingFilter","searchFilter","toggledFilters","copyContentInContext","toolCopyContent","$retrieve","addParams","loadingResults","allParams","$refresh","searchParameter","filterButtonsParsed","filterButtons","$toggleFilters","sortingField","sortDirection","$sort","$add","cmsEditPageUrl","$remove","$destroy","goToEditPage","activeFilterButton","findWhere","tap","button","showAddButton","getItems","fieldName","cellContents","removedItem","destroyItem","modelFields","modelName","modelNamePlural","apiPath","backendRoot","requestToken","setApiPath","setBackendRoot","setRequestToken","getRequestToken","relUrl","shouldBeIntercepted","urlTest","request","Authorization","slugify","toLowerCase","list","allowOutOfBounds","modIndexTo","sep","RegExp","argsArr","flattenDeep","protocolPrefix","match","locked","wrapper","func","VIDEOHUB_DEFAULT_CHANNEL","videoChannel","addVideoCallback","searchVideos","$postSearch","channel","attrName","hideCaption","addAnImage","uploadImage","onSuccess","onError","alert","onProgress","userNameDisplayFilter","inputLabelText","inputLabelTextSub","labelSub","display","objects","o","t","parents","newauthors","Login","autocomplete_dropdown_template","inputTimeout","inputCounter","autocomplete_list","$elem","dropdown","top","outerHeight","left","minWidth","outerWidth","curDownSelect","curDownSelectNext","curSelect","curSelectNext","selected","onClick","freeForm","cmsNotification","override","fullName","IfExistsElse","saveArticle","contentType","resp","new_id","new_path","rating_type","origin","gotSave","gotTags","gotUser","newArticle","newTitle","tag","ifExistsElse","types","panel","contentTypeLabel","hasClass","focus","pP","tN","cO","$interval","updateEncodeStatuses","updateEncodeStatus","videoid","encodingVideos","encode_status_endpoints","json","job_status","src","idRegex","exec","getVideo","hideLabel","fVal","ft","hideElement","optionsUrl","noPermissionIntercept","$templateCache","Gettemplate","$evalAsync","is","visible","loaded","compiledEl","tElement","tAttrs","view","$observe","imageId","pictureFillElement","show","roleValue","roleOptions","Number","getPromise","saveCbk","colors","colors_tmp","confirmClickWith","prop","save_promise","saveSuccess","reason","where","tagVal","newtags","slides","loadingClass","openImageDrawer","removeLoadingGif","after","complete","new","addTargetingRow","targetingArray","removeTargetingRow","abortUpload","setProgress","req","abort","abortEncode","job_id","videoAttrs","zencoderApiKey","fakeInput","progressEl","lastProgress","abs","progressBar","updateEncodeProgress","api_key","useXDomain","video_id","embedUrl","trustAsUrl","initVideoWidget","uploadVideo","clearVideo","areYouSure","modal","encoding","initialCheckRan","videoUrl","videoId","removeVideo","noop","uploadProgress","thumbnailModal","$animate","transclude","pIndex","select","selectItem","setIndex","labelAttr","$attrs","searchParams","searchParam","menuScope","timeoutId","appendMenu","isMenuAppended","enter","menuEl","styleMenu","reset","leave","offset","getComputedStyle","right","isNaN","inputEl","openMenu","removeAttr","$new","label-attr","which","users","changelog","userIds","unique","valid","postDateValid","postDate","notifyEndDate","notifyEndDateValid","titleValid","cmsNotificationValid","post_date","days","notify_end_date","cmsNotificationDirty","saveCmsNotification","$parent","userIsSuperuser","$saveCmsNotification","newCmsNotification","deleteCmsNotification","$deleteCmsNotification","CmsNotificationsApi","is_superuser","cmsNotifications","removeIndicies","saveDefer","savePromise","updatedCmsNotification","deleteDefer","removeFromList","ipCookie","genCookieKey","updateCmsNotificationsDisplay","dismissCmsNotification","cookieKey","expires","diff","VersionStorageApi","FirebaseApi","FirebaseArticleFactory","VersionBrowserModalOpener","listener","Listener","simple_combo","saveHTML","navbarSave","getArticleCallback","last_saved_article","$connection","onConnect","firebaseConnected","onDisconnect","$retrieveCurrentArticle","$article","savePNotify","$activeUsers","$versions","$loaded","newVersion","version","timestamp","msg","articleIsDirty","mouse_reset","buttons","notice","closer_hover","sticker","activeUsers","group","groupedUser","$registerCurrentUserActive","saveArticleErrorCbk","errors","saveArticleDeferred","saveArticleSuccessCbk","articleIsNew","PARTIALS_URL","contentEditGlobals","canSave","saveArticleIfDirty","saveError","postValidationSaveArticle","last_modified","articleOnPage","articleOnServer","publishSuccessCbk","trashSuccessCbk","history","back","initialize","oneUrl","exclude","myStuff","collapse","ngConfirmClick","clickAction","confirmedClick","$eval","TemporaryUrlModalOpener","trashContentModal","articleId","pubTimeModal","sendToEditorModal","changelogModal","versionBrowserModal","temporaryUrlModal","descriptionModal","getStatus","ContributionRoleService","ContentService","clean","collapsed","getContributions","roleObject","Array","contributionLabels","updateLabel","isFlatRate","contribution","isFeatureType","setFeatureRate","rates","featureTypeRate","isHourly","isManual","getHourlyPay","minutes_worked","newContributions","oldContributions","latest","action_time","lastSavedById","lastSavedBy","loadFromServer","saveAnyway","end","apiUrl","updateDownloadUrl","start_string","end_string","downloadUrl","login","password","dismiss","pubButton","newVal","pubTimeMoment","datePickerValue","timePickerValue","modelDateFormat","setTimeShortcut","shortcut","pickerValue","midnight","setDateShortcut","today","setPubTime","newDateTime","setPubTimeCbk","publish_promise","unpubButton","unpublish","unpublishCbk","unpub_promise","reportEmailURL","monthOptions","monthsShort","reportDeadline","reportMonth","reportYear","openReportDeadline","stopPropagation","startReportDeadline","getReportStart","startOf","sendEmail","deadline","ContributionReportingService","ContentReportingService","FreelancePayReportingService","loadReport","order","apiURL","downloadURL","reportParams","endParam","startParam","publishedFilter","userFilter","staff","moreFilters","contributors","pageTotal","lineItem","headings","heading","expression","userFilters","publishedFilters","reports","Contributions","orderOptions","Content","Freelance Pay","startInitial","endInitial","endOf","reportDisabled","startOpen","endOpen","setReport","$reportingService","setUserFilter","orderBy","setPublishedFilter","openStart","openEnd","orderingChange","downloadIsValid","reportEmailModal","canceller","timeout","k","keyHandler","currentTarget","decodeURIComponent","ARTICLE_TEMPORARY_URL_DAYS_VALID","TEMP_LINK_DAYS_VALID","TEMP_URL_BASE","tokens","tokenList","expiredIndicies","token","create_date","expire_date","daysTillExpire","createToken","newestToken","selectCustomThumbnail","thumbnail_override","deleteButton","trashContent","trashCbk","trash_promise","$authorize","maxVersions","$all","versions","timestamp_display","selectedVersion","setPreview","restoreSelected","compilePosterUrl","thumbnail","pad4","s","DEFAULT_THUMBNAIL","MAX_THUMBNAIL","uploadedImage","mode","inProgress","poster","defaultUrl","thumbnailIndex","currentThumbnail","nextThumb","prevThumb","defaultThumb","setPoster","setVideo","reencode","adApiConfig","responseError","rejection","something","animation","dir1","dir2","align","icon","addclass","RestangularProvider","bulbsApiConfig","setResponseExtractor","what","newResponse","previous","requestSuffix","FirebaseRefFactory","$firebase","rootRef","newRef","authDefer","firebase_token","auth","connectedRef","connected","$emit","callback","createArticle","articleRef","child","$asArray","addCurrentUserToActiveUsers","registeredDeferred","registeredPromise","simplifiedUser","userRef","registerCurrentUserActive","ref","$createVersion","articleData","createDefer","$createPromise","numVersions","every","versionData","valueOf","$retrieveArticle","retrieveDeferred","retrievePromise","Firebase","cache","restQ","propertiesToValues","existsCbk","elseCbk","errorCbk","resList","j","allFieldsMatch","datum","property","keyPrefixArticle","keyPrefix","createPromise","localStorage","setItem","JSON","stringify","keySplit","pickForRemoval","yesterday","subtract","keyTime","retrieveDefer","stored","parse","newCsrf","oldCsrf","jqueryCsrfSetup","LocalStorageBackup","firebaseAvailableDefer","$firebaseAvailable","_omitter","memoize","c","_deepScrub","transValue","isPlainObject","forOwn","scrubArticle","rawArticleData","$currentArticle","allDefer","allPromise","getNewVideoUploadCredentials","newVideoDeferred","newVideoUrl","uploadToS3","videoObject","s3deferred","formData","AWSAccessKeyId","acl","success_action_status","policy","signature","upload_endpoint","processData","xhr","ajaxSettings","addEventListener","percent","total","notify","encodeDeferred","_encodingVideos","clickDeferred","elem","uploadPercentComplete","chars","breakOnWord","substring","charAt","lastspace","lastIndexOf","words","inputWords","dateFilter","inDate","newdate","formattedDate"],"mappings":"CAAC,SAAUA,GAoFP,QAASC,cAAaC,QAASC,MAAOC,WAClC,GAGIC,OAHAC,SAAW,yBAA2BH,MAAMI,GAAK,SACjDC,aAAeC,EAAEH,UAAUI,QAG/BC,cAAiBR,MAAMS,OAAST,MAAMO,MAASF,aAC/CK,QAAUT,UAAUU,GAAKV,UAAUW,GACnCC,SAAWZ,UAAUa,GAAKb,UAAUc,GACpCC,cAAgBf,SAGXS,UAAYG,WAKfH,QAAUL,aACVQ,SAAWL,cACXQ,eACEJ,GAAM,EACNG,GAAM,EACNJ,GAAMD,QACNI,GAAMD,UAIV,IAAII,UAAWpB,EAAEqB,aAAe,IAAMlB,MAAMI,GAAK,oBACjDF,OAAQG,aAAeK,OAEvB,IAAIS,QACAC,mBAAoB,OAASH,SAAU,IACvCI,kBAAmBC,YAAYtB,MAAMO,MAAOL,OAAS,KACrDqB,sBACE,IAAMD,YAAYN,cAAcJ,GAAIV,OAAS,OACvCoB,YAAYN,cAAcD,GAAIb,OAAS,KAC/CsB,oBAAqB,YAEzBC,aAAYtB,SAAUgB,MAAQ,aAAenB,MAAMI,IAGvD,QAASqB,aAAYtB,SAAUgB,MAAOO,WAClC,GAAIC,WAAYC,SAASC,cAAc,QACvCF,WAAUG,KAAO,WACjBH,UAAUI,UAAYL,SACtB,IAAIM,KAAM,GAENC,KAAO,GAAK9B,SAAW,GAC3B,KAAK,GAAI+B,QAAQf,OACbc,MAAQC,KAAO,IAAMf,MAAMe,MAAQ,GAEvCD,OAAQ,IACRD,KAAOC,KAEHN,UAAUQ,WACVR,UAAUQ,WAAWC,QAAUJ,IAE/BL,UAAUU,YAAYT,SAASU,eAAeN,MAElD1B,EAAEsB,UAAUW,KAAK,QAAQC,OAAOb,WAIpC,QAASL,aAAYmB,IAAKC,UACxB,MAAOC,MAAKC,MAAMH,IAAMC,UAI1B,QAASG,oBAAmBC,GAAIC,IAC5B,GAAW,IAAPD,IAAmB,IAAPC,GAAU,CACtB,GAAIC,aAAcL,KAAKM,KAAKH,GAAGC,GAAK,GAEpC,QAAQC,aACJ,IAAK,IACL,IAAK,IACDE,KAAO,KACP,MACJ,KAAK,IACDA,KAAO,KACP,MACJ,KAAK,IACDA,KAAO,KACP,MACJ,KAAK,IACDA,KAAO,MACP,MACJ,KAAK,GACDA,KAAO,KACP,MACJ,KAAK,IACDA,KAAO,KACP,MACJ,SACIA,KAAO,WAEf,MAAOA,MAGP,MAAO,OA3KfrD,EAAEsD,YAAc,SAASpD,SACrB,GAAIqD,GACArD,UAAiD,UAAtCA,QAAQsD,aAAa,aAClCD,IAAMrD,UAGiB,mBAAZA,WACTA,QAAUF,EAAE+B,UAEdwB,GAAKrD,QAAQuD,qBAAsB,OAIrC,KAAK,GAAIC,GAAI,EAAGC,GAAKJ,GAAGK,OAAQF,EAAIC,GAAID,IAAK,CACzC,GAAIG,IAAKN,GAAGG,EACZ,IAAsC,UAAnCG,GAAGL,aAAc,aAApB,CAGA,GAAIM,KAAMD,GAAGJ,qBAAsB,OAAQ,EAC3C,IAA2C,OAAvCI,GAAGL,aAAc,iBAA4B,CAC7C,GAAIjD,IAAKsD,GAAGL,aAAc,iBACtBH,KAAOQ,GAAGL,aAAc,aACxBP,GAAKa,IAAIC,YACTb,GAAKY,IAAIE,YAERX,OAAiB,KAATA,MAAwB,SAATA,OACxBA,KAAOL,mBAAmBC,GAAIC,KAE9BW,GAAGL,aAAa,eAChBS,OAASJ,GAAGL,aAAa,eAGzBS,OAAS,KAGb,IAAI/D,SAAU4D,GACVvD,MACAE,EAAE,cAAgBF,IAAI2D,SACtBzD,EAAE0D,MACEC,IAAKpE,EAAEqB,aAAe,QAAUd,GAChC8D,SACIC,kBAAmBtE,EAAEuE,WACrBC,eAAgBC,QAEpBC,QAASjE,EAAEkE,MAAM,SAAUC,KACvB,GAAIC,WAAYD,GAChB,IAAkB,aAAdE,KAAKzB,KAAqB,CAC1BzB,YAAY,yBAA2BkD,KAAKvE,GAAK,UACzCwE,iBAAqBH,IAAIhE,OAASgE,IAAIlE,MAAS,IAAO,KAC3D,aAAeoE,KAAKvE,GAEvB,IAAIyE,cAAejE,GAAG,EAAGD,GAAG8D,IAAIlE,MAAOQ,GAAG,EAAGD,GAAG2D,IAAIhE,YAGpD,IAAIoE,aAAcH,UAAUI,WAAWH,KAAKzB,KAGhDpD,cAAa6E,KAAK5E,QAAS2E,UAAWG,eACtC9E,QAASA,QAASK,GAAIA,GAAI8C,KAAKA,OACnC6B,MAAOzE,EAAEkE,MAAM,WACO,aAAdG,KAAKzB,MAELzB,YAAY,yBAA2BkD,KAAKvE,GAAK,UAC7CwE,iBAAmB,SACnBI,mBAAmB,sBACpB,aAAeL,KAAKvE,MAE3BA,GAAIA,GAAI8C,KAAKA,eA6GtCyB,MAKHM,QAAQC,OAAO,aAAcC,SAAS,IAAKC,OAAOC,GAClDJ,QAAQC,OAAO,aAAcC,SAAS,SAAUC,OAAOE,QACvDL,QAAQC,OAAO,aAAcC,SAAS,IAAKC,OAAO9E,GAClD2E,QAAQC,OAAO,aAAcC,SAAS,SAAUC,OAAOG,QACvDN,QAAQC,OAAO,cAAeC,SAAS,UAAWC,OAAOI,SACzDP,QAAQC,OAAO,eAAgBC,SAAS,WAAYC,OAAOK,UAC3DR,QAAQC,OAAO,YAAaC,SAAS,QAASC,OAAOM,OACrDT,QAAQC,OAAO,kBAAmBC,SAAS,cAAeC,OAAOO,aAIjEV,QAAQC,OAAO,eACb,wBAEA,0BAGA,wBACA,0BACA,2BACA,mBACA,2BACA,qBACA,8BACA,wBACA,YACA,aACA,UACA,eACA,8BACA,cACA,eACA,SACA,SACA,SACA,SACA,UACA,WACA,QACA,WACA,WACA,YAGA,kBACA,YAEA,gBACA,cACA,YACA,iBACA,mBACA,eACA,mBACA,gBACA,QACA,kBACA,eACA,oBACA,kBACA,WACA,YAEDU,OAAO,SAAUC,kBAAmBC,eAAgBC,cACnDF,kBAAkBG,WAAU,GAE5BF,eACGG,KAAK,kBACJC,YAAa,0BACbC,WAAY,kBACZC,gBAAgB,IAEjBH,KAAK,oCACJC,YAAa,4BACbC,WAAY,sBAEbF,KAAK,mCACJC,YAAa,0BACbC,WAAY,kBACZC,gBAAgB,IAEjBH,KAAK,uBACJC,YAAa,+BACbC,WAAY,kBAEbF,KAAK,+BACJC,YAAa,gCACbC,WAAY,yBAEbF,KAAK,uBACJC,YAAa,wBACbC,WAAY,kBAEbF,KAAK,oBACJC,YAAa,qBACbC,WAAY,cAEbE,WACCC,WAAY,mBAGhBP,aAAaQ,SAAQ,KAEtBX,OAAO,SAAUY,SAAUC,eAC1BD,SAASE,UAAU,oBAAqB,SAAUC,WAChD,MAAO,UAAUC,UAAWC,OAC1BF,UAAUC,UAAWC,OACrBzB,OAAOM,MAAMoB,iBAAiBF,cAIlCH,cAAcM,aAAaC,KAAK,wBAChCP,cAAcM,aAAaC,KAAK,0BAChCP,cAAcM,aAAaC,KAAK,yBAChCP,cAAcM,aAAaC,KAAK,sBAEjCC,IAAI,SAAUC,WAAYC,MAAOC,UAEhCD,MAAME,SAASnD,QAAQoD,OAAO,eAAiBF,SAASG,SACxD,IAAIC,eAAgBL,MAAME,SAASnD,QAAQuD,UAC3CD,eAAc,eAAiBJ,SAASG,UACxCJ,MAAME,SAASnD,QAAQuD,OAASD,gBAGlCvC,QAAQC,OAAO,aAAc,cAAe,WAI5CD,QAAQC,OAAO,aACZwC,QAAQ,gBAAiB,SAAUC,aAUlC,MATAA,aAAYC,WAAW,gBACvBD,YAAYE,iBAAiB,KAC7BF,YAAYG,YAAY,SAAU,SAAUC,KAC1C,MAAO9C,SAAQ+C,OAAOD,KACpBE,YAAa,WACX,MAAOF,KAAIG,WAAa,IAAMH,IAAII,eAIjCR,YAAYS,IAAI,YAK3BnD,QAAQC,OAAO,aACZwC,QAAQ,iBAAkB,SAAUC,aAwCnC,MAvCAA,aAAYC,WAAW,gBACvBD,YAAYE,iBAAiB,KAE7BF,YAAYG,YAAY,UAAW,SAAUC,KAE3C,GAAIM,cAAe,SAAUC,QAC3B,MAAOrD,SAAQ+C,OAAOM,QACpBL,YAAa,WACX,MAAOF,KAAIQ,YAAYL,WAAa,IAAMH,IAAIQ,YAAYJ,aAKhE,KAAK,GAAI5E,KAAKwE,KAAIS,QAChBT,IAAIS,QAAQjF,GAAK8E,aAAaN,IAAIS,QAAQjF,GAE5C,OAAOwE,OAGTJ,YAAYG,YAAY,gBAAiB,SAAUC,KAQjD,MAPIA,MAAOA,IAAIQ,cACbR,IAAIQ,YAActD,QAAQ+C,OAAOD,IAAIQ,aACnCN,YAAa,WACX,MAAOF,KAAIQ,YAAYL,WAAa,IAAMH,IAAIQ,YAAYJ,cAIzDJ,MAGTJ,YAAYc,iBAAiB,gBAAiB,SAAUC,YAMtD,MALAA,YAAWC,KAAO,SAAUC,MAC1B,MAAOF,YAAWG,KAAKD,MAAME,KAAK,SAAUC,eAC1C,MAAOpB,aAAYqB,yBAAyB,gBAAiBD,kBAG1DL,aAGFf,YAAYsB,QAAQ,aAK/BhE,QAAQC,OAAO,aACZwC,QAAQ,0BAA2B,SAAUC,aAC5C,MAAOA,aAAYuB,WAAW,SAAUC,uBACtCA,sBAAsBvB,WAAW,8BACjCuB,sBAAsBtB,iBAAiB,OACtCoB,QAAQ,UAEZvB,QAAQ,0BAA2B,SAAUC,aAC5C,MAAOA,aAAYuB,WAAW,SAAUC,uBACtCA,sBAAsBvB,WAAW,8BACjCuB,sBAAsBtB,iBAAiB,OACtCoB,QAAQ,sBAEZvB,QAAQ,+BAAgC,SAASC,YAAapC,QAC7D,MAAOoC,aAAYuB,WAAW,SAAUC,uBACtCA,sBAAsBvB,WAAW,8BACjCuB,sBAAsBtB,iBAAiB,OACtCoB,QAAQ,wBAEZvB,QAAQ,+BAAgC,SAAUC,YAAapC,QAiB9D,MAfAoC,aAAYG,YAAY,YAAa,SAAUC,KAY7C,MAXAA,KAAIqB,KAAOnE,QAAQ+C,OAAOD,IAAIqB,MAC5BC,SAAU,WACR,MAAOtB,KAAIqB,KAAKE,WAAavB,IAAIqB,KAAKG,YAI1CxB,IAAIyB,QAAUvE,QAAQ+C,OAAOD,IAAIyB,SAC/BH,SAAU,WACR,MAAOtB,KAAIyB,QAAQC,MAAQ,KAAOlE,OAAOwC,IAAIyB,QAAQE,WAAW5F,OAAO,qBAAuB,OAG3FiE,MAGFJ,YAAYuB,WAAW,SAAUC,uBACtCA,sBAAsBvB,WAAW,8BACjCuB,sBAAsBtB,iBAAiB,OACtCoB,QAAQ,eAIf,WAUE,QAASU,qBAAoBxC,MAAOyC,aAAcC,GAAIC,UAAWC,WAAYzJ,GAUzE,QAAS0J,UACP,GAAIC,qBAAsBJ,GAAGK,OAE7BjF,SAAQlF,QAAQoK,aAAapG,QAC7B,IAAIqG,WAAYnF,QAAQlF,QAAQsK,cAgDhC,OA/CApF,SAAQlF,QAAQ,QAAQyC,OAAO4H,WAE/BA,UAAUE,QAEVF,UAAUG,OAAO,UACjBH,UAAUI,KAAK,SAAU,SAAUC,GACH,IAA1BA,EAAEC,OAAOC,MAAMlH,QACjBwG,oBAAoBW,OAAO,6BAE7B,IAAIC,MAAOJ,EAAEC,OAAOC,MAAM,EACU,KAAhCE,KAAK/I,KAAKgJ,QAAQ,WACpBb,oBAAoBW,OAAO,iBAGzBC,KAAKE,KAAO,UACdd,oBAAoBW,OAAO,yBAG7B,IAAIlG,WAAY,GAAIsG,SACpBtG,WAAUlC,OAAO,QAASqI,MAE1B1D,OACE8D,OAAQ,OACRhH,IAAK6F,UAAUoB,iBAAiB,WAChChH,SACEC,kBAAmB2F,UAAUqB,iBAC7B9G,eAAgBC,OAChB8G,cAAe9G,QAEjBsE,KAAMlE,UACN2G,iBAAkBpG,QAAQqG,SAC1BC,kBAAmB,SAAU3C,KAAM4C,eAEb,gBAAT5C,QACTA,KAAOtI,EAAEmL,UAAU7C,MAErB,IAAI5I,OAAQ,GAAI+J,YAAWnB,KAC3B,OAAO5I,UAERuE,QAAQ,SAAUA,SACnB0F,oBAAoByB,QAAQnH,WAC3BQ,MAAM,SAAUA,OACjBkF,oBAAoBW,OAAO7F,WAKxBkF,oBAAoB0B,QAG7B,QAASC,KAAIxL,IACX,MAAO+G,QACL8D,OAAQ,MACRhH,IAAK6F,UAAUoB,iBAAiB,OAAS9K,IACzC8D,SACEC,kBAAmB2F,UAAUqB,iBAC7B9G,eAAgBC,OAChB8G,cAAe9G,QAEjB+G,iBAAkBpG,QAAQqG,SAC1BC,kBAAmB,SAAU3C,KAAM4C,eAIjC,MAHoB,gBAAT5C,QACTA,KAAOtI,EAAEmL,UAAU7C,OAEd,GAAImB,YAAWnB,SAK5B,QAASiD,aAAYzL,GAAI0L,KAAMC,OAAQjH,YACrC,MAAOqC,QACL8D,OAAQ,QACRhH,IAAK6F,UAAUoB,iBAAiB,OAAS9K,IACzC8D,SACEC,kBAAmB2F,UAAUqB,iBAC7B9G,eAAgBC,OAChB8G,cAAe9G,QAEjBsE,MACEkD,KAAMA,KACNC,OAAQA,OACRjH,WAAYA,YAEduG,iBAAkBpG,QAAQqG,SAC1BC,kBAAmB,SAAU3C,KAAM4C,eAIjC,MAHoB,gBAAT5C,QACTA,KAAOtI,EAAEmL,UAAU7C,OAEd,GAAImB,YAAWnB,SAK5B,QAASoD,iBAAgB5L,GAAI6L,MAAOnH,YAClC,MAAOqC,QACL8D,OAAQ,OACRhH,IAAK6F,UAAUoB,iBAAiB,OAAS9K,GAAK,IAAM6L,OACpD/H,SACEC,kBAAmB2F,UAAUqB,iBAC7B9G,eAAgBC,OAChB8G,cAAe9G,QAEjBsE,KAAM9D,aApHV,GAAIqF,aAAc,qCACdE,cAAgB,uIAEpB1F,MAAKqF,OAASA,OACdrF,KAAKiH,IAAMA,IACXjH,KAAKuH,OAASN,IACdjH,KAAKkH,YAAcA,YACnBlH,KAAKqH,gBAAkBA,gBAkH3B,QAASG,mBAAkBvC,aAAczC,MAAO2C,UAAWsC,UAAW9L,GACpE,QAASyJ,YAAWnB,MAClBjE,KAAKvE,GAAKwI,KAAKxI,GACfuE,KAAKmH,KAAOlD,KAAKkD,KACjBnH,KAAKpE,MAAQqI,KAAKrI,MAClBoE,KAAKlE,OAASmI,KAAKnI,OACnBkE,KAAKG,aACL,KAAK,GAAImH,SAASrD,MAAK9D,WACrBH,KAAKG,WAAWmH,OAAS,GAAIG,WAAUxD,KAAK9D,WAAWmH,QAkG3D,MA9FAlC,YAAWsC,UAAUC,WAAa,SAAU/L,MAAOE,QACjD,GAAIP,MACJ,IAAIK,OAASE,OAAQ,CACnB,GAAI8L,UAAWhM,MAAQE,OACnB+L,UAAY7H,KAAKpE,MAAQoE,KAAKlE,MAEhCP,OADEqM,SAAWC,UACL/L,OAASkE,KAAKlE,OAEdF,MAAQoE,KAAKpE,UAGnBA,SACFL,MAAQK,MAAQoE,KAAKpE,OAEnBE,SACFP,MAAQO,OAASkE,KAAKlE,OAG1B,IAAIgM,SACFlM,MAAOoC,KAAK+J,MAAM/H,KAAKpE,MAAQL,OAC/BO,OAAQkC,KAAK+J,MAAM/H,KAAKlE,OAASP,OACjCA,MAAOA,MAET,OAAOuM,SAGT1C,WAAWsC,UAAUM,UAAY,SAAUpM,MAAOE,OAAQwL,OACzC,IAAXxL,SACFA,OAAS,KAGX,IAAIR,WAAY0E,KAAKG,WAAWmH,OAC5BW,gBAAkB3M,UAAUqM,WAAW/L,MAAOE,OAElD,QACEW,mBAAoB,OAASuD,KAAKV,IAAI,WAAY,KAAM,OAAS,IACjE5C,kBAAmBsB,KAAKC,MAAMgK,gBAAgBrM,QAAUN,UAAUM,QAAWoE,KAAKpE,OAAS,KAC3FgB,sBAAuB,IAAMqL,gBAAgBhM,GAAK,OAASgM,gBAAgB7L,GAAK,KAChFN,OAAUmM,gBAAgBnM,SAAW,KACrCF,MAASqM,gBAAgBrM,QAAU,KACnCiB,oBAAqB,YACrBqL,SAAY,aAIhB9C,WAAWsC,UAAUpI,IAAM,SAAUgI,MAAO1L,MAAOuD,QAMjD,IAAK,GALDgJ,KAAMlD,aACR,gEAEEmD,MAAQpI,KAAKvE,GAAGiJ,WAChB2D,YAAc,GACTzJ,EAAI,EAAGA,EAAIwJ,MAAMtJ,OAAQF,IAC5BA,EAAI,IAAM,GAAW,IAANA,IACjByJ,aAAe,KAEjBA,aAAeD,MAAME,OAAO1J,EAAG,EAEjC,OAAOuJ,MACLI,SAAUpD,UAAUoB,mBACpB9K,GAAI4M,YACJf,MAAOA,MACP1L,MAAOA,MACPuD,OAAQA,UAIZiG,WAAWsC,UAAUL,gBAAkB,SAAUC,MAAOhM,WACtD,GAAI2I,OACFhI,GAAIX,UAAUW,GACdD,GAAIV,UAAUU,GACdI,GAAId,UAAUc,GACdD,GAAIb,UAAUa,GAKhB,OAHIb,WAAUkN,SACZvE,KAAKuE,OAASlN,UAAUkN,QAEnBhG,OACL8D,OAAQ,OACRhH,IAAK6F,UAAUoB,iBAAiB,OAASvG,KAAKvE,GAAK,IAAM6L,OACzD/H,SACEC,kBAAmB2F,UAAUqB,iBAC7B9G,eAAgBC,OAChB8G,cAAe9G,QAEjBsE,KAAMA,KACN2C,kBAAmB,SAAU3C,KAAM4C,eAIjC,MAHoB,gBAAT5C,QACTA,KAAOtI,EAAEmL,UAAU7C,QAEbqD,MAAO,GAAIG,WAAUxD,KAAK9D,WAAWmH,aAK5ClC,WAGT,QAASqD,oBACP,QAAShB,WAAUxD,MACjBjE,KAAK/D,GAAKgI,KAAKhI,GACf+D,KAAKhE,GAAKiI,KAAKjI,GACfgE,KAAK5D,GAAK6H,KAAK7H,GACf4D,KAAK7D,GAAK8H,KAAK9H,GACf6D,KAAKwI,OAASvE,KAAKuE,OA2CrB,MAxCAf,WAAUC,UAAU9L,MAAQ,WAC1B,MAAOoE,MAAKhE,GAAKgE,KAAK/D,IAGxBwL,UAAUC,UAAU5L,OAAS,WAC3B,MAAOkE,MAAK7D,GAAK6D,KAAK5D,IAGxBqL,UAAUC,UAAUgB,QAAU,SAAUnN,OACtC,GAAIoN,aAAc,GAAIlB,YACpBxL,GAAI+B,KAAK+J,MAAM/H,KAAK/D,GAAKV,OACzBS,GAAIgC,KAAK+J,MAAM/H,KAAKhE,GAAKT,OACzBa,GAAI4B,KAAK+J,MAAM/H,KAAK5D,GAAKb,OACzBY,GAAI6B,KAAK+J,MAAM/H,KAAK7D,GAAKZ,QAE3B,OAAOoN,cAGTlB,UAAUC,UAAUC,WAAa,SAAU/L,MAAOE,QAEhD,GAAIP,MACJ,IAAIK,OAASE,OAAQ,CACnB,GAAI8L,UAAWhM,MAAQE,OACnB+L,UAAY7H,KAAKpE,QAAUoE,KAAKlE,QAElCP,OADEqM,SAAWC,UACL/L,OAASkE,KAAKlE,SAEdF,MAAQoE,KAAKpE,YAGnBA,SACFL,MAAQK,MAAQoE,KAAKpE,SAEnBE,SACFP,MAAQO,OAASkE,KAAKlE,SAG1B,OAAOkE,MAAK0I,QAAQnN,QAGfkM,UAjSTnH,QAAQC,OAAO,gBACb,wBACA,cACA,WAECwC,QAAQ,YAAa0F,kBACrB1F,QAAQ,aAAcyE,mBACtBlD,QAAQ,eAAgBU,wBAmS7B1E,QAAQC,OAAO,qBACb,wBACA,oBACA,4BACA,WAECqI,MAAM,8BAA+B,KACrCC,UAAU,qBACT,IAAK,YACL,SAAUnI,EAAGyE,WACX,OACE3D,YACE,SAAU,oCACR,8BACF,SAAUsH,OAAQC,kCACdC,6BAEFF,OAAOG,WACLC,WAAY,IAGdJ,OAAOK,oBAEP,IAAIC,WAAY,WACd,MAAON,QAAOO,eAAeP,OAAOG,UAAUC,YAC3C/E,KAAK,SAAUF,MACd,MAAOvD,GAAE4I,IAAIrF,KAAM,SAAUsF,MAC3B,OACEpC,KAAM2B,OAAOU,iBAAiBD,MAC9BX,MAAOW,UAMjBT,QAAOW,mBAAqB/I,EAAEgJ,SAAS,WACjCZ,OAAOG,UAAUC,YACnBE,YAAYjF,KAAK,SAAUwF,SACzBb,OAAOK,kBAAoBQ,WAG9BX,6BAEHF,OAAOc,uBAAyB,WAC9BlJ,EAAEmJ,MAAM,WACNf,OAAOgB,oBACPhB,OAAOiB,WACN,MAGLjB,OAAOgB,kBAAoB,WACzBhB,OAAOG,UAAUC,WAAa,GAC9BJ,OAAOK,sBAGTL,OAAOkB,sBAAwB,WAC7BlB,OAAOgB,oBACPhB,OAAOmB,sBAAuB,EAC9BnB,OAAOoB,gBACPpB,OAAOqB,cAGTrB,OAAOsB,eAAiB,SAAUC,QACT,KAAnBA,OAAOC,QAETxB,OAAOgB,oBACqB,KAAnBO,OAAOC,SAAkB5J,EAAE6J,QAAQzB,OAAOK,mBAEnDL,OAAOW,qBAEPX,OAAO0B,WAAWzB,kCAAmCsB,SAIzDvB,OAAO2B,aAAe,SAAUnP,WAC1BA,WAAawN,OAAOoB,gBACtBpB,OAAOoB,cAAc5O,WACrBwN,OAAOmB,sBAAuB,GAGhCnB,OAAOgB,oBACPhB,OAAOqB,UAAU7O,UAAWA,eAIlCoP,KAAM,SAAUC,MAAOC,SAAUC,OAAQC,aACvC,GAAIC,kBAAmB,SAAUC,SAC/B,MAAOA,SAAQzB,KAWjB,IARAoB,MAAMM,eAAiB,SAAUC,WAC/B,OAAQP,MAAMQ,oBAAsBJ,mBAAoBxB,KAAM2B,aAGhEP,MAAMnB,iBAAmB,SAAU4B,YACjC,OAAQT,MAAMU,sBAAwBN,mBAAoBxB,KAAM6B,cAG9DN,YAAa,CAEfA,YAAYQ,YAAYjJ,KAAK,SAAU+I,YACrC,MAAOT,OAAMnB,iBAAiB4B,cAGhCN,YAAYS,QAAU,WACpBZ,MAAMa,cAAgBV,YAAYW,YAGpCX,YAAYY,SAASrJ,KAAK,SAAU6I,WAClC,MAAOP,OAAMM,eAAeC,YAG9B,IAAIS,oBAAqBhB,MAAMiB,OAAO,eAAgB,WACpDjB,MAAMa,cAAgBb,MAAMkB,cAG9BlB,OAAMT,cAAgB,SAAU5O,WAC9BqQ,oBACA,IAAIG,UAAWpL,EAAEqL,YAAYzQ,WAAa,KAAOgF,QAAQ0L,KAAK1Q,UAAUsN,MACxEkC,aAAYmB,cAAc3L,QAAQ0L,KAAKF,WACvCnB,MAAMa,cAAgBb,MAAMnB,iBAAiBsC,aAInDI,QAAS,WACTC,SAAU,IACVxB,OACEyB,eAAgB,IAChBC,QAAS,IACTC,iBAAkB,IAClBT,aAAc,IACdR,qBAAsB,IACtBF,mBAAoB,IACpBhB,SAAU,IACVd,eAAgB,KAElB9H,YAAa4D,UAAUoH,mBAAmB,kDAOlDjM,QAAQC,OAAO,iBACb,eACA,2BACA,wBACA,uBAECsI,UAAU,iBACT,QAAS,YAAa,eAAgB,qBACtC,SAAUrG,MAAO2C,UAAWqH,aAAcC,oBACxC,OACEN,SAAU,IACV5K,YAAa4D,UAAUoH,mBAAmB,sCAC1C5B,OACE+B,UAAW,IACXC,SAAU,KACVC,UAAW,IACXvR,MAAO,IACPwR,gBAAiB,IACjBvF,MAAO,IACPwF,SAAU,KAEZtL,WAAY,SAAUsH,OAAQiE,UAC5BjE,OAAO6D,UAAWrM,QAAQ0M,UAAUlE,OAAO6D,WAAY7D,OAAO6D,SAC9D7D,OAAOzD,OAAS,SAAUS,GACxB0G,aAAanH,SAASlB,KACpB,SAAUvE,SACRkJ,OAAOzN,OACLI,GAAImE,QAAQnE,GACZwR,QAAS,KACTC,IAAK,MAEPpE,OAAOqE,WAAavN,SAEtB,SAAUQ,OACRgN,QAAQC,IAAIjN,QAEd,SAAUkN,UACRF,QAAQC,IAAIC,aAKlBxE,OAAOyE,KAAO,SAAUzH,GACtB2G,mBAAmB3D,OAAOzN,OAAO8I,KAAK,SAAU9I,OAC7B,OAAbA,MAAMI,GACRqN,OAAOzN,MAAQ,MAEfyN,OAAOzN,MAAQA,MACfmR,aAAavF,IAAI6B,OAAOzN,MAAMI,IAAI0I,KAAK,SAAUqJ,UAC/C1E,OAAOqE,WAAaK,SAASvJ,KAC7B6E,OAAO2E,mBAOjB/C,KAAM,SAAUC,MAAOvP,QAASsS,OAEL/N,SAArBgL,MAAMwC,aACRxC,MAAMwC,WAAa,MAGrBxC,MAAM8C,UAAY,WAChB,GAAI9C,MAAMwC,WACRxC,MAAMgD,aAAehD,MAAMwC,WAAWnF,UAAU5M,QAAQwS,SAAShS,QAAS,KAAM+O,MAAMrD,WACjF,CACL,GAAIuG,YAAaC,SAASnD,MAAMrD,MAAMyG,MAAM,KAAK,GAAI,IACjDC,YAAcF,SAASnD,MAAMrD,MAAMyG,MAAM,KAAK,GAAI,GACtDpD,OAAMgD,cACJtN,mBAAoB,OACpB6H,SAAY,WACZtM,MAASR,QAAQwS,SAAShS,QAC1BE,OAAUkC,KAAKC,MAAM7C,QAAQwS,SAAShS,QAAUoS,YAAcH,YAAc,QAKlFlD,MAAMiB,OAAO,QAAS,SAAUqC,SAAUC,UACpCD,UAAYA,SAASxS,GACvB+Q,aAAavF,IAAIgH,SAASxS,IAAI0I,KAAK,SAAUqJ,UAC3C7C,MAAMwC,WAAaK,SAASvJ,KACvBiK,UAAYJ,SAASN,SAASvJ,KAAKxI,GAAI,MAAQyS,SAASzS,IAC3DkP,MAAMmC,aAGAxM,QAAQ6N,OAAOF,SAAUC,WAEnCvD,MAAMmC,aAIVnC,MAAMiB,OAAO,aAAc,SAAUqC,SAAUC,UAC7CvD,MAAM8C,cACL,GAEHrS,QAAQgT,OAAOzD,MAAM8C,WAErB9C,MAAM0D,YAAc,WAClB1D,MAAMtP,MAAQ,MAGhBsP,MAAM2D,UAAY,WAChB7B,mBAAmB9B,MAAMtP,OACxB8I,KAAK,SAAUvE,SACdwN,QAAQC,IAAIzN,iBAW1BU,QAAQC,OAAO,wBACb,wBACA,gCAECsI,UAAU,cACT,OAAQ,YACR,SAAU0F,KAAMpJ,WACd,OACEwF,OACE6D,UAAW,KAEb9D,KAAM,SAAUC,MAAOvP,QAASsS,OAC9B/C,MAAM8D,YAAc,SAAU7F,OAC5B,MAAO2F,MAAKG,YAAYpO,QAAQqO,WAAW/F,OAASA,QAAUA,SAGlErH,YAAa4D,UAAUoH,mBACrB,aACA,uBAQVjM,QAAQC,OAAO,eACb,qBAECsI,UAAU,eACT,QAAS,UAAW,YACpB,SAAUrG,MAAOoM,QAASzJ,WACxB,OACEgH,SAAU,IACV5K,YAAa4D,UAAUoH,mBAAmB,yCAC1C5B,SACAnJ,WAAY,SAAUsH,OAAQiE,SAAU8B,UACtC/F,OAAOgG,UACPhG,OAAOiG,cACLC,KAAM,SACNC,KAAM,UACNC,SAAU,QACV9O,MAAO,UAGT0I,OAAOqG,cAAe,EACtBrG,OAAOsG,cAAe,EAEtBtG,OAAOuG,UAAY,WACjBvG,OAAOqG,cAAe,GAGxBrG,OAAOwG,aAAe,WACpBxG,OAAOqG,cAAe,EACtBrG,OAAOsG,cAAe,GAGxBtG,OAAOyG,cAAgB,WACrB,GAAIT,QACF,uBAAyBhG,OAAOgG,OAAOU,SAAW,uCACb1G,OAAOgG,OAAOW,UAAY,wCACzB3G,OAAOgG,OAAOY,SAElDzL,MACF6K,OAAQA,OACRxP,IAAKsP,QAAQe,SAASC,KACtBC,WAAYjB,QAAQkB,UAAUC,UAEhC,OAAOvN,OAAM0B,KAAK,0BAA2BD,OAG/C6E,OAAOkH,iBAAmB,SAAUhJ,SAClCA,QACG7C,KAAK,WACJ2E,OAAOsG,cAAe,EACtBP,SAAS,WACP/F,OAAOwG,cACP,KAAK,GAAIW,SAASnH,QAAOgG,OACvBhG,OAAOgG,OAAOmB,OAAS,IAExB,QASTrB,QAAQsB,mBAAqB,WAC3BpH,OAAOqH,OAAOrH,OAAOuG,eAIzB3E,KAAM,SAAUC,MAAOvP,eAS/BkF,QAAQC,OAAO,wBACb,oBACA,wBACA,mBACA,SACA,UAECsI,UAAU,wBACT,QAAS,YAAa,cAAe,QAAS,IAC9C,SAAUrG,MAAO2C,UAAWiL,YAAaC,MAAO3P,GAC9C,OACEc,YACE,SACA,SAAUsH,QAERA,OAAOuC,qBAAuB,SAAUiF,UACtC,GAAI5P,EAAE6P,SAASD,UACb,MAAOA,UAASnJ,KAAO,MAAQmJ,SAAS7U,IAI5CqN,OAAOqC,mBAAqB,SAAUmF,UACpC,MAAO5P,GAAE6P,SAASD,UAAYA,SAAS7U,GAAK,MAG9CqN,OAAO0H,gBAAkB,SAAUtH,YACjC,MAAO1G,OACJyE,IAAImJ,YAAYK,mBAAmB,cAClCC,QAAUC,OAAQzH,cAEjB/E,KAAK,SAAUqJ,UACd,MAAOA,UAASvJ,KAAK0F,aAKjCe,KAAM,SAAUC,MAAOC,SAAUC,OAAQC,aACvCH,MAAMiG,KAAOP,MAAMQ,WAEf/F,cAEFH,MAAMmG,QAAUhG,YAEhBA,YAAYS,QAAU,WAChB7K,EAAEqQ,SAASjG,YAAYkG,eAAiBrG,MAAMkB,cAChDrJ,MACGyE,IAAImJ,YAAYK,mBAAmB,YAAc3F,YAAYkG,YAAc,MAC3E7M,KAAK,SAAU8M,QACdtG,MAAMkB,aAAelB,MAAMU,qBAAqB4F,OAAOhN,SAK/D0G,MAAMR,SAAW,SAAU7O,WACzBwP,YAAYoG,sBAIlB/E,SAAU,IACV5K,YAAa4D,UAAUoH,mBAAmB,oDAC1CL,QAAS,UACTvB,OACEwG,MAAO,6BACPhH,SAAU,qCAQpB7J,QAAQC,OAAO,4BACb,+BACA,eACA,wBACA,8BACA,SACA,uBACA,WAECsI,UAAU,gBAAiB,SAAU1D,WACpC,OACE3D,WAAY,SAAUd,EAAG0Q,UAAWlM,GAAImM,aAAcvI,OAAQwI,UAGpC,QAApBD,aAAa5V,IACfqN,OAAOyI,MAAQD,SAASE,SACxB1I,OAAO2I,OAAQ,GAEf3I,OAAOyI,MAAQD,SAASI,MAAML,aAAa5V,IAG7CgF,OAAOkR,eAAiB,SAAU7L,GAChC,IAAKpF,EAAE6J,QAAQzB,OAAOyI,MAAMK,WAAa9I,OAAO2I,OAAS3I,OAAO+I,UAE9D,MAAO,6BAIX/I,OAAOgJ,IAAI,WAAY,iBAEdrR,QAAOkR,iBAGhB7I,OAAOiJ,SAAW,WAChB,GAAIC,QACF1S,IAAK,GACL2S,cAAe,GAEjBnJ,QAAOyI,MAAMW,OAAO7P,KAAK2P,QAG3BlJ,OAAOqJ,YAAc,SAAUH,OAC7BlJ,OAAOyI,MAAMW,OAASxR,EAAE0R,QAAQtJ,OAAOyI,MAAMW,OAAQF,QAIvDlJ,OAAOuJ,UAAY,WACjB,GAAIrL,QAEJ,IAAI8B,OAAOyI,MAETvK,QAAU8B,OAAOyI,MAAMe,QAAQC,aAAapO,KAAK,SAAUF,MACzDmN,UAAUoB,KAAK,2BAA6BvO,KAAKxI,GAAK,WAEnD,CAEL,GAAIgX,UAAWvN,GAAGK,OAClBkN,UAASxM,SACTe,QAAUyL,SAASzL,QAGrB,MAAOA,WAGXmF,SAAU,IACVxB,OACE+H,WAAY,YAEdnR,YAAa4D,UAAUoH,mBAAmB,mDAMhDjM,QAAQC,OAAO,yCACb,qBAECC,SAAS,gBACR2G,KAAM,UACNyB,MAAO,YAEPzB,KAAM,SACNyB,MAAO,YAERC,UAAU,4BAA6B,SAAU1D,WAChD,OACE3D,WAAY,SAASsH,OAAQ6J,aAC3B7J,OAAO6J,YAAcA,aAEvBxG,SAAU,IACVxB,OACE4G,MAAO,KAEThQ,YAAa4D,UAAUoH,mBAAmB,8FAMhDjM,QAAQC,OAAO,+BACb,0CAKFD,QAAQC,OAAO,kBACb,wBACA,6BAECU,OAAO,SAAUE,gBAChBA,eACCG,KAAK,gCACJE,WAAY,SAAU6P,aAAcvI,OAAQ8F,QAASzJ,WACnDyJ,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,mBAClD9J,OAAO+J,QAAUxB,aAAa5V,IAEhCqX,SAAU,uDACVrR,gBAAgB,MAMtBnB,QAAQC,OAAO,kBACb,+BACA,wBACA,WACA,WAECU,OAAO,SAAU8R,UAAW5R,eAAgB6R,mBAC3C,GAAI7N,WAAY4N,UAAUE,OAAOD,kBAAkBE,KAEnD/R,gBACGG,KAAK,uBACJE,WAAY,SAAUsH,OAAQ8F,QAAS0C,UACrC1C,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,cAClD9J,OAAOqK,aAAe7B,UAExB/P,YAAa4D,UAAUoH,mBAAmB,yDAMlDjM,QAAQC,OAAO,aACb,iBACA,mBAKFD,QAAQC,OAAO,qBACb,4BACA,iBAECsI,UAAU,0BAA2B,SAAUuK,mBAC9C,OACEjH,SAAU,IACVxB,OACE0I,UAAW,IACXC,gBAAiB,IACjBC,YAAa,IACbC,cAAe,IACfC,UAAW,IACXC,WAAY,KAEdhJ,KAAM,SAAUC,MAAOvP,SACrB,GAAIuY,eAAgB,IACpBvY,SAAQwY,SAAS,6BACjBxY,QAAQyY,GAAG,QAAS,WAClBF,cAAgB,GAAIP,mBAAkBzI,aAQhDrK,QAAQC,OAAO,6BACb,wBACA,uBAECwC,QAAQ,oBAAqB,SAAU+Q,OAAQ3O,WAE9C,GAAIiO,mBAAoB,SAAUzI,OAChC,MAAO,UAAWA,OAChBmJ,OACGC,MACCvS,WAAY,SAAUsH,OAAQkL,gBAC5BlL,OAAOmL,QAAU,WACfnL,OAAOoL,SACPpL,OAAO2K,aAGT3K,OAAOqL,OAAS,WACdrL,OAAOsL,WACPtL,OAAO0K,kBAGX7I,MAAOA,MACPpJ,YAAa4D,UAAUoH,mBAAmB,iDAE7C5B,OAGL,OAAOyI,qBAKX9S,QAAQC,OAAO,6BACb,wBACA,WAEC+D,QAAQ,kBACP,IAAK,QAAS,KAAM,YACpB,SAAU5D,EAAG8B,MAAO0C,GAAIC,WAEtB,GAAIkP,aACAC,6BAEAC,aAAe,SAAUC,SAC3B,GAAIvQ,MAAOvD,EAAE+T,UAAUD,QAOvB,OALAvQ,MAAKyQ,YACHzQ,KAAKV,YAAcU,KAAKT,UACrBS,KAAKV,WAAa,IAAMU,KAAKT,UAC7BS,KAAK0Q,OAAS1Q,KAAKW,SAEjBX,MAGL2Q,eAAiB,WAYnB,MAXKN,gCACHA,6BAA+B9R,MAAMyE,IAAI9B,UAAU0P,gBAAgB,QAChE1Q,KAAK,SAAUqJ,UAEd,MADA6G,aAAcE,aAAa/G,SAASvJ,QAGrC6Q,QAAQ,WACPR,6BAA+B,QAI9BA,6BAGT,QACES,wBAAyB,WACvB,MAAIV,aACKnP,GAAG5D,KAAK+S,aAEVO,kBAETI,OAAQ,WACN,MAAOxS,OAAMyE,IAAI9B,UAAU0P,gBAAgB,KAAM,YAC9C1Q,KAAK,WACJkQ,YAAc,YAS5B/T,QAAQC,OAAO,yBACb,4BACA,qCAKFD,QAAQC,OAAO,uCACZ0U,OAAO,mBACN,WAEE,MAAO,UAAUxQ,MACf,MAAKA,MACDA,KAAKE,UACAF,KAAKE,UACHF,KAAKlB,YAAckB,KAAKjB,UAC1BiB,KAAKlB,WAAa,IAAMkB,KAAKjB,UAE7BiB,KAAKG,SANM,OAc5BtE,QAAQC,OAAO,iCACb,WAEC2U,SAAS,sBACR,IACA,SAAUxU,GAER,GAAIyU,yBAA0BC,oBAAoBC,MAAM,sBACpDC,aAAe,SAAU1M,MAAO2M,KAAMC,UACxC,GAAID,KAAK3M,OACP,MAAOA,MAET,MAAM,IAAIuM,yBAAwBK,WAIhCC,0BAEAC,kBAEAC,sBAEAC,aAAe,GAEnB5V,MAAK6V,kBAAoB,SAAU1O,KAAM2O,SACrCC,mBAAoBC,qBAsBtB,MApBAP,wBAAuBpT,MACrB8E,KAAMmO,aACJnO,KAAMzG,EAAEuV,SACR,0CAEFH,SAAUR,aACRQ,SAAUpV,EAAEuV,SACZ,8CAEFC,iBACE/O,KAAMmO,aACJS,mBAAoBrV,EAAEuV,SACtB,0DAEFrN,MAAO0M,aACLU,oBAAqBtV,EAAEuV,SACvB,8DAICjW,MAGTA,KAAKmW,iBAAoB,SAAUhP,KAAMyB,OAWvC,MAVA8M,gBAAerT,MACb8E,KAAMmO,aACJnO,KAAMzG,EAAEuV,SACR,yCAEFrN,MAAO0M,aACL1M,MAAOlI,EAAEuV,SACT,4CAGGjW,MAGTA,KAAKoW,cAAgB,SAAUjP,KAAMyB,OAWnC,MAVA+M,oBAAmBtT,MACjB8E,KAAMmO,aACJnO,KAAMzG,EAAEuV,SACR,sCAEFrN,MAAO0M,aACL1M,MAAOlI,EAAEuV,SACT,yCAGGjW,MAGTA,KAAKqW,gBAAkB,SAAUzN,OAK/B,MAJAgN,cAAeN,aACb1M,MAAOlI,EAAEqQ,SACT,8CAEK/Q,MAGTA,KAAKkT,MACH,WACE,OACEoD,mBAAoB5V,EAAEF,SAASiV,wBAC/Bc,kBAAmB7V,EAAEF,SAASkV,gBAC9Bc,gBAAiB9V,EAAEF,SAASoV,cAC5Ba,eAAgB/V,EAAEF,SAASmV,0BASvCrV,QAAQC,OAAO,sCACb,0BAECsI,UAAU,0BAA2B,SAAU1D,WAC9C,OACEgH,SAAU,IACVxB,OACE4G,MAAO,IACPmF,kBAAmB,IACnBC,SAAU,KAEZpV,YAAa4D,UAAUoH,mBAAmB,+EAMhDjM,QAAQC,OAAO,4BACb,uCAKFD,QAAQC,OAAO,0BACb,wBACA,2BACA,qBACA,uBACA,qCAECsI,UAAU,eAAgB,SAAU1D,WACnC,OACE3D,WAAY,SAAUd,EAAGoI,OAAQ8N,qBAE/B9N,OAAO+N,oBAAsB,GAAID,qBAEjC9N,OAAOgO,aAAe,WACpBhO,OAAO+N,oBAAoBE,QAAQ,GACnCjO,OAAO+N,oBAAoBG,SAAS,IACpClO,OAAOmO,eAAgB,EACvBnO,OAAOoO,iBAAkB,GAG3BpO,OAAOqO,4BAA8B,WAC/BrO,OAAOmO,cAETnO,OAAO+N,oBAAoBO,2BAClBtO,OAAOoO,gBAEhBpO,OAAO+N,oBAAoBQ,2BAG3BvO,OAAO+N,oBAAoBS,oBAI/BxO,OAAOyO,iBAAmB,WACxBzO,OAAO+N,oBAAoBS,mBAC3BxO,OAAO6N,aAGXjM,KAAM,SAASC,MAAOC,SAAUC,OAAQC,aAEtCA,YAAYQ,YAAYjJ,KAAK,SAAU+I,YACrCT,MAAMkM,oBAAoB5S,KAAKmH,YAC/BT,MAAMkM,oBAAoBS,sBAI9BpL,QAAS,UACTC,SAAU,IACVxB,OACEgM,SAAU,KAEZpV,YAAa4D,UAAUoH,mBAAmB,uCAMhDjM,QAAQC,OAAO,0CACb,wBACA,4BACA,oBACA,4BAECsI,UAAU,6BAA8B,SAAU1D,WACjD,OACE3D,WAAY,SAAUd,EAAGwE,GAAI4D,OAAQC,kCACjCyO,eAAgBC,oBAElB3O,OAAO4M,eAAiB+B,mBAAmBlB,oBAC3CzN,OAAO4O,WAAaD,mBAAmBnB,qBAEvCxN,OAAOG,WACLC,WAAY,IAGdJ,OAAOK,qBAEPL,OAAO7E,KAAO6E,OAAO4N,kBAAkBiB,oBAAoB7O,OAAO8O,WAAY9O,OAAO+O,eAErF,IAAIzO,WAAY,WACd,MAAOoO,gBAAe/T,IAAIqF,OAAO7E,KAAK6T,OACnCC,SAASpH,OAAQ7H,OAAOG,UAAUC,aAClC/E,KAAK,SAAU6T,OACd,GAAIF,OAAQpX,EAAE9C,KAAKkL,OAAO4O,WAAY,SAAUva,MAC9C,MAAOA,MAAK2Y,WAAahN,OAAO7E,KAAK6T,OAGvC,OAAOpX,GAAE4I,IAAI0O,MAAO,SAAUzO,MAC5B,OACEpC,KAAMoC,KAAKuO,MAAM5B,gBAAgB/O,MACjCyB,MAAOW,KAAKuO,MAAM5B,gBAAgBtN,YAM5CE,QAAOW,mBAAqB,WACtBX,OAAOG,UAAUC,YACnBE,YAAYjF,KAAK,SAAUwF,SACzBb,OAAOK,kBAAoBQ,WAKjCb,OAAOc,uBAAyB,WAC9BlJ,EAAEmJ,MAAM,WACNf,OAAOgB,oBACPhB,OAAOiB,WACN,MAGLjB,OAAOgB,kBAAoB,WACzBhB,OAAOG,UAAUC,WAAa,GAC9BJ,OAAOK,sBAGTL,OAAOsB,eAAiB,SAAUC,QACT,KAAnBA,OAAOC,QAETxB,OAAOgB,oBAEPhB,OAAO0B,WAAWzB,kCAAmCsB,UAI3D8B,SAAU,IACVxB,OACE+L,kBAAmB,IACnBkB,WAAY,IACZC,eAAgB,IAChBlB,SAAU,IACVvX,OAAQ,KAEVmC,YAAa4D,UAAUoH,mBAAmB;IAMhDjM,QAAQC,OAAO,gCACb,2CAKFD,QAAQC,OAAO,gCACb,wBACA,UAECsI,UAAU,oBAAqB,SAAU1D,WACxC,OACE3D,WAAY,SAAUsH,OAAQ2O,mBAAoBpH,OAChDvH,OAAO7E,KAAO6E,OAAO4N,kBAAkBuB,UAAUnP,OAAO8O,YACxD9O,OAAOoP,YAAcT,mBAAmBhB,iBACxC3N,OAAO8H,KAAOP,MAAMQ,WAEpB/H,OAAOqP,QAAU,WACfrP,OAAO4N,kBAAkB0B,4BAA4BtP,OAAO8O,YAAYzT,KAAK,WAC3E2E,OAAO6N,cAIX7N,OAAO4N,kBAAkB0B,4BAA4BtP,OAAO8O,aAE9DzL,SAAU,IACVxB,OACE+L,kBAAmB,IACnBkB,WAAY,IACZxY,OAAQ,IACRuX,SAAU,KAEZpV,YAAa4D,UAAUoH,mBAAmB,iEAMhDjM,QAAQC,OAAO,sBACb,+BACA,iCAKFD,QAAQC,OAAO,wBACb,wBACA,qCAECwC,QAAQ,sBAAuB,SAAUrC,EAAG2X,aAAcZ,oBAEzD,GAAIa,cACFC,UACAC,eACAC,eACAC,cAQE9B,oBAAsB,SAAU3S,MAElCjE,KAAKiE,KAAKA,MAEVjE,KAAK2Y,MAAQ,EACb3Y,KAAK4Y,OAAS,GAEd5Y,KAAK6E,WA8OP,OA3OA+R,qBAAoBlP,UAAUzD,KAAO,SAAUA,MAQ7C,MANIvD,GAAEqL,YAAY9H,MAChBjE,KAAK6Y,MAAQP,YAEbtY,KAAK6Y,MAAQnY,EAAEgC,SAASuB,KAAMqU,aAGzBtY,KAAK6Y,OAGdjC,oBAAoBlP,UAAUoR,aAAepY,EAAEgJ,SAAS,SAAUqP,WAChE,GAAIC,MAAOhZ,IACX,OAAOqY,cAAaf,iBAAiByB,WAClC5U,KAAK,SAAUF,MACd+U,KAAKnU,QAAUZ,QAElBwT,mBAAmBjB,mBAEtBI,oBAAoBlP,UAAU0P,yBAA2B,WACvD,GAAI6B,eACFT,YAAaxY,KAAK6Y,MAAML,YACxBU,KAAMlZ,KAAK2Y,MACXQ,MAAOnZ,KAAK4Y,OAEd,OAAO5Y,MAAK8Y,aAAaG,eAG3BrC,oBAAoBlP,UAAU2P,yBAA2B,WACvD,GAAI4B,eACFT,YAAaxY,KAAK6Y,MAAMJ,YACxBS,KAAMlZ,KAAK2Y,MACXQ,MAAOnZ,KAAK4Y,OAEd,OAAO5Y,MAAK8Y,aAAaG,eAG3BrC,oBAAoBlP,UAAU4P,iBAAmB,WAC/C,GAAI2B,cAAevY,EAAE0Y,QACnBF,KAAMlZ,KAAK2Y,MACXQ,MAAOnZ,KAAK4Y,OACZS,SAAS,GACRrZ,KAAK6Y,MACR,OAAO7Y,MAAK8Y,aAAaG,eAG3BrC,oBAAoBlP,UAAU0Q,4BAA8B,SAAUkB,OACpE,GAAIN,MAAOhZ,IACX,OAAO,UAAWsZ,OAChB,MAAOjB,cAAakB,oBAAoBP,KAAKH,MAAMN,OAAOe,QACvDnV,KAAK,SAAUqV,OACdR,KAAKH,MAAMN,OAAOe,OAAOG,cAAgBD,SAE5CF,QAGL1C,oBAAoBlP,UAAUgS,qBAAuB,SAAUJ,OAC7D,MAAOtZ,MAAK6Y,MAAMN,OAAOe,OAAOG,eAAiB,GAGnD7C,oBAAoBlP,UAAUiS,WAAa,WACzC,MAAO3Z,MAAK6Y,MAAMN,QAGpB3B,oBAAoBlP,UAAUkS,UAAY,SAAU3V,MAYlD,MAXIvD,GAAEqL,YAAY9H,QAChBA,SAGFA,KAAOvD,EAAEgC,SAASuB,MAChB4V,cACAC,KAAM,KACNL,cAAe,IAGjBzZ,KAAK6Y,MAAMN,OAAOlW,KAAK4B,MAChBA,MAGT2S,oBAAoBlP,UAAUuQ,UAAY,SAAUqB,OAClD,MAAOtZ,MAAK6Y,MAAMN,OAAOe,QAG3B1C,oBAAoBlP,UAAUqS,aAAe,SAAUT,OACrD,MAAOtZ,MAAK6Y,MAAMN,OAAOyB,OAAOV,MAAO,GAAGxa,OAAS,GAGrD8X,oBAAoBlP,UAAUuS,YAAc,WAC1Cja,KAAK6Y,MAAMN,WAGb3B,oBAAoBlP,UAAUwS,oBAAsB,SAAUtC,WAAY3T,MAYxE,MAXIvD,GAAEqL,YAAY9H,QAChBA,SAGFA,KAAOvD,EAAEgC,SAASuB,MAChB6T,MAAOL,mBAAmBnB,qBAAqB,GAAGR,SAClD3Y,KAAMsa,mBAAmBlB,oBAAoB,GAAG3N,MAChDuR,YAGFna,KAAK6Y,MAAMN,OAAOX,YAAYiC,WAAWxX,KAAK4B,MACvCA,MAGT2S,oBAAoBlP,UAAUiQ,oBAAsB,SAAUC,WAAYC,gBACxE,MAAO7X,MAAK6Y,MAAMN,OAAOX,YAAYiC,WAAWhC,iBAGlDjB,oBAAoBlP,UAAU0S,qBAAuB,SAAUxC,YAC7D,MAAO5X,MAAK6Y,MAAMN,OAAOX,YAAYiC,YAGvCjD,oBAAoBlP,UAAU2S,uBAAyB,SAAUzC,WAAYC,gBAC3E,MAAO7X,MAAK6Y,MAAMN,OAAOX,YAAYiC,WAAWG,OAAOnC,eAAgB,GAAG/Y,OAAS,GAGrF8X,oBAAoBlP,UAAU4S,oBAAsB,SAAU1C,YAC5D,GAAIhP,OAAQ6O,mBAAmBhB,iBAAiB,GAAG7N,KAEnD,OADA5I,MAAK6Y,MAAMN,OAAOX,YAAYkC,KAAOlR,MAC9BA,OAGTgO,oBAAoBlP,UAAU6S,oBAAsB,SAAU3C,YAC5D,MAAO5X,MAAK6Y,MAAMN,OAAOX,YAAYkC,MAAQ,MAG/ClD,oBAAoBlP,UAAU8S,uBAAyB,SAAU5C,YAC/D5X,KAAK6Y,MAAMN,OAAOX,YAAYkC,KAAO,MAGvClD,oBAAoBlP,UAAU+S,0BAA4B,SAAU7C,WAAYC,eAAgBjP,OAC9F,GAAIuR,QAASna,KAAK6Y,MAAMN,OAAOX,YAAYiC,WAAWhC,gBAAgBsC,OAClEO,QAAUha,EAAE9C,KAAKuc,OAAQ,SAAUQ,eACrC,MAAOA,eAAcxT,OAASyB,MAAMzB,MAAQwT,cAAc/R,QAAUA,MAAMA,OAGvE8R,UACHP,OAAO9X,KAAKuG,QAIhBgO,oBAAoBlP,UAAUkT,4BAA8B,SAAUhD,WAAYC,gBAChF7X,KAAK6Y,MAAMN,OAAOX,YAAYiC,WAAWhC,gBAAgBsC,WAG3DvD,oBAAoBlP,UAAUmT,2BAA6B,SAAUjD,WAAYC,gBAC/E,MAAO7X,MAAK6Y,MAAMN,OAAOX,YAAYiC,WAAWhC,gBAAgBsC,QAGlEvD,oBAAoBlP,UAAUoT,6BAA+B,SAAUlD,WAAYC,eAAgBkD,YACjG,MAAO/a,MAAK6Y,MAAMN,OAAOX,YAAYiC,WAAWhC,gBAAgBsC,OAAOH,OAAOe,WAAY,GAAGjc,OAAS,GAGxG8X,oBAAoBlP,UAAUsT,aAAe,WAC3C,MAAOhb,MAAK6Y,MAAML,aAGpB5B,oBAAoBlP,UAAUuT,YAAc,SAAUxf,IAEpDuE,KAAK6Y,MAAML,YAAYnW,KAAK5G,IAC5BuE,KAAK6Y,MAAML,YAAc9X,EAAEwa,KAAKlb,KAAK6Y,MAAML,aAG3CxY,KAAKmb,eAAe1f,KAGtBmb,oBAAoBlP,UAAU0T,eAAiB,SAAU3f,IACvDuE,KAAK6Y,MAAML,YAAc9X,EAAE0R,QAAQpS,KAAK6Y,MAAML,YAAa/c,KAG7Dmb,oBAAoBlP,UAAU2T,YAAc,SAAU5f,IACpD,MAAOiF,GAAE4a,SAAStb,KAAK6Y,MAAML,YAAa/c,KAG5Cmb,oBAAoBlP,UAAU6T,aAAe,WAC3C,MAAOvb,MAAK6Y,MAAMJ,aAGpB7B,oBAAoBlP,UAAU8T,YAAc,SAAU/f,IAEpDuE,KAAK6Y,MAAMJ,YAAYpW,KAAK5G,IAC5BuE,KAAK6Y,MAAMJ,YAAc/X,EAAEwa,KAAKlb,KAAK6Y,MAAMJ,aAG3CzY,KAAKob,eAAe3f,IACpBuE,KAAKyb,WAAWhgB,KAGlBmb,oBAAoBlP,UAAUyT,eAAiB,SAAU1f,IACvDuE,KAAK6Y,MAAMJ,YAAc/X,EAAE0R,QAAQpS,KAAK6Y,MAAMJ,YAAahd,KAG7Dmb,oBAAoBlP,UAAUgU,YAAc,SAAUjgB,IACpD,MAAOiF,GAAE4a,SAAStb,KAAK6Y,MAAMJ,YAAahd,KAG5Cmb,oBAAoBlP,UAAUiU,SAAW,WACvC,MAAO3b,MAAK6Y,MAAMH,WAGpB9B,oBAAoBlP,UAAUkU,QAAU,SAAUngB,IAEhDuE,KAAK6Y,MAAMH,UAAUrW,KAAK5G,IAC1BuE,KAAK6Y,MAAMH,UAAYhY,EAAEwa,KAAKlb,KAAK6Y,MAAMH,WAGzC1Y,KAAKmb,eAAe1f,KAGtBmb,oBAAoBlP,UAAU+T,WAAa,SAAUhgB,IACnDuE,KAAK6Y,MAAMH,UAAYhY,EAAE0R,QAAQpS,KAAK6Y,MAAMH,UAAWjd,KAGzDmb,oBAAoBlP,UAAUmU,QAAU,SAAUpgB,IAChD,MAAOiF,GAAE4a,SAAStb,KAAK6Y,MAAMH,UAAWjd,KAG1Cmb,oBAAoBlP,UAAUoU,QAAU,WACtC,MAAO9b,MAAK2Y,OAGd/B,oBAAoBlP,UAAUqP,QAAU,SAAUmC,MAChDlZ,KAAK2Y,MAAQO,MAGftC,oBAAoBlP,UAAUqU,SAAW,WACvC,MAAO/b,MAAK4Y,QAGdhC,oBAAoBlP,UAAUsP,SAAW,SAAUmC,OACjDnZ,KAAK4Y,OAASO,OAGTvC,sBAKXtW,QAAQC,OAAO,8CACb,wBACA,oBACA,8BAECsI,UAAU,kCAAmC,SAAU1D,WACtD,OACE3D,WAAY,SAAUd,EAAGoI,OAAQC,kCAC7ByO,gBAEF1O,OAAOG,WACLC,WAAY,IAGdJ,OAAOK,oBAEP,IAAIC,WAAY,WACd,MAAOoO,gBAAe/T,IAAI,WACvBsU,SAASpH,OAAQ7H,OAAOG,UAAUC,aAClC/E,KAAK,SAAUwF,SACd,MAAOjJ,GAAEsb,MAAMrS,SACZsS,KAAK,IACL3S,IAAI,SAAUC,MACb,OACEpC,KAAM,OAASoC,KAAK9N,GAAK,MAAQ8N,KAAKzE,MACtC8D,MAAOW,KAAK9N,MAGfmN,UAITE,QAAOW,mBAAqB,WACtBX,OAAOG,UAAUC,YACnBE,YAAYjF,KAAK,SAAUwF,SACzBb,OAAOK,kBAAoBQ,WAKjCb,OAAOc,uBAAyB,WAC9BlJ,EAAEmJ,MAAM,WACNf,OAAOgB,oBACPhB,OAAOiB,WACN,MAGLjB,OAAOgB,kBAAoB,WACzBhB,OAAOG,UAAUC,WAAa,GAC9BJ,OAAOK,sBAGTL,OAAOsB,eAAiB,SAAUC,QACT,KAAnBA,OAAOC,QAETxB,OAAOgB,oBAEPhB,OAAO0B,WAAWzB,kCAAmCsB,UAI3D8B,SAAU,IACVxB,OACER,SAAU,KAEZ5I,YAAa4D,UAAUoH,mBAAmB,iGAMhDjM,QAAQC,OAAO,oCACb,+CAKFD,QAAQC,OAAO,gBACb,2BAKFD,QAAQC,OAAO,4BACb,wBACA,SACA,WAEC0U,OAAO,kBACN,IAAK,SAAU,YACf,SAAUvU,EAAGE,OAAQuE,WACnB,MAAO,UAAU+W,KAAM/c,QAErB,MAAKuB,GAAEuV,SAASiG,OAAUtb,OAAOub,SAASD,OAIrCxb,EAAEuV,SAAS9W,UACdA,OAASgG,UAAUiX,kCAGdxb,OAAOyb,GAAGH,KAAM/W,UAAUmX,mBAAmBnd,OAAOA,SAPlD,OAcjBmB,QAAQC,OAAO,sCACb,wBACA,SACA,uBAECiB,WAAW,8BACV,SAAU,iBAAkB,YAAa,SACzC,SAAUsH,OAAQkL,eAAgB7O,UAAWvE,QAE3CkI,OAAOyT,eAAiB3b,OAAOyb,GAAGlX,UAAUmX,mBAAmBnd,OAAO,KAGtE2J,OAAO0T,WAAY,EACnB1T,OAAO8C,OAAO,eAAgB,WAC5B9C,OAAO0T,UAAY1T,OAAO2T,aAAaC,YAIzC5T,OAAO8C,OAAO,WAAY,WACxB,GAAI+Q,SAAU/b,OAAOkI,OAAO8T,SAExBD,SAAQD,YACV5T,OAAO2T,aAAaI,KAAKF,QAAQE,QACjC/T,OAAO2T,aAAaK,OAAQH,QAAQG,UACpChU,OAAO2T,aAAaM,OAAOJ,QAAQI,aAKvCjU,OAAO2T,aAAenc,QAAQ0L,KAAKlD,OAAOkU,aACrClU,OAAO2T,eAEV3T,OAAO2T,aAAe7b,UAExBkI,OAAO8T,SAAWtc,QAAQ0L,KAAKlD,OAAO2T,aAEtC,IAAIQ,mBAAoB,WACtB,MAAOrc,QAAOyb,GAAGlX,UAAUmX,mBAK7BxT,QAAOoU,QAAU,SAAUC,SACzB,GAAIC,iBAAkBxc,OAAOuc,QAC7BrU,QAAO2T,cAAgB3T,OAAO2T,cAAgB7b,UAC3Cyc,KAAKD,gBAAgBC,QACrBC,MAAMF,gBAAgBE,SACtBpB,KAAKkB,gBAAgBlB,SAG1BpT,OAAOyU,aAAe,WACpBzU,OAAOoU,QAAQD,sBAGjBnU,OAAO0U,gBAAkB,WACvB1U,OAAOoU,QAAQD,oBAAoBQ,IAAI,EAAG,SAG5C3U,OAAO4U,WAAa,WAClB5U,OAAO2T,aAAeQ,qBAGxBnU,OAAO6U,gBAAkB,WACvB7U,OAAO2T,aAAeQ,oBACjBJ,KAAK,IACLC,OAAO,GACPC,OAAO,IAGdjU,OAAO8U,cAAgB,WACrB5J,eAAe6J,MAAM,OAGvB/U,OAAOgV,eAAiB,WACtB,GAAIhV,OAAO0T,UAAW,CAEpB,GAAIuB,WAAYnd,OAAOkI,OAAO2T,aAC9BzI,gBAAe6J,MAAME,eAErB3Q,SAAQhN,MAAM,0CAaxBE,QAAQC,OAAO,kCACb,qCACA,wBACA,uBAECsI,UAAU,gCACT,SAAU,KAAM,YAChB,SAAUiL,OAAQ5O,GAAIC,WACpB,OACEgH,SAAU,IACVxB,OACEqT,eAAgB,IAChBzK,YAAa,IACbyJ,YAAa,YACbtJ,WAAY,IACZuK,mBAAoB,IACpBC,aAAc,IACdC,aAAc,KAEhBzT,KAAM,SAAUC,MAAOvP,SACrB,GAAIuY,eAAgB,IACpBvY,SAAQwY,SAAS,mCACjBxY,QAAQyY,GAAG,QAAS,WAElBF,cAAgBG,OACbC,MACCxS,YAAa4D,UAAUoH,mBACrB,kBACA,wBAEF/K,WAAY,6BACZmJ,MAAOA,QAGXgJ,cAAc1C,OACX9M,KAAK,SAAUgZ,SACd,MAAOjY,IAAG5D,KAAKqJ,MAAMsT,oBAAqBd,QAASA,WAChDhZ,KAAK,SAAU8M,QAEVA,UAAW,IACbtG,MAAMqS,YAAcG,QAChBA,QACFxS,MAAMwT,cAAehB,QAASA,UAE9BxS,MAAMuT,2BAa9B5d,QAAQC,OAAO,2BACb,mCAKFD,QAAQC,OAAO,gCACb,0BAEC+D,QAAQ,qBACP,QAAS,YACT,SAAU9B,MAAO2C,WACf,OACEiZ,eAAgB,SAAU9e,KACxB,MAAOkD,QACL8D,OAAQ,UACRhH,IAAKA,WASjBgB,QAAQC,OAAO,+CACb,wBACA,4CACA,+CAECsI,UAAU,kCACT,YACA,SAAU1D,WACR,OACE+G,SAAU,UAAW,UACrBC,SAAU,IACVxB,OACEiG,KAAM,IACNzJ,KAAM,IACN2J,QAAS,IACTuN,OAAQ,KAEV9c,YAAa4D,UAAUoH,mBACrB,kBACA,uBACA,6BACA,qCACA,+CAQVjM,QAAQC,OAAO,6CACb,wBACA,4CACA,+CAECsI,UAAU,gCACT,YACA,SAAU1D,WACR,OACE+G,SAAU,UAAW,UACrBC,SAAU,IACVxB,OACEiG,KAAM,IACNzJ,KAAM,IACN2J,QAAS,IACTuN,OAAQ,KAEV9c,YAAa4D,UAAUoH,mBACrB,kBACA,uBACA,6BACA,mCACA,yCAEF7B,KAAM,SAAUC,MAAOvP,QAASkjB,KAAMC,OACpC,GAAIC,WAAYD,MAAM,GAAG5T,MAAMxD,KAC/BqX,WAAUC,YAAYC,OAAS,SAAUtT,YACvC,OAAKA,YAII,oBAAoBmK,KAAKnK,kBAU9C9K,QAAQC,OAAO,gDACb,2BACA,0BACA,4CACA,6CACA,0BAECsI,UAAU,mCACT,YACA,SAAU1D,WACR,OACE3D,YACE,SACA,SAAUsH,QACRA,OAAOoU,QAAU,SAAUC,SACzBrU,OAAOgI,QAAQhI,OAAO3B,MAAQgW,QAAQhe,UAGxC2J,OAAO6V,UAAY,WACjB7V,OAAOgI,QAAQhI,OAAO3B,MAAQ,QAIpC+E,SAAU,UAAW,UACrBC,SAAU,IACVxB,OACEiG,KAAM,IACNzJ,KAAM,IACN2J,QAAS,IACTuN,OAAQ,KAEV9c,YAAa4D,UAAUoH,mBACrB,kBACA,uBACA,6BACA,uCACA,iDAQVjM,QAAQC,OAAO,6CACb,gBACA,wBACA,wBACA,6CACA,8CAECsI,UAAU,gCACT,YACA,SAAU1D,WAER,OACE+G,SAAU,UAAW,UACrBC,SAAU,IACVxB,OACExD,KAAM,IACN2J,QAAS,IACTuN,OAAQ,KAEV9c,YAAa4D,UAAUoH,mBACrB,kBACA,uBACA,6BACA,mCACA,6CAQVjM,QAAQC,OAAO,8CACb,0BAECsI,UAAU,sCACT,YACA,SAAU1D,WACR,OACEuF,KAAM,SAAUC,MAAOvP,QAASsS,MAAOkR,UACrCjU,MAAMkU,KAAOD,UAEf1S,QAAS,SACTC,SAAU,IACVxB,OACExD,KAAM,IACNkX,OAAQ,KAEV9c,YAAa4D,UAAUoH,mBACrB,kBACA,uBACA,6BACA,0CACA,oDAQVjM,QAAQC,OAAO,6CACb,wBACA,WAECsI,UAAU,qCACT,IAAK,YACL,SAAUnI,EAAGyE,WACX,OACEuF,KAAM,SAAUC,MAAOvP,QAASsS,MAAOkR,UACrCjU,MAAMkU,KAAOD,SAEbjU,MAAMJ,QAAU7J,EAAE6J,SAEpB2B,QAAS,SACTC,SAAU,IACVxB,OACE0B,QAAS,IACTlF,KAAM,IACNkX,OAAQ,KAEV9c,YAAa4D,UAAUoH,mBACrB,kBACA,uBACA,6BACA,yCACA,mDAQVjM,QAAQC,OAAO,+CACb,wBACA,4CACA,+CAECsI,UAAU,kCACT,YACA,SAAU1D,WACR,OACE+G,SAAU,UAAW,UACrBC,SAAU,IACVxB,OACEiG,KAAM,IACNzJ,KAAM,IACN2J,QAAS,IACTuN,OAAQ,KAEV9c,YAAa4D,UAAUoH,mBACrB,kBACA,uBACA,6BACA,qCACA,2CAEF7B,KAAM,SAAUC,MAAOvP,QAASkjB,KAAMC,OACpC,GAAIC,WAAYD,MAAM,GAAG5T,MAAMxD,KAC/BqX,WAAUC,YAAYK,QAAU,SAAU1T,YACxC,OAAKA,YAGI0C,SAAS1C,WAAY,MAAQA,iBAUlD9K,QAAQC,OAAO,+CACb,4CACA,0BAECsI,UAAU,kCACT,YACA,SAAU1D,WAER,OACE+G,QAAS,SACTC,SAAU,IACVxB,OACExD,KAAM,IACNkX,OAAQ,KAEV9c,YAAa4D,UAAUoH,mBACrB,kBACA,uBACA,6BACA,qCACA,+CAQVjM,QAAQC,OAAO,4CACb,6CACA,4CACA,sCACA,wBACA,kBACA,WAECsI,UAAU,+BACT,YAAa,mBAAoB,QACjC,SAAU1D,UAAW4Z,iBAAkBC,OACrC,OACExd,YACE,IAAK,SACL,SAAUd,EAAGoI,QACPpI,EAAEqL,YAAYjD,OAAOgI,QAAQhI,OAAO3B,SACtC2B,OAAOgI,QAAQhI,OAAO3B,UAGxB2B,OAAOmW,sBACPnW,OAAOoW,aAAe,WACpBpW,OAAOmW,mBAAqBnW,OAAOgI,QAAQhI,OAAO3B,MAAMmC,IAAI,SAAU6V,EAAGvgB,GACvE,MAAOA,GAAI,KAGfkK,OAAOoW,eAEPpW,OAAOsW,QAAU,WACXtW,OAAOuW,WAGXvW,OAAOgI,QAAQhI,OAAO3B,MAAM9E,SAC5ByG,OAAOoW,iBAGTpW,OAAOwW,SAAW,SAAUC,UAAWC,SACrCR,MAAMS,OAAO3W,OAAOgI,QAAQhI,OAAO3B,MAAOoY,UAAWC,SAAS,GAE9D1W,OAAOoW,gBAGTpW,OAAO4W,WAAa,SAAUpG,OAC5B0F,MAAMW,WAAW7W,OAAOgI,QAAQhI,OAAO3B,MAAOmS,OAE9CxQ,OAAOoW,kBAIbxU,KAAM,SAAUC,MAAOiV,SAAUlS,MAAO6Q,OACtC5T,MAAMkU,KAAON,MAAM,GAEsB,IAArC5T,MAAMmG,QAAQnG,MAAMxD,MAAMrI,QAC5B6L,MAAMyU,WAGVlT,SAAU,UAAW,UACrBC,SAAU,IACVxB,OACExD,KAAM,IACNkX,OAAQ,IACRvN,QAAS,IACTuO,SAAU,KAEZ9d,YAAa4D,UAAUoH,mBACrB,kBACA,uBACA,6BACA,kCACA,4CAQVjM,QAAQC,OAAO,8CACb,8CACA,4CACA,+CACA,4CACA,2CACA,8CACA,8CACA,+CACA,2CACA,sCACA,wBACA,SACA,UAECsI,UAAU,iCACT,IAAK,WAAY,YAAa,mBAAoB,QAClD,SAAUnI,EAAGmf,SAAU1a,UAAW4Z,iBAAkB1O,OAElD,OACE3F,KAAM,SAAUC,MAAOvP,QAASsS,OAC9B,GAAIoS,OAAQ1kB,QAAQwC,KAAK,UAEzB+M,OAAMiB,OAAO,cAAe,SAAU8Q,SACpC/R,MAAMoV,kBACJrD,QAASA,QACTsD,aAAcrV,MAAMkU,SAIxBlU,MAAMiB,OAAO,SAAU,WACrB,GAAIlL,EAAEuf,IAAItV,MAAM0T,OAAQ,UAAW,CACjC,GAAI6B,WAAYC,OAAOC,KAAKzV,MAAM0T,OAAOgC,OAErC3f,GAAE4f,QAAQ3V,MAAM4V,eAClBL,UAAYxf,EAAE8f,aAAaN,UAAWvV,MAAM4V,cAG9CL,UAAUO,QAAQ,SAAUhlB,IAC1B,GAAIilB,aAAc/V,MAAM0T,OAAOgC,OAAO5kB,IAClCklB,UAAY5B,iBAAiB2B,YAAYvjB,KAEzCuD,GAAEqL,YAAY4U,aAEdA,UADEjgB,EAAEuf,IAAIS,YAAa,UACT3B,iBAAiB6B,OAEjB7B,iBAAiB8B,QAIjC,IAAIC,SAAUH,UAAUG,QACpBC,KAAOzgB,QAAQlF,QAAQ,IAAM0lB,QAAU,MAAQA,QAAU,IAE7DC,MAAKzC,KAAK,OAAQjO,MAAMQ,YACxBkQ,KAAKzC,KAAK,OAAQ7iB,IAClBslB,KAAKzC,KAAK,SAAU,iBAAmB7iB,IACvCslB,KAAKzC,KAAK,QAAS,8BAQf5d,EAAEuV,SAAStL,MAAMxD,MAEnB4Z,KAAKzC,KAAK,WAAY,iBAEtByC,KAAKzC,KAAK,WAAY,WAGxBwB,MAAMjiB,OAAOkjB,MACblB,SAASkB,MAAMpW,YAGlB,IAELuB,QAAS,UACTC,SAAU,IACVxB,OACExD,KAAM,IACNkX,OAAQ,IACRvN,QAAS,IACTiP,iBAAkB,IAClBQ,YAAa,KAEfhf,YAAa4D,UAAUoH,mBACrB,kBACA,uBACA,6BACA,oCACA,8CAQVjM,QAAQC,OAAO,gDACb,wBACA,4CACA,6CACA,gBAECsI,UAAU,mCACT,YACA,SAAU1D,WACR,OACEuF,KAAM,SAAUC,MAAOvP,QAASkjB,KAAMC,OACpC5T,MAAM6T,UAAYD,MAAM,GAAG5T,MAAMxD,OAEnC+E,SAAU,UAAW,UACrBC,SAAU,IACVxB,OACExD,KAAM,IACN2J,QAAS,IACTuN,OAAQ,KAEV9c,YAAa4D,UAAUoH,mBACrB,kBACA,uBACA,6BACA,sCACA,gDAQVjM,QAAQC,OAAO,4CACb,wBACA,4CACA,6CACA,WAECsI,UAAU,+BACT,YACA,SAAU1D,WACR,OACEuF,KAAM,SAAUC,MAAOvP,QAASkjB,KAAMC,OAGpC,GAFA5T,MAAM6T,UAAYD,MAAM,GAAG5T,MAAMxD,MAE7BwD,MAAM0T,OAAO2C,WAAa,EAAG,CAC/B,GAAIC,OAAQ7lB,QAAQwC,KAAK,QACzBqjB,OAAM5jB,IAAI,QAASsN,MAAM0T,OAAO2C,WAAa,MAEzC5lB,QAAQQ,SAAWqlB,MAAMrlB,SAC3BqlB,MAAM5jB,IAAI,QAAS,MAIzB6O,SAAU,UAAW,UACrBC,SAAU,IACVxB,OACEiG,KAAM,IACNzJ,KAAM,IACN2J,QAAS,IACTuN,OAAQ,KAEV9c,YAAa4D,UAAUoH,mBACrB,kBACA,uBACA,6BACA,kCACA,4CAQVjM,QAAQC,OAAO,0CACZC,SAAS,oBACR0gB,OACEJ,QAAS,mCAEXK,SACEL,QAAS,sCAEXM,OACEN,QAAS,oCAEXO,UACEP,QAAS,wCAEXzlB,OACEylB,QAAS,oCAEXD,SACEC,QAAS,sCAEXF,QACEE,QAAS,qCAEXQ,UACER,QAAS,uCAEXS,QACET,QAAS,mCAEXhC,SACEgC,QAAS,wCAMfxgB,QAAQC,OAAO,iCACb,+BACA,6CACA,wBACA,WAECsI,UAAU,sBACT,IAAK,YACL,SAAUnI,EAAGyE,WAEX,GAAIqc,yBAA0BC,cAAcpM,MAAM,qBAC9CvC,SAAW,SAAU3L,MACvB,MAAOhC,WAAUoH,mBACf,kBACA,uBACApF,MAIJ,QACE3F,YACE,SAAU,oBACV,SAAUsH,OAAQ4Y,mBAChB,IAAKhhB,EAAEuV,SAASnN,OAAO6Y,WACrB,KAAM,IAAIH,yBAAwB,iCAGpC,KAAK9gB,EAAE6P,SAASzH,OAAOgI,SACrB,KAAM,IAAI0Q,yBAAwB,2CAGpC1Y,QAAOgK,SAAWA,SAAS,qCAC3BhK,OAAOuV,UACPvV,OAAO8Y,iBAAmB,SAAUlF,SAClC5T,OAAOiX,kBAAmBrD,QAASA,WAGrCgF,kBAAkBtD,eAAetV,OAAO6Y,WACrCxd,KAAK,SAAUqJ,UACd1E,OAAOgK,SAAWA,SAAS,oCAC3BhK,OAAOuV,OAAS7Q,SAASvJ,OAE1B4d,MAAM,WACL/Y,OAAOgK,SAAWA,SAAS,mCAC3BhK,OAAOgZ,aAAe,gCAI9B5V,QAAS,UACTC,SAAU,IACVxB,OACEgX,UAAW,IACX7Q,QAAS,IACTiP,iBAAkB,IAClBQ,YAAa,KAEfzN,SAAU,+CAOlBxS,QAAQC,OAAO,4BACb,kCAKFD,QAAQC,OAAO,4BACb,eACA,2BACA,wBACA,SACA,gBAEC+B,KACC,IACA,SAAU3G,GAORA,EAAEsB,UAAU2I,OAAO,WAAWC,KAAK,UAAW,SAAUkc,OACtD,GAAIC,YAAY,CAChB,IAAsB,IAAlBD,MAAMzX,QAAe,CACvB,GAAI2X,GAAIF,MAAMG,YAAcH,MAAMhc,MAEhCic,YADG,WAAY,SAAS7b,QAAQ8b,EAAEnB,QAAQqB,iBAAmB,GACjDF,EAAE5C,UAAY4C,EAAEG,UACnBH,EAAEI,kBAOXL,WACFD,MAAMO,sBAKbzZ,UAAU,eACT,IAAK,eAAgB,YAAa,cAAe,qBAC/C,WACF,SAAUlN,EAAG6Q,aAAcrH,UAAWnE,YAAayL,mBAC/C8V,UAEF,GAAIC,WAAY,SAAU7X,MAAO8X,IAC3B9X,MAAM+X,SAAW/X,MAAMgY,MAAMD,QAC/BD,KAEA9X,MAAMwF,OAAO,WACXsS,OAKN,QACEjhB,YACE,SACA,SAAUsH,QACRA,OAAO8Z,OAAS,KAEhB5iB,KAAK6iB,UAAY,WACf,MAAO/Z,QAAO8Z,UAIpB1W,QAAS,UACT4W,SAAS,EACT3W,SAAU,IACV5K,YAAa4D,UAAUoH,mBACrB,SACA,iBACA,uBAEF5B,OACEmG,QAAS,KAEXpG,KAAM,SAAUC,MAAOvP,QAASsS,MAAOoD,SAuErC,QAASiS,QACPP,UAAU7X,MAAO,WACf,GAAIoW,MAAOpW,MAAMiY,OAAOI,YACpBjC,QAASkC,eACXlC,KAAO,IAETjQ,QAAQ7E,cAAc8U,QA3E1B,GAAKjQ,QAAL,CAIA,GAAIoS,WACAxV,OAAMwV,aACRA,WAAaxV,MAAMwV,WAAWnV,MAAM,KAGtC,IAAIoV,YACAF,aAAe,EAEA,eAAfvV,MAAM0V,MACRH,aAAe,cACfE,SAEEE,WAAW,EACXH,WAAYA,aAAe,OAAQ,OAAQ,SAAU,aAAc,UAAW,OAAQ,SAAU,aAChGI,aACEC,KAAM7V,MAAM4V,aAAgB,oBAC5BE,UAAW7nB,EAAE,qBAAsBP,QAAQ,IAAI,IAEjDsP,MACE+Y,OAAQ/V,MAAMgW,aAAc,EAE5BC,cAAeljB,OAAOiN,MAAMkW,qBAAsB,GAEpDC,eAAgB,aAChBC,cAAepW,MAAMoW,eAAiB3e,UAAU4e,sBAChD1oB,OACE2oB,aAAcxX,aAAanH,OAC3B4e,WAAYxX,oBAEdyX,OACEF,aAAczB,SAAS4B,kBACvBF,WAAY1B,SAAS6B,wBACrBC,cAAelf,UAAUmf,oBAI7B3oB,EAAE,gCAAiCP,SAASmpB,OAC5CtB,aAAe,GACfE,SAEEE,WAAW,EACXC,aACEC,KAAM7V,MAAM4V,aAAe,aAC3BE,UAAW7nB,EAAE,qBAAsBP,QAAQ,IAAI,IAEjD8nB,WAAYA,iBAIhBvY,MAAMiY,OAAS,GAAI5hB,aAAYrF,EAAE,UAAWP,QAAQ,IAAI,GAAI+nB,SAE5DrS,QAAQvF,QAAU,WAChBZ,MAAMiY,OAAO4B,WAAW1T,QAAQrF,YAAcwX,cAE9CwB,WAAW,WACT9Z,MAAMiY,OAAO8B,iBAAiB3B,SAKlCjS,QAAQ6T,SAAW,SAAU/b,OAC3B,OAASA,OAAS+B,MAAMiY,OAAOgC,OAAOC,uBAAyBjc,QAAUqa,cAc3EtY,MAAMiB,OAAOkF,QAAS,WACpBnG,MAAMiY,OAAO4B,WAAW1T,QAAQrF,YAAcwX,cAC1CxiB,OAAOjC,aACTiC,OAAOjC,YAAYpD,QAAQ,YAUzCkF,QAAQC,OAAO,oBACb,6BAKFD,QAAQC,OAAO,eACb,wBACA,iBAECU,OAAO,SAAU8R,UAAW5R,eAAgB6R,mBAC3C,GAAI7N,WAAY4N,UAAUE,OAAOD,kBAAkBE,KAEnD/R,gBACGG,KAAK,iBACJE,WAAY,SAAUsH,OAAQ8F,SAE5BA,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,SAElD9J,OAAO8C,OAAO,YAAa,WAAcwB,QAAQC,IAAIyX,aAErDhc,OAAOiQ,aACPjQ,OAAOic,gBAAkB,WACvBjc,OAAOiQ,WACLR,SACEsB,aACE/B,MAAO,eACP3a,KAAM,MACNgd,SACEhT,KAAM,cACNyB,MAAO,kCAGXkR,KAAM,UAERkL,cAAe,GACfC,cAAe,GACfC,YAAa,GACbhM,KAAM,EACPC,MAAO,0BAIVrQ,OAAOqc,oBAAsB,WAC3Brc,OAAOiQ,UAAUR,OAAO,GAAGsB,aACzB/B,MAAO,eACP3a,KAAM,MACNgd,SACEhT,KAAM,gBACNyB,MAAO,oCAMfrH,YAAa4D,UAAUoH,mBAAmB,kCAC1C9K,gBAAgB,MAMxBnB,QAAQC,OAAO,4BACb,SACA,yBAECsI,UAAU,kBACT,YACA,SAAU1D,WACR,OACEgH,SAAU,IACVxB,OACEya,QAAS,KAEX7jB,YAAa4D,UAAUoH,mBAAmB,4CAOlDjM,QAAQC,OAAO,kBACb,6BAKFD,QAAQC,OAAO,8BACb,0BAECsI,UAAU,mBAAoB,SAAUnI,EAAG8B,MAAO4O,UAAWvC,SAAUlT,EAAGwJ,WACzE,OACEgH,SAAU,IACVxB,OACE0a,QAAS,KAEX9jB,YAAa4D,UAAUoH,mBAAmB,8CAC1C7B,KAAM,SAAUC,MAAOvP,QAASsS,OAmB9B,QAAS4X,kBAAiB3U,QAGxB,MAFA9B,UAASsF,OAAOoR,oBAChBC,mBAAqB,EACjB7U,OAAO7R,OAAS,GAClB6L,MAAM8a,yBACN9a,OAAMwF,cAIR3N,QACElD,IAAK,6DACLgH,OAAQ,MACRoK,QAASgV,EAAK/U,UACb/Q,QAAQ,SAAUqE,MACnB0G,MAAM8a,kBAAoBxhB,OAsC9B,QAAS0hB,aAAYC,WACnB,GAEIC,WAFAC,SAAW/Y,SAASnP,KAAK,UACzBmoB,UAAYhZ,SAASnP,KAAK,kBAE1BmoB,WAAUjnB,OAAS,GACH,OAAd8mB,YAAsBC,UAAYE,UAAUC,QAAQC,QACtC,SAAdL,YAAwBC,UAAYE,UAAUC,QAAQE,UAExC,OAAdN,YAAsBC,UAAYC,SAASK,QAC7B,SAAdP,YAAwBC,UAAYC,SAASE,UAEnDrb,MAAMyb,YAAYP,WAoDpB,QAASQ,mBAAkBC,cACzBA,aAAapN,KAAO,EACpB9H,UAAUT,OAAO2V,cACjB3b,MAAM8a,qBACNc,OAAOC,QAAQ,QAGjB,QAASC,oBACP,GAAI9V,QAASS,UAAUT,QAEvB,IADAhG,MAAM0a,WACiB,mBAAb,QAAsD,WAA1BjY,SAAQC,IAAI,YAElD,IAAIqZ,sBAAuB7iB,QAAW,SAAU8iB,KAAQ,MAAOC,cAAiB,eAChF,KAAK,GAAIC,eAAeH,qBAAqB,CAC3C,GAAII,YAAaJ,oBAAoBG,YACD,iBAAzBlW,QAAOkW,eAA8BlW,OAAOkW,cAAgBlW,OAAOkW,cAC9E,KAAK,GAAIjoB,KAAK+R,QAAOkW,aAAc,CACjC,GAAIje,OAAQ+H,OAAOkW,aAAajoB,EAChC+L,OAAM0a,QAAQyB,WAAale,QAAUuQ,MAASvQ,MAAOzL,KAAQ0pB,aAC7DE,wBAAwBD,WAAYle,QAGpC+H,OAAOA,SACThG,MAAMqc,iBAAmBrW,OAAOA,QAUpC,QAASoW,yBAAwB5pB,KAAMgc,OAMrCxO,MAAMsc,qBAAuBtc,MAAMsc,yBAE/B9N,QAASxO,OAAMsc,sBAEnBzkB,OACElD,IAAK,4BAA8BnC,KACnCmJ,OAAQ,MACRoK,QAASgV,EAAKvM,SACbvZ,QAAQ,SAAUqE,MACnB,IAAK,GAAIrF,KAAKqF,MACZ0G,MAAMsc,qBAAqBhjB,KAAKrF,GAAGgK,OAAS3E,KAAKrF,GAAGuI,OAtL1D,GAAI4F,UAAWpR,EAAEP,SACbmrB,OAASxZ,SAASnP,KAAK,QAE3B+M,OAAM8a,oBAEN,IAA4BF,oBAAxBC,mBAAqB,CAEzBe,QAAO1S,GAAG,QAAS,SAAU/N,GAC3B,GAAI6K,QAAS4V,OAAOW,KACpBvc,OAAMzB,WAAayH,OAEnB9B,SAASsF,OAAOoR,oBAChBA,mBAAqB1W,SAAS,WAAcyW,iBAAiB3U,SAAY,KAErE6U,mBAAqB,GACvBF,iBAAiB3U,UAqBrB4V,OAAO1S,GAAG,QAAS,SAAU/N,GACT,KAAdA,EAAEwE,SAAkBqb,YAAY,MAClB,KAAd7f,EAAEwE,SAAkBqb,YAAY,QAClB,KAAd7f,EAAEwE,UACAyC,SAASnP,KAAK,aAAakB,OAAS,EAGtC+P,SAAS,WACPvO,QAAQlF,QAAQ,iBAAiB+rB,eAAe,UAC/C,GAEHxc,MAAMyc,UAAU,SAAUb,OAAOW,UAKvCvc,MAAMgG,OAAS,WACbhG,MAAMyc,UAAU,SAAUzc,MAAMqc,mBAGlCrc,MAAM0c,YAAc,WAClB1c,MAAMqc,iBAAmB,IAG3Brc,MAAM2c,aAAe,WAGnB,MAFA3c,OAAM0a,WACN1a,MAAMqc,iBAAmB,GAClBX,uBAGTtZ,SAAS8G,GAAG,YAAa,SAAU,WACjClJ,MAAMyb,YAAYpmB,QAgBpB2K,MAAMyb,YAAc,SAAUnW,OAC5BlD,SAASnP,KAAK,aAAa2pB,YAAY,YACvC5rB,EAAEsU,OAAO2D,SAAS,aAGpB2S,OAAO1S,GAAG,OAAQ,WAChB9G,SAASnP,KAAK,kBAAkB4pB,QAAQ,OAE1CjB,OAAO1S,GAAG,QAAS,WACjB9G,SAASnP,KAAK,kBAAkB6pB,OAAO,OAGzC9c,MAAMyc,UAAY,SAAUjqB,KAAMuqB,gBAChC,GAAIpB,cAAelV,UAAUT,QAe7B,OAda,WAATxT,KACFmpB,aAAa3V,OAAS+W,gBAEjBpB,aAAanpB,QAChBmpB,aAAanpB,UAEoB,gBAAxBmpB,cAAanpB,QACtBmpB,aAAanpB,OAASmpB,aAAanpB,QAEhCuD,EAAEinB,SAASrB,aAAanpB,MAAOuqB,iBAElCpB,aAAanpB,MAAMkF,KAAKqlB,iBAGrBrB,kBAAkBC,eAG3B3b,MAAMid,aAAe,SAAUC,KAC7B,GAAIvB,cAAelV,UAAUT,SACzBmX,SAAWnd,MAAM0a,QAAQwC,IACe,iBAAjCvB,cAAawB,SAAS3qB,QAC/BmpB,aAAawB,SAAS3qB,OAASmpB,aAAawB,SAAS3qB,OAEvD,IAAI4qB,SACJ,KAAK,GAAInpB,KAAK0nB,cAAawB,SAAS3qB,MAClC,GAAImpB,aAAawB,SAAS3qB,MAAMyB,KAAOkpB,SAAS3O,MAAO,CACrD4O,SAAWnpB,CACX,OAMJ,MAHA0nB,cAAawB,SAAS3qB,MAAM6c,OAAOpb,EAAG,GACtC0nB,aAAa3V,OAAS4V,OAAOW,YACtBvc,OAAM0a,QAAQwC,KACdxB,kBAAkBC,eA8B3B3b,MAAMmH,IAAI,eAAgB,WACxB2U,qBAGFA,uBA+BRnmB,QAAQC,OAAO,oBACb,+BAIFD,QAAQC,OAAO,0BACb,gCAECsI,UAAU,eAAgB,SAAUnI,EAAG8B,MAAO4O,UAAWvC,SAAUlT,EAChEqsB,mBAAoB7iB,WACtB,OACEgH,SAAU,IACVxB,SACApJ,YAAa4D,UAAUoH,mBAAmB,oCAC1C7B,KAAM,SAAUC,MAAOvP,QAASsS,OAmB9B,QAAS4X,kBAAiB3U,QAGxB,MAFA9B,UAASsF,OAAOoR,oBAChBC,mBAAqB,EACjB7U,OAAO7R,OAAS,GAClB6L,MAAM8a;IACN9a,OAAMwF,cAIR3N,QACElD,IAAK,6DACLgH,OAAQ,MACRoK,QAASgV,EAAK/U,UACb/Q,QAAQ,SAAUqE,MACnB0G,MAAM8a,kBAAoBxhB,OAsC9B,QAAS0hB,aAAYC,WACnB,GAEIC,WAFAC,SAAW/Y,SAASnP,KAAK,UACzBmoB,UAAYhZ,SAASnP,KAAK,kBAE1BmoB,WAAUjnB,OAAS,GACH,OAAd8mB,YAAsBC,UAAYE,UAAUC,QAAQC,QACtC,SAAdL,YAAwBC,UAAYE,UAAUC,QAAQE,UAExC,OAAdN,YAAsBC,UAAYC,SAASK,QAC7B,SAAdP,YAAwBC,UAAYC,SAASE,UAEnDrb,MAAMyb,YAAYP,WAoDpB,QAASQ,mBAAkBC,cAMzB,MALAA,cAAapN,KAAO,EACpB9H,UAAUT,OAAO2V,cACjB3b,MAAM8a,qBACNc,OAAOC,QAAQ,QAERwB,mBAAmBC,eAAe3B,cAG3C,QAASG,oBACP,GAAI9V,QAASS,UAAUT,QAEvB,IADAhG,MAAMud,iBACiB,mBAAb,QAAsD,WAA1B9a,SAAQC,IAAI,YAElD,IAAIqZ,sBAAuB7iB,QAAW,SAAU8iB,KAAQ,MAAOC,cAAiB,eAChF,KAAK,GAAIC,eAAeH,qBAAqB,CAC3C,GAAII,YAAaJ,oBAAoBG,YACD,iBAAzBlW,QAAOkW,eAA8BlW,OAAOkW,cAAgBlW,OAAOkW,cAC9E,KAAK,GAAIjoB,KAAK+R,QAAOkW,aAAc,CACjC,GAAIje,OAAQ+H,OAAOkW,aAAajoB,EAChC+L,OAAMud,cAAcpB,WAAale,QAAUuQ,MAASvQ,MAAOzL,KAAQ0pB,aACnEE,wBAAwBD,WAAYle,QAGpC+H,OAAOA,SACThG,MAAMqc,iBAAmBrW,OAAOA,QAUpC,QAASoW,yBAAwB5pB,KAAMgc,OAMrCxO,MAAMsc,qBAAuBtc,MAAMsc,yBAE/B9N,QAASxO,OAAMsc,sBAEnBzkB,OACElD,IAAK,4BAA8BnC,KACnCmJ,OAAQ,MACRoK,QAASgV,EAAKvM,SACbvZ,QAAQ,SAAUqE,MACnB,IAAK,GAAIrF,KAAKqF,MACZ0G,MAAMsc,qBAAqBhjB,KAAKrF,GAAGgK,OAAS3E,KAAKrF,GAAGuI,OAxL1D,GAAI4F,UAAWpR,EAAEP,SACbmrB,OAASxZ,SAASnP,KAAK,QAE3B+M,OAAM8a,oBAEN,IAA4BF,oBAAxBC,mBAAqB,CAEzBe,QAAO1S,GAAG,QAAS,SAAU/N,GAC3B,GAAI6K,QAAS4V,OAAOW,KACpBvc,OAAMzB,WAAayH,OAEnB9B,SAASsF,OAAOoR,oBAChBA,mBAAqB1W,SAAS,WAAcyW,iBAAiB3U,SAAY,KAErE6U,mBAAqB,GACvBF,iBAAiB3U,UAqBrB4V,OAAO1S,GAAG,QAAS,SAAU/N,GACT,KAAdA,EAAEwE,SAAkBqb,YAAY,MAClB,KAAd7f,EAAEwE,SAAkBqb,YAAY,QAClB,KAAd7f,EAAEwE,UACAyC,SAASnP,KAAK,aAAakB,OAAS,EAGtC+P,SAAS,WACPvO,QAAQlF,QAAQ,iBAAiB+rB,eAAe,UAC/C,GAEHxc,MAAMyc,UAAU,SAAUb,OAAOW,UAKvCvc,MAAMgG,OAAS,WACbhG,MAAMyc,UAAU,SAAUzc,MAAMqc,mBAGlCrc,MAAM0c,YAAc,WAClB1c,MAAMqc,iBAAmB,IAG3Brc,MAAM2c,aAAe,WAGnB,MAFA3c,OAAMud,iBACNvd,MAAMqc,iBAAmB,GAClBX,uBAGTtZ,SAAS8G,GAAG,YAAa,SAAU,WACjClJ,MAAMyb,YAAYpmB,QAgBpB2K,MAAMyb,YAAc,SAAUnW,OAC5BlD,SAASnP,KAAK,aAAa2pB,YAAY,YACvC5rB,EAAEsU,OAAO2D,SAAS,aAGpB2S,OAAO1S,GAAG,OAAQ,WAChB9G,SAASnP,KAAK,kBAAkB4pB,QAAQ,OAE1CjB,OAAO1S,GAAG,QAAS,WACjB9G,SAASnP,KAAK,kBAAkB6pB,OAAO,OAGzC9c,MAAMyc,UAAY,SAAUjqB,KAAMuqB,gBAChC,GAAIpB,cAAelV,UAAUT,QAe7B,OAda,WAATxT,KACFmpB,aAAa3V,OAAS+W,gBAEjBpB,aAAanpB,QAChBmpB,aAAanpB,UAEoB,gBAAxBmpB,cAAanpB,QACtBmpB,aAAanpB,OAASmpB,aAAanpB,QAEhCuD,EAAEinB,SAASrB,aAAanpB,MAAOuqB,iBAElCpB,aAAanpB,MAAMkF,KAAKqlB,iBAGrBrB,kBAAkBC,eAG3B3b,MAAMid,aAAe,SAAUC,KAC7B,GAAIvB,cAAelV,UAAUT,SACzBmX,SAAWnd,MAAMud,cAAcL,IACS,iBAAjCvB,cAAawB,SAAS3qB,QAC/BmpB,aAAawB,SAAS3qB,OAASmpB,aAAawB,SAAS3qB,OAEvD,IAAI4qB,SACJ,KAAK,GAAInpB,KAAK0nB,cAAawB,SAAS3qB,MAClC,GAAImpB,aAAawB,SAAS3qB,MAAMyB,KAAOkpB,SAAS3O,MAAO,CACrD4O,SAAWnpB,CACX,OAMJ,MAHA0nB,cAAawB,SAAS3qB,MAAM6c,OAAOpb,EAAG,GACtC0nB,aAAa3V,OAAS4V,OAAOW,YACtBvc,OAAMud,cAAcL,KACpBxB,kBAAkBC,eAgC3B3b,MAAMmH,IAAI,eAAgB,WACxB2U,qBAGFA,uBA+BRnmB,QAAQC,OAAO,gBACb,2BAKFD,QAAQC,OAAO,mCACZiB,WAAW,8BAA+B,SAAUsH,QACnDA,OAAOqf,QACLC,KAAM,OACNC,SAAU,cACVC,MAAO,SAETxf,OAAOyf,QAAU,WACfzf,OAAO0f,MAAQ1f,OAAOqf,OAAOE,SAC7Bvf,OAAO2f,gBACJtkB,KAAK,WACJ2E,OAAO0f,MAAQ1f,OAAOqf,OAAOC,OAE9BvG,MAAM,WACL/Y,OAAO0f,MAAQ1f,OAAOqf,OAAOG,WAWvChoB,QAAQC,OAAO,+BACb,wBACA,iCAECsI,UAAU,oBAAqB,SAAU1D,WACxC,OACE3D,WAAY,8BACZ2K,SAAU,IACVxB,OACE+d,YAAa,IACbD,cAAe,IACfE,oBAAqB,IACrBC,iBAAkB,IAClBC,oBAAqB,IACrBC,gBAAiB,IACjBC,UAAW,IACXC,aAAc,IACdC,aAAc,KAEhB1nB,YAAa4D,UAAUoH,mBAAmB,mDAMhDjM,QAAQC,OAAO,qBACb,gCAKFD,QAAQC,OAAO,wBACb,wBACA,sBAECsI,UAAU,aAAc,SAAU1D,WACjC,OACE3D,WAAY,8BACZkJ,MACEwe,IAAK,SAAUve,OACbA,MAAMme,gBAAkB,wBACxBne,MAAMqe,aAAe,YACrBre,MAAMse,aAAe,SAGzB9c,SAAU,IACVxB,OACE+d,YAAa,IACbD,cAAe,KAEjBlnB,YAAa4D,UAAUoH,mBAAmB,mDAMhDjM,QAAQC,OAAO,8BACb,0BAECsI,UAAU,oBACT,YACA,SAAU1D,WACR,OACEgH,SAAU,IACVxB,OACEya,QAAS,KAEX7jB,YAAa4D,UAAUoH,mBAAmB,sBAAuB,gCAOzEjM,QAAQC,OAAO,oBACb,+BAKFD,QAAQC,OAAO,uCACb,eACA,SACA,uBAECiB,WAAW,sBACV,IAAK,iBAAkB,SAAU,WAAY,eAAgB,YAC3D,YAAa,SACf,SAAU7F,EAAGqY,eAAgBlL,OAAQ+F,SAAUrC,aAAc/E,UACvD1H,UAAWopB,QAEfrgB,OAAOsgB,aAAe,KACtBtgB,OAAOugB,UAAW,EAClBvgB,OAAOqgB,OAASA,OAChBrgB,OAAOoG,UAAW,EAClBpG,OAAOwgB,0BACPxgB,OAAO/I,UAAYA,UAEd+I,OAAOzN,QACVyN,OAAOzN,MAAQ,KACfmR,aAAavF,IAAIlH,UAAUtE,IACxB0I,KAAK,SAAUvE,SACdkJ,OAAOzN,MAAQuE,QAAQqE,QAI7B6E,OAAO8C,OAAO,QAAS,SAAUvQ,OAC/B,GAAKA,MAAL,CAIA,GAAI6T,WAAW,CACf,KAAK,GAAI5H,SAASjM,OAAM8E,WACtB,GAAuC,SAAnC9E,MAAM8E,WAAWmH,OAAOkB,OAAmB,CAC7C0G,UAAW,CACX,OAGJpG,OAAOoG,SAAWA,SAElBpG,OAAOygB,UAAYluB,MAAMsM,WAAW,IAAK,KAEzCrH,QAAQlF,QAAQ,6BAA6BouB,IAAI,OAAQ,WACvD7tB,EAAEqE,MAAMypB,OACNC,aAAa,EACbC,WAAW,EACXC,aAAa,EACbC,YAAY,GACX,WACD/gB,OAAOghB,UAAY9pB,SAIvB8I,OAAOihB,UAAY1uB,MAAMiE,IAAI,WAAY,KAAM,OAC1CwJ,OAAOqgB,SACVrgB,OAAOqgB,OAAShJ,OAAOC,KAAK/kB,MAAM8E,aAGpC2I,OAAOkhB,oBAGTlhB,OAAO8C,OAAO,eAAgB,SAAUrN,MACtC,GAAKuK,OAAOzN,MAAZ,CAGA,GAAI6T,WAAW,CACf,KAAK,GAAI5H,SAASwB,QAAOzN,MAAM8E,WAC7B,GAA8C,SAA1C2I,OAAOzN,MAAM8E,WAAWmH,OAAOkB,QAAqBlB,QAAU/I,KAAM,CACtE2Q,UAAW,CACX,OAGJpG,OAAOoG,SAAWA,YAGpBpG,OAAOmhB,WAAa,SAAU3iB,OAC5B,IAAKA,MAAO,CACVA,MAAQ6Y,OAAOC,KAAKtX,OAAOzN,MAAM8E,YAAY,EAC7C,KAAK,GAAI0nB,OAAO/e,QAAOzN,MAAM8E,WAC3B,GAA4C,SAAxC2I,OAAOzN,MAAM8E,WAAW0nB,KAAKrf,OAAmB,CAClDlB,MAAQugB,GACR,QAIN,GAAIvsB,WAAYwN,OAAOzN,MAAM8E,WAAWmH,OAAOoB,QAAQI,OAAOygB,UAAUhuB,MAEpEuN,QAAOghB,YACThhB,OAAOghB,UAAUI,YACf7rB,YAAa/C,UAAUM,QAAUN,UAAUQ,WAG7CgN,OAAOghB,UAAUK,WACf7uB,UAAUW,GACVX,UAAUc,GACVd,UAAUU,GACVV,UAAUa,MAId2M,OAAOugB,UAAW,EAClBvgB,OAAOsgB,aAAe9hB,OAGxBwB,OAAOkhB,eAAiB,WACtBlhB,OAAOshB,aAAethB,OAAOshB,gBAE7B,KAAK,GAAI9iB,SAASwB,QAAOzN,MAAM8E,WAAY,CACzC,GAAI8H,iBAAkBa,OAAOzN,MAAM8E,WAAWmH,OAAOK,WAAW,IAAK,IACrEmB,QAAOwgB,uBAAuBhiB,QAC5B+iB,cAAersB,KAAK+J,OAAO,IAAME,gBAAgBnM,UAAY,GAAK,KAClEmE,iBAAkB,MAClBqqB,eAAiBtsB,KAAK+J,OAAO,IAAME,gBAAgBrM,SAAW,GAAK,KACnE2uB,gBAAiB,OAGnBzhB,OAAOshB,aAAa9iB,OAASwB,OAAOzN,MAAM2M,UAAU,IAAK,IAAKV,SAIlEwB,OAAO9E,KAAO,SAAUsD,OAEtB,GAAIkjB,iBAAkB1hB,OAAOghB,UAAUW,aAEnCC,aAAe,GAAIjjB,YACrBxL,GAAIuuB,gBAAgBG,EACpB3uB,GAAIwuB,gBAAgBI,GACpBxuB,GAAIouB,gBAAgBK,EACpB1uB,GAAIquB,gBAAgBM,GACpBtiB,OAAQ,QAUV,OARAkiB,cAAeA,aAAahiB,QAAQ,EAAII,OAAOygB,UAAUhuB,OACrDmvB,aAAa1uB,GAAK8M,OAAOzN,MAAMO,QACjC8uB,aAAa1uB,GAAK8M,OAAOzN,MAAMO,OAE7B8uB,aAAavuB,GAAK2M,OAAOzN,MAAMS,SACjC4uB,aAAavuB,GAAK2M,OAAOzN,MAAMS,QAG1BkE,KAAK3E,MAAMgM,gBAAgBC,MAAOojB,eAG3C5hB,OAAOiiB,YAAc,WACnB,GAAIzjB,OAAQwB,OAAOsgB,YACnBppB,MAAKgE,KAAKsD,OAAOnD,KAAK,SAAUvE,SAC9B,GAAI0H,OAAQ1H,QAAQqE,KAAK,GACrB3I,UAAYsE,QAAQqE,KAAK,EAC7B6E,QAAOzN,MAAM8E,WAAWmH,OAAShM,YAEnCwN,OAAOugB,UAAW,EAClBrV,eAAe6J,MAAM9d,YAGvB+I,OAAOkiB,YAAc,WACnB,GAAI1jB,OAAQwB,OAAOsgB,YACnBppB,MAAKgE,KAAKsD,OAAOnD,KAAK,SAAUvE,SAC9B,GAAI0H,OAAQ1H,QAAQqE,KAAK,GACrB3I,UAAYsE,QAAQqE,KAAK,EAC7B6E,QAAOzN,MAAM8E,WAAWmH,OAAShM,SAEjC,IAAI2vB,iBAAkBniB,OAAOqgB,OAAOhjB,QAAQmB,OAAS,GAAKwB,OAAOqgB,OAAOrqB,MAExEgK,QAAOmhB,WAAWnhB,OAAOqgB,OAAO8B,uBAQ1C3qB,QAAQC,OAAO,4BACb,sCACA,wBACA,uBAECwC,QAAQ,sBACP,SAAU,YACV,SAAU+Q,OAAQ3O,WAEhB,MAAO,UAAUpF,UAAWopB,QAC1B,MAAOrV,QAAOC,MACZxS,YAAa4D,UAAUoH,mBACrB,mBACA,yBAEF/K,WAAY,qBACZuF,SACEhH,UAAW,WAAc,MAAOA,YAChCopB,OAAQ,WAAc,MAAOA,UAAU,IAEzC+B,SAAU,WACTja,WAOX3Q,QAAQC,OAAO,0BACb,wBACA,kBACA,SACA,WAEC+D,QAAQ,eACP,IAAK,QAAS,YAAa,SAAU,QACrC,SAAU5D,EAAG8B,MAAO2C,UAAWvE,OAAQoe,OAErC,GAAImM,kBAAmBhmB,UAAU0P,gBAAgBhP,KAAK,KAAM,YACxDulB,sBAAwBD,iBAAiBtlB,KAAK,KAAM,SAEpD0O,aAAe,SAAUC,SAC3B,GAAIvQ,MAAOvD,EAAE+T,UAAUD,QAcvB,OAZIA,SAAQzP,YACVd,KAAKc,UAAYnE,OAAOyb,GAAG7H,QAAQzP,UAAWI,UAAUmX,oBAGtD9H,QAAQ6W,UACVpnB,KAAKonB,QAAUzqB,OAAOyb,GAAG7H,QAAQ6W,QAASlmB,UAAUmX,oBAGlD9H,QAAQ8W,UACVrnB,KAAKqnB,QAAU1qB,OAAOyb,GAAG7H,QAAQ8W,QAASnmB,UAAUmX,oBAG/CrY,MAGLsnB,UAAY,SAAUtnB,MACxB,GAAIuQ,SAAU9T,EAAEsb,MAAM/X,MACnBunB,KAAK,aACL/W,YACA7L,OAcH,OAZI3E,MAAKc,YACPyP,QAAQzP,UAAYd,KAAKc,UAAU5F,UAGjC8E,KAAKonB,UACP7W,QAAQ6W,QAAUpnB,KAAKonB,QAAQlsB,UAG7B8E,KAAKqnB,UACP9W,QAAQ8W,QAAUrnB,KAAKqnB,QAAQnsB,UAG1BqV,QAGT,QACEiX,YAAa,SAAUxnB,MACrB,GAAIuQ,SAAU+W,UAAUtnB,KACxB,OAAOzB,OAAM0B,KAAKknB,sBAAsB,KAAM5W,SAC3CrQ,KAAK,SAAUqJ,UACd,MAAO+G,cAAa/G,SAASvJ,SAGnCynB,YAAa,SAAUzb,OACrB,GAAIuE,SAAU+W,UAAUtb,MACxB,OAAOzN,OAAMmpB,IAAIP,sBAAsB5W,QAAQ/Y,GAAI,KAAM+Y,SACtDrQ,KAAK,SAAUqJ,UACd,MAAO+G,cAAa/G,SAASvJ,SAGnC2nB,YAAa,SAAU3b,OACrB,MAAOzN,OAAMM,OAAOsoB,sBAAsBnb,MAAMxU,GAAI,OAEtDowB,WAAY,SAAUpwB,IACpB,GAAIiV,OAKJ,OAJIjV,MACFiV,OAASsO,MAAM8M,OAAQC,SAAUtwB,MAG5B+G,MAAMyE,IAAImkB,sBAAsB,IAAK1a,SACzCvM,KAAK,SAAUqJ,UACd,OACE7D,QAAS6D,SAASvJ,KAAK0F,QAAQL,IAAI,SAAU2H,QAC3C,MAAOsD,cAAatD,kBAWtC3Q,QAAQC,OAAO,2CACb,0BAECsI,UAAU,+BACT,WAAY,YACZ,SAAUgX,SAAU1a,WAElB,OACEuF,KAAM,SAAUC,MAAOvP,SACrB,GAAI+L,MAAOhC,UAAU6mB,wCAIrB,IAFArhB,MAAM9G,QAAU8G,MAAMmG,QAElB3J,KAAM,CACR,GAAI4Z,MAAOzgB,QAAQlF,QAAQ,IAAM+L,KAAO,yBAA2BA,KAAO,IAE1E/L,SAAQwC,KAAK,SAASmjB,KAAKlB,SAASkB,MAAMpW,QAG5CA,MAAMiB,OAAO,UAAW,SAAUE,SAAUmgB,UACrC3rB,QAAQ6N,OAAOrC,SAAUmgB,YAC5BthB,MAAMgM,UAAW7K,SAAUA,WAC3BnB,MAAMmG,QAAUhF,YAEjB,IAELK,SAAU,IACVxB,OACEmG,QAAS,IACT6F,SAAU,KAEZ7D,SACE,2HAUVxS,QAAQC,OAAO,8BACb,wBACA,2BACA,0BACA,0BACA,yBACA,0CACA,wBACA,kBACA,oBACA,cACA,UAECsI,UAAU,mBACT,KAAM,YAAa,iBAAkB,cAAe,QAAS,QAC7D,SAAU3D,GAAIC,UAAW+mB,eAAgBC,YAAaprB,MAAOie,OAC3D,OACEtU,KAAM,SAAUC,OACd,GAAIyhB,aAAc,SAAUC,QAASpoB,MACnClD,MAAMurB,eAAeD,QAASpoB,MAC9B0G,MAAMmX,aAAeuK,SAGnBE,aAAe,SAAUtc,OAC3B,MAAOA,OAAMuc,SAAW,IAAMvc,MAAMuc,SAAW,IAAM,WAGvD7hB,OAAM8hB,WAAa,WACjB9hB,MAAMmX,aAAe,IAGvBqK,YAAYN,WAAWlhB,MAAMya,QAAQ3pB,IAClC0I,KAAK,SAAUqJ,UACd7C,MAAM+hB,QAAUlf,SAAS7D,UAE1BkY,MAAM,SAAUrU,UACf,GAAI6e,SAAU,uCACdD,aAAYC,SAAW7e,SAAUA,YAGrC,IAAImf,aACJhiB,OAAMiiB,YAAc,SAAU3c,OAI5B,MAHI3P,SAAQyL,YAAY4gB,UAAU1c,MAAMxU,OACtCkxB,UAAU1c,MAAMxU,KAAM,GAEjBkxB,UAAU1c,MAAMxU,KAEzBkP,MAAMkiB,YAAc,SAAU5c,OAC5B0c,UAAU1c,MAAMxU,KAAOkxB,UAAU1c,MAAMxU,KAEzCkP,MAAMmiB,YAAc,WAClBniB,MAAM+hB,QAAQjM,QAAQ,SAAUxQ,OAC9B0c,UAAU1c,MAAMxU,KAAM,KAG1BkP,MAAMoiB,UAAY,WAChBpiB,MAAM+hB,QAAQjM,QAAQ,SAAUxQ,OAC9B0c,UAAU1c,MAAMxU,KAAM,IAI1B,IAAIuxB,WAAY,YAEhBriB,OAAMsiB,eACNtiB,MAAMuiB,kBAAoB,SAAUjd,OAClC,MAAO+c,WAAY/c,MAAMxU,IAE3BkP,MAAMwiB,aAAe,SAAUld,OAC7B,GAAI9I,MAAOwD,MAAMuiB,kBAAkBjd,MAEnC,OAAItF,OAAMsiB,YAAY9lB,MACbwD,MAAMsiB,YAAY9lB,OAE3BwD,MAAMsiB,YAAY9lB,SACXwD,MAAMsiB,YAAY9lB,QAE3BwD,MAAMyiB,wBAA0B,SAAUnd,OACxC,MAAOtF,OAAM0iB,sBAAwB1iB,MAAMwiB,aAAald,OAAOqd,UAGjE,IAAIC,MAAOvO,MAAMwO,WACjB7iB,OAAM0iB,mBAAqBE,KAAKE,SAEhC9iB,MAAM+iB,SAAWH,KAAK,WAEpB,MAAOrB,gBAAenX,0BACnB5Q,KAAK,SAAUM,MACd,GAAIkpB,KAAM/sB,QAEV,OAAOurB,aAAYV,aACjBM,SAAUphB,MAAMya,QAAQ3pB,GACxBmyB,WAAYnpB,KACZ4mB,QAASsC,IACTE,WAAYppB,KACZ6mB,QAASqC,MAERxpB,KAAK,SAAU8L,OACdtF,MAAM+hB,QAAQoB,QAAQ7d,SAEvB4R,MAAM,SAAUrU,UACf,GAAI6e,SAAU,+CACdD,aAAYC,SAAW7e,SAAUA,iBAK3C7C,MAAMojB,UAAYR,KAAK,SAAUtd,OAE/B,MAAOic,gBAAenX,0BACnB5Q,KAAK,SAAUM,MACd,GAAIupB,aAAc/d,MAAM4d,WACpBI,WAAahe,MAAMqb,OAKvB,OAHArb,OAAM4d,WAAappB,KACnBwL,MAAMqb,QAAU1qB,SAETurB,YAAYT,YAAYzb,OAC5B9L,KAAK,WACJwG,MAAMwiB,aAAald,OAAOie,iBAE3BrM,MAAM,SAAUrU,UACfyC,MAAM4d,WAAaG,YACnB/d,MAAMqb,QAAU2C,UAEhB,IAAI5B,SAAU,wCAA0CE,aAAatc,OAAS,GAG9E,OAFAmc,aAAYC,SAAW7e,SAAUA,WAE1BtI,GAAGe,eAKpB0E,MAAMwjB,eAAiB,SAAUle,MAAOkN,SACtC,GAAIiR,SAAUne,MAAMlL,SAIpB,OAFAkL,OAAMlL,UAAYoY,QAEXxS,MAAMojB,UAAU9d,OACpB9L,KAAK,WAEJwG,MAAM+hB,QAAQ2B,KAAK,SAAUC,OAAQC,QACnC,GAAIC,gBAAiB5tB,OAAOub,SAASmS,OAAOvpB,WACxC0pB,eAAiB7tB,OAAOub,SAASoS,OAAOxpB,UAE5C,QAAIypB,gBACEC,iBAAkBH,OAAOvpB,UAAU2pB,SAASH,OAAOxpB,YAE9C0pB,gBACLD,iBAAkBD,OAAOxpB,UAAU2pB,SAASJ,OAAOvpB,WAIlD,GAHE,EAHA,MASZ8c,MAAM,WAEL,MADA5R,OAAMlL,UAAYqpB,SACX,KAIbzjB,MAAMihB,YAAc2B,KAAK,SAAUtd,OAEjC,MAAOkc,aAAYP,YAAY3b,OAC5B9L,KAAK,WACJ,GAAImV,OAAQ3O,MAAM+hB,QAAQvmB,QAAQ8J,MAClC+O,OAAMW,WAAWhV,MAAM+hB,QAASpT,SAEjCuI,MAAM,SAAUrU,UACf,GAAI6e,SAAU,0CAA4CE,aAAatc,OAAS,GAChFmc,aAAYC,SAAW7e,SAAUA,gBAIzCrB,SAAU,IACVxB,OACEya,QAAS,KAEX7jB,YAAa4D,UAAUoH,mBACrB,YACA,oBACA,8BAQVjM,QAAQC,OAAO,sBACb,+BAKFD,QAAQC,OAAO,gCACb,mCACA,eACA,wBACA,aACA,eACA,SACA,uBACA,yBACA,WAECsI,UAAU,oBAAqB,SAAU1D,WACxC,OACE3D,WAAY,SAAUd,EAAG0Q,UAAWlM,GAAI4D,OAAQ6lB,4BAA6BC,cAE3E9lB,OAAO+lB,SAAW1pB,UAAU2pB,iBAAiBH,6BAE7C7lB,OAAO+I,WAAY,CAEnB,IAAIkd,SAAUjmB,OAAO4J,YACL,SAAZqc,SAEFjmB,OAAOyI,MAAQqd,aAAapd,SAC5B1I,OAAO2I,OAAQ,GAGf3I,OAAOyI,MAAQqd,aAAald,MAAM5I,OAAO4J,cAG3CjS,OAAOkR,eAAiB,SAAU7L,GAChC,IAAKpF,EAAE6J,QAAQzB,OAAOyI,MAAMK,WAAa9I,OAAO2I,OAAS3I,OAAO+I,UAE9D,MAAO,6BAIX/I,OAAOgJ,IAAI,WAAY,iBAEdrR,QAAOkR,iBAGhB7I,OAAOuJ,UAAY,WACjB,GAAIrL,QAEJ,IAAI8B,OAAOyI,MAETvK,QAAU8B,OAAOyI,MAAMe,QAAQC,aAAapO,KAAK,SAAUF,MACzC,QAAZ8qB,SACF3d,UAAUoB,KAAK,8BAAgCvO,KAAKxI,GAAK,KAE3DqN,OAAO2I,OAAQ,EACf3I,OAAO+I,WAAY,QAEhB,CAEL,GAAIY,UAAWvN,GAAGK,OAClBkN,UAASxM,SACTe,QAAUyL,SAASzL,QAGrB,MAAOA,WAGXmF,SAAU,IACVxB,OACE+H,WAAY,YAEdnR,YAAa4D,UAAUoH,mBAAmB,+DAMhDjM,QAAQC,OAAO,sBACb,wBACA,iCAECU,OAAO,SAAUE,gBAChBA,eACGG,KAAK,oCACJE,WAAY,SAAU6P,aAAcvI,OAAQ8F,QAASzJ,WACnDyJ,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,uBAClD9J,OAAO+J,QAAUxB,aAAa5V,IAEhCqX,SAAU,+DACVrR,gBAAgB,MAMxBnB,QAAQC,OAAO,sBACb,mCACA,wBACA,WACA,SACA,2BAECU,OAAO,SAAU8R,UAAW5R,eAAgB6R,mBAC3C,GAAI7N,WAAY4N,UAAUE,OAAOD,kBAAkBE,KAEnD/R,gBACGG,KAAK,2BACJE,WAAY,SAAUsH,OAAQ8F,QAAS+f,4BAA6BC,cAClEhgB,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,kBAClD9J,OAAOqK,aAAeyb,aACtB9lB,OAAO+lB,SAAW1pB,UAAU2pB,iBAAiBH,8BAE/CptB,YAAa4D,UAAUoH,mBAAmB,qEAMlDjM,QAAQC,OAAO,6BACZqI,MAAM,8BAA+B,kBAIxCtI,QAAQC,OAAO,iBACb,qBACA,uBAKFD,QAAQC,OAAO,wBACb,6BACA,2BACA,eACA,wBACA,SACA,uBACA,WACCC,SAAS,mBAER2G,KAAM,YACNyB,MAAO,SAGPzB,KAAM,eACNyB,MAAO,WAGVC,UAAU,YAAa,SAAU1D,WAChC,OACE5D,YAAa4D,UAAUoH,mBAAmB,oCAC1C/K,WAAY,SAAUd,EAAG8B,MAAO4O,UAAWlM,GAAImM,aAAcvI,OAAQ+F,SAAUmgB,OAAQC,MAE7D,QAApB5d,aAAa5V,IACfqN,OAAOyI,SACPzI,OAAO2I,OAAQ,GAEfwd,KAAKC,QAAQ7d,aAAa5V,IACvB0I,KAAK,SAAyBqJ,UAC7B1E,OAAOyI,MAAQ/D,SACf1E,OAAOqmB,QAAUzuB,EAAE+T,UAAUjH,SAAS2hB,WAI5C1uB,OAAOkR,eAAiB,SAAU7L,GAChC,IAAIpF,EAAE6J,QAAQzB,OAAOyI,MAAMK,WAAa9I,OAAO2I,OAAS3I,OAAO+I,UAE7D,MAAO,6BAIX/I,OAAOgJ,IAAI,WAAY,iBAEdrR,QAAOkR,iBAGhB7I,OAAOsmB,UAAY,WACjB,MAAO,0BAA4BtmB,OAAOyI,MAAM9V,GAAK,+BAGvDqN,OAAOumB,oBAAsB,WAI3BxgB,SAAS,WACP,GAAI9J,WAAY+D,OAAOyI,MAAMxM,UACzBuqB,QAAUxmB,OAAOyI,MAAMge,SACvBC,eAAiB1mB,OAAO2mB,SAAS1qB,UACjC2qB,aAAe5mB,OAAO2mB,SAASH,OAEnCE,gBAAeG,aACb,wBACEL,UAAYvqB,WAGhB,IAAI6qB,2BAA2B,CAC3BN,UAAWvqB,YACb6qB,yBAA2B7qB,UAAU2pB,SAASY,UAEhDI,aAAaC,aACX,sBACAC,6BAKN9mB,OAAOuJ,UAAY,WACjB,MAAIvJ,QAAOyI,MAELzI,OAAO2I,MAOFwd,KAAKY,SAAS/mB,OAAOyI,OAAOpN,KAAK,SAAUF,MAChD,GAAI6rB,eAAgBpvB,EAAE4I,IAAIR,OAAOqmB,QAAS,SAAUY,QAClD,MAAOf,QAAOgB,WAAWD,OAAQ9rB,KAAKxI,KAGxC,OAAOyJ,IAAGzB,IAAIqsB,eAAe3rB,KAAK,WAChCiN,UAAUoB,KAAK,uBAAyBvO,KAAKxI,GAAK,UAZtDuzB,OAAOiB,kBAAkBnnB,QAEzBA,OAAOonB,kBACAjB,KAAKkB,WAAWrnB,OAAOyI,QAczBrM,GAAGe,OAAO,gBAIrB6C,OAAOonB,iBACP,IAAIE,OAAStnB,OAAc,QAAIA,OAAOqmB,QAAQrwB,OAAS,CAEvDgK,QAAOunB,UAAY,WACjBvnB,OAAOqmB,QAAQ9sB,MAAM5G,GAAI20B,QAASE,eAAe,KAIhDxnB,OAAO2I,QACR3I,OAAOqmB,WACPzuB,EAAE6vB,MAAM,EAAGznB,OAAOunB,YAIpBvnB,OAAO0nB,aAAe,SAAUC,UAC9B,GAAIC,eAAgBhwB,EAAEtB,OAAO0J,OAAOqmB,QAAS,SAAUwB,GACrD,MAAOA,GAAEl1B,KAAOg1B,UAEfC,eAAc,GAAGJ,eACpBxnB,OAAOonB,eAAe7tB,KAAKquB,cAAc,MAG7CvkB,SAAU,IACVxB,OAAS+H,WAAY,eAMzBpS,QAAQC,OAAO,cACb,wBACA,yBAECU,OAAO,SAAUE,gBAChBA,eACCG,KAAK,4BACJE,WAAY,SAAU6P,aAAcvI,OAAQ8F,QAASzJ,WACnDyJ,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,eAClD9J,OAAO+J,QAAUxB,aAAa5V,IAEhCqX,SAAU,+CACVrR,gBAAgB,MAMtBnB,QAAQC,OAAO,cACb,2BACA,wBACA,iCACA,WAECU,OAAO,SAAU8R,UAAW5R,eAAgB6R,mBAC3C,GAAI7N,WAAY4N,UAAUE,OAAOD,kBAAkBE,KAEnD/R,gBACGG,KAAK,mBACJE,WAAY,SAAUsH,OAAQ8F,QAASqgB,MACrCrgB,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,UAClD9J,OAAOqK,aAAe8b,MAExB1tB,YAAa4D,UAAUoH,mBAAmB,6CAMlDjM,QAAQC,OAAO,SACb,aACA,eAKFD,QAAQC,OAAO,oCACb,0BAECsI,UAAU,yBAA0B,SAAU1D,WAC7C,OACEgH,SAAU,IACVxB,OACEya,QAAS,KAEX7jB,YAAa4D,UAAUoH,mBAAmB,8EAMhDjM,QAAQC,OAAO,0BACb,qCAKFD,QAAQC,OAAO,iCACb,wBACA,yBACA,sBACA,gBAECsI,UAAU,sBAAuB,SAAUlN,EAAGwJ,WAC7C,OACE3D,WAAY,SAAUsH,OAAQ8nB,wBAE5B9nB,OAAO+nB,UAAYD,uBAAuBE,UAE1ChoB,OAAOioB,OAAS,SAAUzX,OACxBsX,uBAAuBI,cAAc1X,QAGvCxQ,OAAOmoB,SAAW,SAAU3X,OAC1BsX,uBAAuBM,cAAc5X,QAGvCxQ,OAAO1J,OAAS,SAAUgmB,SACxBwL,uBAAuBO,wBAAwB/L,QAAQ3pB,KAGzDqN,OAAOsoB,eAAiB,SAAU9X,OAChCsX,uBAAuBS,uBAAuB/X,QAGhDxQ,OAAOwoB,WAAa,WAClBV,uBAAuBW,qBAGzBzoB,OAAO0oB,UAAY,WACjBZ,uBAAuBa,0BAGzB3oB,OAAO4oB,gBAAkB,WACvB,MAAOd,wBAAuBe,0BAGlCjnB,KAAM,SAAUC,MAAOvP,QAASkjB,MAE9B3T,MAAMinB,iBACJC,WAAY,SAAU/rB,EAAGgsB,IACvBA,GAAGC,OAAO10B,IAAI,aAAc,GAC5By0B,GAAGvoB,KAAKqE,SAAS2Z,YAAY,yBAE/BpT,OAAQ,0BACR6d,OAAQ,SAAUlsB,EAAGgsB,IACnBA,GAAGC,OAAO10B,IAAI,aAAc1B,EAAE8E,QAAQwxB,cAExCC,YAAa,wBACbC,SAAU,EACVC,QAAS,IACT9O,YAAa,WACb+O,MAAO,SAAUvsB,EAAGgsB,IAClBA,GAAGvoB,KAAKqE,SAASgG,SAAS,wBAC1Bke,GAAGC,OAAO10B,IAAI,aAAc1B,EAAE8E,QAAQwxB,cAExCK,KAAM,WACJ3nB,MAAM6mB,eAIZrlB,SAAU,IACVxB,SACApJ,YAAa4D,UAAUoH,mBAAmB,wEAMhDjM,QAAQC,OAAO,uBACb,kCAKFD,QAAQC,OAAO,2CACb,wBACA,4BAECsI,UAAU,gCAAiC,SAAUnI,EAAGyE,UAAWvE,QAClE,OACEY,WAAY,SAAUZ,OAAQkI,OAAQ8nB,wBAEpC9nB,OAAO+nB,UAAYD,uBAAuBE,UAC1ChoB,OAAOypB,iBAAmB3xB,SAC1BkI,OAAO0pB,eAAiB5xB,SAAS6c,IAAI,EAAG,QACxC3U,OAAO2pB,cACLpG,QAAS,GACTqG,SAAS,GAGX9B,uBAAuB+B,SACpBxuB,KAAK,WACJ2E,OAAO8pB,qBAAuB9pB,OAAO+nB,UAAUgC,WAAWC,OAAOhqB,OAAO+nB,UAAUkC,qBAGtFjqB,OAAOkqB,gBAAkB,SAAUC,WACjCrC,uBAAuBsC,iBAAiBD,UAAUx3B,IAC/C0I,KAAK,WACJ2E,OAAO2pB,cACLpG,QAAS,kCACTqG,SAAS,KAGZ7Q,MAAM,SAAUsR,KACfrqB,OAAO2pB,cACLpG,QAAS8G,IACTT,SAAS,MAKjB5pB,OAAOsqB,kBAAoB,WACzBtqB,OAAO2pB,aAAapG,QAAU,IAGhCvjB,OAAOuqB,eAAiB,SAAUvZ,MAGhC8W,uBAAuByC,eAAevZ,KAAK2D,IAAI,EAAG,YAGpD3U,OAAO4oB,gBAAkB,WACvB,MAAOd,wBAAuBe,yBAGhC7oB,OAAOwqB,gBAAkB,WACvB,MAAO1C,wBAAuB2C,0BAGhCzqB,OAAO0qB,sBAAuB,EAC9B1qB,OAAO2qB,kBAAoB,WAEpB3qB,OAAO0qB,uBACV1qB,OAAO0qB,sBAAuB,EAC9B5C,uBAAuB8C,oBACrBC,KAAM7qB,OAAOypB,iBAAiBqB,cAC9BC,GAAI/qB,OAAO0pB,eAAeoB,gBAEzB9e,QAAQ,WACPhM,OAAO0qB,sBAAuB,OAKxC9oB,KAAM,SAAUC,MAAOvP,QAASkjB,MAE9B,GAAIwV,eAAgB,SAAUb,WAC5B,GAAIc,SAWJ,OAREA,UAFEd,UAAUe,aAEDf,UAAUe,aACZrpB,MAAMkmB,UAAUoD,YAEdtpB,MAAMkmB,UAAUoD,YAGhBrzB,SAKf+J,OAAMioB,wBACNjoB,MAAMupB,gBAAkB,gBACxB,IAAIC,YAAa,WACf,GAAIC,eAAgBzpB,MAAMkmB,UAAUgC,WAAWC,OAAOnoB,MAAMkmB,UAAUkC,kBAEtEpoB,OAAMioB,qBAAuBlyB,EAAEsb,MAAMoY,eAClCC,OAAOP,eACPQ,QAAQ,SAAUrB,WACjB,MAAOa,eAAcb,WAAW9zB,OAAOwL,MAAMupB,mBAE9CK,QACAjrB,IAAI,SAAUkrB,MACb,OAAQ5zB,OAAO4zB,KAAK,GAAI7pB,MAAMupB,iBAAkBM,KAAK,MAEtDH,OAAO,SAAUG,MAChB,MAAOA,MAAK,KAEb5rB,QAGL+B,OAAM8pB,iBAAiB,uBAAwBN,YAC/CxpB,MAAM8pB,iBAAiB,8BAA+BN,aAGxDhoB,SAAU,IACVxB,SACApJ,YAAa4D,UAAUoH,mBAAmB,8FAMhDjM,QAAQC,OAAO,iCACb,4CAKFD,QAAQC,OAAO,wCACb,wBACA,4BAECsI,UAAU,6BAA8B,SAAU1D,WACjD,OACE3D,WAAY,SAAUsH,OAAQ8nB,wBAE5B9nB,OAAO+nB,UAAYD,uBAAuBE,UAC1ChoB,OAAO4rB,kBAAoB,GAE3B9D,uBAAuB+B,SACpBxuB,KAAK,WACJ2E,OAAO4rB,kBAAoB5rB,OAAO+nB,UAAU8D,cAAcxtB,OAG9D2B,OAAO8rB,YAAc,SAAUztB,OAC7B,SAAWA,MACTypB,uBAAuBiE,iBACpB1wB,KAAK,WACJysB,uBAAuBkE,aAAa3tB,SAEvCA,OAGL2B,OAAO4oB,gBAAkB,WACvB,MAAOd,wBAAuBe,0BAGlCxlB,SAAU,IACVxB,SACApJ,YAAa4D,UAAUoH,mBAAmB,wFAMhDjM,QAAQC,OAAO,8BACb,yCAKFD,QAAQC,OAAO,iCACb,wBACA,4BAECsI,UAAU,sBAAuB,SAAU1D,WAC1C,OACE3D,WAAY,SAAUsH,OAAQ8nB,wBAE5B9nB,OAAO+nB,UAAYD,uBAAuBE,UAE1ChoB,OAAOisB,UAAY,WACjBnE,uBAAuBoE,sBAGzBlsB,OAAOmsB,gBAAkB,WAEvBrE,uBAAuBsE,yBAGvBtE,uBAAuBuE,sBAAsBrsB,OAAO+nB,UAAUoD,cAGhEnrB,OAAO4oB,gBAAkB,WACvB,MAAOd,wBAAuBe,0BAGlCxlB,SAAU,IACVxB,SACApJ,YAAa4D,UAAUoH,mBAAmB,wEAMhDjM,QAAQC,OAAO,uBACb,kCAKFD,QAAQC,OAAO,mCACb,wBACA,eACA,eACA,0BACA,2BAECsI,UAAU,wBAAyB,SAAU1D,WAC5C,OACE3D,WAAY,SAAUd,EAAGE,OAAQkI,OAAQsI,UAAWwf,wBAElD9nB,OAAO+nB,UAAYD,uBAAuBE,UAC1ChoB,OAAOssB,WAAahkB,UAAUT,SAASuI,MAAQ,IAE/CpQ,OAAOusB,SAAW,WAChBzE,uBAAuB0E,oBAAoBpc,KAAMpQ,OAAOssB,aAAa,IAYvEtsB,OAAOysB,iBAAmB,SAAU1wB,SAClC,GAAI2wB,kBACD1sB,OAAO+nB,UAAU8D,eAClBj0B,EAAEqL,YAAYrL,EAAE9C,KAAKkL,OAAO+nB,UAAU8D,cAAc9vB,SAAUpJ,GAAIoJ,QAAQpJ,MACxEg6B,mBACgC,OAAjC3sB,OAAO+nB,UAAUoD,aAChBrzB,SAAS80B,QAAQ7wB,QAAQE,WACzB4wB,gBACgC,OAAjC7sB,OAAO+nB,UAAUoD,aAChBrzB,SAAS8tB,SAAS5lB,OAAO+nB,UAAUoD,cACnCnrB,OAAO+nB,UAAUoD,YAAYyB,QAAQ7wB,QAAQE,UAEjD,OAAOywB,oBAAqBC,oBAAsBE,kBAGpD7sB,OAAO8sB,YAAc,SAAUxQ,SAC7BwL,uBAAuBiF,mBAAmBzQ,UAG5Ctc,OAAOgtB,aAAe,SAAU1Q,SAC9BwL,uBAAuBmF,oBAAoB3Q,UAG7Ctc,OAAOwoB,WAAa,WAClBV,uBAAuBW,qBAGzBzoB,OAAO4oB,gBAAkB,WACvB,MAAOd,wBAAuBe,0BAGlCjnB,KAAM,SAAUC,MAAOvP,QAASkjB,MAE9B3T,MAAMqrB,MAAQ,KACdrrB,MAAMsrB,aAAe,SAAU7Q,SAC7B,GAAI8Q,SAAS,CAKb,OAJKvrB,OAAM+mB,oBACT/mB,MAAMqrB,MAAQ5Q,QAAQ3pB,GACtBy6B,QAAS,GAEJA,QAGTvrB,MAAMwrB,WAAa,WAEjB,MADAxrB,OAAMqrB,MAAQ,MACP,GAGTrrB,MAAMyrB,aAAe,SAAUhR,SAC7B,MAAOza,OAAMqrB,QAAU5Q,QAAQ3pB,KAGnC0Q,SAAU,IACVxB,SACApJ,YAAa4D,UAAUoH,mBAAmB,4EAMhDjM,QAAQC,OAAO,yBACb,oCASFD,QAAQC,OAAO,2BACb,kBACA,SACA,gBAEC+D,QAAQ,yBAA0B,SAAU3I,EAAG+E,EAAGE,OAAQsE,GAAIlC,YAC3DwU,eAAgBwQ,oBAElB,GAAI4I,wBAAyB5wB,IAC7B4wB,wBAAuByF,cACrBC,WAAYtO,mBAAmB8I,UAC/ByF,cAAe,KACfC,OAAQ,KACRC,UACA1D,qBACAF,cACA8B,cAAe,KACfV,YAAa,KAEf,IAAIpb,OAAQ+X,uBAAuByF,aAG/BK,WAAaxxB,GAAGK,QAEhBoxB,wBACFC,OAAQ,SACRC,OAAQ,SACRC,QAAS,UAEXlG,wBAAuB+F,uBAAyBA,sBAEhD,IAAII,0BACFC,0BAA6BL,uBAAuBC,OACpDK,0BAA6BN,uBAAuBE,OACpDK,2BAA8BP,uBAAuBG,SAEnDK,wBACFz2B,EAAE02B,OAAOL,wBAAyB,SAAU9lB,OAAQiW,IAAKW,KAEvD,MADA5W,QAAOiW,KAAOW,IACP5W,YAIPomB,qBAAsB,EAEtBC,sBAAuB,CAQ3B1G,wBAAuBe,sBAAwB,WAC7C,MAAO0F,sBASTzG,uBAAuB2C,uBAAyB,WAC9C,MAAO+D,uBAST1G,uBAAuBiE,eAAiB,SAAUxP,SAChD,GAAI5S,UAAWvN,GAAGK,OAGlB,OAAK8xB,sBAwBH5kB,SAASxM,SAGJwM,SAASzL,UA1BdqwB,qBAAsB,EAEf7f,eAAe/T,IAAI,SAASsU,QAAQsN,SACxClhB,KAAK,SAAUF,MAUd,MATA4U,OAAM4d,OAASxyB,KAEfvD,EAAE62B,KAAK1e,MAAM4d,OAAQ,SAAUe,OAC7BA,MAAMC,OAAQ,IAGhBhlB,SAAS1L,UAGF8R,MAAM4d,SAEd5U,MAAM,SAAUsR,KAEf,MADA1gB,UAASxM,SACFktB,MAERre,QAAQ,WACPuiB,qBAAsB,MAY9BzG,uBAAuBa,uBAAyB,iBACvC5Y,OAAM8b,cAAc8C,OAM7B7G,uBAAuB8G,uBAAyB,WAC9C7e,MAAM8b,cAAc8C,OAAQ,GAO9B7G,uBAAuB+G,oBAAsB,WAC3C9e,MAAMga,cACNyE,sBAAuB,GASzB1G,uBAAuBoE,mBAAqB,WAC1C,GAAIzvB,OAAQL,GAAGK,OAyCf,OAvCIsT,OAAMob,aAAepb,MAAMob,YAAYyB,QAAQ90B,WACjDgwB,uBAAuB+G,sBAGvBj3B,EAAE62B,KAAK1e,MAAMka,kBAAmB,SAAUE,WAExCA,UAAU3xB,KAAOuX,MAAMob,YAAcpb,MAAMob,YAAYL,cAAgB,WAEhEX,WAAU2E,YAInB/e,MAAM8b,cAAclxB,IAAI,cAAcS,KAAK2U,MAAMka,mBAC9C5uB,KAAK,WACJoB,MAAMwB,QAAQ8R,MAAM8b,iBAIxB/D,uBAAuBsE,0BAEbrc,MAAMob,YAgBhB1uB,MAAMU,OAAO,wCAdb2qB,uBAAuBsE,yBAEvBtE,uBAAuB+G;AAGvB9e,MAAM8b,cAAchJ,MACjBxnB,KAAK,WACJoB,MAAMwB,QAAQ8R,MAAM8b,iBAErB9S,MAAM,SAAUsR,KACf5tB,MAAMU,OAAOktB,QAOZ5tB,MAAMyB,SASf4pB,uBAAuB0E,mBAAqB,WAC1C,MAAOtN,oBAAmBC,eAAe4P,MAAM7P,mBAAoBlD,YAYrE8L,uBAAuBkH,cAAgB,SAAUC,OAC/C,GAAIxyB,OAAQL,GAAGK,OAEf,IAAKqrB,uBAAuBoH,yBA0B1BzyB,MAAMwB,cAzBN,IAAK6pB,uBAAuBqH,oBAqB1B1yB,MAAMU,OAAO,0CArBkC,CAC/C,GAAIiyB,QAASx3B,EAAEy3B,IAAItf,MAAMka,kBAAmB,aAAa6E,UACrDQ,OAASF,OAASA,OAAS,EAAI,EAC/BG,SAAW33B,EAAE0Y,QACfwe,UAAWQ,OACXE,UAAWnB,wBAAwBY,MAAMQ,YAAc,GACvDf,MAAO3e,MAAM8b,cAAcl5B,GAC3B+8B,SAAS,EACT3zB,QAAS,KACT4zB,cAAe,GACfnf,MAAO,MACNye,OAEC9E,UAAYjwB,YAAY01B,sBAC1B7f,MAAM8b,cAAclxB,IAAI,cAAe40B,SAEzCxf,OAAMka,kBAAkB1wB,KAAK4wB,WAE7B1tB,MAAMwB,QAAQksB,WAUlB,MAAO1tB,OAAMyB,SAUf4pB,uBAAuBsC,iBAAmB,SAAUz3B,IAClD,GAAI8J,OAAQL,GAAGK,QAGX+T,MAAQ5Y,EAAEi4B,UAAU9f,MAAMga,YAAap3B,GAAIA,KAC3Cw3B,UAAYpa,MAAMga,WAAWvZ,MAuBjC,OAtBI2Z,WACEA,UAAUe,aAAa0B,QAAQ90B,UACjCqyB,UAAU7zB,SACP+E,KAAK,WAEJ0U,MAAMga,WAAW7Y,OAAOV,MAAO,GAC/B/T,MAAMwB,YAEP8a,MAAM,SAAUsR,KACI,MAAfA,IAAIyF,OACNrzB,MAAMU,OAAO,oCAEbV,MAAMU,OAAOktB,OAInB5tB,MAAMU,OAAO,2CAGfV,MAAMU,OAAO,0CAA4CxK,GAAK,eAGzD8J,MAAMyB,SAMf4pB,uBAAuBsE,uBAAyB,WAC9Crc,MAAMka,qBACNnC,uBAAuB8G,0BAczB9G,uBAAuB8C,mBAAqB,SAAUhjB,QACpD,MAAOmI,OAAM8b,cAAc5c,QAAQ,aAAcrH,QAC9CvM,KAAK,SAAUF,MAWd,MATA4U,OAAMga,WAAa5uB,KAEnBvD,EAAE62B,KAAK1e,MAAMga,WAAY,SAAUI,WACjCA,UAAUsF,UAAYxB,wBAAwB9D,UAAUqF,WACxDrF,UAAUe,aAAepzB,OAAOqyB,UAAU3xB,QAG5Cg2B,sBAAuB,EAEhBze,MAAMga,aAEdhR,MAAM,SAAUsR,KACf,MAAOA,QAWbvC,uBAAuBkE,aAAe,SAAU3tB,MAQ9C,MANA0R,OAAM8b,cAAgBj0B,EAAE9C,KAAKib,MAAM4d,QAAStvB,KAAMA,QAAU0R,MAAM4d,OAAO,GAGzE7F,uBAAuBsE,yBAGhBtE,uBAAuBuE,sBAAsBtc,MAAMob,cAS5DrD,uBAAuBO,wBAA0B,SAAU0H,WACzD,GAAItzB,OAAQL,GAAGK,QACX3G,EAAI8B,EAAEi4B,UAAU9f,MAAM8b,cAAc9vB,SAAUpJ,GAAIo9B,WAiBtD,OAhBIj6B,IAAK,EAEPgyB,uBAAuBkH,eACrBS,UAAW5B,uBAAuBE,OAClChyB,QAASg0B,UACTJ,cAAe5f,MAAM8b,cAAc9vB,QAAQjG,GAAGkG,QAC7CX,KAAK,WACNysB,uBAAuBa,yBACvB5Y,MAAM8b,cAAc9vB,QAAQmV,OAAOpb,EAAG,GACtC2G,MAAMwB,YACL8a,MAAM,SAAUsR,KACjB5tB,MAAMU,OAAOktB,OAGf5tB,MAAMU,OAAO,mDAERV,MAAMyB,QAUf,IAAIyY,QAAS,SAAUqZ,UAAWC,SAChC,GAAIC,MAAM,EACNn0B,QAAUgU,MAAM8b,cAAc9vB,OAClC,IAAIi0B,WAAa,GAAKA,UAAYj0B,QAAQ/F,QACtCi6B,SAAW,GAAKA,QAAUl0B,QAAQ/F,OAAQ,CAC5C,GAAIm6B,SAAUp0B,QAAQmV,OAAO8e,UAAW,EAAGj0B,QAAQk0B,SAC/CE,SAAQn6B,OAAS,IACnB+F,QAAQk0B,SAAWE,QAAQ,GAC3BD,KAAM,EACNpI,uBAAuBa,0BAG3B,MAAOuH,KASTpI,wBAAuBI,cAAgB,SAAU1X,OAC/C,MAAOmG,QAAOnG,MAAOA,MAAQ,IAS/BsX,uBAAuBM,cAAgB,SAAU5X,OAC/C,MAAOmG,QAAOnG,MAAOA,MAAQ,IAQ/BsX,uBAAuBiF,mBAAqB,SAAUzQ,SACpDvM,MAAM0d,cAAgBnR,QACtBvM,MAAM2d,OAASG,uBAAuBC,QAQxChG,uBAAuBmF,oBAAsB,SAAU3Q,SACrDvM,MAAM0d,cAAgBnR,QACtBvM,MAAM2d,OAASG,uBAAuBG,SAMxClG,uBAAuBW,kBAAoB,WACzC1Y,MAAM0d,cAAgB,KACtB1d,MAAM2d,OAAS,MASjB5F,uBAAuBS,uBAAyB,SAAU/X,OACxD,GAAI7G,UAAWvN,GAAGK,OAmClB,OAjCIsT,OAAM2d,OACR5F,uBAAuBkH,eACrBS,UAAW1f,MAAM2d,OACjB3xB,QAASgU,MAAM0d,cAAc96B,GAC7Bg9B,cAAe5f,MAAM0d,cAAczxB,MACnCwU,MAAOA,QAENnV,KAAK,WAEJ,GAAI+0B,gBAAiBx4B,EAAEi4B,UAAU9f,MAAM8b,cAAc9vB,SAAUpJ,GAAIod,MAAM0d,cAAc96B,IAGnF6d,SAAU4f,gBAAkBA,gBAAkB,GAChDrgB,MAAM8b,cAAc9vB,QAAQmV,OAAOkf,eAAgB,EAIrD,IAAIpW,SAAUjK,MAAM2d,SAAWG,uBAAuBG,OACtDje,OAAM8b,cAAc9vB,QAAQmV,OAAOV,MAAQwJ,QAAU,EAAI,EAAIjK,MAAM0d,eAGnE3F,uBAAuBW,oBAGvBX,uBAAuBa,yBAEvBhf,SAAS1L,YAEV8a,MAAMpP,SAASxM,QAElBwM,SAASxM,OAAO,sCAGXwM,SAASzL,SASlB4pB,uBAAuByC,eAAiB,SAAUvZ,MAQhD,MANAjB,OAAMob,YAAcna,KAGpB8W,uBAAuBsE,yBAGhBtE,uBAAuBuE,sBAAsBtc,MAAMob,cAO5DrD,uBAAuBuI,0BAA4B,WACjDvI,uBAAuByC,eAAe,OAQxCzC,uBAAuBoH,uBAAyB,WAC9C,MAA6B,QAAtBnf,MAAMob,aAQfrD,uBAAuBqH,kBAAoB,WACzC,OAAQrH,uBAAuBoH,0BAC7Bnf,MAAMob,YAAYvF,SAAS9tB,WAU/BgwB,uBAAuBuE,sBAAwB,SAAUrb,MACvD,GAAIpJ,UACAoJ,QACFpJ,OAAO2I,QAAUS,KAAK8Z,eAGxBhD,uBAAuB+G,qBAEvB,IAAIllB,UAAWvN,GAAGK,OAuBlB,OApBK8xB,qBAiBH5kB,SAASxM,UAhBToxB,qBAAsB,EACtBxe,MAAM8b,cAAc1tB,IAAIyJ,QACrBvM,KAAK,SAAUF,MAGd,MAFAwO,UAAS1L,UACT8R,MAAM8b,cAAgB1wB,KACf4U,MAAM8b,gBAEd9S,MAAM,SAAUsR,KAEf,MADA1gB,UAASxM,SACFktB,MAERre,QAAQ,WACP8b,uBAAuB8G,yBACvBL,qBAAsB,KAMrB5kB,SAASzL,SAUlB4pB,uBAAuBE,QAAU,WAC/B,MAAOjY,QAMT+X,uBAAuB+B,OAAS,WAC9B,MAAO+D,YAAW1vB,SAIpB4pB,uBAAuBiE,iBACpB1wB,KAAK,WACJ,MAAOysB,wBAAuB0E,uBAE/BnxB,KAAK,WACJ,MAAOysB,wBAAuBkE,iBAE/B3wB,KAAK,WAEJuyB,WAAW3vB,cAOnBzG,QAAQC,OAAO,uCACb,wBACA,4BAECsI,UAAU,4BAA6B,SAAU1D,WAChD,OACE3D,WAAY,SAAUZ,OAAQkI,OAAQ8nB,wBAEpC9nB,OAAOswB,YAAcxI,uBAAuBE,UAE5ChoB,OAAOuqB,eAAiB,SAAUY,aAChCrD,uBAAuByC,eAAeY,cAGxCnrB,OAAOqwB,0BAA4B,WACjCrwB,OAAOmrB,YAAc,KACrBrD,uBAAuBuI,6BAGzBrwB,OAAO4oB,gBAAkB,WACvB,MAAOd,wBAAuBe,0BAGlCxlB,SAAU,IACVxB,SACApJ,YAAa4D,UAAUoH,mBAAmB,sFAMhDjM,QAAQC,OAAO,6BACb,wCAKFD,QAAQC,OAAO,mBACb,wBACA,6BACA,sBACA,wBACA,4BACA,kCAECU,OAAO,SAAU8R,UAAW5R,eAAgB6R,mBAC3C,GAAI7N,WAAY4N,UAAUE,OAAOD,kBAAkBE,KAEnD/R,gBACGG,KAAK,uBACJE,YACE,UAAW,YACX,SAAUoN,SACRA,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,sBAGtDrR,YAAa4D,UAAUoH,mBAAmB,0CAC1C9K,gBAAgB,MAMxBnB,QAAQC,OAAO,4BACb,+BACA,wBACA,SACA,uBACA,WAECsI,UAAU,gBAAiB,SAAU1D,WACpC,OACE3D,WAAY,SAAUd,EAAG0Q,UAAWlM,GAAImM,aAAcvI,OAAQuwB,UACpC,QAApBhoB,aAAa5V,IACfqN,OAAOyI,MAAQ8nB,SAAS7nB,SACxB1I,OAAO2I,OAAQ,GAEf3I,OAAOyI,MAAQ8nB,SAAS3nB,MAAML,aAAa5V,IAG7CgF,OAAOkR,eAAiB,SAAU7L,GAChC,IAAKpF,EAAE6J,QAAQzB,OAAOyI,MAAMK,WAAa9I,OAAO2I,OAAS3I,OAAO+I,UAC9D,MAAO,6BAIX/I,OAAOgJ,IAAI,WAAY,iBACdrR,QAAOkR,iBAGhB7I,OAAOuJ,UAAY,WACjB,GAAIrL,QAEJ,IAAI8B,OAAOyI,MACTvK,QAAU8B,OAAOyI,MAAMe,QAAQC,aAAapO,KAAK,SAAUF,MACzDmN,UAAUoB,KAAK,4BAA8BvO,KAAKxI,GAAK,WAEpD,CACL,GAAIgX,UAAWvN,GAAGK,OAClBkN,UAASxM,SACTe,QAAUyL,SAASzL,QAGrB,MAAOA,WAGXmF,SAAU,IACVxB,OACE+H,WAAY,YAEdnR,YAAa4D,UAAUoH,mBAAmB,yEAMhDjM,QAAQC,OAAO,kBACb,wBACA,6BAECU,OAAO,SAAUE,gBAChBA,eACCG,KAAK,iCACJE,WAAY,SAAU6P,aAAcvI,OAAQ8F,QAASzJ,WACnDyJ,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,oBAClD9J,OAAO+J,QAAUxB,aAAa5V,IAEhCqX,SAAU,mDACVrR,gBAAgB,MAMtBnB,QAAQC,OAAO,kBACX,+BACA,wBACA,aAEDU,OAAO,SAAU8R,UAAW5R,eAAgB6R,mBAC3C,GAAI7N,WAAY4N,UAAUE,OAAOD,kBAAkBE,KAEnD/R,gBACGG,KAAK,wBACJE,WAAY,SAASsS,OAAQhL,OAAQ8F,QAASyqB,UAC5CzqB,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,gBAElD9J,OAAOqK,aAAekmB,SAEtBvwB,OAAOwwB,oBAAsB,WAC3B,MAAOxlB,QAAOC,MACZxS,YAAa,4CACbC,WAAY,6BAIhBsH,OAAOywB,iBACLz0B,MAAO,aACPa,MAAO,WACLmD,OAAOwwB,uBAETE,cAAe,2BACfC,YAAa,kBAIjBl4B,YAAa4D,UAAUoH,mBAAmB,0EAMlDjM,QAAQC,OAAO,gCACb,mCACA,kCACA,wBACA,SACA,uBACA,WAECsI,UAAU,oBAAqB,SAAU1D,WACxC,OACE3D,WAAY,SAAUd,EAAG0Q,UAAW5O,MAAO0C,GAAImM,aAAcvI,OAAQ0O,eAAgBkiB,YAAaC,aAAc54B,OAC9G,GAAI64B,aAAc,iCAEM,SAApBvoB,aAAa5V,IACfqN,OAAOyI,MAAQooB,aAAanoB,SAC5B1I,OAAO2I,OAAQ,IAEf3I,OAAOyI,MAAQooB,aAAajoB,MAAML,aAAa5V,IAC/CqN,OAAOyI,MAAMsoB,SAAS11B,KAAK,WACpB2E,OAAOyI,MAAMuoB,eAAe,SAAmC,OAAtBhxB,OAAOyI,MAAM6R,OACzDta,OAAOyI,MAAM6R,KAAOta,OAAOyI,MAAM6R,KAAK3nB,OAK5CgF,OAAOkR,eAAiB,SAAU7L,GAChC,IAAKpF,EAAE6J,QAAQzB,OAAOyI,MAAMK,WAAa9I,OAAO2I,OAAS3I,OAAO+I,UAC9D,MAAO,6BAIX/I,OAAOgJ,IAAI,WAAY,iBACdrR,QAAOkR,iBAGhB7I,OAAOixB,eAAiB,SAAUC,QAChC,GAAIlxB,OAAOgxB,eAAe,SAAU,CAClC,IAAK,GAAIl7B,GAAI,EAAGA,EAAIkK,OAAOmxB,MAAMn7B,OAAQF,IACvC,GAAIkK,OAAOmxB,MAAMr7B,GAAGnD,KAAOu+B,OACzB,MAAOlxB,QAAOmxB,MAAMr7B,GAAGs7B,YAG3B,OAAO,QAIXpxB,OAAOqxB,eAAiB,WACtB,MAAiD,gBAA7CrxB,OAAOixB,eAAejxB,OAAOyI,MAAM6R,OAMzCta,OAAOsxB,cAAgB,WACrB,MAAiD,WAA7CtxB,OAAOixB,eAAejxB,OAAOyI,MAAM6R,OAMzCta,OAAOuxB,YAAc,WACnB,MAAiD,cAA7CvxB,OAAOixB,eAAejxB,OAAOyI,MAAM6R,OAMzCta,OAAOwxB,eAAiB,WACjBxxB,OAAOyI,MAAMuoB,eAAe,kBAC/BhxB,OAAOyI,MAAMgpB,iBAGfzxB,OAAOyI,MAAMgpB,aAAal4B,MACxBm4B,YAAa,KACbC,KAAM,KAIV3xB,OAAO4xB,gBAAkB,WACvBl4B,OACE8D,OAAQ,MACRhH,IAAKs6B,cACJh6B,QAAQ,SAAUqE,MACnB6E,OAAOyxB,aAAet2B,KAAK0F,SAAW1F,OACrC7D,MAAM,SAAU6D,KAAM20B,OAAQr5B,QAAS0B,QACxCF,MAAMurB,eAAe,+BAAgCqO,MAAO12B,UAIhE6E,OAAO8xB,SAAW,WAChBp4B,OACA8D,OAAQ,MACRhH,IAAKs6B,cACAh6B,QAAQ,SAAUqE,MACnB6E,OAAOmxB,MAAQh2B,KAAK0F,SAAW1F,OAC9B7D,MAAM,SAAU6D,KAAM20B,OAAQr5B,QAAS0B,QACxCF,MAAMurB,eAAe,wBAAyBqO,MAAO12B,UAI3D6E,OAAO+xB,mBAAqB,SAAU3xB,YACpC,MAAOwwB,aAAYoB,aAAa5xB,aAGlCJ,OAAOuJ,UAAY,WACjB,GAAIrL,QAEJ,IAAI8B,OAAOyI,MACTvK,QAAU8B,OAAOyI,MAAMe,QAAQC,aAAapO,KAAK,SAAUF,MACzDmN,UAAUoB,KAAK,gCAAkCvO,KAAKxI,GAAK,KACtDqN,OAAOyI,MAAMuoB,eAAe,SAAmC,OAAtBhxB,OAAOyI,MAAM6R,OACzDta,OAAOyI,MAAM6R,KAAOta,OAAOyI,MAAM6R,KAAK3nB,UAGrC,CACL,GAAIgX,UAAWvN,GAAGK,OAClBkN,UAASxM,SACTe,QAAUyL,SAASzL,QAGrB,MAAOA,UAGT8B,OAAO8xB,WACP9xB,OAAO4xB,mBAETvuB,SAAU,IACVxB,OACE+H,WAAY,YAEdnR,YAAa4D,UAAUoH,mBAAmB,iFAMhDjM,QAAQC,OAAO,sBACb,wBACA,iCAECU,OAAO,SAAUE,gBAChBA,eACGG,KAAK,qCACJE,WAAY,SAAU6P,aAAcvI,OAAQ8F,QAASzJ,WACnDyJ,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,wBAClD9J,OAAO+J,QAAUxB,aAAa5V,IAEhCqX,SAAU,2DACVrR,gBAAgB,MAMxBnB,QAAQC,OAAO,sBACX,mCACA,wBACA,aAEDU,OAAO,SAAU8R,UAAW5R,eAAgB6R,mBAC3C,GAAI7N,WAAY4N,UAAUE,OAAOD,kBAAkBE,KAEnD/R,gBACGG,KAAK,4BACJE,WAAY,SAASsH,OAAQ8F,QAAS+qB,cACpC/qB,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,oBAClD9J,OAAOqK,aAAewmB,cAGxBp4B,YAAa4D,UAAUoH,mBAAmB,kFAMlDjM,QAAQC,OAAO,wBACb,gCACA,wBACA,SACA,uBACA,WAECC,SAAS,kBAEN2G,KAAM,YACNyB,MAAO,cAGPzB,KAAM,cACNyB,MAAO,gBAGPzB,KAAM,SACNyB,MAAO,WAGPzB,KAAM,SACNyB,MAAO,YAGVC,UAAU,YAAa,SAAU1D,WAChC,OACE3D,WAAY,SAAUd,EAAG0Q,UAAWlM,GAAImM,aAAcvI,OAAQiyB,KAAMC,eAElElyB,OAAOoQ,KAAO,gBACdpQ,OAAOkyB,cAAgBA,cAEC,QAApB3pB,aAAa5V,IACfqN,OAAOyI,MAAQwpB,KAAKvpB,SACpB1I,OAAO2I,OAAQ,GAEf3I,OAAOyI,MAAQwpB,KAAKrpB,MAAML,aAAa5V,IAAIw/B,MAAM,WAC/CnyB,OAAOyI,MAAM2pB,mBAAmBC,SAChCryB,OAAOyI,MAAM6pB,WAAWD,SACxBryB,OAAOyI,MAAM8pB,aAAaF,WAI9B16B,OAAOkR,eAAiB,SAAU7L,GAChC,IAAKpF,EAAE6J,QAAQzB,OAAOyI,MAAMK,WAAa9I,OAAO2I,OAAS3I,OAAO+I,UAC9D,MAAO,6BAIX/I,OAAOgJ,IAAI,WAAY,iBACdrR,QAAOkR,iBAGhB7I,OAAOwyB,aAAe,WACpB,GAAIC,cAAeP,cAAcQ,MAAM,EAAG,EAC1C,SAAID,aAAap1B,QAAQ2C,OAAOyI,MAAMkqB,aAAe,IAOvD3yB,OAAO4yB,cAAgB,WACrB,GAAIC,SAkBJ,OAhBI7yB,QAAOyI,MAAMuoB,eAAe,eAAiBp5B,EAAE6J,QAAQzB,OAAOyI,MAAMqqB,UAAUhqB,WAChF+pB,MAAMt5B,KAAKyG,OAAOyI,MAAMqqB,WAItB9yB,OAAOyI,MAAMuoB,eAAe,iBAAmBp5B,EAAE6J,QAAQzB,OAAOyI,MAAMsqB,YAAYjqB,WAClF+pB,MAAMt5B,KAAKyG,OAAOyI,MAAMsqB,aAI5B/yB,OAAOyI,MAAM2pB,mBAAmBza,QAAQ,SAAUga,MAC3C/5B,EAAE6J,QAAQkwB,KAAK7oB,WAClB+pB,MAAMt5B,KAAKo4B,QAIRkB,OAGT7yB,OAAOgzB,eAAiB,WACtB,GAAIC,YAAajzB,OAAO4yB,eACxBK,YAAWtb,QAAQ,SAAUga,MAC3BA,KAAKnoB,WAITxJ,OAAOuJ,UAAY,WACjB,GAAIrL,QAEJ,IADA8B,OAAOgzB,iBACHhzB,OAAOyI,MACTvK,QAAU8B,OAAOyI,MAAMe,QAAQC,aAAapO,KAAK,SAAUF,MACzDmN,UAAUoB,KAAK,uBAAyBvO,KAAKxI,GAAK,WAE/C,CACL,GAAIgX,UAAWvN,GAAGK,OAClBkN,UAASxM,SACTe,QAAUyL,SAASzL,QAErB,MAAOA,WAGXmF,SAAU,IACVxB,OACE+H,WAAY,YAEdnR,YAAa4D,UAAUoH,mBAAmB,+DAMhDjM,QAAQC,OAAO,cACb,wBACA,yBAECU,OAAO,SAAUE,gBAChBA,eACCG,KAAK,4BACJE,WAAY,SAAU6P,aAAcvI,OAAQ8F,QAASzJ,WACnDyJ,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,eAClD9J,OAAO+J,QAAUxB,aAAa5V,IAEhCqX,SAAU,+CACVrR,gBAAgB,MAMtBnB,QAAQC,OAAO,cACX,gCACA,wBACA,aAEDU,OAAO,SAAU8R,UAAW5R,eAAgB6R,mBAC3C,GAAI7N,WAAY4N,UAAUE,OAAOD,kBAAkBE,KAEnD/R,gBACGG,KAAK,mBACJE,WAAY,SAASsH,OAAQ8F,QAASmsB,MACpCnsB,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,WAClD9J,OAAOqK,aAAe4nB,MAExBx5B,YAAa4D,UAAUoH,mBAAmB,gEAMlDjM,QAAQC,OAAO,WACb,iBACA,iBACA,qBACA,qBACA,aACA,eAKFD,QAAQC,OAAO,2BACb,8BACA,eACA,wBACA,aACA,eACA,SACA,uBACA,oBACA,WAECsI,UAAU,eAAgB,SAAU1D,WACnC,OACE3D,WAAY,SAAUd,EAAG0Q,UAAWlM,GAAI4D,OAAQkzB,uBAAwBC,SAEtEnzB,OAAO+lB,SAAW1pB,UAAU2pB,iBAAiBkN,wBAE7ClzB,OAAO+I,WAAY,CAEnB,IAAIkd,SAAUjmB,OAAO4J,YACL,SAAZqc,SAEFjmB,OAAOyI,MAAQ0qB,QAAQzqB,SACvB1I,OAAO2I,OAAQ,GAGf3I,OAAOyI,MAAQ0qB,QAAQvqB,MAAM5I,OAAO4J,cAGtCjS,OAAOkR,eAAiB,SAAU7L,GAChC,IAAKpF,EAAE6J,QAAQzB,OAAOyI,MAAMK,WAAa9I,OAAO2I,OAAS3I,OAAO+I,UAE9D,MAAO,6BAIX/I,OAAOgJ,IAAI,WAAY,iBAEdrR,QAAOkR,iBAGhB7I,OAAOuJ,UAAY,WACjB,GAAIrL,QAEJ,IAAI8B,OAAOyI,MAETvK,QAAU8B,OAAOyI,MAAMe,QAAQC,aAAapO,KAAK,SAAUF,MACzC,QAAZ8qB,SACF3d,UAAUoB,KAAK,yBAA2BvO,KAAKxI,GAAK,KAEtDqN,OAAO2I,OAAQ,EACf3I,OAAO+I,WAAY,QAEhB,CAEL,GAAIY,UAAWvN,GAAGK,OAClBkN,UAASxM,SACTe,QAAUyL,SAASzL,QAGrB,MAAOA,WAGXmF,SAAU,IACVxB,OACE+H,WAAY,YAEdnR,YAAa4D,UAAUoH,mBAAmB,gDAMhDjM,QAAQC,OAAO,iBACb,wBACA,4BAECU,OAAO,SAAUE,gBAChBA,eACGG,KAAK,8BACJE,WAAY,SAAU6P,aAAcvI,OAAQ8F,QAASzJ,WACnDyJ,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,kBAClD9J,OAAO+J,QAAUxB,aAAa5V,IAEhCqX,SAAU,qDACVrR,gBAAgB,MAMxBnB,QAAQC,OAAO,iBACb,8BACA,wBACA,WACA,sBAECU,OAAO,SAAU8R,UAAW5R,eAAgB6R,mBAC3C,GAAI7N,WAAY4N,UAAUE,OAAOD,kBAAkBE,KAEnD/R,gBACGG,KAAK,qBACJE,WAAY,SAAUsH,OAAQ8F,QAASotB,uBAAwBC,SAC7DrtB,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,aAClD9J,OAAOqK,aAAe8oB,QACtBnzB,OAAO+lB,SAAW1pB,UAAU2pB,iBAAiBkN,yBAE/Cz6B,YAAa4D,UAAUoH,mBAAmB,sDAMlDjM,QAAQC,OAAO,wBACZqI,MAAM,yBAA0B,aAInCtI,QAAQC,OAAO,YACb,gBACA,kBAKFD,QAAQC,OAAO,mCACb,2BACA,wBACA,kBACA,WAEC+D,QAAQ,mBACP,IAAK,QAAS,YAAa,uBAAwB,SAAU,QAC7D,SAAU5D,EAAG8B,MAAO2C,UAAW+2B,qBAAsBt7B,OAAQoe,OAE3D,GAAIlJ,UAAW,SAAUsP,SACvB,MAAOjgB,WAAU0P,gBAAgB,UAAWuQ,QAAQ3pB,GAAI,UAGtD8Y,aAAe,SAAUC,SAC3B,GAAIvQ,MAAOvD,EAAE+T,UAAUD,QAAQvQ,KAC/B,OAAOA,MAGT,QACEk4B,aAAc,SAAU/W,QAASwT,OAAQwD,OACvC,MAAO55B,OAAM0B,KACT4R,SAASsP,UACPwT,OAAQA,OACRwD,MAAOA,QAETj4B,KAAK,SAAUqJ,UACf,MAAO+G,cAAa/G,iBASlClN,QAAQC,OAAO,+BACb,kCACA,wBACA,QACA,eACA,uBAECsI,UAAU,2BACT,SAAU,KAAM,YAAa,kBAAmB,QAChD,SAAUiL,OAAQ5O,GAAIC,UAAWk3B,gBAAiBt7B,OAChD,OACEoL,SAAU,IACVxB,OACE2xB,aAAc,IACdC,kBAAmB,IACnB/oB,cAAe,IACfC,UAAW,KAEb/I,KAAM,SAAUC,MAAOvP,SAErBuP,MAAM6xB,SAAWr3B,UAAUs3B,6BAC3B9xB,MAAMgJ,eAAgB,CAEtB,IAAI+oB,mBAAoB,WACtB/xB,MAAM8hB,WAAa,WACjB9hB,MAAMmX,aAAe,IAGvBnX,MAAMwxB,aAAe,SAAUvD,OAAQ+D,MAGrC,MAFAhyB,OAAM8hB,aAEC4P,gBAAgBF,aACrBxxB,MAAM2xB,aACN1D,OACA,WAAaA,OAAS,OAAS+D,MAEhCx4B,KAAKwG,MAAMgJ,cAAckK,OACzBgE,MAAM,SAAUrU,UACfzM,MAAMurB,eAAe,sCACnB9e,SAAUA,WAEZ7C,MAAMmX,aAAe,wBAIzBnX,MAAMgJ,cAAgBG,OACnBC,MACCpJ,MAAOA,MACPpJ,YAAa4D,UAAUoH,mBACrB,uBACA,+BAIN5B,MAAMgJ,cAAc1C,OACjB9M,KAAKwG,MAAM8I,WACXoO,MAAMlX,MAAM6I,eACZsB,QAAQ,WACPnK,MAAMgJ,eAAgB,IAI5BvY,SAAQwY,SAAS,+BACjBxY,QAAQyY,GAAG,QAAS,WAEblJ,MAAMgJ,eAETzO,GAAG5D,KAAKqJ,MAAM4xB,qBACXp4B,KAAK,SAAU8M,QAEVA,UAAW,GACbyrB,6BAYpBp8B,QAAQC,OAAO,kCACb,+BACA,sCACA,wBACA,uBACA,aACA,eACA,SACA,2BACA,SACA,uBACA,YACA,gCAECsI,UAAU,sBAAuB,SAAU1D,WAC1C,OACE3D,WAAY,SAAUd,EAAG0Q,UAAWlM,GAAI4D,OAAQgL,OAAQxC,SACpDsrB,+BAAgCC,iBAElC/zB,OAAOg0B,cAAgBD,gBAAgBC,cACvCh0B,OAAO+lB,SAAW1pB,UAAU2pB,iBAAiB8N,gCAE7C9zB,OAAO+I,WAAY,EAEnB/I,OAAOi0B,yBAEP,IAAIhO,SAAUjmB,OAAO4J,YACL,SAAZqc,SAEFjmB,OAAOyI,MAAQsrB,gBAAgBrrB,SAC/B1I,OAAO2I,OAAQ,GAGf3I,OAAOyI,MAAQsrB,gBAAgBnrB,MAAM5I,OAAO4J,cAAcuoB,MAAM,WAC9DnyB,OAAOyI,MAAMyrB,qBAAqB74B,KAAK,SAAUmM,UAC/CxH,OAAOi0B,uBAAuBzsB,SAAS7U,IAAM6U,aAMnD7P,OAAOkR,eAAiB,SAAU7L,GAChC,IAAKpF,EAAE6J,QAAQzB,OAAOyI,MAAMK,WAAa9I,OAAO2I,OAAS3I,OAAO+I,UAE9D,MAAO,6BAIX/I,OAAOgJ,IAAI,WAAY,iBAEdrR,QAAOkR,iBAGhB7I,OAAOuJ,UAAY,WACjB,GAAIrL,QAEJ,IAAI8B,OAAOyI,MAETvK,QAAU8B,OAAOyI,MAAMe,QAAQC,aAAapO,KAAK,SAAUF,MACzC,QAAZ8qB,SACF3d,UAAUoB,KAAK,kCAAoCvO,KAAKxI,GAAK,KAE/DqN,OAAO2I,OAAQ,EACf3I,OAAO+I,WAAY,QAEhB,CAEL,GAAIY,UAAWvN,GAAGK,OAClBkN,UAASxM,SACTe,QAAUyL,SAASzL,QAGrB,MAAOA,UAGT8B,OAAOm0B,iBAAmB,WACxB,MAAOnpB,QAAOC,MACZxS,YAAa,wCACboJ,MAAO7B,OACP/B,cAIJ+B,OAAOo0B,uBAAyB,SAAUC,YACxC,GAAIA,aAAcr0B,QAAOi0B,uBAAwB,CAC/C,GAAIzsB,UAAWxH,OAAOi0B,uBAAuBI,WAC7C,OAAO7sB,UAASnJ,KAAO,MAAQmJ,SAAS8sB,SAI5Ct0B,OAAO0H,gBAAkB,SAAUtH,YACjC,MAAOJ,QAAOyI,MAAM8rB,kBAAkB1sB,OAAQzH,aAAa/E,KAAK,SAAUm5B,WAKxE,MAJAA,WAAU7c,QAAQ,SAAUnQ,UAC1BxH,OAAOi0B,uBAAuBzsB,SAAS7U,IAAM6U,WAGxCgtB,UAAUh0B,IAAI,SAAUgH,UAAY,MAAOA,UAAS7U,SAIjE0Q,SAAU,IACVxB,OACE+H,WAAY,YAEdnR,YAAa4D,UAAUoH,mBAAmB,wEAMhDjM,QAAQC,OAAO,wBACb,wBACA,mCAECU,OAAO,SAAUE,gBAChBA,eACGG,KAAK,uCACJE,WAAY,SAAU6P,aAAcvI,OAAQ8F,QAASzJ,WACnDyJ,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,2BAClD9J,OAAO+J,QAAUxB,aAAa5V,IAEhCqX,SAAU,yEAMlBxS,QAAQC,OAAO,wBACb,sCACA,wBACA,WACA,SACA,6BAECU,OAAO,SAAU8R,UAAW5R,eAAgB6R,mBAC3C,GAAI7N,WAAY4N,UAAUE,OAAOD,kBAAkBE,KAEnD/R,gBACGG,KAAK,8BACJE,WAAY,SAAUsH,OAAQ8F,QAASzJ,UACnCy3B,+BAAgCC,iBAClCjuB,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,sBAClD9J,OAAOqK,aAAe0pB,gBACtB/zB,OAAO+lB,SAAW1pB,UAAU2pB,iBAAiB8N,iCAE/Cr7B,YAAa4D,UAAUoH,mBAAmB,8EAMlDjM,QAAQC,OAAO,+BACZqI,MAAM,iCAAkC,aAI3CtI,QAAQC,OAAO,mBACb,uBACA,yBAKFD,QAAQC,OAAO,yBACb,0BAECsI,UAAU,eACT,YACA,SAAU1D,WACR,OACE5D,YAAa4D,UAAUoH,mBACrB,eACA,qBAEFJ,SAAU,IACVxB,OACEtP,MAAO,IACPiM,MAAO,KAEToD,KAAM,SAAUC,MAAOvP,QAASsS,OAE9B/C,MAAMiB,OAAO,QAAS,WAChBjB,MAAMtP,OAASsP,MAAMtP,MAAMI,GAC7BkP,MAAMrO,SAAW6I,UAAUoB,iBACzBoE,MAAMtP,MAAMI,GACZkP,MAAMrD,OAAS,OACf,YAGFqD,MAAMrO,UAAW,SAU/BgE,QAAQC,OAAO,uBACb,wBACA,8BACA,WAEC2U,SAAS,sBAAuB,SAAUtU,QACzC,GAAI28B,aACDpsB,MAAO,QAAS0W,IAAK,SAAUjf,MAAO,UACtCuI,MAAO,kBAAmB0W,IAAK,SAAUjf,MAAO,uBAChDuI,MAAO,YAAa0W,IAAK,SAAUjf,MAAO,WAAc,MAAOhI,UAASzB,OAAO,wBAC/EgS,MAAO,YAAa0W,IAAK,QAASjf,MAAO,WAAc,MAAOhI,UAASzB,OAAO,wBAC9EgS,MAAO,MAAO0W,IAAK,KAAMjf,MAAO,MAGnC5I,MAAKw9B,YAAc,SAAUhB,UAC3Be,UAAYf,UAGdx8B,KAAKkT,KAAO,WACV,OACEuqB,YAAa,WACX,MAAOF,gBAQjBj9B,QAAQC,OAAO,0BACb,wBACA,8BACA,wBAECsI,UAAU,eAAgB,SAAUuI,UAAW1Q,EAAGg9B,oBAAqB1V,mBAAoB7iB,WAC1F,OACE5D,YAAa4D,UAAUoH,mBAAmB,oCAC1CJ,SAAU,IACVxB,SACAnJ,WAAY,kBACZkJ,KAAM,SAAkBC,MAAOvP,QAASsS,OAqCtC,QAASiwB,UAASC,QAChB,GAAIh1B,MAMJ,OAJEA,OAD0B,kBAAjBg1B,QAAOh1B,MACRg1B,OAAOh1B,QAEPg1B,OAAOh1B,MAzCnB+B,MAAMwY,QAAUua,oBAAoBD,cASpC9yB,MAAMkzB,SAAW,SAAUD,QACzB,GAAIA,OAAO/V,KAAO+V,OAAO/V,MAAOzW,WAAUT,UACtCS,UAAUT,SAASitB,OAAO/V,OAAS8V,SAASC,QAC9C,OAAO,CACF,KAAKA,OAAO/V,IAAK,CACtB,GAAIiW,cAAep9B,EAAEq9B,MAAMpzB,MAAMwY,QAAS,OACtC6a,WAAat9B,EAAE0f,KAAKhP,UAAUT,SAClC,SAAIjQ,EAAE8f,aAAasd,aAAcE,YAAYl/B,OAAS,GAMxD,OAAO,GAGT6L,MAAMszB,eAAiB,SAAUL,QAC/B,GACIh1B,OADA+H,SAOJ,OALIitB,QAAO/V,MACTjf,MAAQ+0B,SAASC,QACjBjtB,OAAOitB,OAAO/V,KAAOjf,OAGhBof,mBAAmBC,eAAetX,QAAQ,QAmB3DrQ,QAAQC,OAAO,gBACb,2BAKFD,QAAQC,OAAO,+BACb,2BACA,wBACA,kBACA,SACA,WAEC+D,QAAQ,oBACP,IAAK,QAAS,OAAQ,YAAa,uBAAwB,SAAU,QACrE,SAAU5D,EAAG8B,MAAO+L,KAAMpJ,UAAW+2B,qBAAsBt7B,OAAQoe,OAEjE,GAAIkf,sBAAuB/4B,UAAU0P,gBAAgBhP,KAAK,KAAM,iBAC5Ds4B,gBAAkBh5B,UAAU0P,gBAAgBhP,KAAK,KAAM,WAEvD0O,aAAe,SAAUC,SAC3B,GAAIvQ,MAAOvD,EAAE+T,UAAUD,QAMvB,OAJIA,SAAQzP,YACVd,KAAKc,UAAYnE,OAAOyb,GAAG7H,QAAQzP,UAAWI,UAAUmX,oBAGnDrY,MAGLsnB,UAAY,SAAUtnB,MACxB,GAAIuQ,SAAU9T,EAAEsb,MAAM/X,MACnBunB,KAAK,aACL/W,YACA7L,OAMH,OAJI3E,MAAKc,YACPyP,QAAQzP,UAAYd,KAAKc,UAAU5F,UAG9BqV,QAGT,QACE4pB,mBAAoB,SAAUn6B,MAC5B,GAAIuQ,SAAU+W,UAAUtnB,KACxB,OAAOzB,OAAM0B,KACTi6B,gBAAgBnf,MAAM8M,OACpBuS,QAASl5B,UAAUm5B,0BAErB9pB,SACDrQ,KAAK,SAAUqJ,UACd,MAAO+G,cAAa/G,SAASvJ,SAGnCs6B,mBAAoB,SAAUt6B,MAC5B,MAAOzB,OAAMM,OAAOq7B,gBAAgBl6B,KAAKxI,GAAI,OAE/C4kB,SACEvb,MAAO,qBACP05B,MAAO,QACP35B,QAAS,SAAU45B,cACjB,MAAOlwB,MAAKG,YAAY+vB,aAAa35B,UAGvCA,MAAO,qBACPD,QAAS,mBAETC,MAAO,eACPD,QAAS,SAAU45B,cACjB,GAAI9Q,KAAM/sB,SACN89B,YAAc,EAalB,OAXKD,cAAa15B,UAEP4oB,IAAIgR,cAAcF,aAAa15B,WACxC25B,YAAcxC,qBAAqBuC,aAAa15B,WACvC4oB,IAAIe,SAAS+P,aAAa15B,aACnC25B,YAAcxC,qBACZuC,aAAa15B,UACb,mCANF25B,YAAc,QAUTA,eAGXE,gBAAiB,SAAUnjC,IACzB,MAAO+G,OAAMyE,IAAIi3B,qBAAqBziC,GAAI,MAAM0I,KAAK,SAAUqJ,UAC7D,MAAO+G,cAAa/G,SAASvJ,SAGjC46B,iBAAkB,SAAUnuB,QAC1B,MAAOlO,OAAMyE,IAAIi3B,qBAAqBlf,MAAM8M,MAAMpb,UAC/CvM,KAAK,SAAUqJ,UACd,OACE7D,QAAS6D,SAASvJ,KAAK0F,QAAQL,IAAI,SAAU2H,QAC3C,MAAOsD,cAAatD,cAK9B6tB,yBAA0B,SAAUrjC,IAClC,MAAO+G,OAAMyE,IAAIi3B,qBAAqBziC,GAAI,eACvC0I,KAAK,SAAUqJ,UACd,OACE7D,QAAS6D,SAASvJ,KAAKqF,IAAI,SAAU2H,QACnC,MAAOsD,cAAatD,cAK9B9J,KAAM,gBACN43B,WAAY,iBACZC,mBAAoB,SAAU/6B,MAC5B,GAAIuQ,SAAU+W,UAAUtnB,KACxB,OAAOzB,OAAMmpB,IAAIwS,gBAAgBl6B,KAAKxI,GAAI,KAAM+Y,SAC7CrQ,KAAK,SAAUqJ,UACd,MAAO+G,cAAa/G,SAASvJ,SAGnCg7B,oCAAqC,SAAUxjC,GAAIyjC,WACjD,GAAIC,mBAAoBD,UAAU51B,IAAI,SAAU81B,UAC9C,MAAO1+B,GAAE2+B,KAAKD,SAAU,KAAM,aAEhC,OAAO58B,OAAMmpB,IACXuS,qBAAqBziC,GAAI,YAAa,aACtC0jC,oBAGJG,8BAA+B,SAAU7jC,IACvC,MAAO+G,OAAMmpB,IAAIuS,qBAAqBziC,GAAI,6BAQpD6E,QAAQC,OAAO,gCACb,uBACA,2BACA,wBACA,8BACA,sCAECsI,UAAU,qBACT,YAAa,mBACb,SAAU1D,UAAWo6B,kBACnB,OACE70B,KAAM,SAAUC,MAAOvP,QAASsS,OAC9B/C,MAAM60B,cACJruB,MAAO,iBACPvB,KAAM,4BAENuB,MAAO,WACL,MAAOxG,OAAMya,QAAQtgB,QAIzB,IAAI26B,uBAAwB,SAAUra,SAChC9kB,QAAQyQ,SAASqU,QAAQxX,SAC3B2xB,iBAAiBX,gBAAgBxZ,QAAQxX,QACtCzJ,KAAK,SAAUs6B,cACd9zB,MAAM60B,YAAYxlB,OAAO,EAAG,GAC1B7I,MAAOstB,aAAa35B,MACpB8K,KAAM,iBAAmB6uB,aAAahjC,GAAK,IAAM0J,UAAUm5B,yBAG7DmB,sBAAsBhB,gBAK9BgB,uBAAsB90B,MAAMya,UAK9Bza,OAAO,EACPwB,SAAU,IACV5K,YAAa4D,UAAUoH,mBACrB,iBACA,sBACA,gCAQVjM,QAAQC,OAAO,gCACb,wBACA,8BACA,iCACA,SACA,SACA,UACA,wBAECU,QACC,IAAK,YAAa,iBAAkB,oBAClC,8BACF,SAAUP,EAAGqS,UAAW5R,eAAgB6R,kBACpC0sB,6BAEF,GAAIv6B,WAAY4N,UAAUE,OAAOD,kBAAkBE,MAC/CwqB,oBAAsB3qB,UAAUE,OAAOysB,4BAA4BxsB,KAEvE/R,gBACGG,KAAK,4BACJE,YACE,SAAU,UAAW,mBACrB,SAAUsH,OAAQ8F,QAAS2wB,kBACzB3wB,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,mBAClD9J,OAAOqK,aAAeosB,iBAEtBz2B,OAAO62B,mBAAqB,SAAUp2B,MACpC,MAAO,iBAAmBA,KAAK9N,GAAK,KAAO8N,KAAKq2B,mBAAqBz6B,UAAUm5B,yBAOjFx1B,OAAO+2B,oBAAsBnC,oBAAoBD,cAC9CxoB,OAAO,SAAU2oB,QAChB,MAAwB,QAAjBA,OAAOzsB,QAEf7H,IAAI,SAAUs0B,QACb,GAAIltB,UAMJ,OAJIktB,QAAO/V,MACTnX,OAAOktB,OAAO/V,KAAOnnB,EAAEiO,WAAWivB,OAAOh1B,OAASg1B,OAAOh1B,QAAUg1B,OAAOh1B,QAI1E9D,MAAO84B,OAAOzsB,MACdT,OAAQA,YAKlBnP,YAAa4D,UAAUoH,mBACrB,iBACA,sBACA,iCAQZjM,QAAQC,OAAO,qCACb,gBACA,2BACA,wBACA,8BACA,8BACA,uBACA,kBACA,oBACA,SACA,SACA,QACA,wBAECsI,UAAU,0BACT,IAAK,KAAM,YAAa,SAAU,QAAS,mBACzC,sBAAuB,QACzB,SAAUnI,EAAGwE,GAAIC,UAAWvE,OAAQG,MAAOw+B,iBACvC7B,oBAAqB1e,OAEvB,OACEtU,KAAM,SAAUC,MAAOvP,QAASsS,OAC9B,GAAI0e,aAAc,SAAUC,QAASpoB,MACnClD,MAAMurB,eAAeD,QAASpoB,MAC9B0G,MAAMmX,aAAeuK,QAGvB1hB,OAAM8hB,WAAa,WACjB9hB,MAAMmX,aAAe,IAGvBnX,MAAMiB,OAAO,YAAa,SAAUk0B,aAAcC;AAC3Cz/B,QAAQ6N,OAAO2xB,aAAcC,eAChCp1B,MAAM8hB,eAEP,EAEH,IAAIuT,oBAAqB,SAAUd,WACjCA,UAAUze,QAAQ,SAAU2e,SAAUxgC,GACpCwgC,SAASa,SAAWrhC,EAAI,IAI5B2gC,kBAAiBT,yBAAyBn0B,MAAMya,QAAQ3pB,IACrD0I,KAAK,SAAUqJ,UACd7C,MAAMu0B,UAAY1xB,SAAS7D,QAC3Bq2B,mBAAmBr1B,MAAMu0B,aAE1Brd,MAAM,SAAUrU,UACf,GAAI6e,SAAU,yCACdD,aAAYC,SAAW7e,SAAUA,aAGrC7C,MAAM6xB,SAAWkB,oBAAoBD,cAClCxoB,OAAO,SAAU2jB,QAEhB,QAASA,OAAOhwB,OAGpB,IAAIs3B,oBAAqB,gBACrBC,mBAAqB,oBAEzBx1B,OAAMsiB,eACNtiB,MAAMy1B,qBAAuB,SAAUhB,UACrC,MAAOc,oBAAqBd,SAAS3jC,IAEvCkP,MAAM01B,qBAAuB,SAAUjB,UACrC,MAAOe,oBAAqBf,SAAS3jC,IAEvCkP,MAAM21B,gBAAkB,SAAUlB,UAChC,MAAOz0B,OAAMsiB,YAAYtiB,MAAMy1B,qBAAqBhB,YAEtDz0B,MAAM41B,gBAAkB,SAAUnB,UAChC,MAAOz0B,OAAMsiB,YAAYtiB,MAAM01B,qBAAqBjB,YAGtDz0B,MAAM61B,8BAAgC,WACpC,MAAOrgB,QAAOC,KAAKzV,MAAMsiB,aACtBmK,OAAO,SAAUqJ,QAAS5Y,KACzB,MAAIA,KAAI6Y,WAAWR,oBACVO,SAAW91B,MAAMsiB,YAAYpF,KAAKjW,OAEpC6uB,UACN,GAGP,IAAIlT,MAAOvO,MAAMwO,WACjB7iB,OAAM0iB,mBAAqBE,KAAKE,QAChC,IAAIkT,SAAU,SAAU1N,WAEtB,MAAO,YACL,GAAI2N,UAAW9b,UAEXtQ,QAAU7J,MAAMu0B,UAAU51B,IAAI,SAAU81B,UAC1C,MAAO1+B,GAAE2+B,KAAKD,SAAU,KAAM,aAMhC,OAHAnM,WAAUptB,KAAK,KAAM2O,SAASqjB,MAAM,KAAM+I,UAC1CZ,mBAAmBxrB,SAEZ+qB,iBAAiBN,oCACtBt0B,MAAMya,QAAQ3pB,GACd+Y,SAECrQ,KAAK,WACJ8uB,UAAUptB,KAAK,KAAM8E,MAAMu0B,WAAWrH,MAAM,KAAM+I,UAClDZ,mBAAmBr1B,MAAMu0B,aAE1Brd,MAAM,SAAUrU,UACf,GAAI6e,SAAU,kDACdD,aAAYC,SAAW7e,SAAUA,cAKzC7C,OAAMk2B,aAAetT,KAAKoT,QAAQ3hB,MAAMS,SAExC9U,MAAMm2B,YAAcvT,KAAK,SAAUzoB,OAEjC,MAAOy6B,kBAAiBnB,oBACtBxwB,OAAQjD,MAAMya,QAAQ3pB,GACtBslC,kBAAmBp2B,MAAMya,QAAQ4b,mBACjCl8B,MAAOA,MACPm7B,UAAWv/B,EAAEy3B,IAAIxtB,MAAMu0B,UAAW,YAAYe,UAAY,GAAK,IAE9D97B,KAAK,SAAUi7B,UACdz0B,MAAMu0B,UAAU78B,KAAK+8B,YAEtBvd,MAAM,SAAUrU,UACf,GAAI6e,SAAU,mDACdD,aAAYC,SAAW7e,SAAUA,eAIvC7C,MAAMs2B,4BAA8B1T,KAAK,WAEvC,MAAOgS,kBACJD,8BAA8B30B,MAAMya,QAAQ3pB,IAC5C0I,KAAK,SAAUqJ,UACd7C,MAAMu0B,UAAUze,QAAQ,SAAU2e,UAChCA,SAASr6B,UAAYnE,OAAOyb,GAC1B1R,MAAMya,QAAQrgB,UACdI,UAAUmX,uBAIfuF,MAAM,SAAUrU,UACf,GAAI6e,SAAU,6DACdD,aAAYC,SAAW7e,SAAUA,eAIvC7C,MAAMu2B,aAAe3T,KAAK,SAAU6R,UAElC,GAAI+B,cAAe7gC,QAAQ0L,KAAKozB,SAGhC,OAFA+B,cAAavzB,OAASjD,MAAMya,QAAQ3pB,GAE7B8jC,iBAAiBP,mBAAmBmC,cACxCtf,MAAM,SAAUrU,UACf,GAAI+e,cAAe6S,SAASt6B,MAAQ,IAAMs6B,SAASt6B,MAAQ,IAAM,aAC7DunB,QAAU,0CAA4CE,aAAe,GACzEH,aAAYC,SAAW7e,SAAUA,aAElCsH,QAAQ,WACPnK,MAAM21B,gBAAgBlB,UAAUlR,mBAItCvjB,MAAMy2B,eAAiB7T,KAAK,SAAU6R,UAEpC,MAAOG,kBAAiBhB,mBAAmBa,UACxCj7B,KAAK,WACJ,GAAImV,OAAQ3O,MAAMu0B,UAAU/4B,QAAQi5B,SACpCuB,SAAQ3hB,MAAMW,YAAYrG,SAE3BuI,MAAM,SAAUrU,UACf,GAAI+e,cAAe6S,SAASt6B,MAAQ,IAAMs6B,SAASt6B,MAAQ,IAAM,aAC7DunB,QAAU,0CAA4CE,aAAe,GACzEH,aAAYC,SAAW7e,SAAUA,gBAIzCrB,SAAU,IACVxB,OACEya,QAAS,KAEX7jB,YAAa4D,UAAUoH,mBACrB,iBACA,2BACA,qCAQVjM,QAAQC,OAAO,oCACb,wBACA,8BACA,mBAECsI,UAAU,uBAAwB,SAAU1D,UAAWo6B,kBACtD,OACE70B,KAAM,SAAUC,OAEd,GAAI02B,qBAAsB,WAEpB/gC,QAAQyQ,SAASpG,MAAM4G,QACzBguB,iBAAiBX,gBAAgBj0B,MAAM4G,OACpCpN,KAAK,SAAUs6B,cACd9zB,MAAM8zB,aAAeA,eAK7B9zB,OAAMiB,OAAO,QAASy1B,sBAExBl1B,SAAU,IACVxB,OACE4G,MAAO,KAEThQ,YAAa4D,UAAUoH,mBACrB,iBACA,qBACA,0BACA,mCAORjM,QAAQC,OAAO,+BACb,oBACA,wBACA,kBACA,SACA,cACA,mCACA,gCAECsI,UAAU,mBAAoB,SAAUlN,EAAG4jC,iBAAkBp6B,WAC5D,OACE3D,WAAY,SAAUd,EAAGoI,OAAQkW,MAAOsiB,OAEtCx4B,OAAOioB,OAAS,SAAUzX,OACxB0F,MAAMS,OAAO3W,OAAOy4B,cAAejoB,MAAOA,MAAQ,GAClDxQ,OAAO6N,YAGT7N,OAAOmoB,SAAW,SAAU3X,OAC1B0F,MAAMS,OAAO3W,OAAOy4B,cAAejoB,MAAOA,MAAQ,GAClDxQ,OAAO6N,YAGT7N,OAAOhG,OAAS,SAAUwW,OACxB0F,MAAMW,WAAW7W,OAAOy4B,cAAejoB,OACvCxQ,OAAO6N,YAGT7N,OAAO04B,gBAAkB,SAAU/C,cACjC31B,OAAO24B,yBAA0BhD,aAAcA,eAC/C31B,OAAO6N,YAGT7N,OAAO44B,mBAAqB,SAAUvoB,OACpC,MAAOomB,kBAAiBV,kBAAkBluB,OAAOwI,QAAQhV,KACvD,SAASqJ,UACP,MAAOA,UAAS7D,YAKxBe,KAAM,SAAUC,MAAOvP,QAASkjB,MAE9B3T,MAAMinB,iBACJC,WAAY,SAAU/rB,EAAGgsB,IACvBA,GAAGC,OAAO10B,IAAI,aAAc,IAE9B20B,OAAQ,SAAUlsB,EAAGgsB,IACnBA,GAAGC,OAAO10B,IAAI,aAAc1B,EAAE8E,QAAQwxB,cAExCC,YAAa,qBACbC,SAAU,EACVC,QAAS,IACT9O,YAAa,WACb+O,MAAO,SAAUvsB,EAAGgsB,IAClBA,GAAGC,OAAO10B,IAAI,aAAc1B,EAAE8E,QAAQwxB,gBAI5C9lB,SAAU,IACVxB,OACE82B,wBAAyB,mBACzBF,cAAe,IACf5qB,SAAU,KAEZpV,YAAa4D,UAAUoH,mBACrB,iBACA,qBACA,8BAORjM,QAAQC,OAAO,2BACb,+BACA,iCAKFD,QAAQC,OAAO,+BACb,0BAECsI,UAAU,oBAAqB,SAAU1D,WACxC,OACE3D,WAAY,SAAUd,EAAGoI,OAAQ0O,eAAgBmqB,gBAC/C74B,OAAO84B,cAAgBlhC,EAAEuU,OAAO0sB,gBAAiBE,aAAc/4B,OAAOjE,QAAQ+6B,qBAEhFzzB,SAAU,IACVxB,OACE9F,QAAS,KAEXtD,YAAa4D,UAAUoH,mBAAmB,mDAMhDjM,QAAQC,OAAO,qBACb,gCAECqI,MAAM,mBACHzB,KAAM,cACN26B,KAAM,cACND,aAAc,oBAEd16B,KAAM,cACN26B,KAAM,cACND,aAAc,qBAKpBvhC,QAAQC,OAAO,wBACb,wBACA,eACA,uBAECsI,UAAU,oBACT,SAAU,YACV,SAAUiL,OAAQ3O,WAChB,OACEgH,SAAU,IACVxB,OACEo3B,gBAAiB,IACjBC,eAAgB,IAChB1uB,gBAAiB,IACjBC,YAAa,IACbC,cAAe,IACfC,UAAW,IACXC,WAAY,KAEdhJ,KAAM,SAAUC,MAAOvP,SAErBA,QAAQwY,SAAS,sBACjBxY,QAAQyY,GAAG,QAAS,WAEblJ,MAAMgJ,gBAEThJ,MAAMgJ,cAAgBG,OACnBC,MACCpJ,MAAOA,MACPpJ,YAAa4D,UAAUoH,mBACrB,cACA,sBAIN5B,MAAMgJ,cAAc1C,OACjB9M,KAAKwG,MAAM8I,WACXoO,MAAMlX,MAAM6I,eACZsB,QAAQ,WACPnK,MAAMgJ,eAAgB,YAcxCrT,QAAQC,OAAO,oBACb,0BAECsI,UAAU,SAAU,SAAU1D,WAC7B,OACEgH,SAAU,IACVxB,OACEs3B,SAAU,IACVC,mBAAoB,IACpBC,cAAe,IACfC,SAAU,IACVC,aAAc,IACdC,gBAAiB,KAEnB/gC,YAAa4D,UAAUoH,mBAAmB,6BAC1C7B,KAAM,SAAUC,OACdA,MAAM43B,SAAWp9B,UAAUq9B,qBAOnCliC,QAAQC,OAAO,0BACZwC,QAAQ,aAAc,WAErB,GAAI0/B,YAAa,SAAU/xB,QACzB1Q,KAAK0iC,YAAchyB,OAAOgyB,aAAe,GACzC1iC,KAAK2iC,mBAAqBjyB,OAAOiyB,oBAAsB,GACvD3iC,KAAK4iC,iBAAmBlyB,OAAOkyB,kBAAoB,GACnD5iC,KAAKyoB,cAAgB/X,OAAO+X,eAAiB,aAG/C,OAAOga,cAKXniC,QAAQC,OAAO,UACb,mBACA,wBAuBFD,QAAQC,OAAO,mCACb,YAECwC,QAAQ,eAAgB,SAAS8/B,OAAQC,SAYxC,GAAIC,YAAa,SAAUn6B,OAEzB,MAAO,UAAWA,OAEhB,GAAIo6B,QAASH,OAAOj6B,MACpB,OAAO,UAAUq6B,QAEf,MAAOD,SAAQC,OAAQA,WAExBr6B,QAaDs6B,YAAc,SAAU1E,OAC1B,MAAO,UAAWA,OAChB,MAAO,UAAU5Y,WACf,GAAIqa,UAAW,EAQf,OALEA,UAFgB,SAAdra,UAES,IAAM4Y,MAGNA,QAIdA,OAGL,OAAOsE,SAAQK,MAAM,WAEnBnjC,KAAKojC,OAAO,uBAAwB,WAClC,GAAIC,eAAgBrjC,KAAKsjC,YAAY,gBACrC,IAAID,cAAe,CACjB,GAAIzkC,EACJ,KAAKA,EAAI,EAAGA,EAAIykC,cAAcvkC,OAAQF,IAAK,CACzC,GAAI2kC,cAAeF,cAAczkC,EAG7B2kC,cAAa36B,QACf26B,aAAaC,SAAWT,WAAWQ,aAAa36B,QAI9C26B,aAAa/E,QACmB,kBAAvB+E,cAAa/E,MAEtB+E,aAAaL,YAAcK,aAAa/E,MAGxC+E,aAAaL,YAAcA,YAAYK,aAAa/E,SAK5D,MAAO6E,qBAQf/iC,QAAQC,OAAO,eACb,UACA,4BAECC,SAAS,eAAgB,gBACzBS,OAAO,SAAUwiC,aAAcC,iBAC9BA,gBAAgBC,OAAO,qBACrBC,SACEC,MAAO,WACPC,UAAWL,kBAOnBnjC,QAAQC,OAAO,gCACb,cACA,kCACA,mBAECwC,QAAQ,WAAY,SAAU+/B,SAC7B,MAAOA,SAAQvxB,MAAM,YAAYwyB,IAAI,eAAgB,oBACnDH,SACEz8B,KAAM,WACN68B,OAAQ,YACRC,WAAY,KACZZ,gBACEv+B,MAAO,WACP8D,MAAO,uBACP41B,MAAO,mBAEP15B,MAAO,UACP8D,MAAO,qBACP41B,MAAO,iBAEP15B,MAAO,aACP8D,MAAO,8CACP41B,MAAO,eAEP15B,MAAO,WACP8D,MAAO,4CACP41B,MAAO,cAIXtsB,QACEgyB,WAIF3U,UACE4U,OAAQ,yBAEVC,YACED,OAAQ,yBAIV7U,SACE+U,OAAQ,yBAEVC,WACED,OAAQ,yBAGVE,SACEC,OACE1J,aAAc,SAAU5xB,YACtB,MAAOlJ,MAAKykC,SAAS9zB,OAAQzH,WAAY+2B,SAAU,mBAAmB1tB,oBASlFjS,QAAQC,OAAO,0CACb,cACA,sCAECwC,QAAQ,oBAAqB,SAAUrC,EAAGgkC,qBAAsB5B,SAE/D,GAAI6B,OAAQ7B,QAAQvxB,MAAMmzB,qBAAqBE,eAAeb,KAC5DvqB,MAAO,GAGT,QACEqrB,qBAAsB,SAAU1rB,OAC9B,MAAOwrB,OAAMG,QAAQ3rB,OAAO5G,aACzBpO,KAAK,SAAUoN,OACd,MAAOA,OAAMwzB,UAAU9gC,KAAK+gC,KAAKxrB,YAW7ClZ,QAAQC,OAAO,oCACb,yCACA,8CACA,oCACA,SACA,YAECwC,QAAQ,eAAgB,SAAUrC,EAAGoiC,QAASmC,kBAAmBC,uBAC9DR,sBAEF,GAAIrsB,cAAeyqB,QAAQvxB,MAAMmzB,qBAAqBS,gBAAgBpB,KACpEH,SACEwB,eAAgB,WAElBC,QACEC,cAAe,SAAUC,MACvBA,KAAKjmC,KAAO,UAAYimC,KAAKthC,KAAKiV,QAKxC,QACE2rB,qBAAsBI,kBAAkBJ,qBACxCtrB,oBAAqB2rB,uBAAuBL,qBAC5CvtB,iBAAkB,SAAU6B,OAC1B,MAAOd,cAAaysB,QAAQ3rB,OAAO5G,aAChCpO,KAAK,SAAUoN,OACd,MAAOA,OAAMwzB,UAAU9gC,WAQnC3D,QAAQC,OAAO,+CACb,cACA,sCAECwC,QAAQ,yBAA0B,SAAUrC,EAAGgkC,qBAAsB5B,SAEpE,GAAI6B,OAAQ7B,QAAQvxB,MAAMmzB,qBAAqBc,oBAAoBzB,KACjEvqB,MAAO,GAGT,QACEqrB,qBAAsB,SAAU1rB,OAC9B,MAAOwrB,OAAMG,QAAQ3rB,OAAO5G,aACzBpO,KAAK,SAAUoN,OACd,MAAOA,OAAMwzB,UAAU9gC,KAAK+gC,KAAKxrB,YAQ7ClZ,QAAQC,OAAO,wCACZ+D,QAAQ,uBAAwB,WAE/B,OACE6gC,eAAgB,wBAChBK,mBAAoB,oCACpBZ,cAAe,iCAMrBtkC,QAAQC,OAAO,mCACb,gBAECwC,QAAQ,eACP,UACA,SAAU+/B,SACR,MAAOA,SAAQvxB,MAAM,UAAUwyB,IAAI,oBACjCH,SACEz8B,KAAM,cACN68B,OAAQ,eACRC,WAAY,MAGdM,SACEC,OACE1J,aAAc,SAAU5xB,YACtB,MAAOlJ,MAAKykC,SAAStnC,KAAM,eAAgBuoB,EAAGxc,aAAaqJ,qBASzEjS,QAAQC,OAAO,oCACb,cACA,yCACA,kCACA,mBAECwC,QAAQ,eAAgB,SAAUrC,EAAGukC,kBAAmBnC,SACvD,GAAI2C,sBAAuB,cAE3B,OAAO3C,SAAQvxB,MAAMk0B,sBAAsB1B,IAAI,eAAgB,oBAC7DH,SACEz8B,KAAM,eACN68B,OAAQ,gBACRC,WAAY,KACZZ,gBACEv+B,MAAO,gBACP8D,MAAO,+BACP41B,MAAO,mBAEP15B,MAAO,QACP8D,MAAO,mDACP41B,MAAO,iBAEP15B,MAAO,aACP8D,MAAO,wCACP41B,MAAO,gBAKXkH,YACEvB,OAAQ,yBAIVwB,WACEtB,OAAQ,6BAQhB/jC,QAAQC,OAAO,8BACb,cACA,mBACA,WAEDwC,QAAQ,UAAW,QAAS,KAAM,IAAK,YAAa,SAAUP,MAAO0C,GAAIxE,EAAGyE,WAO3E,QAASygC,eAAc1V,gBACrB,GAAI2V,eAAgBnlC,EAAE4I,IAAI4mB,eAAgB,SAASQ,eACjD,MAAOluB,OAAMM,OAAOgjC,UAAYpV,cAAcj1B,KAEhDyJ,IAAGzB,IAAIoiC,eAAe1hC,KAAK,SAASqJ,UAClC,MAAOA,YAIX,QAASu4B,WAAUC,WAAYC,WAC7B,GAAIC,WAAYxlC,EAAEuU,OAAO+wB,YAAavqC,GAAIwqC,UAAUxqC,KAAK,EACzD,IAAGwqC,UAAUE,cAAgBD,UAAUC,YACrC,MAAO3jC,OAAMmpB,IAAIma,UAAYG,UAAUxqC,IACrC0qC,YAAaF,UAAUE,cACtBhiC,KAAK,SAASqJ,UACf,MAAOA,UAASvJ,OAKtB,QAAS+rB,YAAWD,OAAQqW,QAC1B,IAAI1lC,EAAEqQ,SAASq1B,SAAW1lC,EAAEqL,YAAYgkB,OAAOoW,aAC7C,KAAM/lC,OAAM,0CAEd,OAAOoC,OAAM0B,KAAK4hC,WAChBO,KAAMD,OACND,YAAapW,OAAOoW,cACnBhiC,KAAK,SAASqJ,UACf,MAAOA,UAASvJ,OAIpB,QAASgsB,mBAAkBtlB,OACzBi7B,cAAcj7B,MAAMulB,gBACpBxvB,EAAE+f,QAAQ9V,MAAMwkB,QAAS,SAASY,QAC7BA,OAAOO,cACRN,WAAWD,OAAQplB,MAAM4G,MAAM9V,IAE/BsqC,UAAUp7B,MAAM4G,MAAM4d,QAASY,UA3CrC,GAAI+V,WAAY3gC,UAAU0P,gBAAgB,gBACtCzU,MAAQ,SAASisB,SACnB,MAAO,IAAIia,OAAM,eAAiBja,SA8CpC,QACE2D,WAAYA,WACZC,kBAAmBA,sBAMvB3vB,QAAQC,OAAO,4BACb,cACA,kCACA,iCACA,iBACA,WAEDwC,QAAQ,QACN,UAAW,QAAS,KAAM,IAAK,SAAU,QAC1C,SAAUwjC,QAAS/jC,MAAO0C,GAAIxE,EAAGE,OAAQoe,OA0BzC,QAASzK,cAAcC,SACrB,GAAIvQ,MAAOvD,EAAE8lC,MAAMhyB,SACfS,OAASsxB,QAAQ,wBAGrB,OAFAtiC,MAAKsrB,SAAWta,OAAOhR,KAAKsrB,UAC5BtrB,KAAKc,UAAYkQ,OAAOhR,KAAKc,WACtBd,KAGT,QAASwiC,cAAcC,iBACrB,GAAIC,oBAAqBJ,QAAQ,yBAC7B/xB,QAAU9T,EAAE8lC,MAAME,gBAEtB,IAAGhmC,EAAEqL,YAAYyI,QAAQ1P,QAAUpE,EAAEqL,YAAYyI,QAAQoyB,eACvD,KAAMxmC,OAAM,mCAGd,IAAGoU,QAAQ+a,SAAU,CACnB,IAAI3uB,OAAOub,SAAS3H,QAAQ+a,UAC1B,KAAMnvB,OAAM,mCAEdoU,SAAQ+a,SAAWoX,mBAAmBnyB,QAAQ+a,UAGhD,GAAI/a,QAAQzP,UAAW,CACrB,IAAInE,OAAOub,SAAS3H,QAAQzP,WAC1B,KAAM3E,OAAM,oCAEdoU,SAAQzP,UAAY4hC,mBAAmBnyB,QAAQzP,WAGjD,MAAOrE,GAAE2+B,KAAK7qB,SACZ,QACA,gBACA,YACA,aAIJ,QAAS0a,SAAQkX,QACf,MAAO5jC,OAAMyE,IAAI4/B,QAAUT,OAAS,KACjCjiC,KAAK,SAAUqJ,UACd,MAAO+G,cAAa/G,SAASvJ,QAInC,QAAS6iC,UAASp2B,QAChB,GAAIpR,KAAMunC,QAAU7nB,MAAM8M,MAAMpb,OAChC,OAAOlO,OAAMyE,IAAI3H,KACd6E,KAAK,SAAUqJ,UAId,MAHAA,UAASvJ,KAAK0F,QAAU6D,SAASvJ,KAAK0F,QAAQL,IAAI,SAAU+8B,MAC1D,MAAO9xB,cAAa8xB,QAEf74B,SAASvJ,OAItB,QAAS4rB,UAAS5rB,MAChB,GAAIuQ,SAAUiyB,aAAaxiC,KAE3B,OAAOzB,OAAM0B,KAAK2iC,QAASryB,SACxBrQ,KAAK,SAASqJ,UACb,MAAOA,UAASvJ,OAItB,QAASksB,YAAWlsB,MAClB,GAAIuQ,SAAUiyB,aAAaxiC,KAE3B,OAAOzB,OAAMmpB,IAAIkb,QAAU5iC,KAAKxI,GAAK,IAAK+Y,SACvCrQ,KAAK,SAASqJ,UACb,MAAOA,UAASvJ,OAItB,QAAS8iC,YAAWX,QAClB,MAAO5jC,OAAMM,OAAO+jC,QAAUT,OAAS,KACpCjiC,KAAK,SAASqJ,UACb,MAAOA,YArGb,GAAIpN,OAAQ,SAASisB,SACnB,MAAO,IAAIia,OAAM,eAAiBja,UAGhChM,SACAvb,MAAO,YACP05B,MAAO,UAEP15B,MAAO,eACP05B,MAAO,eACP35B,QAAS,SAAUwhC,MACjB,MAAOA,MAAKthC,UAAYshC,KAAKthC,UAAU5F,OAAO,kBAAoB,OAGpE2F,MAAO,aACP05B,MAAO,WACP35B,QAAS,SAAUwhC,MACjB,MAAOA,MAAK9W,SAAW8W,KAAK9W,SAASpwB,OAAO,kBAAoB,OAGlEgI,KAAO,OACP43B,WAAa,QACb8H,QAAU,mBAmFd,QACE3X,QAASA,QACT4X,SAAUA,SACVzmB,OAAQA,OACRlZ,KAAMA,KACN43B,WAAYA,WACZlP,SAAUA,SACVM,WAAYA,WACZ4W,WAAYA,eAMhBzmC,QAAQC,OAAO,gCACb,cACA,oCAECwC,QAAQ,WAAY,SAAUrC,EAAGoiC,SAChC,GAAIkE,qBAAsB,0BAE1B,OAAOlE,SAAQvxB,MAAMy1B,qBAAqBjD,IAAI,eAAgB,oBAC5DH,SACEz8B,KAAM,YACN68B,OAAQ,aACRC,WAAY,KACZZ,gBAEIv+B,MAAO,cACP8D,MAAO,gCAGP9D,MAAO,WACP8D,MAAO,kBAGP9D,MAAO,OACP8D,MAAO,gBAGP9D,MAAO,OACP8D,MAAO,mDAKbq+B,aACE5C,OAAQ,wBACRF,OAAQ,yBAEV+C,cACE7C,OAAQ,wBACRF,OAAQ,6BAOhB7jC,QAAQC,OAAO,oCACb,cACA,oCAECwC,QAAQ,eAAgB,SAAUrC,EAAGoiC,SACpC,GAAIqE,sBAAuB,8BAE3B,OAAOrE,SAAQvxB,MAAM41B,sBAAsBpD,IAAI,eAAgB,oBAC7DH,SACEz8B,KAAM,gBACN68B,OAAQ,iBACRC,WAAY,KACZZ,gBAEIv+B,MAAO,OACP8D,MAAO,gCAGP9D,MAAO,OACP8D,MAAO,sBAIbwa,MACE8gB,SAEFmB,QACEC,cAAe,SAASC,MACtB,GAAIhL,cAAegL,KAAKthC,KAAK2iB,aAC7B,IAAI2T,aAAaz7B,OAAS,EACxB,IAAK,GAAI+oB,OAAO0S,cAAc,CAC5B,GAAIn3B,KAAMm3B,aAAa1S,IACnBzkB,KAAI02B,eAAe,iBACjB12B,IAAIo3B,YAAYV,eAAe,QACjCyL,KAAKthC,KAAK2iB,cAAciB,KAAKuf,aAAehkC,IAAIo3B,YAAYrzB,KACnD/D,IAAIo3B,YAAYV,eAAe,WACxCyL,KAAKthC,KAAK2iB,cAAciB,KAAKuf,aAAatF,KAAO1+B,IAAIo3B,YAAY5xB,UAM3Ey+B,gBAAiB,SAASpE,QACxB,GAAIA,OAAOnJ,eAAe,iBACxB,IAAK,GAAIjS,OAAOob,QAAOrc,cACjBqc,OAAOrc,cAAciB,KAAKiS,eAAe,iBACvCmJ,OAAOrc,cAAciB,KAAKuf,aAAatN,eAAe,UACxDmJ,OAAOrc,cAAciB,KAAKuf,aAAenE,OAAOrc,cAAciB,KAAKuf,aAAajgC,YAWlG7G,QAAQC,OAAO,iCACb,cACA,oCAECwC,QAAQ,OAAQ,SAAUrC,EAAGoiC,SAC5B,GAAIwE,cAAe,oBACnB,OAAOxE,SAAQvxB,MAAM+1B,cAAcvD,IAAI,eAAgB,oBACrD3I,YACEmM,QAASzE,QAAQvxB,MAAM,SAAUwyB,IAAI,oBACrCvxB,KAAM,aACN9B,UACA82B,OACEC,mBAAoB,WACdznC,KAAKlB,OAAS,EAChBkB,KAAK0nC,OAAO9L,UAAY57B,KAAK,GAE7BA,KAAK0nC,OAAO9L,UAAY57B,KAAK0nC,OAAOtM,WAAW0J,SAAUrK,KAAM,OAKvEY,cACEkM,QAASzE,QAAQvxB,MAAM,MAAOkpB,KAAM,IAAIsJ,IAAI,oBAC5CvxB,KAAM,eACN9B,UACA82B,OACEC,mBAAoB,WACdznC,KAAKlB,OAAS,EAChBkB,KAAK0nC,OAAO7L,YAAc77B,KAAK,GAE/BA,KAAK0nC,OAAO7L,YAAc77B,KAAK0nC,OAAOrM,aAAayJ,SAAUrK,KAAM,OAK3ES,oBACEqM,QAASzE,QAAQvxB,MAAM,SAAUwyB,IAAI,oBACrCvxB,KAAM,qBACN9B,UACA82B,OACEC,mBAAoB,WAClB,GAAIvhB,MAAOlmB,KAAK2nC,UAAUzhB,IACrBxlB,GAAEqL,YAAYma,OAAkB,OAATA,OAC1BlmB,KAAK0nC,OAAOxM,mBAAmBviB,QAC/B3Y,KAAK0nC,OAAOxM,mBAAmBC,aAKvCyI,SACEz8B,KAAM,OACN68B,OAAQ,QACRC,WAAY,KACZZ,gBAEIv+B,MAAO,OACP8D,MAAO,gBAGP9D,MAAO,eACP8D,MAAO,4BAQnBtI,QAAQC,OAAO,+BACb,cACA,yCACA,oCAECwC,QAAQ,UAAW,SAAUrC,EAAGukC,kBAAmBnC,SAClD,GAAI8E,iBAAkB,SAEtB,OAAO9E,SAAQvxB,MAAMq2B,iBAAiB7D,IAAI,eAAgB,oBACxDH,SACEz8B,KAAM,UACN68B,OAAQ,WACRC,WAAY,KACZZ,gBACEv+B,MAAO,eACP8D,MAAO,cACP41B,MAAO,SAEP15B,MAAO,gBACP8D,MAAO,yBAGXuQ,OACE+qB,SAEF2D,UACE3D,MAAM,GAERmB,QACEyC,cAAe,WACb9nC,KAAK+nC,uBAEPN,mBAAoB,WAClB/mC,EAAE62B,KAAKv3B,KAAM,SAAUijC,QACrBA,OAAO8E,0BAIbxD,SACEyD,QAMED,oBAAqB,WACnB,GAAI9E,QAASjjC,IACb,OAAOilC,mBAAkBJ,qBAAqB7kC,KAAKmZ,OAChDhV,KAAK,SAAUqV,OACdypB,OAAOgF,aAAezuB,eAUtClZ,QAAQC,OAAO,uCACb,cACA,+BACA,kCACA,mBACA,iBACA,uBAECwC,QAAQ,kBAAmB,SAAUrC,EAAG8B,MAAOqgC,OAAQ39B,GAAI49B,QAAS1yB,YAAakxB,OAChF,GAAIxE,gBACFoL,SAAU,WACVC,SAAU,YAGZ,OAAOrF,SAAQvxB,MAAM,oBAAoBwyB,IAAI,eAAgB,oBAC3DH,SACEz8B,KAAM,mBACN68B,OAAQ,oBACRC,WAAY,KACZZ,gBACEv+B,MAAO,aACP8D,MAAO,cACP41B,MAAO,SAEP15B,MAAO,UACP8D,MAAO,sCACP41B,MAAO,2BAEP15B,MAAO,WACP8D,MAAO,wCACP41B,MAAO,6BAEP15B,MAAO,aACP8D,MAAO,8CACP41B,MAAO,eAEP15B,MAAO,WACP8D,MAAO,4CACP41B,MAAO,cAKXjP,UACE4U,OAAQ,yBAEVC,YACED,OAAQ,yBAIV7U,SACE+U,OAAQ,yBAEVC,WACED,OAAQ,yBAGV/zB,UACE83B,UAAW,WACXC,UAAU,EACVxgB,IAAK,YAEPygB,SACEC,KAAM,MAERpvB,OACE+qB,SAEFsE,QACEC,cAAe,QACfroB,KAAM,UAERsoB,gBACExE,QACA9jB,KAAM,kBAERuoB,QACEzE,MAAM,GAER2D,UACE3D,MAAM,GAGRmB,QACEyC,cAAe,WAEb9nC,KAAK4oC,mBAEPC,aAAc,WAEZ7oC,KAAK4oC,oBAITrE,SACEyD,QAIEY,gBAAiB,WACfloC,EAAE62B,KAAKv3B,KAAKwoC,OAAQ,SAAUtkB,OAC5BA,MAAMiX,YAMV6B,mBAAoB,WAClB,MAAIt8B,GAAEqQ,SAAS/Q,KAAK8oC,iBACXtmC,MAAMyE,IAAImJ,YAAYK,mBAAmB,YAAczQ,KAAK8oC,gBAAkB,MAAM3kC,KAAK,SAAU8M,QACxG,MAAOA,QAAOhN,OAGXiB,GAAGe,UAKZo3B,iBAAkB,SAAU3sB,QAE1B,MAAOlO,OAAMyE,IAAImJ,YAAYK,mBAAmB,cAC9CC,OAAQA,SACPvM,KAAK,SAAUqJ,UAChB,MAAOA,UAASvJ,KAAK0F,WASzBo/B,SAAU,SAAU7kB,OAClB,GAAI8kB,QAAQ,EAGRC,cAAgBvoC,EAAE9C,KAAKoC,KAAKwoC,OAAQ,SAAUS,eAChD,MAAO/kB,OAAMzoB,KAAOwtC,cAAcxtC,IASpC,OANKwtC,iBAEHjpC,KAAKwoC,OAAOnmC,KAAK6hB,OACjB8kB,OAAQ,GAGHA,OAETxH,gBAAiB,SAAU/C,cAEzB,GAAIyK,sBAAuBlpC,KAAKuhC,cAC7B3jC,KAAK,SAASurC,wBACb,MAAO1K,cAAahjC,KAAO0tC,wBAG1BD,uBACHlpC,KAAKuhC,cAAcl/B,KAAKo8B,aAAahjC,KAUzC2tC,aAAc,SAAUC,aAoBtB,MAnBI3oC,GAAEuV,SAASozB,aACTA,cAAgBvM,cAAcwM,QAChCtpC,KAAK2oC,QAAS,EACd3oC,KAAK6nC,UAAW,GACPwB,cAAgBvM,cAAcqL,UACvCnoC,KAAK2oC,QAAS,EACd3oC,KAAK6nC,UAAW,IAEhB7nC,KAAK2oC,QAAS,EACd3oC,KAAK6nC,UAAW,IAGlBwB,YAAcvM,cAAcoL,SACxBloC,KAAK2oC,QAAU3oC,KAAK6nC,SACtBwB,YAAcvM,cAAcqL,SACnBnoC,KAAK2oC,SACdU,YAAcvM,cAAcwM,SAGzBD,cAGX7E,OACE1H,cAAep8B,EAAE8lC,MAAM1J,qBAQjCx8B,QAAQC,OAAO,yBACb,mBACA,gCACA,gBAECU,QACC,oBAAqB,6BAA8B,iBACnD,SAAU+R,kBAAmBu2B,2BAA4BC,gBAEvDx2B,kBACGy2B,uBAAuB,uBACvBC,iBAAiB,eACjBC,+BAA+B,kBAC/BC,yBAAyB,UACzBC,cAAc,WACdC,iBAAiB,MAAO,mBACxBA,iBAAiB,YAAa,yBAC9BA,iBAAiB,UAAW,uBAC5BC,mBAAmB,eAEtBR,2BACG1zB,kBAAkB,eAAgB,eAAgB,OAAQ,WAC1DA,kBAAkB,eAAgB,eAAgB,OAAQ,QAC1DA,kBAAkB,MAAO,MAAO,OAAQ,QACxCM,iBAAiB,YAAa,OAC9BA,iBAAiB,YAAa,OAC9BA,iBAAiB,aAAc,QAC/BC,cAAc,WAAY,YAC1BA,cAAc,YAAa,aAC3BA,cAAc,aAAc,cAE/BozB,eAAeQ,QAAQ,6DAM7B1pC,QAAQC,OAAO,oBACb,kBACA,WAEC2U,SAAS,aACR,IAAK,gBACL,SAAUxU,EAAGse,OAEX,GAAIirB,gBAAiB70B,oBAAoBC,MAAM,aAC3CC,aAAe,SAAU1M,MAAO2M,KAAMC,UACxC,GAAID,KAAK3M,OACP,MAAOA,MAET,MAAM,IAAIqhC,gBAAez0B,WAEvB00B,YAAc,SAAU7X,OAC1B,MAAO,YACL,MAAOrT,OAAMxM,KAAK23B,KAAKrlB,YACvBjf,KAAK,KAAMwsB,QAIX+X,WAAa,GAEbC,2BAEAC,eAAgB,EAEhBC,cAAgB,GAEhBC,oBAAsB,GAEtBC,4BAA8B,GAG9BC,sBAAwB,GAExBC,QAAU,GAEVC,cAAgB,GAEhBC,YAAc,GAEdC,0BAA4B,GAE5BC,iBAAmB,GAEnBC,YAAc,GAEdC,YAAc,GAEdC,YAAc,GAEdC,kBAAoB,GAEpBC,YAAc,GAEdC,oCAAsC,GAEtCC,YAAc,GAGdC,WAAa,GAEbC,kBAAoB,GAEpBC,aAAe,kBAEfC,kBAEAC,gBAAkB,GAElBC,UAAY,GAEZC,kBAAoB,EAmQxB,OAjQA7rC,MAAK8rC,yBAA2B,SAAU36B,MAAOvI,OAS/C,MARA0M,cAAanE,MAAOzQ,EAAEuV,SAAU,mDAChCX,aAAa1M,MAAOlI,EAAEuV,SAAU,mDAEhCo0B,wBAAwBhoC,MACtB8O,MAAOA,MACPvI,MAAOA,QAGF5I,MAGTA,KAAK+rC,cAAgB,SAAUnjC,OAK7B,MAJAwhC,YAAa90B,aACX1M,MAAOlI,EAAEuV,SACT,kCAEKjW,MAGTA,KAAKgsC,iBAAmB,SAAUpjC,OAKhC,MAJA0hC,eAAgBh1B,aACd1M,MAAOlI,EAAEurC,UACT,sCAEKjsC,MAGTA,KAAK0pC,iBAAmB,SAAU9gC,OAKhC,MAJA2hC,eAAgBj1B,aACd1M,MAAOlI,EAAEuV,SACT,oCAEKjW,MAGTA,KAAKypC,uBAAyB,SAAU7gC,OAKtC,MAJA4hC,qBAAsBl1B,aACpB1M,MAAOlI,EAAEuV,SACT,2CAEKjW,MAGTA,KAAK2pC,+BAAiC,SAAU/gC,OAK9C,MAJA6hC,6BAA8Bn1B,aAC5B1M,MAAOlI,EAAEuV,SACT,qDAEKjW,MAGTA,KAAK4pC,yBAA2B,SAAUhhC,OAKxC,MAJA8hC,uBAAwBp1B,aACtB1M,MAAOlI,EAAEuV,SACT,6CAEKjW,MAGTA,KAAKksC,WAAa,SAAUtjC,OAK1B,MAJA+hC,SAAUr1B,aACR1M,MAAOlI,EAAEuV,SACT,8BAEKjW,MAGTA,KAAKmsC,iBAAmB,SAAUvjC,OAKhC,MAJAgiC,eAAgBt1B,aACd1M,MAAOlI,EAAEuV,SACT,qCAEKjW,MAGTA,KAAKosC,eAAiB,SAAUxjC,OAK9B,MAJAiiC,aAAcv1B,aACZ1M,MAAOlI,EAAEuV,SACT,kCAEKjW,MAGTA,KAAKqsC,6BAA+B,SAAUzjC,OAK5C,MAJAkiC,2BAA4Bx1B,aAC1B1M,MAAOlI,EAAEqQ,SACT,kDAEK/Q,MAGTA,KAAKssC,oBAAsB,SAAU1jC,OAKnC,MAJAmiC,kBAAmBz1B,aACjB1M,MAAOlI,EAAEuV,SACT,uCAEKjW,MAGTA,KAAKusC,eAAiB,SAAU3jC,OAK9B,MAJAoiC,aAAc11B,aACZ1M,MAAOlI,EAAEuV,SACT,kCAEKjW,MAGTA,KAAKwsC,eAAiB,SAAU5jC,OAM9B,MALAqiC,aAAc31B,aACZ1M,MAAOlI,EAAEuV,SACT,mCAEFxV,OAAOlE,aAAe0uC,YACfjrC,MAGTA,KAAKysC,eAAiB,SAAU7jC,OAM9B,MALAsiC,aAAc51B,aACZ1M,MAAOlI,EAAEuV,SACT,mCAEFxV,OAAOhB,WAAayrC,YACblrC,MAGTA,KAAK0sC,qBAAuB,SAAU9jC,OAKpC,MAJAuiC,mBAAoB71B,aAClB1M,MAAOlI,EAAEuV,SACT,yCAEKjW,MAGTA,KAAK2sC,eAAiB,SAAU/jC,OAK9B,MAJAwiC,aAAc91B,aACZ1M,MAAOlI,EAAEuV,SACT,kCAEKjW,MAGTA,KAAK4sC,uCAAyC,SAAUhkC,OAKtD,MAJAyiC,qCAAsC/1B,aACpC1M,MAAOlI,EAAEuV,SACT,8DAEKjW,MAGTA,KAAK6sC,eAAiB,SAAUjkC,OAK9B,MAJA0iC,aAAch2B,aACZ1M,MAAOlI,EAAEuV,SACT,mCAEKjW,MAGTA,KAAK6pC,cAAgB,SAAUjhC,OAK7B,MAJA2iC,YAAaj2B,aACX1M,MAAOlI,EAAEuV,SACT,iCAEKjW,MAGTA,KAAK8sC,qBAAuB,SAAUlkC,OAKpC,MAJA4iC,mBAAoBl2B,aAClB1M,MAAOlI,EAAEuV,SACT,yCAEKjW,MAGTA,KAAK+sC,gBAAkB,SAAU5lC,MAK/B,MAJAskC,cAAen2B,aACbnO,KAAMvG,OAAOyb,GAAG2wB,KAChB,wBAA0B7lC,KAAO,8BAE5BnH,MAGTA,KAAK8pC,iBAAmB,SAAU3iC,KAAM2L,UACtC,GAAI+U,KAAMvS,aACRnO,KAAMzG,EAAEuV,SACR,0CAEErN,MAAQ0M,aACVxC,SAAUpS,EAAEuV,SACZ,6CAGF,OADAy1B,gBAAe7jB,KAAOjf,MACf5I,MAGTA,KAAK+pC,mBAAqB,SAAUnhC,OAKlC,MAJA+iC,iBAAkBr2B,aAChB1M,MAAOlI,EAAEuV,SACT,sCAEKjW,MAGTA,KAAKitC,aAAe,SAAUrkC,OAK5B,MAJAgjC,WAAYt2B,aACV1M,MAAOlI,EAAEuV,SACT,gCAEKjW,MAGTA,KAAKktC,qBAAuB,SAAUtkC,OAKpC,MAJAijC,mBAAoBv2B,aAClB1M,MAAOlI,EAAEuV,SACT,yCAEKjW,MAGTA,KAAKkT,MACH,WACE,OACE2B,gBAAiBq1B,YAAYE,YAC7B79B,mBAAoB29B,YAAYK,eAChC4C,mBAAoBjD,YAAYU,eAChCwC,yBAA0BlD,YAAYM,qBACtC6C,2BAA4BnD,YAAYQ,uBACxC5b,iBAAkBob,YAAYW,aAC9ByC,qBAAsBpD,YAAYlrB,MAAMxM,KAAK23B,KAAKa,YAAaD,mBAC/DwC,iBAAkBrD,YAAYc,aAC9BzkC,iBAAkB2jC,YAAYe,aAC9BuC,iBAAkBtD,YAAYkB,aAC9BqC,gBAAiBvD,YAAYqB,YAC7BmC,oBAAqBxD,YAAYlrB,MAAMxM,KAAK23B,KAAKiB,YAAaO,kBAC9DrnB,cAAe4lB,YAAYlrB,MAAMxM,KAAK23B,KAAKU,YAAae,YACxD+B,uBAAwBzD,YAAY2B,mBACpC+B,iBAAkBltC,EAAEF,SAAS8pC,eAC7B13B,WAAYlS,EAAEF,SAASmqC,SACvBvuB,+BAAgC1b,EAAEF,SAASiqC,6BAC3CoD,6BAA8BntC,EAAEF,SAASsqC,2BACzCtkC,eAAgB9F,EAAEF,SAAS0qC,aAC3BnnB,oBAAqBrjB,EAAEF,SAAS2qC,mBAChCnf,uCAAwCtrB,EAAEF,SAAS6qC,qCACnD7I,eAAgB9hC,EAAEF,SAAS8qC,aAC3BhN,qBAAsB59B,EAAEF,SAASgrC,mBACjClvB,gBAAiB5b,EAAEF,SAASirC,cAC5BhP,2BAA4B/7B,EAAEF,SAASE,EAAE+T,UAAU41B,0BACnDyD,iBAAkB,SAAU3mC,MAC1B,GAAIzG,EAAEuf,IAAIyrB,eAAgBvkC,MACxB,MAAOukC,gBAAevkC,KAExB,MAAM,IAAI8iC,gBAAe,uCAAyC9iC,KAAO,UAM1EnH,QAMbS,OAAOghB,cAAgB,SAAUta,KAAMklB,SACE,kBAA5Bia,OAAMyH,kBACfzH,MAAMyH,kBAAkB/tC,KAAMA,KAAKguC,aAEnChuC,KAAKiuC,OAAQ,GAAK3H,QAAS2H,MAG7BjuC,KAAKmH,KAAOA,MAAQ,YACpBnH,KAAKqsB,QAAUA,SAAW,gCAE5B5K,cAAc/Z,UAAYyY,OAAO+tB,OAAO5H,MAAM5+B,WAC9C+Z,cAAc/Z,UAAUsmC,YAAcvtC,OAAOghB,cAQ7CA,cAAcpM,MAAQ,SAAUlO,MAC9B,MAAO,UAAUklB,SACf,MAAO,IAAI5K,eAActa,KAAMklB,WAInC5rB,OAAO2U,oBAAsB,SAAUjO,KAAMklB,SAC3C5rB,OAAOghB,cAAc0sB,KAAKnuC,KAAMmH,KAAMklB,UAGxCjX,oBAAoB1N,UAAYyY,OAAO+tB,OAAOztC,OAAOghB,cAAc/Z,WACnE0N,oBAAoB1N,UAAUsmC,YAAcvtC,OAAO2U,oBAEnDA,oBAAoBC,MAAQ,SAAUlO,MACpC,MAAO,UAAUklB,SACf,MAAO,IAAIjX,qBACT,yBAA2BjO,MAAQ,mBAAqB,IACxDklB,WAON/rB,QAAQC,OAAO,8BACZwC,QAAQ,iBAAkB,SAAUC,YAAaorC;AAChD,MAAOprC,aAAYuB,WAAW,SAAUC,uBACtCA,sBAAsBvB,WAAWmrC,iBAAiBC,aAGrD7tC,SAAS,oBACR6tC,QAAS,gBAKb/tC,QAAQC,OAAO,+BACd,4BAEE+D,QAAQ,qBAAsB,SAAU5D,EAAG0Q,UAAWlM,GAAIsS,gBAEzD,GAAIwQ,oBAAqBhoB,IAGzBA,MAAKq2B,cACHhR,QAASjU,UAAUT,aACnB9L,WACAypC,WAAY,EAGd,IAAIz1B,OAAQ7Y,KAAKq2B,YASjBrO,oBAAmBumB,cAAgB,SAAUC,WAAYC,OAQvD,MAPIA,OACF51B,MAAMwM,QACJ3kB,EAAE0Y,OAAOhI,UAAUT,aAAgB69B,YAErC31B,MAAMwM,QAAUmpB,WAElBp9B,UAAUT,OAAOkI,MAAMwM,SAChBxM,MAAMwM,SAUf2C,mBAAmBC,eAAiB,SAAUumB,WAAYC,OACxD,GAAIC,cAAe1mB,mBAAmBumB,cAAcC,YAAc31B,MAAMwM,QAASopB,MACjF,OAAOj3B,gBAAe/T,IAAI,WAAWsU,QAAQ22B,cAC1CvqC,KAAK,SAAUF,MAId,MAHA4U,OAAMhU,QAAUZ,KAChB4U,MAAMy1B,WAAarqC,KAAK0qC,SAASn1B,MAE1BX,SAObmP,mBAAmB8I,QAAU,WAC3B,MAAOjY,UAObvY,QAAQC,OAAO,mBACb,0BACA,gCAKFD,QAAQC,OAAO,cACb,0BAECsI,UAAU,aAAc,SAAU1D,WACjC,OACE3D,WAAY,SAAUsH,OAAQ+F,UAE5B/F,OAAO8lC,QAAS,EAChB9lC,OAAO+lC,aAAe,WACpB/lC,OAAO8lC,QAAS,EAChB//B,SAAS,WACP/F,OAAO8lC,QAAS,GACf,OAGPziC,SAAU,IACVxB,OACEmkC,qBAAsB,IACtBC,qBAAsB,IACtBC,WAAY,IACZnqC,QAAS,KAEXtD,YAAa4D,UAAUsoC,gBAAgB,mCAM7CntC,QAAQC,OAAO,kBACb,WAEC0U,OAAO,wBAAyB,SAASrU,QACxC,MAAO,UAAUquC,SAEf,GAAIA,SAAWA,QAAQnwC,OAAQ,CAC7B,GAAIowC,GAAItuC,OAAO,GAAIuuC,MAAKF,SACxB,IAAIC,EAAExyB,UACJ,MAAOwyB,GAGX,MAAO,SAGVj6B,OAAO,wBAAyB,SAASrU,QACxC,MAAO,UAAUwuC,WACf,MAAIxuC,QAAOub,SAASizB,YAAcA,UAAU1yB,UACnC0yB,UAAUjwC,SAGV,MAOfmB,QAAQC,OAAO,YACb,wBACA,kBACA,oBACA,aACA,WAECsI,UAAU,WAAY,SAAU1D,WAC/B,OACE3D,WAAY,SAAUd,EAAGoI,OAAQsI,UAAWyxB,OAAQ7jB,OAClDlW,OAAOumC,SAAWrwB,MAAMxM,KAAK23B,KAE7BrhC,OAAO3B,KAAO2B,OAAOqK,aAAaxM,WAClCmC,OAAOi2B,WAAaj2B,OAAOqK,aAAaxM,UAAS,GACjDmC,OAAOuX,OAASvX,OAAOqK,aAAam8B,iBACpCxmC,OAAOymC,MAAQzmC,OAAOqK,aAAaq8B,cAGnC1mC,OAAO2mC,kBACP3mC,OAAO4mC,gBACP5mC,OAAO6mC,kBAEP7mC,OAAO8mC,qBAAuB,SAAU3M,QACtC,GAAIr6B,OAAQ,EAIZ,OAHIE,QAAO+mC,kBACRjnC,MAAQi6B,OAAO/5B,OAAO+mC,kBAAkB5M,OAAQA,UAE5Cr6B,OAGTE,OAAOgnC,UAAYpvC,EAAEgJ,SAAS,SAAUqmC,WACtCjnC,OAAOknC,gBAAiB,CACxB,IAAIC,WAAYvvC,EAAE+tC,SAEhB3lC,OAAO2mC,eACP3mC,OAAO6mC,eACP7mC,OAAO4mC,aACPK,UAEF,OAAOjnC,QAAOymC,MAAMW,SAASD,WAC1BhV,MAAM,WACLnyB,OAAOknC,gBAAiB,KAE3B,KAGHlnC,OAAO27B,QAAU,SAAUtrB,OACzBrQ,OAAO4mC,gBAEHv2B,QACFrQ,OAAO4mC,aAAa5mC,OAAOqnC,iBAAmBh3B,OAIhDrQ,OAAOymC,MAAM52B,MAAQ,EAErB7P,OAAOgnC,aAIThnC,OAAOsnC,oBAAsBtnC,OAAOunC,gBACpCvnC,OAAOwnC,eAAiB,SAAU5/B,QAChC5H,OAAO6mC,eAAiBj/B,OAGxB5H,OAAOymC,MAAM52B,MAAQ,EAErB7P,OAAOgnC,aAIThnC,OAAOynC,aAAe,KACtBznC,OAAO0nC,cAAgB,MACvB1nC,OAAO2nC,MAAQ,SAAU34B,OACvB,GAAI8N,UAGFA,WAFE9N,MAAMhT,QAAUgE,OAAOynC,cAEY,SAAzBznC,OAAO0nC,cAA2B,MAGlC,OAId,SAAW14B,MAAO8N,WAChB9c,OAAO2mC,gBAAkBxP,SAAUnoB,MAAMorB,YAAYtd,YACrD9c,OAAOgnC,YACJ7U,MAAM,WACLnyB,OAAOynC,aAAez4B,MAAMhT,MAC5BgE,OAAO0nC,cAAgB5qB,aAE1B9N,MAAO8N,YAGZ9c,OAAO4nC,KAAO,WACZt/B,UAAUoB,KAAK1J,OAAO6nC,gBAAiBpnC,MAAQ9N,GAAI,WAGrDqN,OAAO8nC,QAAU,SAAUrnC,MACzBA,KAAKsnC,YAGP/nC,OAAOgoC,aAAe,SAAUvnC,MAC9B6H,UAAUoB,KAAK1J,OAAO6nC,gBAAiBpnC,KAAMA,SAK/CT,OAAOioC,mBACLrwC,EAAEsb,MAAMlT,OAAOsnC,qBACZY,WAAWrI,QAAQ,IACnBsI,IAAI,SAAUC,QAETA,SACFpoC,OAAO6mC,eAAiBuB,OAAOxgC,UAGlCO,OAAO,SACPrI,SACD,GAEJE,OAAOgnC,aAETplC,KAAM,SAAUC,MAAOvP,QAASsS,OAC9B/C,MAAMwmC,gBAAkB,oBAAsBzjC,SAEhDvB,SAAU,IACVxB,OACEgmC,eAAgB,IAChBN,cAAe,IACfl9B,aAAc,IACdg9B,gBAAiB,IACjBN,gBAAiB,IACjBtW,eAAgB,KAElBh4B,YAAa4D,UAAUsoC,gBAAgB,+BAM7CntC,QAAQC,OAAO,kCACb,wBACA,oBACA,aACA,SACA,oBAECsI,UAAU,qBAAsB,SAAU1D,WACzC,OACE3D,WAAY,SAAUd,EAAGoI,OAAQsI,UAAWyxB,OAAQ7jB,OAElDlW,OAAOumC,SAAWrwB,MAAMxM,KAAK23B,KAG7BrhC,OAAO2mC,kBACP3mC,OAAO4mC,gBACP5mC,OAAO6mC,kBACP7mC,OAAOssB,WAAa,EAEpBtsB,OAAO8mC,qBAAuB,SAAU3M,QACtC,GAAIr6B,OAAQ,EAIZ,OAHIE,QAAO+mC,kBACRjnC,MAAQi6B,OAAO/5B,OAAO+mC,kBAAkB5M,OAAQA,UAE5Cr6B,OAGTE,OAAOgnC,UAAYpvC,EAAEgJ,SAAS,SAAUqmC,WACtCjnC,OAAOknC,gBAAiB,CACxB,IAAIC,WAAYvvC,EAAE+tC,SAEhB3lC,OAAO2mC,eACP3mC,OAAO6mC,eACP7mC,OAAO4mC,aACPK,UAEF,OAAOjnC,QAAOsoC,UAAU1gC,OAAQu/B,YAC7B9rC,KAAK,SAAUqJ,UACd1E,OAAOkP,MAAQxK,SAAS7D,QACxBb,OAAOknC,gBAAiB,KAE3B,KAGHlnC,OAAO27B,QAAU,SAAUtrB,OACzBrQ,OAAO4mC,gBAEHv2B,QACFrQ,OAAO4mC,aAAa5mC,OAAOqnC,iBAAmBh3B,OAIhDrQ,OAAOssB,WAAa,EAEpBtsB,OAAOgnC,aAIThnC,OAAOsnC,oBAAsBtnC,OAAOunC,gBACpCvnC,OAAOwnC,eAAiB,SAAU5/B,QAChC5H,OAAO6mC,eAAiBj/B,OAGxB5H,OAAOssB,WAAa,EAEpBtsB,OAAOgnC,aAIThnC,OAAOynC,aAAe,KACtBznC,OAAO0nC,cAAgB,MACvB1nC,OAAO2nC,MAAQ,SAAUY,WACvB,GAAIzrB,UAGFA,WAFEyrB,YAAcvoC,OAAOynC,cAEc,SAAzBznC,OAAO0nC,cAA2B,GAGlC,IAId1nC,OAAO2mC,gBAAkBxP,SAAUra,UAAYyrB,WAC/CvoC,OAAOgnC,UAAUhnC,OAAO2mC,eAAexP,UACpC97B,KAAK,WACJ2E,OAAOynC,aAAec,UACtBvoC,OAAO0nC,cAA8B,MAAd5qB,UAAoB,OAAS,SAI1D9c,OAAOwoC,aAAe,SAAU/nC,KAAMuO,OACpC,GAAIw5B,cAAe,GASnB,OAPI5wC,GAAEiO,WAAWmJ,MAAMjT,SACrBysC,aAAex5B,MAAMjT,QAAQ0E,MACpB7I,EAAEuV,SAAS6B,MAAMjT,SAC1BysC,aAAe/nC,KAAKuO,MAAMjT,SACjBiT,MAAM0mB,QACf8S,aAAe/nC,KAAKuO,MAAM0mB,QAErB8S,cAGTxoC,OAAO4nC,KAAO,WACZt/B,UAAUoB,KAAK1J,OAAO6nC,gBAAiBpnC,MAAQ9N,GAAI,WAGrDqN,OAAO8nC,QAAU,SAAUW,aACzBzoC,OAAO0oC,aAAajoC,KAAMgoC,cAC1B7wC,EAAEtB,OAAO0J,OAAOkP,MAAO,SAASzO,MAC9B,MAAOA,QAASgoC,eAIpBzoC,OAAOgoC,aAAe,SAAUvnC,MAC9B6H,UAAUoB,KAAK1J,OAAO6nC,gBAAiBpnC,KAAMA,SAK/CT,OAAOioC,mBACLrwC,EAAEsb,MAAMlT,OAAOsnC,qBACZY,WAAWrI,QAAQ,IACnBsI,IAAI,SAAUC,QAETA,SACFpoC,OAAO6mC,eAAiBuB,OAAOxgC,UAGlCO,OAAO,SACPrI,SACD,GAGJE,OAAOgnC,aAETplC,KAAM,SAAUC,MAAOvP,QAASsS,OAC9B/C,MAAMwmC,gBAAkB,oBAAsBzjC,SAEhDvB,SAAU,IACVxB,OACEgmC,eAAgB,IAChBa,YAAa,IACbJ,SAAU,IACVf,cAAe,IAEfoB,YAAa,IACbC,UAAW,IACXC,gBAAiB,IACjBxB,gBAAiB,IACjBN,gBAAiB,KAEnBtuC,YAAa4D,UAAUsoC,gBAAgB,uDAM7CntC,QAAQC,OAAO,oBACb,WAEC2U,SAAS,eACR,IACA,SAA8BxU,GAE5B,GAAIkxC,SAAU,GAEVC,YAAc,GAEdC,aAAe,GAEf1xC,MAAQ,SAAUisB,SACpB,MAAO,IAAIia,OAAM,qCAAuCja,SAG1DrsB,MAAK+xC,WAAa,SAAUnpC,OAC1B,IAAIlI,EAAEuV,SAASrN,OAGb,KAAMxI,OAAM,4BAEd,OAJEwxC,SAAUhpC,MAIL5I,MAGTA,KAAKgyC,eAAiB,SAAUppC,OAC9B,IAAIlI,EAAEuV,SAASrN,OAGb,KAAMxI,OAAM,gCAEd,OAJEyxC,aAAcjpC,MAIT5I,MAGTA,KAAKiyC,gBAAkB,SAAUrpC,OAC/B,IAAIlI,EAAEuV,SAASrN,OAGb,KAAMxI,OAAM,iCAEd,OAJE0xC,cAAelpC,MAIV5I,MAGTA,KAAKkT,KAAO,WACV,OACEg/B,gBAAiBxxC,EAAEF,SAASsxC,cAO5BrhC,mBAAoB,SAAU0hC,QAC5B,MAAON,aAAcD,SAAWO,QAAU,KAS5CC,oBAAqB,SAAU9yC,KAC7B,GAAI+yC,SAAUR,YAAcD,OAC5B,OAAmB,KAAZS,SAAkB/yC,IAAIohC,WAAW2R,eASpD/xC,QAAQC,OAAO,yBACb,qBAEC+D,QAAQ,oBACP,cACA,SAAU8L,aAUR,MARApQ,MAAKsyC,QAAU,SAAUrxC,QAKvB,MAJImP,aAAYgiC,oBAAoBnxC,OAAO3B,OACvC2B,OAAO1B,QAAU0B,OAAO1B,YACxB0B,OAAO1B,QAAQgzC,cAAgB,SAAWniC,YAAY8hC,mBAEnDjxC,QAGFjB,QAMbM,QAAQC,OAAO,aACb,mBACA,0BAKFD,QAAQC,OAAO,mBACb,WAEC2U,SAAS,SACR,IACA,SAAUxU,GAER,GAAIse,OAAQhf,IAoJZ,OAlJAgf,OAAMwzB,QAAU,SAAUjvB,MAExB,MAAOA,MAAK7e,WAAW+tC,cACpB3vB,QAAQ,OAAQ,KAChBA,QAAQ,YAAa,IACrBA,QAAQ,SAAU,KAClBA,QAAQ,MAAO,IACfA,QAAQ,MAAO,KAapB9D,MAAMS,OAAS,SAAUizB,KAAM5Z,UAAWC,QAAS4Z,kBACjD,GAAI3Z,MAAM,EACN4Z,WAAa7Z,OAUjB,IARI4Z,mBACE5Z,QAAU,EACZ6Z,WAAa,EACJ7Z,SAAW2Z,KAAK5zC,SACzB8zC,WAAaF,KAAK5zC,OAAS,IAI3Bg6B,WAAa,GAAKA,UAAY4Z,KAAK5zC,QACnC8zC,YAAc,GAAKA,WAAaF,KAAK5zC,OAAQ,CAC/C,GAAIm6B,SAAUyZ,KAAK14B,OAAO8e,UAAW,EAAG4Z,KAAKE,YACzC3Z,SAAQn6B,OAAS,IACnB4zC,KAAKE,YAAc3Z,QAAQ,GAC3BD,KAAM,GAIV,MAAOA,MAUTha,MAAMW,WAAa,SAAU+yB,KAAMp5B,OACjC,MAAOo5B,MAAK14B,OAAOV,MAAO,GAAGxa,OAAS,GAUxCkgB,MAAM8M,MAAQ,SAAUpb,QACjBA,SACHA,UAEF,IAAI0P,MAAOD,OAAOC,KAAK1P,QACnByI,MAAQ,EAQZ,OAPIiH,MAAKthB,OAAS,IAChBqa,OAAS,IACTA,OAASiH,KAAK9W,IAAI,SAAUue,KAC1B,MAAOA,KAAM,IAAMnX,OAAOmX,OAE3BsiB,KAAK,MAEDhxB,OAGT6F,MAAMxM,MAOJ23B,KAAM,WACJ,GAAI0I,KAAM,IACN/vB,QAAU,GAAIgwB,QAAOD,IAAM,OAAQ,KACnCE,QAAUryC,EAAEsyC,YAAYluB,WAGxBmuB,eAAiB,EACrB,IAAIF,QAAQj0C,OAAS,GAA4B,gBAAhBi0C,SAAQ,GAAkB,CACzD,GAAIr4B,SAAUq4B,QAAQ,GAAGG,MAAM,kBAC3Bx4B,WACFu4B,eAAiBv4B,QAAQ,GACzBq4B,QAAQ,GAAKA,QAAQ,GAAGjwB,QAAQmwB,eAAgB,KAGpD,MAAOA,gBAAiBF,QAAQ5I,KAAK0I,KAAK/vB,QAAQA,QAAS+vB,OAI/D7zB,MAAM9L,MACJ,KACA,SAAUhO,IAqCR,MA3BA8Z,OAAMwO,UAAY,WAChB,GAAI2lB,SAAS,EAETC,QAAU,SAAUC,MAEtB,MAAO,YACL,MAAKF,QASIjuC,GAAGe,UARVktC,QAAS,EAEFjuC,GACJ5D,KAAK+xC,KAAKxb,MAAM,KAAM/S,YACtBhQ,QAAQ,WACPq+B,QAAS,MAYnB,OAJAC,SAAQ3lB,SAAW,WACjB,MAAO0lB,SAGFC,SAGFp0B,QAIJA,SAMb1e,QAAQC,OAAO,6BACb,wBACA,mBAECsI,UAAU,iBAAkB,SAAU1D,WACrC,OACEgH,SAAU,IACVxB,OACE4G,MAAO,KAEThQ,YAAa4D,UAAUsoC,gBAAgB,wDAM7CntC,QAAQC,OAAO,aACb,oBACA,wBACA,kBACA,SACA,cACA,qBACA,0BACA,8BAECsI,UAAU,YAAa,SAAUlN,EAAGwJ,WACnC,OACE3D,WAAY,SAAUd,EAAGoI,OAAQkW,MAAOsiB,MAAOgS,0BAE7CxqC,OAAOyqC,aAAeD,yBAEtBxqC,OAAOioB,OAAS,SAAUzX,OACxB0F,MAAMS,OAAO3W,OAAO0/B,OAAQlvB,MAAOA,MAAQ,GAC3CxQ,OAAO6N,YAGT7N,OAAOmoB,SAAW,SAAU3X,OAC1B0F,MAAMS,OAAO3W,OAAO0/B,OAAQlvB,MAAOA,MAAQ,GAC3CxQ,OAAO6N,YAGT7N,OAAOhG,OAAS,SAAUwW,OACxB0F,MAAMW,WAAW7W,OAAO0/B,OAAQlvB,OAChCxQ,OAAO6N,YAGT7N,OAAOigC,SAAW,SAAU7kB,OAC1Bpb,OAAO0qC,kBAAkBtvB,MAAOA,QAChCpb,OAAO6N,YAGT7N,OAAO2qC,aAAe,SAAUt6B,OAC9B,MAAOmoB,OAAMoS,aACXv6B,MAAOA,MACPw6B,QAASL,6BAKf5oC,KAAM,SAAUC,MAAOvP,QAASkjB,MAE9B3T,MAAMinB,iBACJC,WAAY,SAAU/rB,EAAGgsB,IACvBA,GAAGC,OAAO10B,IAAI,aAAc,IAE9B20B,OAAQ,SAAUlsB,EAAGgsB,IACnBA,GAAGC,OAAO10B,IAAI,aAAc1B,EAAE8E,QAAQwxB,cAExCC,YAAa,aACbC,SAAU,EACVC,QAAS,IACT9O,YAAa,WACb+O,MAAO,SAAUvsB,EAAGgsB,IAClBA,GAAGC,OAAO10B,IAAI,aAAc1B,EAAE8E,QAAQwxB,gBAI5C9lB,SAAU,IACVxB,OACE6oC,iBAAkB,YAClBhL,OAAQ,IACR7xB,SAAU,KAEZpV,YAAa4D,UAAUsoC,gBAAgB,iCAM7CntC,QAAQC,OAAO,eACZsI,UAAU,YAAa,SAAUuI,WAChC,OACE0B,SAAU,4CACV3G,SAAU,IACVxB,SACAmY,SAAS,EACTpY,KAAM,SAAkBC,MAAOvP,QAASsS,OACtC/C,MAAMiF,KAAOlC,MAAMkC,KACnBjF,MAAMwG,MAAQzD,MAAMyD,MACyB,IAAzCC,UAAUoB,OAAOrM,QAAQwE,MAAMiF,OACjCxU,QAAQwY,SAAS,cAQ3BtT,QAAQC,OAAO,eACZsI,UAAU,WAAY,SAAUrG,MAAOoM,SACtC,OACEzC,SAAU,IACV5K,YAAa,wBACboJ,OACEya,QAAS,KAEX1a,KAAM,SAAUC,MAAOvP,QAASsS,OAC9B,GAAIkmC,UAAWlmC,MAAMkmC,UAAY,QACjCjpC,OAAMya,QAAQwuB,UAAYjpC,MAAMya,QAAQwuB,cAElB,UAAlBlmC,MAAMT,UAAuBtC,MAAMkpC,aAAc,GACrDlpC,MAAMxL,OAASuO,MAAMvO,QAAU,MAC/BwL,MAAMpM,KAAOmP,MAAMnP,MAAQ,OAC3BoM,MAAMkC,gBAAkBa,MAAMb,iBAAmB,iBAEjDlC,MAAMmpC,WAAa,WACjBllC,QAAQmlC,aACNC,UAAW,SAAU/vC,MACnB0G,MAAMwF,OAAO,WACXxF,MAAMya,QAAQwuB,UAAUvxC,MACtB5G,GAAIwI,KAAKxI,GAAGiJ,WACZwI,IAAK,KACLD,QAAS,OAEXwX,WAAW7V,QAAQpQ,YAAa,QAGpCy1C,QAAS,SAAUhwC,MACjB0G,MAAMwF,OAAO,WACXvB,QAAQslC,MAAM,UAAWjwC,SAG7BkwC,WAAY,SAAUlwC,eAYlC3D,QAAQC,OAAO,eACZsI,UAAU,mBAAoB,WAC7B,OACEsD,SAAU,IACV5K,YAAc,+CACdoJ,OACEya,QAAW,KAEb1a,KAAM,SAAkBC,MAAOvP,QAASsS,OACtC/C,MAAMrD,MAAQoG,MAAMpG,UAO5BhH,QAAQC,OAAO,eACZsI,UAAU,eAAgB,SAAUlN,EAAGwJ,UAAWivC,sBAAuBp1B,OACxE,OACEzd,YAAa,yCACb4K,SAAU,IACV2W,SAAS,EACTnY,OACEya,QAAS,IACTivB,eAAgB,IAChBC,kBAAmB,KAErB5pC,KAAM,SAAkBC,MAAOvP,QAASsS,OACtC/C,MAAMxD,KAAO,SACbwD,MAAMwG,MAAQxG,MAAM0pC,gBAAkB,UACtC1pC,MAAM4pC,SAAW5pC,MAAM2pC,kBACvB3pC,MAAM2Y,YAAc,UACpB3Y,MAAMivB,YAAcz0B,UAAU0P,gBAC5B,SACAmK,MAAM8M,OACJmU,SAAU,OACVtvB,OAAQ,MAGZhG,MAAM6pC,QAAUJ,sBAEhBzpC,MAAMiB,OAAO,kBAAmB,WAC9BjB,MAAM8pC,QAAU9pC,MAAMya,QAAQvhB,UAC7B,GAEH8G,MAAM8S,IAAM,SAAUi3B,EAAGzzB,OACvB,IAAK,GAAI0zB,KAAKhqC,OAAMya,QAAQvhB,QAC1B,GAAI8G,MAAMya,QAAQvhB,QAAQ8wC,GAAGl5C,KAAOi5C,EAAEj5C,GAAM,MAE9CkP,OAAMya,QAAQvhB,QAAQxB,KAAKqyC,GAC3B/4C,EAAEslB,OAAOiG,IAAI,KAGfvc,MAAM7H,OAAS,SAAUgD,GACvB,GAAInC,QAAShI,EAAEmK,EAAEC,QAAQ6uC,QAAQ,wBAAwB3wC,KAAK,iBAC1DxI,GAAKkI,OAAOlI,GACZo5C,aACJ,KAAK,GAAIj2C,KAAK+L,OAAMya,QAAQvhB,QACtB8G,MAAMya,QAAQvhB,QAAQjF,GAAGnD,KAAOA,IAClCo5C,WAAWxyC,KAAKsI,MAAMya,QAAQvhB,QAAQjF,GAG1C+L,OAAMya,QAAQvhB,QAAUgxC,gBASlCv0C,QAAQC,OAAO,eACZsI,UAAU,oBAAqB,SAAUrG,MAAO4O,UAAWyO,SAAUhR,SAAUlT,EAAGm5C,MAAO/zC,OAExF,GAAIg0C,gCACF,uLAMF,QACE5oC,SAAU,KACVzB,KAAM,SAAkBC,MAAOvP,QAASsS,OAqDtC,QAAS4X,kBAAiB4B,KACxBrY,SAASsF,OAAO6gC,cAChBC,aAAe,EACfzyC,OACE8D,OAAQ,MACRhH,IAAKqL,MAAMivB,YAAc1S,MACxBtnB,QAAQ,SAAUqE,MACnB,GAAI0F,SAAU1F,KAAK0F,SAAW1F,IAC9B0G,OAAMuqC,kBAAoBvrC,QAAQqQ,OAAO,EAAG,KAC3C5Z,MAAM,SAAU6D,KAAM20B,OAAQr5B,QAAS0B,QACxCF,MAAMurB,eAAe,6BAA8BqO,MAAO12B,SA9D9D,GAAIkxC,OAAQx5C,EAAEP,SAASwC,KAAK,QAC5Bu3C,OAAM72B,KAAK,eAAgB,MAC3B,IAAI82B,UAAWz5C,EAAEkkB,SAASk1B,gCAAgCpqC,OAE1DhP,GAAEy5C,UAAU/3C,KACV6K,SAAU,WACVmtC,IAAKF,MAAMjtC,WAAWmtC,IAAMF,MAAMG,cAClCC,KAAMJ,MAAMjtC,WAAWqtC,KACvBC,SAAUL,MAAMM,aAChBjB,QAAS,SAEXW,MAAMvnC,SAAS/P,OAAOu3C,UACtBz5C,EAAEy5C,UAAU3tB,OAAO,QAGnB9c,MAAMiB,OACJ,WACE,OACEypC,IAAKF,MAAMjtC,WAAWmtC,IAAMF,MAAMG,cAClCC,KAAMJ,MAAMjtC,WAAWqtC,KACvBC,SAAUL,MAAMM,eAGpB,SAAU3pC,SAAUmgB,UAClBtwB,EAAEy5C,UAAU/3C,KACVg4C,IAAKvpC,SAASupC,IACdE,KAAMzpC,SAASypC,KACfC,SAAU1pC,SAAS0pC,aAGvB,EAGF,IAAsBR,cAAlBC,aAAe,CAEnBE,OAAMthC,GAAG,QAAS,SAAU/N,GAC1BqvC,MAAMthC,GAAG,QAAS,WAChB,GAAIqT,KAAMiuB,MAAMjuB,KACJ,MAARA,IACFvc,MAAMuqC,sBAENrmC,SAASsF,OAAO6gC,cAChBA,aAAenmC,SAAS,WAAcyW,iBAAiB4B,MAAS,KAE5D+tB,aAAe,GACjB3vB,iBAAiB4B,QAIvBvrB,EAAEy5C,UAAU3tB,OAAO,UAiBrB0tB,MAAMthC,GAAG,OAAQ,SAAU/N,GACzBnK,EAAEy5C,UAAU5tB,QAAQ,UAGtB7rB,EAAEy5C,UAAUvhC,GAAG,YAAa,SAAU,SAAU/N,GAC9CnK,EAAEy5C,UAAUx3C,KAAK,aAAa2pB,YAAY,YAC1C5rB,EAAEqE,MAAM4T,SAAS,cAGnBuhC,MAAMthC,GAAG,QAAS,SAAU/N,GAC1B,GAAkB,KAAdA,EAAEwE,QACJ,GAA2C,IAAvC3O,EAAE,eAAgBy5C,UAAUt2C,OAC9BnD,EAAE,YAAay5C,UAAUpvB,QAAQpS,SAAS,gBACrC,CACL,GAAI8hC,eAAgB/5C,EAAE,eAAgBy5C,UAClCO,kBAAoBD,cAAcxvB,KAAK,MACV,KAA7ByvB,kBAAkB72C,OACpBnD,EAAE,YAAay5C,UAAUpvB,QAAQpS,SAAS,YAE1C+hC,kBAAkB/hC,SAAS,YAE7B8hC,cAAcnuB,YAAY,YAG9B,GAAkB,KAAdzhB,EAAEwE,QACJ,GAA2C,IAAvC3O,EAAE,eAAgBy5C,UAAUt2C,OAC9BnD,EAAE,YAAay5C,UAAUjvB,OAAOvS,SAAS,gBACpC,CACL,GAAIgiC,WAAYj6C,EAAE,eAAgBy5C,UAC9BS,cAAgBD,UAAU3vB,KAAK,MACN,KAAzB4vB,cAAc/2C,OAChBnD,EAAE,YAAay5C,UAAUjvB,OAAOvS,SAAS,YAEzCiiC,cAAcjiC,SAAS,YAEzBgiC,UAAUruB,YAAY,YAG1B,GAAkB,KAAdzhB,EAAEwE,QAAgB,CACpB,GAAIwrC,UAAWn6C,EAAE,eAAgBy5C,SACT,KAApBU,SAASh3C,QAAgB6L,MAAMorC,QAAQZ,MAAMjuB,OAAO,GACxD4uB,SAASnwC,WAIbgF,MAAMorC,QAAU,SAAUrB,EAAGsB,UAC3BrrC,MAAM8S,IAAIi3B,EAAGS,MAAOa,WAAY,GAChCrrC,MAAMuqC,0BAUhB50C,QAAQC,OAAO,eACZsI,UAAU,kBAAmB,WAC5B,OACEsD,SAAU,IACV5K,YAAa,+BACboJ,OACEsrC,gBAAiB,KAEnBz0C,WAAY,yBAMlBlB,QAAQC,OAAO,eACZsI,UAAU,qBAAsB,WAC/B,OACEsD,SAAU,IACVxB,SACApJ,YAAa,mCACbC,WAAY,4BAMlBlB,QAAQC,OAAO,eACZsI,UAAU,mBAAoB,SAAUlN,GACvC,OACE4F,YAAa,0CACb4K,SAAU,IACV2W,SAAS,EACTnY,OACEurC,SAAU,KAEZxrC,KAAM,SAAkBC,MAAOvP,QAASsS,OACtC/C,MAAMxD,KAAO,cACbwD,MAAMwG,MAAQ,eACdxG,MAAM2Y,YAAc,eACpB3Y,MAAMivB,YAAc,4CAEpBjvB,MAAMiB,OAAO,uBAAwB,WAC9BjB,MAAMurC,SAASpc,eAAe,gBAAmD,OAA/BnvB,MAAMurC,SAAStyC,cACpE+G,MAAM4G,MAAQ5G,MAAMurC,SAAStyC,YAAYe,WAAagG,MAAMurC,SAAStyC,YAAYuyC,YAIrFxrC,MAAM6pC,QAAU,SAAUE,GACxB,MAAQA,IAAKA,EAAE/vC,WAAc,IAG/BgG,MAAM8S,IAAM,SAASi3B,EAAGzzB,OACjBtW,MAAMurC,SAASpc,eAAe,gBAAkD,OAA/BnvB,MAAMurC,SAAStyC,aAC/D+G,MAAMurC,SAAStyC,YAAYnI,KAAOi5C,EAAEj5C,KAK1CkP,MAAMurC,SAAStyC,YAAc8wC,EAC7B/4C,EAAE,2BAA2B4rB,YAAY,UACzC5rB,EAAE,2BAA2BiY,SAAS,YAGxCjJ,MAAM7H,OAAS,SAAUgD,GACvB6E,MAAMurC,SAAStyC,YAAc,KAC7B+G,MAAM4G,MAAQ,UASxBjR,QAAQC,OAAO,eACZsI,UAAU,gBAAiB,SAAUrG,MAAOoM,QAASjT,EAAGy6C,aAActB,MACnEt9B,eAAgBrS,UAAWpE,OAC7B,OACEoL,SAAU,IACV5K,YAAc4D,UAAUkoC,2BAA2B,uBACnD7rC,WAAY,SAAUsH,QA4CpB,QAASutC,eACP16C,EAAE,aAAa4rB,YAAY,cAAc3T,SAAS,eAAemN,KAAK,+CACtEve,OACElD,IAAK,gCAAkCwJ,OAAOwtC,YAC9ChwC,OAAQ,OACRrC,KAAM6E,OAAOo7B,OACZtkC,QAAQ,SAAU22C,MACnB,GAAIC,QAASD,KAAK96C,GACdg7C,SAAW,iBAAmBD,OAAS,GACvC1tC,QAAO4tC,cACTD,UAAY,gBAAkB3tC,OAAO4tC,aAEvC9nC,QAAQe,SAASC,KAAOhB,QAAQe,SAASgnC,OAASF,WACjDr2C,MAAM,SAAU6D,KAAM20B,OAAQr5B,QAAS0B,QACzB,MAAX23B,OACFj9B,EAAE,aACColB,KAAK,sEAERplB,EAAE,aAAa4rB,YAAY,eAAe3T,SAAS,cAAcmN,KAAK,oDAExEjY,OAAO8tC,SAAU,IA/DrB9tC,OAAO+tC,SAAU,EACjB/tC,OAAOguC,SAAU,EACjBhuC,OAAO8tC,SAAU,EACjB9tC,OAAO8C,OAAO,WACZ,MAAO9C,QAAO+tC,SAAW/tC,OAAOguC,SAAWhuC,OAAO8tC,SACjD,SAAU1vB,KACPA,KACFmvB,YAAYvtC,OAAOo7B,QAIvBp7B,OAAOiuC,WAAa,SAAUjxC,GAC5B,GAAIo+B,OAAQp/B,MAASgE,OAAOkuC,SAC5B12C,SAAQ+C,OAAOyF,OAAOo7B,KAAMA,MAExBp7B,OAAOmuC,IACTb,aAAac,aACX1/B,eAAe/T,IAAI,OAAOsU,SACxBkoB,SAAU,OACVtvB,OAAQ7H,OAAOmuC,IACfE,MAAO,kBAERrV,KAAMh5B,OAAOmuC,KACd,SAAUA,KAAOnuC,OAAOo7B,KAAKvd,MAAQswB,KAAMnuC,OAAO+tC,SAAU,GAC5D,SAAUjuC,OAASwE,QAAQC,IAAI,oBAAsBzE,MAAMk5B,KAAO,uBAClE,SAAU79B,KAAM20B,OAAQr5B,QAAS0B,QAAUF,MAAMurB,eAAe,0BAA2BqO,MAAO12B,SAGpG6E,OAAO+tC,SAAU,EAGf1xC,UAAUyoC,mBACZp2B,eAAegS,IAAI,MAAMviB,MAAM9C,KAAK,SAAUF,MAC5C6E,OAAOo7B,KAAKrgC,SAAWI,MACvB6E,OAAOguC,SAAU,IAGnBhuC,OAAOguC,SAAU,EAGnBhuC,OAAO8tC,SAAU,IA6BrBlsC,KAAM,SAAUC,MAAOvP,QAASsS,OAG9B/C,MAAMysC,MAAQ,EAEdz7C,EAAEP,SAASwC,KAAK,oBAAoBiW,GAAG,QAAS,SAAU/N,GACxDnK,EAAE,2BAA2B4rB,YAAY,UACzC5rB,EAAEqE,MAAM4T,SAAS,YAGnBjY,EAAEP,SAASwC,KAAK,oBAAoBiW,GAAG,QAAS,SAAU/N,GAQxD,MAPA6E,OAAM0sC,iBAAmB17C,EAAEqE,MAAMujB,OACjC5Y,MAAM2rC,YAAc36C,EAAEqE,MAAMiE,KAAK,iBAAmB,KACpD0G,MAAMu5B,KAAOvoC,EAAEqE,MAAMiE,KAAK,YAC1B0G,MAAMssC,IAAMt7C,EAAEqE,MAAMiE,KAAK,QAAU,KACnC0G,MAAM+rC,YAAc/6C,EAAEqE,MAAMiE,KAAK,gBAAkB,KACnD0G,MAAMwF,UAEFxU,EAAEqE,MAAMs3C,SAAS,aACnBxxC,EAAEwc,iBAEF3mB,EAAE,4BAA4BgK,SACvB,KAMXhK,EAAE,+BAA+BkY,GAAG,QAAS,SAAU/N,GACrD6E,MAAMysC,MAAQ,EACdz7C,EAAE,cAAc47C,UAGlB57C,EAAEP,SAASyY,GAAG,UAAW,UAAW,SAAU/N,GAC1B,KAAdA,EAAEwE,SAAkBK,MAAMqsC,UAC5Br7C,EAAEP,SAASwC,KAAK,OAAO+H,UAI3BhK,EAAE,WAAWkY,GAAG,kBAAmB,WACjClJ,MAAMqsC,SAAW,GACjBrsC,MAAMysC,MAAQ,QAUxB92C,QAAQC,OAAO,eACZsI,UAAU,gBAAiB,SAAUlN,GACpC,OACEwQ,SAAU,IACV5K,YAAa,4BACbmJ,KAAM,SAAUC,MAAOvP,QAASsS,OAE9B,GAAI8pC,IAAK77C,EAAE,cACP87C,GAAKD,GAAG55C,KAAK,UACb85C,GAAKF,GAAG55C,KAAK,uBAEjB65C,IAAG9xC,MAAM,SAAUG,GACjB,GAAIsqB,OAAQz0B,EAAEqE,MAAMse,KAAK,QAAQvQ,MAAM,KAAK,EAC5CjI,GAAEwc,iBACFo1B,GAAGp5B,KAAK,KAAM8R,SAGhBz0B,EAAE,cAAckY,GAAG,mBAAoB,WACrClY,EAAEqE,MAAMpC,KAAK,OAAO2pB,YAAY,oBAAoB3T,SAAS,uBAG/DjY,EAAE,cAAckY,GAAG,mBAAoB,WACrClY,EAAEqE,MAAMpC,KAAK,OAAO2pB,YAAY,qBAAqB3T,SAAS,0BAQxEtT,QAAQC,OAAO,eACZsI,UAAU,eAAgB,SAAUrG,MAAOm1C,UAAWh8C,EAAG4mB,UACxD,OACEhhB,YAAa,4BACb4K,SAAU,IACVzB,KAAM,SAAkBC,MAAOvP,QAASsS,OAsBtC,QAASkqC,wBACP,GAAIC,oBAAqB,SAAUj5C,GACjC,MAAO,UAAWk5C,SACZv1B,SAASw1B,eAAeD,SAASE,yBACjCz1B,SAASw1B,eAAeD,SAASE,wBAAwBC,MAE3Dz1C,OACE8D,OAAQ,MACRhH,IAAKijB,SAASw1B,eAAeD,SAASE,wBAAwBC,KAC9D14C,SACEkH,cAAe9G,UAEhBC,QAAQ,SAAUqE,MACnB0G,MAAMotC,eAAeD,SAASI,WAAaj0C,KACxB,aAAfA,KAAKukB,QACP7d,MAAMotC,eAAeD,SAAS5oC,UAAW,MAK9CtQ,GAGL,KAAK,GAAIA,KAAK2jB,UAASw1B,eACjBptC,MAAMotC,eAAen5C,IAAM+L,MAAMotC,eAAen5C,GAAGsQ,WAGvDvE,MAAMotC,eAAen5C,GAAK2jB,SAASw1B,eAAen5C,GAClDi5C,mBAAmBj5C,IAjDvB+L,MAAMotC,kBAENptC,MAAMiB,OAAO,WACX,MAAO2W,UAASw1B,gBACf,WACDH,yBACC,GAEHD,UAAU,WACRh8C,EAAE,UAAUsZ,OAAO,WAAc,MAAOjV,MAAKm4C,IAAIjF,MAAM,uBAAyB3b,KAAK,WACnF,GAAI6gB,SAAU,8BACV38C,GAAK28C,QAAQC,KAAKr4C,KAAKm4C,KAAK,EAC1B18C,MAAM8mB,UAASw1B,gBACnBx1B,SAAS+1B,SAAS78C,IAAI0I,KAAK,SAAUF,MACnCse,SAASw1B,eAAet8C,IAAMwI,KAAKA,SAIzC2zC,wBACC,SAwCXt3C,QAAQC,OAAO,eACZsI,UAAU,mBAAoB,SAAUutC,aAAc5+B,eAAgBzW,MAAOpF,GAC5E,OACE4F,YAAa,0CACb4K,SAAU,IACVxB,OACEya,QAAS,IACTmzB,UAAW,KAEbz1B,SAAS,EACTpY,KAAM,SAAkBC,MAAOvP,QAASsS,OACtC/C,MAAMxD,KAAO,eACbwD,MAAMwG,MAAQ,eACdxG,MAAM2Y,YAAc,eACpB3Y,MAAMivB,YAAc,2CAEpBjvB,MAAMiB,OAAO,uBAAwB,WACnCjB,MAAM4G,MAAQ5G,MAAMya,QAAQgiB,eAG9Bz8B,MAAM6pC,QAAU,SAAUE,GACxB,MAAQA,IAAKA,EAAEvtC,MAAS,IAG1BwD,MAAM8S,IAAM,SAAUi3B,EAAGzzB,MAAO+0B,UAC9B,GAAIwC,MAAOxC,SAAWtB,EAAIA,EAAEvtC,IAC5BivC,cAAac,aACX1/B,eAAe/T,IAAI,UAAUsU,SAC3B5a,KAAM,eACNuoB,EAAG8yB,QAEJrxC,KAAMqxC,MACP,SAAUC,IAAM9tC,MAAMya,QAAQgiB,aAAeqR,GAAGtxC,KAAMxL,EAAE,2BAA2B4rB,YAAY,WAC/F,SAAU3e,OAAS+B,MAAMya,QAAQgiB,aAAex+B,MAAMzB,KAAMxL,EAAE,2BAA2BiY,SAAS,WAClG,SAAU3P,KAAM20B,QAAU73B,MAAMurB,eAAe,6BAA8BqO,MAAO12B,UAIxF0G,MAAM7H,OAAS,SAAUgD,GACvB6E,MAAMya,QAAQgiB,aAAe,UASvC9mC,QAAQC,OAAO,eACZsI,UAAU,kBAAmB,SAAUrG,OACtC,QAASk2C,aAAYt9C,SACnBA,QAAQwY,SAAS,UAGnB,OACEzH,SAAU,IACVzB,KAAM,SAAkBC,MAAOvP,QAASsS,OACtClL,OACE8D,OAAQ,UACRhH,IAAKoO,MAAMirC,WACXC,uBAAuB,IACtBh5C,QAAQ,SAAUqE,KAAM20B,QAEV,MAAXA,QACF8f,YAAYt9C,WAEbgF,MAAM,SAAU6D,KAAM20B,QACR,MAAXA,QACF8f,YAAYt9C,cASxBkF,SAAQC,OAAO,eACZsI,UAAU,cAAe,SAAUlN,EAAGkkB,SAAU3a,GAAI1C,MAAOq2C,eACxDC,aAOF,OACE3sC,SAAU,IACVxB,OAAO,EACPD,KAAM,SAAUC,MAAOvP,QAASsS,OAC9B,GAAInM,aAAc,UAAYmM,MAAMoF,SAChC/F,SAAWpR,EAAEP,QAEjBuP,OAAMouC,WAAW,WACfpuC,MAAMiB,OAAO,WACX,MAAOmB,UAASisC,GAAG,aAClB,SAAUC,SACPA,UAAYtuC,MAAMuuC,SACpBvuC,MAAMuuC,QAAS,EACfJ,YAAY7xC,IAAI1F,aAAa4C,KAAK,SAAU4c,MAC1C,GAAIjO,UAAWxS,QAAQlF,QAAQ2lB,MAC3Bo4B,WAAat5B,SAAS/M,UAAUnI,MACpCvP,SAAQ2lB,KAAKo4B,YACb/9C,QAAQiC,IAAI,SAAU,kBAWtCiD,SAAQC,OAAO,eACZsI,UAAU,eAAgB,SAAUqjB,gBACnC,OACE/f,SAAU,IACV2W,SAAS,EACTvhB,YAAa,6BACboJ,SACAD,KAAM,SAAUC,MAAOvP,QAASsS,OAC9Bwe,eAAenX,0BACZ5Q,KAAK,SAAUM,MACdkG,MAAM0J,YAAc5P,KAEpBkG,MAAMqK,OAASkX,eAAelX,aAQ1C1U,QAAQC,OAAO,eACZsI,UAAU,SAAU,SAAU1D,UAAW+mB,gBACxC,OACE/f,SAAU,IACVxB,OAAO,EACPpJ,YAAa,SAAU63C,SAAUC,QAC/B,MAAOl0C,WAAU2oC,iBAAiBuL,OAAOC,OAE3C5uC,KAAM,SAAUC,OACdA,MAAM43B,SAAWp9B,UAAUq9B,iBAE3BtW,eAAenX,0BACZ5Q,KAAK,SAAUM,MACdkG,MAAM0J,YAAc5P,WAQhCnE,QAAQC,OAAO,eACZsI,UAAU,kBAAmB,SAAU+F,QAASjT,GAC/C,OACE+O,KAAM,SAAUC,MAAOvP,QAASsS,OAC9BA,MAAM6rC,SAAS,UAAW,SAAUryB,KAClCvrB,EAAEP,SAASwC,KAAK,OAAOwB,SACvBhE,QAAQkjB,KAAK,gBAAiB5Q,MAAM8rC,SACpCp+C,QAAQkjB,KAAK,YAAa5Q,MAAMnP,MAC3BmP,MAAM8rC,SAAY79C,EAAEP,SAAS49C,GAAG,cAGrCpqC,QAAQ6qC,mBAAmBr+C,QAAQ,IACnCA,QAAQs+C,cAQlBp5C,QAAQC,OAAO,eACZsI,UAAU,YAAa,SAAUrG,MAAO7G,EAAGoF,OAC1C,OACEQ,YAAa,wBACb4K,SAAU,IACV2W,SAAS,EACTnY,OACE4G,MAAO,KAGT7G,KAAM,SAAUC,MAAOvP,QAASsS,OAC9B,GAAIksB,aAAc,iCAElBjvB,OAAMgvC,UAAY,KAClBhvC,MAAMivC,eAENjvC,MAAMiB,OAAO,aAAc,WACzB,IAAK,GAAIhN,GAAI,EAAGA,EAAI+L,MAAMivC,YAAY96C,OAAQF,IACxC+L,MAAMivC,YAAYh7C,GAAGnD,KAAOo+C,OAAOlvC,MAAMgvC,aAC3ChvC,MAAM4G,MAAM6R,KAAOzY,MAAMivC,YAAYh7C,GAGzC+L,OAAMgvC,UAAYhvC,MAAM4G,MAAM6R,KAAK3nB,KAGrC+G,OACE8D,OAAQ,MACRhH,IAAKs6B,cACJh6B,QAAQ,SAAUqE,MACnB0G,MAAMivC,YAAc31C,KAAK0F,SAAW1F,OACnC7D,MAAM,SAAU6D,KAAM20B,OAAQr5B,QAAS0B,QACxCF,MAAMurB,eAAe,wBAAyBqO,MAAO12B,aAQ/D3D,QAAQC,OAAO,eACZsI,UAAU,gBAAiB,SAAU3D,GAAI2J,SAAUD,SAClD,OACEkU,SAAS,EACT3W,SAAU,IACV5K,YAAa,0BACboJ,OACEmvC,WAAc,IACdC,QAAW,UACX94C,OAAU,KACV+4C,OAAU,kBAEZtvC,KAAM,SAAUC,MAAOvP,QAASsS,OAC9B/C,MAAMsvC,WAAatvC,MAAMqvC,OAEzBtsC,MAAM6rC,SAAS,SAAU,SAAUryB,KAC5B5mB,QAAQ0M,UAAUka,OACrBvc,MAAM1J,QACJ+N,KAAM,uDACNC,KAAM,SACNC,SAAU,QACV9O,MAAO,YAKbuK,MAAM3G,KAAO,WACX,GAAI0J,MAAMwsC,iBAAkB,CAC1B,GAAI7tB,SAAU3e,MAAMwsC,gBACpB,KAAKtrC,QAAQqF,QAAQoY,SAAY,OAGnC1hB,MAAMqvC,OAASrvC,MAAMsvC,WACrB7+C,QACG++C,KAAK,YAAY,GACjBp5B,KAAK,yCAA6CpW,MAAM1J,OAAOgO,KAElE,IAAImrC,cAAezvC,MAAMmvC,aAErBO,YAAc,SAAUppC,QAM1B,MALAtG,OAAMqvC,OAASrvC,MAAMsvC,WACrB7+C,QACG++C,KAAK,YAAY,GACjBp5B,KAAK,0CAA8CpW,MAAM1J,OAAOiO,UAE5DL,SAAS,WACdzT,QAAQ2lB,KAAKpW,MAAM1J,OAAO+N,OACzB,KACF7K,KAAK,WACJ,MAAO8M,UAIX,IAAImpC,aAAc,CAChB,GAAIpzC,SAAUozC,aACbj2C,KAAKk2C,aACLx4B,MACC,SAAUy4B,QAMR,MALA3vC,OAAMqvC,OAAS,aACf5+C,QACG++C,KAAK,YAAY,GACjBp5B,KAAK,8CAAkDpW,MAAM1J,OAAOb,OAEhE8E,GAAGe,OAAOq0C,SAEjB3vC,OAAMovC,SACRpvC,MAAMovC,SAAS/yC,QAASA,cAI1BqzC,oBASZ/5C,QAAQC,OAAO,eACZsI,UAAU,gBAAiB,SAAUnI,EAAG01C,aAAc5+B,eAAgBzW,MACnEpF,GACF,OACE4F,YAAa,yCACb4K,SAAU,IACV2W,SAAS,EACTpY,KAAM,SAAkBC,MAAOvP,QAASsS,OACtC/C,MAAMxD,KAAO,UACbwD,MAAMwG,MAAQ,WACdxG,MAAM2Y,YAAc,kBACpB3Y,MAAMivB,YAAc,4DACpBjvB,MAAM6pC,QAAU,SAAUE,GACxB,MAAOA,GAAEvtC,MAGXwD,MAAMiB,OAAO,eAAgB,WAC3BjB,MAAM8pC,QAAU/zC,EAAE65C,MAAM5vC,MAAMya,QAAQuB,MAAOxpB,KAAM,mBAClD,GAEHwN,MAAM8S,IAAM,SAAUi3B,EAAGzzB,MAAO+0B,UAC9B,GAAIwE,QAASxE,SAAWtB,EAAIA,EAAEvtC,IAC9BivC,cAAac,aACX1/B,eAAe/T,IAAI,OAAOsU,SACxBkoB,SAAU,OACVtvB,OAAQ6pC,OACRrD,MAAO,kBAERhwC,KAAMqzC,QACP,SAAUvD,KAAOtsC,MAAMya,QAAQuB,KAAKtkB,KAAK40C,MACzC,WAAc7pC,QAAQC,IAAI,2BAC1B,SAAUpJ,KAAM20B,QAAU73B,MAAMurB,eAAe,wBAAyBqO,MAAO12B,SAEjFtI,EAAEslB,OAAOiG,IAAI,KAGfvc,MAAM7H,OAAS,SAAUgD,GACvB,GAAImxC,KAAMt7C,EAAEmK,EAAEC,QAAQ6uC,QAAQ,wBAAwB3wC,KAAK,iBACvDkD,KAAO8vC,IAAI9vC,KACXszC,UACJ,KAAK,GAAI77C,KAAK+L,OAAMya,QAAQuB,KACtBhc,MAAMya,QAAQuB,KAAK/nB,GAAGuI,OAASA,MACjCszC,QAAQp4C,KAAKsI,MAAMya,QAAQuB,KAAK/nB,GAGpC+L,OAAMya,QAAQuB,KAAO8zB,aAS/Bn6C,QAAQC,OAAO,eACZsI,UAAU,gBAAiB,SAAUrG,MAAOoM,QAASiR,SAAUlkB,GAC9D,OACEwQ,SAAU,IACV5K,YAAa,6BACboJ,OACEya,QAAS,IACT/pB,MAAO,IACPie,MAAO,KAET5O,KAAM,SAAUC,MAAOvP,QAASsS,OAC9B,GAAIX,UAAWpR,EAAEP,QAEK,WAAlBsS,MAAMT,UACRtC,MAAMkpC,aAAc,GAGtBlpC,MAAMxL,OAASuO,MAAMvO,QAAU,MAC/BwL,MAAMpM,KAAOmP,MAAMnP,MAAQ,OAE3BoM,MAAM0D,YAAc,SAAUiL,OAC5B3O,MAAMya,QAAQs1B,OAAO1gC,OAAOV,MAAO,IAGrC3O,MAAM2D,UAAY,SAAUgL,OAC1B,GAAIqhC,cAAe,eAEnB/rC,SAAQgsC,gBACNjwC,MAAMya,QAAQs1B,OAAOphC,OAAO7d,GAC5B,SAAUwI,MACR,QAAS42C,oBACP9tC,SAASnP,KAAK,WAAa+8C,cAAcv7C,SAG3Cy7C,mBAEI9tC,SAASnP,KAAK,UAAUqG,KAAK,aAAeA,KAAKxI,KAIrDsR,SAASnP,KAAK,cAAciW,GAAG,OAAQgnC,kBACvC9tC,SAASnP,KAAK,cAAck9C,MAC1B,aAAeH,aAAe,4BAGhChwC,MAAMya,QAAQs1B,OAAOphC,OAAO7d,GAAKwI,KAAKxI,GAAGiJ,WACzCiG,MAAMwF,SACNvB,QAAQpQ,cACJuO,SAASnP,KAAK,cAAc,GAAGm9C,UAAYF,qBAEjD,aACA,SAAU3sC,UACRvD,MAAMya,QAAQs1B,OAAOphC,OAASpL,SAC9BU,QAAQpQ,qBAUtB8B,QAAQC,OAAO,eACZsI,UAAU,YAAa,SAAUnI,EAAG01C,aAAc5+B,eAAgBzW,MAAOpF,GACxE,OACE4F,YAAa,yCACb4K,SAAU,IACVxB,OACEya,QAAS,KAEXtC,SAAS,EACTpY,KAAM,SAAkBC,MAAOvP,QAASsS,OACtC/C,MAAMxD,KAAO,MACbwD,MAAMwG,MAAQ,OACdxG,MAAM2Y,YAAc,cACpB3Y,MAAMivB,YAAc,2DACpBjvB,MAAM6pC,QAAU,SAAUE,GACxB,MAAOA,GAAEvtC,MAGXwD,MAAMiB,OAAO,eAAgB,WAC3BjB,MAAM8pC,QAAU/zC,EAAE65C,MAAM5vC,MAAMya,QAAQuB,MAAOxpB,KAAM,kBAClD,GAEHwN,MAAM8S,IAAM,SAAUi3B,EAAGzzB,MAAO+0B,UAC9B,GAAIwE,QAASxE,SAAWtB,EAAIA,EAAEvtC,IAC9BivC,cAAac,aACX1/B,eAAe/T,IAAI,OAAOsU,SACxBkoB,SAAU,OACVtvB,OAAQ6pC,UAETrzC,KAAMqzC,QACP,SAAUvD,KAAOtsC,MAAMya,QAAQuB,KAAKtkB,KAAK40C,MACzC,SAAUruC,OAAS+B,MAAMya,QAAQuB,KAAKtkB,MAAM8E,KAAMyB,MAAMzB,KAAMhK,KAAM,cAAe69C,KAAK,KACxF,SAAU/2C,KAAM20B,QAAU73B,MAAMurB,eAAe,oBAAqBqO,MAAO12B,SAE7EtI,EAAEslB,OAAOiG,IAAI,KAGfvc,MAAM7H,OAAS,SAAUgD,GACvB,GAAImxC,KAAMt7C,EAAEmK,EAAEC,QAAQ6uC,QAAQ,wBAAwB3wC,KAAK,iBACvDkD,KAAO8vC,IAAI9vC,KACXszC,UACJ,KAAK,GAAI77C,KAAK+L,OAAMya,QAAQuB,KACtBhc,MAAMya,QAAQuB,KAAK/nB,GAAGuI,OAASA,MACjCszC,QAAQp4C,KAAKsI,MAAMya,QAAQuB,KAAK/nB,GAGpC+L,OAAMya,QAAQuB,KAAO8zB,aAS/Bn6C,QAAQC,OAAO,eACZsI,UAAU,YAAa,WACtB,OACEsD,SAAU,IACV5K,YAAa,wBACbmJ,KAAM,SAAUC,MAAOvP,QAASsS,OAC9B/C,MAAMswC,gBAAkB,SAAU3hC,OAChC3O,MAAMuwC,eAAe74C,UAEvBsI,MAAMwwC,mBAAqB,SAAU7hC,OACnC3O,MAAMuwC,eAAelhC,OAAOV,MAAO,QAQ7ChZ,QAAQC,OAAO,eAAesI,UAC5B,cACA,SAAUrG,MAAOoM,QAASC,SAAUN,KAAM5S,GACxC,OACE4F,YAAa,wBACboJ,OACEya,QAAW,KAEbjZ,SAAU,IACVzB,KAAM,SAAUC,MAAOvP,QAASsS,OAyD9B,QAAS0tC,eACPC,YAAY,GACR1wC,MAAM2wC,KACR3wC,MAAM2wC,IAAIC,QAEZ5wC,MAAMuZ,SACNm3B,YAAY,GAGd,QAASG,eACP7/C,EAAE0D,KAAK,wCAA0CsL,MAAMuZ,MAAMu3B,OAAS,wBAA0B7sC,QAAQ8sC,WAAWC,gBACjHx+C,KAAM,MACNyC,QAAS,SAAUqE,MACjB0G,MAAMuZ,MAAM0U,OAAS,EACrBgjB,UAAU10B,IAAI,yCAepB,QAASm0B,aAAY/tC,UACnB,MAAiB,KAAbA,UAA+B,MAAbA,aACpBuuC,YAAWt3B,aAGc,IAAvB5Z,MAAMmxC,cAAsB99C,KAAK+9C,IAAIzuC,SAAW3C,MAAMmxC,cAAgB,KACxEE,YAAY3+C,IAAI,QAASW,KAAKC,MAAMqP,UAAY;AAChD3C,MAAMmxC,aAAexuC,SACrBuuC,WAAWnC,SAIf,QAASuC,wBACPD,YAAYpoC,SAAS,8BAEdpR,OAAME,SAASnD,QAAQoD,OAAO,oBACrCH,OACElD,IAAK,wCAA0CqL,MAAMuZ,MAAMu3B,OAAS,iBACpEn1C,OAAQ,MACRoK,QACEwrC,QAASttC,QAAQ8sC,WAAWC,gBAE9BQ,YAAY,IACXv8C,QAAQ,SAAUqE,MACA,YAAfA,KAAKukB,OAAsC,YAAfvkB,KAAKukB,OAAsC,eAAfvkB,KAAKukB,OAC/D7d,MAAMuZ,MAAM0U,OAAS,EACjB30B,KAAKqJ,SAAW,GAClB+tC,YAAYp3C,KAAKqJ,UACjBuB,SAASotC,qBAAsB,MAE/BptC,SAASotC,qBAAsB,OAGjCZ,YAAY,GACO,aAAfp3C,KAAKukB,QACP7d,MAAMuZ,MAAM0U,OAAS,GAEJ,WAAf30B,KAAKukB,OAAqC,cAAfvkB,KAAKukB,QAClC7d,MAAMuZ,MAAM0U,OAAS,EACrBgjB,UAAU10B,IAAI,0CAGjB9mB,MAAM,SAAU6D,MACjBtI,EAAE,iBAAiB8rB,SAAS5d,MAAM,KAAM2d,YAhI5Cpa,QAAQC,IAAI,qBACZD,QAAQC,IAAI1C,MAAMyxC,UAClBzxC,MAAMiB,OAAO,gBAAiB,WACxBjB,MAAMya,QAAQlB,QAChBvZ,MAAM0xC,SAAW9tC,KAAK+tC,WAAW,mBAAqB3xC,MAAMya,QAAQlB,OACpE1hB,OACE8D,OAAQ,MACRhH,IAAK,qBAAuBqL,MAAMya,QAAQlB,MAAQ,MACjDtkB,QAAQ,SAAUqE,MACnBmJ,QAAQC,IAAI,0BACZD,QAAQC,IAAIpJ,MACZ0G,MAAMuZ,MAAQjgB,KACd2K,QAAQ2tC,gBAAgBt4C,KAAKxI,SAKnCkP,MAAMiB,OAAO,QAAS,aAItB,IAAIiwC,YAAazgD,QAAQwC,KAAK,gBAC1Bo+C,YAAc5gD,QAAQwC,KAAK,oBAC3Bg+C,UAAYxgD,QAAQwC,KAAK,mBAC7B+M,OAAMmxC,aAAe,EAErBnxC,MAAMo+B,SAAW,WACf37B,QAAQC,IAAI,cACZuB,QAAQ4tC,YAAYphD,QAAQwC,KAAK,oBAAoB,IACnDo2C,UAAW,SAAU8D,SACnBntC,MAAMwF,OAAO,WACX/C,QAAQC,IAAI,+BACZD,QAAQC,IAAIyqC,SACZntC,MAAMya,QAAQlB,MAAQ4zB,WAG1B7D,QAAS,SAAUhwC,MACjBmJ,QAAQC,IAAI,6BACZD,QAAQC,IAAIpJ,OAEdkwC,WAAY,SAAUlwC,MACpBmJ,QAAQC,IAAI,gCACZD,QAAQC,IAAIpJ,UAKlB0G,MAAM8xC,WAAa,SAAUC,YACvBA,YACF/gD,EAAE,wBAAwBurB,IAAI,IAC9Bvc,MAAMya,QAAQlB,MAAQ,MAEtBvoB,EAAE,8BAA8BghD,MAAM,SAuB1ChyC,MAAM4wC,MAAQ,WACZ,MAAI5wC,OAAMiyC,aACRpB,mBAGAJ,eAoDJ,IAAIyB,kBAAkB,CACtBlyC,OAAMiB,OAAO,QAAS,WAChBjB,MAAMuZ,OAASvZ,MAAMuZ,MAAMu3B,SAAWoB,kBACxCZ,uBACAY,iBAAkB,SAa9Bv8C,QAAQC,OAAO,eACZsI,UAAU,aAAc,SAAU1D,WACjC,OACE2N,SAAU,sEACV3G,SAAU,IACVzB,KAAM,SAAkBC,MAAOvP,QAASsS,OACtC/C,MAAMmyC,SAAW33C,UAAUmf,cAAc5W,MAAMqvC,aAOvDz8C,QAAQC,OAAO,eACZsI,UAAU,aAAc,SAAU0Z,UACjC,OACEhhB,YAAa,0BACb4K,SAAU,IACVxB,OACEya,QAAS,KAEX1a,KAAM,SAAkBC,MAAOvP,QAASsS,OACtC/C,MAAMqyC,YAAc,WAClBryC,MAAMya,QAAQlB,MAAQ,MAGxBvZ,MAAM6xC,YAAc,WAClBj6B,SAAS4B,oBAAoBhgB,KAC3B,SAAUvE,SACRwN,QAAQC,IAAIzN,SACZ+K,MAAMya,QAAQlB,MAAQtkB,QAAQ8N,MAAMjS,IAEtC6E,QAAQ28C,KACR,SAAU3vC,UACRF,QAAQC,IAAIC,UACZ3C,MAAMuyC,eAAiB5vC,YAK7B3C,MAAMwyC,eAAiB,WACrB56B,SAAS6B,wBAAwBzZ,MAAMya,QAAQlB,OAAOjT,OAAO9M,KAC3D,SAAU4C,SACRqG,QAAQC,IAAI,2BACZD,QAAQC,IAAItG,UAGd,SAAUd,QACRmH,QAAQC,IAAI,mCAU1B/M,QAAQC,OAAO,eACZsI,UAAU,mBAAoB,SAAUgG,SAAUuuC,SAAUv9B,UAC3D,OACE1T,SAAU,IACV2W,SAAS,EACTu6B,YAAY,EACZ77C,WAAYlB,QAAQ28C,KACpBtyC,OACEqN,MAAO,SACPslC,OAAQ,SACRC,OAAQ,WAEV7yC,KAAM,SAAU5B,OAAQ1N,QAASsS,OAE/B5E,OAAO00C,WAAa,SAAUlkC,OAC5BxQ,OAAOy0C,OAAOjkC,QAGhBxQ,OAAO20C,SAAW,SAAUnkC,OAC1BxQ,OAAOwQ,MAAQA,MAEX5L,MAAM4L,QACRxQ,OAAOw0C,OAASxvC,SAASwL,MAAO,MAIhC5L,MAAM4L,OACRxQ,OAAO8C,OAAO,SAAU,SAAShD,OAC/BE,OAAOwQ,MAAQxL,SAASlF,MAAO,MAInCE,OAAOqI,MAAQ,SAASmI,OACtB,GAAIpO,WAAYpC,OAAOkP,MAAMsB,OAAO5L,MAAMgwC,UAI1C,OAH0B,kBAAhB,aACRxyC,UAAYA,aAEPA,YAIX4H,SAAU,+OAMhBxS,QAAQC,OAAO,eACZsI,UAAU,eAAgB,SAAUgG,SAAUuuC,SAAUv9B,UACvD,OACE1T,SAAU,IACV2W,SAAS,EACT5W,QAAS,UACTmxC,YAAY,EACZ77C,WAAY,SAAUsH,OAAQiE,SAAU4wC,OAAQ5qC,WAC9CjK,OAAOxE,QAAUyO,UAAU9L,IAAI02C,OAAOr5C,SACtCwE,OAAOwa,YAAcq6B,OAAOr6B,aAAe,IAE7C5Y,KAAM,SAAU5B,OAAQ1N,QAASsS,MAAOoD,QAASusC,YAwF/C,QAAStkC,WAAUI,OACjB,GAAIykC,gBACJA,cAAalwC,MAAMmwC,aAAe,UAAY1kC,MAC9CrQ,OAAgB,QAAEiP,QAAQ6lC,cAAcz5C,KAAK,SAAUwF,SAElDA,QAAQ7K,OAAS,EAClBg/C,UAAU9lC,MAAQrO,QAAQ6xB,MAAM,EAAG,GAEnCsiB,UAAU9lC,MAAQrO,QAEpBo0C,UAAY,OAIhB,QAASC,cACFC,iBACHA,gBAAiB,EACjBH,UAAUxkC,MAAQ,EAClB8jC,SAASc,MAAMC,OAAQ/iD,QAAQwS,SAAUxS,UAE3CgjD,YAGF,QAASC,SACPvtC,QAAQvF,UACRuyC,UAAU9lC,SACV8lC,UAAUxkC,MAAQ,EAClB8jC,SAASkB,MAAMH,QAAQrpC,QAAQ,WAC7BmpC,gBAAiB,IAIrB,QAASG,aACP,GACIG,SADe99C,OAAO+9C,iBAAiBpjD,QAAQ,IACtCA,QAAQmjD,SAErBA,QAAOhJ,KAAO,OACdgJ,OAAOE,MAAQ,OACfF,OAAOlJ,IAAMj6C,QAAQk6C,cACrBiJ,OAAO/I,SAAWp6C,QAAQq6C,aAE1Bn1C,QAAQmgB,QAAQ89B,OAAQ,SAAU31C,MAAOif,MAClC62B,MAAM91C,QAAUtI,QAAQyQ,SAASnI,SACpCA,OAAgB,MAElBu1C,OAAO,GAAGta,MAAMhc,KAAOjf,MACvBu1C,OAAO9gD,IAAI,UAAW,OApI1B,GAAI4gD,iBAAiB,EACjBU,QAAUvjD,QAAQwC,KAAK,SACvBmgD,UAAY,IAEhBjtC,SAAQvF,QAAU,WAChB,GAAIuF,QAAQrF,WAAY,CACtB,GAAIP,WAAY4F,QAAQrF,WAAWiC,MAAMgwC,UACf,mBAAhB,aACRxyC,UAAYA,aAEd9P,QAAQwC,KAAK,SAASspB,IAAIhc,WAC1ByzC,QAAQrgC,KAAK,WAAY,cAI7BxV,OAAO81C,SAAW,SAAS94C,GACzB64C,QAAQE,WAAW,YACnBF,QAAQ,GAAGpH,SAGboH,QAAQ9qC,GAAG,oBAAqB,WAC9B,GAAiClU,SAA7Bg/C,QAAQrgC,KAAK,YAAjB,CAGA0/B,YACA,IAAIp1C,OAAQ+1C,QAAQz3B,KAChBte,SACEm1C,WACFlvC,SAASsF,OAAO4pC,WAElBA,UAAYlvC,SAAS,WAAYkK,UAAUnQ,QAAS,QAIxD,IAAIk1C,WAAYh1C,OAAOg2C,MACvBhB,WAAU9lC,SACV8lC,UAAUxkC,MAAQ,EAClBwkC,UAAUP,OAAS,SAASjkC,OAC1BxI,QAAQ7E,cAAc6xC,UAAU9lC,MAAMsB,QACtC+kC,QAGF,IAAIF,QAAS79C,QAAQlF,QAAQ6B,SAASC,cAAc,qBACpDihD,QAAO7/B,MACLtG,MAAS,QACTulC,OAAU,gBACVjkC,MAAS,QACTylC,aAAcrxC,MAAMgwC,YAEtBL,WAAWS,UAAW,SAAStX,OAAQ2X,OAAOtgD,OAAO2oC,SACrD3mB,SAASs+B,QAAQL,WAEjB1iD,QAAQwC,KAAK,SAASiW,GAAG,QAAS,SAAS/N,GACzC,OAAOA,EAAEk5C,OACP,IAAK,IACmB,KAAlBL,QAAQz3B,MACVm3B,QAEAM,QAAQz3B,IAAI,GAEd,MACF,KAAK,IACHpe,OAAOqH,OAAO,WACZ2tC,UAAUxkC,OAASwkC,UAAUxkC,MAAQ,GAAKwkC,UAAU9lC,MAAMlZ,QAE5D,MACF,KAAK,IACHgK,OAAOqH,OAAO,WACT2tC,UAAUxkC,MACXwkC,UAAUxkC,MAAQwkC,UAAUxkC,MAAQ,EAEpCwkC,UAAUxkC,MAAQwkC,UAAU9lC,MAAMlZ,OAAS,GAG/C,MACF,KAAK,IACCg/C,UAAUxkC,OAAS,IACrBxI,QAAQ7E,cAAc6xC,UAAU9lC,MAAM8lC,UAAUxkC,QAChD+kC,QAEF,MACF,SACE,WAsDR98C,YAAa,8BAMnBjB,QAAQC,OAAO,eACZiB,WAAW,sBAAuB,SAAUsH,OAAQkL,eAAgBzM,QACnEuB,OAAOvB,OAASA,SAKpBjH,QAAQC,OAAO,eACZiB,WAAW,qBAAsB,SAAUsH,OAAQkL,eAAgBtT,EAAG8W,eAAgB4N,SACrFtc,OAAOsc,QAAUA,QACjBtc,OAAOm2C,SAEPznC,eAAe/T,IAAI,OAAOsU,SAASlT,QAASugB,QAAQ3pB,KAAK0I,KAAK,SAAUF,MACtE6E,OAAOo2C,UAAYj7C,IAEnB,IAAIk7C,SAAUz+C,EAAE0+C,OAAO1+C,EAAEq9B,MAAM95B,KAAM,SACjCsyC,KAAO,SAAUtyC,MACnB6E,OAAOm2C,MAAMh7C,KAAKxI,IAAMwI,KAG1B,KAAK,GAAIrF,KAAKugD,SACZ3nC,eAAegS,IAAI,SAAU21B,QAAQvgD,IAAIqI,MAAM9C,KAAKoyC,UAQ5Dj2C,QAAQC,OAAO,eACZiB,WAAW,sBAAuB,SAAUsH,OAAQlI,QAEnD,GAAIy+C,OAAQ,WACVv2C,OAAOw2C,cAAgBx2C,OAAOy2C,YAAcz2C,OAAO02C,eAAiB12C,OAAOy2C,SAAWz2C,OAAO02C,eAC7F12C,OAAO22C,mBAAqB32C,OAAO02C,eAAiB12C,OAAOy2C,UAAYz2C,OAAO02C,cAAgB12C,OAAOy2C,SACrGz2C,OAAO42C,WAAa52C,OAAOmtC,gBAAgBnxC,OAASgE,OAAOmtC,gBAAgBnxC,MAAMhG,OAAS,GAAKgK,OAAOmtC,gBAAgBnxC,MAAMhG,QAAU,IAEtIgK,OAAO62C,qBAAuB72C,OAAOw2C,eAAiBx2C,OAAO22C,oBAAsB32C,OAAO42C,WAO5F52C,QAAOy2C,SAAWz2C,OAAOmtC,gBAAgB2J,UAAYh/C,OAAOkI,OAAOmtC,gBAAgB2J,WAAa,KAChG92C,OAAO8C,OAAO,WAAY,WACpB9C,OAAOy2C,UAETz2C,OAAOmtC,gBAAgB2J,UAAY92C,OAAOy2C,SAASpgD,SAEnD2J,OAAO02C,cAAgB12C,OAAOy2C,SAAS/Y,QAAQ/oB,KAAKoiC,KAAM,KAE1D/2C,OAAOmtC,gBAAgB2J,UAAY,OAIvC92C,OAAO02C,cAAgB12C,OAAOmtC,gBAAgB6J,gBAAkBl/C,OAAOkI,OAAOmtC,gBAAgB6J,iBAAmB,KACjHh3C,OAAO8C,OAAO,gBAAiB,WACzB9C,OAAO02C,cAET12C,OAAOmtC,gBAAgB6J,gBAAkBh3C,OAAO02C,cAAcrgD,SAE9D2J,OAAOmtC,gBAAgB6J,gBAAkB,OAK7Ch3C,OAAOi3C,sBAAuB,EAC9Bj3C,OAAO8C,OAAO,kBAAmB,SAAUE,SAAUmgB,UAC9C3rB,QAAQ6N,OAAOrC,SAAUmgB,YAC5BnjB,OAAOi3C,sBAAuB,EAG9BV,WAGD,GAGHA,QAKAv2C,OAAOk3C,oBAAsB,WAEvBl3C,OAAOm3C,QAAQC,iBAAmBp3C,OAAOi3C,sBAAwBj3C,OAAO62C,sBAE1E72C,OAAOm3C,QAAQE,qBAAqBr3C,OAAOmtC,iBACxC9xC,KAAK,SAAUi8C,oBACdt3C,OAAOmtC,gBAAkBmK,mBACzBt3C,OAAOi3C,sBAAuB,IAE/Bl+B,MAAM,SAAUzhB,OACfgN,QAAQC,IAAI,wBAAyBjN,UAU7C0I,OAAOu3C,sBAAwB,WAEzBv3C,OAAOm3C,QAAQC,iBAEjBp3C,OAAOm3C,QAAQK,uBAAuBx3C,OAAOmtC,iBAC1Cp0B,MAAM,SAAUzhB,OACfgN,QAAQC,IAAI,0BAA2BjN,YAWnDE,QAAQC,OAAO,eACZiB,WAAW,uBAAwB,SAAU0D,GAAI0J,QAAS9F,OAAQ3D,UAC/Do7C,oBAAqBr0B,eAAgBxrB,EAAGE,QAE1CgO,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,gBAGlDsZ,eAAenX,0BAA0B5Q,KAAK,SAAUM,MAClDA,KAAK+7C,eACP13C,OAAOo3C,iBAAkB,GAI3BK,oBAAoBxoC,UAAU5T,KAAK,SAAUs8C,kBAE3C,GAAIC,kBACJhgD,GAAE62B,KAAKkpB,iBAAkB,SAAUxK,gBAAiBr3C,IAC7C6F,KAAK+7C,cAAgB5/C,OAAOq1C,gBAAgB2J,WAAWlqB,QAAQ90B,WAClE8/C,eAAer+C,KAAKzD,KAGxB8B,EAAE62B,KAAKmpB,eAAgB,SAAU9hD,GAC/B6hD,iBAAiBzmC,OAAOpb,EAAG,KAG7BkK,OAAO23C,iBAAmBA,qBAS9B33C,OAAOs3C,mBAAqB,WAE1B,GAAInK,kBACF2J,UAAW,KACXE,gBAAiB,KAKnB,OAFAh3C,QAAO23C,iBAAiB3yB,QAAQmoB,iBAEzBA,iBAUTntC,OAAOq3C,qBAAuB,SAAUlK,iBAEtC,GAAI0K,WAAYz7C,GAAGK,QACfq7C,YAAcD,UAAU35C,OAyB5B,OAvBI8B,QAAOo3C,gBACL,MAAQjK,iBAEVA,gBAAgBtqB,MAAMxnB,KAAK,SAAU08C,wBACnCF,UAAU55C,QAAQ85C,0BAIpB/3C,OAAO23C,iBAAiBv8C,KAAK+xC,iBAC1B9xC,KAAK,SAAUi8C,oBAEd,GAAIxhD,GAAIkK,OAAO23C,iBAAiBt6C,QAAQ8vC,gBACxCntC,QAAO23C,iBAAiB7hD,GAAKwhD,mBAC7BO,UAAU55C,QAAQq5C,sBAEnBv+B,MAAM,SAAUzhB,OACfugD,UAAU16C,OAAO7F,SAIvBugD,UAAU16C,OAAO,6BAGZ26C,aAUT93C,OAAOw3C,uBAAyB,SAAUrK,iBAExC,GAAI6K,aAAc57C,GAAGK,QACjBsgC,cAAgBib,YAAY95C,QAC5B+5C,eAAiB,SAAUznC,OACzBxQ,OAAO23C,iBAAiBzmC,OAAOV,MAAO,GACtCwnC,YAAY/5C,UAGlB,IAAI+B,OAAOo3C,gBAAiB,CAE1B,GAAIthD,GAAIkK,OAAO23C,iBAAiBt6C,QAAQ8vC,gBACpCr3C,IAAI,EAEF8B,EAAEiO,WAAWsnC,gBAAgB72C,QAE/B62C,gBAAgB72C,SACb+E,KAAK,WACJ48C,eAAeniD,KAEhBijB,MAAM,SAAUzhB,OACf0gD,YAAY76C,OAAO7F,SAIvB2gD,eAAeniD,GAGjBkiD,YAAY76C,OAAO,wEAGrB66C,aAAY76C,OAAO,mEAGrB,OAAO4/B,kBAcbvlC,QAAQC,OAAO,eACZiB,WAAW,yBAA0B,SAAUsH,OAAQk4C,SAAUpgD,OAAQ2/C,oBAAqB5/C,OAAQD,GAErG,GAAIugD,cAAe,SAAUxlD,IAC3B,MAAO,8BAAgCA,IAErCylD,8BAAgC,SAAUT,kBAC5C,GAAI9yB,KAAM/sB,QACVkI,QAAO23C,iBAAmB//C,EAAEuU,OAAOwrC,iBAAkB,SAAUxK,iBAE7D,IAAK+K,SAASC,aAAahL,gBAAgBx6C,MACrCmF,OAAOq1C,gBAAgB2J,WAAWlxB,SAASf,MAC3C/sB,OAAOq1C,gBAAgB6J,iBAAiBpqB,QAAQ/H,KACpD,OAAO,IAMb4yB,qBAAoBxoC,UAAU5T,KAAK,SAAUs8C,kBAC3CS,8BAA8BT,oBAGhC33C,OAAOq4C,uBAAyB,SAAUlL,iBAExC,GAAImL,WAAYzgD,OAAOsgD,aAAahL,gBAAgBx6C,IACpDulD,UAASI,WAAW,GAClBC,QAASzgD,OAAOq1C,gBAAgB6J,iBAAiBriC,KAAKoiC,KAAM,IAAIyB,KAAK1gD,SAAU,QAC/E4R,KAAM,aAIR0uC,8BAA8Bp4C,OAAO23C,qBAO3CngD,QAAQC,OAAO,eACZiB,WAAW,kBAAmB,SAC7BsH,OAAQuI,aAAc7O,MAAOoM,QAC7BwC,UAAWvC,SAAU8oC,UAAW93B,SAAU3a,GAAI4O,OAC9CnY,EAAG+E,EAAGyE,UAAWvE,OAAQE,SAAUC,MAAOF,QAC1Cu1C,aAAcmL,kBAAmB/pC,eAAgBgqC,YACjDC,uBAAwB3M,MAAO4M,2BAE/B,GAAIC,UAAW,GAAI7gD,UAAS8gD,QAC5BD,UAASE,aAAa,QAAS,SAAU/7C,GAAKgD,OAAOutC,gBACrDsL,SAASE,aAAa,SAAU,SAAU/7C,GAAKgD,OAAOutC,eAEtD,IAAIyL,UAAY,uDACZC,WAAa,eAEbC,mBAAqB,SAAU/9C,MACjC2K,QAAQwW,QAAUtc,OAAOsc,QAAUnhB,KAEnC6E,OAAOm5C,mBAAqB3hD,QAAQ0L,KAAK/H,MAEzCu9C,YAAYU,YACTC,UAAU,WACTr5C,OAAOs5C,mBAAoB,IAE5BC,aAAa,WACZv5C,OAAOs5C,mBAAoB,IAI/BX,uBACGa,0BACEn+C,KAAK,SAAUo+C,UAEd,GAEIluC,aACAmuC,YAHAC,aAAeF,SAASE,eACxBC,UAAYH,SAASG,WAoGzB,OAhGAA,WAAUC,QAAQ,WAChBD,UAAU92C,OAAO,SAAU9F,GACzB,GAAgB,gBAAZA,EAAEic,MAAyB,CAG7B,GAAI6gC,YAAaliD,EAAE2zB,OAAOquB,UAAW,SAAUG,SAC7C,OAAQA,QAAQC,YACf,EAEH,IAAIzuC,aAAeuuC,WAAWn+C,KAAKhJ,KAAO4Y,YAAY5Y,GAAI,CAGpD+mD,aACFA,YAAYpjD,QAGd,IAAI2jD,KAAM,MACEH,WAAWn+C,KAAKiQ,YAClB,WACA9T,OAAOgiD,WAAWE,WAAW3jD,OAAO,sBACpC,MACN2J,QAAOk6C,iBACTD,KAAO,8DAETA,KAAO,yDAGTP,YAAc,GAAI3hD,UACdiE,MAAO,sBACPye,KAAMw/B,IACN5lD,KAAM,QACN8lD,aAAa,EACb1+B,MAAM,EACNtQ,SACEA,SAAS,EACTivC,UACE3/B,KAAM,uBACN3P,SAAU,cACVjO,MAAO,SAAUw9C,QACfA,OAAOF,aAAc,EACrBE,OAAO/jD,SACPsiD,0BAA0B3tC,KAAKjL,OAAQA,OAAOsc,YAGhDxR,SAAU,UAGdsvC,SACEE,cAAc,EACdC,SAAS,WASrBZ,aAAa72C,OAAO,WAGlB9C,OAAOw6C,YACL5iD,EAAEsb,MAAMymC,cAELnuB,QAAQ,SAAU7vB,MACjB,MAAOA,MAAKhJ,KAIb6N,IAAI,SAAUi6C,OACb,GAAIC,aAAcD,MAAM,EAOxB,OANAC,aAAYhqC,MAAQ+pC,MAAMzkD,OAEtBuV,aAAemvC,YAAY/nD,KAAO4Y,YAAY5Y,KAChD+nD,YAAY9uC,YAAc,OAGrB8uC,cAGRnvB,OAAO,SAAU5vB,MAChB,MAA4B,QAArBA,KAAKiQ,YAAwB,GAAKjQ,KAAKiQ,cAI/C9L,UAKP25C,SAASkB,6BACNt/C,KAAK,SAAUM,MACd4P,YAAc5P,OAIX89C,YAMXv/B,WAAa,WACf,MAAOxL,gBAAegS,IAAI,UAAWnY,aAAa5V,IAC7CwL,MACA9C,KAAK69C,qBAGR0B,oBAAsB,SAAUz/C,MAClCtI,EAAEomD,YACCx6B,YAAY,eACZ3T,SAAS,cACTmN,KAAK,oDACO,MAAX6X,SACF9vB,OAAO66C,OAAS1/C,MAElB6E,OAAO86C,oBAAoB39C,UAMzB49C,sBAAwB,SAAUtN,MAEpCgL,kBAAkBzc,QAAQh8B,OAAOsc,QAAStc,OAAOk6C,gBAEjDrnD,EAAEomD,YAAYhhC,KAAK,iDACnB0D,WAAW,WACP9oB,EAAEomD,YAAYhhC,KAAK+gC,WAClB,MACLlzC,QAAQwW,QAAUtc,OAAOsc,QAAUmxB,KACnCztC,OAAOm5C,mBAAqB3hD,QAAQ0L,KAAKuqC,MACzCztC,OAAOk6C,gBAAiB,EACxBl6C,OAAOg7C,cAAe,EACtBh7C,OAAO66C,OAAS,KAEQ,QAApBtyC,aAAa5V,IACf2V,UAAUoB,KAAK,iBAAmB1J,OAAOsc,QAAQ3pB,GAAK,IAAM4V,aAAailC,aAG3EllC,UAAUT,OAAO,cAAe,MAChC7H,OAAO86C,oBAAoB78C,QAAQwvC,MAGrCztC,QAAOi7C,aAAe,UACtBj7C,OAAOskC,yBAA2BjoC,UAAUioC,yBAC5CtkC,OAAOoQ,KAAO,OACdpQ,OAAOk7C,oBACLC,SAAS,GAGXn7C,OAAO8C,OAAO,gBAAiB,WAC7BgD,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,eAAiB9J,OAAOsc,SAAWzpB,EAAE,SAAWmN,OAAOsc,QAAQtgB,MAAQ,WAAWye,UAGtIza,OAAO86C,oBAAsB1+C,GAAGK,QAEhCuD,OAAOo7C,mBAAqB,WAI1B,MAAIp7C,QAAOk6C,eACFl6C,OAAOutC,cAIPnxC,GAAG5D,KAAKwH,OAAOsc,UAI1Btc,OAAOutC,YAAc,WACnB,MAAIvtC,QAAOk7C,mBAAmBG,UACrBr7C,OAAO86C,oBAAoB39C,UAGpCtK,EAAEomD,YACCx6B,YAAY,cACZ3T,SAAS,eACTmN,KAAK,8DAEgB,QAApB1P,aAAa5V,GACfqN,OAAOs7C,4BAEP5sC,eAAegS,IAAI,UAAWnY,aAAa5V,IAAIwL,MAC5C9C,KAAK,SAAUF,MACVA,KAAKogD,eACPv7C,OAAOsc,QAAQi/B,eACfzjD,OAAOqD,KAAKogD,eAAiBzjD,OAAOkI,OAAOsc,QAAQi/B,gBACnDv7C,OAAO86C,oBAAoB39C,SAC3B6N,OAAOC,MACLxS,YAAa,+CACbC,WAAY,6BACZmJ,MAAO7B,OACP/B,SACEu9C,cAAe,WAAc,MAAOx7C,QAAOsc,SAC3Cm/B,gBAAiB,WAAc,MAAOtgD,WAI1C6E,OAAOs7C,8BAGVviC,MAAM6hC,qBAGJ56C,OAAO86C,oBAAoB58C,UAGpC8B,OAAOs7C,0BAA4B,WACH,cAA1Bt7C,OAAOsc,QAAQwT,QACf9vB,OAAOsc,QAAQwa,oBAAsBz6B,UAAUm5B,yBACjDx1B,OAAOsc,QAAQ0c,KAAOlzB,QAAQjO,OAAOmI,OAAOsc,QAAQtgB,MAAO,IAG7D,IAAI4L,UASJ,OARwB,QAApBW,aAAa5V,KACfiV,OAAgB,QAAI5H,OAAOsc,QAAQwa,mBAGrC92B,OAAOsc,QAAQphB,KAAK0M,QACjBvM,KAAK0/C,uBACLhiC,MAAM6hC,qBAEF56C,OAAO86C,oBAAoB58C,SAIpC8B,OAAOk6C,eAAqC,QAApB3xC,aAAa5V,GACrCqN,OAAO8C,OAAO,WACZ,OAAQtL,QAAQ6N,OAAOrF,OAAOsc,QAAStc,OAAOm5C,qBAC7C,SAAUxhB,SACX33B,OAAOk6C,eAAiBviB,UAG1B33B,OAAO8C,OAAO,iBAAkB,WAC1B9C,OAAOk6C,eACTp0C,QAAQ+C,eAAiB,WACvB,MAAO,sDAGT/C,QAAQ+C,eAAiB,eAI7B7I,OAAO07C,kBAAoB,WACzB,MAAOxhC,eAGTla,OAAO27C,gBAAkB,WAEvB51C,SAAS,WACPD,QAAQ81C,QAAQC,QACf,MAGL,IAAIC,YAAa,WACS,QAApBvzC,aAAa5V,IACfqN,OAAOg7C,cAAe,EACtBh7C,OAAOsc,QAAU5N,eAAeqtC,OAAO,WACvC/7C,OAAOsc,QAA2B,kBAAI/T,aAAailC,aAEnDtzB,aAIJ4hC,gBAKJtkD,QAAQC,OAAO,eACZiB,WAAW,kBAAmB,SAC7BsH,OAAQtG,MAAOqM,SAAUuC,UAAWxC,QAAS1J,GAAIvJ,EAAGwJ,UAClD6iB,oBAEFlf,OAAOswB,eACPpR,mBAAmBC,gBACjB/O,KAAM,EACN4rC,QAAS3/C,UAAUm5B,yBAElBn6B,KAAK,SAAUF,MACd6E,OAAOswB,YAAcn1B,OAGzB2K,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,aAElD9J,OAAOssB,WAAahkB,UAAUT,SAASuI,MAAQ,IAC/CpQ,OAAOi8C,SAAU,EACjBj8C,OAAO6H,OAASS,UAAUT,SAASA,OACnC7H,OAAOk8C,YAEPl8C,OAAOusB,SAAW,WAChBrN,mBAAmBC,gBAAgB/O,KAAMpQ,OAAOssB,aAAa,IAG/DtsB,OAAO07C,kBAAoB,SAAUvgD,MACnC,GAAIrF,EACJ,KAAKA,EAAI,EAAGA,EAAIkK,OAAOswB,YAAYv0B,QAAQ/F,QACrCgK,OAAOswB,YAAYv0B,QAAQjG,GAAGnD,KAAOwI,KAAKmhB,QAAQ3pB,GADLmD,KAMnD,IAAK,GAAIkZ,SAAS7T,MAAKuJ,SACrB1E,OAAOswB,YAAYv0B,QAAQjG,GAAGkZ,OAAS7T,KAAKuJ,SAASsK,MAGvD,OAAO5S,IAAG5D,QAGZwH,OAAO27C,gBAAkB,WACvB51C,SAAS,WACPmZ,mBAAmBC,iBACnBtsB,EAAE,wBAAwBghD,MAAM,SAC/B,OAGLhhD,EAAE,QAAQkY,GAAG,oBAAqB,kBAAmB,SAAU/N,GAC7DgD,OAAOiB,cAIVlB,UAAU,kBACT,WACE,OACE6B,KAAM,SAAUC,MAAOvP,QAASkjB,MAC9B,GAAIykC,KAAMzkC,KAAK2mC,gBAAkB,gBAC7BC,YAAc5mC,KAAK6mC,cACvB/pD,SAAQyK,KAAK,QAAS,WAChBpF,OAAOwT,QAAQ8uC,MACjBp4C,MAAMy6C,MAAMF,oBAU1B5kD,QAAQC,OAAO,eACZiB,WAAW,sBAAuB,SAAUsH,OAAQtG,MAAOsR,OAAQlF,QAAShO,OAChC8gD,0BAA2B2D,wBAC3BlgD,WAC3C2D,OAAOyT,eAAiB3b,OAAOyb,GAAGlX,UAAUmX,mBAAmBnd,OAAO,KAEtE2J,OAAOw8C,kBAAoB,SAAUC,WACnC,MAAOzxC,QAAOC,MACZxS,YAAa,yCACbC,WAAY,wBACZmJ,MAAO7B,OACP/B,SACEw+C,UAAW,WACT,MAAOA,gBAMfz8C,OAAO08C,aAAe,SAAUpgC,SAC9B,MAAOtR,QAAOC,MACZxS,YAAa,wCACbC,WAAY,mBACZmJ,MAAO7B,OACP/B,SACEqe,QAAS,WAAc,MAAOA,cAKpCtc,OAAO28C,kBAAoB,SAAUrgC,SACnC,MAAOtR,QAAOC,MACZxS,YAAa,0CACbC,WAAY,wBACZmJ,MAAO7B,OACP/B,SACEqe,QAAS,WAAc,MAAOA,cAKpCtc,OAAO48C,eAAiB,SAAUtgC,SAChC,MAAOtR,QAAOC,MACZxS,YAAa,qCACbC,WAAY,qBACZmJ,MAAO7B,OACP/B,SACEqe,QAAS,WAAc,MAAOA,cAKpCtc,OAAOq0C,eAAiB,SAAU/3B,SAEhC,MAAOtR,QAAOC,MACZxS,YAAa,qCACbC,WAAY,qBACZmJ,MAAO7B,OACP/B,SACEqe,QAAS,WAAc,MAAOA,cAKpCtc,OAAO68C,oBAAsB,SAAUvgC,SACrCs8B,0BAA0B3tC,KAAKjL,OAAQsc,UAGzCtc,OAAO88C,kBAAoB,SAAUxgC,SACnCigC,wBAAwBtxC,KAAKjL,OAAQsc,UAGvCtc,OAAO+8C,iBAAmB,SAAUzgC,SAClC,MAAOtR,QAAOC,MACZxS,YAAa,uCACbC,WAAY,uBACZmJ,MAAO7B,OACP1C,KAAM,KACNW,SACEqe,QAAS,WAAc,MAAOA,cAKpCtc,OAAOg9C,UAAY,SAAU1gC,SAC3B,MAAKA,UAAYA,QAAQrgB,UAEdnE,OAAOwkB,QAAQrgB,WAAanE,SAC9B,YAEA,YAJA,iBAYfN,QAAQC,OAAO,eACZiB,WAAW,oBAAqB,SAC/BsH,OAAQuI,aAAc7O,MAAOoM,QAC7BwC,UAAWvC,SAAUgR,SAAU3a,GAAI4O,OACnCpT,EAAGyE,UAAW4gD,wBAAyBC,gBA8EvC,QAAShiD,QAEP1D,QAAQlF,QAAQ,aAAa2lB,KAAK,8DAClCjY,OAAO1E,cAAcJ,KAAK8E,OAAO1E,eAAeD,KAAK,SAAUC,eAC7D9D,QAAQlF,QAAQ,aAAawY,SAAS,eAAe2T,YAAY,cACjEjnB,QAAQlF,QAAQ,aAAa2lB,KAAK,iEAClCjY,OAAOm9C,OAAQ,GACd,SAASnmD,KACVQ,QAAQlF,QAAQ,aAAawY,SAAS,cAAc2T,YAAY,eAChEjnB,QAAQlF,QAAQ,aAAa2lB,KAAK,+DAItC,QAAStD,OACP3U,OAAO1E,cAAc/B,MACnBuB,YAAa,KACbiB,QAASiE,OAAO+vB,UAChB4B,MACEA,KAAM,GAERrX,KAAM,OAERta,OAAOo9C,UAAU7jD,MAAK,GASxB,QAASu4B,YACP,MAAOmrB,yBAAwBhuC,UAAU5T,KAAK,SAAU81B,OACtDnxB,OAAOmxB,MAAQA,MACfksB,qBAIJ,QAASA,oBACP,MAAOH,gBAAex8B,IAAI1gB,OAAO+vB,WAAWp1B,IAAI,iBAAiBsU,UAAU5T,KAAK,SAAUC,eACxF,IAAK,GAAIxF,KAAKwF,eACa,OAArBA,cAAcxF,IAAyCe,SAA1ByE,cAAcxF,GAAGwkB,OAI3Chf,cAAcxF,GAAGk7B,eAAe,SACE,gBAA3B11B,eAAcxF,GAAO,MACF,OAA1BwF,cAAcxF,GAAG67B,OACpBr2B,cAAcxF,GAAG67B,KAAOr2B,cAAcxF,GAAG67B,KAAKA,MAGV,gBAA3Br2B,eAAcxF,GAAO,OAC9BwF,cAAcxF,GAAG68B,YAAcr3B,cAAcxF,GAAGwkB,KAAK8W,aACrD91B,cAAcxF,GAAGwnD,WAAahiD,cAAcxF,GAAGwkB,KAC/Chf,cAAcxF,GAAGwkB,KAAOhf,cAAcxF,GAAGwkB,KAAK3nB,IAIpDqN,QAAO1E,cAAgBA,cACvB0E,OAAOo9C,UAAY,GAAIG,OAAMjiD,cAActF,QAC3CgK,OAAO1E,cAAcqc,QAAQ,SAAUlX,KAAM+P,OAE3CxQ,OAAOw9C,mBAAmBhtC,OAAS5Y,EAAE9C,KAAKkL,OAAOmxB,MAAO,SAAU7W,MAChE,MAAOA,MAAK3nB,KAAO8N,KAAK6Z,OACvBjc,KACH2B,OAAOo9C,UAAU5sC,QAAS,MAKhC,QAAS0J,cACPgjC,eAAex8B,IAAI1gB,OAAO+vB,WAAW5xB,MAAM9C,KAAK,SAAUU,SACxDiE,OAAOjE,QAAUA,QACjBiE,OAAOsc,SACL3pB,GAAIoJ,QAAQpJ,MAKlB,QAAS2D,QAAOka,OACdxQ,OAAO1E,cAAc4V,OAAOV,MAAO,GACnCxQ,OAAOo9C,UAAUlsC,OAAOV,MAAO,GAGjC,QAASitC,aAAYjtC,OACnBxQ,OAAOw9C,mBAAmBhtC,OAAS5Y,EAAE9C,KAAKkL,OAAOmxB,MAAO,SAAU7W,MAIhE,MAFAta,QAAO1E,cAAckV,OAAO8sC,WAAahjC,KACzCta,OAAO1E,cAAckV,OAAOmiB,YAAcrY,KAAK8W,aACxC9W,KAAK3nB,KAAOqN,OAAO1E,cAAckV,OAAO8J,OAC9Cjc,KArKL2B,OAAOy5B,SAAWp9B,UAAUq9B,iBAC5B15B,OAAO+vB,UAAY/qB,SAASuD,aAAa5V,GAAI,IAC7CqN,OAAO2yB,YAAc,GACrB3yB,OAAO1E,iBACP0E,OAAOw9C,sBACPx9C,OAAOmxB,SACPnxB,OAAOo9C,aACPp9C,OAAOoQ,KAAO,gBAEdpQ,OAAOm9C,OAAQ,EAEfn9C,OAAO9E,KAAOA,KACd8E,OAAO2U,IAAMA,IACb3U,OAAO1J,OAASA,OAChB0J,OAAOy9C,YAAcA,YAErBz9C,OAAO09C,WAAa,SAASC,cAC3B,SAAIA,aAAa3sB,eAAe,eACe,cAAzC2sB,aAAaL,WAAWlsB,eAQhCpxB,OAAO49C,cAAgB,SAASD,cAC9B,SAAIA,aAAa3sB,eAAe,eACe,gBAAzC2sB,aAAaL,WAAWlsB,gBAC1BpxB,OAAO69C,eAAeF,eACf,IAOb39C,OAAO69C,eAAiB,SAASF,cAC/B,IAAK,GAAI7nD,KAAK6nD,cAAaL,WAAWQ,MAAMxf,aAAc,CACxD,GAAIyf,iBAAkBJ,aAAaL,WAAWQ,MAAMxf,aAAaxoC,EAC7DkK,QAAOjE,QAAQuiC,eAAiByf,gBAAgBzf,eAClDqf,aAAaI,gBAAkBA,gBAAgBpsB,QAKrD3xB,OAAOg+C,SAAW,SAASL,cACzB,SAAIA,aAAa3sB,eAAe,eACe,WAAzC2sB,aAAaL,WAAWlsB,eAQhCpxB,OAAOi+C,SAAW,SAASN,cACzB,SAAIA,aAAa3sB,eAAe,eACe,WAAzC2sB,aAAaL,WAAWlsB,eAQhCpxB,OAAOk+C,aAAe,SAAUP,cAC9B,GAAIA,aAAaL,WACf,MAAKK,cAAaL,WAAW3rB,KAGpBgsB,aAAaL,WAAW3rB,KAAK,IAAOgsB,aAAaQ,gBAAkB,GAFnE,GA+BXn+C,OAAO8C,OAAO,gBAAiB,SAASs7C,iBAAkBC,kBACpDA,iBAAiBroD,OAAS,IAC5BgK,OAAOm9C,OAAQ,KAEhB,GAgELrrB,WACA5X,eAMJ1iB,QAAQC,OAAO,eACZiB,WAAW,uBAAwB,SAAUsH,OAAQkL,eAAgBoR,SACpEtc,OAAOsc,QAAUA,UAKrB9kB,QAAQC,OAAO,eACZiB,WAAW,qBAAsB,SAAUsH,OAAQvB,QAClDuB,OAAOvB,OAASA,SAKpBjH,QAAQC,OAAO,eACZiB,WAAW,6BAA8B,SAAUsH,OAAQkL,eAAgBtT,EAAGE,OAAQ4W,eAAgB8sC,cAAeC,iBACpHz7C,OAAOy7C,gBAAkBA,gBAEzB/sC,eAAe/T,IAAI,OAAOsU,SAASlT,QAASy/C,cAAc7oD,KAAK0I,KAAK,SAAUkJ,KAC5E,GAAI+5C,QAAS1mD,EAAEy3B,IAAI9qB,IAAK,SAAU4C,OAAS,MAAOrP,QAAOqP,MAAMo3C,eAC3DC,cAAgBF,OAAO3iD,IAC3B+S,gBAAegS,IAAI,SAAU89B,eAAergD,MAAM9C,KAAK,SAAUF,MAC/D6E,OAAOy+C,YAActjD,SAIzB6E,OAAO0+C,eAAiB,WAGtB9mD,EAAE62B,KAAKzuB,OAAOy7C,gBAAiB,SAAU37C,MAAOif,KAC9C/e,OAAOsc,QAAQyC,KAAOjf,QAExBE,OAAOk6C,gBAAiB,EAExBhvC,eAAe6J,SAIjB/U,OAAO2+C,WAAa,WAClBzzC,eAAe6J,QACf/U,OAAOm3C,QAAQmE,+BAOrB9jD,QAAQC,OAAO,eACZiB,WAAW,0BAA2B,SAAUsH,OAAQtG,MAAO2C,UAAWvE,QACzE,GAAI+sB,KAAM/sB,SAASyb,GAAGlX,UAAUmX,kBAChCxT,QAAOupB,MAAQzxB,QAAQ+sB,IAAItQ,OAAQsQ,IAAIrQ,UACvCxU,OAAO4+C,IAAM9mD,QAAQ+sB,IAAItQ,OAAQsQ,IAAIrQ,QAAU,IAE/CxU,OAAO6+C,OAAS,4DAEhB7+C,OAAO8+C,kBAAoB,WACzB,GAAIC,cAAe/+C,OAAOupB,MAAMlzB,OAAO,cACnC2oD,WAAah/C,OAAO4+C,IAAIvoD,OAAO,aACnC,OAAO2J,QAAO6+C,OAAS,UAAYE,aAAe,QAAUC,YAG9Dh/C,OAAOi/C,YAAcj/C,OAAO8+C,oBAE5B9+C,OAAO2rB,iBAAiB,eAAgB,WACtC3rB,OAAOi/C,YAAcj/C,OAAO8+C,wBAQlCtnD,QAAQC,OAAO,eACZiB,WAAW,iBAAkB,SAAUsH,OAAQgsC,MAAO9gC,eAAgBrY,GACrEmN,OAAOk/C,MAAQ,WACb,GAAIpjD,UAAWjJ,EAAE,0BAA4BurB,MACzC+gC,SAAWtsD,EAAE,0BAA4BurB,KAC7C4tB,OAAMkT,MAAMpjD,SAAUqjD,UAAU9jD,KAC9B,WAAc6P,eAAe6J,SAC7B,WAAc7J,eAAek0C,eAOrC5nD,QAAQC,OAAO,eACZiB,WAAW,mBAAoB,SAAUsH,OAAQtG,MAAOsR,OACrDE,eAAgBrY,EAAGwJ,UAAWvE,OAAQk0C,MAAO1vB,QAASrkB,OAExD+H,OAAOsc,QAAUA,QAEjBtc,OAAOq/C,WACLn5C,KAAM,UACNC,KAAM,aACNC,SAAU,aACV9O,MAAO,UAGT0I,OAAO8C,OAAO,cAAe,SAAUw8C,QACrC,GAAIC,eAAgBznD,OAAOwnD,OAC3Bt/C,QAAOw/C,gBAAkB1nD,SACtByc,KAAKgrC,cAAchrC,QACnBC,MAAM+qC,cAAc/qC,SACpBpB,KAAKmsC,cAAcnsC,QACtBpT,OAAOy/C,gBAAkB3nD,SACtBic,KAAKwrC,cAAcxrC,QACnBC,OAAOurC,cAAcvrC,WAG1B,IAAI0rC,iBAAkB,mBAEtB1/C,QAAO2/C,gBAAkB,SAAUC,UACjC,GAAiB,QAAbA,SAAoB,CACtB,GAAI/6B,KAAM/sB,QACVkI,QAAO6/C,YAAch7B,IAEvB,GAAiB,aAAb+6B,SAAyB,CAC3B,GAAIE,UAAWhoD,SAASic,KAAK,IAAIC,OAAO,EACxChU,QAAO6/C,YAAcC,WAIzB9/C,OAAO+/C,gBAAkB,SAAUH,UACjC,GAAII,OAAQloD,OAAOyb,GAAGlX,UAAUmX,kBACf,WAAbosC,WACF5/C,OAAOw/C,gBAAkB1nD,SAASyc,KAAKyrC,MAAMzrC,QAAQC,MAAMwrC,MAAMxrC,SAASpB,KAAK4sC,MAAM5sC,SAEtE,aAAbwsC,WACF5/C,OAAOw/C,gBAAkB1nD,SAASyc,KAAKyrC,MAAMzrC,QAAQC,MAAMwrC,MAAMxrC,SAASpB,KAAK4sC,MAAM5sC,OAAS,KAIlGpT,OAAOigD,WAAa,WAGlB,IAAKjgD,OAAOsc,QAAQgiB,aAKlB,MAJApzB,gBAAek0C,cACfp0C,QAAOC,MACLxS,YAAa,+CAKjB,IAAI4b,SAAUvc,OAAOkI,OAAOw/C,iBACxB3rC,QAAU/b,OAAOkI,OAAOy/C,iBACxBS,YAAcpoD,OAAOyb,GAAGlX,UAAUmX,mBACnCe,KAAKF,QAAQE,QACbC,MAAMH,QAAQG,SACdpB,KAAKiB,QAAQjB,QACbW,KAAKF,QAAQE,QACbC,OAAOH,QAAQG,UACf3d,OAAOqpD,iBACNvkD,MAAQc,UAAWikD,YAEvB,OAAOxmD,QACLlD,IAAK,uBAAyBwJ,OAAOsc,QAAQ3pB,GAAK,YAClD6K,OAAQ,OACRrC,KAAMA,QAIV6E,OAAOmgD,cAAgB,SAAUC,iBAC/BA,gBACG/kD,KAAK,SAAU8M,QACdnI,OAAOsc,QAAQrgB,UAAYkM,OAAOhN,KAAKc,UACnC+D,OAAO07C,mBACT17C,OAAO07C,mBAAmBp/B,QAAStc,OAAOsc,QAAS5X,SAAUyD,OAAOhN,OAEtE+P,eAAe6J,UAEhBgE,MAAM,SAAUy4B,QACfv5C,MAAMurB,eAAe,yBAA0BqO,MAAO2f,OAAOr2C,OAC7D+P,eAAek0C,aAIrBp/C,OAAOqgD,aACLn6C,KAAM,YACNC,KAAM,eACNC,SAAU,eACV9O,MAAO,SAIT0I,OAAOsgD,UAAY,WACjB,MAAO5mD,QACLlD,IAAK,uBAAyBwJ,OAAOsc,QAAQ3pB,GAAK,YAClD6K,OAAQ,OACRrC,MAAOc,WAAW,MAItB+D,OAAOugD,aAAe,SAAUC,eAC9BA,cACGnlD,KAAK,SAAU8M,QACVnI,OAAO07C,mBACT17C,OAAO07C,mBAAmBp/B,QAAStc,OAAOsc,QAAS5X,SAAUyD,OAAOhN,OAEtE+P,eAAe6J,UAEhBgE,MAAM,SAAUy4B,QACXxxC,OAAO07C,mBACT17C,OAAO07C,mBAAmBp/B,QAAStc,OAAOsc,QAAS5X,SAAU8sC,OAAOr2C,OAEtE+P,eAAek0C,aAIjBp/C,OAAOsc,QAAQrgB,UACjB+D,OAAO6/C,YAAc/nD,OAAOyb,GAAGvT,OAAOsc,QAAQrgB,UAAWI,UAAUmX,mBAEnExT,OAAO2/C,gBAAgB,SAO7BnoD,QAAQC,OAAO,eACZiB,WAAW,uBAAwB,SAAUsH,OAAQtG,MAAO5B,QAC3D,GAAI2oD,gBAAiB,iCACjB57B,IAAM/sB,SAASyb,GAAG,kBAEtBvT,QAAO0gD,aAAe5oD,OAAO6oD,cAC7B3gD,OAAO4gD,eAAiB/7B,IAAIlQ,IAAI,EAAG,QACnC3U,OAAO6gD,YAAc7gD,OAAO0gD,aAAa77B,IAAIrQ,QAAU,GACvDxU,OAAO8gD,WAAaj8B,IAAItQ,OAExBvU,OAAO+gD,mBAAqB,SAASx/C,QACnCA,OAAOiY,iBACPjY,OAAOy/C,kBACPhhD,OAAOihD,qBAAsB,EAG/B,IAAIC,gBAAiB,WACnB,MAAOppD,UAAS0c,MAAMxU,OAAO6gD,aAAatsC,KAAKvU,OAAO8gD,YAAYK,QAAQ,SAG5EnhD,QAAOohD,UAAY,WACjB,GAAIjmD,OACAkmD,SAAUrhD,OAAO4gD,eACjBr3B,MAAO23B,iBAEXxnD,OAAM0B,KAAKqlD,eAAgBtlD,SAKjC3D,QAAQC,OAAO,eACZiB,WAAW,gBAAiB,SAAUgB,MAAOsG,OAAQgL,OAAQlF,QAASjT,EACnEyV,UAAWm1B,QAASthC,aAAc6vC,MAAOl0C,OAAQuE,UACjDilD,6BAA8BC,wBAC9BC,8BA6KF,QAASC,YAAWz7C,OAAQujB,MAAOq1B,IAAK8C,MAAO7C,QAa7C,GAZA7+C,OAAOkP,SAEgB,mBAAb,QACRlP,OAAO2hD,OAAS37C,OAAO47C,YAEvB5hD,OAAO2hD,OAAS9C,OAGlB7+C,OAAO2hD,QAAW,SAAW3hD,OAAO6hD,aAAav1B,WAGjDtsB,OAAO4hD,YAAc57C,OAAO47C,YAAc,cACtChD,IAAK,CACP,GAAIkD,UAAWrkB,QAAQ,QAAQmhB,IAAK,aACpC5+C,QAAO6hD,aAAajD,IAAMkD,SAC1B9hD,OAAO2hD,QAAW,QAAUG,SAC5B9hD,OAAO4hD,aAAgB,QAAUE,SAGnC,GAAIv4B,MAAO,CACT,GAAIw4B,YAAatkB,QAAQ,QAAQlU,MAAO,aACxCvpB,QAAO6hD,aAAat4B,MAAQw4B,WAC5B/hD,OAAO2hD,QAAW,UAAYI,WAC9B/hD,OAAO4hD,aAAgB,UAAYG,WAqBrC,GAlBIL,QACF1hD,OAAO2hD,QAAW,aAAeD,MAAM3iC,KAKrC/e,OAAOgiD,kBACThiD,OAAO2hD,QAAW,cAAgB3hD,OAAOgiD,gBACzChiD,OAAO4hD,aAAgB,cAAgB5hD,OAAOgiD,gBAC9ChiD,OAAO6hD,aAAa5lD,UAAY+D,OAAOgiD,iBAGrChiD,OAAOiiD,aACTjiD,OAAO2hD,QAAW,UAAY3hD,OAAOiiD,WACrCjiD,OAAO4hD,aAAgB,UAAY5hD,OAAOiiD,WAC1CjiD,OAAO6hD,aAAaK,MAAQliD,OAAOiiD,YAGjCjiD,OAAOmiD,YACT,IAAK,GAAIpjC,OAAO/e,QAAOmiD,YACgB,YAAjCniD,OAAOmiD,YAAYpjC,KAAK1qB,MAC1B2L,OAAO2hD,QAAW,iBAAwB3hD,OAAOmiD,YAAYpjC,KAAK1O,MAClErQ,OAAO4hD,aAAgB,iBAAwB5hD,OAAOmiD,YAAYpjC,KAAK1O,MACvErQ,OAAO6hD,aAAaO,aAAepiD,OAAOmiD,YAAYpjC,KAAK1O,QAE3DrQ,OAAO2hD,QAAW,IAAM3hD,OAAOmiD,YAAYpjC,KAAK1qB,KAAO,IAAM2L,OAAOmiD,YAAYpjC,KAAK1O;AACrFrQ,OAAO4hD,aAAgB,IAAM5hD,OAAOmiD,YAAYpjC,KAAK1qB,KAAO,IAAM2L,OAAOmiD,YAAYpjC,KAAK1O,MAC1FrQ,OAAO6hD,aAAa7hD,OAAOmiD,YAAYpjC,KAAK1qB,MAAQ2L,OAAOmiD,YAAYpjC,KAAK1O,MAKlF3W,QACE8D,OAAQ,MACRhH,IAAKwJ,OAAO2hD,SACXtmD,KAAK,SAAUF,MAChB6E,OAAOkP,SACPlP,OAAOqiD,UAAYlnD,KAAKA,KAAKuV,MAC7BvV,KAAKA,KAAK0F,QAAQ8W,QAAQ,SAAU2qC,UAClC,GAAI7hD,QACJuF,QAAOu8C,SAAS5qC,QAAQ,SAAU6qC,SAChC,GAAInjD,KAAMlD,aAAa,UAAYqmD,QAAQC,WAAa,MACpD3iD,MAAQT,KAAKoB,KAAM6hD,UACvB7hD,MAAKlH,KAAKuG,SAEZE,OAAOkP,MAAM3V,KAAKkH,UAnPxBqF,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,eAElD9J,OAAOiiD,WAAa,GACpBjiD,OAAO0iD,cAEHrkD,KAAM,MACNyB,MAAO,KAGPzB,KAAM,QACNyB,MAAO,UAGPzB,KAAM,YACNyB,MAAO,cAIXE,OAAOgiD,gBAAkB,GACzBhiD,OAAO2iD,mBAEHtkD,KAAM,cACNyB,MAAO,KAGPzB,KAAM,YACNyB,MAAO,cAIXE,OAAO4iD,SACLC,eACErnD,QAAS8lD,6BACTiB,WACGvmD,MAAS,aAAcymD,WAAc,eACrCzmD,MAAS,WAAYymD,WAAc,kBACnCzmD,MAAS,cAAeymD,WAAc,yBACtCzmD,MAAS,cAAeymD,WAAc,sBACtCzmD,MAAS,OAAQymD,WAAc,SAC/BzmD,MAAS,MAAOymD,WAAc,QAC9BzmD,MAAS,OAAQymD,WAAc,2CAElCb,YAAa,uCACbkB,eAEIz6C,MAAO,gBACP0W,IAAK,SAGL1W,MAAO,mBACP0W,IAAK,aAIXgkC,SACEvnD,QAAS+lD,wBACTgB,WACGvmD,MAAS,aAAcymD,WAAc,OACrCzmD,MAAS,WAAYymD,WAAc,UACnCzmD,MAAS,eAAgBymD,WAAc,iBACvCzmD,MAAS,QAASymD,WAAc,aAChCzmD,MAAS,eAAgBymD,WAAc,UACvCzmD,MAAS,iBAAkBymD,WAAc,mCAE5CK,gBACAlB,YAAa,+CAEfoB,iBACExnD,QAASgmD,6BACTe,WACGvmD,MAAS,cAAeymD,WAAc,0BACtCzmD,MAAS,iBAAkBymD,WAAc,wBACzCzmD,MAAS,MAAOymD,WAAc,QAC9BzmD,MAAS,eAAgBymD,WAAc,sCAE1CK,gBACAlB,YAAa,kDAGjB5hD,OAAOkP,SACPlP,OAAOuiD,YACPviD,OAAO8iD,gBAEP9iD,OAAOijD,aAAenrD,SAASqpD,QAAQ,SAAS9qD,OAAO,cACvD2J,OAAOkjD,WAAaprD,SAASqrD,MAAM,SAAS9sD,OAAO,cAEnD2J,OAAO6hD,cACLv1B,WAAY,EACZ/C,MAAOvpB,OAAOijD,aACdrE,IAAK5+C,OAAOkjD,YAEdljD,OAAOojD,gBAAiB,EAExBpjD,OAAOqiD,UAAY,KACnBriD,OAAOmiD,eAEPniD,OAAOqjD,WAAY,EACnBrjD,OAAOsjD,SAAU,EAEjBtjD,OAAOujD,UAAY,SAAUC,mBACvBxjD,OAAOojD,kBAAmB,IAC5BpjD,OAAOojD,gBAAiB,GAE1BpjD,OAAO6hD,aAAav1B,WAAa,EACjCtsB,OAAOgG,OAASw9C,mBAGlBxjD,OAAOyjD,cAAgB,SAAU3jD,OAC/BE,OAAOiiD,WAAaniD,MACpB2hD,WAAWzhD,OAAOgG,OAAQhG,OAAO6hD,aAAat4B,MAAOvpB,OAAO6hD,aAAajD,IAAK5+C,OAAO0jD,UAGvF1jD,OAAO2jD,mBAAqB,SAAU7jD,OACpCE,OAAOgiD,gBAAkBliD,MACX,cAAVA,QACFE,OAAO6hD,aAAajD,IAAM9mD,SAASzB,OAAO,eAE5CorD,WAAWzhD,OAAOgG,OAAQhG,OAAO6hD,aAAat4B,MAAOvpB,OAAO6hD,aAAajD,IAAK5+C,OAAO0jD,UAGvF1jD,OAAO4jD,UAAY,SAAUriD,QAC3BA,OAAOiY,iBACPjY,OAAOy/C,kBACPhhD,OAAOqjD,WAAY,GAGrBrjD,OAAO6jD,QAAU,SAAUtiD,QACzBA,OAAOiY,iBACPjY,OAAOy/C,kBACPhhD,OAAOsjD,SAAU,GAGnBtjD,OAAO8jD,eAAiB,WACtBrC,WAAWzhD,OAAOgG,OAAQhG,OAAO6hD,aAAat4B,MAAOvpB,OAAO6hD,aAAajD,IAAK5+C,OAAO0jD,UAGvF1jD,OAAO+jD,gBAAkB,WACvB,MAAsB,cAAlB/jD,OAAOgG,QAMbhG,OAAO8C,OAAO,SAAU,SAAUkD,QAC3BA,SAGLhG,OAAO8iD,aAAe98C,OAAO88C,aAC1B98C,OAAO88C,aAAa9sD,OAAS,EAC9BgK,OAAO0jD,QAAU19C,OAAO88C,aAAa,GAErC9iD,OAAO0jD,QAAU,KAEnB1jD,OAAOuiD,YACPv8C,OAAOu8C,SAAS5qC,QAAQ,SAAU6qC,SAChCxiD,OAAOuiD,SAAShpD,KAAKipD,QAAQxmD,SAG/BylD,WAAWz7C,OAAQhG,OAAO6hD,aAAat4B,MAAOvpB,OAAO6hD,aAAajD,IAAK5+C,OAAO0jD,YAGhF1jD,OAAO2rB,iBAAiB,yCAA0C,SAAU/jB,QAC1E,GAAK5H,OAAOgG,OAAZ,CAGA,GAAIujB,OAAQ3hB,OAAO,GACfg3C,IAAMh3C,OAAO,EAEjB65C,YAAWzhD,OAAOgG,OAAQujB,MAAOq1B,IAAK5+C,OAAO0jD,YAgF/C1jD,OAAOgkD,iBAAmB,WACxB,MAAOh5C,QAAOC,MACZxS,YAAa,wCACbC,WAAY,0BAIhBsH,OAAOusB,SAAW,WAChBk1B,WAAWzhD,OAAOgG,OAAQhG,OAAO6hD,aAAat4B,MAAOvpB,OAAO6hD,aAAajD,QAO/EpnD,QAAQC,OAAO,eACZiB,WAAW,gBAAiB,SAAUsH,OAAQtG,MAAOoM,QAAS1J,GAAIkM,UAC/DjM,WAEFyJ,QAAQ3R,SAAS6H,MAAQK,UAAUyN,aAAe,qBAElD,IAAIm6C,UACJjkD,QAAO6H,OAAS,SAAUrR,KACnBA,MAEqB,mBAAhB,WACRytD,UAAY7nD,GAAGK,SAEfwnD,UAAUhmD,UACVgmD,UAAY7nD,GAAGK,SAGjB/C,OACE8D,OAAQ,MACRhH,IAAK,iBACL0tD,QAASD,UAAU/lD,QACnB0J,QAASpR,IAAKwJ,OAAOxJ,OACpBM,QAAQ,SAAUqE,MACnB6E,OAAOoyC,iBACP,KAAK,GAAI+R,KAAKhpD,MACZ6E,OAAOoyC,eAAe74C,MAAM4qD,EAAGhpD,KAAKgpD,OAErC7sD,MAAM,SAAU6D,KAAM20B,OAAQr5B,QAAS0B,QACzB,MAAX23B,SACF9vB,OAAOoyC,kBACPpyC,OAAOoyC,eAAe74C,MAAM,GAAI,UAKtCyG,OAAO9E,KAAO,WACZ,GAAIC,QACJ,KAAK,GAAIrF,KAAKkK,QAAOoyC,eACnBj3C,KAAK6E,OAAOoyC,eAAet8C,GAAG,IAAMkK,OAAOoyC,eAAet8C,GAAG,EAG/D,OAAO4D,QACL8D,OAAQ,OACRhH,IAAK,sBAAwBwJ,OAAOxJ,IACpC2E,KAAMA,OACLrE,QAAQ,SAAUqE,MACnB6E,OAAOoyC,iBACP,KAAK,GAAI+R,KAAKhpD,MACZ6E,OAAOoyC,eAAe74C,MAAM4qD,EAAGhpD,KAAKgpD,QAM1CnkD,OAAOokD,WAAa,SAAUnrC,MAAOziB,KACb,KAAlByiB,MAAMzX,QACRtK,KAAK2Q,OAAOrR,KACe,KAAlByiB,MAAMzX,UACfyX,MAAMorC,cAAcvkD,MAAQ,IAKhC,IAAI+H,QAASS,UAAUT,QACnBA,SAAUA,OAAOrR,MACnBwJ,OAAOxJ,IAAM8tD,mBAAmBz8C,OAAOrR,QAO7CgB,QAAQC,OAAO,eACZqI,MAAM,mCAAoC,GAC1CpH,WAAW,wBAAyB,SAAUsH,OAAQuI,aACnDlM,UAAWqS,eAAgB61C,iCAAkC3sD,EAAGE,QAElE,GAAIiE,SAAU2S,eAAegS,IAAI,UAAWnY,aAAa5V,GAEzDqN,QAAOwkD,qBAAuBD,iCAC9BvkD,OAAOykD,cAAgBpoD,UAAUuoC,sBAEjC5kC,OAAO0kD,UACP3oD,QAAQkT,QAAQ,eAAe5T,KAAK,SAAUspD,WAC5C3kD,OAAO0kD,OAASC,SAGhB,IAAIC,mBACJhtD,GAAE62B,KAAKzuB,OAAO0kD,OAAQ,SAAUG,MAAO/uD,GACrC+uD,MAAMC,YAAchtD,OAAO+sD,MAAMC,aACjCD,MAAME,YAAcjtD,OAAO+sD,MAAME,aAE7BjtD,SAAS80B,QAAQi4B,MAAME,aAEzBH,gBAAgBrrD,KAAKzD,GAGrB+uD,MAAMG,eAAiBH,MAAME,YAAYvM,KAAK1gD,SAAU,QAAU,GAKtE,KAAK,GAAIhC,GAAI8uD,gBAAgB5uD,OAAS,EAAGF,GAAK,EAAGA,IAC/CkK,OAAO0kD,OAAOxzC,OAAO0zC,gBAAgB9uD,GAAI,KAI7CkK,OAAOilD,YAAc,WAEnB,GAAIpgC,KAAM/sB,QACV4W,gBAAegS,IAAI,UAAWnY,aAAa5V,IAAIyI,KAAK,gBAClD0pD,YAAejgC,IACfkgC,YAAelgC,IAAI6Y,QAAQ/oB,KAAKoiC,KAAMwN,qCACrClpD,KAAK,SAAUwpD,OAEhBA,MAAMC,YAAchtD,OAAO+sD,MAAMC,aACjCD,MAAME,YAAcjtD,OAAO+sD,MAAME,aACjCF,MAAMG,eAAiBH,MAAME,YAAYvM,KAAK1gD,SAAU,QAAU,EAElEkI,OAAO0kD,OAAOnrD,KAAKsrD,OACnB7kD,OAAOklD,YAAcL,WAS7BrtD,QAAQC,OAAO,eACZiB,WAAW,qBAAsB,SAAUsH,OAAQ0D,aAAcwH,eAAgBoR,SAEhFtc,OAAOsc,QAAUA,QAKjBtc,OAAOmlD,sBAAwB,WAG7BzhD,aAAanH,SAASlB,KAAK,SAAUvE,SAEnCkJ,OAAOsc,QAAQ8oC,mBAAqBtuD,SAEnC,SAAUQ,OACXgN,QAAQC,IAAIjN,QACX,SAAUkN,UACXF,QAAQC,IAAIC,eASpBhN,QAAQC,OAAO,eACZiB,WAAW,wBAAyB,SAAUsH,OAAQtG,MAAOwR,eAAgBrY,EAAGm5C,MAAOyQ,UAAWxkD,OACjG+H,OAAOqlD,cACLn/C,KAAM,SACNC,KAAM,WACNC,SAAU,UACV9O,MAAO,UAGT0I,OAAOslD,aAAe,WACpB,MAAO5rD,QACL8D,OAAU,OACVhH,IAAO,uBAAyBimD,UAAY,aAIhDz8C,OAAOulD,SAAW,SAAUC,eAC1BA,cACGnqD,KAAK,SAAU8M,QACd7D,QAAQC,IAAI,iBACZvE,OAAO27C,kBACPzwC,eAAe6J,UAEhBgE,MAAM,SAAUy4B,QACf,MAAsB,OAAlBA,OAAO1hB,QACT9vB,OAAO27C,sBACPzwC,gBAAe6J,UAGjB9c,MAAMurB,eAAe,0BAA2BqO,MAAO2f,aACvDtmC,gBAAek0C,gBAOzB5nD,QAAQC,OAAO,eACZiB,WAAW,gBAAiB,SAAUsH,OAAQtG,MAAO0C,IAEpD4D,OAAOqgD,aACLn6C,KAAM,YACNC,KAAM,eACNC,SAAU,eACV9O,MAAO,SAIT0I,OAAOsgD,UAAY,WACjB,MAAO5mD,QACLlD,IAAK,uBAAyBwJ,OAAOsc,QAAQ3pB,GAAK,YAClD6K,OAAQ,OACRrC,MAAOc,WAAW,MAItB+D,OAAOugD,aAAe,SAAUC,eAC9BA,cACGnlD,KAAK,SAAU8M,QACVnI,OAAO07C,mBACT17C,OAAO07C,mBAAmBp/B,QAAStc,OAAOsc,QAAS5X,SAAUyD,OAAOhN,SAGvE4d,MAAM,SAAUy4B,QACXxxC,OAAO07C,mBACT17C,OAAO07C,mBAAmBp/B,QAAStc,OAAOsc,QAAS5X,SAAU8sC,OAAOr2C,YAYhF3D,QAAQC,OAAO,eACZiB,WAAW,0BAA2B,SAAUsH,OAAQkL,eAAgBtT,EAAGE,OAAQ2gD,kBACnCC,YAAar8C,WAG5Dq8C,YAAY+M,aAAapqD,KAAK,WAC5B2E,OAAO0lD,YAAerpD,UAAU0oC,iCAGlC0T,kBAAkBkN,OACftqD,KAAK,SAAUuqD,UAGd5lD,OAAO4lD,SACLhuD,EAAEsb,MAAM0yC,UAELn3B,KAAK,SAAUsrB,SACdA,QAAQ8L,kBAAoB/tD,OAAOiiD,QAAQC,WAAW3jD,OAAO,wBAG9Dk1B,OAAO,SAAUwuB,SAChB,OAAQA,QAAQC,YAEnBl6C,QAGHE,OAAO8lD,gBAAkB9lD,OAAO4lD,SAAS,GAGzC5lD,OAAO+lD,WAAa,SAAUhM,SAC5B/5C,OAAO8lD,gBAAkB/L,SAI3B/5C,OAAOgmD,gBAAkB,WAGvBpuD,EAAE62B,KAAKzuB,OAAO8lD,gBAAgB/pD,QAAS,SAAU+D,MAAOif,KACtD/e,OAAOsc,QAAQyC,KAAOjf,QAIxBE,OAAOk6C,gBAAiB,EAGxBhvC,eAAe6J,aASzBvd,QAAQC,OAAO,eACZiB,WAAW,0BAA2B,SAAUsH,OAAQtG,MACrDwR,eAAgB7O,UAAWod,SAAUw6B,SA0DvC,QAASgS,kBAAiBC,WACxB,MAAO7pD,WAAUwoC,uBAAuBoP,QAAS,aAAekS,KAAKD,WAAa,QAGpF,QAASC,MAAKnxD,KACZ,GAAIoxD,GAAI,OAASpxD,GACjB,OAAOoxD,GAAE5mD,OAAO4mD,EAAEpwD,OAAS,GA/D7B,GAAIqwD,mBAAoB,EACpBC,cAAgB,EACpBtmD,QAAOumD,eAAiB5zD,GAAI,MAC5BqN,OAAOwmD,KAAO,QAEd/sC,SAAS+1B,SAASyE,SAAS54C,KACzB,SAAUqJ,UACR1E,OAAOob,MAAQ1W,SAASvJ,KACK,gBAAzBuJ,SAASvJ,KAAK20B,QAChB9vB,OAAOymD,YAAa,EACpBzmD,OAAOob,MAAMsrC,OAAS1mD,OAAOob,MAAMsrC,QAAU,MAE7C1mD,OAAOob,MAAMsrC,OAAS1mD,OAAOob,MAAMsrC,QAAUT,iBAAiBI,qBAKpErmD,OAAO8C,OAAO,eAAgB,WAC5B,GAAK9C,OAAOob,OAAUpb,OAAOob,MAAMsrC,OAAnC,CACA,GAAIC,YAAatqD,UAAUwoC,uBAAuBoP,QAAS,+BACvD2S,eAAiBD,WAAWtpD,QAAQ,gBACkC,KAAtE2C,OAAOob,MAAMsrC,OAAOrpD,QAAQspD,WAAWnnD,OAAO,EAAGonD,kBACnD5mD,OAAO6mD,iBAAmB9V,OAAO/wC,OAAOob,MAAMsrC,OAAOlnD,OAAOonD,eAAgB,IAC5E5mD,OAAOumD,cAAc5zD,GAAK,MAE1BqN,OAAO6mD,kBAAmB,KAI9B7mD,OAAO8C,OAAO,mBAAoB,WAC5B9C,OAAOumD,cAAc5zD,KACvBqN,OAAOob,MAAMsrC,OACXrqD,UAAUoB,iBAAiB,OAAQuC,OAAOumD,cAAc5zD,GAAI,eAIlEqN,OAAO8mD,UAAY,WACjB9mD,OAAOob,MAAMsrC,OAAST,iBAAiBjmD,OAAO6mD,iBAAmBP,cAAgBtmD,OAAO6mD,iBAAmB,EAAI,IAGjH7mD,OAAO+mD,UAAY,WACjB/mD,OAAOob,MAAMsrC,OAAST,iBAAiBjmD,OAAO6mD,iBAAmB,EAAI7mD,OAAO6mD,iBAAmB,EAAIP,gBAGrGtmD,OAAOgnD,aAAe,WACpBhnD,OAAOob,MAAMsrC,OAAST,iBAAiBI,oBAGzCrmD,OAAOinD,UAAY,WACjBxtC,SAASytC,SAASlnD,OAAOob,OACzBlQ,eAAe6J,MAAM/U,OAAOob,MAAMsrC,SAGpC1mD,OAAOmnD,SAAW,WAChB1tC,SAAS4hB,OAAO4Y,YAetBz8C,QAAQC,OAAO,eACZwC,QAAQ,QAAS,SAAUC,YAAaktD,aACvC,MAAOltD,aAAYuB,WAAW,SAAUC,uBACtCA,sBAAsBvB,WAAWitD,YAAY7hB,aAGhD7tC,SAAS,eACR6tC,QAAS,SAKb/tC,QAAQC,OAAO,eACZwC,QAAQ,wBAAyB,SAAUmC,GAAI6N,WAC9C,OACEo9C,cAAe,SAAUC,WAavB,MAZAr9C,WAAUE,OAAO,SAAUa,QACzB,GAAyB,MAArBs8C,UAAUx3B,OAAgB,CAC5B,GAAIrxB,QAAS6oD,UAAUnsD,OAASosD,WAAc,0CAC9Cv8C,QAAOC,MACLxS,YAAa,+BACbC,WAAY,sBACZuF,SACEQ,OAAQ,WAAc,MAAOA,eAK9BrC,GAAGe,OAAOmqD,eAOzB9vD,QAAQC,OAAO,eAAewC,QAAQ,uBAAwB,SAAUmC,GAAI0J,QAAS/N,SACjF,OACEsvD,cAAe,SAAUC,WACvB,GAAIA,UAAUx3B,QAAU,IAAK,CAC3B,GAAIqV,QACFqiB,WAAW,EACXC,KAAM,KACNC,KAAM,OAER,IAAI3vD,UACFiE,MAAO,mBACPye,KACE,gIACFpmB,KAAM,QACN8W,SACEA,SAAS,EACTw8C,MAAO,OACPvN,UACE3/B,KAAM,aACN3P,SAAU,gCACVjO,MAAO,SAAUw9C,QACfA,OAAO/jD,SACPwP,QAAQsB,wBAER0D,SAAU,YAEhBsvC,SACEG,SAAS,GAEXqN,KAAM,+BACNC,SAAU,oBACV1iB,MAAOA,QAGX,MAAO/oC,IAAGe,OAAOmqD,eAMzB9vD,QAAQC,OAAO,eACZU,OAAO,SAAU2vD,oBAAqBC,gBAErCD,oBAAoBE,qBAAqB,SAAUtjD,SAAUylB,UAAW89B,KAAMzxD,KAC5E,GAAI0xD,aAAcxjD,QAWlB,OAVkB,YAAdylB,WAC8B,mBAArBzlB,UAAS7D,UAClBqnD,YAAcxjD,SAAS7D,QACvBqnD,YAAYriB,UACVn1B,MAAOhM,SAASgM,MAChB0M,KAAM1Y,SAAS0Y,KACf+qC,SAAUzjD,SAASyjD,WAIlBD,cAELH,eAAeK,eACjBN,oBAAoB1tD,iBAAiB2tD,eAAeK,iBAGvD1wD,SAAS,kBACR0wD,cAAe,MAInB5wD,QAAQC,OAAO,eACZwC,QAAQ,sBAAuB,SAAUmC,GAAIsS,gBAC5C,MAAOA,gBAAelT,QAAQ,uBAQlChE,QAAQC,OAAO,eACZwC,QAAQ,cAAe,SAAUouD,mBAAoBC,UAAW7uD,WAC/D2C,GAAIgnB,eAAgB/mB,WAGpB,GAAIksD,SAAUF,mBAAmBG,OAAOnsD,UAAUmoC,wBAG9CikB,UAAYrsD,GAAGK,QACfgpD,WAAagD,UAAUvqD,OAG3BunD,YACG1sC,MAAM,SAAUzhB,OAEXA,OACFgN,QAAQhN,MAAM,yBAA0BA,SAK9C8rB,eAAenX,0BAA0B5Q,KAAK,SAAUM,MAIlD,kBAAoBA,OAAQA,KAAK+sD,eAGnCH,QAAQI,KAAKhtD,KAAK+sD,eAAgB,SAAUpxD,OAEtCA,MAGFmxD,UAAUtrD,OAAO7F,OAKjBmxD,UAAUxqD,QAAQsqD,WAStBE,UAAUtrD,UAQd,IAAIyrD,cAAeP,mBAAmBG,OAAOnsD,UAAUooC,iBAAiB,mBACxEmkB,cAAa79C,GAAG,QAAS,SAAU89C,WAE7BA,UAAUzqC,MAEZ3kB,WAAWqvD,MAAM,wBAIjBrvD,WAAWqvD,MAAM,yBAInBrvD,WAAWqvD,MAAM,sCAKnB,IAAI1P,cACFC,UAAW,SAAU0P,UAEnB,MADAtvD,YAAWuP,IAAI,uBAAwB+/C,UAChC3P,aAETG,aAAc,SAAUwP,UAEtB,MADAtvD,YAAWuP,IAAI,wBAAyB+/C,UACjC3P,aAETp1C,SAAU,SAAU+kD,UAClBtvD,WAAWuP,IAAI,oCAAqC+/C,WAIxD,QAMEtD,WAAY,WAAc,MAAOA,aAKjCrM,YAAaA,eAWnB5hD,QAAQC,OAAO,eACZwC,QAAQ,yBAA0B,SAAUmC,GAAIksD,UAAW//C,aAAc3Q,EAAGE,OAChC4gD,YAAat1B,eAAgB/mB,WASxE,GAAI2sD,eAAgB,SAAUT,QAAS9L,WAErC,GAAIwM,YAAaV,QAAQW,MAAM,YAAczM,WACzC9C,aAAe2O,UAAUW,WAAWC,MAAM,UAAUC,WACpDvP,UAAY0O,UAAUW,WAAWC,MAAM,aAAaC,WAEpDC,4BAA8B,WAEhC,GAAIC,oBAAqBjtD,GAAGK,QACxB6sD,kBAAoBD,mBAAmBnrD,OA8B3C,OA5BAklB,gBAAenX,0BACZ5Q,KAAK,SAAUM,MAEd,GAAI4tD,gBAAiB3xD,EAAE2+B,KAAK56B,MAC1B,KACA,eAGFg+C,cACG/R,KAAK2hB,gBACLluD,KAAK,SAAUmuD,SAGdA,QAAQjQ,eAAejjD,SAGvB+yD,mBAAmBprD,QAAQsrD,kBAG5BxwC,MAAM,SAAUzhB,OACf+xD,mBAAmBlsD,OAAO7F,WAI/ByhB,MAAM,SAAUzhB,OACf+xD,mBAAmBlsD,OAAO7F,SAGvBgyD,mBAILG,0BAA4B,WAM9B,MAHA/Q,aAAYU,YAAYC,UAAU+P,6BAG3BA,8BAIT,QAKEM,IAAKT,WAILtP,aAAc,WAAc,MAAOA,eAInCC,UAAW,WAAc,MAAOA,YAMhCe,2BAA4B8O,0BAS5BE,eAAgB,SAAUC,aAGxB,GAAIC,aAAcztD,GAAGK,QACjBqtD,eAAiBD,YAAY3rD,OAyCjC,OAtCAklB,gBAAenX,0BAA0B5Q,KAAK,SAAUM,MAEtD,GAAI4tD,gBAAiB3xD,EAAE2+B,KAAK56B,MAC1B,KACA,gBAIEouD,YAAcnQ,UAAU5jD,MACxB+zD,aAAc,EAAI1tD,UAAU0oC,gCAC9BntC,EAAEsb,MAAM0mC,WAELruB,OAAO,SAAUwuB,SAChB,MAAOA,SAAQC,YAGhBgQ,MAAM,SAAUjQ,SAGf,MAFAH,WAAU9R,QAAQiS,SAClBgQ,cACOA,YAAc,EAAI1tD,UAAU0oC,gCAKzC,IAAIklB,cACFjQ,UAAWliD,SAASoyD,UACpBvuD,KAAM4tD,eACNxtD,QAAS6tD,YAIXhQ,WAAUhS,KAAKqiB,aACZ5uD,KAAKwuD,YAAY5rD,SACjB8a,MAAM8wC,YAAY1sD,UAKhB2sD,iBAQb,QAQEK,iBAAkB,SAAU1N,WAE1B,GAAI2N,kBAAmBhuD,GAAGK,QACtB4tD,gBAAkBD,iBAAiBlsD,OAUvC,OARAw6C,aAAY+M,aACTpqD,KAAK,SAAUktD,SACd6B,iBAAiBnsD,QAAQ+qD,cAAcT,QAAS9L,cAEjD1jC,MAAM,SAAUzhB,OACf8yD,iBAAiBjtD,OAAO7F,SAGrB+yD,iBAQT7Q,wBAAyB,WAEvB,MAAOtiD,MAAKizD,iBAAiB5hD,aAAa5V,QAalD6E,QAAQC,OAAO,eACZ+D,QAAQ,qBAAsB,SAAU8uD,UAEvC,OACE9B,OAAQ,SAAUhyD,KAChB,MAAO,IAAI8zD,UAAS9zD,SAQ5BgB,QAAQC,OAAO,eACZ+D,QAAQ,cAAe,SAAqBu0C,eAAgB3zC,GAAI1C,OAC/DxC,KAAKiH,IAAM,SAAU1F,aACnB,GAAIuR,UAAW+lC,eAAe5xC,IAAI1F,YAClC,IAAIuR,SACF,MAAO5N,IAAG5D,KAAKwR,SAEf,IAAIL,UAAWvN,GAAGK,OAMlB,OALA/C,OAAMyE,IAAI1F,aAAc8xD,OAAO,IAAOzzD,QAAQ,SAAUmhB,MACtD83B,eAAeltB,IAAIpqB,YAAawf,MAChCtO,SAAS1L,QAAQga,QAGZtO,SAASzL,WAOxB1G,QAAQC,OAAO,eACZ+D,QAAQ,eAAgB,SAAsBsK,QAASpM,OAEtDxC,KAAKk3C,aAAe,SAAUoc,MAAOC,mBAAoBC,UAAWC,QAASC,UAE3EJ,MAAMnvD,KAAK,SAAUF,MAEnB,IAAK,GADD0vD,SAAU1vD,KAAK0F,SAAW1F,KACrB2vD,EAAI,EAAGA,EAAID,QAAQ70D,OAAQ80D,IAAK,CACvC,GAAIC,iBAAiB,EACjBC,MAAQH,QAAQC,EACpB,KAAK,GAAIG,YAAYR,oBAAoB,CACvC,IAAKO,MAAMh6B,eAAei6B,UAAW,CACnCF,gBAAiB,CACjB,OAGF,GAAIC,MAAMC,YAAcR,mBAAmBQ,UAAW,CAEpDF,gBAAiB,CACjB,QAGJ,GAAIA,eAEF,WADAL,WAAUM,OAIdL,QAAQF,sBACP1xC,MAAM6xC,aAWfpzD,QAAQC,OAAO,eACZwC,QAAQ,qBAAsB,SAAUmC,GAAImM,aAAczC,QAAShO,OAAQF,EACxEwrB,gBAEF,GAAI8nC,kBAAmB,UACnBC,UAAYD,iBAAmB,IAAM3iD,aAAa5V,GAAK,GAE3D,QAQEqpC,QAAS,SAAU4tB,aAEjB,GAAIC,aAAcztD,GAAGK,QACjB2uD,cAAgBvB,YAAY3rD,OAoEhC,OAjEI4H,SAAQulD,aACVjoC,eAAenX,0BAA0B5Q,KAAK,SAAUM,MAEtD,GAAI4tD,gBAAiB3xD,EAAE2+B,KAAK56B,MAC1B,KACA,gBAIEo+C,SACFC,UAAWliD,SAASoyD,UACpBvuD,KAAM4tD,eACNxtD,QAAS6tD,YAGX,KAGE9jD,QAAQulD,aAAaC,QAAQH,UAAYrzD,SAASoyD,UAAWqB,KAAKC,UAAUzR,UAC5E8P,YAAY5rD,QAAQ87C,SAEpB,MAAOziD,OAGPgN,QAAQC,IAAI,8BAAiCjN,OAC7CgN,QAAQC,IAAI,0BAGZ3M,EAAEsb,MAAMpN,QAAQulD,cAEb90B,KAAK,SAAUz2B,MAAOif,KACrB,GAAI0sC,UAAW1sC,IAAI9Z,MAAM,KACvBymD,gBAAiB,CAEnB,IAAwB,IAApBD,SAASz1D,QAAgBy1D,SAAS,KAAOP,iBAAkB,CAC7D,GAAIS,WAAY7zD,SAAS8zD,UAAU7U,KAAM,IAAImT,UAC3C2B,QAAU9a,OAAO0a,SAAS,GAE5BC,gBAAiBG,QAAUF,UAG7B,MAAOD,kBAGRj9B,KAAK,SAAU3uB,MAAOif,KACrBjZ,QAAQulD,aAAaz0C,WAAWmI,MAIpC,KACEjZ,QAAQulD,aAAaC,QAAQvR,QAAQC,UAAWuR,KAAKC,UAAUzR,QAAQh+C,UACvE8tD,YAAY5rD,QAAQ87C,SACpB,MAAOziD,OAEPgN,QAAQC,IAAI,qFAAwFjN,OACpGuyD,YAAY1sD,OAAO,qFAAwF7F,WAOjHuyD,YAAY1sD,OAAO,oFAGdiuD,eAQTxR,UAAW,WAGT,GAAIkS,eAAgB1vD,GAAGK,QACnB4tD,gBAAkByB,cAAc5tD,QAChC0nD,SAEEhuD,EAAEsb,MAAMpN,QAAQulD,cAEb90B,KAAK,SAAUw1B,OAAQhtC,KACtB,GAAI0sC,UAAW1sC,IAAI9Z,MAAM,IACzB,OAA2B,KAApBwmD,SAASz1D,QAAgBy1D,SAAS,KAAOP,kBAAoBO,SAAS,KAAOljD,aAAa5V,KAGlG6N,IAAI,SAAUurD,QACb,MAAOR,MAAKS,MAAMD,UAGrBjsD,OAIP,OAFAgsD,eAAc7tD,QAAQ2nD,UAEfyE,oBAUf7yD,QAAQC,OAAO,eACZ+D,QAAQ,QAAS,SAAe/B,WAAYC,MAAOC,SAAUmM,QAASjT,GAWrE,MATA4G,YAAWqJ,OAAO,WAChB,MAAOnJ,UAASG,WACf,SAAUmyD,QAASC,SACpBxyD,MAAME,SAASnD,QAAQoD,OAAO,eAAiBoyD,QAC3CnmD,QAAQqmD,iBACVrmD,QAAQqmD,qBAKVjN,MAAO,SAAUpjD,SAAUqjD,UACzB,GAAIhkD,MAAOtI,EAAEmwB,OAAOlnB,SAAUA,SAAUqjD,SAAUA,UAClD,OAAOzlD,QACL8D,OAAQ,OACRhH,IAAK,UACL2E,KAAMA,KACN1E,SAAUG,eAAgB,2CAUpCY,QAAQC,OAAO,eAAewC,QAAQ,yBAA0B,SAAUmC,GAAI6N,WAC5E,OACEo9C,cAAe,SAAUC,WACvB,MAAIA,WAAUnvD,QAAUmvD,UAAUnvD,OAAO23C,sBAChC1zC,GAAG5D,KAAK8uD,YAEfr9C,UAAUE,OAAO,SAAUa,QACzB,GAAyB,MAArBs8C,UAAUx3B,OACZ,GAAIw3B,UAAUnsD,MAAQmsD,UAAUnsD,KAAKsD,QAAU6oD,UAAUnsD,KAAKsD,OAAOpB,QAAQ,eAAiB,EAC5F2N,OAAOC,MACLxS,YAAa,iCACbC,WAAY,uBAET,CACL,GAAI+F,QAAS6oD,UAAUnsD,MAAQmsD,UAAUnsD,KAAKsD,QAAU,WACxDuM,QAAOC,MACLxS,YAAa,+BACbC,WAAY,qBACZuF,SACEQ,OAAQ,WAAc,MAAOA,eAMhCrC,GAAGe,OAAOmqD,gBAQzB9vD,QAAQC,OAAO,eACZwC,QAAQ,0BAA2B,SAAU+Q,QAE5C,GAAI6oC,OAAQ,IAEZ,QACE5oC,KAAM,SAAUjL,OAAQsc,SAiBtB,MAfIu3B,QACFA,MAAM9+B,QAGR8+B,MAAQ7oC,OAAOC,MACbxS,YAAa,yCACbC,WAAY,wBACZmJ,MAAO7B,OACP/B,SACEqe,QAAS,WACP,MAAOA,iBAwBrB9kB,QAAQC,OAAO,eACZwC,QAAQ,oBAAqB,SAAUmC,GAAIs8C,YAAaC,uBAAwByT,mBAAoBx0D,GAGnG,GAAIy0D,wBAAyBjwD,GAAGK,QAC5B6vD,mBAAqBD,uBAAuBnuD,OAChDw6C,aAAY+M,aACTpqD,KAAK,WAGJgxD,uBAAuBpuD,QAAQ06C,uBAAuBa,6BAGvDzgC,MAAM,WAGLszC,uBAAuBlvD,UAO3B,IAAIovD,UAAW30D,EAAE40D,QACf,SAAU1sD,MAAOif,KACf,MAAOnnB,GAAEiO,WAAW/F,QACVlI,EAAE9C,KAAKiqB,IAAK,SAAU0tC,GACpB,MAAa,MAANA,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,GAAmB,MAANA,KAGtF,SAAU3sD,MAAOif,KACf,OAAQA,IAAKjf,SAQb4sD,WAAa,SAAUpyD,KAEzB,GAAIojC,OAAOivB,UAgCX,OA9BI/0D,GAAEqL,YAAY3I,KAEhBojC,MAAQ,KACC9lC,EAAEg1D,cAActyD,MAEzBojC,SACA9lC,EAAEi1D,OAAOvyD,IAAK,SAAUwF,MAAOif,KAE7B4tC,WAAaD,WAAW5sD,OAEnBysD,SAASI,WAAY5tC,OACxB2e,MAAM3e,KAAO4tC,eAGR/0D,EAAE4f,QAAQld,MAEnBojC,SACA9lC,EAAE62B,KAAKn0B,IAAK,SAAUwF,MAAOif,KAE3B4tC,WAAaD,WAAW5sD,OAEnBysD,SAASI,WAAY5tC,MACxB2e,MAAMnkC,KAAKozD,eAKfjvB,MAAQpjC,IAGHojC,OASLovB,aAAe,SAAUlD,aAE3B,MAAO8C,YAAW9C,aAIpB,QAUE5tB,QAAS,SAAU+wB,eAAgB7S,gBAGjC,GAAI0P,aAAckD,aAAaC,gBAG3BlD,YAAcztD,GAAGK,QACjB2uD,cAAgBvB,YAAY3rD,OA0DhC,OAvDAouD,oBACGjxD,KAAK,SAAU2xD,iBAGV9S,gBAAkB8S,gBAAgBpT,YAAY5jD,OAAS,EAGzDg3D,gBAAgBrD,eAAeC,aAC5BvuD,KAAK,SAAU4uD,aAEdJ,YAAY5rD,QAAQgsD,eAErBlxC,MAAM,WAEL8wC,YAAY1sD,WAMhB0sD,YAAY1sD,WAKf4b,MAAM,WAELqzC,mBAAmBxS,YAAYv+C,KAAK,SAAUuqD,UAGxC1L,gBAAkB0L,SAAS5vD,OAAS,EAGtCo2D,mBAAmBpwB,QAAQ4tB,aACxBvuD,KAAK,SAAU4uD,aAEdJ,YAAY5rD,QAAQgsD,eAErBlxC,MAAM,SAAUzhB,OAEfuyD,YAAY1sD,OAAO7F,SAMvBuyD,YAAY1sD,aASbiuD,eAOTzF,KAAM,WAGJ,GAAIsH,UAAW7wD,GAAGK,QACdywD,WAAaD,SAAS/uD,OAwB1B,OArBAouD,oBACGjxD,KAAK,SAAU2xD,iBAGdA,gBAAgBpT,YAAYC,QAAQ,SAAU+L,UAC5CqH,SAAShvD,QAAQ2nD,cAIpB7sC,MAAM,WAGLqzC,mBAAmBxS,YAAYv+C,KAAK,SAAUuqD,UAC5CqH,SAAShvD,QAAQ2nD,YAChB7sC,MAAM,SAAUzhB,OACjB21D,SAAS9vD,OAAO7F,WAMf41D,WAAW7xD,KAAK,SAAUuqD,UAC7B,MAAOhuD,GAAE2zB,OAAOq6B,SAAU,SAAU7L,SAClC,OAAQA,QAAQC,kBAY9BxiD,QAAQC,OAAO,eACZwC,QAAQ,4BAA6B,SAAU+Q,QAE9C,GAAI6oC,OAAQ,IAEZ,QACE5oC,KAAM,SAAUjL,OAAQsc,SAkBtB,MAhBIu3B,QACFA,MAAM9+B,QAGR8+B,MAAQ7oC,OAAOC,MACbxS,YAAa,2CACbC,WAAY,0BACZmJ,MAAO7B,OACP1C,KAAM,KACNW,SACEqe,QAAS,WACP,MAAOA,iBAYrB9kB,QAAQC,OAAO,eACZ+D,QAAQ,WAAY,SAAkB9B,MAAO0C,GAAI4O,OAAQnY,GA+CxD,QAASs6D,8BAA6B/vD,MACpC,GAAIjC,OAAQkD,KAAMjB,KAAKiB,KACvBlD,MAAOtI,EAAEmwB,MAAM7nB,KAEf,IAAIiyD,kBAAmBhxD,GAAGK,OAgB1B,OAdA/C,QACE8D,OAAQ,OACRhH,IAAK62D,YACLlyD,KAAMA,KACN1E,SAAUG,eAAgB,uCACzBE,QAAQ,SAAUqE,MACnBiyD,iBAAiBnvD,SACfb,KAAMA,KACNwH,MAAOzJ,SAER7D,MAAM,SAAU6D,MACjBiyD,iBAAiBjwD,OAAOhC,QAGnBiyD,iBAAiBlvD,QAG1B,QAASovD,YAAWC,aAClB,GAAIC,YAAapxD,GAAGK,QAEhBgxD,SAAW,GAAIlwD,SAkCnB,OAhCAkwD,UAAS14D,OAAO,MAAOw4D,YAAY3oD,MAAMma,KACzC0uC,SAAS14D,OAAO,iBAAkBw4D,YAAY3oD,MAAM8oD,gBACpDD,SAAS14D,OAAO,MAAOw4D,YAAY3oD,MAAM+oD,KACzCF,SAAS14D,OAAO,wBAAyBw4D,YAAY3oD,MAAMgpD,uBAC3DH,SAAS14D,OAAO,SAAUw4D,YAAY3oD,MAAMipD,QAC5CJ,SAAS14D,OAAO,YAAaw4D,YAAY3oD,MAAMkpD,WAC/CL,SAAS14D,OAAO,OAAQw4D,YAAYnwD,MAGpCvK,EAAE0D,KAAKg3D,YAAY3oD,MAAMmpD,iBACvBC,aAAa,EACbxgB,aAAa,EACbryC,KAAMsyD,SACNp5D,KAAM,OACN45D,IAAK,WACH,GAAIzb,KAAM3/C,EAAEq7D,aAAaD,KAOzB,OANIzb,MACFA,IAAIj2C,OAAO4xD,iBAAiB,WAAY,SAAUnxD,GAChD,GAAIoxD,SAAWpxD,EAAEozC,OAASpzC,EAAEqxD,MAAS,GACrCb,YAAWc,OAAOF,WACjB,GAEE5b,KAET17C,QAAS,SAAUqE,MACjBqyD,WAAWvvD,QAAQsvD,cAErBj2D,MAAO,SAAU6D,MACfqyD,WAAWrwD,OAAOhC,SAIfqyD,WAAWtvD,QAIpB,QAASm9B,QAAOkyB,aACd,GAAIgB,gBAAiBnyD,GAAGK,OAcxB,OAZA/C,QACE8D,OAAQ,OACRhH,IAAK,UAAY+2D,YAAY3oD,MAAMjS,GAAK,YACvCmE,QAAQ,SAAUqE,MACnBoyD,YAAY3oD,MAA+B,wBAAIzJ,KAC/CqzD,gBAAgBjB,YAAY3oD,MAAMjS,IAAM46D,YAAY3oD,MAEpD2pD,eAAetwD,QAAQsvD,eACtBj2D,MAAM,SAAU6D,MACjBozD,eAAepxD,OAAOhC,QAGjBozD,eAAerwD,QA7HxB,GAAImvD,aAAc,aACd3wD,YAAc,qCACdE,cAAgB,uIAEpB1F,MAAKmkB,kBAAoB,WACvB,GAAIozC,eAAgBryD,GAAGK,OAEvBjF,SAAQlF,QAAQoK,aAAapG,QAC7B,IACI8G,MADAT,UAAYnF,QAAQlF,QAAQsK,cAmChC,OAjCApF,SAAQlF,QAAQ,QAAQyC,OAAO4H,WAC/BA,UAAUE,QACVF,UAAUG,OAAO,UACjBH,UAAUI,KAAK,SAAU,SAAU2xD,MACP,IAAtBx3D,KAAKgG,MAAMlH,QACboH,KAAOlG,KAAKgG,MAAM,GAGdE,KAAKE,KAAO,YACdmxD,cAActxD,OAAO,6CAGa,IAAhCC,KAAK/I,KAAKgJ,QAAQ,WACpBoxD,cAActxD,OAAO,kCAGvBsxD,cAActxD,OAAO,yBAGvBgwD,6BAA6B/vD,MAC1B/B,KAAKiyD,YACLjyD,KAAKggC,OAAQ7jC,QAAQ28C,KAAM,SAAUwa,uBAAyBF,cAAcH,OAAOK,yBACnFtzD,KACC,SAAUkyD,aACRkB,cAAcxwD,QAAQsvD,cAExB,SAAUj2D,OACRm3D,cAActxD,OAAO7F,WAMtBm3D,cAAcvwD,SAoFvBhH,KAAKmkC,OAAS,SAAU4Y,SACtB5Y,QAAQz2B,OAAQjS,GAAIshD,YAGtB/8C,KAAKokB,wBAA0B,SAAU24B,SACvC,MAAOjpC,QAAOC,MACZxS,YAAa,2CACbC,WAAY,0BACZuF,SACEg2C,QAAS,WAAc,MAAOA,cAKpC/8C,KAAKs4C,SAAW,SAAUyE,SACxB,GAAIz9C,KAAM,UAAYy9C,OACtB,OAAOv6C,QACL8D,OAAQ,MACRhH,IAAKA,OAITU,KAAKgwD,SAAW,SAAU9rC,OACxB,GAAI5kB,KAAM,UAAY4kB,MAAMzoB,GACxBwI,KAAOtI,EAAEmwB,MAAM5H,MACnB,OAAO1hB,QACL8D,OAAQ,OACRhH,IAAKA,IACL2E,KAAMA,KACN1E,SAAUG,eAAgB,uCAI9B,IAAI43D,mBACJt3D,MAAK+3C,eAAiBuf,kBAM1Bh3D,QAAQC,OAAO,eACZ0U,OAAO,uBAAwB,WAC9B,MAAO,UAAUgM,MAAOy2C,MAAOC,aAC7B,GAAIjZ,MAAMgZ,OAAU,MAAOz2C,MAC3B,IAAIy2C,OAAS,EAAK,MAAO,EACzB,IAAIz2C,OAASA,MAAMniB,QAAU44D,MAAO,CAElC,GADAz2C,MAAQA,MAAM22C,UAAU,EAAGF,OACtBC,YAOH,KAA0C,MAAnC12C,MAAM42C,OAAO52C,MAAMniB,OAAS,IACjCmiB,MAAQA,MAAM3Y,OAAO,EAAG2Y,MAAMniB,OAAS,OARzB,CAChB,GAAIg5D,WAAY72C,MAAM82C,YAAY,IAE9BD,cAAc,IAChB72C,MAAQA,MAAM3Y,OAAO,EAAGwvD,YAO5B,MAAc,KAAVJ,MACKz2C,MAAQ,IAERA,MAAQ,MAGnB,MAAOA,UAMb3gB,QAAQC,OAAO,eACZ0U,OAAO,kBAAmB,WACzB,MAAO,UAAUgM,MAAO+2C,OACtB,GAAItZ,MAAMsZ,OAAU,MAAO/2C,MAC3B,IAAI+2C,OAAS,EAAK,MAAO,EACzB,IAAI/2C,MAAO,CACT,GAAIg3C,YAAah3C,MAAMlT,MAAM,MACzBkqD,YAAWn5D,OAASk5D,QACtB/2C,MAAQg3C,WAAWz8B,MAAM,EAAGw8B,OAAO7tB,KAAK,KAAO,OAGnD,MAAOlpB,UAMb3gB,QAAQC,OAAO,eACZ0U,OAAO,SAAU,SAAUijD,WAAYt3D,OAAQuE,WAC9C,MAAO,UAAU8b,MAAO9hB,QACtB,IAAK8hB,MACH,MAAO,EAET,IAAIk3C,QAASv3D,OAAOyb,GAAG4E,MAAO9b,UAAUmX,mBACpC87C,QAAUD,OAAOh5D,OAAO,oBACxBk5D,cAAgBH,WAAWE,QAASj5D,OAIxC,OAHIA,QAAOszC,cAActsC,QAAQ,MAAO,IACtCkyD,eAAiB,IAAMF,OAAOh5D,OAAO,MAEhCk5D","file":"scripts.min.js"} \ No newline at end of file diff --git a/dist/scripts/templates.js b/dist/scripts/templates.js new file mode 100644 index 000000000..16aa92fca --- /dev/null +++ b/dist/scripts/templates.js @@ -0,0 +1,7 @@ +angular.module("bulbsCmsApp").run(["$templateCache",function($templateCache){"use strict";$templateCache.put("/views/autocomplete.html",'
    '),$templateCache.put("/views/bettyimage.html","
    "),$templateCache.put("/views/cms-notification.html",'

    '),$templateCache.put("/views/cms-notifications.html",'

    CMS Alerts

    No CMS notifications yet, click "New CMS Alert" to add one!
    No CMS notifications yet, check back soon!
    '),$templateCache.put("/views/cms-notify-container.html",'
    New Update: {{ cmsNotification.title }} Learn More Dismiss
    '),$templateCache.put("/views/content-list-detail-panel.html",'
    Status
    {{ article.published | dateTimeFormat:"ddd[, ]M/D/YY[ at ]h:mm a z" }} Draft Scheduled for {{ article.published | dateTimeFormat:"ddd[, ]M/D/YY[ at ]h:mm a z" }}
    Authors
    {{ author.first_name }} {{ author.last_name }},
    Feature type
    {{ article.feature_type }}
    Tags
    {{ tag.name | truncateByWords:3 }},
    Article ID
    {{ article.id }}
    '),$templateCache.put("/views/contentedit.html",'
    {{field}}
    {{error}}

    Error: article has no content type.

    '),$templateCache.put("/views/contentlist.html",'

    No content here

    {{ article.feature_type }}
    By {{ article.authors[0].first_name | truncateByCharacters: 1 }} {{ article.authors[0].last_name }} and {{ article.authors.length - 1}} others · {{ article.published | dateTimeFormat:"ddd[, ]M/D/YY[ at ]h:mm a z" }} Draft Scheduled for {{ article.published | dateTimeFormat:"ddd[, ]M/D/YY[ at ]h:mm a z" }}
    '),$templateCache.put("/views/contributions.html",'
    {{ contribution.contributor.getFullName() }} 
    $ {{ contribution.roleObject.rates.flat_rate.rate }}
    $
    Force Payment Submission

    $ {{ contribution.featureTypeRate }}
    $
    Force Payment Submission

    Min.
    ${{ getHourlyPay(contribution) }}
    Force Payment Submission

    Force Payment Submission

    '),$templateCache.put("/views/create-content.html",''),$templateCache.put("/views/devicepreview.html",'
    No image selected.
    '),$templateCache.put("/views/encode-status.html",'
    • Video {{video.id}}
      {{video.job_status.progress | number:0}}%
      0%
    '),$templateCache.put("/views/logged-in-user.html",''),$templateCache.put("/views/mainvideo.html",'
    '), +$templateCache.put("/views/modals/400-modal.html",''),$templateCache.put("/views/modals/403-modal.html",''),$templateCache.put("/views/modals/changelog-modal.html",''),$templateCache.put("/views/modals/confirm-trash-modal.html",''),$templateCache.put("/views/modals/description-modal.html",''),$templateCache.put("/views/modals/last-modified-guard-modal.html",''),$templateCache.put("/views/modals/line-item-export-modal.html",''),$templateCache.put("/views/modals/login-modal.html",''),$templateCache.put("/views/modals/preview-link-modal.html",''),$templateCache.put("/views/modals/publish-date-modal.html",''),$templateCache.put("/views/modals/pubtime-validation-modal.html",''),$templateCache.put("/views/modals/report-email-modal.html",''),$templateCache.put("/views/modals/temporary-url-modal.html",''),$templateCache.put("/views/modals/thumbnail-modal.html",''),$templateCache.put("/views/modals/version-browser-modal.html",''),$templateCache.put("/views/modals/video-thumbnail-modal.html",''),$templateCache.put("/views/nav.html",''),$templateCache.put("/views/pzones.html",'

    Promotion Zone Editor

    '),$templateCache.put("/views/pzones/carousel.html","
    Looks like this P'Zone is outdated
    "),$templateCache.put("/views/pzones/feature_type.html","
    Coming soon!
    "),$templateCache.put("/views/pzones/list.html",'
    Content IDActions
    '),$templateCache.put("/views/pzones/oneup.html","
    Looks like this P'Zone is outdated
    "),$templateCache.put("/views/pzones/reviews.html",'

    The "reviews" promoted zone has no available options.

    '),$templateCache.put("/views/pzones/twoup.html","
    Looks like this P'Zone is outdated
    "),$templateCache.put("/views/reportbar.html",''),$templateCache.put("/views/reporting.html",'
    '),$templateCache.put("/views/rolefield.html",''),$templateCache.put("/views/save-button.html",""),$templateCache.put("/views/taglike-autocomplete-field.html",'
    • {{ display(object) }}
    '),$templateCache.put("/views/targeting-editor.html",'

    Targeting Editor

    '),$templateCache.put("/views/targeting.html",'
    KeyValue
    '),$templateCache.put("/views/textlike-autocomplete-field.html",'

    {{model}}
    '),$templateCache.put("/views/toolbar.html",''), +$templateCache.put("/views/video-field.html",'
    60% Complete
    '),$templateCache.put("/components/autocomplete-basic/autocomplete-basic.html",'
    {{ selectedValue }}
    No results found
    '),$templateCache.put("/components/betty-editable/betty-editable.html",'
    '),$templateCache.put("/components/breadcrumb/breadcrumb.html",' No links to display in breadcrumb! '),$templateCache.put("/components/bug-reporter/bug-reporter-button.html",'
    '),$templateCache.put("/components/campaign-autocomplete/campaign-autocomplete.html",''),$templateCache.put("/components/campaigns/campaigns-edit/campaigns-edit-sponsor-pixel/campaigns-edit-sponsor-pixel.html",'
    '),$templateCache.put("/components/campaigns/campaigns-edit/campaigns-edit.html",'

    Campaigns > New Campaign {{ model.campaignLabel }}

    Sponsor Pixels
    '),$templateCache.put("/components/campaigns/campaigns-list/campaigns-list-page.html","
    "),$templateCache.put("/components/confirmation-modal/confirmation-modal.html",''),$templateCache.put("/components/custom-search/custom-search-content-item/custom-search-content-item.html",'
    Article ID: {{ model.id }} | {{ model.feature_type }}
    {{ model.title }}
    Published
    {{ model.published | date : \'M/d/yyyy, h:mm a\' }}
    '),$templateCache.put("/components/custom-search/custom-search-group/custom-search-group-condition/custom-search-group-condition.html",'
    {{ value.name }}
    '),$templateCache.put("/components/custom-search/custom-search-group/custom-search-group.html",'
    Total Results from this Group: {{ controllerService.groupsResultCountGet(groupIndex) }}
    '),$templateCache.put("/components/custom-search/custom-search-simple-content-search/custom-search-simple-content-search.html",'
    Manually Add Article to List
    '),$templateCache.put("/components/custom-search/custom-search.html",'

    Current List Based on Above Parameters Total Results in List: {{ customSearchService.content.count }}
    '),$templateCache.put("/components/date-time-modal/date-time-modal.html",''),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-error.html","{{ errorMessage }}"),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-field/dynamic-content-form-field-boolean/dynamic-content-form-field-boolean.html",''),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-field/dynamic-content-form-field-color/dynamic-content-form-field-color.html",' '),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-field/dynamic-content-form-field-date-time/dynamic-content-form-field-date-time.html",'
    {{ ngModel[name] | dateTimeFormat }}
    '),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-field/dynamic-content-form-field-image/dynamic-content-form-field-image.html",'
    '),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-field/dynamic-content-form-field-input-errors/dynamic-content-form-field-input-errors.html",'
    • {{ schema.label }} must be an integer. {{ schema.label }} must be less than {{ schema.max_value }} {{ schema.label }} is {{ form[name].$viewValue.length - schema.max_length }} characters too long! {{ schema.label }} must be greater than {{ schema.min_value }}. {{ schema.label }} is required! {{ schema.label }} must be formatted as an rgb hex. eg: "#000000".
    '),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-field/dynamic-content-form-field-input-label/dynamic-content-form-field-input-label.html",''),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-field/dynamic-content-form-field-integer/dynamic-content-form-field-integer.html",''),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-field/dynamic-content-form-field-invalid/dynamic-content-form-field-invalid.html",' "{{ schema.label || name }}" has an invalid field type "{{ schema.type }}"!'),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-field/dynamic-content-form-field-list/dynamic-content-form-field-list.html",'
    '),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-field/dynamic-content-form-field-object/dynamic-content-form-field-object.html","
    Schema is malformed
    "),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-field/dynamic-content-form-field-richtext/dynamic-content-form-field-richtext.html",'
    '),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-field/dynamic-content-form-field-text/dynamic-content-form-field-text.html",''),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-loaded.html",""),$templateCache.put("/components/dynamic-content/dynamic-content-form/dynamic-content-form-loading.html",' Loading dynamic content schema...'),$templateCache.put("/components/editor/editor-wrapper/editor-wrapper.html",'
    '), +$templateCache.put("/components/editors-pick/editors-pick.html","

    Editors Pick

    "),$templateCache.put("/components/evergreen-field/evergreen-field.html",'
    '),$templateCache.put("/components/filter-list-widget/filter-list-widget.html",'
    {{queryToLabelMappings[f.query]}}
    Clear filters
    "),$templateCache.put("/components/filter-widget/filter-widget.html",'
    {{queryToLabelMappings[f.query]}}
    Clear filters
    "),$templateCache.put("/components/generic-ajax-button/generic-ajax-button.html","'),$templateCache.put("/components/hide-from-rss-field/hide-from-rss-field.html",'
    '),$templateCache.put("/components/image-crop-modal/image-crop-modal.html",'
    '),$templateCache.put("/components/live-blog/live-blog-entries/live-blog-entries.html",'

    Entries

    {{ errorMessage }}
    No entries yet!
    1. Created by {{ entry.created_by | userNameDisplay }} @ {{ entry.created | dateTimeFormat }}. Last Updated by {{ entry.updated_by | userNameDisplay }} @ {{ entry.updated | dateTimeFormat }}.
    '),$templateCache.put("/components/notifications/notifications-edit/notifications-edit.html",'

    Notifications > New Notification {{ model.internalTitle }}

    '),$templateCache.put("/components/notifications/notifications-list/notifications-list-page.html","
    "),$templateCache.put("/components/polls/polls-edit/polls-edit.html",'

    Responses

    '),$templateCache.put("/components/polls/polls-list/polls-list-page.html","
    "),$templateCache.put("/components/promoted-content/promoted-content-article/promoted-content-article.html",'

    · No type set
    Not published

    '),$templateCache.put("/components/promoted-content/promoted-content-list/promoted-content-list.html",'

    Content List
    on {{ pzoneData.previewTime.toDate() | date: \'MMM d, yyyy @ h:mma\' }} Now

    Viewing a past list, past lists cannot be modified.
    Select an item below to finish your {{ pzoneData.action }} operation.
    {{ pzoneData.selectedPZone.zone_length - pzoneData.selectedPZone.content.length }} spots left
    • All {{ pzoneData.selectedPZone.zone_length }} spots filled, content below will not display
      {{ pzoneData.selectedPZone.zone_length - pzoneData.selectedPZone.content.length }} spots left
    '),$templateCache.put("/components/promoted-content/promoted-content-operations-list/promoted-content-operations-list.html",'

    Schedule {{ pzoneData.selectedPZone.name }}

    From: to:
    {{ deleteStatus.message }} Dismiss
    • {{ group[0].format(groupDateFormat) }} ({{ group[1].length }} Events)
      • {{ operation.cleanType }} @ position {{operation.index + 1}}
      Loading operations...
      '),$templateCache.put("/components/promoted-content/promoted-content-pzone-select/promoted-content-pzone-select.html",'
      Loading {{ selectedPZoneName }}...
      '),$templateCache.put("/components/promoted-content/promoted-content-save/promoted-content-save.html",'
      {{ pzoneData.unsavedOperations.length }} Unsaved Operation Operations'),$templateCache.put("/components/promoted-content/promoted-content-search/promoted-content-search.html",'

      Search Content

      '),$templateCache.put("/components/promoted-content/promoted-content-time-picker/promoted-content-time-picker.html",'
      '),$templateCache.put("/components/promoted-content/promoted-content.html",'

      Promoted Content

      '), +$templateCache.put("/components/reporting/reporting-line-items-edit/reporting-line-items-edit.html",'

      Line Items > New Line Item Edit Line Item

      '),$templateCache.put("/components/reporting/reporting-line-items-list/reporting-line-items-list.html",'
      '),$templateCache.put("/components/reporting/reporting-rate-overrides-edit/reporting-rate-overrides-edit.html",'

      Edit Rate Override

      $
      '),$templateCache.put("/components/reporting/reporting-rate-overrides-list/reporting-rate-overrides-list.html",'
      '),$templateCache.put("/components/reporting/reporting-roles-edit/reporting-roles-edit.html",'

      Roles > New Role {{ model.name }}

      Feature TypesRates
      {{ rate.featureType }}
      '),$templateCache.put("/components/reporting/reporting-roles-list/reporting-roles-list.html",'
      '),$templateCache.put("/components/sections/sections-edit/sections-edit.html",'

      Sections > New Section {{ model.name }}

      {{ LIST_URL }}
      '),$templateCache.put("/components/sections/sections-list/sections-list-page.html",'
      '),$templateCache.put("/components/send-to-editor-modal/send-to-editor-modal.html",'
      '),$templateCache.put("/components/special-coverage/special-coverage-edit/special-coverage-edit.html",'

      Special Coverage Lists > New Special Coverage {{ model.name }}

      {{ LIST_URL }}
      3x1 Image, 900px wide

      Content List

      Video Playlist

      Super Feature List

      '),$templateCache.put("/components/special-coverage/special-coverage-list/special-coverage-list-page.html","
      "),$templateCache.put("/components/static-image/static-image.html",'
      No image selected.'),$templateCache.put("/components/status-filter/status-filter.html",''),$templateCache.put("/components/super-features/super-features-edit/super-features-edit.html",'
      Please save article to see dynamic content tools!
      '),$templateCache.put("/components/super-features/super-features-list/super-features-list.html",'
      '),$templateCache.put("/components/super-features/super-features-relations/super-features-relations.html",'

      Child Pages

      {{ errorMessage }}
      No child pages yet!
      1. {{ relation.published | dateTimeFormat }} Status: {{ relation.status }} EDIT
      '),$templateCache.put("/components/super-features/super-features-tab/super-features-tab-item/super-features-tab-item.html","
      Super Feature ID: {{ superFeature.id }}
      {{ superFeature.title }}
      Published
      {{ superFeature.published | dateTimeFormat }}
      "),$templateCache.put("/components/super-features/super-features-tab/super-features-tab.html",'
      Current List Items in List: {{ superFeatures.length }}
      '),$templateCache.put("/components/template-type-field/template-type-field.html",'
      '),$templateCache.put("/components/title-modal/title-modal.html",'
      '),$templateCache.put("/components/top-bar/top-bar-base.html",''),$templateCache.put("/shared/copy-button/copy-button.html",' '),$templateCache.put("/shared/list-page/list-page.html",'

      {{ namePlural }}

      {{ field.title }}
      No {{ namePlural }}, click "Add {{ name }}" below to add the first {{ name }}!
      '), +$templateCache.put("/shared/non-restmod-list-page/non-restmod-list-page.html",'

      {{ modelNamePlural() }}

      {{ field.title }}
      No {{ modelNamePlural() }}, click "Add {{ modelName() }}" below to add the first {{ modelName() }}!
      '),$templateCache.put("/shared/video-list/video-list-video/video-list-video.html","
      Video ID: {{ model.id }} | {{ model.channel.name }}
      {{ model.title }}
      Published
      {{ (model.published | date_string_to_moment).format('M/D/YYYY, h:mma') }}
      "),$templateCache.put("/shared/video-list/video-list.html",'
      Current List Items in List: {{ videos.length }}
      There are no videos in this list, search for a video to add to playlist.
      ')}]); +//# sourceMappingURL=templates.js.1475009180807.map \ No newline at end of file diff --git a/dist/scripts/templates.js.1475009180807.map b/dist/scripts/templates.js.1475009180807.map new file mode 100644 index 000000000..59455c7c7 --- /dev/null +++ b/dist/scripts/templates.js.1475009180807.map @@ -0,0 +1 @@ +{"version":3,"sources":["../../.tmp/concat/scripts/templates.js"],"names":["angular","module","run","$templateCache","put"],"mappings":"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","file":"templates.js"} \ No newline at end of file diff --git a/dist/scripts/vendor.js b/dist/scripts/vendor.js new file mode 100644 index 000000000..785337682 --- /dev/null +++ b/dist/scripts/vendor.js @@ -0,0 +1,118299 @@ +/*! + * jQuery JavaScript Library v2.1.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-04-28T16:01Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// + +var arr = []; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + version = "2.1.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; + }, + + isPlainObject: function( obj ) { + // Not plain objects: + // - Any object or value whose internal [[Class]] property is not "[object Object]" + // - DOM nodes + // - window + if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.constructor && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + + // If the function hasn't returned already, we're confident that + // |obj| is a plain object, created by {} or constructed with new Object + return true; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + // Support: Android<4.0, iOS<6 (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call(obj) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + var script, + indirect = eval; + + code = jQuery.trim( code ); + + if ( code ) { + // If the code includes a valid, prologue position + // strict mode pragma, execute code by injecting a + // script tag into the document. + if ( code.indexOf("use strict") === 1 ) { + script = document.createElement("script"); + script.text = code; + document.head.appendChild( script ).parentNode.removeChild( script ); + } else { + // Otherwise, avoid the DOM node creation, insertion + // and removal by using an indirect global eval + indirect( code ); + } + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE9-11+ + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Support: Android<4.1 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + characterEncoding + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + nodeType = context.nodeType; + + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + if ( !seed && documentIsHTML ) { + + // Try to shortcut find operations when possible (e.g., not under DocumentFragment) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document (jQuery #6963) + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType !== 1 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + parent = doc.defaultView; + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent !== parent.top ) { + // IE11 does not have attachEvent, so all must suffer + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Support tests + ---------------------------------------------------------------------- */ + documentIsHTML = !isXML( doc ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (oldCache = outerCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + outerCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context !== document && context; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context, xml ) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // Apply set filters to unmatched elements + matchedCount += i; + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is no seed and only one group + if ( match.length === 1 ) { + + // Take a shortcut and set the context if the root selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.pseudos; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + }); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + }); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) >= 0 ) !== not; + }); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + })); +}; + +jQuery.fn.extend({ + find: function( selector ) { + var i, + len = this.length, + ret = [], + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter(function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow(this, selector || [], false) ); + }, + not: function( selector ) { + return this.pushStack( winnow(this, selector || [], true) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +}); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[1], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[2] ); + + // Support: Blackberry 4.6 + // gEBID returns nodes no longer in the document (#6963) + if ( elem && elem.parentNode ) { + // Inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof rootjQuery.ready !== "undefined" ? + rootjQuery.ready( selector ) : + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.extend({ + dir: function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; + }, + + sibling: function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; + } +}); + +jQuery.fn.extend({ + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter(function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments + if ( cur.nodeType < 11 && (pos ? + pos.index(cur) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector(cur, selectors)) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.unique( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter(selector) + ); + } +}); + +function sibling( cur, dir ) { + while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return elem.contentDocument || jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.unique( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +}); +var rnotwhite = (/\S+/g); + + + +// String to Object options format cache +var optionsCache = {}; + +// Convert String-formatted options into Object-formatted ones and store in cache +function createOptions( options ) { + var object = optionsCache[ options ] = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + }); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + ( optionsCache[ options ] || createOptions( options ) ) : + jQuery.extend( {}, options ); + + var // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = !options.once && [], + // Fire callbacks + fire = function( data ) { + memory = options.memory && data; + fired = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + firing = true; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { + memory = false; // To prevent further calls using add + break; + } + } + firing = false; + if ( list ) { + if ( stack ) { + if ( stack.length ) { + fire( stack.shift() ); + } + } else if ( memory ) { + list = []; + } else { + self.disable(); + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + // First, we save the current length + var start = list.length; + (function add( args ) { + jQuery.each( args, function( _, arg ) { + var type = jQuery.type( arg ); + if ( type === "function" ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && type !== "string" ) { + // Inspect recursively + add( arg ); + } + }); + })( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away + } else if ( memory ) { + firingStart = start; + fire( memory ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + // Handle firing indexes + if ( firing ) { + if ( index <= firingLength ) { + firingLength--; + } + if ( index <= firingIndex ) { + firingIndex--; + } + } + } + }); + } + return this; + }, + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + }, + // Remove all callbacks from the list + empty: function() { + list = []; + firingLength = 0; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( list && ( !fired || stack ) ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + if ( firing ) { + stack.push( args ); + } else { + fire( args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend({ + + Deferred: function( func ) { + var tuples = [ + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], + [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], + [ "notify", "progress", jQuery.Callbacks("memory") ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred(function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[1] ](function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .done( newDefer.resolve ) + .fail( newDefer.reject ) + .progress( newDefer.notify ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + } + }); + }); + fns = null; + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[1] ] = list.add; + + // Handle state + if ( stateString ) { + list.add(function() { + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[0] ] = function() { + deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[0] + "With" ] = list.fireWith; + }); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // Add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ) + .progress( updateFunc( i, progressContexts, progressValues ) ); + } else { + --remaining; + } + } + } + + // If we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +}); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend({ + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +}); + +/** + * The ready event handler and self cleanup method + */ +function completed() { + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + jQuery.ready(); +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called after the browser event has already occurred. + // We once tried to use readyState "interactive" here, but it caused issues like the one + // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + setTimeout( jQuery.ready ); + + } else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed, false ); + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + len ? fn( elems[0], key ) : emptyGet; +}; + + +/** + * Determines whether an object can have data + */ +jQuery.acceptData = function( owner ) { + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + /* jshint -W018 */ + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + +function Data() { + // Support: Android<4, + // Old WebKit does not have Object.preventExtensions/freeze method, + // return new empty object instead with no [[set]] accessor + Object.defineProperty( this.cache = {}, 0, { + get: function() { + return {}; + } + }); + + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; +Data.accepts = jQuery.acceptData; + +Data.prototype = { + key: function( owner ) { + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return the key for a frozen object. + if ( !Data.accepts( owner ) ) { + return 0; + } + + var descriptor = {}, + // Check if the owner object already has a cache key + unlock = owner[ this.expando ]; + + // If not, create one + if ( !unlock ) { + unlock = Data.uid++; + + // Secure it in a non-enumerable, non-writable property + try { + descriptor[ this.expando ] = { value: unlock }; + Object.defineProperties( owner, descriptor ); + + // Support: Android<4 + // Fallback to a less secure definition + } catch ( e ) { + descriptor[ this.expando ] = unlock; + jQuery.extend( owner, descriptor ); + } + } + + // Ensure the cache object + if ( !this.cache[ unlock ] ) { + this.cache[ unlock ] = {}; + } + + return unlock; + }, + set: function( owner, data, value ) { + var prop, + // There may be an unlock assigned to this node, + // if there is no entry for this "owner", create one inline + // and set the unlock as though an owner entry had always existed + unlock = this.key( owner ), + cache = this.cache[ unlock ]; + + // Handle: [ owner, key, value ] args + if ( typeof data === "string" ) { + cache[ data ] = value; + + // Handle: [ owner, { properties } ] args + } else { + // Fresh assignments by object are shallow copied + if ( jQuery.isEmptyObject( cache ) ) { + jQuery.extend( this.cache[ unlock ], data ); + // Otherwise, copy the properties one-by-one to the cache object + } else { + for ( prop in data ) { + cache[ prop ] = data[ prop ]; + } + } + } + return cache; + }, + get: function( owner, key ) { + // Either a valid cache is found, or will be created. + // New caches will be created and the unlock returned, + // allowing direct access to the newly created + // empty data object. A valid owner object must be provided. + var cache = this.cache[ this.key( owner ) ]; + + return key === undefined ? + cache : cache[ key ]; + }, + access: function( owner, key, value ) { + var stored; + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ((key && typeof key === "string") && value === undefined) ) { + + stored = this.get( owner, key ); + + return stored !== undefined ? + stored : this.get( owner, jQuery.camelCase(key) ); + } + + // [*]When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, name, camel, + unlock = this.key( owner ), + cache = this.cache[ unlock ]; + + if ( key === undefined ) { + this.cache[ unlock ] = {}; + + } else { + // Support array or space separated string of keys + if ( jQuery.isArray( key ) ) { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = key.concat( key.map( jQuery.camelCase ) ); + } else { + camel = jQuery.camelCase( key ); + // Try the string as a key before any manipulation + if ( key in cache ) { + name = [ key, camel ]; + } else { + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + name = camel; + name = name in cache ? + [ name ] : ( name.match( rnotwhite ) || [] ); + } + } + + i = name.length; + while ( i-- ) { + delete cache[ name[ i ] ]; + } + } + }, + hasData: function( owner ) { + return !jQuery.isEmptyObject( + this.cache[ owner[ this.expando ] ] || {} + ); + }, + discard: function( owner ) { + if ( owner[ this.expando ] ) { + delete this.cache[ owner[ this.expando ] ]; + } + } +}; +var data_priv = new Data(); + +var data_user = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + data_user.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend({ + hasData: function( elem ) { + return data_user.hasData( elem ) || data_priv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return data_user.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + data_user.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to data_priv methods, these can be deprecated. + _data: function( elem, name, data ) { + return data_priv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + data_priv.remove( elem, name ); + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = data_user.get( elem ); + + if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice(5) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + data_priv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + data_user.set( this, key ); + }); + } + + return access( this, function( value ) { + var data, + camelKey = jQuery.camelCase( key ); + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + // Attempt to get data from the cache + // with the key as-is + data = data_user.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to get data from the cache + // with the key camelized + data = data_user.get( elem, camelKey ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, camelKey, undefined ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each(function() { + // First, attempt to store a copy or reference of any + // data that might've been store with a camelCased key. + var data = data_user.get( this, camelKey ); + + // For HTML5 data-* attribute interop, we have to + // store property names with dashes in a camelCase form. + // This might not apply to all properties...* + data_user.set( this, camelKey, value ); + + // *... In the case of properties that might _actually_ + // have dashes, we need to also store a copy of that + // unchanged property. + if ( key.indexOf("-") !== -1 && data !== undefined ) { + data_user.set( this, key, value ); + } + }); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each(function() { + data_user.remove( this, key ); + }); + } +}); + + +jQuery.extend({ + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = data_priv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = data_priv.access( elem, type, jQuery.makeArray(data) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return data_priv.get( elem, key ) || data_priv.access( elem, key, { + empty: jQuery.Callbacks("once memory").add(function() { + data_priv.remove( elem, [ type + "queue", key ] ); + }) + }); + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = data_priv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +}); +var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); + }; + +var rcheckableType = (/^(?:checkbox|radio)$/i); + + + +(function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Safari<=5.1 + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari<=5.1, Android<4.2 + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<=11+ + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +})(); +var strundefined = typeof undefined; + + + +support.focusinBubbles = "onfocusin" in window; + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = data_priv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !(events = elemData.events) ) { + events = elemData.events = {}; + } + if ( !(eventHandle = elemData.handle) ) { + eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !(handlers = events[ type ]) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = data_priv.hasData( elem ) && data_priv.get( elem ); + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[t] ) || []; + type = origType = tmp[1]; + namespaces = ( tmp[2] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + data_priv.remove( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf(".") >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf(":") < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join("."); + event.namespace_re = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === (elem.ownerDocument || document) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && jQuery.acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && + jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( (event.result = ret) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.disabled !== true || event.type !== "click" ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) >= 0 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, handlers: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + } + + return handlerQueue; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: Cordova 2.5 (WebKit) (#13255) + // All events should have a target; Cordova deviceready doesn't + if ( !event.target ) { + event.target = document; + } + + // Support: Safari 6.0+, Chrome<28 + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } +}; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + // Support: Android<4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && e.preventDefault ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && e.stopPropagation ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// Support: Chrome 15+ +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// Support: Firefox, Chrome, Safari +// Create "bubbling" focus and blur events +if ( !support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = data_priv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = data_priv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + data_priv.remove( doc, fix ); + + } else { + data_priv.access( doc, fix, attaches ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + var elem = this[0]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +}); + + +var + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, + rtagName = /<([\w:]+)/, + rhtml = /<|&#?\w+;/, + rnoInnerhtml = /<(?:script|style|link)/i, + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /^$|\/(?:java|ecma)script/i, + rscriptTypeMasked = /^true\/(.*)/, + rcleanScript = /^\s*\s*$/g, + + // We have to close these tags to support XHTML (#13200) + wrapMap = { + + // Support: IE9 + option: [ 1, "" ], + + thead: [ 1, "", "
      " ], + col: [ 2, "", "
      " ], + tr: [ 2, "", "
      " ], + td: [ 3, "", "
      " ], + + _default: [ 0, "", "" ] + }; + +// Support: IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: 1.x compatibility +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName("tbody")[0] || + elem.appendChild( elem.ownerDocument.createElement("tbody") ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute("type"); + } + + return elem; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + data_priv.set( + elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) + ); + } +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( data_priv.hasData( src ) ) { + pdataOld = data_priv.access( src ); + pdataCur = data_priv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( data_user.hasData( src ) ) { + udataOld = data_user.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + data_user.set( dest, udataCur ); + } +} + +function getAll( context, tag ) { + var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : + context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : + []; + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +jQuery.extend({ + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + buildFragment: function( elems, context, scripts, selection ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + // Support: QtWebKit, PhantomJS + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement("div") ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: QtWebKit, PhantomJS + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( (elem = nodes[ i++ ]) ) { + + // #4087 - If origin and destination elements are the same, and this is + // that element, do not do anything + if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( (elem = tmp[ j++ ]) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; + }, + + cleanData: function( elems ) { + var data, elem, type, key, + special = jQuery.event.special, + i = 0; + + for ( ; (elem = elems[ i ]) !== undefined; i++ ) { + if ( jQuery.acceptData( elem ) ) { + key = elem[ data_priv.expando ]; + + if ( key && (data = data_priv.cache[ key ]) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + if ( data_priv.cache[ key ] ) { + // Discard any remaining `private` data + delete data_priv.cache[ key ]; + } + } + } + // Discard any remaining `user` data + delete data_user.cache[ elem[ data_user.expando ] ]; + } + } +}); + +jQuery.fn.extend({ + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each(function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + }); + }, null, value, arguments.length ); + }, + + append: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + }); + }, + + prepend: function() { + return this.domManip( arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + }); + }, + + before: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + }); + }, + + after: function() { + return this.domManip( arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + }); + }, + + remove: function( selector, keepData /* Internal Use Only */ ) { + var elem, + elems = selector ? jQuery.filter( selector, this ) : this, + i = 0; + + for ( ; (elem = elems[i]) != null; i++ ) { + if ( !keepData && elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem ) ); + } + + if ( elem.parentNode ) { + if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { + setGlobalEval( getAll( elem, "script" ) ); + } + elem.parentNode.removeChild( elem ); + } + } + + return this; + }, + + empty: function() { + var elem, + i = 0; + + for ( ; (elem = this[i]) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map(function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + }); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = value.replace( rxhtmlTag, "<$1>" ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var arg = arguments[ 0 ]; + + // Make the changes, replacing each context element with the new content + this.domManip( arguments, function( elem ) { + arg = this.parentNode; + + jQuery.cleanData( getAll( this ) ); + + if ( arg ) { + arg.replaceChild( elem, this ); + } + }); + + // Force removal if there was no new content (e.g., from empty arguments) + return arg && (arg.length || arg.nodeType) ? this : this.remove(); + }, + + detach: function( selector ) { + return this.remove( selector, true ); + }, + + domManip: function( args, callback ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = this.length, + set = this, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return this.each(function( index ) { + var self = set.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + self.domManip( args, callback ); + }); + } + + if ( l ) { + fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + if ( first ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( this[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + + if ( node.src ) { + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); + } + } + } + } + } + } + + return this; + } +}); + +jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: QtWebKit + // .get() because push.apply(_, arraylike) throws + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +}); + + +var iframe, + elemdisplay = {}; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var style, + elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? + + // Use of this method is a temporary fix (more like optimization) until something better comes along, + // since it was removed from specification and supported only in FF + style.display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = (iframe || jQuery( "