From 72e2f0bf18b8ade701a55ffe40521d598d598059 Mon Sep 17 00:00:00 2001 From: redPanther Date: Sun, 26 Feb 2017 15:30:10 +0100 Subject: [PATCH 01/29] check config when writing (#405) * check config when writing * integrate #403 --- CompileHowto.md | 4 ++-- libsrc/jsonserver/JsonClientConnection.cpp | 4 ++-- libsrc/webconfig/CgiHandler.cpp | 27 +++++++++++++++++++++- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/CompileHowto.md b/CompileHowto.md index 80bed57e..74f56b94 100644 --- a/CompileHowto.md +++ b/CompileHowto.md @@ -107,8 +107,8 @@ To generate make files on OS X: After which you can run cmake with the correct qt5 path: ``` -cmake -DCMAKE_PREFIX_PATH=/usr/local/Cellar/qt5/5.7.0 -DCMAKE_BUILD_TYPE=Release .. -``` +export QVER=$(find /usr/local/Cellar/qt5 -type d -name "5.*" | sort -n | head -n1) +cmake -DCMAKE_PREFIX_PATH=$QVER -DCMAKE_BUILD_TYPE=Release ..``` ### Run make to build Hyperion The `-j $(nproc)` specifies the amount of CPU cores to use. diff --git a/libsrc/jsonserver/JsonClientConnection.cpp b/libsrc/jsonserver/JsonClientConnection.cpp index 6fa626ae..1cc52db8 100644 --- a/libsrc/jsonserver/JsonClientConnection.cpp +++ b/libsrc/jsonserver/JsonClientConnection.cpp @@ -1028,7 +1028,7 @@ void JsonClientConnection::handleSchemaGetCommand(const QJsonObject& message, co // read the hyperion json schema from the resource QFile schemaData(":/hyperion-schema-"+QString::number(_hyperion->getConfigVersionId())); - + if (!schemaData.open(QIODevice::ReadOnly)) { std::stringstream error; @@ -1039,7 +1039,7 @@ void JsonClientConnection::handleSchemaGetCommand(const QJsonObject& message, co QByteArray schema = schemaData.readAll(); QJsonDocument doc = QJsonDocument::fromJson(schema, &error); schemaData.close(); - + if (error.error != QJsonParseError::NoError) { // report to the user the failure and their locations in the document. diff --git a/libsrc/webconfig/CgiHandler.cpp b/libsrc/webconfig/CgiHandler.cpp index ff09192f..3796f135 100644 --- a/libsrc/webconfig/CgiHandler.cpp +++ b/libsrc/webconfig/CgiHandler.cpp @@ -101,7 +101,32 @@ void CgiHandler::cmd_cfg_set() if (error.error == QJsonParseError::NoError) { QJsonObject hyperionConfigJsonObj = hyperionConfig.object(); - QJsonFactory::writeJson(QString::fromStdString(_hyperion->getConfigFileName()), hyperionConfigJsonObj); + try + { + // make sure the resources are loaded (they may be left out after static linking) + Q_INIT_RESOURCE(resource); + QJsonObject schemaJson = QJsonFactory::readSchema(":/hyperion-schema-"+QString::number(_hyperion->getConfigVersionId())); + QJsonSchemaChecker schemaChecker; + schemaChecker.setSchema(schemaJson); + if ( schemaChecker.validate(hyperionConfigJsonObj) ) + { + QJsonFactory::writeJson(QString::fromStdString(_hyperion->getConfigFileName()), hyperionConfigJsonObj); + } + else + { + std::string errorMsg = "ERROR: Json validation failed: \n"; + for (std::list::const_iterator i = schemaChecker.getMessages().begin(); i != schemaChecker.getMessages().end(); ++i) + { + Error(_log, "config write validation: %s", (*i).c_str()); + errorMsg += *i + "\n"; + } + throw std::runtime_error(errorMsg.c_str()); + } + } + catch(const std::runtime_error& validate_error) + { + _reply->appendRawData (QString(validate_error.what()).toUtf8()); + } } else { From a76abdaafef25838ea3b20e833119f76b1dec2bd Mon Sep 17 00:00:00 2001 From: redPanther Date: Sun, 26 Feb 2017 20:55:41 +0100 Subject: [PATCH 02/29] add calculation of max power consumption to led confi (#406) --- assets/firmware/arduino/mega_pwm_led_driver.fzz | Bin 0 -> 13150 bytes assets/webconfig/content/conf_leds.html | 1 + assets/webconfig/i18n/de.json | 9 +++++---- assets/webconfig/i18n/en.json | 11 ++++++----- assets/webconfig/i18n/es.json | 9 +++++---- assets/webconfig/js/content_leds.js | 3 ++- 6 files changed, 19 insertions(+), 14 deletions(-) create mode 100644 assets/firmware/arduino/mega_pwm_led_driver.fzz diff --git a/assets/firmware/arduino/mega_pwm_led_driver.fzz b/assets/firmware/arduino/mega_pwm_led_driver.fzz new file mode 100644 index 0000000000000000000000000000000000000000..c1a97cbe45489076a72a3e4c77a2a768bfa63850 GIT binary patch literal 13150 zcmZ|0WmH>j&^C&@yB8?#ZpB@TL(t$*+@TaFP@ELEmO_C7!QI_mid%7q0>$lwKJRIZ6+c@#6Ynt^-gwi&S*Jrmw1fV`4U zVW}5yv_XbJ!UOTcrw4j`L9Op7h)hVRjS9ZMWC~;>Lxe(vHU?HVo;TLpSJ%e^P1$l> z-nk0Xx{7I!_H_WVJ&o(;FlXMqp%*E8!mV|opcmcD_S(;iNr%bn7D ze{b;z^K<`)k;e;XH-VM_-*WNRk_g>5Q8kP6%SW?&ha$rG^2?Bin#H}olb;ii1ltH^ zr+i4D*Ob~>ch36f92a8XQ`4Np1l8`%tUi!~`0~i+Pmq3xXqL%%#q-^VyW5?Od!GcK zgpmZ>7xx(o+Zy$e<)e=E=jx&m{03~>n!Skx;ET>vb>{SiTIeUjh6Bzwsw_fqDtE#1%vm9DDjPLA8RK zhiOJTt6#B?KAo@5_;y#SziW zCcdNV`Jm^ox2{vq9uHgk=uVdpWi6sDkR0^0xtx<{xl8>VqS;#gk+T{gOJ}-pmTnqD zwpdm`#WN7?<=g4|3-u$3=ez5>>*~M-y%Els-FKPGhCvFs6NhIUnP<-vSy_8>S6ryN zPk#fRWM?~0pOf`I-xPac|IFUo|Gk>_u$ zuK(;jyI1*N8gkZiT*pc2Ctza}&WLir-`My}I$l;}4hTr-08Tz`2>_d#Le?`GHy$9! zRW4*=ya8f=%kJDM{aCV5jTIcVh|dk2`b9aAgDEm89Kn?0V01@nl`!mWJkmj0n5r4) z8Ui(kAF=PSO8J;15NZX~PnA zzJFI$ZmEnqwr4W@gn(mmfm~#DZ$!1E;t1^@3s4--z#z#&{wG8x>Ex;pKDrj$){dJd zge2_3j)x|sAPcgrrqaVmI00~#!AOau-GDi7YKoj)zj;kc3cF;;F(yhM6K8#BatQ2l z?!^^<>!WuEmkp&jffG}W9bCe!8h0XLn|bf7`|}_F%f{B6RrK@o<5tr)X@Q%+rbX8; zTAnXyt1ycJ-%GGFugXi*^DX(KSalU3>liG7%4F)X(v9f!qrrJTG-iOeLhly1272Gf zrlWguDTGDim~&KhQJ}N78}~~%r+w&-#yNxZc>^s&`hKj>1I)PlP#fT427padowU6v ze4+PB! zSGvKuovX!NNJ51lx?qie!wHe`BO<#-q5rnK#iQsXBJ8Z{wD!S-$Ue{{_&57v;I3S_ z6{V_+`k`Q%ae79=ZP=~gP<6u*cTYvqh=S-jKtHOaeNoO@lg!>y#Nl8ID<;+FD7*_wu&+ffUF+%kI3g{Xys-3)rpQC^X>=X~J}6c@YCi-5|( zmNXq4c@0lfdV~wt#7ET?YiC$x2u6QqbVE}}S-PC-HHMc~Z`!bw+&}pW1B|?ZTFVno zVhg7jI{5WDjFp6`Ux>`Pu^hdu^U-@rzK6w@mtypHx9pb;qkwd+D^u(+vbWSfiV|uUyj%Jd%u;x* z$N{<(zdSxXYkFnF*h%xE56x@{zbyG^(Xw2*ChzGE!HRk?2eFL zQWLd&Ul=U9@!MW!J_Kaw1@?kuAowU=ktTBN9;p25S{(8w^=9n2fBff7sNQkEc;qc8 zPWZ-0{6p_}q-_RW^}p8Zly4l=rVja~_~p2rp5q2cx=zabbqnaJOc0Q{s%hD8qw8rQ zQ+RPqq3|U7YEuBV^FcZBtuL~!H~9KrCVUmKDLMzE{rkf{{=t#gn`0vD5Btnj-YkC( zLnR7wBNT}KeEORvR#i+s%o} zF?;A0<$LZ=^b)$4j~}kC&VM3x?`eFU__<>let7tBY#!Kg>pO=fn)M{w@u2m@1pM*j z_xLZTj=6Rr@;39O5*HE}F411!u& z?a{HPZBm+^0YqvKiU0<+Iu04gAB2&-wH6#xq}44=`PA z_%T42jJbSI5Z&|;V!^>tQJ%fCQ%BTVd2-dqP&1HN@nb#<@%H6q{pIUZ#r??h4LSPR zORL8sC4}0!MW&v~z`%aFR95q8xw%1Rr%I!df6eFoy2W&Oizx8p3I^=?Z!^HGTa_+k z60utvZJ|WhF04`uzuunEkcN#0RAv~iSIN@SRjjA!eNwDaXp*JM0CIeOno~I#JR_$& zNI56Q>SfdO6ka^n$AX5o9jgJL2-L3Ak|={tV(Az^dEYe}immxXJ0_&5XXTbHr6p*o zdRI_sKSB2HBMR+C7>HYyrifUiqU*Wp$5AUd)h?O^w7m}eeuT{P=wvd;1U&sHX51ao zTBZ0jGA$@6vQAFFEM;YR%l8vLohY6)k3f*U^KQ#cE_qWP5gJyYxQp-~M)VfFRYq<) zh?#0USYK>7^&Jn%Tb5!R5}thUW%;c6KGy?_DcRb0QW#k$YHBuoT=@HU!VS`63L$5I zKO4Uh?z>nh%HWwU}{Tri~(Q|j8s1nQ~+{A zj8Nam(YL65{#Y<5@dC$iw};Kg-1$+^?QU=D->e*!(t_Go z$28gbE+%dyz9Ctz8u~wfjH~)gB>vKhpm#8na~b(~$)mv<`*_Lu{ITJB0(+scpf@IH zEitIwb`tP-Ii=4nS-~Lk;{R6;1INnq`EK8VgnDovDoEqH+bf_b3o^AI$v@36BT${y z>ogMgD|gyhM48o*GswcyTZJMVj0?h$d2Yd+u=Stj|frN zESYaIzG|+sEv3~DINM@oP7#k^#Wmw#mrkE*I<$^*8-NqhZ{zEvrR_AnQZ6;QlE(Nm z3n2!!{f?{o=6}^C_4a&rV7(7UEPKKK>Rgap5?pn6xOHX@UB*kOpnDsV7EW1KvBrEc z``MKq_!KgSD5TEF0Ss8FhC$|f#ghNQJZj*R1F(%Eu3~NbV%BGwioRf0fl3{5^kjG9 zqink$A{*`^bkY2;;I{1h_aMZbdc1tVwx!#{Sr}m3x&Kw7|CI|iSxklaJqObMhU^|B zp*;#VGw|V?6RYue@$?Pa1?77|b@d5i!6U`h`!{=Qe_yU|y{fXsRs-$`nj_00w>G1d zyPNO@IxS~?C^p+7@Qc-EBj;&NHz>rX0SRV-pyc(HccBL}BE(};oy2CkHI98qp6{#Zu&1d>Nl-w2Q+pa8 z!I6@Ht_GR%**h`?W8vpPc#Jhm6`81x@6erK$E3gZTQlxUh_YIM-uT3T5)98n7wG}s zs#o1;46t2a*M8@Gr}GJ7h#UMj)&bCMFv z!D+4co_82=XgFEs9E$RD%5}Ou-xFo1V6XJve9j)&s*9`g$Ezq4DV`@ z{;vP)-BtfqxvnvHnWM*t{_5&>(~DUoq_{qPbVqEk#18JAy*WS0%}-G>pwn?dcCS9< z{UHSLy42=k_L}jTjH8p@i99$924fy>EgKEfA zxSK;lDq7nT6s@@B;!xPNaC#*8^hcJp0ez&@D9xNV`{17P&G#r}Ru2<_A$fKMJBAdI zbVjh*?7vsDdDajC3jaW zlARS-Av0D!EQxQ+4JXgmOmvLLsu{tIlG+AOO^?@p_ZP8{wd^bE` z*Dmt?%uXkJ<#dH$>d&cnnG3Pj&Lee>UsKQZ{4O4I=Dtt{UO^;-7HI z%J4PsE(&egoo&o%jW3p5Zs2HT8LG1wl)Y4~vEUzfZbzO5tNfk2)+5wX7eaf4eE@cQ zNQGBd@~E(fP!O2B!6jYduNfSTf-^1BM_`_KL&N9nP zJ+k`r=9NU+DkmvvR(A|KtVDyT^f0SAdH+lq-g%%^s_Ox~iQ1=@=BlsO1_l6b8^P6c0%+{z^QzG6KmbWw;u5~wm z<05ux>`5WmUP8oU2ms$J_rA$*pUc!KlF^n0{z~ILm`yv({7DqL*xX_6pkSbhR6Oa% zKt5fXG0Aj~bCQNQc``|zZ*-7?u9J2^@^FwE{m~%7G|Xvg z;1_?o``HF=AO#W)?wsK08$arBD-ERQQU%VQdM1$7f_!$We65(6)ZAI zFlL8Dp&wZ6Pa(}x`no@ocr=8mU|F1$QxS9OQA*>zepcV%1e&f0LQyB)>TqX|7!am& z@NC3+-aZff;hXF)wd<@`VFobvUfb$E#}94U%OCFe>!{PK9wtGWDN=Q7^uQPDvRrl` z*HEYy_6$z{uO3qdemC&KA^9%07+9F;hzr+CqtPJ_E$uT=h(E58NYA&5W>Y5=VnWtK+Qv^ZJi0`3d!AY;8`hpu8ys95jH`SXxvpsvNi*A~>hD%klK2(9<>EtX zr8dezzqof?)5Zp9@;mP%?qsm(aM66|U*GtxZ%_VgM)XG=ZV|L8#+N$03rUC_+TaF?9Yp9VfDY;Wjz?FdZ++jxaB z5#3wD&bR;S%db&C5eg&WBOg@oZF74)6|}S;TLX*lntxQgX&I@YIT9zjs;37_Tg9OH7a{ zhaMss97OmVlX`|4xX7&NLMa%B}| zbk`lsvWqV$#g*;m&y(;5AQqQ=D_oYgsnQPjMidBwQpC3rrz*?>0*58}`M=sctX7pM zrN8NC@-7vG$3g7$QCyOI05HlY{-l}4y!=4RKFQymvSMkM+{g!&P$eRYpXu`xia&R& zlA~!$^ZryTMcdRn^L|f@!4eKeQBkBJz%XLf{`r|Wmsk#}$pk4(;e;P^F@y};p~ zeohpyXfi$(&n0OLVDFuODpHKXL~6#k%TpEJumhN`QBy(}2oI_Xw9UQYO2X+;jq;)D z-$XuuY5~$@xxRp;5`(uqp89|Y*YsoWe)}Qg`H=PsdW9k1+_?wKVp0-5qS93Jey%u) zJ?`R4F`socrHGw;Og!^1meelL5e`w}>zOZYzr~$43+Q>wMTRP@E8p|}4b4sbH_cfrdQ*>pR*NsLqILi?8Phg9xe13ajrHrXWaf?rt1c$x@ zk8;zzvGkV*?{W$$3c5(?f<-(EWT)wVBD4(-cn4)_K-}158jcn-$S8e3DTK#zB z8tNUwj3K2#^(Mc8ndB6G`C;l+sNuRJ6_@k1a(m4d$STlAXT(cqx-M`8p!9hf5Qjnz z!tC8(_OP`~qEJ9O^D4h$-q0MTz9#@o~TRnpMc=V z$y0*Q)P&x6c)v(PB67PgaFL5&txQ-koZc#-7{aA_O2_TcBWrYE`&mKR;3+OCzdKkP zYTFI;&pdQc(hn$w>v+Da~5{*;Y-onCu9vS%FT;!skhU%eA&+T1~B_^oUoOVlR>%6_9yuKyj5gG7zkJC6IJ_4$+^)vF(GVi)iAu_*?f=@Auo-Q8sC!-CYkYW@xwGc=vv(bcWI9vQsb5J;&v`Zh- zV5=H}DcXn7(%UYL1~;c?FgbydRBR~DwBRYW^w4CcxP;i!`4zV&KB`V}X_PGl4_5e> zO5H;VN8fj1fA@}%KKUsIT+u4WyZ zwR_XDY^9>N#E`sxA&Jo*FuU0H#Ho>zOxRU2eN69KH3H1ztKK+j zQ03X-$0(04om?C8;{H|86#(q2FdWTNxVn!v?oVe}M_>3H|th^Z?~VFc2SlXwqA|O-bNa4Ee_%(Aem`Q~{yZC_DD>G|#+O(U}u?Fb?vP?*s<46PPSOnFvbpN+rZvG1|CEFL0Kh zOtqNxY_;U4VU-zTS(&lV`7_M`8k#P<`nt1al?64}jEqw67~B_u`(BPH|1~xaQ$MAE1sH%4G6jq{c))+zg$E_70)!!* zB4j#kc8BX7I)w4At6836g)4W<$O65v=}=U&j?Y708wCRkKl;MUS{yCpYbatJ+gc+I z3Prk|AV7SVniRS+TF66{pugN+r1j2>jc*eE#7kN6=LtM8qaY>yug@DHnj;-@W#m#L z`spiw#w(;%`o8Z#o0j4P{%uo=llOvMGFDnL zRhmad);mpAjf*?Bcs3rM`@NOQO3PcOWp%ugp<#Z58>~{|q^fWi`K%fN?<7+}ne_9F z41-i}*8+Xo44RN_HR#xATvUA}(wVCl$?1BatB97X2#`k0T{X+f%MPo-Q!;-aQ23Lhc)20de62mzKOESB6V{d=X*pj&Q*rDcY?Xn7dI zrP~@N&qU}(tQd(Q4aY_kra|YZjn|K{j^~{$x$uc~rXeM&)~fvIiya?+If^YoN-0yc zn*0|Fz2xMmbjSzb2}-VNFZ93@0ekoUuY)@p+gm3vLJURN$1ptH8P|bdS7|zwF-6a^ zvZhR|tIZ5z*0iCFIK#54z0~;~0(Ti+0+*6c1;ZF}2k%s(iBst5e>@!0^M;%3SwV&g zew6$Li)zmDi~^Xub1u{QNcfSKnU!&4mbxN7y12sd(J);y`Fh8A+i zEBpn2xM}EfC(o;cLHUUg6H;n~D8n20BnP5{s1Ub)T}`{0*&h-WJ|N*-#lWr|Y_t$4 z6GaPg`rAQ41vi2Nd*mJk@=76cxBc?`cdwgg<1mzRJpdB@mzabz`Fns_g^hb&w5 zKQzS^vvPjm^tvskP{$|~bg zAExzntGnHo;8GzZny|$pP?xJ3sVGEysNK>3e_al-V;Vg0i#~l{AaQOy`}uboEB%!v z7By;;1k-Iwq@-f7lSc6;eGCFK5t(BZ&lEGcuHkYTi`Dvp5?6LwT_uJVf&651En*!+ zZenc1VX@Z(6ahdVHoFmKWRU#z$ZWPr4GZ1tLXOT_qZ-8^Oe_O?2nA}T37z=`GHNB1 zf5Mf@6s#qQi^BCMOd-cM)c-!daI5oceeta~3|x%Cjp;A9Pl8h(FkUsjZ<&XP1C~Yy z)tqRTWATv%i{{&Lpgchu$`ep>$Ny$`jLU6zdf?*1P#!A-k4s5#_|oMgNE>>H^|&}Z zU9lGgfGEqDqOqKc;ZPGVl^Tjf&9LmA-S=US*TImM{x89!te3Z#6XK<SW&+a@?~1Tg71a4v6e;mj&G=omH*vK7J3b^rGa!f# zN>6mndeEniFeo$Rj5H0Edt~S1dr)j@(Oe+wOS9%nqE1?7O^MYsO7KD5mWjYFe@EfF z_)+1HVSIpX5><*?ayHD5ssVxkVzo5))fq90ml6{BlvIJR6FAf)aXVfB?eq6Bvn<*# zeSh2|H<_}!){LUt%M|lLHii2FedQx5C+@l6)Tm5;2Nu2v<^shaYlop+Xe4=c%gUYY z5gHq49t1+q(=OmgWhmoG1DdGm(%)~-3)`;j=T#;mEN~=qp@I+qv`86Xn1`dyna7_U zLG30hCOI!`YsMjENG-Rpa&(?K~ zZTJI4i&ZbF3H9cA<=ciW2C1Z%46OW@_cQmbf$ah9ZLLP0gi@I<8%GtmSM$FZaotUj zwk2GgzY#-3@N-S~k8;LGY8Iitc(`hb=lJN6J?2dHMlY!2so>sw<`N^Iu{|KLr2KK6 zc-{8JSZ6Q5@>r5i20v z?4GX<;NWz&xS$NeAR}-)2JgHtg%Rk?ZOFzCW|mH^KzHdx5>mwd4qIR0FaeKDl0#_@ z9B?#$8#^8g#!54m|CvfJ@D4L4ojfcT>5iW`eHr!qgw!X0MCou-{Aq`-PU?M-u+qWB z-?SeCUcyRaRY|~js`*uJrLWG69oe;CvXg-0jpa7RoKtRXG6Pp=l%xs?hxV@FQ_{kg z&iXlLDOK$Q2hx39!>f}VmD0u$TNfyZ=x4~I&XO=&!&PXa{GVZ32QuKw8TT9T4AS4B zaQ#*#Nt!e8$g|y9g*kI8{8IyWt7mUjON^B&^`3l2w7A$m(~Q(H*lj9+3xGuSyLS8- zA8|zTEt?zSudvlPbNE=c0|o#O0#7#!_*VqB`5>-W_^}u<9qJ&AL->&xF;BQj=Mn+} zS9vzr%$eCLSa+%OTFJPh)i(h1fsl1^%adL}UJG^}cKd-@+Cb+!?i^Xh%iBmUs~(M? zYI{PMN|HzbC1VvK$NJ+#Ug#7O14ScB&g;XUhmdn-W z(Jr#I45Gjx*g5{;-#jzjtR#G$jZD(NJva~>_0@IE4xWxtMz1X{M3FexC=Cu3AW-`BA>uO)2h= z0~SwrNpBsfCj{EwDXpCKmTe%GBQv(=pqLx%!CebBV@#HLS9LN&D(m-Eip^toY9-2J zDCUrHc^+(8mn|W>F3NFcdn3&^7JnM<=)BXWaq?2I|IB$5sB$IIjIDDMQXdY9KPkLu=-3zAz!K;5BpIIW$Sg>m;MCVN6P8^VY^`8nkgih^i%g`m0pZYlz zHR7FUkRz+tR}hhhX(I6Cf^F6B*Fv6-2XUxwPfLVz`Egmru`kNw!*I=i95+-;g}V2e zAmD9J8sYK`ZcxxnQjch$J4{j!WG)3GEYiXY&n+O)4w^cU(@|U2aym-xg~fZf+%LL!@7pabC8VZK-w4OHe? zjeeKUaxAs5S`%1h8vt9ZfiN0QD?T7% zUMfuYD`mUkb8l6u1tu*llHDWG7a>V3QHjqXtpiOKPP9^Mleo85_4nw~2&5*B?2o@F zU@oZkqWNPHd}a7W$YKTJ5TbYl>hNo^R&$+4#okA{W_^*r=|^3gy_kgAq+*Osp$qoa zKc^R=UXeW(9O?~m|Fg)=s5%lyXbS&Pf9ixhk`MUjVwUBwK{=t+w z$&ntKJE{34Tfayu9Kzz6K{ScgZ@ohj?~LHIDKw*Qm(ownl3@Dg+AjcPZ7_90w_-SE zHP#(OGK`}994RY_UjUzDZj69-5Gf0l*mS5!MHsJ1}mcx1y&Kau-vc*hV1+Xs9vpodNWwOBzJb`KuUEFb!l5ha!-! zQlWxc8m;VXvFws9$E;^Up}#=$ANw3L=D23Z^Qp;rw1V@^-iSlT$nl8FjXm$OxA_TK zWphLMgUq_B4{{q~$2^2jWNh_7nw#R$rhqf;JYm^7+NOZY*(|d2OfUMb-S0#>ArNT! z?vQ3pzXQme_(0|aK*P1|uw*96wyZ;--aNixlMD6GXe6R(7TbA1zP)@K7W})VVi)8s zS6W6g`XGX5iV$D(=kenQ*HdW9(JzrvxTC?8 z6N9-6P}c)1>WrQCuciq?vda#$aRX;3SP@zB%|G^+MxH^|Gp_b;2!D_(($*Si zHlxd1)WQXgeg26|x&sKByQ$KV&YudOwZJs&qK%tykMp!cjNxndG0&G{1>|eLdwCz` z$#so@@xjxNZ7!dXWqOEmiBW3lY#NR5z-$!l%``);nHfzS7wOySpHS%!n58oZG{Swi z{nYPF!H9oJtVZ-~wTmPZr0N{&1j5n&l3=u!trcp7$p175ZP!9v-{Ov-s4qJ$RKPw2 zMX%E5X3#udTY6?;!~sh{OH zp(gH_B|7*J&E){IC1BOD&Wx8GHjyA~-tJH;LOS{o&B-pI=YUN+&eDpG^k%&CQhkT?Y#j6JPv2=ngy#?l8AkW{0Hv5LvguFaMT%xv&T*-^KEDqV z-_(=kQaypHbhkR+ zoNthBp>t7qoeQQGbS~o{441%A%$oJLgq)*BYFgU9VqG=K>-2;}0de(8;gL1#jD+ap zOxgs0W}g!3l*3VKFo@jYFnRlBaiTb-Xhe<}gGI%O~aCnGW@6ff}{m_2@czz7zOpVza;2eSUUG~lRH~E#@ zv>F@xm$e74K3@DivE~Az~x6S8@Q$+GHU;;_Xy5ojmru;*w|L0`0jECD`t1ajzbqKbk(hHk~P_iz`kN zd@j`|-b|o9&GFo7B;5Bj*auG3JS?}^m*S{KioE}H<$D7#>FQV+gyfZ*Ui|C6>v|N6 zw`A*c0dLsuumjL7d^Bp0*Qta~H#4?|Fz~+fR&XLvI;mt@#s#TD z#1v(#qGjyWet{#c3Z0}T488{A{>IKtul5Qq*u^&Bv9|x*8}dj)pR|lXdwf+lqDuWK zq!FD#7A~Zyb&X9Bo^+oi%!)}0MLXyN&8*pzwTa)8?oX0m6o5rpRNh`S-7_1apAVgl-{-Y z8<$a?Nqj3y1zzX%Nufr)4Juen66GEAwRYQ;bv1*ZL1F9XXd zexbLcE`Q(zg>0Ba7lYw8? z>Zcw2wZ$;cK;a7>a@&ta1l_TShHV{}!{Wll?T z8`bs+ms;u}Ie1X;a|Y7^Ufd!Xm91Cmx1kLYJhtRq_Lx}mbF;zM+U9H9$_fk5{I#~3 z5jDJ>hdXWlugH9Xa!?5p<*9G&P0N8uz2Puqzdiy!VQZ+s!ok4&-=BhkJ_rK?`}+3p Z@BjQvjD`v#(yJI2`jUkr0`Kd${|EfG

+

diff --git a/assets/webconfig/i18n/de.json b/assets/webconfig/i18n/de.json index 671bfea3..1f360256 100644 --- a/assets/webconfig/i18n/de.json +++ b/assets/webconfig/i18n/de.json @@ -104,10 +104,10 @@ "conf_leds_optgroup_usb" : "USB", "conf_leds_optgroup_debug" : "Debug", "conf_leds_layout_btn_checklist" : "Zeige Checkliste", - "conf_leds_leyout_checkp1" : "Die schwarze eingefärbte LED ist die erste LED. Das ist der Punkt, an dem die Daten eingespeist werden.", - "conf_leds_leyout_checkp2" : "Das Layout ist die Ansicht vor dem Fernseher stehend, nicht dahinter.", - "conf_leds_leyout_checkp3" : "Stelle sicher, dass die Richtung richtig eingestellt ist, dazu ist die zweite und dritte LED grau markiert um den Datenfluss anzuzeigen.", - "conf_leds_leyout_checkp4" : "Vorgang Lücke: Solltest du eine Lücke benötigen, ignoriere diese bei der LED Angabe Oben/Unten/Rechts/Links und gebe anschließend unter Lückenlänge an, wieviel LEDs du abziehen möchtest. Verändere jetzt die Lückenposition, um die Lücke an die richtige Stelle zu rücken.", + "conf_leds_layout_checkp1" : "Die schwarze eingefärbte LED ist die erste LED. Das ist der Punkt, an dem die Daten eingespeist werden.", + "conf_leds_layout_checkp2" : "Das Layout ist die Ansicht vor dem Fernseher stehend, nicht dahinter.", + "conf_leds_layout_checkp3" : "Stelle sicher, dass die Richtung richtig eingestellt ist, dazu ist die zweite und dritte LED grau markiert um den Datenfluss anzuzeigen.", + "conf_leds_layout_checkp4" : "Vorgang Lücke: Solltest du eine Lücke benötigen, ignoriere diese bei der LED Angabe Oben/Unten/Rechts/Links und gebe anschließend unter Lückenlänge an, wieviel LEDs du abziehen möchtest. Verändere jetzt die Lückenposition, um die Lücke an die richtige Stelle zu rücken.", "conf_leds_layout_frame" : "Klassisches Layout (Rahmen)", "conf_leds_layout_matrix" : "Matrix Layout (LED Wand)", "conf_leds_layout_generatedconf" : "Generierte/Aktuelle LED Konfiguration", @@ -119,6 +119,7 @@ "conf_leds_layout_preview_originTEXT" : "Erstellt von: Textfeld", "conf_leds_layout_preview_originMA" : "Erstellt von: Matrix Layout (LED Wand)", "conf_leds_layout_preview_totalleds" : "LEDs gesamt: $1", + "conf_leds_layout_preview_ledpower" : "Max. Stromstärke: $1 A", "conf_leds_layout_preview_l1" : "Das ist die erste LED (Einspeisung)", "conf_leds_layout_preview_l2" : "Das visualisiert die Richtung des Datenstroms (zweite/dritte LED)", "conf_leds_layout_cl_top" : "Oben", diff --git a/assets/webconfig/i18n/en.json b/assets/webconfig/i18n/en.json index 753dbfc7..24a26ea1 100644 --- a/assets/webconfig/i18n/en.json +++ b/assets/webconfig/i18n/en.json @@ -104,10 +104,10 @@ "conf_leds_optgroup_usb" : "USB", "conf_leds_optgroup_debug" : "Debug", "conf_leds_layout_btn_checklist" : "Show checklist", - "conf_leds_leyout_checkp1" : "The black led is your first led, the first led is the point where you input your data signal.", - "conf_leds_leyout_checkp2" : "The layout is always the front view of your TV, never the back view.", - "conf_leds_leyout_checkp3" : "Make sure the direction is right. The grey leds indicate led number 2 and 3 to visualize the data direction.", - "conf_leds_leyout_checkp4" : "Case Gap: To create a gap, ignore it first when you define Top/Bottom/Left/Right and set afterwards your gap length to remove a amount of leds. Modify the gap position until it matches.", + "conf_leds_layout_checkp1" : "The black led is your first led, the first led is the point where you input your data signal.", + "conf_leds_layout_checkp2" : "The layout is always the front view of your TV, never the back view.", + "conf_leds_layout_checkp3" : "Make sure the direction is right. The grey leds indicate led number 2 and 3 to visualize the data direction.", + "conf_leds_layout_checkp4" : "Case Gap: To create a gap, ignore it first when you define Top/Bottom/Left/Right and set afterwards your gap length to remove a amount of leds. Modify the gap position until it matches.", "conf_leds_layout_frame" : "Classic Layout (LED Frame)", "conf_leds_layout_matrix" : "Matrix Layout (LED Wall)", "conf_leds_layout_generatedconf" : "Generated/Current LED Configuration", @@ -118,7 +118,8 @@ "conf_leds_layout_preview_originCL" : "Created from: Classic Layout (LED Frame)", "conf_leds_layout_preview_originTEXT" : "Created from: Textfield", "conf_leds_layout_preview_originMA" : "Created from: Matrix Layout(LED wall)", - "conf_leds_layout_preview_totalleds" : "Totel LEDs: $1", + "conf_leds_layout_preview_totalleds" : "Amount of LEDs: $1", + "conf_leds_layout_preview_ledpower" : "Max. power consumption: $1 A", "conf_leds_layout_preview_l1" : "This is your first led (input position)", "conf_leds_layout_preview_l2" : "This visualizes the data direction (second/third led)", "conf_leds_layout_cl_top" : "Top", diff --git a/assets/webconfig/i18n/es.json b/assets/webconfig/i18n/es.json index 86f14d7e..1947a352 100644 --- a/assets/webconfig/i18n/es.json +++ b/assets/webconfig/i18n/es.json @@ -94,10 +94,10 @@ "conf_leds_optgroup_usb": "USB", "conf_leds_optgroup_debug": "Depurar", "conf_leds_layout_btn_checklist": "Mostrar lista", - "conf_leds_leyout_checkp1": "El led negro es tu primer led, el primer led es el punto donde introduces tu señal de datos.", - "conf_leds_leyout_checkp2": "La disposición es siempre la vista delantera de tu TV, nunca la visión posterior.", - "conf_leds_leyout_checkp3": "Asegúrate de que la dirección es correcta. Los leds grises indican los led números 2 y 3 para visualizar la dirección de los datos.", - "conf_leds_leyout_checkp4": "Caso Hueco: Para crear un hueco, ignóralo primero cuando definas Superior/Inferior/Izquieda/Derecha y ajusta después su longitud de hueco para eliminar una cantidad de leds. Modifica la posición del hueco hasta que coincida.", + "conf_leds_layout_checkp1": "El led negro es tu primer led, el primer led es el punto donde introduces tu señal de datos.", + "conf_leds_layout_checkp2": "La disposición es siempre la vista delantera de tu TV, nunca la visión posterior.", + "conf_leds_layout_checkp3": "Asegúrate de que la dirección es correcta. Los leds grises indican los led números 2 y 3 para visualizar la dirección de los datos.", + "conf_leds_layout_checkp4": "Caso Hueco: Para crear un hueco, ignóralo primero cuando definas Superior/Inferior/Izquieda/Derecha y ajusta después su longitud de hueco para eliminar una cantidad de leds. Modifica la posición del hueco hasta que coincida.", "conf_leds_layout_frame": "Disposición Clásica (Marco LED)", "conf_leds_layout_matrix": "Disposición de Matriz (Pared LED)", "conf_leds_layout_generatedconf": "Configuración LED Generada/Actual", @@ -109,6 +109,7 @@ "conf_leds_layout_preview_originTEXT": "Creado a partir de: Cuadro de texto", "conf_leds_layout_preview_originMA": "Creado a partir de: Disposición en Matriz (Pared LED)", "conf_leds_layout_preview_totalleds": "Total de LEDs:$1", + "conf_leds_layout_preview_ledpower" : "Máximo consumo de energía: $1 A", "conf_leds_layout_preview_l1": "Este es tu primer led (posición de entrada)", "conf_leds_layout_preview_l2": "Esto visualiza la dirección de datos (segundo/tercer led)", "conf_leds_layout_cl_top": "Superior", diff --git a/assets/webconfig/js/content_leds.js b/assets/webconfig/js/content_leds.js index 4175458d..2cc1001f 100644 --- a/assets/webconfig/js/content_leds.js +++ b/assets/webconfig/js/content_leds.js @@ -35,6 +35,7 @@ function createLedPreview(leds, origin){ } $('#previewledcount').html($.i18n('conf_leds_layout_preview_totalleds', leds.length)); + $('#previewledpower').html($.i18n('conf_leds_layout_preview_ledpower', (leds.length * 0.06).toFixed(1))); $('.st_helper').css("border", "8px solid grey"); @@ -498,7 +499,7 @@ $(document).ready(function() { // open checklist $('#leds_prev_checklist').off().on("click", function() { - var liList = [$.i18n('conf_leds_leyout_checkp1'),$.i18n('conf_leds_leyout_checkp3'),$.i18n('conf_leds_leyout_checkp2'),$.i18n('conf_leds_leyout_checkp4')]; + var liList = [$.i18n('conf_leds_layout_checkp1'),$.i18n('conf_leds_layout_checkp3'),$.i18n('conf_leds_layout_checkp2'),$.i18n('conf_leds_layout_checkp4')]; var ul = document.createElement("ul"); ul.className = "checklist" From 31f352e7ce3fedd14068f19a2cd9bfd8923eb131 Mon Sep 17 00:00:00 2001 From: brindosch Date: Tue, 28 Feb 2017 17:53:41 +0100 Subject: [PATCH 03/29] json-rpc - origin, ui update (#407) * try ace * . * update * ... * update * update * test * - * update * fix * . * Revert "." This reverts commit 631c30f8c08d3c62b6f9d538a7c5f2fdd7a18e76. * Revert "fix" This reverts commit be3dbc9cbdf3638d0c57979599a5275cdca96162. * Revert "update" This reverts commit 50fc89e800ea24e23ffe358612a6532499f8afea. * Revert "-" This reverts commit 8a6c1fdab32768edcb22f16e2368d6b73de6909a. * Revert "test" This reverts commit 50b36414909ea9198a05b8bede38a19067891693. * update schema * update ui * flags * adjustments --- assets/webconfig/content/about.html | 2 +- assets/webconfig/content/conf_leds.html | 2 +- assets/webconfig/content/connection_lost.html | 59 +- assets/webconfig/content/dashboard.html | 31 +- assets/webconfig/content/remote.html | 17 +- assets/webconfig/content/restart.html | 15 +- assets/webconfig/content/support.html | 4 +- .../css/bootstrap-colorpicker.min.css | 2 +- assets/webconfig/css/bootstrap.css | 6757 ----------------- assets/webconfig/css/bootstrap.min.css | 14 + assets/webconfig/css/flag-icon.min.css | 1 - assets/webconfig/css/hyperion.css | 4 + assets/webconfig/css/jquery-linedtextarea.css | 68 - assets/webconfig/css/jsonaceeditor.min.css | 1 + assets/webconfig/favicon.ico | Bin 1150 -> 3603 bytes assets/webconfig/flags/1x1/de.svg | 7 - assets/webconfig/flags/1x1/gb.svg | 15 - assets/webconfig/flags/4x3/de.svg | 7 - assets/webconfig/flags/4x3/gb.svg | 15 - assets/webconfig/i18n/de.json | 1350 ++-- assets/webconfig/i18n/en.json | 1352 ++-- assets/webconfig/index.html | 102 +- assets/webconfig/js/content_dashboard.js | 80 +- assets/webconfig/js/content_effects.js | 12 +- assets/webconfig/js/content_grabber.js | 20 + assets/webconfig/js/content_index.js | 3 +- assets/webconfig/js/content_leds.js | 102 +- assets/webconfig/js/content_logging.js | 16 +- assets/webconfig/js/content_remote.js | 31 +- assets/webconfig/js/hyperion.js | 29 +- .../js/lib/bootstrap-colorpicker.min.js | 4 +- assets/webconfig/js/lib/bootstrap.min.js | 12 +- .../webconfig/js/lib/jquery-linedtextarea.js | 126 - assets/webconfig/js/lib/jsonaceeditor.min.js | 49 + assets/webconfig/js/lib/sb-admin-2.js | 35 +- assets/webconfig/js/lib/underscore.js | 1059 --- assets/webconfig/js/ui_utils.js | 35 +- include/hyperion/Hyperion.h | 4 +- include/hyperion/PriorityMuxer.h | 7 +- libsrc/hyperion/Hyperion.cpp | 6 +- libsrc/hyperion/PriorityMuxer.cpp | 3 +- .../hyperion/schemas/hyperion.schema-2.json | 4 +- libsrc/jsonserver/JsonClientConnection.cpp | 4 +- libsrc/jsonserver/schema/schema-color.json | 4 + libsrc/jsonserver/schema/schema-effect.json | 4 + 45 files changed, 1883 insertions(+), 9591 deletions(-) delete mode 100644 assets/webconfig/css/bootstrap.css create mode 100644 assets/webconfig/css/bootstrap.min.css delete mode 100644 assets/webconfig/css/flag-icon.min.css delete mode 100644 assets/webconfig/css/jquery-linedtextarea.css create mode 100644 assets/webconfig/css/jsonaceeditor.min.css delete mode 100644 assets/webconfig/flags/1x1/de.svg delete mode 100644 assets/webconfig/flags/1x1/gb.svg delete mode 100644 assets/webconfig/flags/4x3/de.svg delete mode 100644 assets/webconfig/flags/4x3/gb.svg delete mode 100644 assets/webconfig/js/lib/jquery-linedtextarea.js create mode 100644 assets/webconfig/js/lib/jsonaceeditor.min.js delete mode 100644 assets/webconfig/js/lib/underscore.js diff --git a/assets/webconfig/content/about.html b/assets/webconfig/content/about.html index da491eee..51b2f49f 100644 --- a/assets/webconfig/content/about.html +++ b/assets/webconfig/content/about.html @@ -21,7 +21,7 @@ libh += ''+key+', '; libh += "
"+$.i18n("about_credits"); - lang = lang.toString().replace(",",", "); + lang = lang.toString().replace(/,/g,", "); var fc = [$.i18n("about_version"),$.i18n("about_build"),$.i18n("about_builddate"),$.i18n("about_translations"),$.i18n("about_resources", $.i18n("general_webui_title"))]; var sc = [currentVersion,si.build,si.time,'('+availLang.length+')

'+lang+'

'+$.i18n("about_contribute")+'

',libh]; diff --git a/assets/webconfig/content/conf_leds.html b/assets/webconfig/content/conf_leds.html index 4c3cad92..228f8915 100644 --- a/assets/webconfig/content/conf_leds.html +++ b/assets/webconfig/content/conf_leds.html @@ -268,7 +268,7 @@

This textfield shows by default your current loaded layout and will be overwritten if you generate a new one above. Optional you could perform further edits.

- +
diff --git a/assets/webconfig/content/remote.html b/assets/webconfig/content/remote.html index 7464501a..399e0fe9 100644 --- a/assets/webconfig/content/remote.html +++ b/assets/webconfig/content/remote.html @@ -40,16 +40,27 @@ - + - + + + + + + + + +
- +
+ + +
diff --git a/assets/webconfig/content/restart.html b/assets/webconfig/content/restart.html index e1bf782f..eab7f4fb 100644 --- a/assets/webconfig/content/restart.html +++ b/assets/webconfig/content/restart.html @@ -17,19 +17,30 @@ performTranslation(); var connectionLost = false; var connectionTimer; +var count = 1; function tryReconnect() { + if(count > 25) + window.clearInterval(connectionTimer); + $.ajax({ url: "/" }).done(function(data) { window.clearInterval(connectionTimer); window.location.href ="/"; + }) + .fail( function( jqXHR, textStatus ) { + count++; }); } function restartAction() { - connectionLost = true; - connectionTimer = window.setInterval(tryReconnect, 1000); + if(!connectionLost) + { + window.clearInterval(cronId); + connectionLost = true; + connectionTimer = window.setInterval(tryReconnect, 1000); + } } diff --git a/assets/webconfig/content/support.html b/assets/webconfig/content/support.html index 516c15b5..9379f46b 100644 --- a/assets/webconfig/content/support.html +++ b/assets/webconfig/content/support.html @@ -118,7 +118,5 @@ diff --git a/assets/webconfig/css/bootstrap-colorpicker.min.css b/assets/webconfig/css/bootstrap-colorpicker.min.css index 9520f06c..563b8fca 100644 --- a/assets/webconfig/css/bootstrap-colorpicker.min.css +++ b/assets/webconfig/css/bootstrap-colorpicker.min.css @@ -1,5 +1,5 @@ /*! - * Bootstrap Colorpicker v2.4.0 + * Bootstrap Colorpicker v2.5.1 * https://itsjavi.com/bootstrap-colorpicker/ * * Originally written by (c) 2012 Stefan Petre diff --git a/assets/webconfig/css/bootstrap.css b/assets/webconfig/css/bootstrap.css deleted file mode 100644 index 6167622c..00000000 --- a/assets/webconfig/css/bootstrap.css +++ /dev/null @@ -1,6757 +0,0 @@ -/*! - * Bootstrap v3.3.7 (http://getbootstrap.com) - * Copyright 2011-2016 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -body { - margin: 0; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; -} -audio:not([controls]) { - display: none; - height: 0; -} -[hidden], -template { - display: none; -} -a { - background-color: transparent; -} -a:active, -a:hover { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -dfn { - font-style: italic; -} -h1 { - margin: .67em 0; - font-size: 2em; -} -mark { - color: #000; - background: #ff0; -} -small { - font-size: 80%; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -.5em; -} -sub { - bottom: -.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 1em 40px; -} -hr { - height: 0; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -pre { - overflow: auto; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - margin: 0; - font: inherit; - color: inherit; -} -button { - overflow: visible; -} -button, -select { - text-transform: none; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -button[disabled], -html input[disabled] { - cursor: default; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -input { - line-height: normal; -} -input[type="checkbox"], -input[type="radio"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -fieldset { - padding: .35em .625em .75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} -legend { - padding: 0; - border: 0; -} -textarea { - overflow: auto; -} -optgroup { - font-weight: bold; -} -table { - border-spacing: 0; - border-collapse: collapse; -} -td, -th { - padding: 0; -} -/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ -@media print { - *, - *:before, - *:after { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="#"]:after, - a[href^="javascript:"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - .navbar { - display: none; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table td, - .table th { - background-color: #fff !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} -@font-face { - font-family: 'Glyphicons Halflings'; - - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); -} -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.glyphicon-asterisk:before { - content: "\002a"; -} -.glyphicon-plus:before { - content: "\002b"; -} -.glyphicon-euro:before, -.glyphicon-eur:before { - content: "\20ac"; -} -.glyphicon-minus:before { - content: "\2212"; -} -.glyphicon-cloud:before { - content: "\2601"; -} -.glyphicon-envelope:before { - content: "\2709"; -} -.glyphicon-pencil:before { - content: "\270f"; -} -.glyphicon-glass:before { - content: "\e001"; -} -.glyphicon-music:before { - content: "\e002"; -} -.glyphicon-search:before { - content: "\e003"; -} -.glyphicon-heart:before { - content: "\e005"; -} -.glyphicon-star:before { - content: "\e006"; -} -.glyphicon-star-empty:before { - content: "\e007"; -} -.glyphicon-user:before { - content: "\e008"; -} -.glyphicon-film:before { - content: "\e009"; -} -.glyphicon-th-large:before { - content: "\e010"; -} -.glyphicon-th:before { - content: "\e011"; -} -.glyphicon-th-list:before { - content: "\e012"; -} -.glyphicon-ok:before { - content: "\e013"; -} -.glyphicon-remove:before { - content: "\e014"; -} -.glyphicon-zoom-in:before { - content: "\e015"; -} -.glyphicon-zoom-out:before { - content: "\e016"; -} -.glyphicon-off:before { - content: "\e017"; -} -.glyphicon-signal:before { - content: "\e018"; -} -.glyphicon-cog:before { - content: "\e019"; -} -.glyphicon-trash:before { - content: "\e020"; -} -.glyphicon-home:before { - content: "\e021"; -} -.glyphicon-file:before { - content: "\e022"; -} -.glyphicon-time:before { - content: "\e023"; -} -.glyphicon-road:before { - content: "\e024"; -} -.glyphicon-download-alt:before { - content: "\e025"; -} -.glyphicon-download:before { - content: "\e026"; -} -.glyphicon-upload:before { - content: "\e027"; -} -.glyphicon-inbox:before { - content: "\e028"; -} -.glyphicon-play-circle:before { - content: "\e029"; -} -.glyphicon-repeat:before { - content: "\e030"; -} -.glyphicon-refresh:before { - content: "\e031"; -} -.glyphicon-list-alt:before { - content: "\e032"; -} -.glyphicon-lock:before { - content: "\e033"; -} -.glyphicon-flag:before { - content: "\e034"; -} -.glyphicon-headphones:before { - content: "\e035"; -} -.glyphicon-volume-off:before { - content: "\e036"; -} -.glyphicon-volume-down:before { - content: "\e037"; -} -.glyphicon-volume-up:before { - content: "\e038"; -} -.glyphicon-qrcode:before { - content: "\e039"; -} -.glyphicon-barcode:before { - content: "\e040"; -} -.glyphicon-tag:before { - content: "\e041"; -} -.glyphicon-tags:before { - content: "\e042"; -} -.glyphicon-book:before { - content: "\e043"; -} -.glyphicon-bookmark:before { - content: "\e044"; -} -.glyphicon-print:before { - content: "\e045"; -} -.glyphicon-camera:before { - content: "\e046"; -} -.glyphicon-font:before { - content: "\e047"; -} -.glyphicon-bold:before { - content: "\e048"; -} -.glyphicon-italic:before { - content: "\e049"; -} -.glyphicon-text-height:before { - content: "\e050"; -} -.glyphicon-text-width:before { - content: "\e051"; -} -.glyphicon-align-left:before { - content: "\e052"; -} -.glyphicon-align-center:before { - content: "\e053"; -} -.glyphicon-align-right:before { - content: "\e054"; -} -.glyphicon-align-justify:before { - content: "\e055"; -} -.glyphicon-list:before { - content: "\e056"; -} -.glyphicon-indent-left:before { - content: "\e057"; -} -.glyphicon-indent-right:before { - content: "\e058"; -} -.glyphicon-facetime-video:before { - content: "\e059"; -} -.glyphicon-picture:before { - content: "\e060"; -} -.glyphicon-map-marker:before { - content: "\e062"; -} -.glyphicon-adjust:before { - content: "\e063"; -} -.glyphicon-tint:before { - content: "\e064"; -} -.glyphicon-edit:before { - content: "\e065"; -} -.glyphicon-share:before { - content: "\e066"; -} -.glyphicon-check:before { - content: "\e067"; -} -.glyphicon-move:before { - content: "\e068"; -} -.glyphicon-step-backward:before { - content: "\e069"; -} -.glyphicon-fast-backward:before { - content: "\e070"; -} -.glyphicon-backward:before { - content: "\e071"; -} -.glyphicon-play:before { - content: "\e072"; -} -.glyphicon-pause:before { - content: "\e073"; -} -.glyphicon-stop:before { - content: "\e074"; -} -.glyphicon-forward:before { - content: "\e075"; -} -.glyphicon-fast-forward:before { - content: "\e076"; -} -.glyphicon-step-forward:before { - content: "\e077"; -} -.glyphicon-eject:before { - content: "\e078"; -} -.glyphicon-chevron-left:before { - content: "\e079"; -} -.glyphicon-chevron-right:before { - content: "\e080"; -} -.glyphicon-plus-sign:before { - content: "\e081"; -} -.glyphicon-minus-sign:before { - content: "\e082"; -} -.glyphicon-remove-sign:before { - content: "\e083"; -} -.glyphicon-ok-sign:before { - content: "\e084"; -} -.glyphicon-question-sign:before { - content: "\e085"; -} -.glyphicon-info-sign:before { - content: "\e086"; -} -.glyphicon-screenshot:before { - content: "\e087"; -} -.glyphicon-remove-circle:before { - content: "\e088"; -} -.glyphicon-ok-circle:before { - content: "\e089"; -} -.glyphicon-ban-circle:before { - content: "\e090"; -} -.glyphicon-arrow-left:before { - content: "\e091"; -} -.glyphicon-arrow-right:before { - content: "\e092"; -} -.glyphicon-arrow-up:before { - content: "\e093"; -} -.glyphicon-arrow-down:before { - content: "\e094"; -} -.glyphicon-share-alt:before { - content: "\e095"; -} -.glyphicon-resize-full:before { - content: "\e096"; -} -.glyphicon-resize-small:before { - content: "\e097"; -} -.glyphicon-exclamation-sign:before { - content: "\e101"; -} -.glyphicon-gift:before { - content: "\e102"; -} -.glyphicon-leaf:before { - content: "\e103"; -} -.glyphicon-fire:before { - content: "\e104"; -} -.glyphicon-eye-open:before { - content: "\e105"; -} -.glyphicon-eye-close:before { - content: "\e106"; -} -.glyphicon-warning-sign:before { - content: "\e107"; -} -.glyphicon-plane:before { - content: "\e108"; -} -.glyphicon-calendar:before { - content: "\e109"; -} -.glyphicon-random:before { - content: "\e110"; -} -.glyphicon-comment:before { - content: "\e111"; -} -.glyphicon-magnet:before { - content: "\e112"; -} -.glyphicon-chevron-up:before { - content: "\e113"; -} -.glyphicon-chevron-down:before { - content: "\e114"; -} -.glyphicon-retweet:before { - content: "\e115"; -} -.glyphicon-shopping-cart:before { - content: "\e116"; -} -.glyphicon-folder-close:before { - content: "\e117"; -} -.glyphicon-folder-open:before { - content: "\e118"; -} -.glyphicon-resize-vertical:before { - content: "\e119"; -} -.glyphicon-resize-horizontal:before { - content: "\e120"; -} -.glyphicon-hdd:before { - content: "\e121"; -} -.glyphicon-bullhorn:before { - content: "\e122"; -} -.glyphicon-bell:before { - content: "\e123"; -} -.glyphicon-certificate:before { - content: "\e124"; -} -.glyphicon-thumbs-up:before { - content: "\e125"; -} -.glyphicon-thumbs-down:before { - content: "\e126"; -} -.glyphicon-hand-right:before { - content: "\e127"; -} -.glyphicon-hand-left:before { - content: "\e128"; -} -.glyphicon-hand-up:before { - content: "\e129"; -} -.glyphicon-hand-down:before { - content: "\e130"; -} -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} -.glyphicon-globe:before { - content: "\e135"; -} -.glyphicon-wrench:before { - content: "\e136"; -} -.glyphicon-tasks:before { - content: "\e137"; -} -.glyphicon-filter:before { - content: "\e138"; -} -.glyphicon-briefcase:before { - content: "\e139"; -} -.glyphicon-fullscreen:before { - content: "\e140"; -} -.glyphicon-dashboard:before { - content: "\e141"; -} -.glyphicon-paperclip:before { - content: "\e142"; -} -.glyphicon-heart-empty:before { - content: "\e143"; -} -.glyphicon-link:before { - content: "\e144"; -} -.glyphicon-phone:before { - content: "\e145"; -} -.glyphicon-pushpin:before { - content: "\e146"; -} -.glyphicon-usd:before { - content: "\e148"; -} -.glyphicon-gbp:before { - content: "\e149"; -} -.glyphicon-sort:before { - content: "\e150"; -} -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} -.glyphicon-sort-by-order:before { - content: "\e153"; -} -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} -.glyphicon-unchecked:before { - content: "\e157"; -} -.glyphicon-expand:before { - content: "\e158"; -} -.glyphicon-collapse-down:before { - content: "\e159"; -} -.glyphicon-collapse-up:before { - content: "\e160"; -} -.glyphicon-log-in:before { - content: "\e161"; -} -.glyphicon-flash:before { - content: "\e162"; -} -.glyphicon-log-out:before { - content: "\e163"; -} -.glyphicon-new-window:before { - content: "\e164"; -} -.glyphicon-record:before { - content: "\e165"; -} -.glyphicon-save:before { - content: "\e166"; -} -.glyphicon-open:before { - content: "\e167"; -} -.glyphicon-saved:before { - content: "\e168"; -} -.glyphicon-import:before { - content: "\e169"; -} -.glyphicon-export:before { - content: "\e170"; -} -.glyphicon-send:before { - content: "\e171"; -} -.glyphicon-floppy-disk:before { - content: "\e172"; -} -.glyphicon-floppy-saved:before { - content: "\e173"; -} -.glyphicon-floppy-remove:before { - content: "\e174"; -} -.glyphicon-floppy-save:before { - content: "\e175"; -} -.glyphicon-floppy-open:before { - content: "\e176"; -} -.glyphicon-credit-card:before { - content: "\e177"; -} -.glyphicon-transfer:before { - content: "\e178"; -} -.glyphicon-cutlery:before { - content: "\e179"; -} -.glyphicon-header:before { - content: "\e180"; -} -.glyphicon-compressed:before { - content: "\e181"; -} -.glyphicon-earphone:before { - content: "\e182"; -} -.glyphicon-phone-alt:before { - content: "\e183"; -} -.glyphicon-tower:before { - content: "\e184"; -} -.glyphicon-stats:before { - content: "\e185"; -} -.glyphicon-sd-video:before { - content: "\e186"; -} -.glyphicon-hd-video:before { - content: "\e187"; -} -.glyphicon-subtitles:before { - content: "\e188"; -} -.glyphicon-sound-stereo:before { - content: "\e189"; -} -.glyphicon-sound-dolby:before { - content: "\e190"; -} -.glyphicon-sound-5-1:before { - content: "\e191"; -} -.glyphicon-sound-6-1:before { - content: "\e192"; -} -.glyphicon-sound-7-1:before { - content: "\e193"; -} -.glyphicon-copyright-mark:before { - content: "\e194"; -} -.glyphicon-registration-mark:before { - content: "\e195"; -} -.glyphicon-cloud-download:before { - content: "\e197"; -} -.glyphicon-cloud-upload:before { - content: "\e198"; -} -.glyphicon-tree-conifer:before { - content: "\e199"; -} -.glyphicon-tree-deciduous:before { - content: "\e200"; -} -.glyphicon-cd:before { - content: "\e201"; -} -.glyphicon-save-file:before { - content: "\e202"; -} -.glyphicon-open-file:before { - content: "\e203"; -} -.glyphicon-level-up:before { - content: "\e204"; -} -.glyphicon-copy:before { - content: "\e205"; -} -.glyphicon-paste:before { - content: "\e206"; -} -.glyphicon-alert:before { - content: "\e209"; -} -.glyphicon-equalizer:before { - content: "\e210"; -} -.glyphicon-king:before { - content: "\e211"; -} -.glyphicon-queen:before { - content: "\e212"; -} -.glyphicon-pawn:before { - content: "\e213"; -} -.glyphicon-bishop:before { - content: "\e214"; -} -.glyphicon-knight:before { - content: "\e215"; -} -.glyphicon-baby-formula:before { - content: "\e216"; -} -.glyphicon-tent:before { - content: "\26fa"; -} -.glyphicon-blackboard:before { - content: "\e218"; -} -.glyphicon-bed:before { - content: "\e219"; -} -.glyphicon-apple:before { - content: "\f8ff"; -} -.glyphicon-erase:before { - content: "\e221"; -} -.glyphicon-hourglass:before { - content: "\231b"; -} -.glyphicon-lamp:before { - content: "\e223"; -} -.glyphicon-duplicate:before { - content: "\e224"; -} -.glyphicon-piggy-bank:before { - content: "\e225"; -} -.glyphicon-scissors:before { - content: "\e226"; -} -.glyphicon-bitcoin:before { - content: "\e227"; -} -.glyphicon-btc:before { - content: "\e227"; -} -.glyphicon-xbt:before { - content: "\e227"; -} -.glyphicon-yen:before { - content: "\00a5"; -} -.glyphicon-jpy:before { - content: "\00a5"; -} -.glyphicon-ruble:before { - content: "\20bd"; -} -.glyphicon-rub:before { - content: "\20bd"; -} -.glyphicon-scale:before { - content: "\e230"; -} -.glyphicon-ice-lolly:before { - content: "\e231"; -} -.glyphicon-ice-lolly-tasted:before { - content: "\e232"; -} -.glyphicon-education:before { - content: "\e233"; -} -.glyphicon-option-horizontal:before { - content: "\e234"; -} -.glyphicon-option-vertical:before { - content: "\e235"; -} -.glyphicon-menu-hamburger:before { - content: "\e236"; -} -.glyphicon-modal-window:before { - content: "\e237"; -} -.glyphicon-oil:before { - content: "\e238"; -} -.glyphicon-grain:before { - content: "\e239"; -} -.glyphicon-sunglasses:before { - content: "\e240"; -} -.glyphicon-text-size:before { - content: "\e241"; -} -.glyphicon-text-color:before { - content: "\e242"; -} -.glyphicon-text-background:before { - content: "\e243"; -} -.glyphicon-object-align-top:before { - content: "\e244"; -} -.glyphicon-object-align-bottom:before { - content: "\e245"; -} -.glyphicon-object-align-horizontal:before { - content: "\e246"; -} -.glyphicon-object-align-left:before { - content: "\e247"; -} -.glyphicon-object-align-vertical:before { - content: "\e248"; -} -.glyphicon-object-align-right:before { - content: "\e249"; -} -.glyphicon-triangle-right:before { - content: "\e250"; -} -.glyphicon-triangle-left:before { - content: "\e251"; -} -.glyphicon-triangle-bottom:before { - content: "\e252"; -} -.glyphicon-triangle-top:before { - content: "\e253"; -} -.glyphicon-console:before { - content: "\e254"; -} -.glyphicon-superscript:before { - content: "\e255"; -} -.glyphicon-subscript:before { - content: "\e256"; -} -.glyphicon-menu-left:before { - content: "\e257"; -} -.glyphicon-menu-right:before { - content: "\e258"; -} -.glyphicon-menu-down:before { - content: "\e259"; -} -.glyphicon-menu-up:before { - content: "\e260"; -} -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-size: 10px; - - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #333; - background-color: #fff; -} -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -a { - color: #337ab7; - text-decoration: none; -} -a:hover, -a:focus { - color: #23527c; - text-decoration: underline; -} -a:focus { - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -figure { - margin: 0; -} -img { - vertical-align: middle; -} -.img-responsive, -.thumbnail > img, -.thumbnail a > img, -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - max-width: 100%; - height: auto; -} -.img-rounded { - border-radius: 6px; -} -.img-thumbnail { - display: inline-block; - max-width: 100%; - height: auto; - padding: 4px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.img-circle { - border-radius: 50%; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eee; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} -[role="button"] { - cursor: pointer; -} -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #777; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 10px; -} -h1 small, -.h1 small, -h2 small, -.h2 small, -h3 small, -.h3 small, -h1 .small, -.h1 .small, -h2 .small, -.h2 .small, -h3 .small, -.h3 .small { - font-size: 65%; -} -h4, -.h4, -h5, -.h5, -h6, -.h6 { - margin-top: 10px; - margin-bottom: 10px; -} -h4 small, -.h4 small, -h5 small, -.h5 small, -h6 small, -.h6 small, -h4 .small, -.h4 .small, -h5 .small, -.h5 .small, -h6 .small, -.h6 .small { - font-size: 75%; -} -h1, -.h1 { - font-size: 36px; -} -h2, -.h2 { - font-size: 30px; -} -h3, -.h3 { - font-size: 24px; -} -h4, -.h4 { - font-size: 18px; -} -h5, -.h5 { - font-size: 14px; -} -h6, -.h6 { - font-size: 12px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 300; - line-height: 1.4; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -small, -.small { - font-size: 85%; -} -mark, -.mark { - padding: .2em; - background-color: #fcf8e3; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -.text-justify { - text-align: justify; -} -.text-nowrap { - white-space: nowrap; -} -.text-lowercase { - text-transform: lowercase; -} -.text-uppercase { - text-transform: uppercase; -} -.text-capitalize { - text-transform: capitalize; -} -.text-muted { - color: #777; -} -.text-primary { - color: #337ab7; -} -a.text-primary:hover, -a.text-primary:focus { - color: #286090; -} -.text-success { - color: #3c763d; -} -a.text-success:hover, -a.text-success:focus { - color: #2b542c; -} -.text-info { - color: #31708f; -} -a.text-info:hover, -a.text-info:focus { - color: #245269; -} -.text-warning { - color: #8a6d3b; -} -a.text-warning:hover, -a.text-warning:focus { - color: #66512c; -} -.text-danger { - color: #a94442; -} -a.text-danger:hover, -a.text-danger:focus { - color: #843534; -} -.bg-primary { - color: #fff; - background-color: #337ab7; -} -a.bg-primary:hover, -a.bg-primary:focus { - background-color: #286090; -} -.bg-success { - background-color: #dff0d8; -} -a.bg-success:hover, -a.bg-success:focus { - background-color: #c1e2b3; -} -.bg-info { - background-color: #d9edf7; -} -a.bg-info:hover, -a.bg-info:focus { - background-color: #afd9ee; -} -.bg-warning { - background-color: #fcf8e3; -} -a.bg-warning:hover, -a.bg-warning:focus { - background-color: #f7ecb5; -} -.bg-danger { - background-color: #f2dede; -} -a.bg-danger:hover, -a.bg-danger:focus { - background-color: #e4b9b9; -} -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eee; -} -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} -.list-unstyled { - padding-left: 0; - list-style: none; -} -.list-inline { - padding-left: 0; - margin-left: -5px; - list-style: none; -} -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} -dl { - margin-top: 0; - margin-bottom: 20px; -} -dt, -dd { - line-height: 1.42857143; -} -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #777; -} -.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eee; -} -blockquote p:last-child, -blockquote ul:last-child, -blockquote ol:last-child { - margin-bottom: 0; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #777; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - text-align: right; - border-right: 5px solid #eee; - border-left: 0; -} -.blockquote-reverse footer:before, -blockquote.pull-right footer:before, -.blockquote-reverse small:before, -blockquote.pull-right small:before, -.blockquote-reverse .small:before, -blockquote.pull-right .small:before { - content: ''; -} -.blockquote-reverse footer:after, -blockquote.pull-right footer:after, -.blockquote-reverse small:after, -blockquote.pull-right small:after, -.blockquote-reverse .small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.42857143; -} -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - background-color: #f9f2f4; - border-radius: 4px; -} -kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); -} -kbd kbd { - padding: 0; - font-size: 100%; - font-weight: bold; - -webkit-box-shadow: none; - box-shadow: none; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.42857143; - color: #333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; -} -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} -.container-fluid { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -.row { - margin-right: -15px; - margin-left: -15px; -} -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} -.col-xs-12 { - width: 100%; -} -.col-xs-11 { - width: 91.66666667%; -} -.col-xs-10 { - width: 83.33333333%; -} -.col-xs-9 { - width: 75%; -} -.col-xs-8 { - width: 66.66666667%; -} -.col-xs-7 { - width: 58.33333333%; -} -.col-xs-6 { - width: 50%; -} -.col-xs-5 { - width: 41.66666667%; -} -.col-xs-4 { - width: 33.33333333%; -} -.col-xs-3 { - width: 25%; -} -.col-xs-2 { - width: 16.66666667%; -} -.col-xs-1 { - width: 8.33333333%; -} -.col-xs-pull-12 { - right: 100%; -} -.col-xs-pull-11 { - right: 91.66666667%; -} -.col-xs-pull-10 { - right: 83.33333333%; -} -.col-xs-pull-9 { - right: 75%; -} -.col-xs-pull-8 { - right: 66.66666667%; -} -.col-xs-pull-7 { - right: 58.33333333%; -} -.col-xs-pull-6 { - right: 50%; -} -.col-xs-pull-5 { - right: 41.66666667%; -} -.col-xs-pull-4 { - right: 33.33333333%; -} -.col-xs-pull-3 { - right: 25%; -} -.col-xs-pull-2 { - right: 16.66666667%; -} -.col-xs-pull-1 { - right: 8.33333333%; -} -.col-xs-pull-0 { - right: auto; -} -.col-xs-push-12 { - left: 100%; -} -.col-xs-push-11 { - left: 91.66666667%; -} -.col-xs-push-10 { - left: 83.33333333%; -} -.col-xs-push-9 { - left: 75%; -} -.col-xs-push-8 { - left: 66.66666667%; -} -.col-xs-push-7 { - left: 58.33333333%; -} -.col-xs-push-6 { - left: 50%; -} -.col-xs-push-5 { - left: 41.66666667%; -} -.col-xs-push-4 { - left: 33.33333333%; -} -.col-xs-push-3 { - left: 25%; -} -.col-xs-push-2 { - left: 16.66666667%; -} -.col-xs-push-1 { - left: 8.33333333%; -} -.col-xs-push-0 { - left: auto; -} -.col-xs-offset-12 { - margin-left: 100%; -} -.col-xs-offset-11 { - margin-left: 91.66666667%; -} -.col-xs-offset-10 { - margin-left: 83.33333333%; -} -.col-xs-offset-9 { - margin-left: 75%; -} -.col-xs-offset-8 { - margin-left: 66.66666667%; -} -.col-xs-offset-7 { - margin-left: 58.33333333%; -} -.col-xs-offset-6 { - margin-left: 50%; -} -.col-xs-offset-5 { - margin-left: 41.66666667%; -} -.col-xs-offset-4 { - margin-left: 33.33333333%; -} -.col-xs-offset-3 { - margin-left: 25%; -} -.col-xs-offset-2 { - margin-left: 16.66666667%; -} -.col-xs-offset-1 { - margin-left: 8.33333333%; -} -.col-xs-offset-0 { - margin-left: 0; -} -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666667%; - } - .col-sm-10 { - width: 83.33333333%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666667%; - } - .col-sm-7 { - width: 58.33333333%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666667%; - } - .col-sm-4 { - width: 33.33333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.66666667%; - } - .col-sm-1 { - width: 8.33333333%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666667%; - } - .col-sm-pull-10 { - right: 83.33333333%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666667%; - } - .col-sm-pull-7 { - right: 58.33333333%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666667%; - } - .col-sm-pull-4 { - right: 33.33333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.66666667%; - } - .col-sm-pull-1 { - right: 8.33333333%; - } - .col-sm-pull-0 { - right: auto; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666667%; - } - .col-sm-push-10 { - left: 83.33333333%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666667%; - } - .col-sm-push-7 { - left: 58.33333333%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666667%; - } - .col-sm-push-4 { - left: 33.33333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.66666667%; - } - .col-sm-push-1 { - left: 8.33333333%; - } - .col-sm-push-0 { - left: auto; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666667%; - } - .col-sm-offset-10 { - margin-left: 83.33333333%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666667%; - } - .col-sm-offset-7 { - margin-left: 58.33333333%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.66666667%; - } - .col-sm-offset-1 { - margin-left: 8.33333333%; - } - .col-sm-offset-0 { - margin-left: 0; - } -} -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666667%; - } - .col-md-10 { - width: 83.33333333%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666667%; - } - .col-md-7 { - width: 58.33333333%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666667%; - } - .col-md-4 { - width: 33.33333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.66666667%; - } - .col-md-1 { - width: 8.33333333%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666667%; - } - .col-md-pull-10 { - right: 83.33333333%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666667%; - } - .col-md-pull-7 { - right: 58.33333333%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666667%; - } - .col-md-pull-4 { - right: 33.33333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.66666667%; - } - .col-md-pull-1 { - right: 8.33333333%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666667%; - } - .col-md-push-10 { - left: 83.33333333%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666667%; - } - .col-md-push-7 { - left: 58.33333333%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666667%; - } - .col-md-push-4 { - left: 33.33333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.66666667%; - } - .col-md-push-1 { - left: 8.33333333%; - } - .col-md-push-0 { - left: auto; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666667%; - } - .col-md-offset-10 { - margin-left: 83.33333333%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666667%; - } - .col-md-offset-7 { - margin-left: 58.33333333%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.66666667%; - } - .col-md-offset-1 { - margin-left: 8.33333333%; - } - .col-md-offset-0 { - margin-left: 0; - } -} -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666667%; - } - .col-lg-10 { - width: 83.33333333%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666667%; - } - .col-lg-7 { - width: 58.33333333%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666667%; - } - .col-lg-4 { - width: 33.33333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.66666667%; - } - .col-lg-1 { - width: 8.33333333%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666667%; - } - .col-lg-pull-10 { - right: 83.33333333%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666667%; - } - .col-lg-pull-7 { - right: 58.33333333%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666667%; - } - .col-lg-pull-4 { - right: 33.33333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.66666667%; - } - .col-lg-pull-1 { - right: 8.33333333%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666667%; - } - .col-lg-push-10 { - left: 83.33333333%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666667%; - } - .col-lg-push-7 { - left: 58.33333333%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666667%; - } - .col-lg-push-4 { - left: 33.33333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.66666667%; - } - .col-lg-push-1 { - left: 8.33333333%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666667%; - } - .col-lg-offset-10 { - margin-left: 83.33333333%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666667%; - } - .col-lg-offset-7 { - margin-left: 58.33333333%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.66666667%; - } - .col-lg-offset-1 { - margin-left: 8.33333333%; - } - .col-lg-offset-0 { - margin-left: 0; - } -} -table { - background-color: transparent; -} -caption { - padding-top: 8px; - padding-bottom: 8px; - color: #777; - text-align: left; -} -th { - text-align: left; -} -.table { - width: 100%; - max-width: 100%; - margin-bottom: 20px; -} -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.42857143; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; -} -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.table > tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #fff; -} -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} -.table-bordered { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.table-striped > tbody > tr:nth-of-type(odd) { - background-color: #f9f9f9; -} -.table-hover > tbody > tr:hover { - background-color: #f5f5f5; -} -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} -table td[class*="col-"], -table th[class*="col-"] { - position: static; - display: table-cell; - float: none; -} -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, -.table-hover > tbody > tr.active:hover > td, -.table-hover > tbody > tr:hover > .active, -.table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; -} -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; -} -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td, -.table-hover > tbody > tr:hover > .success, -.table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; -} -.table > thead > tr > td.info, -.table > tbody > tr > td.info, -.table > tfoot > tr > td.info, -.table > thead > tr > th.info, -.table > tbody > tr > th.info, -.table > tfoot > tr > th.info, -.table > thead > tr.info > td, -.table > tbody > tr.info > td, -.table > tfoot > tr.info > td, -.table > thead > tr.info > th, -.table > tbody > tr.info > th, -.table > tfoot > tr.info > th { - background-color: #d9edf7; -} -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, -.table-hover > tbody > tr.info:hover > td, -.table-hover > tbody > tr:hover > .info, -.table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; -} -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; -} -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td, -.table-hover > tbody > tr:hover > .warning, -.table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; -} -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; -} -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td, -.table-hover > tbody > tr:hover > .danger, -.table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; -} -.table-responsive { - min-height: .01%; - overflow-x: auto; -} -@media screen and (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-y: hidden; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -label { - display: inline-block; - max-width: 100%; - margin-bottom: 5px; - font-weight: bold; -} -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - line-height: normal; -} -input[type="file"] { - display: block; -} -input[type="range"] { - display: block; - width: 100%; -} -select[multiple], -select[size] { - height: auto; -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.42857143; - color: #555; -} -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; - -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -} -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); -} -.form-control::-moz-placeholder { - color: #999; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #999; -} -.form-control::-webkit-input-placeholder { - color: #999; -} -.form-control::-ms-expand { - background-color: transparent; - border: 0; -} -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - background-color: #eee; - opacity: 1; -} -.form-control[disabled], -fieldset[disabled] .form-control { - cursor: not-allowed; -} -textarea.form-control { - height: auto; -} -input[type="search"] { - -webkit-appearance: none; -} -@media screen and (-webkit-min-device-pixel-ratio: 0) { - input[type="date"].form-control, - input[type="time"].form-control, - input[type="datetime-local"].form-control, - input[type="month"].form-control { - line-height: 34px; - } - input[type="date"].input-sm, - input[type="time"].input-sm, - input[type="datetime-local"].input-sm, - input[type="month"].input-sm, - .input-group-sm input[type="date"], - .input-group-sm input[type="time"], - .input-group-sm input[type="datetime-local"], - .input-group-sm input[type="month"] { - line-height: 30px; - } - input[type="date"].input-lg, - input[type="time"].input-lg, - input[type="datetime-local"].input-lg, - input[type="month"].input-lg, - .input-group-lg input[type="date"], - .input-group-lg input[type="time"], - .input-group-lg input[type="datetime-local"], - .input-group-lg input[type="month"] { - line-height: 46px; - } -} -.form-group { - margin-bottom: 15px; -} -.radio, -.checkbox { - position: relative; - display: block; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - min-height: 20px; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-top: 4px \9; - margin-left: -20px; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} -.radio-inline, -.checkbox-inline { - position: relative; - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"].disabled, -input[type="checkbox"].disabled, -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"] { - cursor: not-allowed; -} -.radio-inline.disabled, -.checkbox-inline.disabled, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} -.radio.disabled label, -.checkbox.disabled label, -fieldset[disabled] .radio label, -fieldset[disabled] .checkbox label { - cursor: not-allowed; -} -.form-control-static { - min-height: 34px; - padding-top: 7px; - padding-bottom: 7px; - margin-bottom: 0; -} -.form-control-static.input-lg, -.form-control-static.input-sm { - padding-right: 0; - padding-left: 0; -} -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-sm { - height: 30px; - line-height: 30px; -} -textarea.input-sm, -select[multiple].input-sm { - height: auto; -} -.form-group-sm .form-control { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.form-group-sm select.form-control { - height: 30px; - line-height: 30px; -} -.form-group-sm textarea.form-control, -.form-group-sm select[multiple].form-control { - height: auto; -} -.form-group-sm .form-control-static { - height: 30px; - min-height: 32px; - padding: 6px 10px; - font-size: 12px; - line-height: 1.5; -} -.input-lg { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -select.input-lg { - height: 46px; - line-height: 46px; -} -textarea.input-lg, -select[multiple].input-lg { - height: auto; -} -.form-group-lg .form-control { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -.form-group-lg select.form-control { - height: 46px; - line-height: 46px; -} -.form-group-lg textarea.form-control, -.form-group-lg select[multiple].form-control { - height: auto; -} -.form-group-lg .form-control-static { - height: 46px; - min-height: 38px; - padding: 11px 16px; - font-size: 18px; - line-height: 1.3333333; -} -.has-feedback { - position: relative; -} -.has-feedback .form-control { - padding-right: 42.5px; -} -.form-control-feedback { - position: absolute; - top: 0; - right: 0; - z-index: 2; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; - pointer-events: none; -} -.input-lg + .form-control-feedback, -.input-group-lg + .form-control-feedback, -.form-group-lg .form-control + .form-control-feedback { - width: 46px; - height: 46px; - line-height: 46px; -} -.input-sm + .form-control-feedback, -.input-group-sm + .form-control-feedback, -.form-group-sm .form-control + .form-control-feedback { - width: 30px; - height: 30px; - line-height: 30px; -} -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline, -.has-success.radio label, -.has-success.checkbox label, -.has-success.radio-inline label, -.has-success.checkbox-inline label { - color: #3c763d; -} -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; -} -.has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; -} -.has-success .form-control-feedback { - color: #3c763d; -} -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline, -.has-warning.radio label, -.has-warning.checkbox label, -.has-warning.radio-inline label, -.has-warning.checkbox-inline label { - color: #8a6d3b; -} -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; -} -.has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; -} -.has-warning .form-control-feedback { - color: #8a6d3b; -} -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline, -.has-error.radio label, -.has-error.checkbox label, -.has-error.radio-inline label, -.has-error.checkbox-inline label { - color: #a94442; -} -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; -} -.has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; -} -.has-error .form-control-feedback { - color: #a94442; -} -.has-feedback label ~ .form-control-feedback { - top: 25px; -} -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; -} -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .form-control-static { - display: inline-block; - } - .form-inline .input-group { - display: inline-table; - vertical-align: middle; - } - .form-inline .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .form-inline .input-group .form-control { - width: auto; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio label, - .form-inline .checkbox label { - padding-left: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .form-horizontal .control-label { - padding-top: 7px; - margin-bottom: 0; - text-align: right; - } -} -.form-horizontal .has-feedback .form-control-feedback { - right: 15px; -} -@media (min-width: 768px) { - .form-horizontal .form-group-lg .control-label { - padding-top: 11px; - font-size: 18px; - } -} -@media (min-width: 768px) { - .form-horizontal .form-group-sm .control-label { - padding-top: 6px; - font-size: 12px; - } -} -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.42857143; - text-align: center; - white-space: nowrap; - vertical-align: middle; - -ms-touch-action: manipulation; - touch-action: manipulation; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.btn:focus, -.btn:active:focus, -.btn.active:focus, -.btn.focus, -.btn:active.focus, -.btn.active.focus { - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn:hover, -.btn:focus, -.btn.focus { - color: #333; - text-decoration: none; -} -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - cursor: not-allowed; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; - opacity: .65; -} -a.btn.disabled, -fieldset[disabled] a.btn { - pointer-events: none; -} -.btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; -} -.btn-default:focus, -.btn-default.focus { - color: #333; - background-color: #e6e6e6; - border-color: #8c8c8c; -} -.btn-default:hover { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active:hover, -.btn-default.active:hover, -.open > .dropdown-toggle.btn-default:hover, -.btn-default:active:focus, -.btn-default.active:focus, -.open > .dropdown-toggle.btn-default:focus, -.btn-default:active.focus, -.btn-default.active.focus, -.open > .dropdown-toggle.btn-default.focus { - color: #333; - background-color: #d4d4d4; - border-color: #8c8c8c; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - background-image: none; -} -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled.focus, -.btn-default[disabled].focus, -fieldset[disabled] .btn-default.focus { - background-color: #fff; - border-color: #ccc; -} -.btn-default .badge { - color: #fff; - background-color: #333; -} -.btn-primary { - color: #fff; - background-color: #337ab7; - border-color: #2e6da4; -} -.btn-primary:focus, -.btn-primary.focus { - color: #fff; - background-color: #286090; - border-color: #122b40; -} -.btn-primary:hover { - color: #fff; - background-color: #286090; - border-color: #204d74; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - color: #fff; - background-color: #286090; - border-color: #204d74; -} -.btn-primary:active:hover, -.btn-primary.active:hover, -.open > .dropdown-toggle.btn-primary:hover, -.btn-primary:active:focus, -.btn-primary.active:focus, -.open > .dropdown-toggle.btn-primary:focus, -.btn-primary:active.focus, -.btn-primary.active.focus, -.open > .dropdown-toggle.btn-primary.focus { - color: #fff; - background-color: #204d74; - border-color: #122b40; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - background-image: none; -} -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled.focus, -.btn-primary[disabled].focus, -fieldset[disabled] .btn-primary.focus { - background-color: #337ab7; - border-color: #2e6da4; -} -.btn-primary .badge { - color: #337ab7; - background-color: #fff; -} -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success:focus, -.btn-success.focus { - color: #fff; - background-color: #449d44; - border-color: #255625; -} -.btn-success:hover { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active:hover, -.btn-success.active:hover, -.open > .dropdown-toggle.btn-success:hover, -.btn-success:active:focus, -.btn-success.active:focus, -.open > .dropdown-toggle.btn-success:focus, -.btn-success:active.focus, -.btn-success.active.focus, -.open > .dropdown-toggle.btn-success.focus { - color: #fff; - background-color: #398439; - border-color: #255625; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - background-image: none; -} -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled.focus, -.btn-success[disabled].focus, -fieldset[disabled] .btn-success.focus { - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info:focus, -.btn-info.focus { - color: #fff; - background-color: #31b0d5; - border-color: #1b6d85; -} -.btn-info:hover { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active:hover, -.btn-info.active:hover, -.open > .dropdown-toggle.btn-info:hover, -.btn-info:active:focus, -.btn-info.active:focus, -.open > .dropdown-toggle.btn-info:focus, -.btn-info:active.focus, -.btn-info.active.focus, -.open > .dropdown-toggle.btn-info.focus { - color: #fff; - background-color: #269abc; - border-color: #1b6d85; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - background-image: none; -} -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled.focus, -.btn-info[disabled].focus, -fieldset[disabled] .btn-info.focus { - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning:focus, -.btn-warning.focus { - color: #fff; - background-color: #ec971f; - border-color: #985f0d; -} -.btn-warning:hover { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active:hover, -.btn-warning.active:hover, -.open > .dropdown-toggle.btn-warning:hover, -.btn-warning:active:focus, -.btn-warning.active:focus, -.open > .dropdown-toggle.btn-warning:focus, -.btn-warning:active.focus, -.btn-warning.active.focus, -.open > .dropdown-toggle.btn-warning.focus { - color: #fff; - background-color: #d58512; - border-color: #985f0d; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - background-image: none; -} -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled.focus, -.btn-warning[disabled].focus, -fieldset[disabled] .btn-warning.focus { - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger:focus, -.btn-danger.focus { - color: #fff; - background-color: #c9302c; - border-color: #761c19; -} -.btn-danger:hover { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active:hover, -.btn-danger.active:hover, -.open > .dropdown-toggle.btn-danger:hover, -.btn-danger:active:focus, -.btn-danger.active:focus, -.open > .dropdown-toggle.btn-danger:focus, -.btn-danger:active.focus, -.btn-danger.active.focus, -.open > .dropdown-toggle.btn-danger.focus { - color: #fff; - background-color: #ac2925; - border-color: #761c19; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - background-image: none; -} -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled.focus, -.btn-danger[disabled].focus, -fieldset[disabled] .btn-danger.focus { - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} -.btn-link { - font-weight: normal; - color: #337ab7; - border-radius: 0; -} -.btn-link, -.btn-link:active, -.btn-link.active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} -.btn-link:hover, -.btn-link:focus { - color: #23527c; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #777; - text-decoration: none; -} -.btn-lg, -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -.btn-sm, -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-xs, -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.fade { - opacity: 0; - -webkit-transition: opacity .15s linear; - -o-transition: opacity .15s linear; - transition: opacity .15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - display: none; -} -.collapse.in { - display: block; -} -tr.collapse.in { - display: table-row; -} -tbody.collapse.in { - display: table-row-group; -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition-timing-function: ease; - -o-transition-timing-function: ease; - transition-timing-function: ease; - -webkit-transition-duration: .35s; - -o-transition-duration: .35s; - transition-duration: .35s; - -webkit-transition-property: height, visibility; - -o-transition-property: height, visibility; - transition-property: height, visibility; -} -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px dashed; - border-top: 4px solid \9; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} -.dropup, -.dropdown { - position: relative; -} -.dropdown-toggle:focus { - outline: 0; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - text-align: left; - list-style: none; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857143; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - background-color: #337ab7; - outline: 0; -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #777; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} -.dropdown-menu-right { - right: 0; - left: auto; -} -.dropdown-menu-left { - right: auto; - left: 0; -} -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857143; - color: #777; - white-space: nowrap; -} -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - content: ""; - border-top: 0; - border-bottom: 4px dashed; - border-bottom: 4px solid \9; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 2px; -} -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } - .navbar-right .dropdown-menu-left { - right: auto; - left: 0; - } -} -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} -.btn-toolbar { - margin-left: -5px; -} -.btn-toolbar .btn, -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} -.btn-group > .btn:first-child { - margin-left: 0; -} -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} -.btn .caret { - margin-left: 0; -} -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} -.btn-group-vertical > .btn-group > .btn { - float: none; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; -} -.btn-group-justified > .btn-group .btn { - width: 100%; -} -.btn-group-justified > .btn-group .dropdown-menu { - left: auto; -} -[data-toggle="buttons"] > .btn input[type="radio"], -[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], -[data-toggle="buttons"] > .btn input[type="checkbox"], -[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { - position: absolute; - clip: rect(0, 0, 0, 0); - pointer-events: none; -} -.input-group { - position: relative; - display: table; - border-collapse: separate; -} -.input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; -} -.input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; -} -.input-group .form-control:focus { - z-index: 3; -} -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; - border-radius: 6px; -} -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn, -select[multiple].input-group-lg > .form-control, -select[multiple].input-group-lg > .input-group-addon, -select[multiple].input-group-lg > .input-group-btn > .btn { - height: auto; -} -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn, -select[multiple].input-group-sm > .form-control, -select[multiple].input-group-sm > .input-group-addon, -select[multiple].input-group-sm > .input-group-btn > .btn { - height: auto; -} -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555; - text-align: center; - background-color: #eee; - border: 1px solid #ccc; - border-radius: 4px; -} -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group-addon:first-child { - border-right: 0; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group-addon:last-child { - border-left: 0; -} -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} -.input-group-btn > .btn { - position: relative; -} -.input-group-btn > .btn + .btn { - margin-left: -1px; -} -.input-group-btn > .btn:hover, -.input-group-btn > .btn:focus, -.input-group-btn > .btn:active { - z-index: 2; -} -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - z-index: 2; - margin-left: -1px; -} -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li.disabled > a { - color: #777; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #777; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eee; - border-color: #337ab7; -} -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eee #eee #ddd; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555; - cursor: default; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 4px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #fff; - background-color: #337ab7; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - -webkit-overflow-scrolling: touch; - border-top: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-device-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - height: 50px; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -.navbar-brand > img { - display: block; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} -.navbar-nav { - margin: 7.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } -} -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); -} -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .form-control-static { - display: inline-block; - } - .navbar-form .input-group { - display: inline-table; - vertical-align: middle; - } - .navbar-form .input-group .input-group-addon, - .navbar-form .input-group .input-group-btn, - .navbar-form .input-group .form-control { - width: auto; - } - .navbar-form .input-group > .form-control { - width: 100%; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio label, - .navbar-form .checkbox label { - padding-left: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } - .navbar-form .form-group:last-child { - margin-bottom: 0; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - margin-bottom: 0; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - margin-right: -15px; - } - .navbar-right ~ .navbar-right { - margin-right: 0; - } -} -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} -.navbar-default .navbar-brand { - color: #777; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777; -} -.navbar-default .navbar-nav > li > a { - color: #777; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333; - background-color: transparent; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555; - background-color: #e7e7e7; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #ddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #ddd; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555; - background-color: #e7e7e7; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #777; -} -.navbar-default .navbar-link:hover { - color: #333; -} -.navbar-default .btn-link { - color: #777; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #333; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; -} -.navbar-inverse { - background-color: #222; - border-color: #080808; -} -.navbar-inverse .navbar-brand { - color: #9d9d9d; -} -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-text { - color: #9d9d9d; -} -.navbar-inverse .navbar-nav > li > a { - color: #9d9d9d; -} -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #080808; -} -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; -} -.navbar-inverse .navbar-toggle { - border-color: #333; -} -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333; -} -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; -} -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #fff; - background-color: #080808; -} -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #9d9d9d; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; - } -} -.navbar-inverse .navbar-link { - color: #9d9d9d; -} -.navbar-inverse .navbar-link:hover { - color: #fff; -} -.navbar-inverse .btn-link { - color: #9d9d9d; -} -.navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link:focus { - color: #fff; -} -.navbar-inverse .btn-link[disabled]:hover, -fieldset[disabled] .navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link[disabled]:focus, -fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; -} -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; -} -.breadcrumb > li + li:before { - padding: 0 5px; - color: #ccc; - content: "/\00a0"; -} -.breadcrumb > .active { - color: #777; -} -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} -.pagination > li { - display: inline; -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.42857143; - color: #337ab7; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - z-index: 2; - color: #23527c; - background-color: #eee; - border-color: #ddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 3; - color: #fff; - cursor: default; - background-color: #337ab7; - border-color: #337ab7; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #777; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; -} -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; - line-height: 1.3333333; -} -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; -} -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eee; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #777; - cursor: not-allowed; - background-color: #fff; -} -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} -a.label:hover, -a.label:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label:empty { - display: none; -} -.btn .label { - position: relative; - top: -1px; -} -.label-default { - background-color: #777; -} -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #5e5e5e; -} -.label-primary { - background-color: #337ab7; -} -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #286090; -} -.label-success { - background-color: #5cb85c; -} -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} -.label-info { - background-color: #5bc0de; -} -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} -.label-warning { - background-color: #f0ad4e; -} -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} -.label-danger { - background-color: #d9534f; -} -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: middle; - background-color: #777; - border-radius: 10px; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.btn-xs .badge, -.btn-group-xs > .btn .badge { - top: 0; - padding: 1px 5px; -} -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #337ab7; - background-color: #fff; -} -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.jumbotron { - padding-top: 30px; - padding-bottom: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #eee; -} -.jumbotron h1, -.jumbotron .h1 { - color: inherit; -} -.jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron, -.container-fluid .jumbotron { - padding-right: 15px; - padding-left: 15px; - border-radius: 6px; -} -.jumbotron .container { - max-width: 100%; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron, - .container-fluid .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: border .2s ease-in-out; - -o-transition: border .2s ease-in-out; - transition: border .2s ease-in-out; -} -.thumbnail > img, -.thumbnail a > img { - margin-right: auto; - margin-left: auto; -} -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #337ab7; -} -.thumbnail .caption { - padding: 9px; - color: #333; -} -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} -.alert h4 { - margin-top: 0; - color: inherit; -} -.alert .alert-link { - font-weight: bold; -} -.alert > p, -.alert > ul { - margin-bottom: 0; -} -.alert > p + p { - margin-top: 5px; -} -.alert-dismissable, -.alert-dismissible { - padding-right: 35px; -} -.alert-dismissable .close, -.alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #2b542c; -} -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info hr { - border-top-color: #a6e1ec; -} -.alert-info .alert-link { - color: #245269; -} -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.alert-warning hr { - border-top-color: #f7e1b5; -} -.alert-warning .alert-link { - color: #66512c; -} -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.alert-danger hr { - border-top-color: #e4b9c0; -} -.alert-danger .alert-link { - color: #843534; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); -} -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #fff; - text-align: center; - background-color: #337ab7; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - -webkit-transition: width .6s ease; - -o-transition: width .6s ease; - transition: width .6s ease; -} -.progress-striped .progress-bar, -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .progress-bar, -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-bar-success { - background-color: #5cb85c; -} -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-info { - background-color: #5bc0de; -} -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-warning { - background-color: #f0ad4e; -} -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-danger { - background-color: #d9534f; -} -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; -} -.media, -.media-body { - overflow: hidden; - zoom: 1; -} -.media-body { - width: 10000px; -} -.media-object { - display: block; -} -.media-object.img-thumbnail { - max-width: none; -} -.media-right, -.media > .pull-right { - padding-left: 10px; -} -.media-left, -.media > .pull-left { - padding-right: 10px; -} -.media-left, -.media-right, -.media-body { - display: table-cell; - vertical-align: top; -} -.media-middle { - vertical-align: middle; -} -.media-bottom { - vertical-align: bottom; -} -.media-heading { - margin-top: 0; - margin-bottom: 5px; -} -.media-list { - padding-left: 0; - list-style: none; -} -.list-group { - padding-left: 0; - margin-bottom: 20px; -} -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; -} -.list-group-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -a.list-group-item, -button.list-group-item { - color: #555; -} -a.list-group-item .list-group-item-heading, -button.list-group-item .list-group-item-heading { - color: #333; -} -a.list-group-item:hover, -button.list-group-item:hover, -a.list-group-item:focus, -button.list-group-item:focus { - color: #555; - text-decoration: none; - background-color: #f5f5f5; -} -button.list-group-item { - width: 100%; - text-align: left; -} -.list-group-item.disabled, -.list-group-item.disabled:hover, -.list-group-item.disabled:focus { - color: #777; - cursor: not-allowed; - background-color: #eee; -} -.list-group-item.disabled .list-group-item-heading, -.list-group-item.disabled:hover .list-group-item-heading, -.list-group-item.disabled:focus .list-group-item-heading { - color: inherit; -} -.list-group-item.disabled .list-group-item-text, -.list-group-item.disabled:hover .list-group-item-text, -.list-group-item.disabled:focus .list-group-item-text { - color: #777; -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #337ab7; - border-color: #337ab7; -} -.list-group-item.active .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading, -.list-group-item.active .list-group-item-heading > small, -.list-group-item.active:hover .list-group-item-heading > small, -.list-group-item.active:focus .list-group-item-heading > small, -.list-group-item.active .list-group-item-heading > .small, -.list-group-item.active:hover .list-group-item-heading > .small, -.list-group-item.active:focus .list-group-item-heading > .small { - color: inherit; -} -.list-group-item.active .list-group-item-text, -.list-group-item.active:hover .list-group-item-text, -.list-group-item.active:focus .list-group-item-text { - color: #c7ddef; -} -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} -a.list-group-item-success, -button.list-group-item-success { - color: #3c763d; -} -a.list-group-item-success .list-group-item-heading, -button.list-group-item-success .list-group-item-heading { - color: inherit; -} -a.list-group-item-success:hover, -button.list-group-item-success:hover, -a.list-group-item-success:focus, -button.list-group-item-success:focus { - color: #3c763d; - background-color: #d0e9c6; -} -a.list-group-item-success.active, -button.list-group-item-success.active, -a.list-group-item-success.active:hover, -button.list-group-item-success.active:hover, -a.list-group-item-success.active:focus, -button.list-group-item-success.active:focus { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} -a.list-group-item-info, -button.list-group-item-info { - color: #31708f; -} -a.list-group-item-info .list-group-item-heading, -button.list-group-item-info .list-group-item-heading { - color: inherit; -} -a.list-group-item-info:hover, -button.list-group-item-info:hover, -a.list-group-item-info:focus, -button.list-group-item-info:focus { - color: #31708f; - background-color: #c4e3f3; -} -a.list-group-item-info.active, -button.list-group-item-info.active, -a.list-group-item-info.active:hover, -button.list-group-item-info.active:hover, -a.list-group-item-info.active:focus, -button.list-group-item-info.active:focus { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} -a.list-group-item-warning, -button.list-group-item-warning { - color: #8a6d3b; -} -a.list-group-item-warning .list-group-item-heading, -button.list-group-item-warning .list-group-item-heading { - color: inherit; -} -a.list-group-item-warning:hover, -button.list-group-item-warning:hover, -a.list-group-item-warning:focus, -button.list-group-item-warning:focus { - color: #8a6d3b; - background-color: #faf2cc; -} -a.list-group-item-warning.active, -button.list-group-item-warning.active, -a.list-group-item-warning.active:hover, -button.list-group-item-warning.active:hover, -a.list-group-item-warning.active:focus, -button.list-group-item-warning.active:focus { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} -a.list-group-item-danger, -button.list-group-item-danger { - color: #a94442; -} -a.list-group-item-danger .list-group-item-heading, -button.list-group-item-danger .list-group-item-heading { - color: inherit; -} -a.list-group-item-danger:hover, -button.list-group-item-danger:hover, -a.list-group-item-danger:focus, -button.list-group-item-danger:focus { - color: #a94442; - background-color: #ebcccc; -} -a.list-group-item-danger.active, -button.list-group-item-danger.active, -a.list-group-item-danger.active:hover, -button.list-group-item-danger.active:hover, -a.list-group-item-danger.active:focus, -button.list-group-item-danger.active:focus { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} -.panel { - margin-bottom: 20px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: 0 1px 1px rgba(0, 0, 0, .05); -} -.panel-body { - padding: 15px; -} -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} -.panel-title > a, -.panel-title > small, -.panel-title > .small, -.panel-title > small > a, -.panel-title > .small > a { - color: inherit; -} -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .list-group, -.panel > .panel-collapse > .list-group { - margin-bottom: 0; -} -.panel > .list-group .list-group-item, -.panel > .panel-collapse > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; -} -.panel > .list-group:first-child .list-group-item:first-child, -.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .list-group:last-child .list-group-item:last-child, -.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} -.list-group + .panel-footer { - border-top-width: 0; -} -.panel > .table, -.panel > .table-responsive > .table, -.panel > .panel-collapse > .table { - margin-bottom: 0; -} -.panel > .table caption, -.panel > .table-responsive > .table caption, -.panel > .panel-collapse > .table caption { - padding-right: 15px; - padding-left: 15px; -} -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; -} -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; -} -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive, -.panel > .table + .panel-body, -.panel > .table-responsive + .panel-body { - border-top: 1px solid #ddd; -} -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; -} -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} -.panel > .table-bordered > thead > tr:first-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, -.panel > .table-bordered > tbody > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, -.panel > .table-bordered > thead > tr:first-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, -.panel > .table-bordered > tbody > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; -} -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; -} -.panel > .table-responsive { - margin-bottom: 0; - border: 0; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 4px; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group .panel-heading { - border-bottom: 0; -} -.panel-group .panel-heading + .panel-collapse > .panel-body, -.panel-group .panel-heading + .panel-collapse > .list-group { - border-top: 1px solid #ddd; -} -.panel-group .panel-footer { - border-top: 0; -} -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; -} -.panel-default { - border-color: #ddd; -} -.panel-default > .panel-heading { - color: #333; - background-color: #f5f5f5; - border-color: #ddd; -} -.panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; -} -.panel-default > .panel-heading .badge { - color: #f5f5f5; - background-color: #333; -} -.panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; -} -.panel-primary { - border-color: #337ab7; -} -.panel-primary > .panel-heading { - color: #fff; - background-color: #337ab7; - border-color: #337ab7; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #337ab7; -} -.panel-primary > .panel-heading .badge { - color: #337ab7; - background-color: #fff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #337ab7; -} -.panel-success { - border-color: #d6e9c6; -} -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #d6e9c6; -} -.panel-success > .panel-heading .badge { - color: #dff0d8; - background-color: #3c763d; -} -.panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #d6e9c6; -} -.panel-info { - border-color: #bce8f1; -} -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #bce8f1; -} -.panel-info > .panel-heading .badge { - color: #d9edf7; - background-color: #31708f; -} -.panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #bce8f1; -} -.panel-warning { - border-color: #faebcc; -} -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #faebcc; -} -.panel-warning > .panel-heading .badge { - color: #fcf8e3; - background-color: #8a6d3b; -} -.panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #faebcc; -} -.panel-danger { - border-color: #ebccd1; -} -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ebccd1; -} -.panel-danger > .panel-heading .badge { - color: #f2dede; - background-color: #a94442; -} -.panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ebccd1; -} -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; -} -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object, -.embed-responsive video { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} -.embed-responsive-16by9 { - padding-bottom: 56.25%; -} -.embed-responsive-4by3 { - padding-bottom: 75%; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, .15); -} -.well-lg { - padding: 24px; - border-radius: 6px; -} -.well-sm { - padding: 9px; - border-radius: 3px; -} -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - filter: alpha(opacity=20); - opacity: .2; -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - filter: alpha(opacity=50); - opacity: .5; -} -button.close { - -webkit-appearance: none; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; -} -.modal-open { - overflow: hidden; -} -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: hidden; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - -o-transition: -o-transform .3s ease-out; - transition: transform .3s ease-out; - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - -o-transform: translate(0, -25%); - transform: translate(0, -25%); -} -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - -o-transform: translate(0, 0); - transform: translate(0, 0); -} -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} -.modal-content { - position: relative; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - outline: 0; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); - box-shadow: 0 3px 9px rgba(0, 0, 0, .5); -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - filter: alpha(opacity=0); - opacity: 0; -} -.modal-backdrop.in { - filter: alpha(opacity=50); - opacity: .5; -} -.modal-header { - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} -.modal-header .close { - margin-top: -2px; -} -.modal-title { - margin: 0; - line-height: 1.42857143; -} -.modal-body { - position: relative; - padding: 15px; -} -.modal-footer { - padding: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - } - .modal-sm { - width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg { - width: 900px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 12px; - font-style: normal; - font-weight: normal; - line-height: 1.42857143; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - white-space: normal; - filter: alpha(opacity=0); - opacity: 0; - - line-break: auto; -} -.tooltip.in { - filter: alpha(opacity=90); - opacity: .9; -} -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - background-color: #000; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-left .tooltip-arrow { - right: 5px; - bottom: 0; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-right .tooltip-arrow { - bottom: 0; - left: 5px; - margin-bottom: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - right: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - left: 5px; - margin-top: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: none; - max-width: 276px; - padding: 1px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - font-style: normal; - font-weight: normal; - line-height: 1.42857143; - text-align: left; - text-align: start; - text-decoration: none; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - word-break: normal; - word-spacing: normal; - word-wrap: normal; - white-space: normal; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - - line-break: auto; -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} -.popover-content { - padding: 9px 14px; -} -.popover > .arrow, -.popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover > .arrow { - border-width: 11px; -} -.popover > .arrow:after { - content: ""; - border-width: 10px; -} -.popover.top > .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, .25); - border-bottom-width: 0; -} -.popover.top > .arrow:after { - bottom: 1px; - margin-left: -10px; - content: " "; - border-top-color: #fff; - border-bottom-width: 0; -} -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, .25); - border-left-width: 0; -} -.popover.right > .arrow:after { - bottom: -10px; - left: 1px; - content: " "; - border-right-color: #fff; - border-left-width: 0; -} -.popover.bottom > .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, .25); -} -.popover.bottom > .arrow:after { - top: 1px; - margin-left: -10px; - content: " "; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, .25); -} -.popover.left > .arrow:after { - right: 1px; - bottom: -10px; - content: " "; - border-right-width: 0; - border-left-color: #fff; -} -.carousel { - position: relative; -} -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: .6s ease-in-out left; - -o-transition: .6s ease-in-out left; - transition: .6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - line-height: 1; -} -@media all and (transform-3d), (-webkit-transform-3d) { - .carousel-inner > .item { - -webkit-transition: -webkit-transform .6s ease-in-out; - -o-transition: -o-transform .6s ease-in-out; - transition: transform .6s ease-in-out; - - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-perspective: 1000px; - perspective: 1000px; - } - .carousel-inner > .item.next, - .carousel-inner > .item.active.right { - left: 0; - -webkit-transform: translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0); - } - .carousel-inner > .item.prev, - .carousel-inner > .item.active.left { - left: 0; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); - } - .carousel-inner > .item.next.left, - .carousel-inner > .item.prev.right, - .carousel-inner > .item.active { - left: 0; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); - } -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); - background-color: rgba(0, 0, 0, 0); - filter: alpha(opacity=50); - opacity: .5; -} -.carousel-control.left { - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - filter: alpha(opacity=90); - outline: 0; - opacity: .9; -} -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; - margin-top: -10px; -} -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; -} -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; -} -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - font-family: serif; - line-height: 1; -} -.carousel-control .icon-prev:before { - content: '\2039'; -} -.carousel-control .icon-next:before { - content: '\203a'; -} -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #fff; - border-radius: 10px; -} -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #fff; -} -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); -} -.carousel-caption .btn { - text-shadow: none; -} -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -10px; - font-size: 30px; - } - .carousel-control .glyphicon-chevron-left, - .carousel-control .icon-prev { - margin-left: -10px; - } - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-next { - margin-right: -10px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} -.clearfix:before, -.clearfix:after, -.dl-horizontal dd:before, -.dl-horizontal dd:after, -.container:before, -.container:after, -.container-fluid:before, -.container-fluid:after, -.row:before, -.row:after, -.form-horizontal .form-group:before, -.form-horizontal .form-group:after, -.btn-toolbar:before, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after, -.nav:before, -.nav:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after, -.navbar-collapse:before, -.navbar-collapse:after, -.pager:before, -.pager:after, -.panel-body:before, -.panel-body:after, -.modal-header:before, -.modal-header:after, -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} -.clearfix:after, -.dl-horizontal dd:after, -.container:after, -.container-fluid:after, -.row:after, -.form-horizontal .form-group:after, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:after, -.nav:after, -.navbar:after, -.navbar-header:after, -.navbar-collapse:after, -.pager:after, -.panel-body:after, -.modal-header:after, -.modal-footer:after { - clear: both; -} -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; -} -.affix { - position: fixed; -} -@-ms-viewport { - width: device-width; -} -.visible-xs, -.visible-sm, -.visible-md, -.visible-lg { - display: none !important; -} -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; -} -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table !important; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} -@media (max-width: 767px) { - .visible-xs-block { - display: block !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline { - display: inline !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline-block { - display: inline-block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table !important; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-block { - display: block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline { - display: inline !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline-block { - display: inline-block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table !important; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-block { - display: block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline { - display: inline !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline-block { - display: inline-block !important; - } -} -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table !important; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} -@media (min-width: 1200px) { - .visible-lg-block { - display: block !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline { - display: inline !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline-block { - display: inline-block !important; - } -} -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } -} -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table !important; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } -} -.visible-print-block { - display: none !important; -} -@media print { - .visible-print-block { - display: block !important; - } -} -.visible-print-inline { - display: none !important; -} -@media print { - .visible-print-inline { - display: inline !important; - } -} -.visible-print-inline-block { - display: none !important; -} -@media print { - .visible-print-inline-block { - display: inline-block !important; - } -} -@media print { - .hidden-print { - display: none !important; - } -} -/*# sourceMappingURL=bootstrap.css.map */ diff --git a/assets/webconfig/css/bootstrap.min.css b/assets/webconfig/css/bootstrap.min.css new file mode 100644 index 00000000..70cbba74 --- /dev/null +++ b/assets/webconfig/css/bootstrap.min.css @@ -0,0 +1,14 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=eddd7d573cfbbd4d70027a5114760ebb) + * Config saved to config.json and https://gist.github.com/eddd7d573cfbbd4d70027a5114760ebb + *//*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover,a.text-primary:focus{color:#286090}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover,a.bg-primary:focus{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-header:before,.modal-header:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-header:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}} \ No newline at end of file diff --git a/assets/webconfig/css/flag-icon.min.css b/assets/webconfig/css/flag-icon.min.css deleted file mode 100644 index a1070733..00000000 --- a/assets/webconfig/css/flag-icon.min.css +++ /dev/null @@ -1 +0,0 @@ -.flag-icon,.flag-icon-background{background-size:contain;background-position:50%;background-repeat:no-repeat}.flag-icon{position:relative;display:inline-block;width:1.33333333em;line-height:1em}.flag-icon:before{content:"\00a0"}.flag-icon.flag-icon-squared{width:1em}.flag-icon-ad{background-image:url(../flags/4x3/ad.svg)}.flag-icon-ad.flag-icon-squared{background-image:url(../flags/1x1/ad.svg)}.flag-icon-ae{background-image:url(../flags/4x3/ae.svg)}.flag-icon-ae.flag-icon-squared{background-image:url(../flags/1x1/ae.svg)}.flag-icon-af{background-image:url(../flags/4x3/af.svg)}.flag-icon-af.flag-icon-squared{background-image:url(../flags/1x1/af.svg)}.flag-icon-ag{background-image:url(../flags/4x3/ag.svg)}.flag-icon-ag.flag-icon-squared{background-image:url(../flags/1x1/ag.svg)}.flag-icon-ai{background-image:url(../flags/4x3/ai.svg)}.flag-icon-ai.flag-icon-squared{background-image:url(../flags/1x1/ai.svg)}.flag-icon-al{background-image:url(../flags/4x3/al.svg)}.flag-icon-al.flag-icon-squared{background-image:url(../flags/1x1/al.svg)}.flag-icon-am{background-image:url(../flags/4x3/am.svg)}.flag-icon-am.flag-icon-squared{background-image:url(../flags/1x1/am.svg)}.flag-icon-ao{background-image:url(../flags/4x3/ao.svg)}.flag-icon-ao.flag-icon-squared{background-image:url(../flags/1x1/ao.svg)}.flag-icon-aq{background-image:url(../flags/4x3/aq.svg)}.flag-icon-aq.flag-icon-squared{background-image:url(../flags/1x1/aq.svg)}.flag-icon-ar{background-image:url(../flags/4x3/ar.svg)}.flag-icon-ar.flag-icon-squared{background-image:url(../flags/1x1/ar.svg)}.flag-icon-as{background-image:url(../flags/4x3/as.svg)}.flag-icon-as.flag-icon-squared{background-image:url(../flags/1x1/as.svg)}.flag-icon-at{background-image:url(../flags/4x3/at.svg)}.flag-icon-at.flag-icon-squared{background-image:url(../flags/1x1/at.svg)}.flag-icon-au{background-image:url(../flags/4x3/au.svg)}.flag-icon-au.flag-icon-squared{background-image:url(../flags/1x1/au.svg)}.flag-icon-aw{background-image:url(../flags/4x3/aw.svg)}.flag-icon-aw.flag-icon-squared{background-image:url(../flags/1x1/aw.svg)}.flag-icon-ax{background-image:url(../flags/4x3/ax.svg)}.flag-icon-ax.flag-icon-squared{background-image:url(../flags/1x1/ax.svg)}.flag-icon-az{background-image:url(../flags/4x3/az.svg)}.flag-icon-az.flag-icon-squared{background-image:url(../flags/1x1/az.svg)}.flag-icon-ba{background-image:url(../flags/4x3/ba.svg)}.flag-icon-ba.flag-icon-squared{background-image:url(../flags/1x1/ba.svg)}.flag-icon-bb{background-image:url(../flags/4x3/bb.svg)}.flag-icon-bb.flag-icon-squared{background-image:url(../flags/1x1/bb.svg)}.flag-icon-bd{background-image:url(../flags/4x3/bd.svg)}.flag-icon-bd.flag-icon-squared{background-image:url(../flags/1x1/bd.svg)}.flag-icon-be{background-image:url(../flags/4x3/be.svg)}.flag-icon-be.flag-icon-squared{background-image:url(../flags/1x1/be.svg)}.flag-icon-bf{background-image:url(../flags/4x3/bf.svg)}.flag-icon-bf.flag-icon-squared{background-image:url(../flags/1x1/bf.svg)}.flag-icon-bg{background-image:url(../flags/4x3/bg.svg)}.flag-icon-bg.flag-icon-squared{background-image:url(../flags/1x1/bg.svg)}.flag-icon-bh{background-image:url(../flags/4x3/bh.svg)}.flag-icon-bh.flag-icon-squared{background-image:url(../flags/1x1/bh.svg)}.flag-icon-bi{background-image:url(../flags/4x3/bi.svg)}.flag-icon-bi.flag-icon-squared{background-image:url(../flags/1x1/bi.svg)}.flag-icon-bj{background-image:url(../flags/4x3/bj.svg)}.flag-icon-bj.flag-icon-squared{background-image:url(../flags/1x1/bj.svg)}.flag-icon-bl{background-image:url(../flags/4x3/bl.svg)}.flag-icon-bl.flag-icon-squared{background-image:url(../flags/1x1/bl.svg)}.flag-icon-bm{background-image:url(../flags/4x3/bm.svg)}.flag-icon-bm.flag-icon-squared{background-image:url(../flags/1x1/bm.svg)}.flag-icon-bn{background-image:url(../flags/4x3/bn.svg)}.flag-icon-bn.flag-icon-squared{background-image:url(../flags/1x1/bn.svg)}.flag-icon-bo{background-image:url(../flags/4x3/bo.svg)}.flag-icon-bo.flag-icon-squared{background-image:url(../flags/1x1/bo.svg)}.flag-icon-bq{background-image:url(../flags/4x3/bq.svg)}.flag-icon-bq.flag-icon-squared{background-image:url(../flags/1x1/bq.svg)}.flag-icon-br{background-image:url(../flags/4x3/br.svg)}.flag-icon-br.flag-icon-squared{background-image:url(../flags/1x1/br.svg)}.flag-icon-bs{background-image:url(../flags/4x3/bs.svg)}.flag-icon-bs.flag-icon-squared{background-image:url(../flags/1x1/bs.svg)}.flag-icon-bt{background-image:url(../flags/4x3/bt.svg)}.flag-icon-bt.flag-icon-squared{background-image:url(../flags/1x1/bt.svg)}.flag-icon-bv{background-image:url(../flags/4x3/bv.svg)}.flag-icon-bv.flag-icon-squared{background-image:url(../flags/1x1/bv.svg)}.flag-icon-bw{background-image:url(../flags/4x3/bw.svg)}.flag-icon-bw.flag-icon-squared{background-image:url(../flags/1x1/bw.svg)}.flag-icon-by{background-image:url(../flags/4x3/by.svg)}.flag-icon-by.flag-icon-squared{background-image:url(../flags/1x1/by.svg)}.flag-icon-bz{background-image:url(../flags/4x3/bz.svg)}.flag-icon-bz.flag-icon-squared{background-image:url(../flags/1x1/bz.svg)}.flag-icon-ca{background-image:url(../flags/4x3/ca.svg)}.flag-icon-ca.flag-icon-squared{background-image:url(../flags/1x1/ca.svg)}.flag-icon-cc{background-image:url(../flags/4x3/cc.svg)}.flag-icon-cc.flag-icon-squared{background-image:url(../flags/1x1/cc.svg)}.flag-icon-cd{background-image:url(../flags/4x3/cd.svg)}.flag-icon-cd.flag-icon-squared{background-image:url(../flags/1x1/cd.svg)}.flag-icon-cf{background-image:url(../flags/4x3/cf.svg)}.flag-icon-cf.flag-icon-squared{background-image:url(../flags/1x1/cf.svg)}.flag-icon-cg{background-image:url(../flags/4x3/cg.svg)}.flag-icon-cg.flag-icon-squared{background-image:url(../flags/1x1/cg.svg)}.flag-icon-ch{background-image:url(../flags/4x3/ch.svg)}.flag-icon-ch.flag-icon-squared{background-image:url(../flags/1x1/ch.svg)}.flag-icon-ci{background-image:url(../flags/4x3/ci.svg)}.flag-icon-ci.flag-icon-squared{background-image:url(../flags/1x1/ci.svg)}.flag-icon-ck{background-image:url(../flags/4x3/ck.svg)}.flag-icon-ck.flag-icon-squared{background-image:url(../flags/1x1/ck.svg)}.flag-icon-cl{background-image:url(../flags/4x3/cl.svg)}.flag-icon-cl.flag-icon-squared{background-image:url(../flags/1x1/cl.svg)}.flag-icon-cm{background-image:url(../flags/4x3/cm.svg)}.flag-icon-cm.flag-icon-squared{background-image:url(../flags/1x1/cm.svg)}.flag-icon-cn{background-image:url(../flags/4x3/cn.svg)}.flag-icon-cn.flag-icon-squared{background-image:url(../flags/1x1/cn.svg)}.flag-icon-co{background-image:url(../flags/4x3/co.svg)}.flag-icon-co.flag-icon-squared{background-image:url(../flags/1x1/co.svg)}.flag-icon-cr{background-image:url(../flags/4x3/cr.svg)}.flag-icon-cr.flag-icon-squared{background-image:url(../flags/1x1/cr.svg)}.flag-icon-cu{background-image:url(../flags/4x3/cu.svg)}.flag-icon-cu.flag-icon-squared{background-image:url(../flags/1x1/cu.svg)}.flag-icon-cv{background-image:url(../flags/4x3/cv.svg)}.flag-icon-cv.flag-icon-squared{background-image:url(../flags/1x1/cv.svg)}.flag-icon-cw{background-image:url(../flags/4x3/cw.svg)}.flag-icon-cw.flag-icon-squared{background-image:url(../flags/1x1/cw.svg)}.flag-icon-cx{background-image:url(../flags/4x3/cx.svg)}.flag-icon-cx.flag-icon-squared{background-image:url(../flags/1x1/cx.svg)}.flag-icon-cy{background-image:url(../flags/4x3/cy.svg)}.flag-icon-cy.flag-icon-squared{background-image:url(../flags/1x1/cy.svg)}.flag-icon-cz{background-image:url(../flags/4x3/cz.svg)}.flag-icon-cz.flag-icon-squared{background-image:url(../flags/1x1/cz.svg)}.flag-icon-de{background-image:url(../flags/4x3/de.svg)}.flag-icon-de.flag-icon-squared{background-image:url(../flags/1x1/de.svg)}.flag-icon-dj{background-image:url(../flags/4x3/dj.svg)}.flag-icon-dj.flag-icon-squared{background-image:url(../flags/1x1/dj.svg)}.flag-icon-dk{background-image:url(../flags/4x3/dk.svg)}.flag-icon-dk.flag-icon-squared{background-image:url(../flags/1x1/dk.svg)}.flag-icon-dm{background-image:url(../flags/4x3/dm.svg)}.flag-icon-dm.flag-icon-squared{background-image:url(../flags/1x1/dm.svg)}.flag-icon-do{background-image:url(../flags/4x3/do.svg)}.flag-icon-do.flag-icon-squared{background-image:url(../flags/1x1/do.svg)}.flag-icon-dz{background-image:url(../flags/4x3/dz.svg)}.flag-icon-dz.flag-icon-squared{background-image:url(../flags/1x1/dz.svg)}.flag-icon-ec{background-image:url(../flags/4x3/ec.svg)}.flag-icon-ec.flag-icon-squared{background-image:url(../flags/1x1/ec.svg)}.flag-icon-ee{background-image:url(../flags/4x3/ee.svg)}.flag-icon-ee.flag-icon-squared{background-image:url(../flags/1x1/ee.svg)}.flag-icon-eg{background-image:url(../flags/4x3/eg.svg)}.flag-icon-eg.flag-icon-squared{background-image:url(../flags/1x1/eg.svg)}.flag-icon-eh{background-image:url(../flags/4x3/eh.svg)}.flag-icon-eh.flag-icon-squared{background-image:url(../flags/1x1/eh.svg)}.flag-icon-er{background-image:url(../flags/4x3/er.svg)}.flag-icon-er.flag-icon-squared{background-image:url(../flags/1x1/er.svg)}.flag-icon-es{background-image:url(../flags/4x3/es.svg)}.flag-icon-es.flag-icon-squared{background-image:url(../flags/1x1/es.svg)}.flag-icon-et{background-image:url(../flags/4x3/et.svg)}.flag-icon-et.flag-icon-squared{background-image:url(../flags/1x1/et.svg)}.flag-icon-fi{background-image:url(../flags/4x3/fi.svg)}.flag-icon-fi.flag-icon-squared{background-image:url(../flags/1x1/fi.svg)}.flag-icon-fj{background-image:url(../flags/4x3/fj.svg)}.flag-icon-fj.flag-icon-squared{background-image:url(../flags/1x1/fj.svg)}.flag-icon-fk{background-image:url(../flags/4x3/fk.svg)}.flag-icon-fk.flag-icon-squared{background-image:url(../flags/1x1/fk.svg)}.flag-icon-fm{background-image:url(../flags/4x3/fm.svg)}.flag-icon-fm.flag-icon-squared{background-image:url(../flags/1x1/fm.svg)}.flag-icon-fo{background-image:url(../flags/4x3/fo.svg)}.flag-icon-fo.flag-icon-squared{background-image:url(../flags/1x1/fo.svg)}.flag-icon-fr{background-image:url(../flags/4x3/fr.svg)}.flag-icon-fr.flag-icon-squared{background-image:url(../flags/1x1/fr.svg)}.flag-icon-ga{background-image:url(../flags/4x3/ga.svg)}.flag-icon-ga.flag-icon-squared{background-image:url(../flags/1x1/ga.svg)}.flag-icon-gb{background-image:url(../flags/4x3/gb.svg)}.flag-icon-gb.flag-icon-squared{background-image:url(../flags/1x1/gb.svg)}.flag-icon-gd{background-image:url(../flags/4x3/gd.svg)}.flag-icon-gd.flag-icon-squared{background-image:url(../flags/1x1/gd.svg)}.flag-icon-ge{background-image:url(../flags/4x3/ge.svg)}.flag-icon-ge.flag-icon-squared{background-image:url(../flags/1x1/ge.svg)}.flag-icon-gf{background-image:url(../flags/4x3/gf.svg)}.flag-icon-gf.flag-icon-squared{background-image:url(../flags/1x1/gf.svg)}.flag-icon-gg{background-image:url(../flags/4x3/gg.svg)}.flag-icon-gg.flag-icon-squared{background-image:url(../flags/1x1/gg.svg)}.flag-icon-gh{background-image:url(../flags/4x3/gh.svg)}.flag-icon-gh.flag-icon-squared{background-image:url(../flags/1x1/gh.svg)}.flag-icon-gi{background-image:url(../flags/4x3/gi.svg)}.flag-icon-gi.flag-icon-squared{background-image:url(../flags/1x1/gi.svg)}.flag-icon-gl{background-image:url(../flags/4x3/gl.svg)}.flag-icon-gl.flag-icon-squared{background-image:url(../flags/1x1/gl.svg)}.flag-icon-gm{background-image:url(../flags/4x3/gm.svg)}.flag-icon-gm.flag-icon-squared{background-image:url(../flags/1x1/gm.svg)}.flag-icon-gn{background-image:url(../flags/4x3/gn.svg)}.flag-icon-gn.flag-icon-squared{background-image:url(../flags/1x1/gn.svg)}.flag-icon-gp{background-image:url(../flags/4x3/gp.svg)}.flag-icon-gp.flag-icon-squared{background-image:url(../flags/1x1/gp.svg)}.flag-icon-gq{background-image:url(../flags/4x3/gq.svg)}.flag-icon-gq.flag-icon-squared{background-image:url(../flags/1x1/gq.svg)}.flag-icon-gr{background-image:url(../flags/4x3/gr.svg)}.flag-icon-gr.flag-icon-squared{background-image:url(../flags/1x1/gr.svg)}.flag-icon-gs{background-image:url(../flags/4x3/gs.svg)}.flag-icon-gs.flag-icon-squared{background-image:url(../flags/1x1/gs.svg)}.flag-icon-gt{background-image:url(../flags/4x3/gt.svg)}.flag-icon-gt.flag-icon-squared{background-image:url(../flags/1x1/gt.svg)}.flag-icon-gu{background-image:url(../flags/4x3/gu.svg)}.flag-icon-gu.flag-icon-squared{background-image:url(../flags/1x1/gu.svg)}.flag-icon-gw{background-image:url(../flags/4x3/gw.svg)}.flag-icon-gw.flag-icon-squared{background-image:url(../flags/1x1/gw.svg)}.flag-icon-gy{background-image:url(../flags/4x3/gy.svg)}.flag-icon-gy.flag-icon-squared{background-image:url(../flags/1x1/gy.svg)}.flag-icon-hk{background-image:url(../flags/4x3/hk.svg)}.flag-icon-hk.flag-icon-squared{background-image:url(../flags/1x1/hk.svg)}.flag-icon-hm{background-image:url(../flags/4x3/hm.svg)}.flag-icon-hm.flag-icon-squared{background-image:url(../flags/1x1/hm.svg)}.flag-icon-hn{background-image:url(../flags/4x3/hn.svg)}.flag-icon-hn.flag-icon-squared{background-image:url(../flags/1x1/hn.svg)}.flag-icon-hr{background-image:url(../flags/4x3/hr.svg)}.flag-icon-hr.flag-icon-squared{background-image:url(../flags/1x1/hr.svg)}.flag-icon-ht{background-image:url(../flags/4x3/ht.svg)}.flag-icon-ht.flag-icon-squared{background-image:url(../flags/1x1/ht.svg)}.flag-icon-hu{background-image:url(../flags/4x3/hu.svg)}.flag-icon-hu.flag-icon-squared{background-image:url(../flags/1x1/hu.svg)}.flag-icon-id{background-image:url(../flags/4x3/id.svg)}.flag-icon-id.flag-icon-squared{background-image:url(../flags/1x1/id.svg)}.flag-icon-ie{background-image:url(../flags/4x3/ie.svg)}.flag-icon-ie.flag-icon-squared{background-image:url(../flags/1x1/ie.svg)}.flag-icon-il{background-image:url(../flags/4x3/il.svg)}.flag-icon-il.flag-icon-squared{background-image:url(../flags/1x1/il.svg)}.flag-icon-im{background-image:url(../flags/4x3/im.svg)}.flag-icon-im.flag-icon-squared{background-image:url(../flags/1x1/im.svg)}.flag-icon-in{background-image:url(../flags/4x3/in.svg)}.flag-icon-in.flag-icon-squared{background-image:url(../flags/1x1/in.svg)}.flag-icon-io{background-image:url(../flags/4x3/io.svg)}.flag-icon-io.flag-icon-squared{background-image:url(../flags/1x1/io.svg)}.flag-icon-iq{background-image:url(../flags/4x3/iq.svg)}.flag-icon-iq.flag-icon-squared{background-image:url(../flags/1x1/iq.svg)}.flag-icon-ir{background-image:url(../flags/4x3/ir.svg)}.flag-icon-ir.flag-icon-squared{background-image:url(../flags/1x1/ir.svg)}.flag-icon-is{background-image:url(../flags/4x3/is.svg)}.flag-icon-is.flag-icon-squared{background-image:url(../flags/1x1/is.svg)}.flag-icon-it{background-image:url(../flags/4x3/it.svg)}.flag-icon-it.flag-icon-squared{background-image:url(../flags/1x1/it.svg)}.flag-icon-je{background-image:url(../flags/4x3/je.svg)}.flag-icon-je.flag-icon-squared{background-image:url(../flags/1x1/je.svg)}.flag-icon-jm{background-image:url(../flags/4x3/jm.svg)}.flag-icon-jm.flag-icon-squared{background-image:url(../flags/1x1/jm.svg)}.flag-icon-jo{background-image:url(../flags/4x3/jo.svg)}.flag-icon-jo.flag-icon-squared{background-image:url(../flags/1x1/jo.svg)}.flag-icon-jp{background-image:url(../flags/4x3/jp.svg)}.flag-icon-jp.flag-icon-squared{background-image:url(../flags/1x1/jp.svg)}.flag-icon-ke{background-image:url(../flags/4x3/ke.svg)}.flag-icon-ke.flag-icon-squared{background-image:url(../flags/1x1/ke.svg)}.flag-icon-kg{background-image:url(../flags/4x3/kg.svg)}.flag-icon-kg.flag-icon-squared{background-image:url(../flags/1x1/kg.svg)}.flag-icon-kh{background-image:url(../flags/4x3/kh.svg)}.flag-icon-kh.flag-icon-squared{background-image:url(../flags/1x1/kh.svg)}.flag-icon-ki{background-image:url(../flags/4x3/ki.svg)}.flag-icon-ki.flag-icon-squared{background-image:url(../flags/1x1/ki.svg)}.flag-icon-km{background-image:url(../flags/4x3/km.svg)}.flag-icon-km.flag-icon-squared{background-image:url(../flags/1x1/km.svg)}.flag-icon-kn{background-image:url(../flags/4x3/kn.svg)}.flag-icon-kn.flag-icon-squared{background-image:url(../flags/1x1/kn.svg)}.flag-icon-kp{background-image:url(../flags/4x3/kp.svg)}.flag-icon-kp.flag-icon-squared{background-image:url(../flags/1x1/kp.svg)}.flag-icon-kr{background-image:url(../flags/4x3/kr.svg)}.flag-icon-kr.flag-icon-squared{background-image:url(../flags/1x1/kr.svg)}.flag-icon-kw{background-image:url(../flags/4x3/kw.svg)}.flag-icon-kw.flag-icon-squared{background-image:url(../flags/1x1/kw.svg)}.flag-icon-ky{background-image:url(../flags/4x3/ky.svg)}.flag-icon-ky.flag-icon-squared{background-image:url(../flags/1x1/ky.svg)}.flag-icon-kz{background-image:url(../flags/4x3/kz.svg)}.flag-icon-kz.flag-icon-squared{background-image:url(../flags/1x1/kz.svg)}.flag-icon-la{background-image:url(../flags/4x3/la.svg)}.flag-icon-la.flag-icon-squared{background-image:url(../flags/1x1/la.svg)}.flag-icon-lb{background-image:url(../flags/4x3/lb.svg)}.flag-icon-lb.flag-icon-squared{background-image:url(../flags/1x1/lb.svg)}.flag-icon-lc{background-image:url(../flags/4x3/lc.svg)}.flag-icon-lc.flag-icon-squared{background-image:url(../flags/1x1/lc.svg)}.flag-icon-li{background-image:url(../flags/4x3/li.svg)}.flag-icon-li.flag-icon-squared{background-image:url(../flags/1x1/li.svg)}.flag-icon-lk{background-image:url(../flags/4x3/lk.svg)}.flag-icon-lk.flag-icon-squared{background-image:url(../flags/1x1/lk.svg)}.flag-icon-lr{background-image:url(../flags/4x3/lr.svg)}.flag-icon-lr.flag-icon-squared{background-image:url(../flags/1x1/lr.svg)}.flag-icon-ls{background-image:url(../flags/4x3/ls.svg)}.flag-icon-ls.flag-icon-squared{background-image:url(../flags/1x1/ls.svg)}.flag-icon-lt{background-image:url(../flags/4x3/lt.svg)}.flag-icon-lt.flag-icon-squared{background-image:url(../flags/1x1/lt.svg)}.flag-icon-lu{background-image:url(../flags/4x3/lu.svg)}.flag-icon-lu.flag-icon-squared{background-image:url(../flags/1x1/lu.svg)}.flag-icon-lv{background-image:url(../flags/4x3/lv.svg)}.flag-icon-lv.flag-icon-squared{background-image:url(../flags/1x1/lv.svg)}.flag-icon-ly{background-image:url(../flags/4x3/ly.svg)}.flag-icon-ly.flag-icon-squared{background-image:url(../flags/1x1/ly.svg)}.flag-icon-ma{background-image:url(../flags/4x3/ma.svg)}.flag-icon-ma.flag-icon-squared{background-image:url(../flags/1x1/ma.svg)}.flag-icon-mc{background-image:url(../flags/4x3/mc.svg)}.flag-icon-mc.flag-icon-squared{background-image:url(../flags/1x1/mc.svg)}.flag-icon-md{background-image:url(../flags/4x3/md.svg)}.flag-icon-md.flag-icon-squared{background-image:url(../flags/1x1/md.svg)}.flag-icon-me{background-image:url(../flags/4x3/me.svg)}.flag-icon-me.flag-icon-squared{background-image:url(../flags/1x1/me.svg)}.flag-icon-mf{background-image:url(../flags/4x3/mf.svg)}.flag-icon-mf.flag-icon-squared{background-image:url(../flags/1x1/mf.svg)}.flag-icon-mg{background-image:url(../flags/4x3/mg.svg)}.flag-icon-mg.flag-icon-squared{background-image:url(../flags/1x1/mg.svg)}.flag-icon-mh{background-image:url(../flags/4x3/mh.svg)}.flag-icon-mh.flag-icon-squared{background-image:url(../flags/1x1/mh.svg)}.flag-icon-mk{background-image:url(../flags/4x3/mk.svg)}.flag-icon-mk.flag-icon-squared{background-image:url(../flags/1x1/mk.svg)}.flag-icon-ml{background-image:url(../flags/4x3/ml.svg)}.flag-icon-ml.flag-icon-squared{background-image:url(../flags/1x1/ml.svg)}.flag-icon-mm{background-image:url(../flags/4x3/mm.svg)}.flag-icon-mm.flag-icon-squared{background-image:url(../flags/1x1/mm.svg)}.flag-icon-mn{background-image:url(../flags/4x3/mn.svg)}.flag-icon-mn.flag-icon-squared{background-image:url(../flags/1x1/mn.svg)}.flag-icon-mo{background-image:url(../flags/4x3/mo.svg)}.flag-icon-mo.flag-icon-squared{background-image:url(../flags/1x1/mo.svg)}.flag-icon-mp{background-image:url(../flags/4x3/mp.svg)}.flag-icon-mp.flag-icon-squared{background-image:url(../flags/1x1/mp.svg)}.flag-icon-mq{background-image:url(../flags/4x3/mq.svg)}.flag-icon-mq.flag-icon-squared{background-image:url(../flags/1x1/mq.svg)}.flag-icon-mr{background-image:url(../flags/4x3/mr.svg)}.flag-icon-mr.flag-icon-squared{background-image:url(../flags/1x1/mr.svg)}.flag-icon-ms{background-image:url(../flags/4x3/ms.svg)}.flag-icon-ms.flag-icon-squared{background-image:url(../flags/1x1/ms.svg)}.flag-icon-mt{background-image:url(../flags/4x3/mt.svg)}.flag-icon-mt.flag-icon-squared{background-image:url(../flags/1x1/mt.svg)}.flag-icon-mu{background-image:url(../flags/4x3/mu.svg)}.flag-icon-mu.flag-icon-squared{background-image:url(../flags/1x1/mu.svg)}.flag-icon-mv{background-image:url(../flags/4x3/mv.svg)}.flag-icon-mv.flag-icon-squared{background-image:url(../flags/1x1/mv.svg)}.flag-icon-mw{background-image:url(../flags/4x3/mw.svg)}.flag-icon-mw.flag-icon-squared{background-image:url(../flags/1x1/mw.svg)}.flag-icon-mx{background-image:url(../flags/4x3/mx.svg)}.flag-icon-mx.flag-icon-squared{background-image:url(../flags/1x1/mx.svg)}.flag-icon-my{background-image:url(../flags/4x3/my.svg)}.flag-icon-my.flag-icon-squared{background-image:url(../flags/1x1/my.svg)}.flag-icon-mz{background-image:url(../flags/4x3/mz.svg)}.flag-icon-mz.flag-icon-squared{background-image:url(../flags/1x1/mz.svg)}.flag-icon-na{background-image:url(../flags/4x3/na.svg)}.flag-icon-na.flag-icon-squared{background-image:url(../flags/1x1/na.svg)}.flag-icon-nc{background-image:url(../flags/4x3/nc.svg)}.flag-icon-nc.flag-icon-squared{background-image:url(../flags/1x1/nc.svg)}.flag-icon-ne{background-image:url(../flags/4x3/ne.svg)}.flag-icon-ne.flag-icon-squared{background-image:url(../flags/1x1/ne.svg)}.flag-icon-nf{background-image:url(../flags/4x3/nf.svg)}.flag-icon-nf.flag-icon-squared{background-image:url(../flags/1x1/nf.svg)}.flag-icon-ng{background-image:url(../flags/4x3/ng.svg)}.flag-icon-ng.flag-icon-squared{background-image:url(../flags/1x1/ng.svg)}.flag-icon-ni{background-image:url(../flags/4x3/ni.svg)}.flag-icon-ni.flag-icon-squared{background-image:url(../flags/1x1/ni.svg)}.flag-icon-nl{background-image:url(../flags/4x3/nl.svg)}.flag-icon-nl.flag-icon-squared{background-image:url(../flags/1x1/nl.svg)}.flag-icon-no{background-image:url(../flags/4x3/no.svg)}.flag-icon-no.flag-icon-squared{background-image:url(../flags/1x1/no.svg)}.flag-icon-np{background-image:url(../flags/4x3/np.svg)}.flag-icon-np.flag-icon-squared{background-image:url(../flags/1x1/np.svg)}.flag-icon-nr{background-image:url(../flags/4x3/nr.svg)}.flag-icon-nr.flag-icon-squared{background-image:url(../flags/1x1/nr.svg)}.flag-icon-nu{background-image:url(../flags/4x3/nu.svg)}.flag-icon-nu.flag-icon-squared{background-image:url(../flags/1x1/nu.svg)}.flag-icon-nz{background-image:url(../flags/4x3/nz.svg)}.flag-icon-nz.flag-icon-squared{background-image:url(../flags/1x1/nz.svg)}.flag-icon-om{background-image:url(../flags/4x3/om.svg)}.flag-icon-om.flag-icon-squared{background-image:url(../flags/1x1/om.svg)}.flag-icon-pa{background-image:url(../flags/4x3/pa.svg)}.flag-icon-pa.flag-icon-squared{background-image:url(../flags/1x1/pa.svg)}.flag-icon-pe{background-image:url(../flags/4x3/pe.svg)}.flag-icon-pe.flag-icon-squared{background-image:url(../flags/1x1/pe.svg)}.flag-icon-pf{background-image:url(../flags/4x3/pf.svg)}.flag-icon-pf.flag-icon-squared{background-image:url(../flags/1x1/pf.svg)}.flag-icon-pg{background-image:url(../flags/4x3/pg.svg)}.flag-icon-pg.flag-icon-squared{background-image:url(../flags/1x1/pg.svg)}.flag-icon-ph{background-image:url(../flags/4x3/ph.svg)}.flag-icon-ph.flag-icon-squared{background-image:url(../flags/1x1/ph.svg)}.flag-icon-pk{background-image:url(../flags/4x3/pk.svg)}.flag-icon-pk.flag-icon-squared{background-image:url(../flags/1x1/pk.svg)}.flag-icon-pl{background-image:url(../flags/4x3/pl.svg)}.flag-icon-pl.flag-icon-squared{background-image:url(../flags/1x1/pl.svg)}.flag-icon-pm{background-image:url(../flags/4x3/pm.svg)}.flag-icon-pm.flag-icon-squared{background-image:url(../flags/1x1/pm.svg)}.flag-icon-pn{background-image:url(../flags/4x3/pn.svg)}.flag-icon-pn.flag-icon-squared{background-image:url(../flags/1x1/pn.svg)}.flag-icon-pr{background-image:url(../flags/4x3/pr.svg)}.flag-icon-pr.flag-icon-squared{background-image:url(../flags/1x1/pr.svg)}.flag-icon-ps{background-image:url(../flags/4x3/ps.svg)}.flag-icon-ps.flag-icon-squared{background-image:url(../flags/1x1/ps.svg)}.flag-icon-pt{background-image:url(../flags/4x3/pt.svg)}.flag-icon-pt.flag-icon-squared{background-image:url(../flags/1x1/pt.svg)}.flag-icon-pw{background-image:url(../flags/4x3/pw.svg)}.flag-icon-pw.flag-icon-squared{background-image:url(../flags/1x1/pw.svg)}.flag-icon-py{background-image:url(../flags/4x3/py.svg)}.flag-icon-py.flag-icon-squared{background-image:url(../flags/1x1/py.svg)}.flag-icon-qa{background-image:url(../flags/4x3/qa.svg)}.flag-icon-qa.flag-icon-squared{background-image:url(../flags/1x1/qa.svg)}.flag-icon-re{background-image:url(../flags/4x3/re.svg)}.flag-icon-re.flag-icon-squared{background-image:url(../flags/1x1/re.svg)}.flag-icon-ro{background-image:url(../flags/4x3/ro.svg)}.flag-icon-ro.flag-icon-squared{background-image:url(../flags/1x1/ro.svg)}.flag-icon-rs{background-image:url(../flags/4x3/rs.svg)}.flag-icon-rs.flag-icon-squared{background-image:url(../flags/1x1/rs.svg)}.flag-icon-ru{background-image:url(../flags/4x3/ru.svg)}.flag-icon-ru.flag-icon-squared{background-image:url(../flags/1x1/ru.svg)}.flag-icon-rw{background-image:url(../flags/4x3/rw.svg)}.flag-icon-rw.flag-icon-squared{background-image:url(../flags/1x1/rw.svg)}.flag-icon-sa{background-image:url(../flags/4x3/sa.svg)}.flag-icon-sa.flag-icon-squared{background-image:url(../flags/1x1/sa.svg)}.flag-icon-sb{background-image:url(../flags/4x3/sb.svg)}.flag-icon-sb.flag-icon-squared{background-image:url(../flags/1x1/sb.svg)}.flag-icon-sc{background-image:url(../flags/4x3/sc.svg)}.flag-icon-sc.flag-icon-squared{background-image:url(../flags/1x1/sc.svg)}.flag-icon-sd{background-image:url(../flags/4x3/sd.svg)}.flag-icon-sd.flag-icon-squared{background-image:url(../flags/1x1/sd.svg)}.flag-icon-se{background-image:url(../flags/4x3/se.svg)}.flag-icon-se.flag-icon-squared{background-image:url(../flags/1x1/se.svg)}.flag-icon-sg{background-image:url(../flags/4x3/sg.svg)}.flag-icon-sg.flag-icon-squared{background-image:url(../flags/1x1/sg.svg)}.flag-icon-sh{background-image:url(../flags/4x3/sh.svg)}.flag-icon-sh.flag-icon-squared{background-image:url(../flags/1x1/sh.svg)}.flag-icon-si{background-image:url(../flags/4x3/si.svg)}.flag-icon-si.flag-icon-squared{background-image:url(../flags/1x1/si.svg)}.flag-icon-sj{background-image:url(../flags/4x3/sj.svg)}.flag-icon-sj.flag-icon-squared{background-image:url(../flags/1x1/sj.svg)}.flag-icon-sk{background-image:url(../flags/4x3/sk.svg)}.flag-icon-sk.flag-icon-squared{background-image:url(../flags/1x1/sk.svg)}.flag-icon-sl{background-image:url(../flags/4x3/sl.svg)}.flag-icon-sl.flag-icon-squared{background-image:url(../flags/1x1/sl.svg)}.flag-icon-sm{background-image:url(../flags/4x3/sm.svg)}.flag-icon-sm.flag-icon-squared{background-image:url(../flags/1x1/sm.svg)}.flag-icon-sn{background-image:url(../flags/4x3/sn.svg)}.flag-icon-sn.flag-icon-squared{background-image:url(../flags/1x1/sn.svg)}.flag-icon-so{background-image:url(../flags/4x3/so.svg)}.flag-icon-so.flag-icon-squared{background-image:url(../flags/1x1/so.svg)}.flag-icon-sr{background-image:url(../flags/4x3/sr.svg)}.flag-icon-sr.flag-icon-squared{background-image:url(../flags/1x1/sr.svg)}.flag-icon-ss{background-image:url(../flags/4x3/ss.svg)}.flag-icon-ss.flag-icon-squared{background-image:url(../flags/1x1/ss.svg)}.flag-icon-st{background-image:url(../flags/4x3/st.svg)}.flag-icon-st.flag-icon-squared{background-image:url(../flags/1x1/st.svg)}.flag-icon-sv{background-image:url(../flags/4x3/sv.svg)}.flag-icon-sv.flag-icon-squared{background-image:url(../flags/1x1/sv.svg)}.flag-icon-sx{background-image:url(../flags/4x3/sx.svg)}.flag-icon-sx.flag-icon-squared{background-image:url(../flags/1x1/sx.svg)}.flag-icon-sy{background-image:url(../flags/4x3/sy.svg)}.flag-icon-sy.flag-icon-squared{background-image:url(../flags/1x1/sy.svg)}.flag-icon-sz{background-image:url(../flags/4x3/sz.svg)}.flag-icon-sz.flag-icon-squared{background-image:url(../flags/1x1/sz.svg)}.flag-icon-tc{background-image:url(../flags/4x3/tc.svg)}.flag-icon-tc.flag-icon-squared{background-image:url(../flags/1x1/tc.svg)}.flag-icon-td{background-image:url(../flags/4x3/td.svg)}.flag-icon-td.flag-icon-squared{background-image:url(../flags/1x1/td.svg)}.flag-icon-tf{background-image:url(../flags/4x3/tf.svg)}.flag-icon-tf.flag-icon-squared{background-image:url(../flags/1x1/tf.svg)}.flag-icon-tg{background-image:url(../flags/4x3/tg.svg)}.flag-icon-tg.flag-icon-squared{background-image:url(../flags/1x1/tg.svg)}.flag-icon-th{background-image:url(../flags/4x3/th.svg)}.flag-icon-th.flag-icon-squared{background-image:url(../flags/1x1/th.svg)}.flag-icon-tj{background-image:url(../flags/4x3/tj.svg)}.flag-icon-tj.flag-icon-squared{background-image:url(../flags/1x1/tj.svg)}.flag-icon-tk{background-image:url(../flags/4x3/tk.svg)}.flag-icon-tk.flag-icon-squared{background-image:url(../flags/1x1/tk.svg)}.flag-icon-tl{background-image:url(../flags/4x3/tl.svg)}.flag-icon-tl.flag-icon-squared{background-image:url(../flags/1x1/tl.svg)}.flag-icon-tm{background-image:url(../flags/4x3/tm.svg)}.flag-icon-tm.flag-icon-squared{background-image:url(../flags/1x1/tm.svg)}.flag-icon-tn{background-image:url(../flags/4x3/tn.svg)}.flag-icon-tn.flag-icon-squared{background-image:url(../flags/1x1/tn.svg)}.flag-icon-to{background-image:url(../flags/4x3/to.svg)}.flag-icon-to.flag-icon-squared{background-image:url(../flags/1x1/to.svg)}.flag-icon-tr{background-image:url(../flags/4x3/tr.svg)}.flag-icon-tr.flag-icon-squared{background-image:url(../flags/1x1/tr.svg)}.flag-icon-tt{background-image:url(../flags/4x3/tt.svg)}.flag-icon-tt.flag-icon-squared{background-image:url(../flags/1x1/tt.svg)}.flag-icon-tv{background-image:url(../flags/4x3/tv.svg)}.flag-icon-tv.flag-icon-squared{background-image:url(../flags/1x1/tv.svg)}.flag-icon-tw{background-image:url(../flags/4x3/tw.svg)}.flag-icon-tw.flag-icon-squared{background-image:url(../flags/1x1/tw.svg)}.flag-icon-tz{background-image:url(../flags/4x3/tz.svg)}.flag-icon-tz.flag-icon-squared{background-image:url(../flags/1x1/tz.svg)}.flag-icon-ua{background-image:url(../flags/4x3/ua.svg)}.flag-icon-ua.flag-icon-squared{background-image:url(../flags/1x1/ua.svg)}.flag-icon-ug{background-image:url(../flags/4x3/ug.svg)}.flag-icon-ug.flag-icon-squared{background-image:url(../flags/1x1/ug.svg)}.flag-icon-um{background-image:url(../flags/4x3/um.svg)}.flag-icon-um.flag-icon-squared{background-image:url(../flags/1x1/um.svg)}.flag-icon-us{background-image:url(../flags/4x3/us.svg)}.flag-icon-us.flag-icon-squared{background-image:url(../flags/1x1/us.svg)}.flag-icon-uy{background-image:url(../flags/4x3/uy.svg)}.flag-icon-uy.flag-icon-squared{background-image:url(../flags/1x1/uy.svg)}.flag-icon-uz{background-image:url(../flags/4x3/uz.svg)}.flag-icon-uz.flag-icon-squared{background-image:url(../flags/1x1/uz.svg)}.flag-icon-va{background-image:url(../flags/4x3/va.svg)}.flag-icon-va.flag-icon-squared{background-image:url(../flags/1x1/va.svg)}.flag-icon-vc{background-image:url(../flags/4x3/vc.svg)}.flag-icon-vc.flag-icon-squared{background-image:url(../flags/1x1/vc.svg)}.flag-icon-ve{background-image:url(../flags/4x3/ve.svg)}.flag-icon-ve.flag-icon-squared{background-image:url(../flags/1x1/ve.svg)}.flag-icon-vg{background-image:url(../flags/4x3/vg.svg)}.flag-icon-vg.flag-icon-squared{background-image:url(../flags/1x1/vg.svg)}.flag-icon-vi{background-image:url(../flags/4x3/vi.svg)}.flag-icon-vi.flag-icon-squared{background-image:url(../flags/1x1/vi.svg)}.flag-icon-vn{background-image:url(../flags/4x3/vn.svg)}.flag-icon-vn.flag-icon-squared{background-image:url(../flags/1x1/vn.svg)}.flag-icon-vu{background-image:url(../flags/4x3/vu.svg)}.flag-icon-vu.flag-icon-squared{background-image:url(../flags/1x1/vu.svg)}.flag-icon-wf{background-image:url(../flags/4x3/wf.svg)}.flag-icon-wf.flag-icon-squared{background-image:url(../flags/1x1/wf.svg)}.flag-icon-ws{background-image:url(../flags/4x3/ws.svg)}.flag-icon-ws.flag-icon-squared{background-image:url(../flags/1x1/ws.svg)}.flag-icon-ye{background-image:url(../flags/4x3/ye.svg)}.flag-icon-ye.flag-icon-squared{background-image:url(../flags/1x1/ye.svg)}.flag-icon-yt{background-image:url(../flags/4x3/yt.svg)}.flag-icon-yt.flag-icon-squared{background-image:url(../flags/1x1/yt.svg)}.flag-icon-za{background-image:url(../flags/4x3/za.svg)}.flag-icon-za.flag-icon-squared{background-image:url(../flags/1x1/za.svg)}.flag-icon-zm{background-image:url(../flags/4x3/zm.svg)}.flag-icon-zm.flag-icon-squared{background-image:url(../flags/1x1/zm.svg)}.flag-icon-zw{background-image:url(../flags/4x3/zw.svg)}.flag-icon-zw.flag-icon-squared{background-image:url(../flags/1x1/zw.svg)}.flag-icon-eu{background-image:url(../flags/4x3/eu.svg)}.flag-icon-eu.flag-icon-squared{background-image:url(../flags/1x1/eu.svg)}.flag-icon-gb-eng{background-image:url(../flags/4x3/gb-eng.svg)}.flag-icon-gb-eng.flag-icon-squared{background-image:url(../flags/1x1/gb-eng.svg)}.flag-icon-gb-nir{background-image:url(../flags/4x3/gb-nir.svg)}.flag-icon-gb-nir.flag-icon-squared{background-image:url(../flags/1x1/gb-nir.svg)}.flag-icon-gb-sct{background-image:url(../flags/4x3/gb-sct.svg)}.flag-icon-gb-sct.flag-icon-squared{background-image:url(../flags/1x1/gb-sct.svg)}.flag-icon-gb-wls{background-image:url(../flags/4x3/gb-wls.svg)}.flag-icon-gb-wls.flag-icon-squared{background-image:url(../flags/1x1/gb-wls.svg)}.flag-icon-un{background-image:url(../flags/4x3/un.svg)}.flag-icon-un.flag-icon-squared{background-image:url(../flags/1x1/un.svg)} \ No newline at end of file diff --git a/assets/webconfig/css/hyperion.css b/assets/webconfig/css/hyperion.css index a8b23529..d4c3dea5 100644 --- a/assets/webconfig/css/hyperion.css +++ b/assets/webconfig/css/hyperion.css @@ -9,6 +9,9 @@ body{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15 #page-content { padding-bottom:50px; } +body{ + overflow-y: scroll; +} .btn{margin: 2px 0;} /*mobile nav*/ @@ -85,6 +88,7 @@ table label{margin:0} /*Dashboard*/ .component-on{color:green;} .component-off{color:grey;} +#dash_news hr{margin:10px 0} /*Colorpicker 2x*/ .colorpicker-2x {z-index:99999} diff --git a/assets/webconfig/css/jquery-linedtextarea.css b/assets/webconfig/css/jquery-linedtextarea.css deleted file mode 100644 index ff217a61..00000000 --- a/assets/webconfig/css/jquery-linedtextarea.css +++ /dev/null @@ -1,68 +0,0 @@ -/** - * jQuery Lined Textarea Plugin - * http://alan.blog-city.com/jquerylinedtextarea.htm - * - * Copyright (c) 2010 Alan Williamson - * - * Released under the MIT License: - * http://www.opensource.org/licenses/mit-license.php - * - * Usage: - * Displays a line number count column to the left of the textarea - * - * Class up your textarea with a given class, or target it directly - * with JQuery Selectors - * - * $(".lined").linedtextarea({ - * selectedLine: 10, - * selectedClass: 'lineselect' - * }); - * - */ - -.linedwrap { - border: 1px solid #c0c0c0; - padding: 3px; -} - -.linedtextarea { - padding: 0px; - margin: 0px; -} - -.linedtextarea textarea, .linedwrap .codelines .lineno { - font-size: 10pt; - font-family: monospace; - line-height: normal !important; -} - -.linedtextarea textarea { - padding-right:0.3em; - padding-top:0.3em; - border: 0; -} - -.linedwrap .lines { - margin-top: 0px; - width: 50px; - float: left; - overflow: hidden; - border-right: 1px solid #c0c0c0; - margin-right: 10px; -} - -.linedwrap .codelines { - padding-top: 5px; -} - -.linedwrap .codelines .lineno { - color:#AAAAAA; - padding-right: 0.5em; - padding-top: 0.0em; - text-align: right; - white-space: nowrap; -} - -.linedwrap .codelines .lineselect { - color: red; -} \ No newline at end of file diff --git a/assets/webconfig/css/jsonaceeditor.min.css b/assets/webconfig/css/jsonaceeditor.min.css new file mode 100644 index 00000000..ab770a9e --- /dev/null +++ b/assets/webconfig/css/jsonaceeditor.min.css @@ -0,0 +1 @@ +div.jsoneditor,div.jsoneditor-outer{-moz-box-sizing:border-box;-webkit-box-sizing:border-box}div.jsoneditor .jsoneditor-search input{height:auto;border:inherit}div.jsoneditor .jsoneditor-search input:focus{border:none!important;box-shadow:none!important}div.jsoneditor table{border-collapse:collapse;width:auto}div.jsoneditor td,div.jsoneditor th{padding:0;display:table-cell;text-align:left;vertical-align:inherit;border-radius:inherit}div.jsoneditor-field,div.jsoneditor-readonly,div.jsoneditor-value{border:1px solid transparent;min-height:16px;min-width:32px;padding:2px;margin:1px;word-wrap:break-word;float:left}div.jsoneditor-field p,div.jsoneditor-value p{margin:0}div.jsoneditor-value{word-break:break-word}div.jsoneditor-readonly{min-width:16px;color:gray}div.jsoneditor-empty{border-color:#d3d3d3;border-style:dashed;border-radius:2px}div.jsoneditor-field.jsoneditor-empty::after,div.jsoneditor-value.jsoneditor-empty::after{pointer-events:none;color:#d3d3d3;font-size:8pt}div.jsoneditor-field.jsoneditor-empty::after{content:"field"}div.jsoneditor-value.jsoneditor-empty::after{content:"value"}a.jsoneditor-value.jsoneditor-url,div.jsoneditor-value.jsoneditor-url{color:green;text-decoration:underline}a.jsoneditor-value.jsoneditor-url{display:inline-block;padding:2px;margin:2px}a.jsoneditor-value.jsoneditor-url:focus,a.jsoneditor-value.jsoneditor-url:hover{color:#ee422e}div.jsoneditor td.jsoneditor-separator{padding:3px 0;vertical-align:top;color:gray}div.jsoneditor-field.jsoneditor-highlight,div.jsoneditor-field[contenteditable=true]:focus,div.jsoneditor-field[contenteditable=true]:hover,div.jsoneditor-value.jsoneditor-highlight,div.jsoneditor-value[contenteditable=true]:focus,div.jsoneditor-value[contenteditable=true]:hover{background-color:#FFFFAB;border:1px solid #ff0;border-radius:2px}div.jsoneditor-field.jsoneditor-highlight-active,div.jsoneditor-field.jsoneditor-highlight-active:focus,div.jsoneditor-field.jsoneditor-highlight-active:hover,div.jsoneditor-value.jsoneditor-highlight-active,div.jsoneditor-value.jsoneditor-highlight-active:focus,div.jsoneditor-value.jsoneditor-highlight-active:hover{background-color:#fe0;border:1px solid #ffc700;border-radius:2px}div.jsoneditor-value.jsoneditor-string{color:green}div.jsoneditor-value.jsoneditor-array,div.jsoneditor-value.jsoneditor-object{min-width:16px;color:grey}div.jsoneditor-value.jsoneditor-number{color:#ee422e}div.jsoneditor-value.jsoneditor-boolean{color:#ff8c00}div.jsoneditor-value.jsoneditor-null{color:#004ED0}div.jsoneditor-value.jsoneditor-invalid{color:#000}div.jsoneditor-tree button{width:24px;height:24px;padding:0;margin:0;border:none;cursor:pointer;background:url(img/jsoneditor-icons.svg)}div.jsoneditor-mode-form tr.jsoneditor-expandable td.jsoneditor-tree,div.jsoneditor-mode-view tr.jsoneditor-expandable td.jsoneditor-tree{cursor:pointer}div.jsoneditor-tree button.jsoneditor-collapsed{background-position:0 -48px}div.jsoneditor-tree button.jsoneditor-expanded{background-position:0 -72px}div.jsoneditor-tree button.jsoneditor-contextmenu{background-position:-48px -72px}div.jsoneditor-tree button.jsoneditor-contextmenu.jsoneditor-selected,div.jsoneditor-tree button.jsoneditor-contextmenu:focus,div.jsoneditor-tree button.jsoneditor-contextmenu:hover,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-contextmenu{background-position:-48px -48px}div.jsoneditor-tree :focus{outline:0}div.jsoneditor-tree button:focus{background-color:#f5f5f5;outline:#e5e5e5 solid 1px}div.jsoneditor-tree button.jsoneditor-invisible{visibility:hidden;background:0 0}div.jsoneditor{color:#1A1A1A;border:1px solid #3883fa;box-sizing:border-box;width:100%;height:100%;overflow:hidden;position:relative;padding:0;line-height:100%}div.jsoneditor-tree table.jsoneditor-tree{border-collapse:collapse;border-spacing:0;width:100%;margin:0}div.jsoneditor-outer{position:static;width:100%;height:100%;box-sizing:border-box}.ace-jsoneditor,textarea.jsoneditor-text{min-height:150px}div.jsoneditor-tree{width:100%;height:100%;position:relative;overflow:auto}textarea.jsoneditor-text{width:100%;height:100%;margin:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;outline-width:0;border:none;background-color:#fff;resize:none}tr.jsoneditor-highlight,tr.jsoneditor-selected{background-color:#e6e6e6}tr.jsoneditor-selected button.jsoneditor-contextmenu,tr.jsoneditor-selected button.jsoneditor-dragarea{visibility:hidden}tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-contextmenu,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-dragarea{visibility:visible}div.jsoneditor-tree button.jsoneditor-dragarea{background:url(img/jsoneditor-icons.svg) -72px -72px;cursor:move}div.jsoneditor-tree button.jsoneditor-dragarea:focus,div.jsoneditor-tree button.jsoneditor-dragarea:hover,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-dragarea{background-position:-72px -48px}div.jsoneditor td,div.jsoneditor th,div.jsoneditor tr{padding:0;margin:0}div.jsoneditor td,div.jsoneditor td.jsoneditor-tree{vertical-align:top}.jsoneditor-schema-error,div.jsoneditor td,div.jsoneditor textarea,div.jsoneditor th,div.jsoneditor-field,div.jsoneditor-value{font-family:droid sans mono,consolas,monospace,courier new,courier,sans-serif;font-size:10pt;color:#1A1A1A}.jsoneditor-schema-error{cursor:default;display:inline-block;height:24px;line-height:24px;position:relative;text-align:center;width:24px}div.jsoneditor-tree .jsoneditor-schema-error{width:24px;height:24px;padding:0;margin:0 4px 0 0;background:url(img/jsoneditor-icons.svg) -168px -48px}.jsoneditor-schema-error .jsoneditor-popover{background-color:#4c4c4c;border-radius:3px;box-shadow:0 0 5px rgba(0,0,0,.4);color:#fff;display:none;padding:7px 10px;position:absolute;width:200px;z-index:4}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-above{bottom:32px;left:-98px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-below{top:32px;left:-98px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-left{top:-7px;right:32px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-right{top:-7px;left:32px}.jsoneditor-schema-error .jsoneditor-popover:before{border-right:7px solid transparent;border-left:7px solid transparent;content:'';display:block;left:50%;margin-left:-7px;position:absolute}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-above:before{border-top:7px solid #4c4c4c;bottom:-7px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-below:before{border-bottom:7px solid #4c4c4c;top:-7px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-left:before,.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-right:before{border-top:7px solid transparent;border-bottom:7px solid transparent;content:'';top:19px;margin-left:inherit;margin-top:-7px;position:absolute}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-left:before{border-left:7px solid #4c4c4c;right:-14px;left:inherit}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-right:before{border-right:7px solid #4c4c4c;left:-14px}.jsoneditor-schema-error:focus .jsoneditor-popover,.jsoneditor-schema-error:hover .jsoneditor-popover{display:block;-webkit-animation:fade-in .3s linear 1,move-up .3s linear 1;-moz-animation:fade-in .3s linear 1,move-up .3s linear 1;-ms-animation:fade-in .3s linear 1,move-up .3s linear 1}@-webkit-keyframes fade-in{from{opacity:0}to{opacity:1}}@-moz-keyframes fade-in{from{opacity:0}to{opacity:1}}@-ms-keyframes fade-in{from{opacity:0}to{opacity:1}}.jsoneditor .jsoneditor-text-errors{width:100%;border-collapse:collapse;background-color:#ffef8b;border-top:1px solid gold}.jsoneditor .jsoneditor-text-errors td{padding:3px 6px;vertical-align:middle}.jsoneditor-text-errors .jsoneditor-schema-error{border:none;width:24px;height:24px;padding:0;margin:0 4px 0 0;background:url(img/jsoneditor-icons.svg) -168px -48px}div.jsoneditor-contextmenu-root{position:relative;width:0;height:0}div.jsoneditor-contextmenu{position:absolute;box-sizing:content-box;z-index:99999}div.jsoneditor-contextmenu li,div.jsoneditor-contextmenu ul{box-sizing:content-box}div.jsoneditor-contextmenu ul{position:relative;left:0;top:0;width:124px;background:#fff;border:1px solid #d3d3d3;box-shadow:2px 2px 12px rgba(128,128,128,.3);list-style:none;margin:0;padding:0}div.jsoneditor-contextmenu ul li button{padding:0;margin:0;width:124px;height:24px;border:none;cursor:pointer;color:#4d4d4d;background:0 0;font-size:10pt;font-family:arial,sans-serif;box-sizing:border-box;line-height:26px;text-align:left}div.jsoneditor-contextmenu ul li button::-moz-focus-inner{padding:0;border:0}div.jsoneditor-contextmenu ul li button:focus,div.jsoneditor-contextmenu ul li button:hover{color:#1a1a1a;background-color:#f5f5f5;outline:0}div.jsoneditor-contextmenu ul li button.jsoneditor-default{width:92px}div.jsoneditor-contextmenu ul li button.jsoneditor-expand{float:right;width:32px;height:24px;border-left:1px solid #e5e5e5}div.jsoneditor-contextmenu div.jsoneditor-icon{float:left;width:24px;height:24px;border:none;padding:0;margin:0;background-image:url(img/jsoneditor-icons.svg)}div.jsoneditor-contextmenu ul li button div.jsoneditor-expand{float:right;width:24px;height:24px;padding:0;margin:0 4px 0 0;background:url(img/jsoneditor-icons.svg) 0 -72px;opacity:.4}div.jsoneditor-contextmenu ul li button.jsoneditor-expand:focus div.jsoneditor-expand,div.jsoneditor-contextmenu ul li button.jsoneditor-expand:hover div.jsoneditor-expand,div.jsoneditor-contextmenu ul li button:focus div.jsoneditor-expand,div.jsoneditor-contextmenu ul li button:hover div.jsoneditor-expand,div.jsoneditor-contextmenu ul li.jsoneditor-selected div.jsoneditor-expand{opacity:1}div.jsoneditor-contextmenu div.jsoneditor-separator{height:0;border-top:1px solid #e5e5e5;padding-top:5px;margin-top:5px}div.jsoneditor-contextmenu button.jsoneditor-remove>div.jsoneditor-icon{background-position:-24px -24px}div.jsoneditor-contextmenu button.jsoneditor-remove:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-remove:hover>div.jsoneditor-icon{background-position:-24px 0}div.jsoneditor-contextmenu button.jsoneditor-append>div.jsoneditor-icon{background-position:0 -24px}div.jsoneditor-contextmenu button.jsoneditor-append:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-append:hover>div.jsoneditor-icon{background-position:0 0}div.jsoneditor-contextmenu button.jsoneditor-insert>div.jsoneditor-icon{background-position:0 -24px}div.jsoneditor-contextmenu button.jsoneditor-insert:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-insert:hover>div.jsoneditor-icon{background-position:0 0}div.jsoneditor-contextmenu button.jsoneditor-duplicate>div.jsoneditor-icon{background-position:-48px -24px}div.jsoneditor-contextmenu button.jsoneditor-duplicate:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-duplicate:hover>div.jsoneditor-icon{background-position:-48px 0}div.jsoneditor-contextmenu button.jsoneditor-sort-asc>div.jsoneditor-icon{background-position:-168px -24px}div.jsoneditor-contextmenu button.jsoneditor-sort-asc:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-sort-asc:hover>div.jsoneditor-icon{background-position:-168px 0}div.jsoneditor-contextmenu button.jsoneditor-sort-desc>div.jsoneditor-icon{background-position:-192px -24px}div.jsoneditor-contextmenu button.jsoneditor-sort-desc:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-sort-desc:hover>div.jsoneditor-icon{background-position:-192px 0}div.jsoneditor-contextmenu ul li button.jsoneditor-selected,div.jsoneditor-contextmenu ul li button.jsoneditor-selected:focus,div.jsoneditor-contextmenu ul li button.jsoneditor-selected:hover{color:#fff;background-color:#ee422e}div.jsoneditor-contextmenu ul li{overflow:hidden}div.jsoneditor-contextmenu ul li ul{display:none;position:relative;left:-10px;top:0;border:none;box-shadow:inset 0 0 10px rgba(128,128,128,.5);padding:0 10px;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}div.jsoneditor-contextmenu ul li ul li button{padding-left:24px;animation:all ease-in-out 1s}div.jsoneditor-contextmenu ul li ul li button:focus,div.jsoneditor-contextmenu ul li ul li button:hover{background-color:#f5f5f5}div.jsoneditor-contextmenu button.jsoneditor-type-string>div.jsoneditor-icon{background-position:-144px -24px}div.jsoneditor-contextmenu button.jsoneditor-type-string.jsoneditor-selected>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-string:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-string:hover>div.jsoneditor-icon{background-position:-144px 0}div.jsoneditor-contextmenu button.jsoneditor-type-auto>div.jsoneditor-icon{background-position:-120px -24px}div.jsoneditor-contextmenu button.jsoneditor-type-auto.jsoneditor-selected>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-auto:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-auto:hover>div.jsoneditor-icon{background-position:-120px 0}div.jsoneditor-contextmenu button.jsoneditor-type-object>div.jsoneditor-icon{background-position:-72px -24px}div.jsoneditor-contextmenu button.jsoneditor-type-object.jsoneditor-selected>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-object:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-object:hover>div.jsoneditor-icon{background-position:-72px 0}div.jsoneditor-contextmenu button.jsoneditor-type-array>div.jsoneditor-icon{background-position:-96px -24px}div.jsoneditor-contextmenu button.jsoneditor-type-array.jsoneditor-selected>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-array:focus>div.jsoneditor-icon,div.jsoneditor-contextmenu button.jsoneditor-type-array:hover>div.jsoneditor-icon{background-position:-96px 0}div.jsoneditor-contextmenu button.jsoneditor-type-modes>div.jsoneditor-icon{background-image:none;width:6px}div.jsoneditor-menu{width:100%;height:35px;padding:2px;margin:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;background-color:#3883fa;border-bottom:1px solid #3883fa}div.jsoneditor-menu>button,div.jsoneditor-menu>div.jsoneditor-modes>button{width:26px;height:26px;margin:2px;padding:0;border-radius:2px;border:1px solid transparent;background:url(img/jsoneditor-icons.svg);color:#fff;opacity:.8;font-family:arial,sans-serif;font-size:10pt;float:left}div.jsoneditor-menu>button:hover,div.jsoneditor-menu>div.jsoneditor-modes>button:hover{background-color:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.4)}div.jsoneditor-menu>button:active,div.jsoneditor-menu>button:focus,div.jsoneditor-menu>div.jsoneditor-modes>button:active,div.jsoneditor-menu>div.jsoneditor-modes>button:focus{background-color:rgba(255,255,255,.3)}div.jsoneditor-menu>button:disabled,div.jsoneditor-menu>div.jsoneditor-modes>button:disabled{opacity:.5}div.jsoneditor-menu>button.jsoneditor-collapse-all{background-position:0 -96px}div.jsoneditor-menu>button.jsoneditor-expand-all{background-position:0 -120px}div.jsoneditor-menu>button.jsoneditor-undo{background-position:-24px -96px}div.jsoneditor-menu>button.jsoneditor-undo:disabled{background-position:-24px -120px}div.jsoneditor-menu>button.jsoneditor-redo{background-position:-48px -96px}div.jsoneditor-menu>button.jsoneditor-redo:disabled{background-position:-48px -120px}div.jsoneditor-menu>button.jsoneditor-compact{background-position:-72px -96px}div.jsoneditor-menu>button.jsoneditor-format{background-position:-72px -120px}div.jsoneditor-menu>div.jsoneditor-modes{display:inline-block;float:left}div.jsoneditor-menu>div.jsoneditor-modes>button{background-image:none;width:auto;padding-left:6px;padding-right:6px}div.jsoneditor-menu>button.jsoneditor-separator,div.jsoneditor-menu>div.jsoneditor-modes>button.jsoneditor-separator{margin-left:10px}div.jsoneditor-menu a{font-family:arial,sans-serif;font-size:10pt;color:#fff;opacity:.8;vertical-align:middle}div.jsoneditor-menu a:hover{opacity:1}div.jsoneditor-menu a.jsoneditor-poweredBy{font-size:8pt;position:absolute;right:0;top:0;padding:10px}table.jsoneditor-search div.jsoneditor-results,table.jsoneditor-search input{font-family:arial,sans-serif;font-size:10pt;color:#1A1A1A;background:0 0}table.jsoneditor-search div.jsoneditor-results{color:#fff;padding-right:5px;line-height:24px}table.jsoneditor-search{position:absolute;right:4px;top:4px;border-collapse:collapse;border-spacing:0}table.jsoneditor-search div.jsoneditor-frame{border:1px solid transparent;background-color:#fff;padding:0 2px;margin:0}table.jsoneditor-search div.jsoneditor-frame table{border-collapse:collapse}table.jsoneditor-search input{width:120px;border:none;outline:0;margin:1px;line-height:20px}table.jsoneditor-search button{width:16px;height:24px;padding:0;margin:0;border:none;background:url(img/jsoneditor-icons.svg);vertical-align:top}table.jsoneditor-search button:hover{background-color:transparent}table.jsoneditor-search button.jsoneditor-refresh{width:18px;background-position:-99px -73px}table.jsoneditor-search button.jsoneditor-next{cursor:pointer;background-position:-124px -73px}table.jsoneditor-search button.jsoneditor-next:hover{background-position:-124px -49px}table.jsoneditor-search button.jsoneditor-previous{cursor:pointer;background-position:-148px -73px;margin-right:2px}table.jsoneditor-search button.jsoneditor-previous:hover{background-position:-148px -49px} \ No newline at end of file diff --git a/assets/webconfig/favicon.ico b/assets/webconfig/favicon.ico index 382001890605741498072d2da1900b8cc1ff0aee..a3a865e5f4f385a92941ca4997aedd86adde72e7 100644 GIT binary patch literal 3603 zcmV+u4(#!XP)uJ@VVD_UC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne9*`iQ#9$Or zQF$}6R&?d%y_c8YA7_1QpS|}zXYYO1x&V;8{kgn!SPFnNo`4_X6{c}T{8k*B#$jdxfFg<9uYy1K45IaYvHg`_dOZM)Sy63ve6hvv z1)yUy0P^?0*fb9UASvow`@mQCp^4`uNg&9uGcn1|&Nk+9SjOUl{-OWr@Hh0;_l(8q z{wNRKos+;6rV8ldy0Owz(}jF`W(JeRp&R{qi2rfmU!TJ;gp(Kmm5I1s5m_f-n#TRsj}B0%?E`vOzxB2#P=n*a3EfYETOrKoe*ICqM@{4K9Go;5xVgZi5G4 z1dM~{UdP6d+Yd3o?MrAqM0Kc|iV92owdyL5UC#5<>aVCa44|hpM4E zs0sQWIt5*Tu0n&*J!lk~f_{hI!w5`*sjxDv4V%CW*ah~3!{C*0BD@;TgA3v9a1~q+ zAA{TB3-ERLHar49hi4Ih5D^-ph8Q6X#0?2VqLBoIkE}zAkxHZUgRb+f=nat zP#6>iMMoK->`~sRLq)(kHo*Vn{;LcG6+edD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDr6*;uGTJg8GHjVbnL{!cWyUB7MT6o-VNo_w8Yq`2<5Ub)hw4L3rj}5@qxMs0 zWMyP6Wy582WNT#4$d1qunl{acmP#w5ouJ*Jy_Zv#bCKi7ZIf$}8d zZdVy&)LYdbX%I9R8VMQ|8r>Q*nyQ)sn)#Z|n)kKvS`4iu ztvy=3T65Yu+7a4Yv^%sXb>ww?bn(=Yu(!=O6^iuTp>)p_Y^{w=i z^lS773}6Fm1Fpe-gF!>Ip{*g$u-szvGhed;vo5pW&GpS$<~8QGEXWp~7V9lKEnZq0SaK{6Sl+dwSOr*Z zvFf(^Xl-N7w{EeXveC4Ov)N}e%%C!Y7^RFWwrE>d+x51mZQt2h+X?JW*!^a2WS?Sx z)P8cQ&Qi|OhNWW;>JChYI)@QQx?`Nj^#uJBl~d&PK+RZLOLos~K(b5>qmrMN0})tOkySZ3_W zICNY@+|jrX%s^&6b2i>5eqa0y%Z;^%^_=a@u3%4b9605ii3Ep)@`TAmhs0fpQ%O!q zl}XcFH*PieWwLj2ZSq`7V9Mc?h17`D)-+sNT-qs~3@?S(ldh7UlRlVXkWrK|vf6I- z?$tAVKYn8-l({mqQ$Q8{O!WzMg`0(=S&msXS#Pt$vrpzo=kRj+a`kh!z=6$;c zwT88(J6|n-WB%w`m$h~4pmp)YIh_ z3ETV2tjiAU!0h1dxU-n=E9e!)6|Z;4?!H=SSy{V>ut&IOq{_dl zbFb#!9eY1iCsp6Bajj|Hr?hX|zPbJE{X++w546-O*Ot`2Kgd0Jx6Z4syT zu9enWavU5N9)I?I-1m1*_?_rJ$vD~agVqoG+9++s?NEDe`%Fht$4F;X=in*dQ{7$m zU2Q)a|9JSc+Uc4zvS-T963!N$T{xF_ZuWe}`RNOZ7sk3{yB}PPym+f8xTpV;-=!;; zJuhGEb?H5K#o@~7t9DmUU1MD9xNd#Dz0azz?I)|B+WM{g+Xrk0I&awC=o(x)cy`EX z=)z6+o0o6-+`4{y+3mqQ%kSJBju{@g%f35#FZJHb`&swrA8dGtepviS>QUumrN{L@ z>;2q1Vm)$Z)P1z?N$8UYW2~{~zhwUMVZ87u`Dx{Z>O|9|`Q+&->FRy-Sjp7DHs zy69KwU-!MxeeuI@&cF4|M9z%AfP?@5 z`Tzg`fam}Kbua(`>RI+y?e7jT@qQ9J+u00v@9M??Vs0RI60puMM)00009a7bBm z000XU000XU0RWnu7ytkO2XskIMF-&m8xIQ;fC4^I0009XNkl7QG^hx7gV7lj|^o%G+F3^8pQu#ZN-e(Ixr&ylPegaCQ6Ca zG*A#wH{ce3V1uuH?>VPSpWpBZ^BTzmgH%a!N1R&{{7#JbL^;Kw;R)yq;j6 z25OKhL+_1ECu1NF&aT|VU&W~P?@h#d4B~=xT$(NqLRSztS~P6zN=x_p4K@7OR-d=K zDwd9aW0PQPw=kR@n%cM1UwJ%@b>O-VmL(7Z01O7LHKA5C9vU=)2ll`Hr8EB~^Hh>x ztfnSJe{TnYU&oOeVFH9!Jlx;&Sg#|L2Bi>zqFK2o6-i=7lNR)hN@9$J@|h@=ZdqMj z#dTdA+aVs0v$nRz`uaN2XcWhG@O_`}Uc8`ItKkgB1@sKr6-dS6X)!+j1=VU5%d!wc zaD9Ev>FFt+=TWUz>Fn&p_gffa=Eyh0n^jd zB$G+b&(CoqE+;3yF*7rRWl2a_)FB~18WFJ~9zhV0%jMYH+anT*u)n|0%E}6_et5<9 z_BO8La(H;i!omVt8+24s0#CjJ9Rf-zve_(0M@KZ9O-@cuSXfwKadDACp+FD>6bc1$ zxg1IMf$z<5t+QRcZY}*FF4>gw%%BoD> zR~vP-G4%BG5QZVUySvQK&(mtPP@y89&$F|$Lw9#KLI{j8G#)jV(3FUD>85^%Q5q>F z*=!cy_nDoYB@9D?Fl2donOdzzCX+#HjWLG1a$qi@Y{N+LqkX51(pFoyc=7Tjb8~aJ zu1gRE09cmA#>NH{6BC4Ch?J7zr+^|9Z5Y0I?>!m|LEC7u&!6+<A$cDv2e z(h^E3wAMJT#o2|?|G=3I>5JR1z54gBe@>2geWKs#;)&fshqSRnFaflEL8B5<`4m#R z4k#4^^XuDZWg9*S%#SuCCZTs621j9F0Q#O_WRxN{e`5GRi?=-RhBD{eQsydV_#+1I Z{sSQ3bY&%j3e*4q002ovPDHLkV1mlK&c6Tv literal 1150 zcmb7DTSydP6h2bDL=V+NL{tO?MNmEX7Ci+Sb`z4K3s!135Nf+vbhjjnpdbqgEnV`h z6ap!0TvOX93WG?+h{C1Wo!$BWnb}=8SNG=E`A3Uhf;z)DGn_f!`Oo>z8KOMCX3iwO zFQUU!iRKW|G6uWYGvVjQUk&`F1+?M~X!BRl{sgEJNxFzHRE=kJ8Q1ANiphhiw3lNG z8Os&tm)*=zUro>4?1Sz?wEFhrnRXi5^J@5>-hlS#8npXW&}xpucX%JV3kuLRZ$UOm zvj!Ev0JLyVFQo#5212?CBP3wkF$iHpN(a(%AS@epECxeJe2+vBaBTQzEX{&uugnLn z-THb-F7n-k9t^^=EO@v4a0!rupYLB z7u8UCtv;jOLR3!ln$5B-9NW;)fTpGN*C_f;o49&`QjAL~1MX;FKKBV-|eUM?EuP_jc3f?)1c-(TK-W8<9HHsi~`3()^&wL^* z=URz+#|P=|yY#G@*O~nD{#@bF9u${$VaKjc?B3-=$@Z7nThxW}HU3=1e1GN?y-l}J z>YHlRwNseRKkzELhjnxb+o%|&G#3>tgJ%*)784E?5_TUVY`j9qFCxrP-0mqvRe2L> K{^zbZ3O@l?;n9x( diff --git a/assets/webconfig/flags/1x1/de.svg b/assets/webconfig/flags/1x1/de.svg deleted file mode 100644 index 0b7e01fe..00000000 --- a/assets/webconfig/flags/1x1/de.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/webconfig/flags/1x1/gb.svg b/assets/webconfig/flags/1x1/gb.svg deleted file mode 100644 index 20bc7595..00000000 --- a/assets/webconfig/flags/1x1/gb.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/assets/webconfig/flags/4x3/de.svg b/assets/webconfig/flags/4x3/de.svg deleted file mode 100644 index 9a1cb040..00000000 --- a/assets/webconfig/flags/4x3/de.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/assets/webconfig/flags/4x3/gb.svg b/assets/webconfig/flags/4x3/gb.svg deleted file mode 100644 index a3317483..00000000 --- a/assets/webconfig/flags/4x3/gb.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/assets/webconfig/i18n/de.json b/assets/webconfig/i18n/de.json index 1f360256..092c2713 100644 --- a/assets/webconfig/i18n/de.json +++ b/assets/webconfig/i18n/de.json @@ -1,676 +1,678 @@ { - "@metadata": { - "authors": [ - "brindosch" - ], - "project" : "Hyperion WebUI", - "locale": "de", - "last-updated": "2016-11-30", - "message-documentation": "qqq" - }, - "general_webui_title" : "Hyperion - Web Konfiguration", - "general_country_de" : "Deutschland", - "general_country_us" : "Amerika", - "general_country_uk" : "England", - "general_country_fr" : "Frankreich", - "general_country_es" : "Spanien", - "general_country_it" : "Italien", - "general_country_nl" : "Niederlande", - "general_speech_de" : "Deutsch", - "general_speech_en" : "Englisch", - "general_speech_es" : "Spanisch", - "general_access_default" : "Standard", - "general_access_advanced" : "Fortgeschritten", - "general_access_expert" : "Experte", - "general_comp_SMOOTHING" : "Glättung", - "general_comp_BLACKBORDER" : "Schwarze Balken Erkennung", - "general_comp_KODICHECKER" : "Kodi Überwachung", - "general_comp_FORWARDER" : "JSON/PROTO Weiterleitung", - "general_comp_UDPLISTENER" : "UDP Listener", - "general_comp_BOBLIGHTSERVER" : "Boblight Server", - "general_comp_GRABBER" : "Plattform Aufnahme", - "general_comp_V4L" : "USB Aufnahme", - "general_col_red" : "rot", - "general_col_green" : "grün", - "general_col_blue" : "blau", - "general_button_savesettings" : "Einstellungen speichern", - "general_btn_ok" : "OK", - "general_btn_cancel" : "Abbrechen", - "general_btn_continue" : "Fortfahren", - "general_btn_save" : "Speichern", - "general_btn_saverestart" : "Speichern und neustarten", - "general_btn_saveandreload" : "Speichern und neu laden", - "general_btn_restarthyperion" : "Hyperion neustarten", - "general_btn_off" : "Aus", - "general_btn_on" : "An", - "general_btn_next" : "Weiter", - "general_btn_back" : "Zurück", - "dashboard_label_intro" : "Das Dashboard zeigt dir Informationen zum Systemstatus, ob Updates verfügbar sind, den Komponentenstatus sowie die letzten Blog-Posts vom Hyperion Team.", - "dashboard_infobox_label_title" : "Information", - "dashboard_infobox_label_currenthyp" : "Deine Hyperion Version:", - "dashboard_infobox_label_latesthyp" : "Aktuellste Hyperion Version:", - "dashboard_infobox_label_device" : "Systeminformation:", - "dashboard_infobox_message_updatewarning" : "Eine aktuellere Version von Hyperion ist verfügbar! (V$1)", - "dashboard_infobox_message_updatesuccess" : "Du nutzt die aktuellste Version von Hyperion.", - "dashboard_componentbox_label_title" : "Komponenten Status", - "dashboard_componentbox_label_comp" : "Komponente", - "dashboard_componentbox_label_status" : "Status", - "dashboard_newsbox_label_title" : "Die letzten Blogposts", - "dashboard_alert_message_confedit" : "Deine Hyperion Konfiguration wurde verändert. Um die Änderungen anzuwenden, starte Hyperion neu.", - "main_menu_dashboard_token" : "Dashboard", - "main_menu_configuration_token" : "Konfiguration", - "main_menu_general_conf_token" : "Allgemein", - "main_menu_leds_conf_token" : "LED Hardware", - "main_menu_grabber_conf_token" : "Aufnahme Hardware", - "main_menu_effect_conf_token" : "Effekte", - "main_menu_colors_conf_token" : "Bildverarbeitung", - "main_menu_kodiwatch_token" : "Kodi Überwachung", - "main_menu_network_conf_token" : "Netzwerk", - "main_menu_remotecontrol_token" : "Fernbedienung", - "main_menu_effectsconfigurator_token" : "Effekt Konfigurator", - "main_menu_support_token" : "Hilfe", - "main_menu_update_token" : "Update", - "main_menu_system_token" : "System", - "main_menu_input_selection_token" : "Eingabeauswahl", - "main_menu_logging_token" : "Protokoll", - "main_menu_webconfig_token" : "Web Konfiguration", - "main_menu_about_token" : "Über Hyperion", - "main_ledsim_title" : "LED Visualisierung", - "main_ledsim_text" : "Eine live Visualisierung deiner LED Farben, sofern verfügbar kann ein live Video dazugeschalten werden.", - "main_ledsim_btn_toggleleds" : "Zeige LEDs", - "main_ledsim_btn_togglelednumber" : "LED Nummern", - "main_ledsim_btn_togglelivevideo" : "Live Video", - "conf_general_label_title" : "Allgemeine Einstellungen", - "conf_general_intro" : "Grundsätzliche Einstellungen zu Hyperion oder WebUI, die in keine andere Kategorie passen.", - "conf_general_impexp_title" : "Importiere/Exportiere Konfiguration", - "conf_general_impexp_l1" : "Importiere eine bestehende Konfiguration, indem du unten eine Datei auswählst und anschließend auf \"Importieren\" klickst.", - "conf_general_impexp_l2" : "Exportiere eine Konfiguration, indem du auf \"Exportieren\" klickst. Dein Browser startet einen Download.", - "conf_general_impexp_impbtn" : "Importieren", - "conf_general_impexp_expbtn" : "Exportieren", - "conf_helptable_option" : "Option", - "conf_helptable_expl" : "Erklärung", - "conf_effect_path_intro" : "Definiere weitere Effekt-Pfade, wenn nötig.", - "conf_effect_fgeff_intro" : "Definiere einen Start Effekt/Farbe, dieser wird angezeigt, wenn Hyperion startet für die angegebene Dauer.", - "conf_effect_bgeff_intro" : "Definiere einen Hintergrund Effekt/Farbe, dieser wird aktiv, wenn Hyperion sich im Leerlauf befindet. (Das gilt ebenfalls für temporäres abschalten mithilfe der Kodi Überwachung).", - "conf_leds_device_intro" : "Wähle eine Methode zur Steuerung deiner LEDs aus, sie sind unterteilt in verschiedene Kategorien. Neben den allgemeinen Optionen die für alle gültig sind, gibt es auch spezfische die sich unterscheiden je nach Wahl.", - "conf_leds_layout_intro" : "Du benötigst ebenfalls ein LED Layout, welches deine LED-Positionen wiederspiegelt. Das klassische Layout wird für gewöhnlichen für TVs verwendet, Hyperion unterstützt aber auch LED Wände (Matrix). Die Ansicht des LAYOUTS ist die perspektive VOR dem Fernseher, nicht dahinter.", - "conf_leds_nav_label_ledcontroller" : "LED Steuerung", - "conf_leds_nav_label_ledlayout" : "LED Layout", - "conf_leds_contr_label_contrtype" : "Steuerungstyp:", - "conf_leds_optgroup_RPiSPI" : "RPi SPI", - "conf_leds_optgroup_RPiPWM" : "RPi PWM", - "conf_leds_optgroup_RPiGPIO" : "RPi GPIO", - "conf_leds_optgroup_network" : "Netzwerk", - "conf_leds_optgroup_usb" : "USB", - "conf_leds_optgroup_debug" : "Debug", - "conf_leds_layout_btn_checklist" : "Zeige Checkliste", - "conf_leds_layout_checkp1" : "Die schwarze eingefärbte LED ist die erste LED. Das ist der Punkt, an dem die Daten eingespeist werden.", - "conf_leds_layout_checkp2" : "Das Layout ist die Ansicht vor dem Fernseher stehend, nicht dahinter.", - "conf_leds_layout_checkp3" : "Stelle sicher, dass die Richtung richtig eingestellt ist, dazu ist die zweite und dritte LED grau markiert um den Datenfluss anzuzeigen.", - "conf_leds_layout_checkp4" : "Vorgang Lücke: Solltest du eine Lücke benötigen, ignoriere diese bei der LED Angabe Oben/Unten/Rechts/Links und gebe anschließend unter Lückenlänge an, wieviel LEDs du abziehen möchtest. Verändere jetzt die Lückenposition, um die Lücke an die richtige Stelle zu rücken.", - "conf_leds_layout_frame" : "Klassisches Layout (Rahmen)", - "conf_leds_layout_matrix" : "Matrix Layout (LED Wand)", - "conf_leds_layout_generatedconf" : "Generierte/Aktuelle LED Konfiguration", - "conf_leds_layout_button_savelay" : "Speichere Layout", - "conf_leds_layout_button_updsim" : "Aktualisiere Vorschau", - "conf_leds_layout_peview" : "LED Layout Vorschau", - "conf_leds_layout_advanced" : "Erweiterte Optionen", - "conf_leds_layout_preview_originCL" : "Erstellt von: Klassisches Layout (Rahmen)", - "conf_leds_layout_preview_originTEXT" : "Erstellt von: Textfeld", - "conf_leds_layout_preview_originMA" : "Erstellt von: Matrix Layout (LED Wand)", - "conf_leds_layout_preview_totalleds" : "LEDs gesamt: $1", - "conf_leds_layout_preview_ledpower" : "Max. Stromstärke: $1 A", - "conf_leds_layout_preview_l1" : "Das ist die erste LED (Einspeisung)", - "conf_leds_layout_preview_l2" : "Das visualisiert die Richtung des Datenstroms (zweite/dritte LED)", - "conf_leds_layout_cl_top" : "Oben", - "conf_leds_layout_cl_bottom" : "Unten", - "conf_leds_layout_cl_left" : "Links", - "conf_leds_layout_cl_right" : "Rechts", - "conf_leds_layout_cl_gaglength" : "Lückenlänge", - "conf_leds_layout_cl_gappos" : "Lückenposition", - "conf_leds_layout_cl_inppos" : "Einspeisepunkt", - "conf_leds_layout_cl_reversdir" : "Richtung umkehren", - "conf_leds_layout_cl_hleddepth" : "Horizontale LED Tiefe", - "conf_leds_layout_cl_vleddepth" : "Vertikale LED Tiefe", - "conf_leds_layout_cl_generate" : "Generiere LED Konfiguration", - "conf_leds_layout_cl_edgegap" : "Rahmenabstand", - "conf_leds_layout_cl_cornergap" : "Eckabstand", - "conf_leds_layout_cl_overlap" : "Überlappung", - "conf_leds_layout_ma_horiz" : "Horizontal", - "conf_leds_layout_ma_vert" : "Vertikal", - "conf_leds_layout_ma_cabling" : "Verkabelung", - "conf_leds_layout_ma_optsnake" : "Schlange", - "conf_leds_layout_ma_optparallel" : "Parallel", - "conf_leds_layout_ma_order" : "Reihenfolge", - "conf_leds_layout_ma_opthoriz" : "Horizontal", - "conf_leds_layout_ma_optvert" : "Vertikal", - "conf_leds_layout_ma_position" : "Einpeisepunkt", - "conf_leds_layout_ma_opttopleft" : "Oben links", - "conf_leds_layout_ma_opttopright" : "Oben rechts", - "conf_leds_layout_ma_optbottomleft" : "Unten links", - "conf_leds_layout_ma_optbottomright" : "Unten rechts", - "conf_leds_layout_textf1" : "Das Textfeld zeigt dir dein aktuell geladenes Layout, sofern du kein neues Layout mit den Optionen unten erstellt hast. Optional kann man die Werte hier weiter bearbeiten.", - "conf_grabber_fg_intro" : "Plattform Aufnahme ist das lokale System auf dem Hyperion installiert wurde, welches als Bildquelle dient.", - "conf_grabber_v4l_intro" : "USB Aufnahme ist ein Gerät, welches via USB angeschlossen ist und als Bildquelle dient.", - "conf_colors_color_intro" : "Erstelle Kalibrierungsprofile und passe Farben an, Helligkeit, Linearisierung und mehr.", - "conf_colors_smoothing_intro" : "Glätte den Farbverlauf und Helligkeitsänderungen um nicht von schnellen Übergängen abgelenkt zu werden.", - "conf_colors_blackborder_intro" : "Ignoriere schwarze Balken, jeder Modus nutzt einen anderen Algorithmus um diese zu erkennen. Erhöhe die Schwelle, sollte es nicht funktionieren.", - "conf_network_json_intro" : "Der JSON-RPC-Port dieser Hyperion-Instanz, wird genutzt zur Fernsteuerung.", - "conf_network_proto_intro" : "Der PROTO-Port dieser Hyperion-Instanz, wird genutzt für \"Bildstreams\" (HyperionScreenCap, Kodi Adddon, ...)", - "conf_network_bobl_intro" : "Boblight Empfänger", - "conf_network_udpl_intro" : "UDP Empfänger", - "conf_network_forw_intro" : "Leite alles an eine zweite Hyperion Instanz weiter, diese kann dann mit einer anderen LED Steuerung genutzt werden", - "conf_kodi_label_title" : "Kodi Überwachung", - "conf_kodi_intro" : "Die Kodi Überwachung ermöglicht es dir abhängig vom Kodi Status dein ambient light an oder abzuschalten. Dies ist nicht limitiert auf das selbe Gerät. Du kannst jedes Kodi in deinem lokalen Netzwerk überwachen lassen.", - "conf_logging_label_intro" : "Überprüfe die Meldungen im Prokotoll um zu erfahren was Hyperion gerade beschäftigt. Je nach eingestellter Protokoll-Stufe siehst du mehr oder weniger Informationen.", - "conf_logging_btn_pbupload" : "Bericht für Supportanfrage erstellen", - "conf_logging_btn_autoscroll" : "Automatisch scrollen", - "conf_logging_nomessage" : "Keine Einträge vorhanden.", - "conf_logging_uploading" : "Aufbereitung der Daten...", - "conf_logging_yourlink" : "Link zu deinem Bericht", - "conf_logging_uplfailed" : "Hochladen fehlgeschlagen! Überprüfe deine Internetverbindung!", - "conf_webconfig_label_intro" : "Einstellungen zur Webkonfiguration. Änderungen können die Erreichbarkeit des Webinterfaces beeinflussen.", - "remote_losthint" : "Notiz: Alle Änderungen gehen nach einem Neustart verloren.", - "remote_color_label" : "Farbe/Effekt", - "remote_color_intro" : "Setze einen Effekt oder eine Farbe. Auch deine selbst erstellten Effekte sind gelistet (sofern verfügbar). $1", - "remote_color_button_reset" : "Farbe/Effekt zurücksetzen", - "remote_color_label_color" : "Farbe:", - "remote_effects_label_effects" : "Effekt:", - "remote_adjustment_label" : "Farbanpassung", - "remote_adjustment_intro" : "Verändere live Farbe/Helligkeit/Linearisierung. $1", - "remote_input_label" : "Quellenauswahl", - "remote_input_intro" : "Hyperion nutzt ein Prioritätensystem um die Quelle zu wählen. Alles was du setzte hat eine Prioität (Effekte/Farben/Plattform Aufnahme/USB Aufnahme und Netzwerkquellen). Standardmäßig nutzt Hyperion die Quelle mit der niedrigsten Prioität. Hier kannst du aktiv Einfluss darauf nehmen. $1", - "remote_input_label_autoselect" : "Automatische Auswahl", - "remote_input_setsource_btn" : "Wähle Quelle", - "remote_input_sourceactiv_btn" : "Quelle aktiv", - "remote_input_origin" : "Ursprung", - "remote_input_owner" : "Typ", - "remote_input_priority" : "Priorität", - "remote_input_status" : "Status/Aktion", - "remote_input_duration" : "Dauer:", - "remote_input_ip" : "IP:", - "remote_components_label" : "Komponentensteuerung", - "remote_components_intro" : "Starte und stoppe Komponenten von Hyperion. $1", - "remote_optgroup_usreffets" : "Benutzer Effekte", - "remote_optgroup_syseffets" : "Mitgelieferte Effekte", - "remote_maptype_label" : "LED-Bereich Zuordnung", - "remote_maptype_intro" : "Wechsle zwischen verschiedenen Typen um die Auswirkungen besser vergleichen zu können. $1", - "remote_maptype_label_multicolor_mean" : "Mehrfarbig", - "remote_maptype_label_unicolor_mean" : "Einfarbig", - "effectsconfigurator_label_intro" : "Erstelle auf Grundlage der Basiseffekte neue Effekt die nach deinen Wünschen angepasst sind. Je nach Effekt stehen Optionen wie Farbe, Geschwindigkeit, oder Richtung und vieles mehr zur Auswahl.", - "effectsconfigurator_label_chooseeff" : "Basis-Effekt auswählen:", - "effectsconfigurator_button_saveeffect" : "Effekt speichern", - "effectsconfigurator_label_effectname" : "Effektname", - "effectsconfigurator_button_starttest" : "Starte Test", - "effectsconfigurator_button_stoptest" : "Stoppe Test", - "effectsconfigurator_button_conttest" : "Fortlaufender Test", - "effectsconfigurator_label_deleffect" : "Effekt entfernen:", - "effectsconfigurator_button_deleffect" : "Effekt entfernen", - "support_label_title" : "Unterstütze Hyperion", - "support_label_intro" : "Hyperion ist ein kostenloses Open Source Projekt und ein kleines Team arbeitet an seiner Weiterentwicklung. Darum benötigen wir DEINE Unterstützung um den Ball weiter rollen zu lassen und um weiter in bessere Infrastruktur und Weiterentwicklung investieren zu können.", - "support_label_spreadtheword" : "Weitersagen!", - "support_label_fbtext" : "Teile Inhalte in Facebook und halte dich und andere auf dem Laufenden", - "support_label_twtext" : "Nutze die 140 Zeichen und bleibe auf dem Laufenden auch auf Twitter", - "support_label_ggtext" : "Platziere uns in deinen Kreisen auf Google+", - "support_label_yttext" : "Gelangweilt von Bildern? Werfe einen Blick auf unsere Youtube Videos", - "support_label_donate" : "Spende oder nutze unsere Affiliate Links", - "support_label_affinstr1" : "Klicke auf den Link deines Landes", - "support_label_affinstr2" : "Kaufe wie gewohnt ein, abhängig von deinem Umsatz bekommen wir eine kleine Provision", - "support_label_affinstr3" : "Du zahlst immer den selben Preis. Teste es!", - "support_label_btctext" : "Adresse:", - "support_label_donationpp" : "Spende:", - "support_label_webrestitle" : "Informationsquellen und Hilfe", - "support_label_webpagetitle" : "Internetseite", - "support_label_webpagetext" : "Das Zuhause von Hyperion", - "support_label_wikititle" : "Wiki", - "support_label_wikitext" : "Von A bis Z - Alles wissenwerte zu Hyperion", - "support_label_forumtitle" : "Forum", - "support_label_forumtext" : "Diskussion und Hilfestellung von der Community", - "support_label_ghtext" : "Besuche uns auf Github", - "update_label_intro" : "Diese Seite zeigt dir alle verfügbaren Versionen von Hyperion, du kannst nach Belieben eine aktuellere Version installieren oder eine Ältere. Die aktuellsten Versionen befinden sich immer oben.", - "update_label_description" : "Beschreibung:", - "update_button_install" : "Installieren", - "update_button_changelog" : "Zeige Änderungsprotokoll", - "update_label_type" : "Art:", - "update_versreminder" : "Deine Version: $1", - "about_version" : "Version", - "about_build" : "Build", - "about_builddate" : "Build Datum", - "about_translations" : "Übersetzungen", - "about_resources" : "$1 Bibliotheken", - "about_contribute" : "Übersetze Hyperion in weitere Sprachen!", - "about_credits" : "Einen Dank an alle Entwickler!", - "info_conlost_label_title" : "Verbindung zum Hyperion Service unterbrochen!", - "info_conlost_label_reason" : "Mögliche Ursachen:", - "info_conlost_label_reason1" : "- Schlechte WLAN Verbindung", - "info_conlost_label_reason2" : "- Ein Update wird durchgeführt", - "info_conlost_label_reason3" : "- Hyperion wird nicht mehr ausgeführt", - "info_conlost_label_autorecon" : "Du wirst verbunden, sobald Hyperion wieder verfügbar ist", - "info_conlost_label_autorefresh" : "Diese Seite wird automatisch aktualisiert", - "info_conlost_label_reload" : "Wenn nicht, klicke hier", - "info_restart_title" : "Startet gerade neu...", - "info_restart_rightback" : "Hyperion ist gleich wieder für dich da!", - "info_restart_contus" : "Solltest du nach 20 Sekunden immer noch hier sein, ist etwas schief gelaufen. Öffne bitte in unserem Support Forum ein neues Thema...", - "info_restart_contusa" : "...mit deinen letztes Schritten. Danke!", - "infoDialog_general_success_title" : "Erfolg", - "infoDialog_general_error_title" : "Fehler", - "infoDialog_general_warning_title" : "Warnung", - "infoDialog_checklist_title" : "Checkliste!", - "InfoDialog_leds_validfail_title" : "JSON Überprüfung fehlgeschlagen!", - "infoDialog_effconf_deleted_text" : "Der Effekt \"$1\" wurde erfolgreich entfernt!", - "infoDialog_effconf_created_text" : "Der Effekt \"$1\" wurde erfolgreich erstellt!", - "InfoDialog_lang_title" : "Spracheinstellung", - "InfoDialog_lang_text" : "Sollte dir die Vorauswahl der automatischen Spracherkennung nicht gefallen, kannst du die Sprache hier manuell festlegen.", - "InfoDialog_access_title" : "Einstellungsstufe", - "InfoDialog_access_text" : "Je höher die Stufe je mehr Einstellungen und Funktionen stehen zur Verfügung. Empfohlen ist \"Standard\".", - "InfoDialog_nowrite_title" : "Fehler beim Schreibzugriff!", - "InfoDialog_nowrite_text" : "Hyperion hat keinen Schreibzugriff auf die aktuell geladene Konfiguration. Bitte korrigiere die Dateizugriffsrechte um fortzufahren.", - "InfoDialog_nowrite_foottext" : "Die Webkonfiguration wird automatisch wieder freigegeben, sobald das Problem behoben wurde!", - "infoDialog_wizrgb_text" : "Deine RGB Byte Reihenfolge ist bereits richtig eingestellt.", - "infoDialog_writeconf_error_text" : "Das speichern der Konfiguration ist fehlgeschlagen.", - "infoDialog_import_jsonerror_text" : "Die ausgewählte Konfigurations-Datei \"$1\" ist keine .json Datei oder ist beschädigt! Fehlermeldung: ($2)", - "infoDialog_import_hyperror_text" : "Die ausgewählte Konfigurations-Datei \"$1\" kann nicht importiert werden. Sie ist nicht kompatibel mit Hyperion 2.0 und höher!", - "infoDialog_import_reverror_text" : "Die Version deiner Konfigurations-Datei \"$1\" stimmt nicht mit deiner Hyperion Version überein (Datei: $2, Hyperion: $3). Du kannst nur übereinstimmende Versionen importieren!", - "infoDialog_import_comperror_text" : "Dein Browser unterstützt leider keinen Import. Bitte versuche es mit einem anderen Browser erneut.", - "infoDialog_import_confirm_title" : "Bestätige Import", - "infoDialog_import_confirm_text" : "Bist du sicher, dass du die Konfigurations-Datei \"$1\" importieren möchtest? Diese Aktion kann nicht rückgängig gemacht werden!", - "wiz_rgb_title" : "RGB Byte Reihenfolge Assistent", - "wiz_rgb_intro1" : "Dieser Assisent wird dir dabei helfen die richtige Byte Reihenfolge für deine leds zu finden. Klicke auf Fortfahren um zu beginnen.", - "wiz_rgb_intro2" : "Wann benötigt man diesen Assistenten? Zur Erstkonfiguration oder wenn deine LEDs zb rot leuchten sollten, sie aber blau oder grün sind.", - "wiz_rgb_expl" : "Der Farbpunkt ändert alle x Sekunden die Farbe (rot, grün), zur selben Zeit ändern deine LEDs die Farbe ebenfalls. Beantworte die Fragen unten, um deine RGB Byte Reihenfolge zu überprüfen/korrigieren.", - "wiz_rgb_switchevery" : "Ändere Farbe alle...", - "wiz_rgb_q" : "Welche Farbe zeigen deine LEDs, wenn der Farbpunkt oben...", - "wiz_rgb_qrend" : "...rot ist?", - "wiz_rgb_qgend" : "...grün ist?", - "wiz_hue_title" : "Hue Bridge Assistent", - "wiz_hue_intro1" : "Mit diesem Setupassistenten kannst du einen neuen User auf der Hue Bridge anlegen und deine LightIDs für die Hyperion Konfiguration herausfinden.", - "wiz_hue_intro2" : "Beachte: Dies ist nur ein Assistent. Du musst die Daten in die Konfiguration kopieren.", - "wiz_hue_ip" : "Hue Bridge IP:", - "wiz_hue_username" : "Benutzername:", - "wiz_hue_create_user" : "Benutzer anlegen", - "wiz_hue_failure_ip" : "Bitte überprüfe deine IP Adresse.", - "wiz_hue_failure_connection" : "Connection Timeout. Bitte drücke die Taste rechtzeitig.", - "wiz_hue_press_link" : "Bitte \"Link\" Taste auf der Hue Bridge drücken.", - "wiz_cc_title" : "Farbkalibrierungs Assistent", - "wiz_cc_intro1" : "Der Assistent wird dich durch die Kalibrierung deiner LEDs leiten. Sofern du Kodi nutzt, können die Bilder und Testvideos direkt an Kodi geschickt werden. Andernfalls musst du das Material selbst herunterladen und anwenden.", - "wiz_cc_kwebs" : "Kodi Webserver (IP:Port)", - "wiz_cc_kodidiscon" : "Kodi Webserver nicht gefunden, fahre ohne Kodi-Unterstützung fort.", - "wiz_cc_kodidisconlink" : "Download Link Bilder:", - "wiz_cc_kodicon" : "Kodi Webserver gefunden, fahre mit Kodi-Unterstützung fort.", - "wiz_cc_kodimsg_start" : "Test bestanden - Zeit zu beginnen", - "wiz_cc_kodishould" : "Kodi sollte jetzt folgendes Bild anzeigen: $1", - "wiz_cc_lettvshow" : "Lass dabei deinen Fernseher folgendes Bild anzeigen: $1", - "wiz_cc_lettvshowm" : "Überprüfe dies mithilfe folgender Bildern: $1", - "wiz_cc_adjustit" : "Verändere dein \"$1\", bis du zufrieden bist. Beachte: Je mehr du reduzierst bzw von dem Standardwert abweichst, je mehr veränderst du den maximalen Farbraum, was alle Farben die daraus abgeleitet werden ebenfalls betrifft. Je nach TV/LED Farbspektrum sind die Ergebnisse unterschiedlich.", - "wiz_cc_adjustgamma" : "Gamma: Was du jetzt tun musst ist, jeden Gamma-Kanal so einstellen, dass der \"Grauverlauf\" auf den LEDs nicht grünlich/rötlich/bläulich aussieht. Beispiel: Sollte dein grau etwas rötlich sein bedeutet dies, dass du dein Gamma für Rot erhöhen musst um den Rot-Anteil zu verringern (Je mehr Gamma, desto weniger Farbe).", - "wiz_cc_chooseid" : "Wähle einen Namen für dieses Profil.", - "wiz_cc_btn_switchpic" : "Testbild ändern", - "wiz_cc_backlight" : "Zusätzlich kannst du eine Hintergrundbeluchtung einstellen, um \"irritierende Farben\" bei fast schwarzem Bild zu vermeiden oder du den Wechsel zwischen Farbe und Aus als zu anstrengend empfindest. Zusätzlich kann bestimmt werden, ob diese farbig oder nur weiß sein soll. Wird automatisch deaktiviert im Zustand \"Aus\" sowie bei \"Farbe\" und \"Effekt\".", - "wiz_cc_testintro" : "Nun ist es an der Zeit für einen Testlauf.", - "wiz_cc_testintrok" : "Klicke auf einen Button, um eines der Testvideos abzuspielen.", - "wiz_cc_testintrowok" : "Unter folgendem Link findest du ein paar Testvideos zum herunterladen und abspielen:", - "wiz_cc_link" : "Klick mich", - "wiz_cc_morethanone" : "Du hast mehr als 1 Profil, bitte wähle das zu kalibrierende Profil", - "wiz_cc_btn_stop" : "Stoppe Video", - "wiz_cc_summary" : "Im folgenden eine Zusammenfassung deiner Einstellungen. Während du ein Video abspielst, kannst du hier weiter ausprobieren. Wenn du fertig bist, klicke auf speichern.", - "edt_dev_enum_subtract_minimum" : "Subtrahiere minimum", - "edt_dev_enum_sub_min_warm_adjust" : "Minimale Anpassung: warm", - "edt_dev_enum_white_off" : "Weiß ist aus", - "edt_dev_general_heading_title" : "Allgemeine Einstellungen", - "edt_dev_general_ledCount_title" : "Anzahl Hardware LEDs", - "edt_dev_general_colorOrder_title" : "RGB Byte Reihenfolge", - "edt_dev_general_rewriteTime_title" : "Aktualisierungszeit", - "edt_dev_spec_header_title" : "Spezifische Einstellungen", - "edt_dev_spec_baudrate_title" : "Baudrate", - "edt_dev_spec_spipath_title" : "SPI Pfad", - "edt_dev_spec_invert_title" : "Invertiere Signal", - "edt_dev_spec_multicastGroup_title" : "Multicast Gruppe", - "edt_dev_spec_numberOfLeds_title" : "Anzahl der LEDs", - "edt_dev_spec_port_title" : "Port", - "edt_dev_spec_orbIds_title" : "Orb ID(s)", - "edt_dev_spec_useOrbSmoothing_title" : "Nutze Orb Glättung", - "edt_dev_spec_targetIp_title" : "Ziel IP", - "edt_dev_spec_targetIpHost_title" : "Ziel IP/hostname", - "edt_dev_spec_outputPath_title" : "Ausgabepfad", - "edt_dev_spec_delayAfterConnect_title" : "Verzögerung nach Verbindung", - "edt_dev_spec_FCsetConfig_title" : "Wende fadecandy Konfiguration an", - "edt_dev_spec_FCmanualControl_title" : "Manuelle Steuerung der fadecandy LEDs", - "edt_dev_spec_FCledToOn_title" : "Fadecandy LEDs set to on", - "edt_dev_spec_interpolation_title" : "Interpolation", - "edt_dev_spec_dithering_title" : "Dithering", - "edt_dev_spec_gamma_title" : "Gamma", - "edt_dev_spec_whitepoint_title" : "Weißpunkt", - "edt_dev_spec_username_title" : "Benutzername", - "edt_dev_spec_lightid_title" : "Lampen ID(s)", - "edt_dev_spec_lightid_itemtitle" : "ID", - "edt_dev_spec_transistionTime_title" : "Übergangszeit", - "edt_dev_spec_switchOffOnBlack_title" : "Aus bei schwarz", - "edt_dev_spec_uid_title" : "UID", - "edt_dev_spec_intervall_title" : "Intervall", - "edt_dev_spec_latchtime_title" : "Sperrzeit", - "edt_dev_spec_maxPacket_title" : "Paketgröße", - "edt_dev_spec_serial_title" : "Seriennummer", - "edt_dev_spec_vid_title" : "VID", - "edt_dev_spec_pid_title" : "PID", - "edt_dev_spec_cid_title" : "CID", - "edt_dev_spec_LBap102Mode_title" : "LightBerry APA102 Modus", - "edt_dev_spec_universe_title" : "Universum", - "edt_dev_spec_whiteLedAlgor_title" : "Weiß Algorithmus", - "edt_dev_spec_useRgbwProtocol_title" : "Nutze RGBW Protokoll", - "edt_dev_spec_maximumLedCount_title" : "Maximale Anzahl LEDs", - "edt_dev_spec_gpioNumber_title" : "GPIO Nummer", - "edt_dev_spec_gpioMap_title" : "GPIO Zuweisung", - "edt_dev_spec_PBFiFo_title" : "Pi-Blaster FiFo", - "edt_dev_spec_gpioBcm_title" : "GPIO Pin", - "edt_dev_spec_ledIndex_title" : "LED index", - "edt_dev_spec_colorComponent_title" : "Farbkomponente", - "edt_conf_general_enable_title" : "Aktiviert", - "edt_conf_general_enable_expl" : "Wenn aktiviert, ist die Komponente aktiv.", - "edt_conf_general_priority_title" : "Priorität", - "edt_conf_general_priority_expl" : "Die Priorität dieser Komponente.", - "edt_conf_general_port_title" : "Port", - "edt_conf_general_port_expl" : "Der genutzte Port.", - "edt_conf_enum_color" : "Farbe", - "edt_conf_enum_effect" : "Effekt", - "edt_conf_enum_multicolor_mean" : "Mehrfarbig", - "edt_conf_enum_unicolor_mean" : "Einfarbig", - "edt_conf_enum_rgb" : "RGB", - "edt_conf_enum_bgr" : "BGR", - "edt_conf_enum_rbg" : "RBG", - "edt_conf_enum_brg" : "BRG", - "edt_conf_enum_gbr" : "GBR", - "edt_conf_enum_grb" : "GRB", - "edt_conf_enum_linear" : "Linear", - "edt_conf_enum_PAL" : "PAL", - "edt_conf_enum_NTSC" : "NTSC", - "edt_conf_enum_logsilent" : "Stille", - "edt_conf_enum_logwarn" : "Warnung", - "edt_conf_enum_logverbose" : "Ausführlich", - "edt_conf_enum_logdebug" : "Debug", - "edt_conf_enum_bbdefault" : "Standard", - "edt_conf_enum_bbclassic" : "Klassisch", - "edt_conf_enum_bbosd" : "OSD", - "edt_conf_gen_heading_title" : "Allgemeine Einstellungen", - "edt_conf_gen_name_title" : "Name der Konfiguration", - "edt_conf_gen_name_expl" : "Der Name wird verwendet, um Hyperion besser zu identifizieren. (Hilfreich bei mehreren Instanzen)", - "edt_conf_gen_showOptHelp_title" : "Zeige Erklärungen", - "edt_conf_gen_showOptHelp_expl" : "Zeige alle verfügbaren Options-Erklärungen. Empfohlen für Anfänger", - "edt_conf_color_heading_title" : "Farbkalibrierung", - "edt_conf_color_channelAdjustment_header_title" : "Anpassung Farbkanäle", - "edt_conf_color_channelAdjustment_header_itemtitle" : "Profil", - "edt_conf_color_channelAdjustment_header_expl" : "Passe die Farbkanäle deinen LEDs an", - "edt_conf_color_imageToLedMappingType_title" : "LED-Bereich Zuordnungstyp", - "edt_conf_color_imageToLedMappingType_expl" : "Sofern nicht \"Mehrfarbig\", wird dein LED Layout mit einer anderen Bildzuweisung überschrieben", - "edt_conf_color_id_title" : "ID", - "edt_conf_color_id_expl" : "Eine vom Benutzer frei angegebene ID.", - "edt_conf_color_leds_title" : "LED index", - "edt_conf_color_leds_expl" : "Zugewiesen zu allen (*) LEDs oder nur zu bestimmten LED Nummern (0-17).", - "edt_conf_color_black_title" : "Schwarz", - "edt_conf_color_black_expl" : "Kalibrierter Schwarzwert.", - "edt_conf_color_white_title" : "Weiß", - "edt_conf_color_white_expl" : "Kalibrierter Weißwert.", - "edt_conf_color_red_title" : "Rot", - "edt_conf_color_red_expl" : "Kalibrierter Rotwert.", - "edt_conf_color_green_title" : "Grün", - "edt_conf_color_green_expl" : "Kalibrierter Grünwert.", - "edt_conf_color_blue_title" : "Blau", - "edt_conf_color_blue_expl" : "Kalibrierter Blauwert.", - "edt_conf_color_cyan_title" : "Cyan", - "edt_conf_color_cyan_expl" : "Kalibrierter Cyanwert.", - "edt_conf_color_magenta_title" : "Magenta", - "edt_conf_color_magenta_expl" : "Kalibrierter Magentawert.", - "edt_conf_color_yellow_title" : "Gelb", - "edt_conf_color_yellow_expl" : "Kalibrierter Gelbwert.", - "edt_conf_color_gammaRed_title" : "Gamma rot", - "edt_conf_color_gammaRed_expl" : "Gamma von rot.", - "edt_conf_color_gammaGreen_title" : "Gamma grün", - "edt_conf_color_gammaGreen_expl" : "Gamma von grün.", - "edt_conf_color_gammaBlue_title" : "Gamma blau", - "edt_conf_color_gammaBlue_expl" : "Gamma von blau", - "edt_conf_color_backlightThreshold_title" : "Hintergrund - beleuchtung", - "edt_conf_color_backlightThreshold_expl" : "Eine Beleuchtung die dauerhaft aktiv ist. (Automatisch deaktiviert bei Effekten, Farben oder im Zustand \"Aus\")", - "edt_conf_color_backlightColored_title" : "Farbige Hintergrund - beleuchtung", - "edt_conf_color_backlightColored_expl" : "Die Hintergrundbeleuchtung kann mit oder ohne Farbanteile genutzt werden.", - "edt_conf_color_brightness_title" : "Maximale Helligkeit", - "edt_conf_color_brightness_expl" : "Zwischen 0.0 und 0.5 ist die Helligkeit linearisiert. Von 0.5 bis 1.0 wird cyan, magenta und gelb bis zu 2x heller und weiß bis zu 3x.", - "edt_conf_smooth_heading_title" : "Glättung", - "edt_conf_smooth_type_title" : "Art", - "edt_conf_smooth_type_expl" : "Algorithmus der Glättung.", - "edt_conf_smooth_time_ms_title" : "Zeit", - "edt_conf_smooth_time_ms_expl" : "Wie lange soll die Glättung Bilder sammeln?", - "edt_conf_smooth_updateFrequency_title" : "Aktualisierungsfrequenz", - "edt_conf_smooth_updateFrequency_expl" : "Die Geschwindigkeit der Datenausgabe an die LED Steuerung.", - "edt_conf_smooth_updateDelay_title" : "Aktualisierungsverzögerung", - "edt_conf_smooth_updateDelay_expl" : "Verzögere die Ausgabe, sollte dein ambient light schneller sein als dein TV.", - "edt_conf_smooth_continuousOutput_title" : "Fortlaufende Ausgabe", - "edt_conf_smooth_continuousOutput_expl" : "Aktualisiere die LEDs, auch wenn das Bild sich nicht geändert hat.", - "edt_conf_v4l2_heading_title" : "USB Aufnahme", - "edt_conf_v4l2_device_title" : "Gerät", - "edt_conf_v4l2_device_expl" : "Der Pfad zum USB Aufnahmegerät.", - "edt_conf_v4l2_input_title" : "Eingang", - "edt_conf_v4l2_input_expl" : "Der Eingang des Pfades.", - "edt_conf_v4l2_standard_title" : "Videoformat", - "edt_conf_v4l2_standard_expl" : "Wähle das passende Videoformat deiner Region.", - "edt_conf_v4l2_width_title" : "Breite", - "edt_conf_v4l2_width_expl" : "Die Breite des Bildes. (-1 = Automatische Breitenbestimmung)", - "edt_conf_v4l2_height_title" : "Höhe", - "edt_conf_v4l2_height_expl" : "Die Höhes des Bildes. (-1 = Automatische Höhenbestimmung)", - "edt_conf_v4l2_frameDecimation_title" : "Bildverkleinerung", - "edt_conf_v4l2_frameDecimation_expl" : "Der Faktor der Bildverkleinerung", - "edt_conf_v4l2_sizeDecimation_title" : "Größenänderung", - "edt_conf_v4l2_sizeDecimation_expl" : "Der Faktor der Größenänderung", - "edt_conf_v4l2_mode_title" : "Modus", - "edt_conf_v4l2_mode_expl" : "Modus der USB Aufnahme", - "edt_conf_v4l2_useKodiChecker_title" : "Nutze Kodi Überwachung", - "edt_conf_v4l2_useKodiChecker_expl" : "Starte/Stoppe Aufnahme mithilfe der Kodi Überwachung.", - "edt_conf_v4l2_cropLeft_title" : "Entferne links", - "edt_conf_v4l2_cropLeft_expl" : "Anzahl der Pixel auf der linken Seite die vom Bild entfernt werden.", - "edt_conf_v4l2_cropRight_title" : "Entferne rechts", - "edt_conf_v4l2_cropRight_expl" : "Anzahl der Pixel auf der rechten Seite die vom Bild entfernt werden.", - "edt_conf_v4l2_cropTop_title" : "Entferne oben", - "edt_conf_v4l2_cropTop_expl" : "Anzahl der Pixel auf der oberen Seite die vom Bild entfernt werden.", - "edt_conf_v4l2_cropBottom_title" : "Entferne unten", - "edt_conf_v4l2_cropBottom_expl" : "Anzahl der Pixel auf der unteren Seite die vom Bild entfernt werden.", - "edt_conf_v4l2_redSignalThreshold_title" : "Rote Signalschwelle", - "edt_conf_v4l2_redSignalThreshold_expl" : "Verdunkelt rote Werte. (Wird als schwarz interpretiert)", - "edt_conf_v4l2_greenSignalThreshold_title" : "Grüne Signalschwelle", - "edt_conf_v4l2_greenSignalThreshold_expl" : "Verdunkelt grüne Werte. (Wird als schwarz interpretiert)", - "edt_conf_v4l2_blueSignalThreshold_title" : "Blaue Signalschwelle", - "edt_conf_v4l2_blueSignalThreshold_expl" : "Verdunkelt blaue Werte. (Wird als schwarz interpretiert))", - "edt_conf_fg_heading_title" : "Plattform Aufnahme", - "edt_conf_fg_type_title" : "Typ", - "edt_conf_fg_type_expl" : "Art der Plattform Aufnahme, standard ist 'auto'", - "edt_conf_fg_frequency_Hz_title" : "Aufnahmefrequenz", - "edt_conf_fg_frequency_Hz_expl" : "Wie schnell neue Bilder aufgenommen werden.", - "edt_conf_fg_horizontalPixelDecimation_title" : "Horizontale Pixelreduzierung", - "edt_conf_fg_horizontalPixelDecimation_expl" : "Horizontale Pixelreduzierung (Faktor)", - "edt_conf_fg_useXGetImage_title" : "Nutze XGetImage", - "edt_conf_fg_useXGetImage_expl" : "XGetImage für aktuelle X11 desktops", - "edt_conf_fg_verticalPixelDecimation_title" : "Vertikale Pixelreduzierung", - "edt_conf_fg_verticalPixelDecimation_expl" : "Vertikale Pixelreduzierung (Faktor)", - "edt_conf_fg_device_title" : "Device", - "edt_conf_fg_display_title" : "Display", - "edt_conf_fg_display_expl" : "Gebe an von welchem Desktop aufgenommen werden soll. (Multi Monitor Setup)", - "edt_conf_bb_heading_title" : "Schwarze Balken Erkennung", - "edt_conf_bb_threshold_title" : "Schwelle", - "edt_conf_bb_threshold_expl" : "Wenn die Erkennung nicht funktioniert, erhöhe die Schwelle um auf 'graues' schwarz zu reagieren.", - "edt_conf_bb_unknownFrameCnt_title" : "unknownFrameCnt", - "edt_conf_bb_borderFrameCnt_title" : "borderFrameCnt", - "edt_conf_bb_maxInconsistentCnt_title" : "maxInconsistentCn", - "edt_conf_bb_blurRemoveCnt_title" : "blurRemoveCnt", - "edt_conf_bb_mode_title" : "Modus", - "edt_conf_bb_mode_expl" : "Algorithmus zur Auswertung. (siehe Wiki)", - "edt_conf_kodic_heading_title" : "Kodi Überwachung", - "edt_conf_kodic_kodiAddress_title" : "Kodi IP Adresse", - "edt_conf_kodic_kodiAddress_expl" : "Die IP Adresse von Kodi.", - "edt_conf_kodic_kodiTcpPort_title" : "Kodi TCP Port", - "edt_conf_kodic_kodiTcpPort_expl" : "Der Kodi TCP Port. Nutze nicht den Webserver Port!", - "edt_conf_kodic_grabVideo_title" : "Video", - "edt_conf_kodic_grabVideo_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während ein Video abgespielt werden.", - "edt_conf_kodic_grabPictures_title" : "Bilder", - "edt_conf_kodic_grabPictures_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während Bilder angezeigt werden.", - "edt_conf_kodic_grabAudio_title" : "Audio", - "edt_conf_kodic_grabAudio_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während Musik abgespielt wird.", - "edt_conf_kodic_grabMenu_title" : "Menü", - "edt_conf_kodic_grabMenu_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während du dich im Kodi Menü oder Nutzerauswahl befindest.", - "edt_conf_kodic_grabPause_title" : "Pause", - "edt_conf_kodic_grabPause_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während Kodi pausiert (Video, Musik, Diashow).", - "edt_conf_kodic_grabScreensaver_title" : "Bildschirmschoner", - "edt_conf_kodic_grabScreensaver_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während Kodi pausiert (Video, Musik, Diashow).", - "edt_conf_kodic_enable3DDetection_title" : "Erkenne 3D", - "edt_conf_kodic_enable3DDetection_expl" : "Wenn aktiviert, erkenne und wende den passenden 3D Modus an. (kein MVC und nicht für USB Aufnahme)", - "edt_conf_fge_heading_title" : "Start Effekt/Farbe", - "edt_conf_fge_type_title" : "Typ", - "edt_conf_fge_type_expl" : "Wähle zwischen einem Effekt oder einer Farbe.", - "edt_conf_fge_color_title" : "Farbe", - "edt_conf_fge_color_expl" : "Sofern der Typ \"Farbe\" ist, stelle hier eine Farbe deiner Wahl sein.", - "edt_conf_fge_effect_title" : "Effekt", - "edt_conf_fge_effect_expl" : "Sofern der Typ \"Effekt\" ist, wähle hier einen Effekt deiner Wahl. (Gilt auch für selbst erstellte)", - "edt_conf_fge_duration_ms_title" : "Dauer", - "edt_conf_fge_duration_ms_expl" : "Dauer des Effekts/Farbe beim Hyperion Start.", - "edt_conf_bge_heading_title" : "Hintergrund Effekt/Farbe", - "edt_conf_fw_heading_title" : "Weiterleitung", - "edt_conf_fw_json_title" : "Liste von Json zielen", - "edt_conf_fw_json_expl" : "Ein Json Ziel pro Zeile. Bestehend aus IP:PORT (Beispiel: 127.0.0.1:19446)", - "edt_conf_fw_json_itemtitle" : "Json Ziel", - "edt_conf_fw_proto_title" : "Liste von Proto zielen", - "edt_conf_fw_proto_expl" : "Ein Proto Ziel pro Zeile. Bestehend aus IP:PORT (Beispiel: 127.0.0.1:19447)", - "edt_conf_fw_proto_itemtitle" : "Proto Ziel", - "edt_conf_js_heading_title" : "JSON Server", - "edt_conf_ps_heading_title" : "PROTO Server", - "edt_conf_bobls_heading_title" : "Boblight Server", - "edt_conf_udpl_heading_title" : "UDP Listener", - "edt_conf_udpl_address_title" : "Adresse", - "edt_conf_udpl_address_expl" : "Die Adresse auf der UDP Pakete akzeptiert werden.", - "edt_conf_udpl_timeout_title" : "Zeitüberschreitung", - "edt_conf_udpl_timeout_expl" : "Wenn für die angegeben Zeit keine UDP Pakete empfangen werden, wird die Komponente (vorübergehend) deaktiviert", - "edt_conf_udpl_shared_title" : "Gemeinsam genutzt", - "edt_conf_udpl_shared_expl" : "Wird gemeinsam über alle Hyperion Instanzen genutzt.", - "edt_conf_webc_heading_title" : "Web Konfiguration", - "edt_conf_webc_docroot_title" : "Verzeichnis", - "edt_conf_webc_docroot_expl" : "Lokaler Pfad zum WebUI Wurzelverzeichnis (Nur für WebUI Entwickler)", - "edt_conf_effp_heading_title" : "Effekt Pfade", - "edt_conf_effp_paths_title" : "Effekt Pfad(e)", - "edt_conf_effp_paths_itemtitle" : "Pfad", - "edt_conf_effp_disable_title" : "Deaktivierte Effekte", - "edt_conf_effp_disable_itemtitle" : "Effekt", - "edt_conf_log_heading_title" : "Protokoll", - "edt_conf_log_level_title" : "Protokollstufe", - "edt_conf_log_level_expl" : "Abhängig der Stufe sind weniger oder mehr Meldungen sichtbar.", - "edt_eff_candle_header_title" : "Kerze", - "edt_eff_police_header_title" : "Polizei", - "edt_eff_fade_header_title" : "Farbübergang", - "edt_eff_rainbowmood_header_title" : "Regenbogen", - "edt_eff_knightrider_header_title" : "Knight Rider", - "edt_eff_lightclock_header_title" : "Uhr 1", - "edt_eff_clock_header_title" : "Uhr 2", - "edt_eff_pacman_header_title" : "Pac-Man", - "edt_eff_moodblobs_header_title" : "Stimmungskugeln", - "edt_eff_rainbowswirl_header_title" : "Regenbogenwirbel", - "edt_eff_random_header_title" : "Zufällig", - "edt_eff_runningdots_header_title" : "Rennende Punkte", - "edt_eff_systemshutdown_header_title" : "Herunterfahren", - "edt_eff_snake_header_title" : "Schlange", - "edt_eff_sparks_header_title" : "Funken", - "edt_eff_storbe_header_title" : "Stroboskop", - "edt_eff_traces_header_title" : "Farbspuren", - "edt_eff_x-mas_header_title" : "Weihnachten", - "edt_eff_trails_header_title" : "Spuren", - "edt_eff_enum_all" : "Alle", - "edt_eff_enum_all-together" : "Alle zusammen", - "edt_eff_enum_list" : "LED Liste", - "edt_eff_count_title" : "Anzahl", - "edt_eff_color_title" : "Farbe", - "edt_eff_colorrandom_title" : "Zufällige Farbe", - "edt_eff_colorone_title" : "Farbe eins", - "edt_eff_colortwo_title" : "Farbe zwei", - "edt_eff_colorcount_title" : "Farblänge", - "edt_eff_rotationtime_title" : "Rotationszeit", - "edt_eff_sleeptime_title" : "Schlafzeit", - "edt_eff_reversedirection_title" : "Richtung umkehren", - "edt_eff_fadetime_title" : "Übergangszeit", - "edt_eff_colorstart_title" : "Farbe Start", - "edt_eff_colorend_title" : "Farbe Ende", - "edt_eff_colorshift_title" : "Farbverschiebung", - "edt_eff_whichleds_title" : "Welche LEDs", - "edt_eff_ledlist_title" : "LED Liste", - "edt_eff_speed_title" : "Geschwindigkeit", - "edt_eff_fadefactor_title" : "Verblass Faktor", - "edt_eff_showseconds_title" : "Zeige Sekunden", - "edt_eff_blobcount_title" : "Kugelanzahl", - "edt_eff_huechange_title" : "Farbänderung", - "edt_eff_basecolorchange_title" : "Basisfarben verändern", - "edt_eff_basecolorchangerate_title" : "BF Geschwindigkeit", - "edt_eff_basecolorrangeleft_title" : "BF Bereich links", - "edt_eff_basecolorrangeright_title" : "BF Bereich rechts", - "edt_eff_brightness_title" : "Helligkeit", - "edt_eff_centerx_title" : "Mittelpunkt X-Achse", - "edt_eff_centery_title" : "Mittelpunkt Y-Achse", - "edt_eff_saturation_title" : "Sättigung", - "edt_eff_colorevel_title" : "Farbstufe", - "edt_eff_whitelevel_title" : "Weißstufe", - "edt_eff_alarmcolor_title" : "Alarm Farbe", - "edt_eff_postcolor_title" : "Startfarbe", - "edt_eff_enableshutdown_title" : "Echtes herunterfahren", - "edt_eff_length_title" : "Länge", - "edt_eff_frequency_title" : "Frequenz", - "edt_eff_min_len_title" : "Minimale Länge", - "edt_eff_max_len_title" : "Maximale Länge", - "edt_eff_height_title" : "Höhe", - "edt_eff_offset_title" : "Verschiebung", - "edt_eff_colorHour_title" : "Farbe Stunde", - "edt_eff_colorMinute_title" : "Farbe Minute", - "edt_eff_colorSecond_title" : "Farbe Sekunde", - "edt_eff_hourMargin_title" : "Länge Stunde", - "edt_eff_minuteMargin_title" : "Länge Minute", - "edt_eff_secondMargin_title" : "Länge Sekunde", - "edt_eff_margin_title" : "Abstand", - "edt_eff_colorMarker_title" : "Farbe Markierung", - "edt_append_ns" : "ns", - "edt_append_ms" : "ms", - "edt_append_s" : "s", - "edt_append_hz" : "Hz", - "edt_append_pixel" : "Pixel", - "edt_append_percent" : "%", - "edt_append_degree" : "°", - "edt_append_sdegree" : "s/grad", - "edt_append_leds" : "LEDs", - "edt_msg_error_notset" : "Attribut muss gesetzt sein", - "edt_msg_error_notempty" : "Eingabe benötigt", - "edt_msg_error_enum" : "Die Eingabe muss einem der aufgeführten Werte entsprechen", - "edt_msg_error_anyOf" : "Die Eingabe muss gegen mindestens eines der gegebenen Schemata validiert werden können", - "edt_msg_error_oneOf" : "Die Eingabe muss gegen genau eines der gegebenen Schemata validiert werden können. Momentan können $1 Schemata validiert werden", - "edt_msg_error_not" : "Die Eingabe darf nicht gegen das gegebene Schema validiert werden können", - "edt_msg_error_type_union" : "Die Eingabe muss einem der gegebenen Typen entsprechen", - "edt_msg_error_type" : "Die Eingabe muss vom Typ $1 sein", - "edt_msg_error_disallow_union" : "Die Eingabe darf nicht einem der gegebenen Werte entsprechen", - "edt_msg_error_disallow" : "Die Eingabe muss vom Typ $1 sein", - "edt_msg_error_multipleOf" : "Die Eingabe muss ein Vielfaches von $1 sein", - "edt_msg_error_maximum_excl" : "Der Wert muss kleiner als $1 sein", - "edt_msg_error_maximum_incl" : "Der Wert darf höchstens $1 sein", - "edt_msg_error_minimum_excl" : "Der Wert muss größer als $1 sein", - "edt_msg_error_minimum_incl" : "Der Wert muss mindestens $1 sein", - "edt_msg_error_maxLength" : "Die Eingabe darf höchstens $1 Zeichen lang sein", - "edt_msg_error_minLength" : "Die Eingabe muss mindestens $ Zeichen lang sein", - "edt_msg_error_pattern" : "Die Eingabe muss dem gegebenen Muster entsprechen", - "edt_msg_error_additionalItems" : "In diesem Feld sind keine weiteren Elemente erlaubt", - "edt_msg_error_maxItems" : "Das Feld darf höchstens $1 Element(e) beinhalten", - "edt_msg_error_minItems" : "Das Feld muss mindestens $1 Element(e) beinhalten", - "edt_msg_error_uniqueItems" : "Das Feld darf nur einzigartige Elemente beinhalten", - "edt_msg_error_maxProperties" : "Das Objekt darf höchstens $1 Attribute habe", - "edt_msg_error_minProperties" : "Das Objekt muss mindestens $1 Attribute haben", - "edt_msg_error_required" : "Das Objekt beinhaltet nicht das benötigte Attribut '$1'", - "edt_msg_error_additional_properties" : "Es sind keine weiteren Attribute erlaubt. $1 muss entfernt werden", - "edt_msg_error_dependency" : "Das Attribut $1 ist zwingend erforderlich", - "edt_msg_button_delete_all" : "Alle", - "edt_msg_button_delete_all_title" : "Alle löschen", - "edt_msg_button_delete_last" : "Letzes $1-Element", - "edt_msg_button_delete_last_title" : "Letzes $1-Element löschen", - "edt_msg_button_add_row_title" : "$1 Hinzufügen", - "edt_msg_button_move_down_title" : "Nach unten verschieben", - "edt_msg_button_move_up_title" : "Nach oben verschieben", - "edt_msg_button_delete_row_title" : "$1 Löschen", - "edt_msg_button_delete_row_title_short" : "Löschen", - "edt_msg_button_collapse" : "Einklappen", - "edt_msg_button_expand" : "Ausklappen" + "general_webui_title" : "Hyperion - Web Konfiguration", + "general_country_de" : "Deutschland", + "general_country_us" : "Amerika", + "general_country_uk" : "England", + "general_country_fr" : "Frankreich", + "general_country_es" : "Spanien", + "general_country_it" : "Italien", + "general_country_nl" : "Niederlande", + "general_speech_de" : "Deutsch", + "general_speech_en" : "Englisch", + "general_speech_es" : "Spanisch", + "general_access_default" : "Standard", + "general_access_advanced" : "Fortgeschritten", + "general_access_expert" : "Experte", + "general_comp_SMOOTHING" : "Glättung", + "general_comp_BLACKBORDER" : "Schwarze Balken Erkennung", + "general_comp_KODICHECKER" : "Kodi Überwachung", + "general_comp_FORWARDER" : "JSON/PROTO Weiterleitung", + "general_comp_UDPLISTENER" : "UDP Listener", + "general_comp_BOBLIGHTSERVER" : "Boblight Server", + "general_comp_GRABBER" : "Plattform Aufnahme", + "general_comp_V4L" : "USB Aufnahme", + "general_col_red" : "rot", + "general_col_green" : "grün", + "general_col_blue" : "blau", + "general_button_savesettings" : "Einstellungen speichern", + "general_btn_ok" : "OK", + "general_btn_cancel" : "Abbrechen", + "general_btn_continue" : "Fortfahren", + "general_btn_save" : "Speichern", + "general_btn_saverestart" : "Speichern und neustarten", + "general_btn_saveandreload" : "Speichern und neu laden", + "general_btn_restarthyperion" : "Hyperion neustarten", + "general_btn_off" : "Aus", + "general_btn_on" : "An", + "general_btn_next" : "Weiter", + "general_btn_back" : "Zurück", + "dashboard_label_intro" : "Das Dashboard zeigt dir Informationen zum Systemstatus, ob Updates verfügbar sind, den Komponentenstatus sowie die letzten Blog-Posts vom Hyperion Team.", + "dashboard_infobox_label_title" : "Information", + "dashboard_infobox_label_currenthyp" : "Deine Hyperion Version:", + "dashboard_infobox_label_latesthyp" : "Aktuellste Hyperion Version:", + "dashboard_infobox_label_platform" : "Plattform:", + "dashboard_infobox_label_instance" : "Instanz:", + "dashboard_infobox_label_ports" : "Ports (json|proto):", + "dashboard_infobox_message_updatewarning" : "Eine aktuellere Version von Hyperion ist verfügbar! (V$1)", + "dashboard_infobox_message_updatesuccess" : "Du nutzt die aktuellste Version von Hyperion.", + "dashboard_componentbox_label_title" : "Komponenten Status", + "dashboard_componentbox_label_comp" : "Komponente", + "dashboard_componentbox_label_status" : "Status", + "dashboard_newsbox_label_title" : "Hyperion-Blog", + "dashboard_newsbox_visitblog" : "Besuche den Hyperion-Blog", + "dashboard_newsbox_noconn" : "Fehler bei dem Versuch die letzten Blog-Posts zu laden, funtkioniert dein Internet?", + "dashboard_newsbox_readmore" : "Weiterlesen", + "dashboard_alert_message_confedit" : "Deine Hyperion Konfiguration wurde verändert. Um die Änderungen anzuwenden, starte Hyperion neu.", + "main_menu_dashboard_token" : "Dashboard", + "main_menu_configuration_token" : "Konfiguration", + "main_menu_general_conf_token" : "Allgemein", + "main_menu_leds_conf_token" : "LED Hardware", + "main_menu_grabber_conf_token" : "Aufnahme Hardware", + "main_menu_effect_conf_token" : "Effekte", + "main_menu_colors_conf_token" : "Bildverarbeitung", + "main_menu_kodiwatch_token" : "Kodi Überwachung", + "main_menu_network_conf_token" : "Netzwerk", + "main_menu_remotecontrol_token" : "Fernbedienung", + "main_menu_effectsconfigurator_token" : "Effekt Konfigurator", + "main_menu_support_token" : "Hilfe", + "main_menu_update_token" : "Update", + "main_menu_system_token" : "System", + "main_menu_input_selection_token" : "Eingabeauswahl", + "main_menu_logging_token" : "Protokoll", + "main_menu_webconfig_token" : "Web Konfiguration", + "main_menu_about_token" : "Über Hyperion", + "main_ledsim_title" : "LED Visualisierung", + "main_ledsim_text" : "Eine live Visualisierung deiner LED Farben, sofern verfügbar kann ein live Video dazugeschalten werden.", + "main_ledsim_btn_toggleleds" : "Zeige LEDs", + "main_ledsim_btn_togglelednumber" : "LED Nummern", + "main_ledsim_btn_togglelivevideo" : "Live Video", + "conf_general_label_title" : "Allgemeine Einstellungen", + "conf_general_intro" : "Grundsätzliche Einstellungen zu Hyperion oder WebUI, die in keine andere Kategorie passen.", + "conf_general_impexp_title" : "Importiere/Exportiere Konfiguration", + "conf_general_impexp_l1" : "Importiere eine bestehende Konfiguration, indem du unten eine Datei auswählst und anschließend auf \"Importieren\" klickst.", + "conf_general_impexp_l2" : "Exportiere eine Konfiguration, indem du auf \"Exportieren\" klickst. Dein Browser startet einen Download.", + "conf_general_impexp_impbtn" : "Importieren", + "conf_general_impexp_expbtn" : "Exportieren", + "conf_helptable_option" : "Option", + "conf_helptable_expl" : "Erklärung", + "conf_effect_path_intro" : "Definiere weitere Effekt-Pfade, wenn nötig.", + "conf_effect_fgeff_intro" : "Definiere einen Start Effekt/Farbe, dieser wird angezeigt, wenn Hyperion startet für die angegebene Dauer.", + "conf_effect_bgeff_intro" : "Definiere einen Hintergrund Effekt/Farbe, dieser wird aktiv, wenn Hyperion sich im Leerlauf befindet. (Das gilt ebenfalls für temporäres abschalten mithilfe der Kodi Überwachung).", + "conf_leds_device_intro" : "Wähle eine Methode zur Steuerung deiner LEDs aus, sie sind unterteilt in verschiedene Kategorien. Neben den allgemeinen Optionen die für alle gültig sind, gibt es auch spezfische die sich unterscheiden je nach Wahl.", + "conf_leds_layout_intro" : "Du benötigst ebenfalls ein LED Layout, welches deine LED-Positionen wiederspiegelt. Das klassische Layout wird für gewöhnlichen für TVs verwendet, Hyperion unterstützt aber auch LED Wände (Matrix). Die Ansicht des LAYOUTS ist die perspektive VOR dem Fernseher, nicht dahinter.", + "conf_leds_nav_label_ledcontroller" : "LED Steuerung", + "conf_leds_nav_label_ledlayout" : "LED Layout", + "conf_leds_contr_label_contrtype" : "Steuerungstyp:", + "conf_leds_optgroup_RPiSPI" : "RPi SPI", + "conf_leds_optgroup_RPiPWM" : "RPi PWM", + "conf_leds_optgroup_RPiGPIO" : "RPi GPIO", + "conf_leds_optgroup_network" : "Netzwerk", + "conf_leds_optgroup_usb" : "USB", + "conf_leds_optgroup_debug" : "Debug", + "conf_leds_layout_btn_checklist" : "Zeige Checkliste", + "conf_leds_layout_checkp1" : "Die schwarze eingefärbte LED ist die erste LED. Das ist der Punkt, an dem die Daten eingespeist werden.", + "conf_leds_layout_checkp2" : "Das Layout ist die Ansicht vor dem Fernseher stehend, nicht dahinter.", + "conf_leds_layout_checkp3" : "Stelle sicher, dass die Richtung richtig eingestellt ist, dazu ist die zweite und dritte LED grau markiert um den Datenfluss anzuzeigen.", + "conf_leds_layout_checkp4" : "Vorgang Lücke: Solltest du eine Lücke benötigen, ignoriere diese bei der LED Angabe Oben/Unten/Rechts/Links und gebe anschließend unter Lückenlänge an, wieviel LEDs du abziehen möchtest. Verändere jetzt die Lückenposition, um die Lücke an die richtige Stelle zu rücken.", + "conf_leds_layout_frame" : "Klassisches Layout (Rahmen)", + "conf_leds_layout_matrix" : "Matrix Layout (LED Wand)", + "conf_leds_layout_generatedconf" : "Generierte/Aktuelle LED Konfiguration", + "conf_leds_layout_button_savelay" : "Speichere Layout", + "conf_leds_layout_button_updsim" : "Aktualisiere Vorschau", + "conf_leds_layout_peview" : "LED Layout Vorschau", + "conf_leds_layout_advanced" : "Erweiterte Optionen", + "conf_leds_layout_preview_originCL" : "Erstellt von: Klassisches Layout (Rahmen)", + "conf_leds_layout_preview_originTEXT" : "Erstellt von: Textfeld", + "conf_leds_layout_preview_originMA" : "Erstellt von: Matrix Layout (LED Wand)", + "conf_leds_layout_preview_totalleds" : "LEDs gesamt: $1", + "conf_leds_layout_preview_ledpower" : "Max. Stromstärke: $1 A", + "conf_leds_layout_preview_l1" : "Das ist die erste LED (Einspeisung)", + "conf_leds_layout_preview_l2" : "Das visualisiert die Richtung des Datenstroms (zweite/dritte LED)", + "conf_leds_layout_cl_top" : "Oben", + "conf_leds_layout_cl_bottom" : "Unten", + "conf_leds_layout_cl_left" : "Links", + "conf_leds_layout_cl_right" : "Rechts", + "conf_leds_layout_cl_gaglength" : "Lückenlänge", + "conf_leds_layout_cl_gappos" : "Lückenposition", + "conf_leds_layout_cl_inppos" : "Einspeisepunkt", + "conf_leds_layout_cl_reversdir" : "Richtung umkehren", + "conf_leds_layout_cl_hleddepth" : "Horizontale LED Tiefe", + "conf_leds_layout_cl_vleddepth" : "Vertikale LED Tiefe", + "conf_leds_layout_cl_generate" : "Generiere LED Konfiguration", + "conf_leds_layout_cl_edgegap" : "Rahmenabstand", + "conf_leds_layout_cl_cornergap" : "Eckabstand", + "conf_leds_layout_cl_overlap" : "Überlappung", + "conf_leds_layout_ma_horiz" : "Horizontal", + "conf_leds_layout_ma_vert" : "Vertikal", + "conf_leds_layout_ma_cabling" : "Verkabelung", + "conf_leds_layout_ma_optsnake" : "Schlange", + "conf_leds_layout_ma_optparallel" : "Parallel", + "conf_leds_layout_ma_order" : "Reihenfolge", + "conf_leds_layout_ma_opthoriz" : "Horizontal", + "conf_leds_layout_ma_optvert" : "Vertikal", + "conf_leds_layout_ma_position" : "Einpeisepunkt", + "conf_leds_layout_ma_opttopleft" : "Oben links", + "conf_leds_layout_ma_opttopright" : "Oben rechts", + "conf_leds_layout_ma_optbottomleft" : "Unten links", + "conf_leds_layout_ma_optbottomright" : "Unten rechts", + "conf_leds_layout_textf1" : "Das Textfeld zeigt dir dein aktuell geladenes Layout, sofern du kein neues Layout mit den Optionen oben erstellt hast. Optional kann man die Werte hier weiter bearbeiten.", + "conf_grabber_fg_intro" : "Plattform Aufnahme ist das lokale System auf dem Hyperion installiert wurde, welches als Bildquelle dient.", + "conf_grabber_v4l_intro" : "USB Aufnahme ist ein Gerät, welches via USB angeschlossen ist und als Bildquelle dient.", + "conf_colors_color_intro" : "Erstelle Kalibrierungsprofile und passe Farben an, Helligkeit, Linearisierung und mehr.", + "conf_colors_smoothing_intro" : "Glätte den Farbverlauf und Helligkeitsänderungen um nicht von schnellen Übergängen abgelenkt zu werden.", + "conf_colors_blackborder_intro" : "Ignoriere schwarze Balken, jeder Modus nutzt einen anderen Algorithmus um diese zu erkennen. Erhöhe die Schwelle, sollte es nicht funktionieren.", + "conf_network_json_intro" : "Der JSON-RPC-Port dieser Hyperion-Instanz, wird genutzt zur Fernsteuerung.", + "conf_network_proto_intro" : "Der PROTO-Port dieser Hyperion-Instanz, wird genutzt für \"Bildstreams\" (HyperionScreenCap, Kodi Adddon, ...)", + "conf_network_bobl_intro" : "Boblight Empfänger", + "conf_network_udpl_intro" : "UDP Empfänger", + "conf_network_forw_intro" : "Leite alles an eine zweite Hyperion Instanz weiter, diese kann dann mit einer anderen LED Steuerung genutzt werden", + "conf_kodi_label_title" : "Kodi Überwachung", + "conf_kodi_intro" : "Die Kodi Überwachung ermöglicht es dir abhängig vom Kodi Status dein ambient light an oder abzuschalten. Dies ist nicht limitiert auf das selbe Gerät. Du kannst jedes Kodi in deinem lokalen Netzwerk überwachen lassen.", + "conf_logging_label_intro" : "Überprüfe die Meldungen im Prokotoll um zu erfahren was Hyperion gerade beschäftigt. Je nach eingestellter Protokoll-Stufe siehst du mehr oder weniger Informationen.", + "conf_logging_btn_pbupload" : "Bericht für Supportanfrage erstellen", + "conf_logging_btn_autoscroll" : "Automatisch scrollen", + "conf_logging_nomessage" : "Keine Einträge vorhanden.", + "conf_logging_uploading" : "Aufbereitung der Daten...", + "conf_logging_yourlink" : "Link zu deinem Bericht", + "conf_logging_uplfailed" : "Hochladen fehlgeschlagen! Überprüfe deine Internetverbindung!", + "conf_webconfig_label_intro" : "Einstellungen zur Webkonfiguration. Änderungen können die Erreichbarkeit des Webinterfaces beeinflussen.", + "remote_losthint" : "Notiz: Alle Änderungen gehen nach einem Neustart verloren.", + "remote_color_label" : "Farbe/Effekt", + "remote_color_intro" : "Setze einen Effekt oder eine Farbe. Auch deine selbst erstellten Effekte sind gelistet (sofern verfügbar). $1", + "remote_color_button_reset" : "Farbe/Effekt zurücksetzen", + "remote_color_label_color" : "Farbe:", + "remote_effects_label_effects" : "Effekt:", + "remote_adjustment_label" : "Farbanpassung", + "remote_adjustment_intro" : "Verändere live Farbe/Helligkeit/Linearisierung. $1", + "remote_input_label" : "Quellenauswahl", + "remote_input_intro" : "Hyperion nutzt ein Prioritätensystem um die Quelle zu wählen. Alles was du setzte hat eine Prioität (Effekte/Farben/Plattform Aufnahme/USB Aufnahme und Netzwerkquellen). Standardmäßig nutzt Hyperion die Quelle mit der niedrigsten Prioität. Hier kannst du aktiv Einfluss darauf nehmen. $1", + "remote_input_label_autoselect" : "Automatische Auswahl", + "remote_input_setsource_btn" : "Wähle Quelle", + "remote_input_sourceactiv_btn" : "Quelle aktiv", + "remote_input_origin" : "Ursprung", + "remote_input_owner" : "Typ", + "remote_input_priority" : "Priorität", + "remote_input_status" : "Status/Aktion", + "remote_input_duration" : "Dauer:", + "remote_input_ip" : "IP:", + "remote_components_label" : "Komponentensteuerung", + "remote_components_intro" : "Starte und stoppe Komponenten von Hyperion. $1", + "remote_optgroup_usreffets" : "Benutzer Effekte", + "remote_optgroup_syseffets" : "Mitgelieferte Effekte", + "remote_maptype_label" : "LED-Bereich Zuordnung", + "remote_maptype_intro" : "Wechsle zwischen verschiedenen Typen um die Auswirkungen besser vergleichen zu können. $1", + "remote_maptype_label_multicolor_mean" : "Mehrfarbig", + "remote_maptype_label_unicolor_mean" : "Einfarbig", + "effectsconfigurator_label_intro" : "Erstelle auf Grundlage der Basiseffekte neue Effekt die nach deinen Wünschen angepasst sind. Je nach Effekt stehen Optionen wie Farbe, Geschwindigkeit, oder Richtung und vieles mehr zur Auswahl.", + "effectsconfigurator_label_chooseeff" : "Basis-Effekt auswählen:", + "effectsconfigurator_button_saveeffect" : "Effekt speichern", + "effectsconfigurator_label_effectname" : "Effektname", + "effectsconfigurator_button_starttest" : "Starte Test", + "effectsconfigurator_button_stoptest" : "Stoppe Test", + "effectsconfigurator_button_conttest" : "Fortlaufender Test", + "effectsconfigurator_label_deleffect" : "Effekt entfernen:", + "effectsconfigurator_button_deleffect" : "Effekt entfernen", + "support_label_title" : "Unterstütze Hyperion", + "support_label_intro" : "Hyperion ist ein kostenloses Open Source Projekt und ein kleines Team arbeitet an seiner Weiterentwicklung. Darum benötigen wir DEINE Unterstützung um den Ball weiter rollen zu lassen und um weiter in bessere Infrastruktur und Weiterentwicklung investieren zu können.", + "support_label_spreadtheword" : "Weitersagen!", + "support_label_fbtext" : "Teile Inhalte in Facebook und halte dich und andere auf dem Laufenden", + "support_label_twtext" : "Nutze die 140 Zeichen und bleibe auf dem Laufenden auch auf Twitter", + "support_label_ggtext" : "Platziere uns in deinen Kreisen auf Google+", + "support_label_yttext" : "Gelangweilt von Bildern? Werfe einen Blick auf unsere Youtube Videos", + "support_label_donate" : "Spende oder nutze unsere Affiliate Links", + "support_label_affinstr1" : "Klicke auf den Link deines Landes", + "support_label_affinstr2" : "Kaufe wie gewohnt ein, abhängig von deinem Umsatz bekommen wir eine kleine Provision", + "support_label_affinstr3" : "Du zahlst immer den selben Preis. Teste es!", + "support_label_btctext" : "Adresse:", + "support_label_donationpp" : "Spende:", + "support_label_webrestitle" : "Informationsquellen und Hilfe", + "support_label_webpagetitle" : "Internetseite", + "support_label_webpagetext" : "Das Zuhause von Hyperion", + "support_label_wikititle" : "Wiki", + "support_label_wikitext" : "Von A bis Z - Alles wissenwerte zu Hyperion", + "support_label_forumtitle" : "Forum", + "support_label_forumtext" : "Diskussion und Hilfestellung von der Community", + "support_label_ghtext" : "Besuche uns auf Github", + "update_label_intro" : "Diese Seite zeigt dir alle verfügbaren Versionen von Hyperion, du kannst nach Belieben eine aktuellere Version installieren oder eine Ältere. Die aktuellsten Versionen befinden sich immer oben.", + "update_label_description" : "Beschreibung:", + "update_button_install" : "Installieren", + "update_button_changelog" : "Zeige Änderungsprotokoll", + "update_label_type" : "Art:", + "update_versreminder" : "Deine Version: $1", + "about_version" : "Version", + "about_build" : "Build", + "about_builddate" : "Build Datum", + "about_translations" : "Übersetzungen", + "about_resources" : "$1 Bibliotheken", + "about_contribute" : "Übersetze Hyperion in weitere Sprachen!", + "about_credits" : "Einen Dank an alle Entwickler!", + "info_conlost_label_title" : "Verbindung zum Hyperion Service unterbrochen!", + "info_conlost_label_reason" : "Mögliche Ursachen:", + "info_conlost_label_reason1" : "- Schlechte WLAN Verbindung", + "info_conlost_label_reason2" : "- Ein Update wird durchgeführt", + "info_conlost_label_reason3" : "- Hyperion wird nicht mehr ausgeführt", + "info_conlost_label_autorecon" : "Du wirst verbunden, sobald Hyperion wieder verfügbar ist.", + "info_conlost_label_autorefresh" : "Diese Seite wird automatisch aktualisiert.", + "info_conlost_label_reload" : "Automatisches verbinden gestoppt - limit überschritten. Lade die Seite neu oder klick mich.", + "info_restart_title" : "Startet gerade neu...", + "info_restart_rightback" : "Hyperion ist gleich wieder für dich da!", + "info_restart_contus" : "Solltest du nach 20 Sekunden immer noch hier sein, ist etwas schief gelaufen. Öffne bitte in unserem Support Forum ein neues Thema...", + "info_restart_contusa" : "...mit deinen letztes Schritten. Danke!", + "info_404" : "Die angeforderte Seite ist nicht verfügbar!", + "infoDialog_general_success_title" : "Erfolg", + "infoDialog_general_error_title" : "Fehler", + "infoDialog_general_warning_title" : "Warnung", + "infoDialog_checklist_title" : "Checkliste!", + "InfoDialog_leds_validfail_title" : "JSON Überprüfung fehlgeschlagen!", + "infoDialog_effconf_deleted_text" : "Der Effekt \"$1\" wurde erfolgreich entfernt!", + "infoDialog_effconf_created_text" : "Der Effekt \"$1\" wurde erfolgreich erstellt!", + "InfoDialog_lang_title" : "Spracheinstellung", + "InfoDialog_lang_text" : "Sollte dir die Vorauswahl der automatischen Spracherkennung nicht gefallen, kannst du die Sprache hier manuell festlegen.", + "InfoDialog_access_title" : "Einstellungsstufe", + "InfoDialog_access_text" : "Je höher die Stufe je mehr Einstellungen und Funktionen stehen zur Verfügung. Empfohlen ist \"Standard\".", + "InfoDialog_nowrite_title" : "Fehler beim Schreibzugriff!", + "InfoDialog_nowrite_text" : "Hyperion hat keinen Schreibzugriff auf die aktuell geladene Konfiguration. Bitte korrigiere die Dateizugriffsrechte um fortzufahren.", + "InfoDialog_nowrite_foottext" : "Die Webkonfiguration wird automatisch wieder freigegeben, sobald das Problem behoben wurde!", + "infoDialog_wizrgb_text" : "Deine RGB Byte Reihenfolge ist bereits richtig eingestellt.", + "infoDialog_writeconf_error_text" : "Das speichern der Konfiguration ist fehlgeschlagen.", + "infoDialog_import_jsonerror_text" : "Die ausgewählte Konfigurations-Datei \"$1\" ist keine .json Datei oder ist beschädigt! Fehlermeldung: ($2)", + "infoDialog_import_hyperror_text" : "Die ausgewählte Konfigurations-Datei \"$1\" kann nicht importiert werden. Sie ist nicht kompatibel mit Hyperion 2.0 und höher!", + "infoDialog_import_reverror_text" : "Die Version deiner Konfigurations-Datei \"$1\" stimmt nicht mit deiner Hyperion Version überein (Datei: $2, Hyperion: $3). Du kannst nur übereinstimmende Versionen importieren!", + "infoDialog_import_comperror_text" : "Dein Browser unterstützt leider keinen Import. Bitte versuche es mit einem anderen Browser erneut.", + "infoDialog_import_confirm_title" : "Bestätige Import", + "infoDialog_import_confirm_text" : "Bist du sicher, dass du die Konfigurations-Datei \"$1\" importieren möchtest? Diese Aktion kann nicht rückgängig gemacht werden!", + "wiz_rgb_title" : "RGB Byte Reihenfolge Assistent", + "wiz_rgb_intro1" : "Dieser Assisent wird dir dabei helfen die richtige Byte Reihenfolge für deine leds zu finden. Klicke auf Fortfahren um zu beginnen.", + "wiz_rgb_intro2" : "Wann benötigt man diesen Assistenten? Zur Erstkonfiguration oder wenn deine LEDs zb rot leuchten sollten, sie aber blau oder grün sind.", + "wiz_rgb_expl" : "Der Farbpunkt ändert alle x Sekunden die Farbe (rot, grün), zur selben Zeit ändern deine LEDs die Farbe ebenfalls. Beantworte die Fragen unten, um deine RGB Byte Reihenfolge zu überprüfen/korrigieren.", + "wiz_rgb_switchevery" : "Ändere Farbe alle...", + "wiz_rgb_q" : "Welche Farbe zeigen deine LEDs, wenn der Farbpunkt oben...", + "wiz_rgb_qrend" : "...rot ist?", + "wiz_rgb_qgend" : "...grün ist?", + "wiz_hue_title" : "Hue Bridge Assistent", + "wiz_hue_intro1" : "Mit diesem Setupassistenten kannst du einen neuen User auf der Hue Bridge anlegen und deine LightIDs für die Hyperion Konfiguration herausfinden.", + "wiz_hue_intro2" : "Beachte: Dies ist nur ein Assistent. Du musst die Daten in die Konfiguration kopieren.", + "wiz_hue_ip" : "Hue Bridge IP:", + "wiz_hue_username" : "Benutzername:", + "wiz_hue_create_user" : "Benutzer anlegen", + "wiz_hue_failure_ip" : "Bitte überprüfe deine IP Adresse.", + "wiz_hue_failure_connection" : "Connection Timeout. Bitte drücke die Taste rechtzeitig.", + "wiz_hue_press_link" : "Bitte \"Link\" Taste auf der Hue Bridge drücken.", + "wiz_cc_title" : "Farbkalibrierungs Assistent", + "wiz_cc_intro1" : "Der Assistent wird dich durch die Kalibrierung deiner LEDs leiten. Sofern du Kodi nutzt, können die Bilder und Testvideos direkt an Kodi geschickt werden. Andernfalls musst du das Material selbst herunterladen und anwenden.", + "wiz_cc_kwebs" : "Kodi Webserver (IP:Port)", + "wiz_cc_kodidiscon" : "Kodi Webserver nicht gefunden, fahre ohne Kodi-Unterstützung fort.", + "wiz_cc_kodidisconlink" : "Download Link Bilder:", + "wiz_cc_kodicon" : "Kodi Webserver gefunden, fahre mit Kodi-Unterstützung fort.", + "wiz_cc_kodimsg_start" : "Test bestanden - Zeit zu beginnen", + "wiz_cc_kodishould" : "Kodi sollte jetzt folgendes Bild anzeigen: $1", + "wiz_cc_lettvshow" : "Lass dabei deinen Fernseher folgendes Bild anzeigen: $1", + "wiz_cc_lettvshowm" : "Überprüfe dies mithilfe folgender Bildern: $1", + "wiz_cc_adjustit" : "Verändere dein \"$1\", bis du zufrieden bist. Beachte: Je mehr du reduzierst bzw von dem Standardwert abweichst, je mehr veränderst du den maximalen Farbraum, was alle Farben die daraus abgeleitet werden ebenfalls betrifft. Je nach TV/LED Farbspektrum sind die Ergebnisse unterschiedlich.", + "wiz_cc_adjustgamma" : "Gamma: Was du jetzt tun musst ist, jeden Gamma-Kanal so einstellen, dass der \"Grauverlauf\" auf den LEDs nicht grünlich/rötlich/bläulich aussieht. Beispiel: Sollte dein grau etwas rötlich sein bedeutet dies, dass du dein Gamma für Rot erhöhen musst um den Rot-Anteil zu verringern (Je mehr Gamma, desto weniger Farbe).", + "wiz_cc_chooseid" : "Wähle einen Namen für dieses Profil.", + "wiz_cc_btn_switchpic" : "Testbild ändern", + "wiz_cc_backlight" : "Zusätzlich kannst du eine Hintergrundbeluchtung einstellen, um \"irritierende Farben\" bei fast schwarzem Bild zu vermeiden oder du den Wechsel zwischen Farbe und Aus als zu anstrengend empfindest. Zusätzlich kann bestimmt werden, ob diese farbig oder nur weiß sein soll. Wird automatisch deaktiviert im Zustand \"Aus\" sowie bei \"Farbe\" und \"Effekt\".", + "wiz_cc_testintro" : "Nun ist es an der Zeit für einen Testlauf.", + "wiz_cc_testintrok" : "Klicke auf einen Button, um eines der Testvideos abzuspielen.", + "wiz_cc_testintrowok" : "Unter folgendem Link findest du ein paar Testvideos zum herunterladen und abspielen:", + "wiz_cc_link" : "Klick mich", + "wiz_cc_morethanone" : "Du hast mehr als 1 Profil, bitte wähle das zu kalibrierende Profil", + "wiz_cc_btn_stop" : "Stoppe Video", + "wiz_cc_summary" : "Im folgenden eine Zusammenfassung deiner Einstellungen. Während du ein Video abspielst, kannst du hier weiter ausprobieren. Wenn du fertig bist, klicke auf speichern.", + "edt_dev_enum_subtract_minimum" : "Subtrahiere minimum", + "edt_dev_enum_sub_min_warm_adjust" : "Minimale Anpassung: warm", + "edt_dev_enum_white_off" : "Weiß ist aus", + "edt_dev_general_heading_title" : "Allgemeine Einstellungen", + "edt_dev_general_ledCount_title" : "Anzahl Hardware LEDs", + "edt_dev_general_colorOrder_title" : "RGB Byte Reihenfolge", + "edt_dev_general_rewriteTime_title" : "Aktualisierungszeit", + "edt_dev_spec_header_title" : "Spezifische Einstellungen", + "edt_dev_spec_baudrate_title" : "Baudrate", + "edt_dev_spec_spipath_title" : "SPI Pfad", + "edt_dev_spec_invert_title" : "Invertiere Signal", + "edt_dev_spec_multicastGroup_title" : "Multicast Gruppe", + "edt_dev_spec_numberOfLeds_title" : "Anzahl der LEDs", + "edt_dev_spec_port_title" : "Port", + "edt_dev_spec_orbIds_title" : "Orb ID(s)", + "edt_dev_spec_useOrbSmoothing_title" : "Nutze Orb Glättung", + "edt_dev_spec_targetIp_title" : "Ziel IP", + "edt_dev_spec_targetIpHost_title" : "Ziel IP/hostname", + "edt_dev_spec_outputPath_title" : "Ausgabepfad", + "edt_dev_spec_delayAfterConnect_title" : "Verzögerung nach Verbindung", + "edt_dev_spec_FCsetConfig_title" : "Wende fadecandy Konfiguration an", + "edt_dev_spec_FCmanualControl_title" : "Manuelle Steuerung der fadecandy LEDs", + "edt_dev_spec_FCledToOn_title" : "Fadecandy LEDs set to on", + "edt_dev_spec_interpolation_title" : "Interpolation", + "edt_dev_spec_dithering_title" : "Dithering", + "edt_dev_spec_gamma_title" : "Gamma", + "edt_dev_spec_whitepoint_title" : "Weißpunkt", + "edt_dev_spec_username_title" : "Benutzername", + "edt_dev_spec_lightid_title" : "Lampen ID(s)", + "edt_dev_spec_lightid_itemtitle" : "ID", + "edt_dev_spec_transistionTime_title" : "Übergangszeit", + "edt_dev_spec_switchOffOnBlack_title" : "Aus bei schwarz", + "edt_dev_spec_uid_title" : "UID", + "edt_dev_spec_intervall_title" : "Intervall", + "edt_dev_spec_latchtime_title" : "Sperrzeit", + "edt_dev_spec_maxPacket_title" : "Paketgröße", + "edt_dev_spec_serial_title" : "Seriennummer", + "edt_dev_spec_vid_title" : "VID", + "edt_dev_spec_pid_title" : "PID", + "edt_dev_spec_cid_title" : "CID", + "edt_dev_spec_LBap102Mode_title" : "LightBerry APA102 Modus", + "edt_dev_spec_universe_title" : "Universum", + "edt_dev_spec_whiteLedAlgor_title" : "Weiß Algorithmus", + "edt_dev_spec_useRgbwProtocol_title" : "Nutze RGBW Protokoll", + "edt_dev_spec_maximumLedCount_title" : "Maximale Anzahl LEDs", + "edt_dev_spec_gpioNumber_title" : "GPIO Nummer", + "edt_dev_spec_gpioMap_title" : "GPIO Zuweisung", + "edt_dev_spec_PBFiFo_title" : "Pi-Blaster FiFo", + "edt_dev_spec_gpioBcm_title" : "GPIO Pin", + "edt_dev_spec_ledIndex_title" : "LED index", + "edt_dev_spec_colorComponent_title" : "Farbkomponente", + "edt_conf_general_enable_title" : "Aktiviert", + "edt_conf_general_enable_expl" : "Wenn aktiviert, ist die Komponente aktiv.", + "edt_conf_general_priority_title" : "Priorität", + "edt_conf_general_priority_expl" : "Die Priorität dieser Komponente.", + "edt_conf_general_port_title" : "Port", + "edt_conf_general_port_expl" : "Der genutzte Port.", + "edt_conf_enum_color" : "Farbe", + "edt_conf_enum_effect" : "Effekt", + "edt_conf_enum_multicolor_mean" : "Mehrfarbig", + "edt_conf_enum_unicolor_mean" : "Einfarbig", + "edt_conf_enum_rgb" : "RGB", + "edt_conf_enum_bgr" : "BGR", + "edt_conf_enum_rbg" : "RBG", + "edt_conf_enum_brg" : "BRG", + "edt_conf_enum_gbr" : "GBR", + "edt_conf_enum_grb" : "GRB", + "edt_conf_enum_linear" : "Linear", + "edt_conf_enum_PAL" : "PAL", + "edt_conf_enum_NTSC" : "NTSC", + "edt_conf_enum_logsilent" : "Stille", + "edt_conf_enum_logwarn" : "Warnung", + "edt_conf_enum_logverbose" : "Ausführlich", + "edt_conf_enum_logdebug" : "Debug", + "edt_conf_enum_bbdefault" : "Standard", + "edt_conf_enum_bbclassic" : "Klassisch", + "edt_conf_enum_bbosd" : "OSD", + "edt_conf_gen_heading_title" : "Allgemeine Einstellungen", + "edt_conf_gen_name_title" : "Name der Konfiguration", + "edt_conf_gen_name_expl" : "Der Name wird verwendet, um Hyperion besser zu identifizieren. (Hilfreich bei mehreren Instanzen)", + "edt_conf_gen_showOptHelp_title" : "Zeige Erklärungen", + "edt_conf_gen_showOptHelp_expl" : "Zeige alle verfügbaren Options-Erklärungen. Empfohlen für Anfänger", + "edt_conf_color_heading_title" : "Farbkalibrierung", + "edt_conf_color_channelAdjustment_header_title" : "Anpassung Farbkanäle", + "edt_conf_color_channelAdjustment_header_itemtitle" : "Profil", + "edt_conf_color_channelAdjustment_header_expl" : "Passe die Farbkanäle deinen LEDs an", + "edt_conf_color_imageToLedMappingType_title" : "LED-Bereich Zuordnungstyp", + "edt_conf_color_imageToLedMappingType_expl" : "Sofern nicht \"Mehrfarbig\", wird dein LED Layout mit einer anderen Bildzuweisung überschrieben", + "edt_conf_color_id_title" : "ID", + "edt_conf_color_id_expl" : "Eine vom Benutzer frei angegebene ID.", + "edt_conf_color_leds_title" : "LED index", + "edt_conf_color_leds_expl" : "Zugewiesen zu allen (*) LEDs oder nur zu bestimmten LED Nummern (0-17).", + "edt_conf_color_black_title" : "Schwarz", + "edt_conf_color_black_expl" : "Kalibrierter Schwarzwert.", + "edt_conf_color_white_title" : "Weiß", + "edt_conf_color_white_expl" : "Kalibrierter Weißwert.", + "edt_conf_color_red_title" : "Rot", + "edt_conf_color_red_expl" : "Kalibrierter Rotwert.", + "edt_conf_color_green_title" : "Grün", + "edt_conf_color_green_expl" : "Kalibrierter Grünwert.", + "edt_conf_color_blue_title" : "Blau", + "edt_conf_color_blue_expl" : "Kalibrierter Blauwert.", + "edt_conf_color_cyan_title" : "Cyan", + "edt_conf_color_cyan_expl" : "Kalibrierter Cyanwert.", + "edt_conf_color_magenta_title" : "Magenta", + "edt_conf_color_magenta_expl" : "Kalibrierter Magentawert.", + "edt_conf_color_yellow_title" : "Gelb", + "edt_conf_color_yellow_expl" : "Kalibrierter Gelbwert.", + "edt_conf_color_gammaRed_title" : "Gamma rot", + "edt_conf_color_gammaRed_expl" : "Gamma von rot.", + "edt_conf_color_gammaGreen_title" : "Gamma grün", + "edt_conf_color_gammaGreen_expl" : "Gamma von grün.", + "edt_conf_color_gammaBlue_title" : "Gamma blau", + "edt_conf_color_gammaBlue_expl" : "Gamma von blau", + "edt_conf_color_backlightThreshold_title" : "Hintergrund - beleuchtung", + "edt_conf_color_backlightThreshold_expl" : "Eine Beleuchtung die dauerhaft aktiv ist. (Automatisch deaktiviert bei Effekten, Farben oder im Zustand \"Aus\")", + "edt_conf_color_backlightColored_title" : "Farbige Hintergrund - beleuchtung", + "edt_conf_color_backlightColored_expl" : "Die Hintergrundbeleuchtung kann mit oder ohne Farbanteile genutzt werden.", + "edt_conf_color_brightness_title" : "Maximale Helligkeit", + "edt_conf_color_brightness_expl" : "Zwischen 0.0 und 0.5 ist die Helligkeit linearisiert. Von 0.5 bis 1.0 wird cyan, magenta und gelb bis zu 2x heller und weiß bis zu 3x.", + "edt_conf_smooth_heading_title" : "Glättung", + "edt_conf_smooth_type_title" : "Art", + "edt_conf_smooth_type_expl" : "Algorithmus der Glättung.", + "edt_conf_smooth_time_ms_title" : "Zeit", + "edt_conf_smooth_time_ms_expl" : "Wie lange soll die Glättung Bilder sammeln?", + "edt_conf_smooth_updateFrequency_title" : "Aktualisierungsfrequenz", + "edt_conf_smooth_updateFrequency_expl" : "Die Geschwindigkeit der Datenausgabe an die LED Steuerung.", + "edt_conf_smooth_updateDelay_title" : "Aktualisierungsverzögerung", + "edt_conf_smooth_updateDelay_expl" : "Verzögere die Ausgabe, sollte dein ambient light schneller sein als dein TV.", + "edt_conf_smooth_continuousOutput_title" : "Fortlaufende Ausgabe", + "edt_conf_smooth_continuousOutput_expl" : "Aktualisiere die LEDs, auch wenn das Bild sich nicht geändert hat.", + "edt_conf_v4l2_heading_title" : "USB Aufnahme", + "edt_conf_v4l2_device_title" : "Gerät", + "edt_conf_v4l2_device_expl" : "Der Pfad zum USB Aufnahmegerät.", + "edt_conf_v4l2_input_title" : "Eingang", + "edt_conf_v4l2_input_expl" : "Der Eingang des Pfades.", + "edt_conf_v4l2_standard_title" : "Videoformat", + "edt_conf_v4l2_standard_expl" : "Wähle das passende Videoformat deiner Region.", + "edt_conf_v4l2_width_title" : "Breite", + "edt_conf_v4l2_width_expl" : "Die Breite des Bildes. (-1 = Automatische Breitenbestimmung)", + "edt_conf_v4l2_height_title" : "Höhe", + "edt_conf_v4l2_height_expl" : "Die Höhes des Bildes. (-1 = Automatische Höhenbestimmung)", + "edt_conf_v4l2_frameDecimation_title" : "Bildverkleinerung", + "edt_conf_v4l2_frameDecimation_expl" : "Der Faktor der Bildverkleinerung", + "edt_conf_v4l2_sizeDecimation_title" : "Größenänderung", + "edt_conf_v4l2_sizeDecimation_expl" : "Der Faktor der Größenänderung", + "edt_conf_v4l2_mode_title" : "Modus", + "edt_conf_v4l2_mode_expl" : "Modus der USB Aufnahme", + "edt_conf_v4l2_useKodiChecker_title" : "Nutze Kodi Überwachung", + "edt_conf_v4l2_useKodiChecker_expl" : "Starte/Stoppe Aufnahme mithilfe der Kodi Überwachung.", + "edt_conf_v4l2_cropLeft_title" : "Entferne links", + "edt_conf_v4l2_cropLeft_expl" : "Anzahl der Pixel auf der linken Seite die vom Bild entfernt werden.", + "edt_conf_v4l2_cropRight_title" : "Entferne rechts", + "edt_conf_v4l2_cropRight_expl" : "Anzahl der Pixel auf der rechten Seite die vom Bild entfernt werden.", + "edt_conf_v4l2_cropTop_title" : "Entferne oben", + "edt_conf_v4l2_cropTop_expl" : "Anzahl der Pixel auf der oberen Seite die vom Bild entfernt werden.", + "edt_conf_v4l2_cropBottom_title" : "Entferne unten", + "edt_conf_v4l2_cropBottom_expl" : "Anzahl der Pixel auf der unteren Seite die vom Bild entfernt werden.", + "edt_conf_v4l2_redSignalThreshold_title" : "Rote Signalschwelle", + "edt_conf_v4l2_redSignalThreshold_expl" : "Verdunkelt rote Werte. (Wird als schwarz interpretiert)", + "edt_conf_v4l2_greenSignalThreshold_title" : "Grüne Signalschwelle", + "edt_conf_v4l2_greenSignalThreshold_expl" : "Verdunkelt grüne Werte. (Wird als schwarz interpretiert)", + "edt_conf_v4l2_blueSignalThreshold_title" : "Blaue Signalschwelle", + "edt_conf_v4l2_blueSignalThreshold_expl" : "Verdunkelt blaue Werte. (Wird als schwarz interpretiert))", + "edt_conf_fg_heading_title" : "Plattform Aufnahme", + "edt_conf_fg_type_title" : "Typ", + "edt_conf_fg_type_expl" : "Art der Plattform Aufnahme, standard ist 'auto'", + "edt_conf_fg_frequency_Hz_title" : "Aufnahmefrequenz", + "edt_conf_fg_frequency_Hz_expl" : "Wie schnell neue Bilder aufgenommen werden.", + "edt_conf_fg_horizontalPixelDecimation_title" : "Horizontale Pixelreduzierung", + "edt_conf_fg_horizontalPixelDecimation_expl" : "Horizontale Pixelreduzierung (Faktor)", + "edt_conf_fg_useXGetImage_title" : "Nutze XGetImage", + "edt_conf_fg_useXGetImage_expl" : "XGetImage für aktuelle X11 desktops", + "edt_conf_fg_width_title" : "Breite", + "edt_conf_fg_width_expl" : "Verkleinere Bild auf dieser Breite, da das Rohmaterial viel Leistung benötigen würde.", + "edt_conf_fg_height_title" : "Höhe", + "edt_conf_fg_height_expl" : "Verkleinere Bild auf dieser Höhe, da das Rohmaterial viel Leistung benötigen würde.", + "edt_conf_fg_verticalPixelDecimation_title" : "Vertikale Pixelreduzierung", + "edt_conf_fg_verticalPixelDecimation_expl" : "Vertikale Pixelreduzierung (Faktor)", + "edt_conf_fg_device_title" : "Device", + "edt_conf_fg_display_title" : "Display", + "edt_conf_fg_display_expl" : "Gebe an von welchem Desktop aufgenommen werden soll. (Multi Monitor Setup)", + "edt_conf_bb_heading_title" : "Schwarze Balken Erkennung", + "edt_conf_bb_threshold_title" : "Schwelle", + "edt_conf_bb_threshold_expl" : "Wenn die Erkennung nicht funktioniert, erhöhe die Schwelle um auf 'graues' schwarz zu reagieren.", + "edt_conf_bb_unknownFrameCnt_title" : "unknownFrameCnt", + "edt_conf_bb_borderFrameCnt_title" : "borderFrameCnt", + "edt_conf_bb_maxInconsistentCnt_title" : "maxInconsistentCn", + "edt_conf_bb_blurRemoveCnt_title" : "blurRemoveCnt", + "edt_conf_bb_mode_title" : "Modus", + "edt_conf_bb_mode_expl" : "Algorithmus zur Auswertung. (siehe Wiki)", + "edt_conf_kodic_heading_title" : "Kodi Überwachung", + "edt_conf_kodic_kodiAddress_title" : "Kodi IP Adresse", + "edt_conf_kodic_kodiAddress_expl" : "Die IP Adresse von Kodi.", + "edt_conf_kodic_kodiTcpPort_title" : "Kodi TCP Port", + "edt_conf_kodic_kodiTcpPort_expl" : "Der Kodi TCP Port. Nutze nicht den Webserver Port!", + "edt_conf_kodic_grabVideo_title" : "Video", + "edt_conf_kodic_grabVideo_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während ein Video abgespielt werden.", + "edt_conf_kodic_grabPictures_title" : "Bilder", + "edt_conf_kodic_grabPictures_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während Bilder angezeigt werden.", + "edt_conf_kodic_grabAudio_title" : "Audio", + "edt_conf_kodic_grabAudio_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während Musik abgespielt wird.", + "edt_conf_kodic_grabMenu_title" : "Menü", + "edt_conf_kodic_grabMenu_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während du dich im Kodi Menü oder Nutzerauswahl befindest.", + "edt_conf_kodic_grabPause_title" : "Pause", + "edt_conf_kodic_grabPause_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während Kodi pausiert (Video, Musik, Diashow).", + "edt_conf_kodic_grabScreensaver_title" : "Bildschirmschoner", + "edt_conf_kodic_grabScreensaver_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während Kodi pausiert (Video, Musik, Diashow).", + "edt_conf_kodic_enable3DDetection_title" : "Erkenne 3D", + "edt_conf_kodic_enable3DDetection_expl" : "Wenn aktiviert, erkenne und wende den passenden 3D Modus an. (kein MVC und nicht für USB Aufnahme)", + "edt_conf_fge_heading_title" : "Start Effekt/Farbe", + "edt_conf_fge_type_title" : "Typ", + "edt_conf_fge_type_expl" : "Wähle zwischen einem Effekt oder einer Farbe.", + "edt_conf_fge_color_title" : "Farbe", + "edt_conf_fge_color_expl" : "Sofern der Typ \"Farbe\" ist, stelle hier eine Farbe deiner Wahl sein.", + "edt_conf_fge_effect_title" : "Effekt", + "edt_conf_fge_effect_expl" : "Sofern der Typ \"Effekt\" ist, wähle hier einen Effekt deiner Wahl. (Gilt auch für selbst erstellte)", + "edt_conf_fge_duration_ms_title" : "Dauer", + "edt_conf_fge_duration_ms_expl" : "Dauer des Effekts/Farbe beim Hyperion Start.", + "edt_conf_bge_heading_title" : "Hintergrund Effekt/Farbe", + "edt_conf_fw_heading_title" : "Weiterleitung", + "edt_conf_fw_json_title" : "Liste von Json zielen", + "edt_conf_fw_json_expl" : "Ein Json Ziel pro Zeile. Bestehend aus IP:PORT (Beispiel: 127.0.0.1:19446)", + "edt_conf_fw_json_itemtitle" : "Json Ziel", + "edt_conf_fw_proto_title" : "Liste von Proto zielen", + "edt_conf_fw_proto_expl" : "Ein Proto Ziel pro Zeile. Bestehend aus IP:PORT (Beispiel: 127.0.0.1:19447)", + "edt_conf_fw_proto_itemtitle" : "Proto Ziel", + "edt_conf_js_heading_title" : "JSON Server", + "edt_conf_ps_heading_title" : "PROTO Server", + "edt_conf_bobls_heading_title" : "Boblight Server", + "edt_conf_udpl_heading_title" : "UDP Listener", + "edt_conf_udpl_address_title" : "Adresse", + "edt_conf_udpl_address_expl" : "Die Adresse auf der UDP Pakete akzeptiert werden.", + "edt_conf_udpl_timeout_title" : "Zeitüberschreitung", + "edt_conf_udpl_timeout_expl" : "Wenn für die angegeben Zeit keine UDP Pakete empfangen werden, wird die Komponente (vorübergehend) deaktiviert", + "edt_conf_udpl_shared_title" : "Gemeinsam genutzt", + "edt_conf_udpl_shared_expl" : "Wird gemeinsam über alle Hyperion Instanzen genutzt.", + "edt_conf_webc_heading_title" : "Web Konfiguration", + "edt_conf_webc_docroot_title" : "Verzeichnis", + "edt_conf_webc_docroot_expl" : "Lokaler Pfad zum WebUI Wurzelverzeichnis (Nur für WebUI Entwickler)", + "edt_conf_effp_heading_title" : "Effekt Pfade", + "edt_conf_effp_paths_title" : "Effekt Pfad(e)", + "edt_conf_effp_paths_expl" : "Es können mehrere Ordner definiert werden die Effekte enthalten. Der Effekt Konfigurator speichert immer im Ersten Ordner.", + "edt_conf_effp_paths_itemtitle" : "Pfad", + "edt_conf_effp_disable_title" : "Deaktivierte Effekte", + "edt_conf_effp_disable_itemtitle" : "Effekt", + "edt_conf_log_heading_title" : "Protokoll", + "edt_conf_log_level_title" : "Protokollstufe", + "edt_conf_log_level_expl" : "Abhängig der Stufe sind weniger oder mehr Meldungen sichtbar.", + "edt_eff_candle_header_title" : "Kerze", + "edt_eff_police_header_title" : "Polizei", + "edt_eff_fade_header_title" : "Farbübergang", + "edt_eff_rainbowmood_header_title" : "Regenbogen", + "edt_eff_knightrider_header_title" : "Knight Rider", + "edt_eff_lightclock_header_title" : "Uhr 1", + "edt_eff_clock_header_title" : "Uhr 2", + "edt_eff_pacman_header_title" : "Pac-Man", + "edt_eff_moodblobs_header_title" : "Stimmungskugeln", + "edt_eff_rainbowswirl_header_title" : "Regenbogenwirbel", + "edt_eff_random_header_title" : "Zufällig", + "edt_eff_runningdots_header_title" : "Rennende Punkte", + "edt_eff_systemshutdown_header_title" : "Herunterfahren", + "edt_eff_snake_header_title" : "Schlange", + "edt_eff_sparks_header_title" : "Funken", + "edt_eff_storbe_header_title" : "Stroboskop", + "edt_eff_traces_header_title" : "Farbspuren", + "edt_eff_x-mas_header_title" : "Weihnachten", + "edt_eff_trails_header_title" : "Spuren", + "edt_eff_enum_all" : "Alle", + "edt_eff_enum_all-together" : "Alle zusammen", + "edt_eff_enum_list" : "LED Liste", + "edt_eff_count_title" : "Anzahl", + "edt_eff_color_title" : "Farbe", + "edt_eff_colorrandom_title" : "Zufällige Farbe", + "edt_eff_colorone_title" : "Farbe eins", + "edt_eff_colortwo_title" : "Farbe zwei", + "edt_eff_colorcount_title" : "Farblänge", + "edt_eff_rotationtime_title" : "Rotationszeit", + "edt_eff_sleeptime_title" : "Schlafzeit", + "edt_eff_reversedirection_title" : "Richtung umkehren", + "edt_eff_fadetime_title" : "Übergangszeit", + "edt_eff_colorstart_title" : "Farbe Start", + "edt_eff_colorend_title" : "Farbe Ende", + "edt_eff_colorshift_title" : "Farbverschiebung", + "edt_eff_whichleds_title" : "Welche LEDs", + "edt_eff_ledlist_title" : "LED Liste", + "edt_eff_speed_title" : "Geschwindigkeit", + "edt_eff_fadefactor_title" : "Verblass Faktor", + "edt_eff_showseconds_title" : "Zeige Sekunden", + "edt_eff_blobcount_title" : "Kugelanzahl", + "edt_eff_huechange_title" : "Farbänderung", + "edt_eff_basecolorchange_title" : "Basisfarben verändern", + "edt_eff_basecolorchangerate_title" : "BF Geschwindigkeit", + "edt_eff_basecolorrangeleft_title" : "BF Bereich links", + "edt_eff_basecolorrangeright_title" : "BF Bereich rechts", + "edt_eff_brightness_title" : "Helligkeit", + "edt_eff_centerx_title" : "Mittelpunkt X-Achse", + "edt_eff_centery_title" : "Mittelpunkt Y-Achse", + "edt_eff_saturation_title" : "Sättigung", + "edt_eff_colorevel_title" : "Farbstufe", + "edt_eff_whitelevel_title" : "Weißstufe", + "edt_eff_alarmcolor_title" : "Alarm Farbe", + "edt_eff_postcolor_title" : "Startfarbe", + "edt_eff_enableshutdown_title" : "Echtes herunterfahren", + "edt_eff_length_title" : "Länge", + "edt_eff_frequency_title" : "Frequenz", + "edt_eff_min_len_title" : "Minimale Länge", + "edt_eff_max_len_title" : "Maximale Länge", + "edt_eff_height_title" : "Höhe", + "edt_eff_offset_title" : "Verschiebung", + "edt_eff_colorHour_title" : "Farbe Stunde", + "edt_eff_colorMinute_title" : "Farbe Minute", + "edt_eff_colorSecond_title" : "Farbe Sekunde", + "edt_eff_hourMargin_title" : "Länge Stunde", + "edt_eff_minuteMargin_title" : "Länge Minute", + "edt_eff_secondMargin_title" : "Länge Sekunde", + "edt_eff_margin_title" : "Abstand", + "edt_eff_colorMarker_title" : "Farbe Markierung", + "edt_append_ns" : "ns", + "edt_append_ms" : "ms", + "edt_append_s" : "s", + "edt_append_hz" : "Hz", + "edt_append_pixel" : "Pixel", + "edt_append_percent" : "%", + "edt_append_degree" : "°", + "edt_append_sdegree" : "s/grad", + "edt_append_leds" : "LEDs", + "edt_msg_error_notset" : "Attribut muss gesetzt sein", + "edt_msg_error_notempty" : "Eingabe benötigt", + "edt_msg_error_enum" : "Die Eingabe muss einem der aufgeführten Werte entsprechen", + "edt_msg_error_anyOf" : "Die Eingabe muss gegen mindestens eines der gegebenen Schemata validiert werden können", + "edt_msg_error_oneOf" : "Die Eingabe muss gegen genau eines der gegebenen Schemata validiert werden können. Momentan können $1 Schemata validiert werden", + "edt_msg_error_not" : "Die Eingabe darf nicht gegen das gegebene Schema validiert werden können", + "edt_msg_error_type_union" : "Die Eingabe muss einem der gegebenen Typen entsprechen", + "edt_msg_error_type" : "Die Eingabe muss vom Typ $1 sein", + "edt_msg_error_disallow_union" : "Die Eingabe darf nicht einem der gegebenen Werte entsprechen", + "edt_msg_error_disallow" : "Die Eingabe muss vom Typ $1 sein", + "edt_msg_error_multipleOf" : "Die Eingabe muss ein Vielfaches von $1 sein", + "edt_msg_error_maximum_excl" : "Der Wert muss kleiner als $1 sein", + "edt_msg_error_maximum_incl" : "Der Wert darf höchstens $1 sein", + "edt_msg_error_minimum_excl" : "Der Wert muss größer als $1 sein", + "edt_msg_error_minimum_incl" : "Der Wert muss mindestens $1 sein", + "edt_msg_error_maxLength" : "Die Eingabe darf höchstens $1 Zeichen lang sein", + "edt_msg_error_minLength" : "Die Eingabe muss mindestens $ Zeichen lang sein", + "edt_msg_error_pattern" : "Die Eingabe muss dem gegebenen Muster entsprechen", + "edt_msg_error_additionalItems" : "In diesem Feld sind keine weiteren Elemente erlaubt", + "edt_msg_error_maxItems" : "Das Feld darf höchstens $1 Element(e) beinhalten", + "edt_msg_error_minItems" : "Das Feld muss mindestens $1 Element(e) beinhalten", + "edt_msg_error_uniqueItems" : "Das Feld darf nur einzigartige Elemente beinhalten", + "edt_msg_error_maxProperties" : "Das Objekt darf höchstens $1 Attribute habe", + "edt_msg_error_minProperties" : "Das Objekt muss mindestens $1 Attribute haben", + "edt_msg_error_required" : "Das Objekt beinhaltet nicht das benötigte Attribut '$1'", + "edt_msg_error_additional_properties" : "Es sind keine weiteren Attribute erlaubt. $1 muss entfernt werden", + "edt_msg_error_dependency" : "Das Attribut $1 ist zwingend erforderlich", + "edt_msg_button_delete_all" : "Alle", + "edt_msg_button_delete_all_title" : "Alle löschen", + "edt_msg_button_delete_last" : "Letzes $1-Element", + "edt_msg_button_delete_last_title" : "Letzes $1-Element löschen", + "edt_msg_button_add_row_title" : "$1 Hinzufügen", + "edt_msg_button_move_down_title" : "Nach unten verschieben", + "edt_msg_button_move_up_title" : "Nach oben verschieben", + "edt_msg_button_delete_row_title" : "$1 Löschen", + "edt_msg_button_delete_row_title_short" : "Löschen", + "edt_msg_button_collapse" : "Einklappen", + "edt_msg_button_expand" : "Ausklappen" } diff --git a/assets/webconfig/i18n/en.json b/assets/webconfig/i18n/en.json index 24a26ea1..e3bad5fd 100644 --- a/assets/webconfig/i18n/en.json +++ b/assets/webconfig/i18n/en.json @@ -1,677 +1,679 @@ { - "@metadata": { - "authors": [ - "brindosch" - ], - "project" : "Hyperion WebUI", - "locale": "en", - "last-updated": "2016-11-30", - "message-documentation": "qqq.json" - }, - "general_webui_title" : "Hyperion - Web Configuration", - "general_country_de" : "Germany", - "general_country_us" : "United States", - "general_country_uk" : "United Kingdom", - "general_country_fr" : "France", - "general_country_es" : "Spain", - "general_country_it" : "Italy", - "general_country_nl" : "Netherlands", - "general_speech_de" : "German", - "general_speech_en" : "English", - "general_speech_es" : "Spanish", - "general_access_default" : "Default", - "general_access_advanced" : "Advanced", - "general_access_expert" : "Expert", - "general_comp_SMOOTHING" : "Smoothing", - "general_comp_BLACKBORDER" : "Blackbar Detection", - "general_comp_KODICHECKER" : "Kodi Watch", - "general_comp_FORWARDER" : "JSON/PROTO Forward", - "general_comp_UDPLISTENER" : "UDP Listener", - "general_comp_BOBLIGHTSERVER" : "Boblight Server", - "general_comp_GRABBER" : "Platform Capture", - "general_comp_V4L" : "USB Capture", - "general_col_red" : "red", - "general_col_green" : "green", - "general_col_blue" : "blue", - "general_button_savesettings" : "Save settings", - "general_btn_ok" : "OK", - "general_btn_cancel" : "Cancel", - "general_btn_continue" : "Continue", - "general_btn_save" : "Save", - "general_btn_saverestart" : "Save and restart", - "general_btn_saveandreload" : "Save and reload", - "general_btn_restarthyperion" : "Restart Hyperion", - "general_btn_off" : "Off", - "general_btn_on" : "On", - "general_btn_next" : "Next", - "general_btn_back" : "Back", - "dashboard_label_intro" : "The dashboard give you a quick overview about the status of Hyperion and show you the latest news of the Hyperion Blog.", - "dashboard_infobox_label_title" : "Information", - "dashboard_infobox_label_currenthyp" : "Your Hyperion version:", - "dashboard_infobox_label_latesthyp" : "Latest Hyperion version:", - "dashboard_infobox_label_device" : "System:", - "dashboard_infobox_message_updatewarning" : "A newer version of Hyperion is available! (V$1)", - "dashboard_infobox_message_updatesuccess" : "You run the latest version of Hyperion.", - "dashboard_componentbox_label_title" : "Components status", - "dashboard_componentbox_label_comp" : "Component", - "dashboard_componentbox_label_status" : "Status", - "dashboard_newsbox_label_title" : "Latest Blog posts", - "dashboard_alert_message_confedit" : "Your Hyperion configuration has been modified. To apply it, restart Hyperion.", - "main_menu_dashboard_token" : "Dashboard", - "main_menu_configuration_token" : "Configuration", - "main_menu_general_conf_token" : "General", - "main_menu_leds_conf_token" : "LED Hardware", - "main_menu_grabber_conf_token" : "Capturing Hardware", - "main_menu_effect_conf_token" : "Effects", - "main_menu_colors_conf_token" : "Image Processing", - "main_menu_kodiwatch_token" : "Kodi Watch", - "main_menu_network_conf_token" : "Network Services", - "main_menu_remotecontrol_token" : "Remote Control", - "main_menu_effectsconfigurator_token" : "Effects Configurator", - "main_menu_support_token" : "Support", - "main_menu_update_token" : "Update", - "main_menu_system_token" : "System", - "main_menu_input_selection_token" : "Input Selection", - "main_menu_logging_token" : "Log", - "main_menu_webconfig_token" : "Web configuration", - "main_menu_about_token" : "About Hyperion", - "main_ledsim_title" : "LED Visualization", - "main_ledsim_text" : "Live visualization of led colors and optional the current video stream of your capture device.", - "main_ledsim_btn_toggleleds" : "Show LEDs", - "main_ledsim_btn_togglelednumber" : "LED numbers", - "main_ledsim_btn_togglelivevideo" : "Live video", - "conf_general_label_title" : "General settings", - "conf_general_intro" : "Basic settings around Hyperion and WebUI that don't fit into another category.", - "conf_general_impexp_title" : "Import/Export Configuration", - "conf_general_impexp_l1" : "Import a configuration by selecting a configuration file below and click on \"Import\".", - "conf_general_impexp_l2" : "Export a configuration by clicking on \"Export\". Your browser starts a download.", - "conf_general_impexp_impbtn" : "Import", - "conf_general_impexp_expbtn" : "Export", - "conf_helptable_option" : "Option", - "conf_helptable_expl" : "Explanation", - "conf_effect_path_intro" : "Define more effect paths if necessary.", - "conf_effect_fgeff_intro" : "Define a booteffect or color, which is shown during Hyperion startup for the defined duration.", - "conf_effect_bgeff_intro" : "Define a background effect, which us shown during \"idle\". (also temporarily via Kodi Watch)", - "conf_leds_device_intro" : "Hyperion supports a lot of controllers to transmit data to your target device. Select a LED controller out of the sorted list and configure it. We have chosen the best default settings for each device.", - "conf_leds_layout_intro" : "You need also a led layout, which reflects your led positions. The classic layout is the usual used tv frame, but we also support led matrix (led walls) creation. The view on this layout is ALWAYS of the FRONT of your TV.", - "conf_leds_nav_label_ledcontroller" : "LED Controller", - "conf_leds_nav_label_ledlayout" : "LED Layout", - "conf_leds_contr_label_contrtype" : "Controller type:", - "conf_leds_optgroup_RPiSPI" : "RPi SPI", - "conf_leds_optgroup_RPiPWM" : "RPi PWM", - "conf_leds_optgroup_RPiGPIO" : "RPi GPIO", - "conf_leds_optgroup_network" : "Network", - "conf_leds_optgroup_usb" : "USB", - "conf_leds_optgroup_debug" : "Debug", - "conf_leds_layout_btn_checklist" : "Show checklist", - "conf_leds_layout_checkp1" : "The black led is your first led, the first led is the point where you input your data signal.", - "conf_leds_layout_checkp2" : "The layout is always the front view of your TV, never the back view.", - "conf_leds_layout_checkp3" : "Make sure the direction is right. The grey leds indicate led number 2 and 3 to visualize the data direction.", - "conf_leds_layout_checkp4" : "Case Gap: To create a gap, ignore it first when you define Top/Bottom/Left/Right and set afterwards your gap length to remove a amount of leds. Modify the gap position until it matches.", - "conf_leds_layout_frame" : "Classic Layout (LED Frame)", - "conf_leds_layout_matrix" : "Matrix Layout (LED Wall)", - "conf_leds_layout_generatedconf" : "Generated/Current LED Configuration", - "conf_leds_layout_button_savelay" : "Save Layout", - "conf_leds_layout_button_updsim" : "Update Preview", - "conf_leds_layout_peview" : "LED Layout Preview", - "conf_leds_layout_advanced" : "Advanced Settings", - "conf_leds_layout_preview_originCL" : "Created from: Classic Layout (LED Frame)", - "conf_leds_layout_preview_originTEXT" : "Created from: Textfield", - "conf_leds_layout_preview_originMA" : "Created from: Matrix Layout(LED wall)", - "conf_leds_layout_preview_totalleds" : "Amount of LEDs: $1", - "conf_leds_layout_preview_ledpower" : "Max. power consumption: $1 A", - "conf_leds_layout_preview_l1" : "This is your first led (input position)", - "conf_leds_layout_preview_l2" : "This visualizes the data direction (second/third led)", - "conf_leds_layout_cl_top" : "Top", - "conf_leds_layout_cl_bottom" : "Bottom", - "conf_leds_layout_cl_left" : "Left", - "conf_leds_layout_cl_right" : "Right", - "conf_leds_layout_cl_gaglength" : "Gap length", - "conf_leds_layout_cl_gappos" : "gap position", - "conf_leds_layout_cl_inppos" : "Input position", - "conf_leds_layout_cl_reversdir" : "Reverse direction", - "conf_leds_layout_cl_hleddepth" : "Horizontal LED depth", - "conf_leds_layout_cl_vleddepth" : "Vertical LED depth", - "conf_leds_layout_cl_generate" : "Generate LED configuration", - "conf_leds_layout_cl_edgegap" : "Edge Gap", - "conf_leds_layout_cl_cornergap" : "Corner Gap", - "conf_leds_layout_cl_overlap" : "Overlap", - "conf_leds_layout_ma_horiz" : "Horizontal", - "conf_leds_layout_ma_vert" : "Vertical", - "conf_leds_layout_ma_cabling" : "Cabling", - "conf_leds_layout_ma_optsnake" : "Snake", - "conf_leds_layout_ma_optparallel" : "Parallel", - "conf_leds_layout_ma_order" : "Order", - "conf_leds_layout_ma_opthoriz" : "Horizontal", - "conf_leds_layout_ma_optvert" : "Vertical", - "conf_leds_layout_ma_position" : "Input", - "conf_leds_layout_ma_opttopleft" : "Top Left", - "conf_leds_layout_ma_opttopright" : "Top right", - "conf_leds_layout_ma_optbottomleft" : "Bottom left", - "conf_leds_layout_ma_optbottomright" : "Bottom right", - "conf_leds_layout_textf1" : "This textfield shows by default your current loaded layout and will be overwritten if you generate a new one with the options below. Optional you could perform further edits.", - "conf_grabber_fg_intro" : "Platforum capture is your local system capture as input source, Hyperion is installed on.", - "conf_grabber_v4l_intro" : "USB capture is a (capture)device connected via USB which is used to input source pictures for processing.", - "conf_colors_color_intro" : "Create one or more calibration profiles, adjust each color, brightness, linearization and more.", - "conf_colors_smoothing_intro" : "Smoothing flattens color/brightness changes to reduce annoying distraction.", - "conf_colors_blackborder_intro" : "Skip black bars wherever they are. Each mode use another detection algorithm which is tuned for special situations. Higher the threshold if it doesn't work for you.", - "conf_network_json_intro" : "The JSON-RPC-Port of this Hyperion instance, used for remote control.", - "conf_network_proto_intro" : "The PROTO-Port of this Hyperion instance, used for picture streams (HyperionScreenCap, Kodi Adddon, ...)", - "conf_network_bobl_intro" : "Receiver for Boblight", - "conf_network_udpl_intro" : "Receiver for UDP", - "conf_network_forw_intro" : "Forward all input to a second Hyperion instance which could be driven with another led controller", - "conf_kodi_label_title" : "Kodi Watch", - "conf_kodi_intro" : "The Kodi Watcher enables you to enable and disable the screencapture depending on Kodi state. This is not limited to the same machine, you could observe also a Kodi on any other device at your network.", - "conf_logging_label_intro" : "Area to check log messages, depending on loglevel setting you see more or less information.", - "conf_logging_btn_pbupload" : "Create report for support request", - "conf_logging_btn_autoscroll" : "Auto scrolling", - "conf_logging_nomessage" : "No log messages available.", - "conf_logging_uploading" : "Prepare data...", - "conf_logging_yourlink" : "Link to your report", - "conf_logging_uplfailed" : "Upload failed! Please check your internet connection!", - "conf_webconfig_label_intro" : "Webconfiguration settings. Edit wisely.", - "remote_losthint" : "Note: All changes are lost after a restart.", - "remote_color_label" : "Colors/Effects", - "remote_color_intro" : "Set an effect or color. Also your self created effects are listed (if available). $1", - "remote_color_button_reset" : "Reset Color/Effect", - "remote_color_label_color" : "Color:", - "remote_effects_label_effects" : "Effect:", - "remote_adjustment_label" : "Color adjustment", - "remote_adjustment_intro" : "Modifiy color/brightness/linearization during runtime. $1", - "remote_input_label" : "Source Selection", - "remote_input_intro" : "Hyperion uses a priority system to select a source. Everything you set has a priority (Effect/Color/Platform capture/USB capture and network sources). By default, Hyperion select sources depending on priority (lowest number reflects the current active source). Now you have the opportunity to select sources on your own. $1", - "remote_input_label_autoselect" : "Auto Selection", - "remote_input_setsource_btn" : "Select Input", - "remote_input_sourceactiv_btn" : "Input active", - "remote_input_origin" : "Origin", - "remote_input_owner" : "Type", - "remote_input_priority" : "Priority", - "remote_input_status" : "Status/Action", - "remote_input_duration" : "Duration:", - "remote_input_ip" : "IP:", - "remote_components_label" : "Components control", - "remote_components_intro" : "Enable and disable components of Hyperion during runtime. $1", - "remote_optgroup_usreffets" : "User Effects", - "remote_optgroup_syseffets" : "Provided Effects", - "remote_maptype_label" : "Mapping type", - "remote_maptype_intro" : "Change the mapping type during runtime. $1", - "remote_maptype_label_multicolor_mean" : "Multicolor", - "remote_maptype_label_unicolor_mean" : "Unicolor", - "effectsconfigurator_label_intro" : "Create out of the base effects new effects that are tuned to your liking. Depending on Effect there are options like color, speed, direction and more available.", - "effectsconfigurator_label_chooseeff" : "Choose Base-Effect:", - "effectsconfigurator_button_saveeffect" : "Save Effect", - "effectsconfigurator_label_effectname" : "Effect name", - "effectsconfigurator_button_starttest" : "Start test", - "effectsconfigurator_button_stoptest" : "Stop test", - "effectsconfigurator_button_conttest" : "Continuous test", - "effectsconfigurator_label_deleffect" : "Delete Effect:", - "effectsconfigurator_button_deleffect" : "Delete Effect", - "support_label_title" : "Support Hyperion", - "support_label_intro" : "Hyperion is a free non-profit software. A small team is working on it and this is why we need your steady support.", - "support_label_spreadtheword" : "Spread the word", - "support_label_fbtext" : "Share our Hyperion Facebook page and get a notice when new updates are released", - "support_label_twtext" : "Share and follow on Twitter, be always up to date with latest post about the Hyperion development", - "support_label_ggtext" : "Circle us on Google +!", - "support_label_yttext" : "Bored from pictures? Checkout our Youtube channel!", - "support_label_donate" : "Donate or use our affiliate links", - "support_label_affinstr1" : "Click on the appropriate link of your country", - "support_label_affinstr2" : "Everything you buy (doesn't matter what) we get a small fee based on your turnover", - "support_label_affinstr3" : "You ALWAYS pay the same price, there is absolutely no difference. Try it out!", - "support_label_btctext" : "Address:", - "support_label_donationpp" : "Donation:", - "support_label_webrestitle" : "Information and help ressources", - "support_label_webpagetitle" : "Webpage", - "support_label_webpagetext" : "Home of Hyperion", - "support_label_wikititle" : "Wiki", - "support_label_wikitext" : "The A to Z source for almost everything Hyperion related", - "support_label_forumtitle" : "Forum", - "support_label_forumtext" : "Showcases, discussions, help and more", - "support_label_ghtext" : "Visit us on Github", - "update_label_intro" : "Overview about all available Hyperion versions. On top you could update or downgrade your version of Hyperion whenever you want. Sorted from newest to oldest", - "update_label_description" : "Description:", - "update_button_install" : "Install", - "update_button_changelog" : "Full changelog", - "update_label_type" : "Type:", - "update_versreminder" : "Your version: $1", - "about_version" : "Version", - "about_build" : "Build", - "about_builddate" : "Build date", - "about_translations" : "Translations", - "about_resources" : "$1 libraries", - "about_contribute" : "Add more languages to Hyperion!", - "about_credits" : "Credits to all these developers!", - "info_conlost_label_title" : "Lost connection to Hyperion service!", - "info_conlost_label_reason" : "Possible reasons:", - "info_conlost_label_reason1" : "- Bad WLAN connection", - "info_conlost_label_reason2" : "- You perform an update", - "info_conlost_label_reason3" : "- Hyperion isn't running", - "info_conlost_label_autorecon" : "We reconnect again after Hyperion is available.", - "info_conlost_label_autorefresh" : "This page will be automatically refreshed.", - "info_conlost_label_reload" : "If not, click me or reload the page", - "info_restart_title" : "Restarts currently...", - "info_restart_rightback" : "Hyperion will be right back immediately!", - "info_restart_contus" : "If you still hang around here after 20 seconds and you have no clue why please open a new topic at our support forum...", - "info_restart_contusa" : "...with your last steps. Thank you!", - "infoDialog_general_success_title" : "Success", - "infoDialog_general_error_title" : "Error", - "infoDialog_general_warning_title" : "Warning", - "infoDialog_checklist_title" : "Checklist!", - "InfoDialog_leds_validfail_title" : "JSON Validation failed!", - "infoDialog_effconf_deleted_text" : "The effect \"$1\" has been deleted successfully!", - "infoDialog_effconf_created_text" : "The effect \"$1\" has been created successfully!", - "InfoDialog_lang_title" : "Language setting", - "InfoDialog_lang_text" : "If you don't like the result of the automatic language detection you could overwrite it here.", - "InfoDialog_access_title" : "Settings level", - "InfoDialog_access_text" : "Depending on settings level you could adjust more options or get access to more features. Recommended is the \"Default\" level.", - "InfoDialog_nowrite_title" : "write permission error!", - "InfoDialog_nowrite_text" : "Hyperion can't write to your current loaded configuration file. Please repair the file permissions to proceed.", - "InfoDialog_nowrite_foottext" : "The WebUI will be unlocked automatically after you solved the problem!", - "infoDialog_wizrgb_text" : "Your RGB Byte Order is already well adjusted.", - "infoDialog_writeconf_error_text" : "Saving your configuration failed.", - "infoDialog_import_jsonerror_text" : "The selected configuration file \"$1\" is no .json file or it's corrupted. Error message: ($2)", - "infoDialog_import_hyperror_text" : "The selected configuration file \"$1\" can't be imported. It's not compatible with Hyperion 2.0 and higher!", - "infoDialog_import_reverror_text" : "The revision of your configuration file \"$1\" doesnt match the current Hyperion version you run (File: $2, Hyperion: $3). You could just import matching configurations!", - "infoDialog_import_comperror_text" : "Sad! Your browser doesn't support a import. Please try again with another browser.", - "infoDialog_import_confirm_title" : "Confirm import", - "infoDialog_import_confirm_text" : "Are you sure to import \"$1\"? This process can't be reverted!", - "wiz_rgb_title" : "RGB Byte Order Wizard", - "wiz_rgb_intro1" : "This wizard will guide you through the finding process of the correct color order for your leds. Click on continue to begin.", - "wiz_rgb_intro2" : "When do you need this wizard? Example: You set the color red, but you get green or blue. You could also use it for first configuration.", - "wiz_rgb_expl" : "The color dot switches every x seconds the color (red, green), at the same time your leds switch the color too. Answer the questions at the bottom to check/correct your byte order.", - "wiz_rgb_switchevery" : "Switch color every...", - "wiz_rgb_q" : "Which color show your leds, when the color dot above shows...", - "wiz_rgb_qrend" : "...red?", - "wiz_rgb_qgend" : "...green?", - "wiz_hue_title" : "Hue Bridge Wizard", - "wiz_hue_intro1" : "With this Setup Helper you can get a new User for your Hue Bridge and you can see your Lights with the IDs for Hyperion Configuration.", - "wiz_hue_intro2" : "Remember: This is only a wizard. You have to copy and paste them in your config.", - "wiz_hue_ip" : "Hue Bridge IP:", - "wiz_hue_username" : "Username:", - "wiz_hue_create_user" : "Create User", - "wiz_hue_failure_ip" : "Please check your IP Address.", - "wiz_hue_failure_connection" : "Connection Timeout. Please press the button in time.", - "wiz_hue_press_link" : "Please press link button on the Hue Bridge.", - "wiz_cc_title" : "Color calibration wizard", - "wiz_cc_intro1" : "This wizard will guide you through your led calibration. If you are using Kodi, the calibration pictures and videos can be send directly to kodi without further tasks on your side. If not, you need to download these files yourself and apply them, if the wizard wants it.", - "wiz_cc_kwebs" : "Kodi webserver (IP:Port)", - "wiz_cc_kodidiscon" : "Kodi webserver not found, proceed without Kodi support.", - "wiz_cc_kodidisconlink" : "Download link pictures:", - "wiz_cc_kodicon" : "Kodi webserver found, proceed with Kodi support.", - "wiz_cc_kodimsg_start" : "Test success - time to proceed!", - "wiz_cc_kodishould" : "Kodi should show the following picture: $1", - "wiz_cc_lettvshow" : "Let your TV show the following picture: $1", - "wiz_cc_lettvshowm" : "Check this with the following pictures: $1", - "wiz_cc_adjustit" : "Adjust your \"$1\", until your are fine with it. Take notice: The more you adjust away from the default value the color spectrum will be limited (Also for all colors in between). Depending on TV/LED color spectrum the results will vary.", - "wiz_cc_adjustgamma" : "Gamma: What you have to do is, adjust gamma levels of each channel until you have the same perceived amount of each channel. For example, if your Grey is a bit reddish it means that you have to increase red gamma to reduce the amount of red (the more gamma, the less amount of color).", - "wiz_cc_chooseid" : "Define a name for this profile.", - "wiz_cc_btn_switchpic" : "Switch picture", - "wiz_cc_backlight" : "Additional you could define a backlight to sort out \"bad colors\" on nearly dark areas or if you don't like the switch between color and off during watching. Additional you could define if there should be some color in it or just white. This is disabled during the state \"Off\" ,\"Color\" and \"Effect\".", - "wiz_cc_testintro" : "Time for a real test!", - "wiz_cc_testintrok" : "Push on a button below to start a test video.", - "wiz_cc_testintrowok" : "Checkout the following link to download test videos:", - "wiz_cc_link" : "Click me!", - "wiz_cc_morethanone" : "You have more than one profile, please choose the profile you want to calibrate.", - "wiz_cc_btn_stop" : "Stop video", - "wiz_cc_summary" : "A conclusen of your settings. During video playback, you could change or test values again. If you are done, click on save.", - "edt_dev_enum_subtract_minimum" : "Substract minimum", - "edt_dev_enum_sub_min_warm_adjust" : "Min warm adjust", - "edt_dev_enum_white_off" : "White off", - "edt_dev_general_heading_title" : "General Settings", - "edt_dev_general_name_title" : "Configuration name", - "edt_dev_general_ledCount_title" : "Count of all hardware LEDs", - "edt_dev_general_colorOrder_title" : "RGB byte order", - "edt_dev_general_rewriteTime_title" : "Refresh time", - "edt_dev_spec_header_title" : "Specific Settings", - "edt_dev_spec_baudrate_title" : "Baudrate", - "edt_dev_spec_spipath_title" : "SPI path", - "edt_dev_spec_invert_title" : "Invert signal", - "edt_dev_spec_multicastGroup_title" : "Multicast group", - "edt_dev_spec_numberOfLeds_title" : "Number of LEDs", - "edt_dev_spec_port_title" : "Port", - "edt_dev_spec_orbIds_title" : "Orb ID(s)", - "edt_dev_spec_useOrbSmoothing_title" : "Use orb smoothing", - "edt_dev_spec_targetIp_title" : "Target IP", - "edt_dev_spec_targetIpHost_title" : "Target IP/hostname", - "edt_dev_spec_outputPath_title" : "Output path", - "edt_dev_spec_delayAfterConnect_title" : "Delay after connect", - "edt_dev_spec_FCsetConfig_title" : "Set fadecandy configuration", - "edt_dev_spec_FCmanualControl_title" : "Manual control of fadecandy LED", - "edt_dev_spec_FCledToOn_title" : "Fadecandy LED set to on", - "edt_dev_spec_interpolation_title" : "Interpolation", - "edt_dev_spec_dithering_title" : "Dithering", - "edt_dev_spec_gamma_title" : "Gamma", - "edt_dev_spec_whitepoint_title" : "Whitepoint", - "edt_dev_spec_username_title" : "Username", - "edt_dev_spec_lightid_title" : "Light ID(s)", - "edt_dev_spec_lightid_itemtitle" : "ID", - "edt_dev_spec_transistionTime_title" : "Transistion time", - "edt_dev_spec_switchOffOnBlack_title" : "Switch off on black", - "edt_dev_spec_uid_title" : "UID", - "edt_dev_spec_intervall_title" : "Intervall", - "edt_dev_spec_latchtime_title" : "Latch time", - "edt_dev_spec_maxPacket_title" : "Max packet", - "edt_dev_spec_serial_title" : "Serial number", - "edt_dev_spec_vid_title" : "VID", - "edt_dev_spec_pid_title" : "PID", - "edt_dev_spec_cid_title" : "CID", - "edt_dev_spec_LBap102Mode_title" : "LightBerry APA102 Mode", - "edt_dev_spec_universe_title" : "Universe", - "edt_dev_spec_whiteLedAlgor_title" : "White LED algorithm", - "edt_dev_spec_useRgbwProtocol_title" : "Use RGBW protocol", - "edt_dev_spec_maximumLedCount_title" : "Maximum LED count", - "edt_dev_spec_gpioNumber_title" : "GPIO number", - "edt_dev_spec_gpioMap_title" : "GPIO mapping", - "edt_dev_spec_PBFiFo_title" : "Pi-Blaster FiFo", - "edt_dev_spec_gpioBcm_title" : "GPIO Pin", - "edt_dev_spec_ledIndex_title" : "LED index", - "edt_dev_spec_colorComponent_title" : "Color component", - "edt_conf_general_enable_title" : "Activate", - "edt_conf_general_enable_expl" : "If checked, the component is enabled.", - "edt_conf_general_priority_title" : "Priority channel", - "edt_conf_general_priority_expl" : "The priority of this component", - "edt_conf_general_port_title" : "Port", - "edt_conf_general_port_expl" : "The port that is used.", - "edt_conf_enum_color" : "Color", - "edt_conf_enum_effect" : "Effect", - "edt_conf_enum_multicolor_mean" : "Multicolor", - "edt_conf_enum_unicolor_mean" : "Unicolor", - "edt_conf_enum_rgb" : "RGB", - "edt_conf_enum_bgr" : "BGR", - "edt_conf_enum_rbg" : "RBG", - "edt_conf_enum_brg" : "BRG", - "edt_conf_enum_gbr" : "GBR", - "edt_conf_enum_grb" : "GRB", - "edt_conf_enum_linear" : "Linear", - "edt_conf_enum_PAL" : "PAL", - "edt_conf_enum_NTSC" : "NTSC", - "edt_conf_enum_logsilent" : "Silent", - "edt_conf_enum_logwarn" : "Warning", - "edt_conf_enum_logverbose" : "Verbose", - "edt_conf_enum_logdebug" : "Debug", - "edt_conf_enum_bbdefault" : "Default", - "edt_conf_enum_bbclassic" : "Classic", - "edt_conf_enum_bbosd" : "OSD", - "edt_conf_gen_heading_title" : "General Settings", - "edt_conf_gen_name_title" : "Configuration name", - "edt_conf_gen_name_expl" : "A user defined name which is used to detect Hyperion. (Helpful with more than one Hyperion instance)", - "edt_conf_gen_showOptHelp_title" : "Show explanations", - "edt_conf_gen_showOptHelp_expl" : "Show all available explanations in each section. Highly recommended for beginners!", - "edt_conf_color_heading_title" : "Color Calibration", - "edt_conf_color_channelAdjustment_header_itemtitle" : "Profile", - "edt_conf_color_channelAdjustment_header_title" : "Color channel adjustments", - "edt_conf_color_channelAdjustment_header_expl": "Adjustments for color, brightness, linearization and more.", - "edt_conf_color_imageToLedMappingType_title" : "Led area assignment", - "edt_conf_color_imageToLedMappingType_expl" : "Overwrites the led area assignment of your led layout if it's not \"multicolor\"", - "edt_conf_color_id_title" : "ID", - "edt_conf_color_id_expl" : "User given name", - "edt_conf_color_leds_title" : "LED index", - "edt_conf_color_leds_expl" : "Assign this adjustment to all leds (*) or just some (0-24).", - "edt_conf_color_black_title" : "black", - "edt_conf_color_black_expl" : "The calibrated black value.", - "edt_conf_color_white_title" : "white", - "edt_conf_color_white_expl" : "The calibrated white value.", - "edt_conf_color_red_title" : "red", - "edt_conf_color_red_expl" : "The calibrated red value.", - "edt_conf_color_green_title" : "green", - "edt_conf_color_green_expl" : "The calibrated green value.", - "edt_conf_color_blue_title" : "blue", - "edt_conf_color_blue_expl" : "The calibrated blue value.", - "edt_conf_color_cyan_title" : "cyan", - "edt_conf_color_cyan_expl" : "The calibrated cyan value.", - "edt_conf_color_magenta_title" : "magenta", - "edt_conf_color_magenta_expl" : "The calibrated magenta value.", - "edt_conf_color_yellow_title" : "yellow", - "edt_conf_color_yellow_expl" : "The calibrated yellow value.", - "edt_conf_color_gammaRed_title" : "gamma red", - "edt_conf_color_gammaRed_expl" : "The gamma of red.", - "edt_conf_color_gammaGreen_title" : "gamma green", - "edt_conf_color_gammaGreen_expl" : "The gamma of green.", - "edt_conf_color_gammaBlue_title" : "gamma blue", - "edt_conf_color_gammaBlue_expl" : "The gamma of blue.", - "edt_conf_color_backlightThreshold_title" : "Backlight threshold", - "edt_conf_color_backlightThreshold_expl" : "The minimum amount of brightness (backlight). Disabled during effects, colors and in status \"Off\"", - "edt_conf_color_backlightColored_title" : "Colored backlight", - "edt_conf_color_backlightColored_expl" : "Add some color to your backlight.", - "edt_conf_color_brightness_title" : "maximal brightness", - "edt_conf_color_brightness_expl" : "From 0.0 to 0.5 the brightness is linearised, from 0.5 to 1.0 cyan, magenta, yellow is up to 2x brighter and white 3x.", - "edt_conf_smooth_heading_title" : "Smoothing", - "edt_conf_smooth_type_title" : "Type", - "edt_conf_smooth_type_expl" : "Type of smoothing.", - "edt_conf_smooth_time_ms_title" : "Time", - "edt_conf_smooth_time_ms_expl" : "How long should the smoothing gather pictures?", - "edt_conf_smooth_updateFrequency_title" : "Update frequency", - "edt_conf_smooth_updateFrequency_expl" : "The output speed to your led controller.", - "edt_conf_smooth_updateDelay_title" : "Update delay", - "edt_conf_smooth_updateDelay_expl" : "Delay the output in case your ambient light is faster than your TV.", - "edt_conf_smooth_continuousOutput_title" : "Continuous output", - "edt_conf_smooth_continuousOutput_expl" : "Update the leds even there is no changed picture.", - "edt_conf_v4l2_heading_title" : "USB Capture", - "edt_conf_v4l2_device_title" : "Device", - "edt_conf_v4l2_device_expl" : "The path to the usb capture.", - "edt_conf_v4l2_input_title" : "Input", - "edt_conf_v4l2_input_expl" : "Input of this path.", - "edt_conf_v4l2_standard_title" : "Video standard", - "edt_conf_v4l2_standard_expl" : "Select the video standard for your region.", - "edt_conf_v4l2_width_title" : "Width", - "edt_conf_v4l2_width_expl" : "The width of the picture. (-1 = auto width)", - "edt_conf_v4l2_height_title" : "Height", - "edt_conf_v4l2_height_expl" : "The height of the picture. (-1 = auto height)", - "edt_conf_v4l2_frameDecimation_title" : "Frame decimation", - "edt_conf_v4l2_frameDecimation_expl" : "The factor of frame decimation", - "edt_conf_v4l2_sizeDecimation_title" : "Size decimation", - "edt_conf_v4l2_sizeDecimation_expl" : "The factor of size decimation", - "edt_conf_v4l2_mode_title" : "Mode", - "edt_conf_v4l2_mode_expl" : "Modus of USB capture", - "edt_conf_v4l2_useKodiChecker_title" : "Use Kodi Watch", - "edt_conf_v4l2_useKodiChecker_expl" : "Start/stop capturing with Kodi Watch results.", - "edt_conf_v4l2_cropLeft_title" : "Crop left", - "edt_conf_v4l2_cropLeft_expl" : "Count of pixels on the left side that are removed from the picture.", - "edt_conf_v4l2_cropRight_title" : "Crop right", - "edt_conf_v4l2_cropRight_expl" : "Count of pixels on the right side that are removed from the picture.", - "edt_conf_v4l2_cropTop_title" : "Crop top", - "edt_conf_v4l2_cropTop_expl" : "Count of pixels on the top side that are removed from the picture.", - "edt_conf_v4l2_cropBottom_title" : "Crop bottom", - "edt_conf_v4l2_cropBottom_expl" : "Count of pixels on the bottom side that are removed from the picture.", - "edt_conf_v4l2_redSignalThreshold_title" : "Red signal threshold", - "edt_conf_v4l2_redSignalThreshold_expl" : "Darkens low red values (recognized as black)", - "edt_conf_v4l2_greenSignalThreshold_title" : "Green signal threshold", - "edt_conf_v4l2_greenSignalThreshold_expl" : "Darkens low green values (recognized as black)", - "edt_conf_v4l2_blueSignalThreshold_title" : "Blue signal threshold", - "edt_conf_v4l2_blueSignalThreshold_expl" : "Darkens low blue values (recognized as black)", - "edt_conf_fg_heading_title" : "Platform Capture", - "edt_conf_fg_type_title" : "Type", - "edt_conf_fg_type_expl" : "Type of platform capture, default is 'auto'", - "edt_conf_fg_frequency_Hz_title" : "Capture frequency", - "edt_conf_fg_frequency_Hz_expl" : "How fast new pictures are captured", - "edt_conf_fg_horizontalPixelDecimation_title" : "Horizontal pixel decimation", - "edt_conf_fg_horizontalPixelDecimation_expl" : "Horizontal pixel decimation (factor)", - "edt_conf_fg_useXGetImage_title" : "Use XGetImage", - "edt_conf_fg_useXGetImage_expl" : "XGetImage for newer X11 desktops", - "edt_conf_fg_verticalPixelDecimation_title" : "Vertical pixel decimation", - "edt_conf_fg_verticalPixelDecimation_expl" : "Vertical pixel decimation (factor)", - "edt_conf_fg_device_title" : "Device", - "edt_conf_fg_display_title" : "Display", - "edt_conf_fg_display_expl" : "Select which desktop should be captured (multi monitor setup)", - "edt_conf_bb_heading_title" : "Blackbar detector", - "edt_conf_bb_threshold_title" : "Threshold", - "edt_conf_bb_threshold_expl" : "If the detection doesn't work, higher the threshold to adjust on 'greyish' black", - "edt_conf_bb_unknownFrameCnt_title" : "unknownFrameCnt", - "edt_conf_bb_borderFrameCnt_title" : "borderFrameCnt", - "edt_conf_bb_maxInconsistentCnt_title" : "maxInconsistentCn", - "edt_conf_bb_blurRemoveCnt_title" : "blurRemoveCnt", - "edt_conf_bb_mode_title" : "Mode", - "edt_conf_bb_mode_expl" : "Algorithm for processing. (see Wiki)", - "edt_conf_kodic_heading_title" : "Kodi Watch", - "edt_conf_kodic_kodiAddress_title" : "Kodi IP address", - "edt_conf_kodic_kodiAddress_expl" : "The IP address of Kodi.", - "edt_conf_kodic_kodiTcpPort_title" : "Kodi TCP port", - "edt_conf_kodic_kodiTcpPort_expl" : "The TCP port of Kodi. Don't use the webserver port!", - "edt_conf_kodic_grabVideo_title" : "Video", - "edt_conf_kodic_grabVideo_expl" : "If checked, the capturing is enabled during video playback, else it's disabled.", - "edt_conf_kodic_grabPictures_title" : "Pictures", - "edt_conf_kodic_grabPictures_expl" : "If checked, the capturing is enabled on picture playback, else it's disabled.", - "edt_conf_kodic_grabAudio_title" : "Audio", - "edt_conf_kodic_grabAudio_expl" : "If checked, the capturing is enabled during audio playback, else it's disabled.", - "edt_conf_kodic_grabMenu_title" : "Menu", - "edt_conf_kodic_grabMenu_expl" : "If checked, the capturing is enabled in menu and login screen, else it's disabled.", - "edt_conf_kodic_grabPause_title" : "Pause", - "edt_conf_kodic_grabPause_expl" : "If checked, the capturing is enabled in pause mode (Music, Video, Diashow), else it's disabled.", - "edt_conf_kodic_grabScreensaver_title" : "Screensaver", - "edt_conf_kodic_grabScreensaver_expl" : "If checked, the capturing is enabled during screensaver, else it's disabled.", - "edt_conf_kodic_enable3DDetection_title" : "Detect 3D", - "edt_conf_kodic_enable3DDetection_expl" : "Detect which 3D mode Kodi is running. (no MVC and not for USB capture)", - "edt_conf_fge_heading_title" : "Boot Effect/Color", - "edt_conf_fge_type_title" : "Type", - "edt_conf_fge_type_expl" : "Choose between a color of effect.", - "edt_conf_fge_color_title" : "Color", - "edt_conf_fge_color_expl" : "If type is \"Color\", set a color of your choice here.", - "edt_conf_fge_effect_title" : "Effect", - "edt_conf_fge_effect_expl" : "If type is \"Effect\", select a effect of your choice (Also self created effects).", - "edt_conf_fge_duration_ms_title" : "Duration", - "edt_conf_fge_duration_ms_expl" : "Duration of Effect/Color during Hyperion startup.", - "edt_conf_bge_heading_title" : "Background Effect/Color", - "edt_conf_fw_heading_title" : "Forwarder", - "edt_conf_fw_json_title" : "List of json clients", - "edt_conf_fw_json_expl" : "One json target per line. Contains IP:PORT (Example: 127.0.0.1:19446)", - "edt_conf_fw_json_itemtitle" : "Json target", - "edt_conf_fw_proto_title" : "List of proto clients", - "edt_conf_fw_proto_expl" : "One proto target per line. Contains IP:PORT (Example: 127.0.0.1:19447)", - "edt_conf_fw_proto_itemtitle" : "Proto target", - "edt_conf_js_heading_title" : "JSON Server", - "edt_conf_ps_heading_title" : "PROTO Server", - "edt_conf_bobls_heading_title" : "Boblight Server", - "edt_conf_udpl_heading_title" : "UDP Listener", - "edt_conf_udpl_address_title" : "Address", - "edt_conf_udpl_address_expl" : "The address where UDP packages are accepted.", - "edt_conf_udpl_timeout_title" : "Timeout", - "edt_conf_udpl_timeout_expl" : "If no packages are received for the given period, the component will be (soft) disabled.", - "edt_conf_udpl_shared_title" : "Shared", - "edt_conf_udpl_shared_expl" : "Shared across all Hyperion instances.", - "edt_conf_webc_heading_title" : "Web Configuration", - "edt_conf_webc_docroot_title" : "Document Root", - "edt_conf_webc_docroot_expl" : "Local webinterface root path (just for webui developer)", - "edt_conf_effp_heading_title" : "Effekt Paths", - "edt_conf_effp_paths_title" : "Effect Path(s)", - "edt_conf_effp_paths_itemtitle" : "Path", - "edt_conf_effp_disable_title" : "Disabed Effects", - "edt_conf_effp_disable_itemtitle" : "Effect", - "edt_conf_log_heading_title" : "Logging", - "edt_conf_log_level_title" : "Log-Level", - "edt_conf_log_level_expl" : "Depending on loglevel you see less or more messages in your log.", - "edt_eff_candle_header_title" : "Candle", - "edt_eff_police_header_title" : "Police", - "edt_eff_fade_header_title" : "Fade", - "edt_eff_rainbowmood_header_title" : "Rainbow Mood", - "edt_eff_knightrider_header_title" : "Knight Rider", - "edt_eff_lightclock_header_title" : "Clock 1", - "edt_eff_clock_header_title" : "Clock 2", - "edt_eff_pacman_header_title" : "Pac-Man", - "edt_eff_moodblobs_header_title" : "Mood Blobs", - "edt_eff_rainbowswirl_header_title" : "Rainbow Swirl", - "edt_eff_random_header_title" : "Random", - "edt_eff_runningdots_header_title" : "Running Dots", - "edt_eff_systemshutdown_header_title" : "System Shutdown", - "edt_eff_snake_header_title" : "Snake", - "edt_eff_sparks_header_title" : "Sparks", - "edt_eff_storbe_header_title" : "Strobe", - "edt_eff_traces_header_title" : "Color Traces", - "edt_eff_x-mas_header_title" : "X-Mas", - "edt_eff_trails_header_title" : "Trails", - "edt_eff_enum_all" : "All", - "edt_eff_enum_all-together" : "All together", - "edt_eff_enum_list" : "LED List", - "edt_eff_count_title" : "Count", - "edt_eff_color_title" : "Color", - "edt_eff_colorrandom_title" : "Random color", - "edt_eff_colorone_title" : "Color one", - "edt_eff_colortwo_title" : "Color two", - "edt_eff_colorcount_title" : "Color length", - "edt_eff_rotationtime_title" : "Rotation time", - "edt_eff_sleeptime_title" : "Sleep time", - "edt_eff_reversedirection_title" : "Reverse direction", - "edt_eff_fadetime_title" : "Fade time", - "edt_eff_colorstart_title" : "Color start", - "edt_eff_colorend_title" : "Color end", - "edt_eff_colorshift_title" : "Color Shift", - "edt_eff_whichleds_title" : "Which Leds", - "edt_eff_ledlist_title" : "Led List", - "edt_eff_speed_title" : "Speed", - "edt_eff_fadefactor_title" : "Fade factor", - "edt_eff_showseconds_title" : "Show seconds", - "edt_eff_blobcount_title" : "Blob count", - "edt_eff_huechange_title" : "Color change", - "edt_eff_basecolorchange_title" : "Base color change", - "edt_eff_basecolorchangerate_title" : "BC change rate", - "edt_eff_basecolorrangeleft_title" : "BC range left", - "edt_eff_basecolorrangeright_title" : "BC range right", - "edt_eff_brightness_title" : "Brightness", - "edt_eff_centerx_title" : "Center X-Axis", - "edt_eff_centery_title" : "Center Y-Axis", - "edt_eff_saturation_title" : "Saturation", - "edt_eff_colorevel_title" : "Color level", - "edt_eff_whitelevel_title" : "White level", - "edt_eff_alarmcolor_title" : "Alarm color", - "edt_eff_postcolor_title" : "Post color", - "edt_eff_enableshutdown_title" : "Real shutdown", - "edt_eff_length_title" : "Length", - "edt_eff_frequency_title" : "Frequency", - "edt_eff_min_len_title" : "Minimal length", - "edt_eff_max_len_title" : "Maximal length", - "edt_eff_height_title" : "Height", - "edt_eff_offset_title" : "Offset", - "edt_eff_colorHour_title" : "Color hour", - "edt_eff_colorMinute_title" : "Color minute", - "edt_eff_colorSecond_title" : "Color second", - "edt_eff_hourMargin_title" : "Margin hour", - "edt_eff_minuteMargin_title" : "Margin minute", - "edt_eff_secondMargin_title" : "Margin second", - "edt_eff_margin_title" : "Margin", - "edt_eff_colorMarker_title" : "Color marker", - "edt_append_ns" : "ns", - "edt_append_ms" : "ms", - "edt_append_s" : "s", - "edt_append_hz" : "Hz", - "edt_append_pixel" : "Pixel", - "edt_append_percent" : "%", - "edt_append_degree" : "°", - "edt_append_sdegree" : "s/degree", - "edt_append_leds" : "LEDs", - "edt_msg_error_notset" : "Property must be set", - "edt_msg_error_notempty" : "Value required", - "edt_msg_error_enum" : "Value must be one of the enumerated values", - "edt_msg_error_anyOf" : "Value must validate against at least one of the provided schemas", - "edt_msg_error_oneOf" : "Value must validate against exactly one of the provided schemas. It currently validates against $1 of the schemas.", - "edt_msg_error_not" : "Value must not validate against the provided schema", - "edt_msg_error_type_union" : "Value must be one of the provided types", - "edt_msg_error_type" : "Value must be of type $1", - "edt_msg_error_disallow_union" : "Value must not be one of the provided disallowed types", - "edt_msg_error_disallow" : "Value must not be of type $1", - "edt_msg_error_multipleOf" : "Value must be a multiple of $1", - "edt_msg_error_maximum_excl" : "Value must be less than $1", - "edt_msg_error_maximum_incl" : "Value must be at most $1", - "edt_msg_error_minimum_excl" : "Value must be greater than $1", - "edt_msg_error_minimum_incl" : "Value must be at least $1", - "edt_msg_error_maxLength" : "Value must be at most $1 characters long", - "edt_msg_error_minLength" : "Value must be at least $1 characters long", - "edt_msg_error_pattern" : "Value must match the pattern", - "edt_msg_error_additionalItems" : "No additional items allowed in this array", - "edt_msg_error_maxItems" : "Value must have at most $1 items", - "edt_msg_error_minItems" : "Value must have at least $1 items", - "edt_msg_error_uniqueItems" : "Array must have unique items", - "edt_msg_error_maxProperties" : "Object must have at most $1 properties", - "edt_msg_error_minProperties" : "Object must have at least $1 properties", - "edt_msg_error_required" : "Object is missing the required property '$1'", - "edt_msg_error_additional_properties" : "No additional properties allowed, but property $1 is set", - "edt_msg_error_dependency" : "Must have property $1", - "edt_msg_button_delete_all" : "All", - "edt_msg_button_delete_all_title" : "Delete All", - "edt_msg_button_delete_last" : "Last $1", - "edt_msg_button_delete_last_title" : "Delete Last $1", - "edt_msg_button_add_row_title" : "Add $1", - "edt_msg_button_move_down_title" : "Move down", - "edt_msg_button_move_up_title" : "Move up", - "edt_msg_button_delete_row_title" : "Delete $1", - "edt_msg_button_delete_row_title_short" : "Delete", - "edt_msg_button_collapse" : "Collapse", - "edt_msg_button_expand" : "Expand" + "general_webui_title" : "Hyperion - Web Configuration", + "general_country_de" : "Germany", + "general_country_us" : "United States", + "general_country_uk" : "United Kingdom", + "general_country_fr" : "France", + "general_country_es" : "Spain", + "general_country_it" : "Italy", + "general_country_nl" : "Netherlands", + "general_speech_de" : "German", + "general_speech_en" : "English", + "general_speech_es" : "Spanish", + "general_access_default" : "Default", + "general_access_advanced" : "Advanced", + "general_access_expert" : "Expert", + "general_comp_SMOOTHING" : "Smoothing", + "general_comp_BLACKBORDER" : "Blackbar Detection", + "general_comp_KODICHECKER" : "Kodi Watch", + "general_comp_FORWARDER" : "JSON/PROTO Forward", + "general_comp_UDPLISTENER" : "UDP Listener", + "general_comp_BOBLIGHTSERVER" : "Boblight Server", + "general_comp_GRABBER" : "Platform Capture", + "general_comp_V4L" : "USB Capture", + "general_col_red" : "red", + "general_col_green" : "green", + "general_col_blue" : "blue", + "general_button_savesettings" : "Save settings", + "general_btn_ok" : "OK", + "general_btn_cancel" : "Cancel", + "general_btn_continue" : "Continue", + "general_btn_save" : "Save", + "general_btn_saverestart" : "Save and restart", + "general_btn_saveandreload" : "Save and reload", + "general_btn_restarthyperion" : "Restart Hyperion", + "general_btn_off" : "Off", + "general_btn_on" : "On", + "general_btn_next" : "Next", + "general_btn_back" : "Back", + "dashboard_label_intro" : "The dashboard give you a quick overview about the status of Hyperion and show you the latest news of the Hyperion Blog.", + "dashboard_infobox_label_title" : "Information", + "dashboard_infobox_label_currenthyp" : "Your Hyperion version:", + "dashboard_infobox_label_latesthyp" : "Latest Hyperion version:", + "dashboard_infobox_label_platform" : "Platform:", + "dashboard_infobox_label_instance" : "Instance:", + "dashboard_infobox_label_ports" : "Ports (json|proto):", + "dashboard_infobox_message_updatewarning" : "A newer version of Hyperion is available! ($1)", + "dashboard_infobox_message_updatesuccess" : "You run the latest version of Hyperion.", + "dashboard_componentbox_label_title" : "Components status", + "dashboard_componentbox_label_comp" : "Component", + "dashboard_componentbox_label_status" : "Status", + "dashboard_newsbox_label_title" : "Hyperion-Blog", + "dashboard_newsbox_visitblog" : "Visit Hyperion-Blog", + "dashboard_newsbox_noconn" : "Can't connect to Hyperion Server to retrieve latest posts, does your internet connection work?", + "dashboard_newsbox_readmore" : "Read more", + "dashboard_alert_message_confedit" : "Your Hyperion configuration has been modified. To apply it, restart Hyperion.", + "main_menu_dashboard_token" : "Dashboard", + "main_menu_configuration_token" : "Configuration", + "main_menu_general_conf_token" : "General", + "main_menu_leds_conf_token" : "LED Hardware", + "main_menu_grabber_conf_token" : "Capturing Hardware", + "main_menu_effect_conf_token" : "Effects", + "main_menu_colors_conf_token" : "Image Processing", + "main_menu_kodiwatch_token" : "Kodi Watch", + "main_menu_network_conf_token" : "Network Services", + "main_menu_remotecontrol_token" : "Remote Control", + "main_menu_effectsconfigurator_token" : "Effects Configurator", + "main_menu_support_token" : "Support", + "main_menu_update_token" : "Update", + "main_menu_system_token" : "System", + "main_menu_input_selection_token" : "Input Selection", + "main_menu_logging_token" : "Log", + "main_menu_webconfig_token" : "Web configuration", + "main_menu_about_token" : "About Hyperion", + "main_ledsim_title" : "LED Visualization", + "main_ledsim_text" : "Live visualization of led colors and optional the current video stream of your capture device.", + "main_ledsim_btn_toggleleds" : "Show LEDs", + "main_ledsim_btn_togglelednumber" : "LED numbers", + "main_ledsim_btn_togglelivevideo" : "Live video", + "conf_general_label_title" : "General settings", + "conf_general_intro" : "Basic settings around Hyperion and WebUI that don't fit into another category.", + "conf_general_impexp_title" : "Import/Export Configuration", + "conf_general_impexp_l1" : "Import a configuration by selecting a configuration file below and click on \"Import\".", + "conf_general_impexp_l2" : "Export a configuration by clicking on \"Export\". Your browser starts a download.", + "conf_general_impexp_impbtn" : "Import", + "conf_general_impexp_expbtn" : "Export", + "conf_helptable_option" : "Option", + "conf_helptable_expl" : "Explanation", + "conf_effect_path_intro" : "Define more effect paths if necessary.", + "conf_effect_fgeff_intro" : "Define a booteffect or color, which is shown during Hyperion startup for the defined duration.", + "conf_effect_bgeff_intro" : "Define a background effect, which us shown during \"idle\". (also temporarily via Kodi Watch)", + "conf_leds_device_intro" : "Hyperion supports a lot of controllers to transmit data to your target device. Select a LED controller out of the sorted list and configure it. We have chosen the best default settings for each device.", + "conf_leds_layout_intro" : "You need also a led layout, which reflects your led positions. The classic layout is the usual used tv frame, but we also support led matrix (led walls) creation. The view on this layout is ALWAYS of the FRONT of your TV.", + "conf_leds_nav_label_ledcontroller" : "LED Controller", + "conf_leds_nav_label_ledlayout" : "LED Layout", + "conf_leds_contr_label_contrtype" : "Controller type:", + "conf_leds_optgroup_RPiSPI" : "RPi SPI", + "conf_leds_optgroup_RPiPWM" : "RPi PWM", + "conf_leds_optgroup_RPiGPIO" : "RPi GPIO", + "conf_leds_optgroup_network" : "Network", + "conf_leds_optgroup_usb" : "USB", + "conf_leds_optgroup_debug" : "Debug", + "conf_leds_layout_btn_checklist" : "Show checklist", + "conf_leds_layout_checkp1" : "The black led is your first led, the first led is the point where you input your data signal.", + "conf_leds_layout_checkp2" : "The layout is always the front view of your TV, never the back view.", + "conf_leds_layout_checkp3" : "Make sure the direction is right. The grey leds indicate led number 2 and 3 to visualize the data direction.", + "conf_leds_layout_checkp4" : "Case Gap: To create a gap, ignore it first when you define Top/Bottom/Left/Right and set afterwards your gap length to remove a amount of leds. Modify the gap position until it matches.", + "conf_leds_layout_frame" : "Classic Layout (LED Frame)", + "conf_leds_layout_matrix" : "Matrix Layout (LED Wall)", + "conf_leds_layout_generatedconf" : "Generated/Current LED Configuration", + "conf_leds_layout_button_savelay" : "Save Layout", + "conf_leds_layout_button_updsim" : "Update Preview", + "conf_leds_layout_peview" : "LED Layout Preview", + "conf_leds_layout_advanced" : "Advanced Settings", + "conf_leds_layout_preview_originCL" : "Created from: Classic Layout (LED Frame)", + "conf_leds_layout_preview_originTEXT" : "Created from: Textfield", + "conf_leds_layout_preview_originMA" : "Created from: Matrix Layout(LED wall)", + "conf_leds_layout_preview_totalleds" : "Totel LEDs: $1", + "conf_leds_layout_preview_ledpower" : "Max. power consumption: $1 A", + "conf_leds_layout_preview_l1" : "This is your first led (input position)", + "conf_leds_layout_preview_l2" : "This visualizes the data direction (second/third led)", + "conf_leds_layout_cl_top" : "Top", + "conf_leds_layout_cl_bottom" : "Bottom", + "conf_leds_layout_cl_left" : "Left", + "conf_leds_layout_cl_right" : "Right", + "conf_leds_layout_cl_gaglength" : "Gap length", + "conf_leds_layout_cl_gappos" : "gap position", + "conf_leds_layout_cl_inppos" : "Input position", + "conf_leds_layout_cl_reversdir" : "Reverse direction", + "conf_leds_layout_cl_hleddepth" : "Horizontal LED depth", + "conf_leds_layout_cl_vleddepth" : "Vertical LED depth", + "conf_leds_layout_cl_generate" : "Generate LED configuration", + "conf_leds_layout_cl_edgegap" : "Edge Gap", + "conf_leds_layout_cl_cornergap" : "Corner Gap", + "conf_leds_layout_cl_overlap" : "Overlap", + "conf_leds_layout_ma_horiz" : "Horizontal", + "conf_leds_layout_ma_vert" : "Vertical", + "conf_leds_layout_ma_cabling" : "Cabling", + "conf_leds_layout_ma_optsnake" : "Snake", + "conf_leds_layout_ma_optparallel" : "Parallel", + "conf_leds_layout_ma_order" : "Order", + "conf_leds_layout_ma_opthoriz" : "Horizontal", + "conf_leds_layout_ma_optvert" : "Vertical", + "conf_leds_layout_ma_position" : "Input", + "conf_leds_layout_ma_opttopleft" : "Top Left", + "conf_leds_layout_ma_opttopright" : "Top right", + "conf_leds_layout_ma_optbottomleft" : "Bottom left", + "conf_leds_layout_ma_optbottomright" : "Bottom right", + "conf_leds_layout_textf1" : "This textfield shows by default your current loaded layout and will be overwritten if you generate a new one with the options above. Optional you could perform further edits.", + "conf_grabber_fg_intro" : "Platforum capture is your local system capture as input source, Hyperion is installed on.", + "conf_grabber_v4l_intro" : "USB capture is a (capture)device connected via USB which is used to input source pictures for processing.", + "conf_colors_color_intro" : "Create one or more calibration profiles, adjust each color, brightness, linearization and more.", + "conf_colors_smoothing_intro" : "Smoothing flattens color/brightness changes to reduce annoying distraction.", + "conf_colors_blackborder_intro" : "Skip black bars wherever they are. Each mode use another detection algorithm which is tuned for special situations. Higher the threshold if it doesn't work for you.", + "conf_network_json_intro" : "The JSON-RPC-Port of this Hyperion instance, used for remote control.", + "conf_network_proto_intro" : "The PROTO-Port of this Hyperion instance, used for picture streams (HyperionScreenCap, Kodi Adddon, ...)", + "conf_network_bobl_intro" : "Receiver for Boblight", + "conf_network_udpl_intro" : "Receiver for UDP", + "conf_network_forw_intro" : "Forward all input to a second Hyperion instance which could be driven with another led controller", + "conf_kodi_label_title" : "Kodi Watch", + "conf_kodi_intro" : "The Kodi Watcher enables you to enable and disable the screencapture depending on Kodi state. This is not limited to the same machine, you could observe also a Kodi on any other device at your network.", + "conf_logging_label_intro" : "Area to check log messages, depending on loglevel setting you see more or less information.", + "conf_logging_btn_pbupload" : "Create report for support request", + "conf_logging_btn_autoscroll" : "Auto scrolling", + "conf_logging_nomessage" : "No log messages available.", + "conf_logging_uploading" : "Prepare data...", + "conf_logging_yourlink" : "Link to your report", + "conf_logging_uplfailed" : "Upload failed! Please check your internet connection!", + "conf_webconfig_label_intro" : "Webconfiguration settings. Edit wisely.", + "remote_losthint" : "Note: All changes are lost after a restart.", + "remote_color_label" : "Colors/Effects", + "remote_color_intro" : "Set an effect or color. Also your self created effects are listed (if available). $1", + "remote_color_button_reset" : "Reset Color/Effect", + "remote_color_label_color" : "Color:", + "remote_effects_label_effects" : "Effect:", + "remote_adjustment_label" : "Color adjustment", + "remote_adjustment_intro" : "Modifiy color/brightness/linearization during runtime. $1", + "remote_input_label" : "Source Selection", + "remote_input_intro" : "Hyperion uses a priority system to select a source. Everything you set has a priority (Effect/Color/Platform capture/USB capture and network sources). By default, Hyperion select sources depending on priority (lowest number reflects the current active source). Now you have the opportunity to select sources on your own. $1", + "remote_input_label_autoselect" : "Auto Selection", + "remote_input_setsource_btn" : "Select Source", + "remote_input_sourceactiv_btn" : "Source active", + "remote_input_origin" : "Origin", + "remote_input_owner" : "Type", + "remote_input_priority" : "Priority", + "remote_input_status" : "Status/Action", + "remote_input_duration" : "Duration:", + "remote_input_ip" : "IP:", + "remote_components_label" : "Components control", + "remote_components_intro" : "Enable and disable components of Hyperion during runtime. $1", + "remote_optgroup_usreffets" : "User Effects", + "remote_optgroup_syseffets" : "Provided Effects", + "remote_maptype_label" : "Mapping type", + "remote_maptype_intro" : "Change the mapping type during runtime. $1", + "remote_maptype_label_multicolor_mean" : "Multicolor", + "remote_maptype_label_unicolor_mean" : "Unicolor", + "effectsconfigurator_label_intro" : "Create out of the base effects new effects that are tuned to your liking. Depending on Effect there are options like color, speed, direction and more available.", + "effectsconfigurator_label_chooseeff" : "Choose Base-Effect:", + "effectsconfigurator_button_saveeffect" : "Save Effect", + "effectsconfigurator_label_effectname" : "Effect name", + "effectsconfigurator_button_starttest" : "Start test", + "effectsconfigurator_button_stoptest" : "Stop test", + "effectsconfigurator_button_conttest" : "Continuous test", + "effectsconfigurator_label_deleffect" : "Delete Effect:", + "effectsconfigurator_button_deleffect" : "Delete Effect", + "support_label_title" : "Support Hyperion", + "support_label_intro" : "Hyperion is a free non-profit software. A small team is working on it and this is why we need your steady support.", + "support_label_spreadtheword" : "Spread the word", + "support_label_fbtext" : "Share our Hyperion Facebook page and get a notice when new updates are released", + "support_label_twtext" : "Share and follow on Twitter, be always up to date with latest post about the Hyperion development", + "support_label_ggtext" : "Circle us on Google +!", + "support_label_yttext" : "Bored from pictures? Checkout our Youtube channel!", + "support_label_donate" : "Donate or use our affiliate links", + "support_label_affinstr1" : "Click on the appropriate link of your country", + "support_label_affinstr2" : "Everything you buy (doesn't matter what) we get a small fee based on your turnover", + "support_label_affinstr3" : "You ALWAYS pay the same price, there is absolutely no difference. Try it out!", + "support_label_btctext" : "Address:", + "support_label_donationpp" : "Donation:", + "support_label_webrestitle" : "Information and help ressources", + "support_label_webpagetitle" : "Webpage", + "support_label_webpagetext" : "Home of Hyperion", + "support_label_wikititle" : "Wiki", + "support_label_wikitext" : "The A to Z source for almost everything Hyperion related", + "support_label_forumtitle" : "Forum", + "support_label_forumtext" : "Showcases, discussions, help and more", + "support_label_ghtext" : "Visit us on Github", + "update_label_intro" : "Overview about all available Hyperion versions. On top you could update or downgrade your version of Hyperion whenever you want. Sorted from newest to oldest", + "update_label_description" : "Description:", + "update_button_install" : "Install", + "update_button_changelog" : "Full changelog", + "update_label_type" : "Type:", + "update_versreminder" : "Your version: $1", + "about_version" : "Version", + "about_build" : "Build", + "about_builddate" : "Build date", + "about_translations" : "Translations", + "about_resources" : "$1 libraries", + "about_contribute" : "Add more languages to Hyperion!", + "about_credits" : "Credits to all these developers!", + "info_conlost_label_title" : "Lost connection to Hyperion service!", + "info_conlost_label_reason" : "Possible reasons:", + "info_conlost_label_reason1" : "- Bad WLAN connection", + "info_conlost_label_reason2" : "- You perform an update", + "info_conlost_label_reason3" : "- Hyperion isn't running", + "info_conlost_label_autorecon" : "We reconnect again after Hyperion is available.", + "info_conlost_label_autorefresh" : "This page will be automatically refreshed.", + "info_conlost_label_reload" : "Auto reconnect stopped - limit exceeded, please refresh page or click me.", + "info_restart_title" : "Restarts currently...", + "info_restart_rightback" : "Hyperion will be right back immediately!", + "info_restart_contus" : "If you still hang around here after 20 seconds and you have no clue why please open a new topic at our support forum...", + "info_restart_contusa" : "...with your last steps. Thank you!", + "info_404" : "The page you requested is not available!", + "infoDialog_general_success_title" : "Success", + "infoDialog_general_error_title" : "Error", + "infoDialog_general_warning_title" : "Warning", + "infoDialog_checklist_title" : "Checklist!", + "InfoDialog_leds_validfail_title" : "JSON Validation failed!", + "infoDialog_effconf_deleted_text" : "The effect \"$1\" has been deleted successfully!", + "infoDialog_effconf_created_text" : "The effect \"$1\" has been created successfully!", + "InfoDialog_lang_title" : "Language setting", + "InfoDialog_lang_text" : "If you don't like the result of the automatic language detection you could overwrite it here.", + "InfoDialog_access_title" : "Settings level", + "InfoDialog_access_text" : "Depending on settings level you could adjust more options or get access to more features. Recommended is the \"Default\" level.", + "InfoDialog_nowrite_title" : "write permission error!", + "InfoDialog_nowrite_text" : "Hyperion can't write to your current loaded configuration file. Please repair the file permissions to proceed.", + "InfoDialog_nowrite_foottext" : "The WebUI will be unlocked automatically after you solved the problem!", + "infoDialog_wizrgb_text" : "Your RGB Byte Order is already well adjusted.", + "infoDialog_writeconf_error_text" : "Saving your configuration failed.", + "infoDialog_import_jsonerror_text" : "The selected configuration file \"$1\" is no .json file or it's corrupted. Error message: ($2)", + "infoDialog_import_hyperror_text" : "The selected configuration file \"$1\" can't be imported. It's not compatible with Hyperion 2.0 and higher!", + "infoDialog_import_reverror_text" : "The revision of your configuration file \"$1\" doesnt match the current Hyperion version you run (File: $2, Hyperion: $3). You could just import matching configurations!", + "infoDialog_import_comperror_text" : "Sad! Your browser doesn't support a import. Please try again with another browser.", + "infoDialog_import_confirm_title" : "Confirm import", + "infoDialog_import_confirm_text" : "Are you sure to import \"$1\"? This process can't be reverted!", + "wiz_rgb_title" : "RGB Byte Order Wizard", + "wiz_rgb_intro1" : "This wizard will guide you through the finding process of the correct color order for your leds. Click on continue to begin.", + "wiz_rgb_intro2" : "When do you need this wizard? Example: You set the color red, but you get green or blue. You could also use it for first configuration.", + "wiz_rgb_expl" : "The color dot switches every x seconds the color (red, green), at the same time your leds switch the color too. Answer the questions at the bottom to check/correct your byte order.", + "wiz_rgb_switchevery" : "Switch color every...", + "wiz_rgb_q" : "Which color show your leds, when the color dot above shows...", + "wiz_rgb_qrend" : "...red?", + "wiz_rgb_qgend" : "...green?", + "wiz_hue_title" : "Hue Bridge Wizard", + "wiz_hue_intro1" : "With this Setup Helper you can get a new User for your Hue Bridge and you can see your Lights with the IDs for Hyperion Configuration.", + "wiz_hue_intro2" : "Remember: This is only a wizard. You have to copy and paste them in your config.", + "wiz_hue_ip" : "Hue Bridge IP:", + "wiz_hue_username" : "Username:", + "wiz_hue_create_user" : "Create User", + "wiz_hue_failure_ip" : "Please check your IP Address.", + "wiz_hue_failure_connection" : "Connection Timeout. Please press the button in time.", + "wiz_hue_press_link" : "Please press link button on the Hue Bridge.", + "wiz_cc_title" : "Color calibration wizard", + "wiz_cc_intro1" : "This wizard will guide you through your led calibration. If you are using Kodi, the calibration pictures and videos can be send directly to kodi without further tasks on your side. If not, you need to download these files yourself and apply them, if the wizard wants it.", + "wiz_cc_kwebs" : "Kodi webserver (IP:Port)", + "wiz_cc_kodidiscon" : "Kodi webserver not found, proceed without Kodi support.", + "wiz_cc_kodidisconlink" : "Download link pictures:", + "wiz_cc_kodicon" : "Kodi webserver found, proceed with Kodi support.", + "wiz_cc_kodimsg_start" : "Test success - time to proceed!", + "wiz_cc_kodishould" : "Kodi should show the following picture: $1", + "wiz_cc_lettvshow" : "Let your TV show the following picture: $1", + "wiz_cc_lettvshowm" : "Check this with the following pictures: $1", + "wiz_cc_adjustit" : "Adjust your \"$1\", until your are fine with it. Take notice: The more you adjust away from the default value the color spectrum will be limited (Also for all colors in between). Depending on TV/LED color spectrum the results will vary.", + "wiz_cc_adjustgamma" : "Gamma: What you have to do is, adjust gamma levels of each channel until you have the same perceived amount of each channel. For example, if your Grey is a bit reddish it means that you have to increase red gamma to reduce the amount of red (the more gamma, the less amount of color).", + "wiz_cc_chooseid" : "Define a name for this profile.", + "wiz_cc_btn_switchpic" : "Switch picture", + "wiz_cc_backlight" : "Additional you could define a backlight to sort out \"bad colors\" on nearly dark areas or if you don't like the switch between color and off during watching. Additional you could define if there should be some color in it or just white. This is disabled during the state \"Off\" ,\"Color\" and \"Effect\".", + "wiz_cc_testintro" : "Time for a real test!", + "wiz_cc_testintrok" : "Push on a button below to start a test video.", + "wiz_cc_testintrowok" : "Checkout the following link to download test videos:", + "wiz_cc_link" : "Click me!", + "wiz_cc_morethanone" : "You have more than one profile, please choose the profile you want to calibrate.", + "wiz_cc_btn_stop" : "Stop video", + "wiz_cc_summary" : "A conclusen of your settings. During video playback, you could change or test values again. If you are done, click on save.", + "edt_dev_enum_subtract_minimum" : "Substract minimum", + "edt_dev_enum_sub_min_warm_adjust" : "Min warm adjust", + "edt_dev_enum_white_off" : "White off", + "edt_dev_general_heading_title" : "General Settings", + "edt_dev_general_name_title" : "Configuration name", + "edt_dev_general_ledCount_title" : "Count of all hardware LEDs", + "edt_dev_general_colorOrder_title" : "RGB byte order", + "edt_dev_general_rewriteTime_title" : "Refresh time", + "edt_dev_spec_header_title" : "Specific Settings", + "edt_dev_spec_baudrate_title" : "Baudrate", + "edt_dev_spec_spipath_title" : "SPI path", + "edt_dev_spec_invert_title" : "Invert signal", + "edt_dev_spec_multicastGroup_title" : "Multicast group", + "edt_dev_spec_numberOfLeds_title" : "Number of LEDs", + "edt_dev_spec_port_title" : "Port", + "edt_dev_spec_orbIds_title" : "Orb ID(s)", + "edt_dev_spec_useOrbSmoothing_title" : "Use orb smoothing", + "edt_dev_spec_targetIp_title" : "Target IP", + "edt_dev_spec_targetIpHost_title" : "Target IP/hostname", + "edt_dev_spec_outputPath_title" : "Output path", + "edt_dev_spec_delayAfterConnect_title" : "Delay after connect", + "edt_dev_spec_FCsetConfig_title" : "Set fadecandy configuration", + "edt_dev_spec_FCmanualControl_title" : "Manual control of fadecandy LED", + "edt_dev_spec_FCledToOn_title" : "Fadecandy LED set to on", + "edt_dev_spec_interpolation_title" : "Interpolation", + "edt_dev_spec_dithering_title" : "Dithering", + "edt_dev_spec_gamma_title" : "Gamma", + "edt_dev_spec_whitepoint_title" : "Whitepoint", + "edt_dev_spec_username_title" : "Username", + "edt_dev_spec_lightid_title" : "Light ID(s)", + "edt_dev_spec_lightid_itemtitle" : "ID", + "edt_dev_spec_transistionTime_title" : "Transistion time", + "edt_dev_spec_switchOffOnBlack_title" : "Switch off on black", + "edt_dev_spec_uid_title" : "UID", + "edt_dev_spec_intervall_title" : "Intervall", + "edt_dev_spec_latchtime_title" : "Latch time", + "edt_dev_spec_maxPacket_title" : "Max packet", + "edt_dev_spec_serial_title" : "Serial number", + "edt_dev_spec_vid_title" : "VID", + "edt_dev_spec_pid_title" : "PID", + "edt_dev_spec_cid_title" : "CID", + "edt_dev_spec_LBap102Mode_title" : "LightBerry APA102 Mode", + "edt_dev_spec_universe_title" : "Universe", + "edt_dev_spec_whiteLedAlgor_title" : "White LED algorithm", + "edt_dev_spec_useRgbwProtocol_title" : "Use RGBW protocol", + "edt_dev_spec_maximumLedCount_title" : "Maximum LED count", + "edt_dev_spec_gpioNumber_title" : "GPIO number", + "edt_dev_spec_gpioMap_title" : "GPIO mapping", + "edt_dev_spec_PBFiFo_title" : "Pi-Blaster FiFo", + "edt_dev_spec_gpioBcm_title" : "GPIO Pin", + "edt_dev_spec_ledIndex_title" : "LED index", + "edt_dev_spec_colorComponent_title" : "Color component", + "edt_conf_general_enable_title" : "Activate", + "edt_conf_general_enable_expl" : "If checked, the component is enabled.", + "edt_conf_general_priority_title" : "Priority channel", + "edt_conf_general_priority_expl" : "The priority of this component", + "edt_conf_general_port_title" : "Port", + "edt_conf_general_port_expl" : "The port that is used.", + "edt_conf_enum_color" : "Color", + "edt_conf_enum_effect" : "Effect", + "edt_conf_enum_multicolor_mean" : "Multicolor", + "edt_conf_enum_unicolor_mean" : "Unicolor", + "edt_conf_enum_rgb" : "RGB", + "edt_conf_enum_bgr" : "BGR", + "edt_conf_enum_rbg" : "RBG", + "edt_conf_enum_brg" : "BRG", + "edt_conf_enum_gbr" : "GBR", + "edt_conf_enum_grb" : "GRB", + "edt_conf_enum_linear" : "Linear", + "edt_conf_enum_PAL" : "PAL", + "edt_conf_enum_NTSC" : "NTSC", + "edt_conf_enum_logsilent" : "Silent", + "edt_conf_enum_logwarn" : "Warning", + "edt_conf_enum_logverbose" : "Verbose", + "edt_conf_enum_logdebug" : "Debug", + "edt_conf_enum_bbdefault" : "Default", + "edt_conf_enum_bbclassic" : "Classic", + "edt_conf_enum_bbosd" : "OSD", + "edt_conf_gen_heading_title" : "General Settings", + "edt_conf_gen_name_title" : "Configuration name", + "edt_conf_gen_name_expl" : "A user defined name which is used to detect Hyperion. (Helpful with more than one Hyperion instance)", + "edt_conf_gen_showOptHelp_title" : "Show explanations", + "edt_conf_gen_showOptHelp_expl" : "Show all available explanations in each section. Highly recommended for beginners!", + "edt_conf_color_heading_title" : "Color Calibration", + "edt_conf_color_channelAdjustment_header_itemtitle" : "Profile", + "edt_conf_color_channelAdjustment_header_title" : "Color channel adjustments", + "edt_conf_color_channelAdjustment_header_expl": "Adjustments for color, brightness, linearization and more.", + "edt_conf_color_imageToLedMappingType_title" : "Led area assignment", + "edt_conf_color_imageToLedMappingType_expl" : "Overwrites the led area assignment of your led layout if it's not \"multicolor\"", + "edt_conf_color_id_title" : "ID", + "edt_conf_color_id_expl" : "User given name", + "edt_conf_color_leds_title" : "LED index", + "edt_conf_color_leds_expl" : "Assign this adjustment to all leds (*) or just some (0-24).", + "edt_conf_color_black_title" : "black", + "edt_conf_color_black_expl" : "The calibrated black value.", + "edt_conf_color_white_title" : "white", + "edt_conf_color_white_expl" : "The calibrated white value.", + "edt_conf_color_red_title" : "red", + "edt_conf_color_red_expl" : "The calibrated red value.", + "edt_conf_color_green_title" : "green", + "edt_conf_color_green_expl" : "The calibrated green value.", + "edt_conf_color_blue_title" : "blue", + "edt_conf_color_blue_expl" : "The calibrated blue value.", + "edt_conf_color_cyan_title" : "cyan", + "edt_conf_color_cyan_expl" : "The calibrated cyan value.", + "edt_conf_color_magenta_title" : "magenta", + "edt_conf_color_magenta_expl" : "The calibrated magenta value.", + "edt_conf_color_yellow_title" : "yellow", + "edt_conf_color_yellow_expl" : "The calibrated yellow value.", + "edt_conf_color_gammaRed_title" : "gamma red", + "edt_conf_color_gammaRed_expl" : "The gamma of red.", + "edt_conf_color_gammaGreen_title" : "gamma green", + "edt_conf_color_gammaGreen_expl" : "The gamma of green.", + "edt_conf_color_gammaBlue_title" : "gamma blue", + "edt_conf_color_gammaBlue_expl" : "The gamma of blue.", + "edt_conf_color_backlightThreshold_title" : "Backlight threshold", + "edt_conf_color_backlightThreshold_expl" : "The minimum amount of brightness (backlight). Disabled during effects, colors and in status \"Off\"", + "edt_conf_color_backlightColored_title" : "Colored backlight", + "edt_conf_color_backlightColored_expl" : "Add some color to your backlight.", + "edt_conf_color_brightness_title" : "maximal brightness", + "edt_conf_color_brightness_expl" : "From 0.0 to 0.5 the brightness is linearised, from 0.5 to 1.0 cyan, magenta, yellow is up to 2x brighter and white 3x.", + "edt_conf_smooth_heading_title" : "Smoothing", + "edt_conf_smooth_type_title" : "Type", + "edt_conf_smooth_type_expl" : "Type of smoothing.", + "edt_conf_smooth_time_ms_title" : "Time", + "edt_conf_smooth_time_ms_expl" : "How long should the smoothing gather pictures?", + "edt_conf_smooth_updateFrequency_title" : "Update frequency", + "edt_conf_smooth_updateFrequency_expl" : "The output speed to your led controller.", + "edt_conf_smooth_updateDelay_title" : "Update delay", + "edt_conf_smooth_updateDelay_expl" : "Delay the output in case your ambient light is faster than your TV.", + "edt_conf_smooth_continuousOutput_title" : "Continuous output", + "edt_conf_smooth_continuousOutput_expl" : "Update the leds even there is no changed picture.", + "edt_conf_v4l2_heading_title" : "USB Capture", + "edt_conf_v4l2_device_title" : "Device", + "edt_conf_v4l2_device_expl" : "The path to the usb capture.", + "edt_conf_v4l2_input_title" : "Input", + "edt_conf_v4l2_input_expl" : "Input of this path.", + "edt_conf_v4l2_standard_title" : "Video standard", + "edt_conf_v4l2_standard_expl" : "Select the video standard for your region.", + "edt_conf_v4l2_width_title" : "Width", + "edt_conf_v4l2_width_expl" : "The width of the picture. (-1 = auto width)", + "edt_conf_v4l2_height_title" : "Height", + "edt_conf_v4l2_height_expl" : "The height of the picture. (-1 = auto height)", + "edt_conf_v4l2_frameDecimation_title" : "Frame decimation", + "edt_conf_v4l2_frameDecimation_expl" : "The factor of frame decimation", + "edt_conf_v4l2_sizeDecimation_title" : "Size decimation", + "edt_conf_v4l2_sizeDecimation_expl" : "The factor of size decimation", + "edt_conf_v4l2_mode_title" : "Mode", + "edt_conf_v4l2_mode_expl" : "Modus of USB capture", + "edt_conf_v4l2_useKodiChecker_title" : "Use Kodi Watch", + "edt_conf_v4l2_useKodiChecker_expl" : "Start/stop capturing with Kodi Watch results.", + "edt_conf_v4l2_cropLeft_title" : "Crop left", + "edt_conf_v4l2_cropLeft_expl" : "Count of pixels on the left side that are removed from the picture.", + "edt_conf_v4l2_cropRight_title" : "Crop right", + "edt_conf_v4l2_cropRight_expl" : "Count of pixels on the right side that are removed from the picture.", + "edt_conf_v4l2_cropTop_title" : "Crop top", + "edt_conf_v4l2_cropTop_expl" : "Count of pixels on the top side that are removed from the picture.", + "edt_conf_v4l2_cropBottom_title" : "Crop bottom", + "edt_conf_v4l2_cropBottom_expl" : "Count of pixels on the bottom side that are removed from the picture.", + "edt_conf_v4l2_redSignalThreshold_title" : "Red signal threshold", + "edt_conf_v4l2_redSignalThreshold_expl" : "Darkens low red values (recognized as black)", + "edt_conf_v4l2_greenSignalThreshold_title" : "Green signal threshold", + "edt_conf_v4l2_greenSignalThreshold_expl" : "Darkens low green values (recognized as black)", + "edt_conf_v4l2_blueSignalThreshold_title" : "Blue signal threshold", + "edt_conf_v4l2_blueSignalThreshold_expl" : "Darkens low blue values (recognized as black)", + "edt_conf_fg_heading_title" : "Platform Capture", + "edt_conf_fg_type_title" : "Type", + "edt_conf_fg_type_expl" : "Type of platform capture, default is 'auto'", + "edt_conf_fg_frequency_Hz_title" : "Capture frequency", + "edt_conf_fg_frequency_Hz_expl" : "How fast new pictures are captured", + "edt_conf_fg_horizontalPixelDecimation_title" : "Horizontal pixel decimation", + "edt_conf_fg_horizontalPixelDecimation_expl" : "Horizontal pixel decimation (factor)", + "edt_conf_fg_width_title" : "Width", + "edt_conf_fg_width_expl" : "Shrink picture to this width, as raw picture needs a lot of cpu time.", + "edt_conf_fg_height_title" : "Height", + "edt_conf_fg_height_expl" : "Shrink picture to this height, as raw material needs a lot of cpu time.", + "edt_conf_fg_useXGetImage_title" : "Use XGetImage", + "edt_conf_fg_useXGetImage_expl" : "XGetImage for newer X11 desktops", + "edt_conf_fg_verticalPixelDecimation_title" : "Vertical pixel decimation", + "edt_conf_fg_verticalPixelDecimation_expl" : "Vertical pixel decimation (factor)", + "edt_conf_fg_device_title" : "Device", + "edt_conf_fg_display_title" : "Display", + "edt_conf_fg_display_expl" : "Select which desktop should be captured (multi monitor setup)", + "edt_conf_bb_heading_title" : "Blackbar detector", + "edt_conf_bb_threshold_title" : "Threshold", + "edt_conf_bb_threshold_expl" : "If the detection doesn't work, higher the threshold to adjust on 'greyish' black", + "edt_conf_bb_unknownFrameCnt_title" : "unknownFrameCnt", + "edt_conf_bb_borderFrameCnt_title" : "borderFrameCnt", + "edt_conf_bb_maxInconsistentCnt_title" : "maxInconsistentCn", + "edt_conf_bb_blurRemoveCnt_title" : "blurRemoveCnt", + "edt_conf_bb_mode_title" : "Mode", + "edt_conf_bb_mode_expl" : "Algorithm for processing. (see Wiki)", + "edt_conf_kodic_heading_title" : "Kodi Watch", + "edt_conf_kodic_kodiAddress_title" : "Kodi IP address", + "edt_conf_kodic_kodiAddress_expl" : "The IP address of Kodi.", + "edt_conf_kodic_kodiTcpPort_title" : "Kodi TCP port", + "edt_conf_kodic_kodiTcpPort_expl" : "The TCP port of Kodi. Don't use the webserver port!", + "edt_conf_kodic_grabVideo_title" : "Video", + "edt_conf_kodic_grabVideo_expl" : "If checked, the capturing is enabled during video playback, else it's disabled.", + "edt_conf_kodic_grabPictures_title" : "Pictures", + "edt_conf_kodic_grabPictures_expl" : "If checked, the capturing is enabled on picture playback, else it's disabled.", + "edt_conf_kodic_grabAudio_title" : "Audio", + "edt_conf_kodic_grabAudio_expl" : "If checked, the capturing is enabled during audio playback, else it's disabled.", + "edt_conf_kodic_grabMenu_title" : "Menu", + "edt_conf_kodic_grabMenu_expl" : "If checked, the capturing is enabled in menu and login screen, else it's disabled.", + "edt_conf_kodic_grabPause_title" : "Pause", + "edt_conf_kodic_grabPause_expl" : "If checked, the capturing is enabled in pause mode (Music, Video, Diashow), else it's disabled.", + "edt_conf_kodic_grabScreensaver_title" : "Screensaver", + "edt_conf_kodic_grabScreensaver_expl" : "If checked, the capturing is enabled during screensaver, else it's disabled.", + "edt_conf_kodic_enable3DDetection_title" : "Detect 3D", + "edt_conf_kodic_enable3DDetection_expl" : "Detect which 3D mode Kodi is running. (no MVC and not for USB capture)", + "edt_conf_fge_heading_title" : "Boot Effect/Color", + "edt_conf_fge_type_title" : "Type", + "edt_conf_fge_type_expl" : "Choose between a color of effect.", + "edt_conf_fge_color_title" : "Color", + "edt_conf_fge_color_expl" : "If type is \"Color\", set a color of your choice here.", + "edt_conf_fge_effect_title" : "Effect", + "edt_conf_fge_effect_expl" : "If type is \"Effect\", select a effect of your choice (Also self created effects).", + "edt_conf_fge_duration_ms_title" : "Duration", + "edt_conf_fge_duration_ms_expl" : "Duration of Effect/Color during Hyperion startup.", + "edt_conf_bge_heading_title" : "Background Effect/Color", + "edt_conf_fw_heading_title" : "Forwarder", + "edt_conf_fw_json_title" : "List of json clients", + "edt_conf_fw_json_expl" : "One json target per line. Contains IP:PORT (Example: 127.0.0.1:19446)", + "edt_conf_fw_json_itemtitle" : "Json target", + "edt_conf_fw_proto_title" : "List of proto clients", + "edt_conf_fw_proto_expl" : "One proto target per line. Contains IP:PORT (Example: 127.0.0.1:19447)", + "edt_conf_fw_proto_itemtitle" : "Proto target", + "edt_conf_js_heading_title" : "JSON Server", + "edt_conf_ps_heading_title" : "PROTO Server", + "edt_conf_bobls_heading_title" : "Boblight Server", + "edt_conf_udpl_heading_title" : "UDP Listener", + "edt_conf_udpl_address_title" : "Address", + "edt_conf_udpl_address_expl" : "The address where UDP packages are accepted.", + "edt_conf_udpl_timeout_title" : "Timeout", + "edt_conf_udpl_timeout_expl" : "If no packages are received for the given period, the component will be (soft) disabled.", + "edt_conf_udpl_shared_title" : "Shared", + "edt_conf_udpl_shared_expl" : "Shared across all Hyperion instances.", + "edt_conf_webc_heading_title" : "Web Configuration", + "edt_conf_webc_docroot_title" : "Document Root", + "edt_conf_webc_docroot_expl" : "Local webinterface root path (just for webui developer)", + "edt_conf_effp_heading_title" : "Effekt Paths", + "edt_conf_effp_paths_title" : "Effect Path(s)", + "edt_conf_effp_paths_expl" : "You could define more folders that contain effects. The effect configurator will always save inside the first folder.", + "edt_conf_effp_paths_itemtitle" : "Path", + "edt_conf_effp_disable_title" : "Disabed Effects", + "edt_conf_effp_disable_itemtitle" : "Effect", + "edt_conf_log_heading_title" : "Logging", + "edt_conf_log_level_title" : "Log-Level", + "edt_conf_log_level_expl" : "Depending on loglevel you see less or more messages in your log.", + "edt_eff_candle_header_title" : "Candle", + "edt_eff_police_header_title" : "Police", + "edt_eff_fade_header_title" : "Fade", + "edt_eff_rainbowmood_header_title" : "Rainbow Mood", + "edt_eff_knightrider_header_title" : "Knight Rider", + "edt_eff_lightclock_header_title" : "Clock 1", + "edt_eff_clock_header_title" : "Clock 2", + "edt_eff_pacman_header_title" : "Pac-Man", + "edt_eff_moodblobs_header_title" : "Mood Blobs", + "edt_eff_rainbowswirl_header_title" : "Rainbow Swirl", + "edt_eff_random_header_title" : "Random", + "edt_eff_runningdots_header_title" : "Running Dots", + "edt_eff_systemshutdown_header_title" : "System Shutdown", + "edt_eff_snake_header_title" : "Snake", + "edt_eff_sparks_header_title" : "Sparks", + "edt_eff_storbe_header_title" : "Strobe", + "edt_eff_traces_header_title" : "Color Traces", + "edt_eff_x-mas_header_title" : "X-Mas", + "edt_eff_trails_header_title" : "Trails", + "edt_eff_enum_all" : "All", + "edt_eff_enum_all-together" : "All together", + "edt_eff_enum_list" : "LED List", + "edt_eff_count_title" : "Count", + "edt_eff_color_title" : "Color", + "edt_eff_colorrandom_title" : "Random color", + "edt_eff_colorone_title" : "Color one", + "edt_eff_colortwo_title" : "Color two", + "edt_eff_colorcount_title" : "Color length", + "edt_eff_rotationtime_title" : "Rotation time", + "edt_eff_sleeptime_title" : "Sleep time", + "edt_eff_reversedirection_title" : "Reverse direction", + "edt_eff_fadetime_title" : "Fade time", + "edt_eff_colorstart_title" : "Color start", + "edt_eff_colorend_title" : "Color end", + "edt_eff_colorshift_title" : "Color Shift", + "edt_eff_whichleds_title" : "Which Leds", + "edt_eff_ledlist_title" : "Led List", + "edt_eff_speed_title" : "Speed", + "edt_eff_fadefactor_title" : "Fade factor", + "edt_eff_showseconds_title" : "Show seconds", + "edt_eff_blobcount_title" : "Blob count", + "edt_eff_huechange_title" : "Color change", + "edt_eff_basecolorchange_title" : "Base color change", + "edt_eff_basecolorchangerate_title" : "BC change rate", + "edt_eff_basecolorrangeleft_title" : "BC range left", + "edt_eff_basecolorrangeright_title" : "BC range right", + "edt_eff_brightness_title" : "Brightness", + "edt_eff_centerx_title" : "Center X-Axis", + "edt_eff_centery_title" : "Center Y-Axis", + "edt_eff_saturation_title" : "Saturation", + "edt_eff_colorevel_title" : "Color level", + "edt_eff_whitelevel_title" : "White level", + "edt_eff_alarmcolor_title" : "Alarm color", + "edt_eff_postcolor_title" : "Post color", + "edt_eff_enableshutdown_title" : "Real shutdown", + "edt_eff_length_title" : "Length", + "edt_eff_frequency_title" : "Frequency", + "edt_eff_min_len_title" : "Minimal length", + "edt_eff_max_len_title" : "Maximal length", + "edt_eff_height_title" : "Height", + "edt_eff_offset_title" : "Offset", + "edt_eff_colorHour_title" : "Color hour", + "edt_eff_colorMinute_title" : "Color minute", + "edt_eff_colorSecond_title" : "Color second", + "edt_eff_hourMargin_title" : "Margin hour", + "edt_eff_minuteMargin_title" : "Margin minute", + "edt_eff_secondMargin_title" : "Margin second", + "edt_eff_margin_title" : "Margin", + "edt_eff_colorMarker_title" : "Color marker", + "edt_append_ns" : "ns", + "edt_append_ms" : "ms", + "edt_append_s" : "s", + "edt_append_hz" : "Hz", + "edt_append_pixel" : "Pixel", + "edt_append_percent" : "%", + "edt_append_degree" : "°", + "edt_append_sdegree" : "s/degree", + "edt_append_leds" : "LEDs", + "edt_msg_error_notset" : "Property must be set", + "edt_msg_error_notempty" : "Value required", + "edt_msg_error_enum" : "Value must be one of the enumerated values", + "edt_msg_error_anyOf" : "Value must validate against at least one of the provided schemas", + "edt_msg_error_oneOf" : "Value must validate against exactly one of the provided schemas. It currently validates against $1 of the schemas.", + "edt_msg_error_not" : "Value must not validate against the provided schema", + "edt_msg_error_type_union" : "Value must be one of the provided types", + "edt_msg_error_type" : "Value must be of type $1", + "edt_msg_error_disallow_union" : "Value must not be one of the provided disallowed types", + "edt_msg_error_disallow" : "Value must not be of type $1", + "edt_msg_error_multipleOf" : "Value must be a multiple of $1", + "edt_msg_error_maximum_excl" : "Value must be less than $1", + "edt_msg_error_maximum_incl" : "Value must be at most $1", + "edt_msg_error_minimum_excl" : "Value must be greater than $1", + "edt_msg_error_minimum_incl" : "Value must be at least $1", + "edt_msg_error_maxLength" : "Value must be at most $1 characters long", + "edt_msg_error_minLength" : "Value must be at least $1 characters long", + "edt_msg_error_pattern" : "Value must match the pattern", + "edt_msg_error_additionalItems" : "No additional items allowed in this array", + "edt_msg_error_maxItems" : "Value must have at most $1 items", + "edt_msg_error_minItems" : "Value must have at least $1 items", + "edt_msg_error_uniqueItems" : "Array must have unique items", + "edt_msg_error_maxProperties" : "Object must have at most $1 properties", + "edt_msg_error_minProperties" : "Object must have at least $1 properties", + "edt_msg_error_required" : "Object is missing the required property '$1'", + "edt_msg_error_additional_properties" : "No additional properties allowed, but property $1 is set", + "edt_msg_error_dependency" : "Must have property $1", + "edt_msg_button_delete_all" : "All", + "edt_msg_button_delete_all_title" : "Delete All", + "edt_msg_button_delete_last" : "Last $1", + "edt_msg_button_delete_last_title" : "Delete Last $1", + "edt_msg_button_add_row_title" : "Add $1", + "edt_msg_button_move_down_title" : "Move down", + "edt_msg_button_move_up_title" : "Move up", + "edt_msg_button_delete_row_title" : "Delete $1", + "edt_msg_button_delete_row_title_short" : "Delete", + "edt_msg_button_collapse" : "Collapse", + "edt_msg_button_expand" : "Expand" } diff --git a/assets/webconfig/index.html b/assets/webconfig/index.html index 92f59248..d0490abc 100644 --- a/assets/webconfig/index.html +++ b/assets/webconfig/index.html @@ -7,49 +7,42 @@ - Hyperion - Error + Hyperion - Web Configuration - + - - - - - - + + - - + + - + - - - - - - + + + + + + - - - - + - + - - + + - + @@ -87,16 +80,6 @@ - + @@ -254,25 +260,29 @@
- + - + - + - - - + + + - - - + + + - + + + + + diff --git a/assets/webconfig/js/content_dashboard.js b/assets/webconfig/js/content_dashboard.js index 5b0c24de..47159064 100644 --- a/assets/webconfig/js/content_dashboard.js +++ b/assets/webconfig/js/content_dashboard.js @@ -1,6 +1,53 @@ $(document).ready( function() { performTranslation(); + function newsCont(t,e,l) + { + var h = '
'; + h += '

'+t+'

'; + h += e; + h += ''+$.i18n('dashboard_newsbox_readmore')+''; + h += '

'; + $('#dash_news').append(h); + } + + function createNews(d) + { + for(var i = 0; i 5) + break; + + title = d[i].title.rendered; + excerpt = d[i].excerpt.rendered; + link = d[i].link+'?pk_campaign=WebUI&pk_kwd=post_'+d[i].slug; + + newsCont(title,excerpt,link); + } + } + + function getNews() + { + var h = ''+$.i18n('dashboard_newsbox_noconn')+''; + $.ajax({ + url: 'https://hyperion-project.org/wp-json/wp/v2/posts?_embed', + dataType: 'json', + type: 'GET', + timeout: 2000 + }) + .done( function( data, textStatus, jqXHR ) { + if(jqXHR.status == 200) + createNews(data); + else + $('#dash_news').html(h); + }) + .fail( function( jqXHR, textStatus ) { + $('#dash_news').html(h); + }); + } + + //getNews(); + function updateComponents() { var components = serverInfo.info.components; @@ -12,13 +59,11 @@ $(document).ready( function() { $("#tab_components").html(components_html); } - // get active led device - var leddevice = serverInfo.info.ledDevices.active; - $('#dash_leddevice').html(leddevice); - - // get host - var hostname = serverInfo.info.hostname; - $('#dash_systeminfo').html(hostname+':'+jsonPort); + // add more info + $('#dash_leddevice').html(serverInfo.info.ledDevices.active); + $('#dash_currv').html(currentVersion); + $('#dash_instance').html(serverConfig.general.name); + $('#dash_ports').html(jsonPort+' | '+serverConfig.protoServer.port); $.get( "https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/version.json", function( data ) { parsedUpdateJSON = JSON.parse(data); @@ -26,8 +71,7 @@ $(document).ready( function() { var cleanLatestVersion = latestVersion.replace(/\./g, ''); var cleanCurrentVersion = currentVersion.replace(/\./g, ''); - $('#currentversion').html(currentVersion); - $('#latestversion').html(latestVersion); + $('#dash_latev').html(latestVersion); if ( cleanCurrentVersion < cleanLatestVersion ) $('#versioninforesult').html('
'+$.i18n('dashboard_infobox_message_updatewarning', latestVersion)+'
'); @@ -35,6 +79,24 @@ $(document).ready( function() { $('#versioninforesult').html('
'+$.i18n('dashboard_infobox_message_updatesuccess')+'
'); }); + //determine platform + var grabbers = serverInfo.info.grabbers.available; + var html = ""; + + if(grabbers.indexOf('dispmanx') > -1) + html += 'Raspberry Pi'; + else if(grabbers.indexOf('x11') > -1) + html += 'X86'; + else if(grabbers.indexOf('osx') > -1) + html += 'OSX'; + else if(grabbers.indexOf('amlogic') > -1) + html += 'Amlogic'; + else + html += 'Framebuffer'; + + $('#dash_platform').html(html); + + //interval update updateComponents(); $(hyperion).on("cmd-serverinfo",updateComponents); diff --git a/assets/webconfig/js/content_effects.js b/assets/webconfig/js/content_effects.js index cebda5c4..9e96fe9a 100644 --- a/assets/webconfig/js/content_effects.js +++ b/assets/webconfig/js/content_effects.js @@ -99,13 +99,17 @@ $(document).ready( function() { }); $('#btn_submit_foregroundEffect').off().on('click',function() { - //requestWriteConfig(foregroundEffect_editor.getValue()); - console.log(foregroundEffect_editor.getValue()); + var value = foregroundEffect_editor.getValue(); + if(typeof value.foregroundEffect.effect == 'undefined') + value.foregroundEffect.effect = serverConfig.foregroundEffect.effect; + requestWriteConfig(value); }); $('#btn_submit_backgroundEffect').off().on('click',function() { - //requestWriteConfig(backgroundEffect_editor.getValue()); - console.log(backgroundEffect_editor.getValue()); + var value = backgroundEffect_editor.getValue(); + if(typeof value.backgroundEffect.effect == 'undefined') + value.backgroundEffect.effect = serverConfig.backgroundEffect.effect; + requestWriteConfig(value); }); //create introduction diff --git a/assets/webconfig/js/content_grabber.js b/assets/webconfig/js/content_grabber.js index 3483a973..451cd1e1 100644 --- a/assets/webconfig/js/content_grabber.js +++ b/assets/webconfig/js/content_grabber.js @@ -3,6 +3,14 @@ $(document).ready( function() { var conf_editor_v4l2 = null; var conf_editor_fg = null; + function hideEl(el) + { + for(var i = 0; i -1) + hideEl(["device","verticalPixelDecimation","horizontalPixelDecimation","useXGetImage"]); + else if(grabbers.indexOf('x11') > -1) + hideEl(["device","width","height"]); + else if(grabbers.indexOf('osx') > -1 || grabbers.indexOf('amlogic') > -1) + hideEl(["device","verticalPixelDecimation","horizontalPixelDecimation","useXGetImage","cropLeft","cropBottom","cropTop","cropRight"]); + }); + removeOverlay(); }); diff --git a/assets/webconfig/js/content_index.js b/assets/webconfig/js/content_index.js index d8e37e10..dcd0cf93 100644 --- a/assets/webconfig/js/content_index.js +++ b/assets/webconfig/js/content_index.js @@ -67,8 +67,9 @@ $(document).ready( function() { initRestart(); }); - $(".mnava").on('click', function(e){ + $(".mnava").bind('click.menu', function(e){ loadContent(e); + window.scrollTo(0, 0); }); }); diff --git a/assets/webconfig/js/content_leds.js b/assets/webconfig/js/content_leds.js index 2cc1001f..cb5a860c 100644 --- a/assets/webconfig/js/content_leds.js +++ b/assets/webconfig/js/content_leds.js @@ -2,16 +2,6 @@ var ledsCustomCfgInitialized = false; var finalLedArray = []; -function validateText(){ - e = isJsonString($("#ledconfig").val()); - - if (e.length != 0){ - showInfoDialog("error", $.i18n('InfoDialog_leds_validfail_title'), e); - return false - } - return true -} - function round(number) { var factor = Math.pow(10, 4); var tempNumber = number * factor; @@ -35,7 +25,7 @@ function createLedPreview(leds, origin){ } $('#previewledcount').html($.i18n('conf_leds_layout_preview_totalleds', leds.length)); - $('#previewledpower').html($.i18n('conf_leds_layout_preview_ledpower', (leds.length * 0.06).toFixed(1))); + $('#previewledpower').html($.i18n('conf_leds_layout_preview_ledpower', ((leds.length * 0.06)*1.1).toFixed(1))); $('.st_helper').css("border", "8px solid grey"); @@ -106,7 +96,7 @@ function createClassicLeds(){ } function rotateArray(array, times){ - if (times > "0"){ + if (times > 0){ while( times-- ){ array.push(array.shift()) } @@ -366,35 +356,70 @@ $(document).ready(function() { // bind change event to all inputs $('.ledCLconstr').bind("change", function() { + valValue(this.id,this.value,this.min,this.max); createClassicLeds(); }); $('.ledMAconstr').bind("change", function() { + valValue(this.id,this.value,this.min,this.max); createMatrixLeds(); }); - - // cl leds push to textfield and save values - $('#btn_cl_generate').off().on("click", function() { - if (finalLedArray != ""){ - $("#ledconfig").text(JSON.stringify(finalLedArray, null, "\t")); - $('#collapse1').collapse('hide'); - $('#collapse4').collapse('show'); - } - }); - - // ma leds push to textfield and save values - $('#btn_ma_generate').off().on("click", function() { - if (finalLedArray != ""){ - $("#ledconfig").text(JSON.stringify(finalLedArray, null, "\t")); - $('#collapse2').collapse('hide'); - $('#collapse4').collapse('show'); - } - }); - // fill textfield with current led conf and copy to finalLedArray - $("#ledconfig").text(JSON.stringify(serverConfig.leds, null, "\t")); + // v4 of json schema with diff required assignment - remove when hyperion schema moved to v4 + var ledschema = {"items":{"additionalProperties":false,"required":["hscan","vscan","index"],"properties":{"clone":{"type":"integer"},"colorOrder":{"enum":["rgb","bgr","rbg","brg","gbr","grb"],"type":"string"},"hscan":{"additionalProperties":false,"properties":{"maximum":{"maximum":1,"minimum":0,"type":"number"},"minimum":{"maximum":1,"minimum":0,"type":"number"}},"type":"object"},"index":{"type":"integer"},"vscan":{"additionalProperties":false,"properties":{"maximum":{"maximum":1,"minimum":0,"type":"number"},"minimum":{"maximum":1,"minimum":0,"type":"number"}},"type":"object"}},"type":"object"},"type":"array"} + //create jsonace editor + var aceEdt = new JSONACEEditor(document.getElementById("aceedit"),{ + mode: 'code', + schema: ledschema, + onChange: function(){ + var success = true; + try{ + aceEdt.get(); + } + catch(err) + { + success = false; + } + + if(success) + { + $('#leds_custom_updsim').attr("disabled", false); + $('#leds_custom_save').attr("disabled", false); + } + else + { + $('#leds_custom_updsim').attr("disabled", true); + $('#leds_custom_save').attr("disabled", true); + } + } + }, serverConfig.leds); + + //TODO: HACK! No callback for schema validation - Add it! + setInterval(function(){ + if($('#aceedit table').hasClass('jsoneditor-text-errors')) + { + $('#leds_custom_updsim').attr("disabled", true); + $('#leds_custom_save').attr("disabled", true); + } + },1000) + + $('.jsoneditor-menu').toggle(); + + // leds to finalLedArray finalLedArray = serverConfig.leds; + // cl/ma leds push to textfield + $('#btn_cl_generate, #btn_ma_generate').off().on("click", function(e) { + if(e.currentTarget.id == "btn_cl_generate") + $('#collapse1').collapse('hide'); + else + $('#collapse2').collapse('hide'); + + aceEdt.set(finalLedArray); + $('#collapse4').collapse('show'); + + }); + // create and update editor var conf_editor = null; $("#leddevices").off().on("change", function() { @@ -471,9 +496,7 @@ $(document).ready(function() { // validate textfield and update preview $("#leds_custom_updsim").off().on("click", function() { - if (validateText()){ - createLedPreview(JSON.parse($("#ledconfig").val()), 'text'); - } + createLedPreview(aceEdt.get(), 'text'); }); // save led config and saveValues - passing textfield @@ -482,13 +505,10 @@ $(document).ready(function() { saveValues(); }); - // validate and save led config from textfield + // save led config from textfield $("#leds_custom_save").off().on("click", function() { - if (validateText()) - { - requestWriteConfig(JSON.parse('{"leds" :'+$("#ledconfig").val()+'}')); - saveValues(); - } + requestWriteConfig(JSON.parse('{"leds" :'+aceEdt.getText()+'}')); + saveValues(); }); // toggle led numbers diff --git a/assets/webconfig/js/content_logging.js b/assets/webconfig/js/content_logging.js index aaf15455..9da6bce0 100644 --- a/assets/webconfig/js/content_logging.js +++ b/assets/webconfig/js/content_logging.js @@ -25,7 +25,7 @@ $(document).ready(function() { $('#btn_submit').off().on('click',function() { requestWriteConfig(conf_editor.getValue()); }); - + function uploadLog() { var reportUrl = 'https://glot.io/snippets/'; @@ -33,6 +33,7 @@ $(document).ready(function() { var config = JSON.stringify(serverConfig, null, "\t").replace(/"/g, '\\"'); var prios = serverInfo.info.priorities; var comps = serverInfo.info.components; + var info; //create log for(var i = 0; i "+debug+msg+"\n"; } + //create general info + info = "######## GENERAL ######## \n"; + info += 'Build: '+serverInfo.info.hyperion[0].build+'\n'; + info += 'Build time: '+serverInfo.info.hyperion[0].time+'\n'; + info += 'Version: '+serverInfo.info.hyperion[0].version+'\n'; + info += 'UI Lang: '+storedLang+'\n'; + info += 'UI Access: '+storedAccess+'\n'; + info += 'Avail Capt: '+serverInfo.info.grabbers.available+'\n\n'; //create prios - var info = "######## PRIORITIES ######## \n"; + info += "######## PRIORITIES ######## \n"; for(var i = 0; i'+$.i18n('conf_logging_uplfailed')+''); }); } diff --git a/assets/webconfig/js/content_remote.js b/assets/webconfig/js/content_remote.js index 5dcc31b1..c4c6c3cd 100644 --- a/assets/webconfig/js/content_remote.js +++ b/assets/webconfig/js/content_remote.js @@ -4,7 +4,8 @@ $(document).ready(function() { var oldEffects = []; var cpcolor = '#B500FF'; var mappingList = serverSchema.properties.color.properties.imageToLedMappingType.enum; - + var duration = 0; + //create html createTable('ssthead', 'sstbody', 'sstcont'); $('.ssthead').html(createTableRow([$.i18n('remote_input_origin'), $.i18n('remote_input_owner'), $.i18n('remote_input_priority'), $.i18n('remote_input_status')], true, true)); @@ -55,10 +56,11 @@ $(document).ready(function() { if(sColor[key].key == "brightness" || sColor[key].key == "backlightThreshold") property = ''; else - property = ''; + property = ''; $('.crtbody').append(createTableRow([title, property], false, true)); $('#cr_'+sColor[key].key).off().on('change', function(e){ + valValue(this.id,this.value,this.min,this.max); requestAdjustment(e.target.id.substr(e.target.id.indexOf("_") + 1), e.currentTarget.value); }); } @@ -86,9 +88,10 @@ $(document).ready(function() { var data = ""; var prios = serverInfo.info.priorities var i; + for(i = 0; i < prios.length; i++) { - var origin = "not impl"; + var origin = prios[i].origin; var ip = "xxx.xxx.xxx.xxx"; var owner = prios[i].owner; var active = prios[i].active; @@ -218,9 +221,15 @@ $(document).ready(function() { // colorpicker and effect if (getStorage('rmcpcolor') != null) cpcolor = getStorage('rmcpcolor'); + + if (getStorage('rmduration') != null) + { + $("#remote_duration").val(getStorage('rmduration')); + duration = getStorage('rmduration'); + } createCP('cp2', cpcolor, function(rgb,hex){ - requestSetColor(rgb.r, rgb.g, rgb.b); + requestSetColor(rgb.r, rgb.g, rgb.b,duration); $("#effect_select").val("__none__"); setStorage('rmcpcolor', hex); }); @@ -229,6 +238,11 @@ $(document).ready(function() { requestPriorityClear(); $("#effect_select").val("__none__"); }); + + $("#remote_duration").off().on("change", function(){ + duration = valValue(this.id,this.value,this.min,this.max); + setStorage('rmduration', duration); + }); $("#effect_select").off().on("change", function(event) { efx = $(this).val(); @@ -236,11 +250,18 @@ $(document).ready(function() { { requestPriorityClear(); $(hyperion).one("cmd-clear", function(event) { - setTimeout(function() {requestPlayEffect(efx)}, 100); + setTimeout(function() {requestPlayEffect(efx,duration)}, 100); }); } }); + $("#remote_input_img").change(function(){ + readImg(this, function(src,width,height){ + console.log(src,width,height) + requestSetImage(src,width,height,duration) + }); + }); + //force first update updateRemote(); diff --git a/assets/webconfig/js/hyperion.js b/assets/webconfig/js/hyperion.js index eb88d8cd..8b4e0d44 100644 --- a/assets/webconfig/js/hyperion.js +++ b/assets/webconfig/js/hyperion.js @@ -1,6 +1,7 @@ // global vars var webPrio = 1; +var webOrigin = "Web Configuration"; var showOptHelp; var currentVersion; var latestVersion; @@ -217,14 +218,34 @@ function requestPriorityClear(prio) sendToHyperion("clear", "", '"priority":'+prio+''); } -function requestPlayEffect(effectName) +function requestPlayEffect(effectName, duration) { - sendToHyperion("effect", "", '"effect":{"name":"'+effectName+'"},"priority":'+webPrio+''); + if(typeof duration === "undefined" || duration < 0) + duration = 0; + else + duration *= 1000; + + sendToHyperion("effect", "", '"effect":{"name":"'+effectName+'"},"priority":'+webPrio+',"duration":'+duration+',"origin":"'+webOrigin+'"'); } -function requestSetColor(r,g,b) +function requestSetColor(r,g,b,duration) { - sendToHyperion("color", "", '"color":['+r+','+g+','+b+'], "priority":'+webPrio+''); + if(typeof duration === "undefined" || duration < 0) + duration = 0; + else + duration *= 1000; + + sendToHyperion("color", "", '"color":['+r+','+g+','+b+'], "priority":'+webPrio+',"duration":'+duration+',"origin":"'+webOrigin+'"'); +} + +function requestSetImage(data,width,height,duration) +{ + if(typeof duration === "undefined" || duration < 0) + duration = 0; + else + duration *= 1000; + + sendToHyperion("image", "", '"imagedata":"'+data+'", "imagewidth":'+width+',"imageheight":'+height+', "priority":'+webPrio+',"duration":'+duration+''); } function requestSetComponentState(comp, state) diff --git a/assets/webconfig/js/lib/bootstrap-colorpicker.min.js b/assets/webconfig/js/lib/bootstrap-colorpicker.min.js index f0237c5e..2cec749d 100644 --- a/assets/webconfig/js/lib/bootstrap-colorpicker.min.js +++ b/assets/webconfig/js/lib/bootstrap-colorpicker.min.js @@ -1,5 +1,5 @@ /*! - * Bootstrap Colorpicker v2.4.0 + * Bootstrap Colorpicker v2.5.1 * https://itsjavi.com/bootstrap-colorpicker/ */ -!function(a){var b="undefined"==typeof window?this:window;"object"==typeof exports?module.exports=a(b.jQuery,b):"function"==typeof define&&define.amd?define(["jquery"],function(c){return a(c,b)}):b.jQuery&&!b.jQuery.fn.colorpicker&&a(b.jQuery,b)}(function(a,b){"use strict";var c=a,d=function(a,b,e,f){this.fallbackValue=e?e&&"undefined"!=typeof e.h?e:this.value={h:0,s:0,b:0,a:1}:null,this.fallbackFormat=f?f:"rgba",this.value=this.fallbackValue,this.origFormat=null,this.predefinedColors=b?b:{},this.colors=c.extend({},d.webColors,this.predefinedColors),a&&("undefined"!=typeof a.h?this.value=a:this.setColor(String(a))),this.value||(this.value={h:0,s:0,b:0,a:1})};d.webColors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",transparent:"transparent"},d.prototype={constructor:d,colors:{},predefinedColors:{},getValue:function(){return this.value},setValue:function(a){this.value=a},_sanitizeNumber:function(a){return"number"==typeof a?a:isNaN(a)||null===a||""===a||void 0===a?1:""===a?0:"undefined"!=typeof a.toLowerCase?(a.match(/^\./)&&(a="0"+a),Math.ceil(100*parseFloat(a))/100):1},isTransparent:function(a){return!(!a||!("string"==typeof a||a instanceof String))&&(a=a.toLowerCase().trim(),"transparent"===a||a.match(/#?00000000/)||a.match(/(rgba|hsla)\(0,0,0,0?\.?0\)/))},rgbaIsTransparent:function(a){return 0===a.r&&0===a.g&&0===a.b&&0===a.a},setColor:function(a){if(a=a.toLowerCase().trim()){if(this.isTransparent(a))return this.value={h:0,s:0,b:0,a:0},!0;var b=this.parse(a);b?(this.value=this.value={h:b.h,s:b.s,b:b.b,a:b.a},this.origFormat||(this.origFormat=b.format)):this.fallbackValue&&(this.value=this.fallbackValue)}return!1},setHue:function(a){this.value.h=1-a},setSaturation:function(a){this.value.s=a},setBrightness:function(a){this.value.b=1-a},setAlpha:function(a){this.value.a=Math.round(parseInt(100*(1-a),10)/100*100)/100},toRGB:function(a,b,c,d){0===arguments.length&&(a=this.value.h,b=this.value.s,c=this.value.b,d=this.value.a),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-Math.abs(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],{r:Math.round(255*e),g:Math.round(255*f),b:Math.round(255*g),a:d}},toHex:function(a,b,c,d){0===arguments.length&&(a=this.value.h,b=this.value.s,c=this.value.b,d=this.value.a);var e=this.toRGB(a,b,c,d);return this.rgbaIsTransparent(e)?"transparent":"#"+((1<<24)+(parseInt(e.r)<<16)+(parseInt(e.g)<<8)+parseInt(e.b)).toString(16).slice(1)},toHSL:function(a,b,c,d){0===arguments.length&&(a=this.value.h,b=this.value.s,c=this.value.b,d=this.value.a);var e=a,f=(2-b)*c,g=b*c;return g/=f>0&&f<=1?f:2-f,f/=2,g>1&&(g=1),{h:isNaN(e)?0:e,s:isNaN(g)?0:g,l:isNaN(f)?0:f,a:isNaN(d)?0:d}},toAlias:function(a,b,c,d){var e,f=0===arguments.length?this.toHex():this.toHex(a,b,c,d),g="alias"===this.origFormat?f:this.toString(this.origFormat,!1);for(var h in this.colors)if(e=this.colors[h].toLowerCase().trim(),e===f||e===g)return h;return!1},RGBtoHSB:function(a,b,c,d){a/=255,b/=255,c/=255;var e,f,g,h;return g=Math.max(a,b,c),h=g-Math.min(a,b,c),e=0===h?null:g===a?(b-c)/h:g===b?(c-a)/h+2:(a-b)/h+4,e=(e+360)%6*60/360,f=0===h?0:h/g,{h:this._sanitizeNumber(e),s:f,b:g,a:this._sanitizeNumber(d)}},HueToRGB:function(a,b,c){return c<0?c+=1:c>1&&(c-=1),6*c<1?a+(b-a)*c*6:2*c<1?b:3*c<2?a+(b-a)*(2/3-c)*6:a},HSLtoRGB:function(a,b,c,d){b<0&&(b=0);var e;e=c<=.5?c*(1+b):c+b-c*b;var f=2*c-e,g=a+1/3,h=a,i=a-1/3,j=Math.round(255*this.HueToRGB(f,e,g)),k=Math.round(255*this.HueToRGB(f,e,h)),l=Math.round(255*this.HueToRGB(f,e,i));return[j,k,l,this._sanitizeNumber(d)]},parse:function(a){if(0===arguments.length)return!1;var b,d,e=this,f=!1,g="undefined"!=typeof this.colors[a];return g&&(a=this.colors[a].toLowerCase().trim()),c.each(this.stringParsers,function(c,h){var i=h.re.exec(a);return b=i&&h.parse.apply(e,[i]),!b||(f={},d=g?"alias":h.format?h.format:e.getValidFallbackFormat(),f=d.match(/hsla?/)?e.RGBtoHSB.apply(e,e.HSLtoRGB.apply(e,b)):e.RGBtoHSB.apply(e,b),f instanceof Object&&(f.format=d),!1)}),f},getValidFallbackFormat:function(){var a=["rgba","rgb","hex","hsla","hsl"];return this.origFormat&&a.indexOf(this.origFormat)!==-1?this.origFormat:this.fallbackFormat&&a.indexOf(this.fallbackFormat)!==-1?this.fallbackFormat:"rgba"},toString:function(a,b){a=a||this.origFormat||this.fallbackFormat,b=b||!1;var c=!1;switch(a){case"rgb":return c=this.toRGB(),this.rgbaIsTransparent(c)?"transparent":"rgb("+c.r+","+c.g+","+c.b+")";case"rgba":return c=this.toRGB(),"rgba("+c.r+","+c.g+","+c.b+","+c.a+")";case"hsl":return c=this.toHSL(),"hsl("+Math.round(360*c.h)+","+Math.round(100*c.s)+"%,"+Math.round(100*c.l)+"%)";case"hsla":return c=this.toHSL(),"hsla("+Math.round(360*c.h)+","+Math.round(100*c.s)+"%,"+Math.round(100*c.l)+"%,"+c.a+")";case"hex":return this.toHex();case"alias":return c=this.toAlias(),c===!1?this.toString(this.getValidFallbackFormat()):b&&!(c in d.webColors)&&c in this.predefinedColors?this.predefinedColors[c]:c;default:return c}},stringParsers:[{re:/rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/,format:"rgb",parse:function(a){return[a[1],a[2],a[3],1]}},{re:/rgb\(\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*?\)/,format:"rgb",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],1]}},{re:/rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[a[1],a[2],a[3],a[4]]}},{re:/rgba\(\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],a[4]]}},{re:/hsl\(\s*(\d*(?:\.\d+)?)\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*?\)/,format:"hsl",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/hsla\(\s*(\d*(?:\.\d+)?)\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/,format:"hsla",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/#?([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,format:"hex",parse:function(a){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16),1]}},{re:/#?([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,format:"hex",parse:function(a){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16),1]}}],colorNameToHex:function(a){return"undefined"!=typeof this.colors[a.toLowerCase()]&&this.colors[a.toLowerCase()]}};var e={horizontal:!1,inline:!1,color:!1,format:!1,input:"input",container:!1,component:".add-on, .input-group-addon",fallbackColor:!1,fallbackFormat:"hex",sliders:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setHue"},alpha:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setAlpha"}},slidersHorz:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:100,maxTop:0,callLeft:"setHue",callTop:!1},alpha:{maxLeft:100,maxTop:0,callLeft:"setAlpha",callTop:!1}},template:'","
"),e.push(o.stringRepeat(" ",i.indent)),s++,l=0,a=i[s]||Number.MAX_VALUE;0!=d.length&&(r+=d.length,l=this.$renderToken(e,l,h,d))}}},this.$renderSimpleLine=function(e,t){var i=0,n=t[0],r=n.value;this.displayIndentGuides&&(r=this.renderIndentGuide(e,r)),r&&(i=this.$renderToken(e,i,n,r));for(var o=1;o"),r.length){var o=this.session.getRowSplitData(t);o&&o.length?this.$renderWrappedLine(e,r,o,i):this.$renderSimpleLine(e,r)}this.showInvisibles&&(n&&(t=n.end.row),e.push("",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),i||e.push("
")},this.$getFoldLineTokens=function(e,t){function i(e,t,i){for(var n=0,o=0;o+e[n].value.lengthi-t&&(s=s.substring(0,i-t)),r.push({type:e[n].type,value:s}),o=t+s.length,n+=1}for(;i>o&&ni?r.push({type:e[n].type,value:s.substring(0,i-o)}):r.push(e[n]),o+=s.length,n+=1}}var n=this.session,r=[],o=n.getTokens(e);return t.walk(function(e,t,s,a,l){null!=e?r.push({type:"fold",value:e}):(l&&(o=n.getTokens(t)),o.length&&i(o,a,s))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,i){"use strict";var n,r=e("../lib/dom"),o=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),void 0===n&&(n=!("opacity"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=(n?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(e){for(var t=this.cursors,i=t.length;i--;)t[i].style.visibility=e?"":"hidden"},this.$updateOpacity=function(e){for(var t=this.cursors,i=t.length;i--;)t[i].style.opacity=e?"":"0"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e==this.smoothBlinking||n||(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;if(clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0),this.isBlinking&&this.blinkInterval&&this.isVisible){this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()}},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var i=this.session.documentToScreenPosition(e),n=this.$padding+i.column*this.config.characterWidth,r=(i.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:n,top:r}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,i=0,n=0;void 0!==t&&0!==t.length||(t=[{cursor:null}]);for(var i=0,r=t.length;r>i;i++){var o=this.getPixelPosition(t[i].cursor,!0);if(!((o.top>e.height+e.offset||o.top<0)&&i>1)){var s=(this.cursors[n++]||this.addCursor()).style;this.drawCursor?this.drawCursor(s,o,e,t[i],this.session):(s.left=o.left+"px",s.top=o.top+"px",s.width=e.characterWidth+"px",s.height=e.lineHeight+"px")}}for(;this.cursors.length>n;)this.removeCursor();var a=this.session.getOverwrite();this.$setOverwrite(a),this.$pixelPos=o,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(o.prototype),t.Cursor=o}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,i){"use strict";var n=e("./lib/oop"),r=e("./lib/dom"),o=e("./lib/event"),s=e("./lib/event_emitter").EventEmitter,a=function(e){this.element=r.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=r.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,o.addListener(this.element,"scroll",this.onScroll.bind(this)),o.addListener(this.element,"mousedown",o.preventDefault)};(function(){n.implement(this,s),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e}}).call(a.prototype);var l=function(e,t){a.call(this,e),this.scrollTop=0,t.$scrollbarWidth=this.width=r.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px"};n.inherits(l,a),function(){this.classSuffix="-v",this.onScroll=function(){this.skipEvent||(this.scrollTop=this.element.scrollTop,this._emit("scroll",{data:this.scrollTop})),this.skipEvent=!1},this.getWidth=function(){return this.isVisible?this.width:0},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=function(e){this.inner.style.height=e+"px"},this.setScrollHeight=function(e){this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=this.element.scrollTop=e)}}.call(l.prototype);var c=function(e,t){a.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};n.inherits(c,a),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(c.prototype),t.ScrollBar=l,t.ScrollBarV=l,t.ScrollBarH=c,t.VScrollBar=l,t.HScrollBar=c}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,i){"use strict";var n=e("./lib/event"),r=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){if(this.changes=this.changes|e,!this.pending&&this.changes){this.pending=!0;var t=this;n.nextFrame(function(){t.pending=!1;for(var e;e=t.changes;)t.changes=0,t.onRender(e)},this.window)}}}).call(r.prototype),t.RenderLoop=r}),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,i){var n=e("../lib/oop"),r=e("../lib/dom"),o=e("../lib/lang"),s=e("../lib/useragent"),a=e("../lib/event_emitter").EventEmitter,l=0,c=t.FontMetrics=function(e){this.el=r.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=r.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=r.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),l||this.$testFractionalRect(),this.$measureNode.innerHTML=o.stringRepeat("X",l),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){n.implement(this,a),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=r.createElement("div");this.$setMeasureNodeStyles(e.style),e.style.width="0.2px",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;l=t>0&&1>t?50:100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",s.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(50===l){var e=null;try{e=this.$measureNode.getBoundingClientRect()}catch(t){e={width:0,height:0}}var i={height:e.height,width:e.width/l}}else var i={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/l};return 0===i.width||0===i.height?null:i},this.$measureCharWidth=function(e){this.$main.innerHTML=o.stringRepeat(e,l);var t=this.$main.getBoundingClientRect();return t.width/l},this.getCharacterWidth=function(e){var t=this.charSizes[e];return void 0===t&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(c.prototype)}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(e,t,i){"use strict";var n=e("./lib/oop"),r=e("./lib/dom"),o=e("./config"),s=e("./lib/useragent"),a=e("./layer/gutter").Gutter,l=e("./layer/marker").Marker,c=e("./layer/text").Text,h=e("./layer/cursor").Cursor,d=e("./scrollbar").HScrollBar,u=e("./scrollbar").VScrollBar,f=e("./renderloop").RenderLoop,p=e("./layer/font_metrics").FontMetrics,m=e("./lib/event_emitter").EventEmitter,g='.ace_editor { position: relative; overflow: hidden; font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace; direction: ltr; } .ace_scroller { position: absolute; overflow: hidden; top: 0; bottom: 0; background-color: inherit; -ms-user-select: none; -moz-user-select: none; -webkit-user-select: none; user-select: none; cursor: text; } .ace_content { position: absolute; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; min-width: 100%; } .ace_dragging .ace_scroller:before{ position: absolute; top: 0; left: 0; right: 0; bottom: 0; content: \'\'; background: rgba(250, 250, 250, 0.01); z-index: 1000; } .ace_dragging.ace_dark .ace_scroller:before{ background: rgba(0, 0, 0, 0.01); } .ace_selecting, .ace_selecting * { cursor: text !important; } .ace_gutter { position: absolute; overflow : hidden; width: auto; top: 0; bottom: 0; left: 0; cursor: default; z-index: 4; -ms-user-select: none; -moz-user-select: none; -webkit-user-select: none; user-select: none; } .ace_gutter-active-line { position: absolute; left: 0; right: 0; } .ace_scroller.ace_scroll-left { box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset; } .ace_gutter-cell { padding-left: 19px; padding-right: 6px; background-repeat: no-repeat; } .ace_gutter-cell.ace_error { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg=="); background-repeat: no-repeat; background-position: 2px center; } .ace_gutter-cell.ace_warning { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg=="); background-position: 2px center; } .ace_gutter-cell.ace_info { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII="); background-position: 2px center; } .ace_dark .ace_gutter-cell.ace_info { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC"); } .ace_scrollbar { position: absolute; right: 0; bottom: 0; z-index: 6; } .ace_scrollbar-inner { position: absolute; cursor: text; left: 0; top: 0; } .ace_scrollbar-v{ overflow-x: hidden; overflow-y: scroll; top: 0; } .ace_scrollbar-h { overflow-x: scroll; overflow-y: hidden; left: 0; } .ace_print-margin { position: absolute; height: 100%; } .ace_text-input { position: absolute; z-index: 0; width: 0.5em; height: 1em; opacity: 0; background: transparent; -moz-appearance: none; appearance: none; border: none; resize: none; outline: none; overflow: hidden; font: inherit; padding: 0 1px; margin: 0 -1px; text-indent: -1em; -ms-user-select: text; -moz-user-select: text; -webkit-user-select: text; user-select: text; white-space: pre!important; } .ace_text-input.ace_composition { background: inherit; color: inherit; z-index: 1000; opacity: 1; text-indent: 0; } .ace_layer { z-index: 1; position: absolute; overflow: hidden; word-wrap: normal; white-space: pre; height: 100%; width: 100%; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; pointer-events: none; } .ace_gutter-layer { position: relative; width: auto; text-align: right; pointer-events: auto; } .ace_text-layer { font: inherit !important; } .ace_cjk { display: inline-block; text-align: center; } .ace_cursor-layer { z-index: 4; } .ace_cursor { z-index: 4; position: absolute; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; border-left: 2px solid; transform: translatez(0); } .ace_slim-cursors .ace_cursor { border-left-width: 1px; } .ace_overwrite-cursors .ace_cursor { border-left-width: 0; border-bottom: 1px solid; } .ace_hidden-cursors .ace_cursor { opacity: 0.2; } .ace_smooth-blinking .ace_cursor { -webkit-transition: opacity 0.18s; transition: opacity 0.18s; } .ace_editor.ace_multiselect .ace_cursor { border-left-width: 1px; } .ace_marker-layer .ace_step, .ace_marker-layer .ace_stack { position: absolute; z-index: 3; } .ace_marker-layer .ace_selection { position: absolute; z-index: 5; } .ace_marker-layer .ace_bracket { position: absolute; z-index: 6; } .ace_marker-layer .ace_active-line { position: absolute; z-index: 2; } .ace_marker-layer .ace_selected-word { position: absolute; z-index: 4; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } .ace_line .ace_fold { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; display: inline-block; height: 11px; margin-top: -2px; vertical-align: middle; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="), url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII="); background-repeat: no-repeat, repeat-x; background-position: center center, top left; color: transparent; border: 1px solid black; border-radius: 2px; cursor: pointer; pointer-events: auto; } .ace_dark .ace_fold { } .ace_fold:hover{ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="), url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC"); } .ace_tooltip { background-color: #FFF; background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1)); background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1)); border: 1px solid gray; border-radius: 1px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); color: black; max-width: 100%; padding: 3px 4px; position: fixed; z-index: 999999; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; cursor: default; white-space: pre; word-wrap: break-word; line-height: normal; font-style: normal; font-weight: normal; letter-spacing: normal; pointer-events: none; } .ace_folding-enabled > .ace_gutter-cell { padding-right: 13px; } .ace_fold-widget { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; margin: 0 -12px 0 1px; display: none; width: 11px; vertical-align: top; background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg=="); background-repeat: no-repeat; background-position: center; border-radius: 3px; border: 1px solid transparent; cursor: pointer; } .ace_folding-enabled .ace_fold-widget { display: inline-block; } .ace_fold-widget.ace_end { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg=="); } .ace_fold-widget.ace_closed { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA=="); } .ace_fold-widget:hover { border: 1px solid rgba(0, 0, 0, 0.3); background-color: rgba(255, 255, 255, 0.2); box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7); } .ace_fold-widget:active { border: 1px solid rgba(0, 0, 0, 0.4); background-color: rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8); } .ace_dark .ace_fold-widget { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC"); } .ace_dark .ace_fold-widget.ace_end { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg=="); } .ace_dark .ace_fold-widget.ace_closed { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg=="); } .ace_dark .ace_fold-widget:hover { box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2); background-color: rgba(255, 255, 255, 0.1); } .ace_dark .ace_fold-widget:active { box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2); } .ace_fold-widget.ace_invalid { background-color: #FFB4B4; border-color: #DE5555; } .ace_fade-fold-widgets .ace_fold-widget { -webkit-transition: opacity 0.4s ease 0.05s; transition: opacity 0.4s ease 0.05s; opacity: 0; } .ace_fade-fold-widgets:hover .ace_fold-widget { -webkit-transition: opacity 0.05s ease 0.05s; transition: opacity 0.05s ease 0.05s; opacity:1; } .ace_underline { text-decoration: underline; } .ace_bold { font-weight: bold; } .ace_nobold .ace_bold { font-weight: normal; } .ace_italic { font-style: italic; } .ace_error-marker { background-color: rgba(255, 0, 0,0.2); position: absolute; z-index: 9; } .ace_highlight-marker { background-color: rgba(255, 255, 0,0.2); position: absolute; z-index: 8; } .ace_br1 {border-top-left-radius : 3px;} .ace_br2 {border-top-right-radius : 3px;} .ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;} .ace_br4 {border-bottom-right-radius: 3px;} .ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;} .ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;} .ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;} .ace_br8 {border-bottom-left-radius : 3px;} .ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;} .ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;} .ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;} .ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;} .ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;} .ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;} .ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;} '; +r.importCssString(g,"ace_editor.css");var v=function(e,t){var i=this;this.container=e||r.createElement("div"),this.$keepTextAreaAtCursor=!s.isOldIE,r.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=r.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=r.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=r.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new a(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new l(this.content);var n=this.$textLayer=new c(this.content);this.canvas=n.element,this.$markerFront=new l(this.content),this.$cursorLayer=new h(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new u(this.container,this),this.scrollBarH=new d(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){i.$scrollAnimation||i.session.setScrollTop(e.data-i.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){i.$scrollAnimation||i.session.setScrollLeft(e.data-i.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new p(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){i.updateCharacterSize(),i.onResize(!0,i.gutterWidth,i.$size.width,i.$size.height),i._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new f(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),o.resetOptions(this),o._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,n.implement(this,m),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e),e&&(this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode))},this.updateLines=function(e,t,i){if(void 0===t&&(t=1/0),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow||this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar()},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,i,n){if(!(this.resizing>2)){this.resizing>0?this.resizing++:this.resizing=e?1:0;var r=this.container;n||(n=r.clientHeight||r.scrollHeight),i||(i=r.clientWidth||r.scrollWidth);var o=this.$updateCachedSize(e,t,i,n);if(!this.$size.scrollerHeight||!i&&!n)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(o|this.$changes,!0):this.$loop.schedule(o|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null}},this.$updateCachedSize=function(e,t,i,n){n-=this.$extraHeight||0;var r=0,o=this.$size,s={width:o.width,height:o.height,scrollerHeight:o.scrollerHeight,scrollerWidth:o.scrollerWidth};return n&&(e||o.height!=n)&&(o.height=n,r|=this.CHANGE_SIZE,o.scrollerHeight=o.height,this.$horizScroll&&(o.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",r|=this.CHANGE_SCROLL),i&&(e||o.width!=i)&&(r|=this.CHANGE_SIZE,o.width=i,null==t&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+"px",o.scrollerWidth=Math.max(0,i-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px",(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)&&(r|=this.CHANGE_FULL)),o.$dirty=!i||!n,r&&this._signal("resize",s),r},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-2*this.$padding,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var i=this.session.selection.getCursor();i.column=0,e=this.$cursorLayer.getPixelPosition(i,!0),t*=this.session.getRowLength(i.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(this.$showPrintMargin||this.$printMarginEl){if(!this.$printMarginEl){var e=r.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=r.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&-1==this.session.$wrap&&this.adjustWrapLimit()}},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(this.$keepTextAreaAtCursor){var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,i=this.$cursorLayer.$pixelPos.left;t-=e.offset;var n=this.textarea.style,r=this.lineHeight;if(0>t||t>e.height-r)return void(n.top=n.left="0");var o=this.characterWidth;if(this.$composition){var s=this.textarea.value.replace(/^\x01+/,"");o*=this.session.$getStringScreenWidth(s)[0]+2,r+=2}i-=this.scrollLeft,i>this.$size.scrollerWidth-o&&(i=this.$size.scrollerWidth-o),i+=this.gutterWidth,n.height=r+"px",n.width=o+"px",n.left=Math.min(i,this.$size.scrollerWidth-o)+"px",n.top=Math.min(t,this.$size.height-r)+"px"}},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(0===this.layerConfig.offset?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,i=this.session.documentToScreenRow(t,0)*e.lineHeight;return i-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,i,n){var r=this.scrollMargin;r.top=0|e,r.bottom=0|t,r.right=0|n,r.left=0|i,r.v=r.top+r.bottom,r.h=r.left+r.right,r.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-r.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){if(this.$changes&&(e|=this.$changes,this.$changes=0),!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t)return void(this.$changes|=e);if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender");var i=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){if(e|=this.$computeLayerConfig(),i.firstRow!=this.layerConfig.firstRow&&i.firstRowScreen==this.layerConfig.firstRowScreen){var n=this.scrollTop+(i.firstRow-this.layerConfig.firstRow)*this.lineHeight;n>0&&(this.scrollTop=n,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig())}i=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-i.offset+"px",this.content.style.marginTop=-i.offset+"px",this.content.style.width=i.width+2*this.$padding+"px",this.content.style.height=i.minHeight+"px"}return e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left"),e&this.CHANGE_FULL?(this.$textLayer.update(i),this.$showGutter&&this.$gutterLayer.update(i),this.$markerBack.update(i),this.$markerFront.update(i),this.$cursorLayer.update(i),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),void this._signal("afterRender")):e&this.CHANGE_SCROLL?(e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(i):this.$textLayer.scrollLines(i),this.$showGutter&&this.$gutterLayer.update(i),this.$markerBack.update(i),this.$markerFront.update(i),this.$cursorLayer.update(i),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),void this._signal("afterRender")):(e&this.CHANGE_TEXT?(this.$textLayer.update(i),this.$showGutter&&this.$gutterLayer.update(i)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(i):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(i),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(i),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(i),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(i),void this._signal("afterRender"))},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,i=Math.max((this.$minLines||1)*this.lineHeight,Math.min(t,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(i+=this.scrollBarH.getHeight());var n=e>t;if(i!=this.desiredHeight||this.$size.height!=this.desiredHeight||n!=this.$vScroll){n!=this.$vScroll&&(this.$vScroll=n,this.scrollBarV.setVisible(n));var r=this.container.clientWidth;this.container.style.height=i+"px",this.$updateCachedSize(!0,this.$gutterWidth,r,i),this.desiredHeight=i,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,i=t.height<=2*this.lineHeight,n=this.session.getScreenLength(),r=n*this.lineHeight,o=this.$getLongestLine(),s=!i&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-o-2*this.$padding<0),a=this.$horizScroll!==s;a&&(this.$horizScroll=s,this.scrollBarH.setVisible(s));var l=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var c=this.scrollTop%this.lineHeight,h=t.scrollerHeight+this.lineHeight,d=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;r+=d;var u=this.scrollMargin;this.session.setScrollTop(Math.max(-u.top,Math.min(this.scrollTop,r-t.scrollerHeight+u.bottom))),this.session.setScrollLeft(Math.max(-u.left,Math.min(this.scrollLeft,o+2*this.$padding-t.scrollerWidth+u.right)));var f=!i&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-r+d<0||this.scrollTop>u.top),p=l!==f;p&&(this.$vScroll=f,this.scrollBarV.setVisible(f));var m,g,v=Math.ceil(h/this.lineHeight)-1,w=Math.max(0,Math.round((this.scrollTop-c)/this.lineHeight)),y=w+v,A=this.lineHeight;w=e.screenToDocumentRow(w,0);var C=e.getFoldLine(w);C&&(w=C.start.row),m=e.documentToScreenRow(w,0),g=e.getRowLength(w)*A,y=Math.min(e.screenToDocumentRow(y,0),e.getLength()-1),h=t.scrollerHeight+e.getRowLength(y)*A+g,c=this.scrollTop-m*A;var E=0;return this.layerConfig.width!=o&&(E=this.CHANGE_H_SCROLL),(a||p)&&(E=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),p&&(o=this.$getLongestLine())),this.layerConfig={width:o,padding:this.$padding,firstRow:w,firstRowScreen:m,lastRow:y,lineHeight:A,characterWidth:this.characterWidth,minHeight:h,maxHeight:r,offset:c,gutterOffset:Math.max(0,Math.ceil((c+t.height-t.scrollerHeight)/A)),height:this.$size.scrollerHeight},E},this.$updateLines=function(){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var i=this.layerConfig;return e>i.lastRow+1||to?(t&&l+s>o+this.lineHeight&&(o-=t*this.$size.scrollerHeight),0===o&&(o=-this.scrollMargin.top),this.session.setScrollTop(o)):l+this.$size.scrollerHeight-ar?(ri;++i)r.push(o(i/this.STEPS,e,t-e));return r},this.scrollToLine=function(e,t,i,n){var r=this.$cursorLayer.getPixelPosition({row:e,column:0}),o=r.top;t&&(o-=this.$size.scrollerHeight/2);var s=this.scrollTop;this.session.setScrollTop(o),i!==!1&&this.animateScrolling(s,n)},this.animateScrolling=function(e,t){var i=this.scrollTop;if(this.$animatedScroll){var n=this;if(e!=i){if(this.$scrollAnimation){var r=this.$scrollAnimation.steps;if(r.length&&(e=r[0],e==i))return}var o=n.$calcSteps(e,i);this.$scrollAnimation={from:e,to:i,steps:o},clearInterval(this.$timer),n.session.setScrollTop(o.shift()),n.session.$scrollTop=i,this.$timer=setInterval(function(){o.length?(n.session.setScrollTop(o.shift()),n.session.$scrollTop=i):null!=i?(n.session.$scrollTop=-1,n.session.setScrollTop(i),i=null):(n.$timer=clearInterval(n.$timer),n.$scrollAnimation=null,t&&t())},10)}}},this.scrollToY=function(e){this.scrollTop!==e&&(this.$loop.schedule(this.CHANGE_SCROLL),this.scrollTop=e)},this.scrollToX=function(e){this.scrollLeft!==e&&(this.scrollLeft=e),this.$loop.schedule(this.CHANGE_H_SCROLL)},this.scrollTo=function(e,t){this.session.setScrollTop(t),this.session.setScrollLeft(t)},this.scrollBy=function(e,t){t&&this.session.setScrollTop(this.session.getScrollTop()+t),e&&this.session.setScrollLeft(this.session.getScrollLeft()+e)},this.isScrollableBy=function(e,t){return 0>t&&this.session.getScrollTop()>=1-this.scrollMargin.top?!0:t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom?!0:0>e&&this.session.getScrollLeft()>=1-this.scrollMargin.left?!0:e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right?!0:void 0},this.pixelToScreenCoordinates=function(e,t){var i=this.scroller.getBoundingClientRect(),n=(e+this.scrollLeft-i.left-this.$padding)/this.characterWidth,r=Math.floor((t+this.scrollTop-i.top)/this.lineHeight),o=Math.round(n);return{row:r,column:o,side:n-o>0?1:-1}},this.screenToTextCoordinates=function(e,t){var i=this.scroller.getBoundingClientRect(),n=Math.round((e+this.scrollLeft-i.left-this.$padding)/this.characterWidth),r=(t+this.scrollTop-i.top)/this.lineHeight;return this.session.screenToDocumentPosition(r,Math.max(n,0))},this.textToScreenCoordinates=function(e,t){var i=this.scroller.getBoundingClientRect(),n=this.session.documentToScreenPosition(e,t),r=this.$padding+Math.round(n.column*this.characterWidth),o=n.row*this.lineHeight;return{pageX:i.left+r-this.scrollLeft,pageY:i.top+o-this.scrollTop}},this.visualizeFocus=function(){r.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){r.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,r.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){this.$composition&&(r.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null)},this.setTheme=function(e,t){function i(i){if(n.$themeId!=e)return t&&t();if(i.cssClass){r.importCssString(i.cssText,i.cssClass,n.container.ownerDocument),n.theme&&r.removeCssClass(n.container,n.theme.cssClass);var o="padding"in i?i.padding:"padding"in(n.theme||{})?4:n.$padding;n.$padding&&o!=n.$padding&&n.setPadding(o),n.$theme=i.cssClass,n.theme=i,r.addCssClass(n.container,i.cssClass),r.setCssClass(n.container,"ace_dark",i.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent("themeLoaded",{theme:i}),t&&t()}}var n=this;if(this.$themeId=e,n._dispatchEvent("themeChange",{theme:e}),e&&"string"!=typeof e)i(e);else{var s=e||this.$options.theme.initialValue;o.loadModule(["theme",s],i)}},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){r.setCssClass(this.container,e,t!==!1)},this.unsetStyle=function(e){r.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.scroller.style.cursor!=e&&(this.scroller.style.cursor=e)},this.setMouseCursor=function(e){this.scroller.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(v.prototype),o.defineOptions(v.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){"number"==typeof e&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){r.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){return this.$gutterLineHighlight?(this.$gutterLineHighlight.style.display=e?"":"none",void(this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight())):(this.$gutterLineHighlight=r.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",void this.$gutter.appendChild(this.$gutterLineHighlight))},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){this.$hScrollBarAlwaysVisible&&this.$horizScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){this.$vScrollBarAlwaysVisible&&this.$vScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){"number"==typeof e&&(e+="px"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},scrollPastEnd:{set:function(e){e=+e||0,this.$scrollPastEnd!=e&&(this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL))},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),t.VirtualRenderer=v}),ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"],function(e,t,n){"use strict";var r=e("../lib/oop"),o=e("../lib/net"),s=e("../lib/event_emitter").EventEmitter,a=e("../config"),l=function(t,n,r,o){if(this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl),a.get("packaged")||!e.toUrl)o=o||a.moduleUrl(n.id,"worker");else{var s=this.$normalizePath;o=o||s(e.toUrl("ace/worker/worker.js",null,"_"));var l={};t.forEach(function(t){l[t]=s(e.toUrl(t,null,"_").replace(/(\.js)?(\?.*)?$/,""))})}try{var c=n.src,h=i(66),d=new h([c],{type:"application/javascript"}),u=(window.URL||window.webkitURL).createObjectURL(d);this.$worker=new Worker(u)}catch(f){if(!(f instanceof window.DOMException))throw f;var d=this.$workerBlob(o),p=window.URL||window.webkitURL,m=p.createObjectURL(d);this.$worker=new Worker(m),p.revokeObjectURL(m)}this.$worker.postMessage({init:!0,tlns:l,module:n.id,classname:r}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){r.implement(this,s),this.onMessage=function(e){var t=e.data;switch(t.type){case"event":this._signal(t.name,{data:t.data});break;case"call":var i=this.callbacks[t.id];i&&(i(t.data),delete this.callbacks[t.id]);break;case"error":this.reportError(t.data);break;case"log":window.console&&console.log&&console.log.apply(console,t.data)}},this.reportError=function(e){window.console&&console.error&&console.error(e)},this.$normalizePath=function(e){return o.qualifyURL(e)},this.terminate=function(){this._signal("terminate",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,i){if(i){var n=this.callbackId++;this.callbacks[n]=i,t.push(n)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(i){console.error(i.stack)}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),"insert"==e.action?this.deltaQueue.push(e.start,e.lines):this.deltaQueue.push(e.start,e.end)},this.$sendDeltaQueue=function(){var e=this.deltaQueue;e&&(this.deltaQueue=null,e.length>50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e}))},this.$workerBlob=function(e){var t="importScripts('"+o.qualifyURL(e)+"');";try{return new Blob([t],{type:"application/javascript"})}catch(i){var n=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,r=new n;return r.append(t),r.getBlob("application/javascript")}}}).call(l.prototype);var c=function(e,t,i){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var n=null,r=!1,o=Object.create(s),l=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){l.messageBuffer.push(e),n&&(r?setTimeout(c):c())},this.setEmitSync=function(e){r=e};var c=function(){var e=l.messageBuffer.shift();e.command?n[e.command].apply(n,e.args):e.event&&o._signal(e.event,e.data)};o.postMessage=function(e){l.onMessage({data:e})},o.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},o.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},a.loadModule(["worker",t],function(e){for(n=new e[i](o);l.messageBuffer.length;)c()})};c.prototype=l.prototype,t.UIWorkerClient=c,t.WorkerClient=l}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,i){"use strict";var n=e("./range").Range,r=e("./lib/event_emitter").EventEmitter,o=e("./lib/oop"),s=function(e,t,i,n,r,o){var s=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=r,this.othersClass=o,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=n,this.$onCursorChange=function(){setTimeout(function(){s.onCursorChange()})},this.$pos=i;var a=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=a.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){o.implement(this,r),this.setup=function(){var e=this,t=this.doc,i=this.session;this.selectionBefore=i.selection.toJSON(),i.selection.inMultiSelectMode&&i.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var r=this.pos;r.$insertRight=!0,r.detach(),r.markerId=i.addMarker(new n(r.row,r.column,r.row,r.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(i){var n=t.createAnchor(i.row,i.column);n.$insertRight=!0,n.detach(),e.others.push(n)}),i.setUndoSelect(!1)},this.showOtherMarkers=function(){if(!this.othersActive){var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(i){i.markerId=e.addMarker(new n(i.row,i.column,i.row,i.column+t.length),t.othersClass,null,!1)})}},this.hideOtherMarkers=function(){if(this.othersActive){this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,o=t.start.column-this.pos.column;if(this.updateAnchors(e),r&&(this.length+=i),r&&!this.session.$fromUndo)if("insert"===e.action)for(var s=this.others.length-1;s>=0;s--){var a=this.others[s],l={row:a.row,column:a.column+o};this.doc.insertMergedLines(l,e.lines)}else if("remove"===e.action)for(var s=this.others.length-1;s>=0;s--){var a=this.others[s],l={row:a.row,column:a.column+o};this.doc.remove(new n(l.row,l.column,l.row,l.column-i))}this.$updating=!1,this.updateMarkers()}},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(!this.$updating){var e=this,t=this.session,i=function(i,r){t.removeMarker(i.markerId),i.markerId=t.addMarker(new n(i.row,i.column,i.row,i.column+e.length),r,null,!1)};i(this.pos,this.mainClass);for(var r=this.others.length;r--;)i(this.others[r],this.othersClass)}},this.onCursorChange=function(e){if(!this.$updating&&this.session){var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))}},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(-1!==this.$undoStackDepth){for(var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth,i=0;t>i;i++)e.undo(!0);this.selectionBefore&&this.session.selection.fromJSON(this.selectionBefore)}}}).call(s.prototype),t.PlaceHolder=s}),ace.define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,i){function n(e,t){return e.row==t.row&&e.column==t.column}function r(e){var t=e.domEvent,i=t.altKey,r=t.shiftKey,a=t.ctrlKey,l=e.getAccelKey(),c=e.getButton();if(a&&s.isMac&&(c=t.button),e.editor.inMultiSelectMode&&2==c)return void e.editor.textInput.onContextMenu(e.domEvent);if(!a&&!i&&!l)return void(0===c&&e.editor.inMultiSelectMode&&e.editor.exitMultiSelectMode());if(0===c){var h,d=e.editor,u=d.selection,f=d.inMultiSelectMode,p=e.getDocumentPosition(),m=u.getCursor(),g=e.inSelection()||u.isEmpty()&&n(p,m),v=e.x,w=e.y,y=function(e){v=e.clientX,w=e.clientY},A=d.session,C=d.renderer.pixelToScreenCoordinates(v,w),E=C;if(d.$mouseHandler.$enableJumpToDef)a&&i||l&&i?h=r?"block":"add":i&&d.$blockSelectEnabled&&(h="block");else if(l&&!i){if(h="add",!f&&r)return}else i&&d.$blockSelectEnabled&&(h="block");if(h&&s.isMac&&t.ctrlKey&&d.$mouseHandler.cancelContextMenu(),"add"==h){if(!f&&g)return;if(!f){var b=u.toOrientedRange();d.addSelectionMarker(b)}var F=u.rangeList.rangeAtPoint(p);d.$blockScrolling++,d.inVirtualSelectionMode=!0,r&&(F=null,b=u.ranges[0]||b,d.removeSelectionMarker(b)),d.once("mouseup",function(){var e=u.toOrientedRange();F&&e.isEmpty()&&n(F.cursor,e.cursor)?u.substractPoint(e.cursor):(r?u.substractPoint(b.cursor):b&&(d.removeSelectionMarker(b),u.addRange(b)),u.addRange(e)),d.$blockScrolling--,d.inVirtualSelectionMode=!1})}else if("block"==h){e.stop(),d.inVirtualSelectionMode=!0;var x,S=[],$=function(){var e=d.renderer.pixelToScreenCoordinates(v,w),t=A.screenToDocumentPosition(e.row,e.column);n(E,e)&&n(t,u.lead)||(E=e,d.$blockScrolling++,d.selection.moveToPosition(t),d.renderer.scrollCursorIntoView(),d.removeSelectionMarkers(S),S=u.rectangularRangeBlock(E,C),d.$mouseHandler.$clickSelection&&1==S.length&&S[0].isEmpty()&&(S[0]=d.$mouseHandler.$clickSelection.clone()),S.forEach(d.addSelectionMarker,d),d.updateSelectionMarkers(),d.$blockScrolling--)};d.$blockScrolling++,f&&!l?u.toSingleRange():!f&&l&&(x=u.toOrientedRange(),d.addSelectionMarker(x)),r?C=A.documentToScreenPosition(u.lead):u.moveToPosition(p),d.$blockScrolling--,E={row:-1,column:-1};var D=function(e){clearInterval(B),d.removeSelectionMarkers(S),S.length||(S=[u.toOrientedRange()]),d.$blockScrolling++,x&&(d.removeSelectionMarker(x),u.toSingleRange(x));for(var t=0;t1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)}},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);return t?(this.$onRemoveRange(t),t[0]):void 0},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){if(this.rangeCount=this.rangeList.ranges.length,1==this.rangeCount&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var i=e.length;i--;){var n=this.ranges.indexOf(e[i]);this.ranges.splice(n,1)}this._signal("removeRange",{ranges:e}),0===this.rangeCount&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){this.rangeList||(this.rangeList=new a,this.ranges=[],this.rangeCount=0)},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],i=l.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(i,t.cursor==t.start)}else{var i=this.getRange(),n=this.isBackwards(),r=i.start.row,o=i.end.row;if(r==o){if(n)var s=i.end,a=i.start;else var s=i.start,a=i.end;return this.addRange(l.fromPoints(a,a)),void this.addRange(l.fromPoints(s,s))}var c=[],h=this.getLineRange(r,!0);h.start.column=i.start.column,c.push(h);for(var d=r+1;o>d;d++)c.push(this.getLineRange(d,!0));h=this.getLineRange(o,!0),h.end.column=i.end.column,c.push(h),c.forEach(this.addRange,this)}},this.toggleBlockSelection=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],i=l.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(i,t.cursor==t.start)}else{var n=this.session.documentToScreenPosition(this.selectionLead),r=this.session.documentToScreenPosition(this.selectionAnchor),o=this.rectangularRangeBlock(n,r);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,i){var n=[],o=e.columns&&(s=0),0>h&&(h=0),h==d&&(i=!0);for(var u=h;d>=u;u++){var f=l.fromPoints(this.session.screenToDocumentPosition(u,s),this.session.screenToDocumentPosition(u,a));if(f.isEmpty()){if(p&&r(f.end,p))break;var p=f.end}f.cursor=o?f.start:f.end,n.push(f)}if(c&&n.reverse(),!i){for(var m=n.length-1;n[m].isEmpty()&&m>0;)m--;if(m>0)for(var g=0;n[g].isEmpty();)g++;for(var v=m;v>=g;v--)n[v].isEmpty()&&n.splice(v,1)}return n}}.call(c.prototype);var v=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(e.marker){this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);-1!=t&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length}},this.removeSelectionMarkers=function(e){for(var t=this.session.$selectionMarkers,i=e.length;i--;){var n=e[i];if(n.marker){this.session.removeMarker(n.marker);var r=t.indexOf(n);-1!=r&&t.splice(r,1)}}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){this.inMultiSelectMode||(this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers())},this.$onSingleSelect=function(e){this.session.multiSelect.inVirtualMode||(this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection"))},this.$onMultiSelectExec=function(e){var t=e.command,i=e.editor;if(i.multiSelect){if(t.multiSelectAction)"forEach"==t.multiSelectAction?n=i.forEachSelection(t,e.args):"forEachLine"==t.multiSelectAction?n=i.forEachSelection(t,e.args,!0):"single"==t.multiSelectAction?(i.exitMultiSelectMode(),n=t.exec(i,e.args||{})):n=t.multiSelectAction(i,e.args||{});else{var n=t.exec(i,e.args||{});i.multiSelect.addRange(i.multiSelect.toOrientedRange()),i.multiSelect.mergeOverlappingRanges()}return n}},this.forEachSelection=function(e,t,i){if(!this.inVirtualSelectionMode){var n,r=i&&i.keepOrder,o=1==i||i&&i.$byLines,s=this.session,a=this.selection,l=a.rangeList,h=(r?a:l).ranges;if(!h.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var d=a._eventRegistry;a._eventRegistry={};var u=new c(s);this.inVirtualSelectionMode=!0;for(var f=h.length;f--;){if(o)for(;f>0&&h[f].start.row==h[f-1].end.row;)f--;u.fromOrientedRange(h[f]),u.index=f,this.selection=s.selection=u;var p=e.exec?e.exec(this,t||{}):e(this,t||{});n||void 0===p||(n=p),u.toOrientedRange(h[f])}u.detach(),this.selection=s.selection=a,this.inVirtualSelectionMode=!1,a._eventRegistry=d,a.mergeOverlappingRanges();var m=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),m&&m.from==m.to&&this.renderer.animateScrolling(m.from),n}},this.exitMultiSelectMode=function(){this.inMultiSelectMode&&!this.inVirtualSelectionMode&&this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){for(var t=this.multiSelect.rangeList.ranges,i=[],n=0;ne?a.unshift(a.pop()):a.push(a.shift());for(var r=n.length;r--;){var o=n[r],s=o.clone();t.replace(o,a[r]),o.start.row=s.start.row,o.start.column=s.start.column}},this.selectMore=function(e,t,i){var r=this.session,o=r.multiSelect,s=o.toOrientedRange();if(!s.isEmpty()||(s=r.getWordRange(s.start.row,s.start.column),s.cursor=-1==e?s.start:s.end,this.multiSelect.addRange(s),!i)){var a=r.getTextRange(s),l=n(r,a,e);l&&(l.cursor=-1==e?l.start:l.end,this.$blockScrolling+=1,this.session.unfold(l),this.multiSelect.addRange(l),this.$blockScrolling-=1,this.renderer.scrollCursorIntoView(null,.5)),t&&this.multiSelect.substractPoint(s.cursor)}},this.alignCursors=function(){var e=this.session,t=e.multiSelect,i=t.ranges,n=-1,r=i.filter(function(e){return e.cursor.row==n?!0:void(n=e.cursor.row)});if(i.length&&r.length!=i.length-1){r.forEach(function(e){t.substractPoint(e.cursor)});var o=0,s=1/0,a=i.map(function(t){var i=t.cursor,n=e.getLine(i.row),r=n.substr(i.column).search(/\S/g);return-1==r&&(r=0),i.column>o&&(o=i.column),s>r&&(s=r),r});i.forEach(function(t,i){var n=t.cursor,r=o-n.column,c=a[i]-s;r>c?e.insert(n,u.stringRepeat(" ",r-c)):e.remove(new l(n.row,n.column,n.row,n.column-r+c)),t.start.column=t.end.column=o,t.start.row=t.end.row=n.row,t.cursor=t.end}),t.fromOrientedRange(i[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}else{var c=this.selection.getRange(),h=c.start.row,d=c.end.row,f=h==d;if(f){var p,m=this.session.getLength();do p=this.session.getLine(d);while(/[=:]/.test(p)&&++d0);0>h&&(h=0),d>=m&&(d=m-1)}var g=this.session.removeFullLines(h,d);g=this.$reAlignText(g,f),this.session.insert({row:h,column:0},g.join("\n")+"\n"),f||(c.start.column=0,c.end.column=g[g.length-1].length),this.selection.setRange(c)}},this.$reAlignText=function(e,t){function i(e){return u.stringRepeat(" ",e)}function n(e){return e[2]?i(s)+e[2]+i(a-e[2].length+l)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function r(e){return e[2]?i(s+a-e[2].length)+e[2]+i(l," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function o(e){return e[2]?i(s)+e[2]+i(l)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var s,a,l,c=!0,h=!0;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?null==s?(s=t[1].length,a=t[2].length,l=t[3].length,t):(s+a+l!=t[1].length+t[2].length+t[3].length&&(h=!1),s!=t[1].length&&(c=!1),s>t[1].length&&(s=t[1].length),at[3].length&&(l=t[3].length),t):[e]}).map(t?n:c?h?r:n:o)}}).call(v.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var i=e.oldSession;i&&(i.multiSelect.off("addRange",this.$onAddRange),i.multiSelect.off("removeRange",this.$onRemoveRange),i.multiSelect.off("multiSelect",this.$onMultiSelect),i.multiSelect.off("singleSelect",this.$onSingleSelect),i.multiSelect.lead.off("change",this.$checkMultiselectChange),i.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=o,e("./config").defineOptions(v.prototype,"editor",{enableMultiselect:{set:function(e){o(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",h)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",h))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,i){"use strict";var n=e("../../range").Range,r=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,i){var n=e.getLine(i);return this.foldingStartMarker.test(n)?"start":"markbeginend"==t&&this.foldingStopMarker&&this.foldingStopMarker.test(n)?"end":""},this.getFoldWidgetRange=function(e,t,i){return null},this.indentationBlock=function(e,t,i){var r=/\S/,o=e.getLine(t),s=o.search(r);if(-1!=s){for(var a=i||o.length,l=e.getLength(),c=t,h=t;++t=d)break;h=t}}if(h>c){var u=e.getLine(h).length;return new n(c,a,h,u)}}},this.openingBracketBlock=function(e,t,i,r,o){var s={row:i,column:r+1},a=e.$findClosingBracket(t,s,o);if(a){var l=e.foldWidgets[a.row];return null==l&&(l=e.getFoldWidget(a.row)),"start"==l&&a.row>s.row&&(a.row--,a.column=e.getLine(a.row).length),n.fromPoints(s,a)}},this.closingBracketBlock=function(e,t,i,r,o){var s={row:i,column:r},a=e.$findOpeningBracket(t,s);return a?(a.column++,s.column--,n.fromPoints(a,s)):void 0}}).call(r.prototype)}),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,i){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter { background: #f0f0f0; color: #333; } .ace-tm .ace_print-margin { width: 1px; background: #e8e8e8; } .ace-tm .ace_fold { background-color: #6B72E6; } .ace-tm { background-color: #FFFFFF; color: black; } .ace-tm .ace_cursor { color: black; } .ace-tm .ace_invisible { color: rgb(191, 191, 191); } .ace-tm .ace_storage, .ace-tm .ace_keyword { color: blue; } .ace-tm .ace_constant { color: rgb(197, 6, 11); } .ace-tm .ace_constant.ace_buildin { color: rgb(88, 72, 246); } .ace-tm .ace_constant.ace_language { color: rgb(88, 92, 246); } .ace-tm .ace_constant.ace_library { color: rgb(6, 150, 14); } .ace-tm .ace_invalid { background-color: rgba(255, 0, 0, 0.1); color: red; } .ace-tm .ace_support.ace_function { color: rgb(60, 76, 114); } .ace-tm .ace_support.ace_constant { color: rgb(6, 150, 14); } .ace-tm .ace_support.ace_type, .ace-tm .ace_support.ace_class { color: rgb(109, 121, 222); } .ace-tm .ace_keyword.ace_operator { color: rgb(104, 118, 135); } .ace-tm .ace_string { color: rgb(3, 106, 7); } .ace-tm .ace_comment { color: rgb(76, 136, 107); } .ace-tm .ace_comment.ace_doc { color: rgb(0, 102, 255); } .ace-tm .ace_comment.ace_doc.ace_tag { color: rgb(128, 159, 191); } .ace-tm .ace_constant.ace_numeric { color: rgb(0, 0, 205); } .ace-tm .ace_variable { color: rgb(49, 132, 149); } .ace-tm .ace_xml-pe { color: rgb(104, 104, 91); } .ace-tm .ace_entity.ace_name.ace_function { color: #0000A2; } .ace-tm .ace_heading { color: rgb(12, 7, 255); } .ace-tm .ace_list { color:rgb(185, 6, 144); } .ace-tm .ace_meta.ace_tag { color:rgb(0, 22, 142); } .ace-tm .ace_string.ace_regex { color: rgb(255, 0, 0) } .ace-tm .ace_marker-layer .ace_selection { background: rgb(181, 213, 255); } .ace-tm.ace_multiselect .ace_selection.ace_start { box-shadow: 0 0 3px 0px white; } .ace-tm .ace_marker-layer .ace_step { background: rgb(252, 255, 0); } .ace-tm .ace_marker-layer .ace_stack { background: rgb(164, 229, 101); } .ace-tm .ace_marker-layer .ace_bracket { margin: -1px 0 0 -1px; border: 1px solid rgb(192, 192, 192); } .ace-tm .ace_marker-layer .ace_active-line { background: rgba(0, 0, 0, 0.07); } .ace-tm .ace_gutter-active-line { background-color : #dcdcdc; } .ace-tm .ace_marker-layer .ace_selected-word { background: rgb(250, 250, 255); border: 1px solid rgb(200, 200, 250); } .ace-tm .ace_indent-guide { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y; } ';var n=e("../lib/dom");n.importCssString(t.cssText,t.cssClass)}),ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,i){"use strict";function n(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=(e("./lib/oop"),e("./lib/dom"));e("./range").Range;(function(){this.getRowLength=function(e){var t;return t=this.lineWidgets?this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:0,this.$useWrapMode&&this.$wrapData[e]?this.$wrapData[e].length+1+t:1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach(),this.editor!=e&&(this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets)))},this.detach=function(e){var t=this.editor;if(t){this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var i=this.session.lineWidgets;i&&i.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})}},this.updateOnFold=function(e,t){var i=t.lineWidgets;if(i&&e.action){for(var n=e.data,r=n.start.row,o=n.end.row,s="add"==e.action,a=r+1;o>a;a++)i[a]&&(i[a].hidden=s);i[o]&&(s?i[r]?i[o].hidden=s:i[r]=i[o]:(i[r]==i[o]&&(i[r]=void 0),i[o].hidden=s))}},this.updateOnChange=function(e){var t=this.session.lineWidgets;if(t){var i=e.start.row,n=e.end.row-i;if(0===n);else if("remove"==e.action){var r=t.splice(i+1,n);r.forEach(function(e){e&&this.removeLineWidget(e)},this),this.$updateRows()}else{var o=new Array(n);o.unshift(i,0),t.splice.apply(t,o),this.$updateRows()}}},this.$updateRows=function(){var e=this.session.lineWidgets;if(e){var t=!0;e.forEach(function(e,i){if(e)for(t=!1,e.row=i;e.$oldWidget;)e.$oldWidget.row=i,e=e.$oldWidget}),t&&(this.session.lineWidgets=null)}},this.addLineWidget=function(e){this.session.lineWidgets||(this.session.lineWidgets=new Array(this.session.getLength()));var t=this.session.lineWidgets[e.row];t&&(e.$oldWidget=t,t.el&&t.el.parentNode&&(t.el.parentNode.removeChild(t.el),t._inDocument=!1)),this.session.lineWidgets[e.row]=e,e.session=this.session;var i=this.editor.renderer;e.html&&!e.el&&(e.el=r.createElement("div"),e.el.innerHTML=e.html),e.el&&(r.addCssClass(e.el,"ace_lineWidgetContainer"),e.el.style.position="absolute",e.el.style.zIndex=5,i.container.appendChild(e.el),e._inDocument=!0),e.coverGutter||(e.el.style.zIndex=3),e.pixelHeight||(e.pixelHeight=e.el.offsetHeight),null==e.rowCount&&(e.rowCount=e.pixelHeight/i.layerConfig.lineHeight);var n=this.session.getFoldAt(e.row,0);if(e.$fold=n,n){var o=this.session.lineWidgets;e.row!=n.end.row||o[n.start.row]?e.hidden=!0:o[n.start.row]=e}return this.session._emit("changeFold",{data:{start:{row:e.row}}}),this.$updateRows(),this.renderWidgets(null,i),this.onWidgetChanged(e),e},this.removeLineWidget=function(e){if(e._inDocument=!1,e.session=null,e.el&&e.el.parentNode&&e.el.parentNode.removeChild(e.el),e.editor&&e.editor.destroy)try{e.editor.destroy()}catch(t){}if(this.session.lineWidgets){var i=this.session.lineWidgets[e.row];if(i==e)this.session.lineWidgets[e.row]=e.$oldWidget,e.$oldWidget&&this.onWidgetChanged(e.$oldWidget);else for(;i;){if(i.$oldWidget==e){i.$oldWidget=e.$oldWidget;break}i=i.$oldWidget}}this.session._emit("changeFold",{data:{start:{row:e.row}}}),this.$updateRows()},this.getWidgetsAtRow=function(e){for(var t=this.session.lineWidgets,i=t&&t[e],n=[];i;)n.push(i),i=i.$oldWidget;return n},this.onWidgetChanged=function(e){this.session._changedWidgets.push(e),this.editor&&this.editor.renderer.updateFull()},this.measureWidgets=function(e,t){var i=this.session._changedWidgets,n=t.layerConfig;if(i&&i.length){for(var r=1/0,o=0;oa&&(a=0)),s.rowCount!=a&&(s.rowCount=a,s.row0&&!n[r];)r--;this.firstRow=i.firstRow,this.lastRow=i.lastRow,t.$cursorLayer.config=i;for(var s=r;o>=s;s++){var a=n[s];if(a&&a.el)if(a.hidden)a.el.style.top=-100-(a.pixelHeight||0)+"px";else{a._inDocument||(a._inDocument=!0,t.container.appendChild(a.el));var l=t.$cursorLayer.getPixelPosition({row:s,column:0},!0).top;a.coverLine||(l+=i.lineHeight*this.session.getRowLineCount(a.row)),a.el.style.top=l-i.offset+"px";var c=a.coverGutter?0:t.gutterWidth;a.fixedWidth||(c-=t.scrollLeft),a.el.style.left=c+"px",a.fullWidth&&a.screenWidth&&(a.el.style.minWidth=i.width+2*i.padding+"px"),a.fixedWidth?a.el.style.right=t.scrollBar.getWidth()+"px":a.el.style.right=""}}}}}).call(n.prototype),t.LineWidgets=n}),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,i){"use strict";function n(e,t,i){for(var n=0,r=e.length-1;r>=n;){var o=n+r>>1,s=i(t,e[o]);if(s>0)n=o+1;else{if(!(0>s))return o;r=o-1}}return-(n+1)}function r(e,t,i){var r=e.getAnnotations().sort(a.comparePoints);if(r.length){var o=n(r,{row:t,column:-1},a.comparePoints);0>o&&(o=-o-1),o>=r.length?o=i>0?0:r.length-1:0===o&&0>i&&(o=r.length-1);var s=r[o];if(s&&i){if(s.row===t){do s=r[o+=i];while(s&&s.row===t);if(!s)return r.slice()}var l=[];t=s.row; +do l[0>i?"unshift":"push"](s),s=r[o+=i];while(s&&s.row==t);return l.length&&l}}}var o=e("../line_widgets").LineWidgets,s=e("../lib/dom"),a=e("../range").Range;t.showErrorMarker=function(e,t){var i=e.session;i.widgetManager||(i.widgetManager=new o(i),i.widgetManager.attach(e));var n=e.getCursorPosition(),a=n.row,l=i.widgetManager.getWidgetsAtRow(a).filter(function(e){return"errorMarker"==e.type})[0];l?l.destroy():a-=t;var c,h=r(i,a,t);if(h){var d=h[0];n.column=(d.pos&&"number"!=typeof d.column?d.pos.sc:d.column)||0,n.row=d.row,c=e.renderer.$gutterLayer.$annotations[n.row]}else{if(l)return;c={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(n.row),e.selection.moveToPosition(n);var u={row:n.row,fixedWidth:!0,coverGutter:!0,el:s.createElement("div"),type:"errorMarker"},f=u.el.appendChild(s.createElement("div")),p=u.el.appendChild(s.createElement("div"));p.className="error_widget_arrow "+c.className;var m=e.renderer.$cursorLayer.getPixelPosition(n).left;p.style.left=m+e.renderer.gutterWidth-5+"px",u.el.className="error_widget_wrapper",f.className="error_widget "+c.className,f.innerHTML=c.text.join("
"),f.appendChild(s.createElement("div"));var g=function(e,t,i){return 0!==t||"esc"!==i&&"return"!==i?void 0:(u.destroy(),{command:"null"})};u.destroy=function(){e.$mouseHandler.isMousePressed||(e.keyBinding.removeKeyboardHandler(g),i.widgetManager.removeLineWidget(u),e.off("changeSelection",u.destroy),e.off("changeSession",u.destroy),e.off("mouseup",u.destroy),e.off("change",u.destroy))},e.keyBinding.addKeyboardHandler(g),e.on("changeSelection",u.destroy),e.on("changeSession",u.destroy),e.on("mouseup",u.destroy),e.on("change",u.destroy),e.session.widgetManager.addLineWidget(u),u.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:u.el.offsetHeight})},s.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; } ","")}),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,i){"use strict";e("./lib/fixoldbrowsers");var n=e("./lib/dom"),r=e("./lib/event"),o=e("./editor").Editor,s=e("./edit_session").EditSession,a=e("./undomanager").UndoManager,l=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.acequire=e,t.edit=function(e){if("string"==typeof e){var i=e;if(e=document.getElementById(i),!e)throw new Error("ace.edit can't find div #"+i)}if(e&&e.env&&e.env.editor instanceof o)return e.env.editor;var s="";if(e&&/input|textarea/i.test(e.tagName)){var a=e;s=a.value,e=n.createElement("pre"),a.parentNode.replaceChild(e,a)}else e&&(s=n.getInnerText(e),e.innerHTML="");var c=t.createEditSession(s),h=new o(new l(e));h.setSession(c);var d={document:c,editor:h,onResize:h.resize.bind(h,null)};return a&&(d.textarea=a),r.addListener(window,"resize",d.onResize),h.on("destroy",function(){r.removeListener(window,"resize",d.onResize),d.editor.container.env=null}),h.container.env=h.env=d,h},t.createEditSession=function(e,t){var i=new s(e,t);return i.setUndoManager(new a),i},t.EditSession=s,t.UndoManager=a,t.version="1.2.3"}),function(){ace.acequire(["ace/ace"],function(e){e&&e.config.init(!0),window.ace||(window.ace=e);for(var t in e)e.hasOwnProperty(t)&&(window.ace[t]=e[t])})}(),e.exports=window.ace.acequire("ace/ace")},function(e,t){e.exports=function(){throw new Error("define cannot be used indirect")}},function(e,t){(function(t){function i(){if(t.Blob)try{return new Blob(["asdf"],{type:"text/plain"}),Blob}catch(e){}var i=t.WebKitBlobBuilder||t.MozBlobBuilder||t.MSBlobBuilder;return function(e,t){var n=new i,r=t.endings,o=t.type;if(r)for(var s=0,a=e.length;a>s;++s)n.append(e[s],r);else for(var s=0,a=e.length;a>s;++s)n.append(e[s]);return o?n.getBlob(o):n.getBlob()}}e.exports=i()}).call(t,function(){return this}())},function(e,t,i){ace.define("ace/mode/json_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,i){"use strict";var n=e("../lib/oop"),r=e("./text_highlight_rules").TextHighlightRules,o=function(){this.$rules={start:[{token:"variable",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]\\s*(?=:)'},{token:"string",regex:'"',next:"string"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:"invalid.illegal",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"invalid.illegal",regex:"\\/\\/.*$"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],string:[{token:"constant.language.escape",regex:/\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|["\\\/bfnrt])/},{token:"string",regex:'[^"\\\\]+'},{token:"string",regex:'"',next:"start"},{token:"string",regex:"",next:"start"}]}};n.inherits(o,r),t.JsonHighlightRules=o}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,i){"use strict";var n=e("../range").Range,r=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var i=e.getLine(t),r=i.match(/^(\s*\})/);if(!r)return 0;var o=r[1].length,s=e.findMatchingBracket({row:t,column:o});if(!s||s.row==t)return 0;var a=this.$getIndent(e.getLine(s.row));e.replace(new n(t,0,t,o-1),a)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(r.prototype),t.MatchingBraceOutdent=r}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,i){"use strict";var n,r=e("../../lib/oop"),o=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,a=e("../../lib/lang"),l=["text","paren.rparen","punctuation.operator"],c=["text","paren.rparen","punctuation.operator","comment"],h={},d=function(e){var t=-1;return e.multiSelect&&(t=e.selection.index,h.rangeCount!=e.multiSelect.rangeCount&&(h={rangeCount:e.multiSelect.rangeCount})),h[t]?n=h[t]:void(n=h[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""})},u=function(e,t,i,n){var r=e.end.row-e.start.row;return{text:i+t+n,selection:[0,e.start.column+1,r,e.end.column+(r?0:1)]}},f=function(){this.add("braces","insertion",function(e,t,i,r,o){var s=i.getCursorPosition(),l=r.doc.getLine(s.row);if("{"==o){d(i);var c=i.getSelectionRange(),h=r.doc.getTextRange(c);if(""!==h&&"{"!==h&&i.getWrapBehavioursEnabled())return u(c,h,"{","}");if(f.isSaneInsertion(i,r))return/[\]\}\)]/.test(l[s.column])||i.inMultiSelectMode?(f.recordAutoInsert(i,r,"}"),{text:"{}",selection:[1,1]}):(f.recordMaybeInsert(i,r,"{"),{text:"{",selection:[1,1]})}else if("}"==o){d(i);var p=l.substring(s.column,s.column+1);if("}"==p){var m=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(null!==m&&f.isAutoInsertedClosing(s,l,o))return f.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if("\n"==o||"\r\n"==o){d(i);var g="";f.isMaybeInsertedClosing(s,l)&&(g=a.stringRepeat("}",n.maybeInsertedBrackets),f.clearMaybeInsertedClosing());var p=l.substring(s.column,s.column+1);if("}"===p){var v=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!v)return null;var w=this.$getIndent(r.getLine(v.row))}else{if(!g)return void f.clearMaybeInsertedClosing();var w=this.$getIndent(l)}var y=w+r.getTabString();return{text:"\n"+y+"\n"+w+g,selection:[1,y.length,1,y.length]}}f.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,i,r,o){var s=r.doc.getTextRange(o);if(!o.isMultiLine()&&"{"==s){d(i);var a=r.doc.getLine(o.start.row),l=a.substring(o.end.column,o.end.column+1);if("}"==l)return o.end.column++,o;n.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,i,n,r){if("("==r){d(i);var o=i.getSelectionRange(),s=n.doc.getTextRange(o);if(""!==s&&i.getWrapBehavioursEnabled())return u(o,s,"(",")");if(f.isSaneInsertion(i,n))return f.recordAutoInsert(i,n,")"),{text:"()",selection:[1,1]}}else if(")"==r){d(i);var a=i.getCursorPosition(),l=n.doc.getLine(a.row),c=l.substring(a.column,a.column+1);if(")"==c){var h=n.$findOpeningBracket(")",{column:a.column+1,row:a.row});if(null!==h&&f.isAutoInsertedClosing(a,l,r))return f.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,i,n,r){var o=n.doc.getTextRange(r);if(!r.isMultiLine()&&"("==o){d(i);var s=n.doc.getLine(r.start.row),a=s.substring(r.start.column+1,r.start.column+2);if(")"==a)return r.end.column++,r}}),this.add("brackets","insertion",function(e,t,i,n,r){if("["==r){d(i);var o=i.getSelectionRange(),s=n.doc.getTextRange(o);if(""!==s&&i.getWrapBehavioursEnabled())return u(o,s,"[","]");if(f.isSaneInsertion(i,n))return f.recordAutoInsert(i,n,"]"),{text:"[]",selection:[1,1]}}else if("]"==r){d(i);var a=i.getCursorPosition(),l=n.doc.getLine(a.row),c=l.substring(a.column,a.column+1);if("]"==c){var h=n.$findOpeningBracket("]",{column:a.column+1,row:a.row});if(null!==h&&f.isAutoInsertedClosing(a,l,r))return f.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,i,n,r){var o=n.doc.getTextRange(r);if(!r.isMultiLine()&&"["==o){d(i);var s=n.doc.getLine(r.start.row),a=s.substring(r.start.column+1,r.start.column+2);if("]"==a)return r.end.column++,r}}),this.add("string_dquotes","insertion",function(e,t,i,n,r){if('"'==r||"'"==r){d(i);var o=r,s=i.getSelectionRange(),a=n.doc.getTextRange(s);if(""!==a&&"'"!==a&&'"'!=a&&i.getWrapBehavioursEnabled())return u(s,a,o,o);if(!a){var l=i.getCursorPosition(),c=n.doc.getLine(l.row),h=c.substring(l.column-1,l.column),f=c.substring(l.column,l.column+1),p=n.getTokenAt(l.row,l.column),m=n.getTokenAt(l.row,l.column+1);if("\\"==h&&p&&/escape/.test(p.type))return null;var g,v=p&&/string|escape/.test(p.type),w=!m||/string|escape/.test(m.type);if(f==o)g=v!==w;else{if(v&&!w)return null;if(v&&w)return null;var y=n.$mode.tokenRe;y.lastIndex=0;var A=y.test(h);y.lastIndex=0;var C=y.test(h);if(A||C)return null;if(f&&!/[\s;,.})\]\\]/.test(f))return null;g=!0}return{text:g?o+o:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,i,n,r){var o=n.doc.getTextRange(r);if(!r.isMultiLine()&&('"'==o||"'"==o)){d(i);var s=n.doc.getLine(r.start.row),a=s.substring(r.start.column+1,r.start.column+2);if(a==o)return r.end.column++,r}})};f.isSaneInsertion=function(e,t){var i=e.getCursorPosition(),n=new s(t,i.row,i.column);if(!this.$matchTokenType(n.getCurrentToken()||"text",l)){var r=new s(t,i.row,i.column+1);if(!this.$matchTokenType(r.getCurrentToken()||"text",l))return!1}return n.stepForward(),n.getCurrentTokenRow()!==i.row||this.$matchTokenType(n.getCurrentToken()||"text",c)},f.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},f.recordAutoInsert=function(e,t,i){var r=e.getCursorPosition(),o=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,o,n.autoInsertedLineEnd[0])||(n.autoInsertedBrackets=0),n.autoInsertedRow=r.row,n.autoInsertedLineEnd=i+o.substr(r.column),n.autoInsertedBrackets++},f.recordMaybeInsert=function(e,t,i){var r=e.getCursorPosition(),o=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,o)||(n.maybeInsertedBrackets=0),n.maybeInsertedRow=r.row,n.maybeInsertedLineStart=o.substr(0,r.column)+i,n.maybeInsertedLineEnd=o.substr(r.column),n.maybeInsertedBrackets++},f.isAutoInsertedClosing=function(e,t,i){return n.autoInsertedBrackets>0&&e.row===n.autoInsertedRow&&i===n.autoInsertedLineEnd[0]&&t.substr(e.column)===n.autoInsertedLineEnd},f.isMaybeInsertedClosing=function(e,t){return n.maybeInsertedBrackets>0&&e.row===n.maybeInsertedRow&&t.substr(e.column)===n.maybeInsertedLineEnd&&t.substr(0,e.column)==n.maybeInsertedLineStart},f.popAutoInsertedClosing=function(){n.autoInsertedLineEnd=n.autoInsertedLineEnd.substr(1),n.autoInsertedBrackets--},f.clearMaybeInsertedClosing=function(){n&&(n.maybeInsertedBrackets=0,n.maybeInsertedRow=-1)},r.inherits(f,o),t.CstyleBehaviour=f}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,i){"use strict";var n=e("../../lib/oop"),r=e("../../range").Range,o=e("./fold_mode").FoldMode,s=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};n.inherits(s,o),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,i){var n=e.getLine(i);if(this.singleLineBlockCommentRe.test(n)&&!this.startRegionRe.test(n)&&!this.tripleStarBlockCommentRe.test(n))return"";var r=this._getFoldWidgetBase(e,t,i);return!r&&this.startRegionRe.test(n)?"start":r},this.getFoldWidgetRange=function(e,t,i,n){var r=e.getLine(i);if(this.startRegionRe.test(r))return this.getCommentRegionBlock(e,r,i);var o=r.match(this.foldingStartMarker);if(o){var s=o.index;if(o[1])return this.openingBracketBlock(e,o[1],i,s);var a=e.getCommentFoldRange(i,s+o[0].length,1);return a&&!a.isMultiLine()&&(n?a=this.getSectionRange(e,i):"all"!=t&&(a=null)),a}if("markbegin"!==t){var o=r.match(this.foldingStopMarker);if(o){var s=o.index+o[0].length;return o[1]?this.closingBracketBlock(e,o[1],i,s):e.getCommentFoldRange(i,s,-1)}}},this.getSectionRange=function(e,t){var i=e.getLine(t),n=i.search(/\S/),o=t,s=i.length;t+=1;for(var a=t,l=e.getLength();++tc)break;var h=this.getFoldWidgetRange(e,"all",t);if(h){if(h.start.row<=o)break;if(h.isMultiLine())t=h.end.row;else if(n==c)break}a=t}}return new r(o,s,a,e.getLine(a).length)},this.getCommentRegionBlock=function(e,t,i){for(var n=t.search(/\s*$/),o=e.getLength(),s=i,a=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,l=1;++is?new r(s,n,h,t.length):void 0}}.call(s.prototype)}),ace.define("ace/mode/json",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/json_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),o=e("./text").Mode,s=e("./json_highlight_rules").JsonHighlightRules,a=e("./matching_brace_outdent").MatchingBraceOutdent,l=e("./behaviour/cstyle").CstyleBehaviour,c=e("./folding/cstyle").FoldMode,h=e("../worker/worker_client").WorkerClient,d=function(){this.HighlightRules=s,this.$outdent=new a,this.$behaviour=new l,this.foldingRules=new c};r.inherits(d,o),function(){this.getNextLineIndent=function(e,t,i){var n=this.$getIndent(t);if("start"==e){var r=t.match(/^.*[\{\(\[]\s*$/);r&&(n+=i)}return n},this.checkOutdent=function(e,t,i){return this.$outdent.checkOutdent(t,i)},this.autoOutdent=function(e,t,i){this.$outdent.autoOutdent(t,i)},this.createWorker=function(e){var t=new h(["ace"],i(68),"JsonWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/json"}.call(d.prototype),t.Mode=d})},function(e,t){e.exports.id="ace/mode/json_worker",e.exports.src='"no use strict";(function(window){function resolveModuleId(id,paths){for(var testPath=id,tail="";testPath;){var alias=paths[testPath];if("string"==typeof alias)return alias+tail;if(alias)return alias.location.replace(/\\/*$/,"/")+(tail||alias.main||alias.name);if(alias===!1)return"";var i=testPath.lastIndexOf("/");if(-1===i)break;tail=testPath.substr(i)+tail,testPath=testPath.slice(0,i)}return id}if(!(void 0!==window.window&&window.document||window.acequire&&window.define)){window.console||(window.console=function(){var msgs=Array.prototype.slice.call(arguments,0);postMessage({type:"log",data:msgs})},window.console.error=window.console.warn=window.console.log=window.console.trace=window.console),window.window=window,window.ace=window,window.onerror=function(message,file,line,col,err){postMessage({type:"error",data:{message:message,data:err.data,file:file,line:line,col:col,stack:err.stack}})},window.normalizeModule=function(parentId,moduleName){if(-1!==moduleName.indexOf("!")){var chunks=moduleName.split("!");return window.normalizeModule(parentId,chunks[0])+"!"+window.normalizeModule(parentId,chunks[1])}if("."==moduleName.charAt(0)){var base=parentId.split("/").slice(0,-1).join("/");for(moduleName=(base?base+"/":"")+moduleName;-1!==moduleName.indexOf(".")&&previous!=moduleName;){var previous=moduleName;moduleName=moduleName.replace(/^\\.\\//,"").replace(/\\/\\.\\//,"/").replace(/[^\\/]+\\/\\.\\.\\//,"")}}return moduleName},window.acequire=function acequire(parentId,id){if(id||(id=parentId,parentId=null),!id.charAt)throw Error("worker.js acequire() accepts only (parentId, id) as arguments");id=window.normalizeModule(parentId,id);var module=window.acequire.modules[id];if(module)return module.initialized||(module.initialized=!0,module.exports=module.factory().exports),module.exports;if(!window.acequire.tlns)return console.log("unable to load "+id);var path=resolveModuleId(id,window.acequire.tlns);return".js"!=path.slice(-3)&&(path+=".js"),window.acequire.id=id,window.acequire.modules[id]={},importScripts(path),window.acequire(parentId,id)},window.acequire.modules={},window.acequire.tlns={},window.define=function(id,deps,factory){if(2==arguments.length?(factory=deps,"string"!=typeof id&&(deps=id,id=window.acequire.id)):1==arguments.length&&(factory=id,deps=[],id=window.acequire.id),"function"!=typeof factory)return window.acequire.modules[id]={exports:factory,initialized:!0},void 0;deps.length||(deps=["require","exports","module"]);var req=function(childId){return window.acequire(id,childId)};window.acequire.modules[id]={exports:{},factory:function(){var module=this,returnExports=factory.apply(this,deps.map(function(dep){switch(dep){case"require":return req;case"exports":return module.exports;case"module":return module;default:return req(dep)}}));return returnExports&&(module.exports=returnExports),module}}},window.define.amd={},acequire.tlns={},window.initBaseUrls=function(topLevelNamespaces){for(var i in topLevelNamespaces)acequire.tlns[i]=topLevelNamespaces[i]},window.initSender=function(){var EventEmitter=window.acequire("ace/lib/event_emitter").EventEmitter,oop=window.acequire("ace/lib/oop"),Sender=function(){};return function(){oop.implement(this,EventEmitter),this.callback=function(data,callbackId){postMessage({type:"call",id:callbackId,data:data})},this.emit=function(name,data){postMessage({type:"event",name:name,data:data})}}.call(Sender.prototype),new Sender};var main=window.main=null,sender=window.sender=null;window.onmessage=function(e){var msg=e.data;if(msg.event&&sender)sender._signal(msg.event,msg.data);else if(msg.command)if(main[msg.command])main[msg.command].apply(main,msg.args);else{if(!window[msg.command])throw Error("Unknown command:"+msg.command);window[msg.command].apply(window,msg.args)}else if(msg.init){window.initBaseUrls(msg.tlns),acequire("ace/lib/es5-shim"),sender=window.sender=window.initSender();var clazz=acequire(msg.module)[msg.classname];main=window.main=new clazz(sender)}}}})(this),ace.define("ace/lib/oop",["require","exports","module"],function(acequire,exports){"use strict";exports.inherits=function(ctor,superCtor){ctor.super_=superCtor,ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:!1,writable:!0,configurable:!0}})},exports.mixin=function(obj,mixin){for(var key in mixin)obj[key]=mixin[key];return obj},exports.implement=function(proto,mixin){exports.mixin(proto,mixin)}}),ace.define("ace/range",["require","exports","module"],function(acequire,exports){"use strict";var comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},Range=function(startRow,startColumn,endRow,endColumn){this.start={row:startRow,column:startColumn},this.end={row:endRow,column:endColumn}};(function(){this.isEqual=function(range){return this.start.row===range.start.row&&this.end.row===range.end.row&&this.start.column===range.start.column&&this.end.column===range.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(row,column){return 0==this.compare(row,column)},this.compareRange=function(range){var cmp,end=range.end,start=range.start;return cmp=this.compare(end.row,end.column),1==cmp?(cmp=this.compare(start.row,start.column),1==cmp?2:0==cmp?1:0):-1==cmp?-2:(cmp=this.compare(start.row,start.column),-1==cmp?-1:1==cmp?42:0)},this.comparePoint=function(p){return this.compare(p.row,p.column)},this.containsRange=function(range){return 0==this.comparePoint(range.start)&&0==this.comparePoint(range.end)},this.intersects=function(range){var cmp=this.compareRange(range);return-1==cmp||0==cmp||1==cmp},this.isEnd=function(row,column){return this.end.row==row&&this.end.column==column},this.isStart=function(row,column){return this.start.row==row&&this.start.column==column},this.setStart=function(row,column){"object"==typeof row?(this.start.column=row.column,this.start.row=row.row):(this.start.row=row,this.start.column=column)},this.setEnd=function(row,column){"object"==typeof row?(this.end.column=row.column,this.end.row=row.row):(this.end.row=row,this.end.column=column)},this.inside=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)||this.isStart(row,column)?!1:!0:!1},this.insideStart=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)?!1:!0:!1},this.insideEnd=function(row,column){return 0==this.compare(row,column)?this.isStart(row,column)?!1:!0:!1},this.compare=function(row,column){return this.isMultiLine()||row!==this.start.row?this.start.row>row?-1:row>this.end.row?1:this.start.row===row?column>=this.start.column?0:-1:this.end.row===row?this.end.column>=column?0:1:0:this.start.column>column?-1:column>this.end.column?1:0},this.compareStart=function(row,column){return this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.compareEnd=function(row,column){return this.end.row==row&&this.end.column==column?1:this.compare(row,column)},this.compareInside=function(row,column){return this.end.row==row&&this.end.column==column?1:this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.clipRows=function(firstRow,lastRow){if(this.end.row>lastRow)var end={row:lastRow+1,column:0};else if(firstRow>this.end.row)var end={row:firstRow,column:0};if(this.start.row>lastRow)var start={row:lastRow+1,column:0};else if(firstRow>this.start.row)var start={row:firstRow,column:0};return Range.fromPoints(start||this.start,end||this.end)},this.extend=function(row,column){var cmp=this.compare(row,column);if(0==cmp)return this;if(-1==cmp)var start={row:row,column:column};else var end={row:row,column:column};return Range.fromPoints(start||this.start,end||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return Range.fromPoints(this.start,this.end)},this.collapseRows=function(){return 0==this.end.column?new Range(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new Range(this.start.row,0,this.end.row,0)},this.toScreenRange=function(session){var screenPosStart=session.documentToScreenPosition(this.start),screenPosEnd=session.documentToScreenPosition(this.end);return new Range(screenPosStart.row,screenPosStart.column,screenPosEnd.row,screenPosEnd.column)},this.moveBy=function(row,column){this.start.row+=row,this.start.column+=column,this.end.row+=row,this.end.column+=column}}).call(Range.prototype),Range.fromPoints=function(start,end){return new Range(start.row,start.column,end.row,end.column)},Range.comparePoints=comparePoints,Range.comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},exports.Range=Range}),ace.define("ace/apply_delta",["require","exports","module"],function(acequire,exports){"use strict";exports.applyDelta=function(docLines,delta){var row=delta.start.row,startColumn=delta.start.column,line=docLines[row]||"";switch(delta.action){case"insert":var lines=delta.lines;if(1===lines.length)docLines[row]=line.substring(0,startColumn)+delta.lines[0]+line.substring(startColumn);else{var args=[row,1].concat(delta.lines);docLines.splice.apply(docLines,args),docLines[row]=line.substring(0,startColumn)+docLines[row],docLines[row+delta.lines.length-1]+=line.substring(startColumn)}break;case"remove":var endColumn=delta.end.column,endRow=delta.end.row;row===endRow?docLines[row]=line.substring(0,startColumn)+line.substring(endColumn):docLines.splice(row,endRow-row+1,line.substring(0,startColumn)+docLines[endRow].substring(endColumn))}}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(acequire,exports){"use strict";var EventEmitter={},stopPropagation=function(){this.propagationStopped=!0},preventDefault=function(){this.defaultPrevented=!0};EventEmitter._emit=EventEmitter._dispatchEvent=function(eventName,e){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var listeners=this._eventRegistry[eventName]||[],defaultHandler=this._defaultHandlers[eventName];if(listeners.length||defaultHandler){"object"==typeof e&&e||(e={}),e.type||(e.type=eventName),e.stopPropagation||(e.stopPropagation=stopPropagation),e.preventDefault||(e.preventDefault=preventDefault),listeners=listeners.slice();for(var i=0;listeners.length>i&&(listeners[i](e,this),!e.propagationStopped);i++);return defaultHandler&&!e.defaultPrevented?defaultHandler(e,this):void 0}},EventEmitter._signal=function(eventName,e){var listeners=(this._eventRegistry||{})[eventName];if(listeners){listeners=listeners.slice();for(var i=0;listeners.length>i;i++)listeners[i](e,this)}},EventEmitter.once=function(eventName,callback){var _self=this;callback&&this.addEventListener(eventName,function newCallback(){_self.removeEventListener(eventName,newCallback),callback.apply(null,arguments)})},EventEmitter.setDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers||(handlers=this._defaultHandlers={_disabled_:{}}),handlers[eventName]){var old=handlers[eventName],disabled=handlers._disabled_[eventName];disabled||(handlers._disabled_[eventName]=disabled=[]),disabled.push(old);var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}handlers[eventName]=callback},EventEmitter.removeDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers){var disabled=handlers._disabled_[eventName];if(handlers[eventName]==callback)handlers[eventName],disabled&&this.setDefaultHandler(eventName,disabled.pop());else if(disabled){var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}}},EventEmitter.on=EventEmitter.addEventListener=function(eventName,callback,capturing){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];return listeners||(listeners=this._eventRegistry[eventName]=[]),-1==listeners.indexOf(callback)&&listeners[capturing?"unshift":"push"](callback),callback},EventEmitter.off=EventEmitter.removeListener=EventEmitter.removeEventListener=function(eventName,callback){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];if(listeners){var index=listeners.indexOf(callback);-1!==index&&listeners.splice(index,1)}},EventEmitter.removeAllListeners=function(eventName){this._eventRegistry&&(this._eventRegistry[eventName]=[])},exports.EventEmitter=EventEmitter}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(acequire,exports){"use strict";var oop=acequire("./lib/oop"),EventEmitter=acequire("./lib/event_emitter").EventEmitter,Anchor=exports.Anchor=function(doc,row,column){this.$onChange=this.onChange.bind(this),this.attach(doc),column===void 0?this.setPosition(row.row,row.column):this.setPosition(row,column)};(function(){function $pointsInOrder(point1,point2,equalPointsInOrder){var bColIsAfter=equalPointsInOrder?point1.column<=point2.column:point1.columnthis.row)){var point=$getTransformedPoint(delta,{row:this.row,column:this.column},this.$insertRight);this.setPosition(point.row,point.column,!0)}},this.setPosition=function(row,column,noClip){var pos;if(pos=noClip?{row:row,column:column}:this.$clipPositionToDocument(row,column),this.row!=pos.row||this.column!=pos.column){var old={row:this.row,column:this.column};this.row=pos.row,this.column=pos.column,this._signal("change",{old:old,value:pos})}},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(doc){this.document=doc||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(row,column){var pos={};return row>=this.document.getLength()?(pos.row=Math.max(0,this.document.getLength()-1),pos.column=this.document.getLine(pos.row).length):0>row?(pos.row=0,pos.column=0):(pos.row=row,pos.column=Math.min(this.document.getLine(pos.row).length,Math.max(0,column))),0>column&&(pos.column=0),pos}}).call(Anchor.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(acequire,exports){"use strict";var oop=acequire("./lib/oop"),applyDelta=acequire("./apply_delta").applyDelta,EventEmitter=acequire("./lib/event_emitter").EventEmitter,Range=acequire("./range").Range,Anchor=acequire("./anchor").Anchor,Document=function(textOrLines){this.$lines=[""],0===textOrLines.length?this.$lines=[""]:Array.isArray(textOrLines)?this.insertMergedLines({row:0,column:0},textOrLines):this.insert({row:0,column:0},textOrLines)};(function(){oop.implement(this,EventEmitter),this.setValue=function(text){var len=this.getLength()-1;this.remove(new Range(0,0,len,this.getLine(len).length)),this.insert({row:0,column:0},text)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(row,column){return new Anchor(this,row,column)},this.$split=0==="aaa".split(/a/).length?function(text){return text.replace(/\\r\\n|\\r/g,"\\n").split("\\n")}:function(text){return text.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(text){var match=text.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=match?match[1]:"\\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\\r\\n";case"unix":return"\\n";default:return this.$autoNewLine||"\\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(newLineMode){this.$newLineMode!==newLineMode&&(this.$newLineMode=newLineMode,this._signal("changeNewLineMode"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(text){return"\\r\\n"==text||"\\r"==text||"\\n"==text},this.getLine=function(row){return this.$lines[row]||""},this.getLines=function(firstRow,lastRow){return this.$lines.slice(firstRow,lastRow+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(range){return this.getLinesForRange(range).join(this.getNewLineCharacter())},this.getLinesForRange=function(range){var lines;if(range.start.row===range.end.row)lines=[this.getLine(range.start.row).substring(range.start.column,range.end.column)];else{lines=this.getLines(range.start.row,range.end.row),lines[0]=(lines[0]||"").substring(range.start.column);var l=lines.length-1;range.end.row-range.start.row==l&&(lines[l]=lines[l].substring(0,range.end.column))}return lines},this.insertLines=function(row,lines){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(row,lines)},this.removeLines=function(firstRow,lastRow){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(firstRow,lastRow)},this.insertNewLine=function(position){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead."),this.insertMergedLines(position,["",""])},this.insert=function(position,text){return 1>=this.getLength()&&this.$detectNewLine(text),this.insertMergedLines(position,this.$split(text))},this.insertInLine=function(position,text){var start=this.clippedPos(position.row,position.column),end=this.pos(position.row,position.column+text.length);return this.applyDelta({start:start,end:end,action:"insert",lines:[text]},!0),this.clonePos(end)},this.clippedPos=function(row,column){var length=this.getLength();void 0===row?row=length:0>row?row=0:row>=length&&(row=length-1,column=void 0);var line=this.getLine(row);return void 0==column&&(column=line.length),column=Math.min(Math.max(column,0),line.length),{row:row,column:column}},this.clonePos=function(pos){return{row:pos.row,column:pos.column}},this.pos=function(row,column){return{row:row,column:column}},this.$clipPosition=function(position){var length=this.getLength();return position.row>=length?(position.row=Math.max(0,length-1),position.column=this.getLine(length-1).length):(position.row=Math.max(0,position.row),position.column=Math.min(Math.max(position.column,0),this.getLine(position.row).length)),position},this.insertFullLines=function(row,lines){row=Math.min(Math.max(row,0),this.getLength());var column=0;this.getLength()>row?(lines=lines.concat([""]),column=0):(lines=[""].concat(lines),row--,column=this.$lines[row].length),this.insertMergedLines({row:row,column:column},lines)},this.insertMergedLines=function(position,lines){var start=this.clippedPos(position.row,position.column),end={row:start.row+lines.length-1,column:(1==lines.length?start.column:0)+lines[lines.length-1].length};return this.applyDelta({start:start,end:end,action:"insert",lines:lines}),this.clonePos(end)},this.remove=function(range){var start=this.clippedPos(range.start.row,range.start.column),end=this.clippedPos(range.end.row,range.end.column);return this.applyDelta({start:start,end:end,action:"remove",lines:this.getLinesForRange({start:start,end:end})}),this.clonePos(start)},this.removeInLine=function(row,startColumn,endColumn){var start=this.clippedPos(row,startColumn),end=this.clippedPos(row,endColumn);return this.applyDelta({start:start,end:end,action:"remove",lines:this.getLinesForRange({start:start,end:end})},!0),this.clonePos(start)},this.removeFullLines=function(firstRow,lastRow){firstRow=Math.min(Math.max(0,firstRow),this.getLength()-1),lastRow=Math.min(Math.max(0,lastRow),this.getLength()-1);var deleteFirstNewLine=lastRow==this.getLength()-1&&firstRow>0,deleteLastNewLine=this.getLength()-1>lastRow,startRow=deleteFirstNewLine?firstRow-1:firstRow,startCol=deleteFirstNewLine?this.getLine(startRow).length:0,endRow=deleteLastNewLine?lastRow+1:lastRow,endCol=deleteLastNewLine?0:this.getLine(endRow).length,range=new Range(startRow,startCol,endRow,endCol),deletedLines=this.$lines.slice(firstRow,lastRow+1);return this.applyDelta({start:range.start,end:range.end,action:"remove",lines:this.getLinesForRange(range)}),deletedLines},this.removeNewLine=function(row){this.getLength()-1>row&&row>=0&&this.applyDelta({start:this.pos(row,this.getLine(row).length),end:this.pos(row+1,0),action:"remove",lines:["",""]})},this.replace=function(range,text){if(range instanceof Range||(range=Range.fromPoints(range.start,range.end)),0===text.length&&range.isEmpty())return range.start;if(text==this.getTextRange(range))return range.end;this.remove(range);var end;return end=text?this.insert(range.start,text):range.start},this.applyDeltas=function(deltas){for(var i=0;deltas.length>i;i++)this.applyDelta(deltas[i])},this.revertDeltas=function(deltas){for(var i=deltas.length-1;i>=0;i--)this.revertDelta(deltas[i])},this.applyDelta=function(delta,doNotValidate){var isInsert="insert"==delta.action;(isInsert?1>=delta.lines.length&&!delta.lines[0]:!Range.comparePoints(delta.start,delta.end))||(isInsert&&delta.lines.length>2e4&&this.$splitAndapplyLargeDelta(delta,2e4),applyDelta(this.$lines,delta,doNotValidate),this._signal("change",delta))},this.$splitAndapplyLargeDelta=function(delta,MAX){for(var lines=delta.lines,l=lines.length,row=delta.start.row,column=delta.start.column,from=0,to=0;;){from=to,to+=MAX-1;var chunk=lines.slice(from,to);if(to>l){delta.lines=chunk,delta.start.row=row+from,delta.start.column=column;break}chunk.push(""),this.applyDelta({start:this.pos(row+from,column),end:this.pos(row+to,column=0),action:delta.action,lines:chunk},!0)}},this.revertDelta=function(delta){this.applyDelta({start:this.clonePos(delta.start),end:this.clonePos(delta.end),action:"insert"==delta.action?"remove":"insert",lines:delta.lines.slice()})},this.indexToPosition=function(index,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,i=startRow||0,l=lines.length;l>i;i++)if(index-=lines[i].length+newlineLength,0>index)return{row:i,column:index+lines[i].length+newlineLength};return{row:l-1,column:lines[l-1].length}},this.positionToIndex=function(pos,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,index=0,row=Math.min(pos.row,lines.length),i=startRow||0;row>i;++i)index+=lines[i].length+newlineLength;return index+pos.column}}).call(Document.prototype),exports.Document=Document}),ace.define("ace/lib/lang",["require","exports","module"],function(acequire,exports){"use strict";exports.last=function(a){return a[a.length-1]},exports.stringReverse=function(string){return string.split("").reverse().join("")},exports.stringRepeat=function(string,count){for(var result="";count>0;)1&count&&(result+=string),(count>>=1)&&(string+=string);return result};var trimBeginRegexp=/^\\s\\s*/,trimEndRegexp=/\\s\\s*$/;exports.stringTrimLeft=function(string){return string.replace(trimBeginRegexp,"")},exports.stringTrimRight=function(string){return string.replace(trimEndRegexp,"")},exports.copyObject=function(obj){var copy={};for(var key in obj)copy[key]=obj[key];return copy},exports.copyArray=function(array){for(var copy=[],i=0,l=array.length;l>i;i++)copy[i]=array[i]&&"object"==typeof array[i]?this.copyObject(array[i]):array[i];return copy},exports.deepCopy=function deepCopy(obj){if("object"!=typeof obj||!obj)return obj;var copy;if(Array.isArray(obj)){copy=[];for(var key=0;obj.length>key;key++)copy[key]=deepCopy(obj[key]);return copy}var cons=obj.constructor;if(cons===RegExp)return obj;copy=cons();for(var key in obj)copy[key]=deepCopy(obj[key]);return copy},exports.arrayToMap=function(arr){for(var map={},i=0;arr.length>i;i++)map[arr[i]]=1;return map},exports.createMap=function(props){var map=Object.create(null);for(var i in props)map[i]=props[i];return map},exports.arrayRemove=function(array,value){for(var i=0;array.length>=i;i++)value===array[i]&&array.splice(i,1)},exports.escapeRegExp=function(str){return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,"\\\\$1")},exports.escapeHTML=function(str){return str.replace(/&/g,"&").replace(/"/g,""").replace(/\'/g,"'").replace(/i;i+=2){if(Array.isArray(data[i+1]))var d={action:"insert",start:data[i],lines:data[i+1]};else var d={action:"remove",start:data[i],end:data[i+1]};doc.applyDelta(d,!0)}return _self.$timeout?deferredUpdate.schedule(_self.$timeout):(_self.onUpdate(),void 0)})};(function(){this.$timeout=500,this.setTimeout=function(timeout){this.$timeout=timeout},this.setValue=function(value){this.doc.setValue(value),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(callbackId){this.sender.callback(this.doc.getValue(),callbackId)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(Mirror.prototype)}),ace.define("ace/mode/json/json_parse",["require","exports","module"],function(){"use strict";var at,ch,text,value,escapee={\'"\':\'"\',"\\\\":"\\\\","/":"/",b:"\\b",f:"\\f",n:"\\n",r:"\\r",t:" "},error=function(m){throw{name:"SyntaxError",message:m,at:at,text:text}},next=function(c){return c&&c!==ch&&error("Expected \'"+c+"\' instead of \'"+ch+"\'"),ch=text.charAt(at),at+=1,ch},number=function(){var number,string="";for("-"===ch&&(string="-",next("-"));ch>="0"&&"9">=ch;)string+=ch,next();if("."===ch)for(string+=".";next()&&ch>="0"&&"9">=ch;)string+=ch;if("e"===ch||"E"===ch)for(string+=ch,next(),("-"===ch||"+"===ch)&&(string+=ch,next());ch>="0"&&"9">=ch;)string+=ch,next();return number=+string,isNaN(number)?(error("Bad number"),void 0):number},string=function(){var hex,i,uffff,string="";if(\'"\'===ch)for(;next();){if(\'"\'===ch)return next(),string;if("\\\\"===ch)if(next(),"u"===ch){for(uffff=0,i=0;4>i&&(hex=parseInt(next(),16),isFinite(hex));i+=1)uffff=16*uffff+hex;string+=String.fromCharCode(uffff)}else{if("string"!=typeof escapee[ch])break;string+=escapee[ch]}else string+=ch}error("Bad string")},white=function(){for(;ch&&" ">=ch;)next()},word=function(){switch(ch){case"t":return next("t"),next("r"),next("u"),next("e"),!0;case"f":return next("f"),next("a"),next("l"),next("s"),next("e"),!1;case"n":return next("n"),next("u"),next("l"),next("l"),null}error("Unexpected \'"+ch+"\'")},array=function(){var array=[];if("["===ch){if(next("["),white(),"]"===ch)return next("]"),array;for(;ch;){if(array.push(value()),white(),"]"===ch)return next("]"),array;next(","),white()}}error("Bad array")},object=function(){var key,object={};if("{"===ch){if(next("{"),white(),"}"===ch)return next("}"),object;for(;ch;){if(key=string(),white(),next(":"),Object.hasOwnProperty.call(object,key)&&error(\'Duplicate key "\'+key+\'"\'),object[key]=value(),white(),"}"===ch)return next("}"),object;next(","),white()}}error("Bad object")};return value=function(){switch(white(),ch){case"{":return object();case"[":return array();case\'"\':return string();case"-":return number();default:return ch>="0"&&"9">=ch?number():word()}},function(source,reviver){var result;return text=source,at=0,ch=" ",result=value(),white(),ch&&error("Syntax error"),"function"==typeof reviver?function walk(holder,key){var k,v,value=holder[key];if(value&&"object"==typeof value)for(k in value)Object.hasOwnProperty.call(value,k)&&(v=walk(value,k),void 0!==v?value[k]=v:delete value[k]);return reviver.call(holder,key,value)}({"":result},""):result}}),ace.define("ace/mode/json_worker",["require","exports","module","ace/lib/oop","ace/worker/mirror","ace/mode/json/json_parse"],function(acequire,exports){"use strict";var oop=acequire("../lib/oop"),Mirror=acequire("../worker/mirror").Mirror,parse=acequire("./json/json_parse"),JsonWorker=exports.JsonWorker=function(sender){Mirror.call(this,sender),this.setTimeout(200)};oop.inherits(JsonWorker,Mirror),function(){this.onUpdate=function(){var value=this.doc.getValue(),errors=[];try{value&&parse(value)}catch(e){var pos=this.doc.indexToPosition(e.at-1);errors.push({row:pos.row,column:pos.column,text:e.message,type:"error"})}this.sender.emit("annotate",errors)}}.call(JsonWorker.prototype)}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(){function Empty(){}function doesDefinePropertyWork(object){try{return Object.defineProperty(object,"sentinel",{}),"sentinel"in object}catch(exception){}}function toInteger(n){return n=+n,n!==n?n=0:0!==n&&n!==1/0&&n!==-(1/0)&&(n=(n>0||-1)*Math.floor(Math.abs(n))),n}Function.prototype.bind||(Function.prototype.bind=function(that){var target=this;if("function"!=typeof target)throw new TypeError("Function.prototype.bind called on incompatible "+target);var args=slice.call(arguments,1),bound=function(){if(this instanceof bound){var result=target.apply(this,args.concat(slice.call(arguments)));return Object(result)===result?result:this}return target.apply(that,args.concat(slice.call(arguments)))};return target.prototype&&(Empty.prototype=target.prototype,bound.prototype=new Empty,Empty.prototype=null),bound});var defineGetter,defineSetter,lookupGetter,lookupSetter,supportsAccessors,call=Function.prototype.call,prototypeOfArray=Array.prototype,prototypeOfObject=Object.prototype,slice=prototypeOfArray.slice,_toString=call.bind(prototypeOfObject.toString),owns=call.bind(prototypeOfObject.hasOwnProperty);if((supportsAccessors=owns(prototypeOfObject,"__defineGetter__"))&&(defineGetter=call.bind(prototypeOfObject.__defineGetter__),defineSetter=call.bind(prototypeOfObject.__defineSetter__),lookupGetter=call.bind(prototypeOfObject.__lookupGetter__),lookupSetter=call.bind(prototypeOfObject.__lookupSetter__)),2!=[1,2].splice(0).length)if(function(){function makeArray(l){var a=Array(l+2);return a[0]=a[1]=0,a}var lengthBefore,array=[];return array.splice.apply(array,makeArray(20)),array.splice.apply(array,makeArray(26)),lengthBefore=array.length,array.splice(5,0,"XXX"),lengthBefore+1==array.length,lengthBefore+1==array.length?!0:void 0\n}()){var array_splice=Array.prototype.splice;Array.prototype.splice=function(start,deleteCount){return arguments.length?array_splice.apply(this,[void 0===start?0:start,void 0===deleteCount?this.length-start:deleteCount].concat(slice.call(arguments,2))):[]}}else Array.prototype.splice=function(pos,removeCount){var length=this.length;pos>0?pos>length&&(pos=length):void 0==pos?pos=0:0>pos&&(pos=Math.max(length+pos,0)),length>pos+removeCount||(removeCount=length-pos);var removed=this.slice(pos,pos+removeCount),insert=slice.call(arguments,2),add=insert.length;if(pos===length)add&&this.push.apply(this,insert);else{var remove=Math.min(removeCount,length-pos),tailOldPos=pos+remove,tailNewPos=tailOldPos+add-remove,tailCount=length-tailOldPos,lengthAfterRemove=length-remove;if(tailOldPos>tailNewPos)for(var i=0;tailCount>i;++i)this[tailNewPos+i]=this[tailOldPos+i];else if(tailNewPos>tailOldPos)for(i=tailCount;i--;)this[tailNewPos+i]=this[tailOldPos+i];if(add&&pos===lengthAfterRemove)this.length=lengthAfterRemove,this.push.apply(this,insert);else for(this.length=lengthAfterRemove+add,i=0;add>i;++i)this[pos+i]=insert[i]}return removed};Array.isArray||(Array.isArray=function(obj){return"[object Array]"==_toString(obj)});var boxedString=Object("a"),splitString="a"!=boxedString[0]||!(0 in boxedString);if(Array.prototype.forEach||(Array.prototype.forEach=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,thisp=arguments[1],i=-1,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError;for(;length>++i;)i in self&&fun.call(thisp,self[i],i,object)}),Array.prototype.map||(Array.prototype.map=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,result=Array(length),thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)i in self&&(result[i]=fun.call(thisp,self[i],i,object));return result}),Array.prototype.filter||(Array.prototype.filter=function(fun){var value,object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,result=[],thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)i in self&&(value=self[i],fun.call(thisp,value,i,object)&&result.push(value));return result}),Array.prototype.every||(Array.prototype.every=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)if(i in self&&!fun.call(thisp,self[i],i,object))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)if(i in self&&fun.call(thisp,self[i],i,object))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");if(!length&&1==arguments.length)throw new TypeError("reduce of empty array with no initial value");var result,i=0;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i++];break}if(++i>=length)throw new TypeError("reduce of empty array with no initial value")}for(;length>i;i++)i in self&&(result=fun.call(void 0,result,self[i],i,object));return result}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");if(!length&&1==arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var result,i=length-1;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i--];break}if(0>--i)throw new TypeError("reduceRight of empty array with no initial value")}do i in this&&(result=fun.call(void 0,result,self[i],i,object));while(i--);return result}),Array.prototype.indexOf&&-1==[0,1].indexOf(1,2)||(Array.prototype.indexOf=function(sought){var self=splitString&&"[object String]"==_toString(this)?this.split(""):toObject(this),length=self.length>>>0;if(!length)return-1;var i=0;for(arguments.length>1&&(i=toInteger(arguments[1])),i=i>=0?i:Math.max(0,length+i);length>i;i++)if(i in self&&self[i]===sought)return i;return-1}),Array.prototype.lastIndexOf&&-1==[0,1].lastIndexOf(0,-3)||(Array.prototype.lastIndexOf=function(sought){var self=splitString&&"[object String]"==_toString(this)?this.split(""):toObject(this),length=self.length>>>0;if(!length)return-1;var i=length-1;for(arguments.length>1&&(i=Math.min(i,toInteger(arguments[1]))),i=i>=0?i:length-Math.abs(i);i>=0;i--)if(i in self&&sought===self[i])return i;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(object){return object.__proto__||(object.constructor?object.constructor.prototype:prototypeOfObject)}),!Object.getOwnPropertyDescriptor){var ERR_NON_OBJECT="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(object,property){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT+object);if(owns(object,property)){var descriptor,getter,setter;if(descriptor={enumerable:!0,configurable:!0},supportsAccessors){var prototype=object.__proto__;object.__proto__=prototypeOfObject;var getter=lookupGetter(object,property),setter=lookupSetter(object,property);if(object.__proto__=prototype,getter||setter)return getter&&(descriptor.get=getter),setter&&(descriptor.set=setter),descriptor}return descriptor.value=object[property],descriptor}}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(object){return Object.keys(object)}),!Object.create){var createEmpty;createEmpty=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var empty={};for(var i in empty)empty[i]=null;return empty.constructor=empty.hasOwnProperty=empty.propertyIsEnumerable=empty.isPrototypeOf=empty.toLocaleString=empty.toString=empty.valueOf=empty.__proto__=null,empty},Object.create=function(prototype,properties){var object;if(null===prototype)object=createEmpty();else{if("object"!=typeof prototype)throw new TypeError("typeof prototype["+typeof prototype+"] != \'object\'");var Type=function(){};Type.prototype=prototype,object=new Type,object.__proto__=prototype}return void 0!==properties&&Object.defineProperties(object,properties),object}}if(Object.defineProperty){var definePropertyWorksOnObject=doesDefinePropertyWork({}),definePropertyWorksOnDom="undefined"==typeof document||doesDefinePropertyWork(document.createElement("div"));if(!definePropertyWorksOnObject||!definePropertyWorksOnDom)var definePropertyFallback=Object.defineProperty}if(!Object.defineProperty||definePropertyFallback){var ERR_NON_OBJECT_DESCRIPTOR="Property description must be an object: ",ERR_NON_OBJECT_TARGET="Object.defineProperty called on non-object: ",ERR_ACCESSORS_NOT_SUPPORTED="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(object,property,descriptor){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT_TARGET+object);if("object"!=typeof descriptor&&"function"!=typeof descriptor||null===descriptor)throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR+descriptor);if(definePropertyFallback)try{return definePropertyFallback.call(Object,object,property,descriptor)}catch(exception){}if(owns(descriptor,"value"))if(supportsAccessors&&(lookupGetter(object,property)||lookupSetter(object,property))){var prototype=object.__proto__;object.__proto__=prototypeOfObject,delete object[property],object[property]=descriptor.value,object.__proto__=prototype}else object[property]=descriptor.value;else{if(!supportsAccessors)throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);owns(descriptor,"get")&&defineGetter(object,property,descriptor.get),owns(descriptor,"set")&&defineSetter(object,property,descriptor.set)}return object}}Object.defineProperties||(Object.defineProperties=function(object,properties){for(var property in properties)owns(properties,property)&&Object.defineProperty(object,property,properties[property]);return object}),Object.seal||(Object.seal=function(object){return object}),Object.freeze||(Object.freeze=function(object){return object});try{Object.freeze(function(){})}catch(exception){Object.freeze=function(freezeObject){return function(object){return"function"==typeof object?object:freezeObject(object)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(object){return object}),Object.isSealed||(Object.isSealed=function(){return!1}),Object.isFrozen||(Object.isFrozen=function(){return!1}),Object.isExtensible||(Object.isExtensible=function(object){if(Object(object)===object)throw new TypeError;for(var name="";owns(object,name);)name+="?";object[name]=!0;var returnValue=owns(object,name);return delete object[name],returnValue}),!Object.keys){var hasDontEnumBug=!0,dontEnums=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],dontEnumsLength=dontEnums.length;for(var key in{toString:null})hasDontEnumBug=!1;Object.keys=function(object){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError("Object.keys called on a non-object");var keys=[];for(var name in object)owns(object,name)&&keys.push(name);if(hasDontEnumBug)for(var i=0,ii=dontEnumsLength;ii>i;i++){var dontEnum=dontEnums[i];owns(object,dontEnum)&&keys.push(dontEnum)}return keys}}Date.now||(Date.now=function(){return(new Date).getTime()});var ws=" \\n\x0B\\f\\r   ᠎              \\u2028\\u2029\ufeff";if(!String.prototype.trim||ws.trim()){ws="["+ws+"]";var trimBeginRegexp=RegExp("^"+ws+ws+"*"),trimEndRegexp=RegExp(ws+ws+"*$");String.prototype.trim=function(){return(this+"").replace(trimBeginRegexp,"").replace(trimEndRegexp,"")}}var toObject=function(o){if(null==o)throw new TypeError("can\'t convert "+o+" to object");return Object(o)}});'; +},function(e,t){ace.define("ace/ext/searchbox",["require","exports","module","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/keyboard/hash_handler","ace/lib/keys"],function(e,t,i){"use strict";var n=e("../lib/dom"),r=e("../lib/lang"),o=e("../lib/event"),s=" .ace_search { background-color: #ddd; border: 1px solid #cbcbcb; border-top: 0 none; max-width: 325px; overflow: hidden; margin: 0; padding: 4px; padding-right: 6px; padding-bottom: 0; position: absolute; top: 0px; z-index: 99; white-space: normal; } .ace_search.left { border-left: 0 none; border-radius: 0px 0px 5px 0px; left: 0; } .ace_search.right { border-radius: 0px 0px 0px 5px; border-right: 0 none; right: 0; } .ace_search_form, .ace_replace_form { border-radius: 3px; border: 1px solid #cbcbcb; float: left; margin-bottom: 4px; overflow: hidden; } .ace_search_form.ace_nomatch { outline: 1px solid red; } .ace_search_field { background-color: white; border-right: 1px solid #cbcbcb; border: 0 none; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; float: left; height: 22px; outline: 0; padding: 0 7px; width: 214px; margin: 0; } .ace_searchbtn, .ace_replacebtn { background: #fff; border: 0 none; border-left: 1px solid #dcdcdc; cursor: pointer; float: left; height: 22px; margin: 0; position: relative; } .ace_searchbtn:last-child, .ace_replacebtn:last-child { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .ace_searchbtn:disabled { background: none; cursor: default; } .ace_searchbtn { background-position: 50% 50%; background-repeat: no-repeat; width: 27px; } .ace_searchbtn.prev { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiSU1NZUAC/6E0I0yACYskCpsJiySKIiY0SUZk40FyTEgCjGgKwTRAgAEAQJUIPCE+qfkAAAAASUVORK5CYII=); } .ace_searchbtn.next { background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNpiTE1NZQCC/0DMyIAKwGJMUAYDEo3M/s+EpvM/mkKwCQxYjIeLMaELoLMBAgwAU7UJObTKsvAAAAAASUVORK5CYII=); } .ace_searchbtn_close { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0; border-radius: 50%; border: 0 none; color: #656565; cursor: pointer; float: right; font: 16px/16px Arial; height: 14px; margin: 5px 1px 9px 5px; padding: 0; text-align: center; width: 14px; } .ace_searchbtn_close:hover { background-color: #656565; background-position: 50% 100%; color: white; } .ace_replacebtn.prev { width: 54px } .ace_replacebtn.next { width: 27px } .ace_button { margin-left: 2px; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -o-user-select: none; -ms-user-select: none; user-select: none; overflow: hidden; opacity: 0.7; border: 1px solid rgba(100,100,100,0.23); padding: 1px; -moz-box-sizing: border-box; box-sizing: border-box; color: black; } .ace_button:hover { background-color: #eee; opacity:1; } .ace_button:active { background-color: #ddd; } .ace_button.checked { border-color: #3399ff; opacity:1; } .ace_search_options{ margin-bottom: 3px; text-align: right; -webkit-user-select: none; -moz-user-select: none; -o-user-select: none; -ms-user-select: none; user-select: none; }",a=e("../keyboard/hash_handler").HashHandler,l=e("../lib/keys");n.importCssString(s,"ace_searchbox");var c=''.replace(/>\s+/g,">"),h=function(e,t,i){var r=n.createElement("div");r.innerHTML=c,this.element=r.firstChild,this.$init(),this.setEditor(e)};(function(){this.setEditor=function(e){e.searchBox=this,e.container.appendChild(this.element),this.editor=e},this.$initElements=function(e){this.searchBox=e.querySelector(".ace_search_form"),this.replaceBox=e.querySelector(".ace_replace_form"),this.searchOptions=e.querySelector(".ace_search_options"),this.regExpOption=e.querySelector("[action=toggleRegexpMode]"),this.caseSensitiveOption=e.querySelector("[action=toggleCaseSensitive]"),this.wholeWordOption=e.querySelector("[action=toggleWholeWords]"),this.searchInput=this.searchBox.querySelector(".ace_search_field"),this.replaceInput=this.replaceBox.querySelector(".ace_search_field")},this.$init=function(){var e=this.element;this.$initElements(e);var t=this;o.addListener(e,"mousedown",function(e){setTimeout(function(){t.activeInput.focus()},0),o.stopPropagation(e)}),o.addListener(e,"click",function(e){var i=e.target||e.srcElement,n=i.getAttribute("action");n&&t[n]?t[n]():t.$searchBarKb.commands[n]&&t.$searchBarKb.commands[n].exec(t),o.stopPropagation(e)}),o.addCommandKeyListener(e,function(e,i,n){var r=l.keyCodeToString(n),s=t.$searchBarKb.findKeyCommand(i,r);s&&s.exec&&(s.exec(t),o.stopEvent(e))}),this.$onChange=r.delayedCall(function(){t.find(!1,!1)}),o.addListener(this.searchInput,"input",function(){t.$onChange.schedule(20)}),o.addListener(this.searchInput,"focus",function(){t.activeInput=t.searchInput,t.searchInput.value&&t.highlight()}),o.addListener(this.replaceInput,"focus",function(){t.activeInput=t.replaceInput,t.searchInput.value&&t.highlight()})},this.$closeSearchBarKb=new a([{bindKey:"Esc",name:"closeSearchBar",exec:function(e){e.searchBox.hide()}}]),this.$searchBarKb=new a,this.$searchBarKb.bindKeys({"Ctrl-f|Command-f":function(e){var t=e.isReplace=!e.isReplace;e.replaceBox.style.display=t?"":"none",e.searchInput.focus()},"Ctrl-H|Command-Option-F":function(e){e.replaceBox.style.display="",e.replaceInput.focus()},"Ctrl-G|Command-G":function(e){e.findNext()},"Ctrl-Shift-G|Command-Shift-G":function(e){e.findPrev()},esc:function(e){setTimeout(function(){e.hide()})},Return:function(e){e.activeInput==e.replaceInput&&e.replace(),e.findNext()},"Shift-Return":function(e){e.activeInput==e.replaceInput&&e.replace(),e.findPrev()},"Alt-Return":function(e){e.activeInput==e.replaceInput&&e.replaceAll(),e.findAll()},Tab:function(e){(e.activeInput==e.replaceInput?e.searchInput:e.replaceInput).focus()}}),this.$searchBarKb.addCommands([{name:"toggleRegexpMode",bindKey:{win:"Alt-R|Alt-/",mac:"Ctrl-Alt-R|Ctrl-Alt-/"},exec:function(e){e.regExpOption.checked=!e.regExpOption.checked,e.$syncOptions()}},{name:"toggleCaseSensitive",bindKey:{win:"Alt-C|Alt-I",mac:"Ctrl-Alt-R|Ctrl-Alt-I"},exec:function(e){e.caseSensitiveOption.checked=!e.caseSensitiveOption.checked,e.$syncOptions()}},{name:"toggleWholeWords",bindKey:{win:"Alt-B|Alt-W",mac:"Ctrl-Alt-B|Ctrl-Alt-W"},exec:function(e){e.wholeWordOption.checked=!e.wholeWordOption.checked,e.$syncOptions()}}]),this.$syncOptions=function(){n.setCssClass(this.regExpOption,"checked",this.regExpOption.checked),n.setCssClass(this.wholeWordOption,"checked",this.wholeWordOption.checked),n.setCssClass(this.caseSensitiveOption,"checked",this.caseSensitiveOption.checked),this.find(!1,!1)},this.highlight=function(e){this.editor.session.highlight(e||this.editor.$search.$options.re),this.editor.renderer.updateBackMarkers()},this.find=function(e,t,i){var r=this.editor.find(this.searchInput.value,{skipCurrent:e,backwards:t,wrap:!0,regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked,preventScroll:i}),o=!r&&this.searchInput.value;n.setCssClass(this.searchBox,"ace_nomatch",o),this.editor._emit("findSearchBox",{match:!o}),this.highlight()},this.findNext=function(){this.find(!0,!1)},this.findPrev=function(){this.find(!0,!0)},this.findAll=function(){var e=this.editor.findAll(this.searchInput.value,{regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked}),t=!e&&this.searchInput.value;n.setCssClass(this.searchBox,"ace_nomatch",t),this.editor._emit("findSearchBox",{match:!t}),this.highlight(),this.hide()},this.replace=function(){this.editor.getReadOnly()||this.editor.replace(this.replaceInput.value)},this.replaceAndFindNext=function(){this.editor.getReadOnly()||(this.editor.replace(this.replaceInput.value),this.findNext())},this.replaceAll=function(){this.editor.getReadOnly()||this.editor.replaceAll(this.replaceInput.value)},this.hide=function(){this.element.style.display="none",this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb),this.editor.focus()},this.show=function(e,t){this.element.style.display="",this.replaceBox.style.display=t?"":"none",this.isReplace=t,e&&(this.searchInput.value=e),this.find(!1,!1,!0),this.searchInput.focus(),this.searchInput.select(),this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb)},this.isFocused=function(){var e=document.activeElement;return e==this.searchInput||e==this.replaceInput}}).call(h.prototype),t.SearchBox=h,t.Search=function(e,t){var i=e.searchBox||new h(e);i.show(e.session.getTextRange(),t)}}),function(){ace.acequire(["ace/ext/searchbox"],function(){})}()},function(e,t){ace.define("ace/theme/jsoneditor",["require","exports","module","ace/lib/dom"],function(e,t,i){t.isDark=!1,t.cssClass="ace-jsoneditor",t.cssText='.ace-jsoneditor .ace_gutter { background: #ebebeb; color: #333 } .ace-jsoneditor.ace_editor { font-family: droid sans mono, consolas, monospace, courier new, courier, sans-serif; line-height: 1.3; } .ace-jsoneditor .ace_print-margin { width: 1px; background: #e8e8e8 } .ace-jsoneditor .ace_scroller { background-color: #FFFFFF } .ace-jsoneditor .ace_text-layer { color: gray } .ace-jsoneditor .ace_variable { color: #1a1a1a } .ace-jsoneditor .ace_cursor { border-left: 2px solid #000000 } .ace-jsoneditor .ace_overwrite-cursors .ace_cursor { border-left: 0px; border-bottom: 1px solid #000000 } .ace-jsoneditor .ace_marker-layer .ace_selection { background: lightgray } .ace-jsoneditor.ace_multiselect .ace_selection.ace_start { box-shadow: 0 0 3px 0px #FFFFFF; border-radius: 2px } .ace-jsoneditor .ace_marker-layer .ace_step { background: rgb(255, 255, 0) } .ace-jsoneditor .ace_marker-layer .ace_bracket { margin: -1px 0 0 -1px; border: 1px solid #BFBFBF } .ace-jsoneditor .ace_marker-layer .ace_active-line { background: #FFFBD1 } .ace-jsoneditor .ace_gutter-active-line { background-color : #dcdcdc } .ace-jsoneditor .ace_marker-layer .ace_selected-word { border: 1px solid lightgray } .ace-jsoneditor .ace_invisible { color: #BFBFBF } .ace-jsoneditor .ace_keyword, .ace-jsoneditor .ace_meta, .ace-jsoneditor .ace_support.ace_constant.ace_property-value { color: #AF956F } .ace-jsoneditor .ace_keyword.ace_operator { color: #484848 } .ace-jsoneditor .ace_keyword.ace_other.ace_unit { color: #96DC5F } .ace-jsoneditor .ace_constant.ace_language { color: darkorange } .ace-jsoneditor .ace_constant.ace_numeric { color: red } .ace-jsoneditor .ace_constant.ace_character.ace_entity { color: #BF78CC } .ace-jsoneditor .ace_invalid { color: #FFFFFF; background-color: #FF002A; } .ace-jsoneditor .ace_fold { background-color: #AF956F; border-color: #000000 } .ace-jsoneditor .ace_storage, .ace-jsoneditor .ace_support.ace_class, .ace-jsoneditor .ace_support.ace_function, .ace-jsoneditor .ace_support.ace_other, .ace-jsoneditor .ace_support.ace_type { color: #C52727 } .ace-jsoneditor .ace_string { color: green } .ace-jsoneditor .ace_comment { color: #BCC8BA } .ace-jsoneditor .ace_entity.ace_name.ace_tag, .ace-jsoneditor .ace_entity.ace_other.ace_attribute-name { color: #606060 } .ace-jsoneditor .ace_markup.ace_underline { text-decoration: underline } .ace-jsoneditor .ace_indent-guide { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y }';var n=e("../lib/dom");n.importCssString(t.cssText,t.cssClass)})}])}); +//# sourceMappingURL=jsoneditor.map \ No newline at end of file diff --git a/assets/webconfig/js/lib/sb-admin-2.js b/assets/webconfig/js/lib/sb-admin-2.js index 5ae4ba91..da14094d 100644 --- a/assets/webconfig/js/lib/sb-admin-2.js +++ b/assets/webconfig/js/lib/sb-admin-2.js @@ -5,7 +5,8 @@ $(function() { }); -var oldWidth; +var mInit = false; + //Loads the correct sidebar on window load, //collapses the sidebar on window resize. // Sets the min-height of #page-wrapper to window size @@ -13,28 +14,32 @@ $(function() { $(window).bind("load resize", function() { var topOffset = 50; var width = (this.window.innerWidth > 0) ? this.window.innerWidth : this.screen.width; - if(oldWidth != width) + if (width < 768) { - if (width < 768) + if(!mInit) { + mInit = true; $('#main-nav').css({"position":"fixed","right":"-235px","top":"45px","width":"230px","border":"1px solid rgba(0, 0, 0, .2)","box-shadow":"0 3px 9px rgba(0, 0, 0, .5)"}); topOffset = 100; // 2-row-menu - $('.mnava').on('click', function(){ - $("html, body").animate({ scrollTop: 0 }, "fast"); + + $('.mnava').bind('click.smnav', function(){ $( "#main-nav" ).animate({right: "-235px",}, 300 ); $(".navbar-toggle").addClass("closed"); }); } - else - $( "#main-nav" ).removeAttr("style").css({"position":"absolute"}); + } + else + { + $( "#main-nav" ).removeAttr('style').css({"position":"fixed"}); + $( ".mnava" ).unbind('click.smnav'); + mInit = false; + } - - var height = ((this.window.innerHeight > 0) ? this.window.innerHeight : this.screen.height) - 1; - height = height - topOffset; - if (height < 1) height = 1; - if (height > topOffset) { - $("#page-wrapper").css("min-height", (height-11) + "px"); - } + var height = ((this.window.innerHeight > 0) ? this.window.innerHeight : this.screen.height) - 1; + height = height - topOffset; + if (height < 1) height = 1; + if (height > topOffset) { + $("#page-wrapper").css("min-height", (height-11) + "px"); } }); @@ -55,7 +60,7 @@ $(function() { } }); -$('.navbar-toggle').off().on('click', function(){ +$('.navbar-toggle').on('click', function(){ if($('#main-nav').css("right") != "-2px") { $('#main-nav').animate({right: "-2px",}, 300 ); diff --git a/assets/webconfig/js/lib/underscore.js b/assets/webconfig/js/lib/underscore.js deleted file mode 100644 index f6f7e2f2..00000000 --- a/assets/webconfig/js/lib/underscore.js +++ /dev/null @@ -1,1059 +0,0 @@ -// Underscore.js 1.3.3 -// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. -// Underscore is freely distributable under the MIT license. -// Portions of Underscore are inspired or borrowed from Prototype, -// Oliver Steele's Functional, and John Resig's Micro-Templating. -// For all details and documentation: -// http://documentcloud.github.com/underscore - -(function() { - - // Baseline setup - // -------------- - - // Establish the root object, `window` in the browser, or `global` on the server. - var root = this; - - // Save the previous value of the `_` variable. - var previousUnderscore = root._; - - // Establish the object that gets returned to break out of a loop iteration. - var breaker = {}; - - // Save bytes in the minified (but not gzipped) version: - var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; - - // Create quick reference variables for speed access to core prototypes. - var slice = ArrayProto.slice, - unshift = ArrayProto.unshift, - toString = ObjProto.toString, - hasOwnProperty = ObjProto.hasOwnProperty; - - // All **ECMAScript 5** native function implementations that we hope to use - // are declared here. - var - nativeForEach = ArrayProto.forEach, - nativeMap = ArrayProto.map, - nativeReduce = ArrayProto.reduce, - nativeReduceRight = ArrayProto.reduceRight, - nativeFilter = ArrayProto.filter, - nativeEvery = ArrayProto.every, - nativeSome = ArrayProto.some, - nativeIndexOf = ArrayProto.indexOf, - nativeLastIndexOf = ArrayProto.lastIndexOf, - nativeIsArray = Array.isArray, - nativeKeys = Object.keys, - nativeBind = FuncProto.bind; - - // Create a safe reference to the Underscore object for use below. - var _ = function(obj) { return new wrapper(obj); }; - - // Export the Underscore object for **Node.js**, with - // backwards-compatibility for the old `require()` API. If we're in - // the browser, add `_` as a global object via a string identifier, - // for Closure Compiler "advanced" mode. - if (typeof exports !== 'undefined') { - if (typeof module !== 'undefined' && module.exports) { - exports = module.exports = _; - } - exports._ = _; - } else { - root['_'] = _; - } - - // Current version. - _.VERSION = '1.3.3'; - - // Collection Functions - // -------------------- - - // The cornerstone, an `each` implementation, aka `forEach`. - // Handles objects with the built-in `forEach`, arrays, and raw objects. - // Delegates to **ECMAScript 5**'s native `forEach` if available. - var each = _.each = _.forEach = function(obj, iterator, context) { - if (obj == null) return; - if (nativeForEach && obj.forEach === nativeForEach) { - obj.forEach(iterator, context); - } else if (obj.length === +obj.length) { - for (var i = 0, l = obj.length; i < l; i++) { - if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return; - } - } else { - for (var key in obj) { - if (_.has(obj, key)) { - if (iterator.call(context, obj[key], key, obj) === breaker) return; - } - } - } - }; - - // Return the results of applying the iterator to each element. - // Delegates to **ECMAScript 5**'s native `map` if available. - _.map = _.collect = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); - each(obj, function(value, index, list) { - results[results.length] = iterator.call(context, value, index, list); - }); - if (obj.length === +obj.length) results.length = obj.length; - return results; - }; - - // **Reduce** builds up a single result from a list of values, aka `inject`, - // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. - _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { - var initial = arguments.length > 2; - if (obj == null) obj = []; - if (nativeReduce && obj.reduce === nativeReduce) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); - } - each(obj, function(value, index, list) { - if (!initial) { - memo = value; - initial = true; - } else { - memo = iterator.call(context, memo, value, index, list); - } - }); - if (!initial) throw new TypeError('Reduce of empty array with no initial value'); - return memo; - }; - - // The right-associative version of reduce, also known as `foldr`. - // Delegates to **ECMAScript 5**'s native `reduceRight` if available. - _.reduceRight = _.foldr = function(obj, iterator, memo, context) { - var initial = arguments.length > 2; - if (obj == null) obj = []; - if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); - } - var reversed = _.toArray(obj).reverse(); - if (context && !initial) iterator = _.bind(iterator, context); - return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator); - }; - - // Return the first value which passes a truth test. Aliased as `detect`. - _.find = _.detect = function(obj, iterator, context) { - var result; - any(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) { - result = value; - return true; - } - }); - return result; - }; - - // Return all the elements that pass a truth test. - // Delegates to **ECMAScript 5**'s native `filter` if available. - // Aliased as `select`. - _.filter = _.select = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); - each(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) results[results.length] = value; - }); - return results; - }; - - // Return all the elements for which a truth test fails. - _.reject = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - each(obj, function(value, index, list) { - if (!iterator.call(context, value, index, list)) results[results.length] = value; - }); - return results; - }; - - // Determine whether all of the elements match a truth test. - // Delegates to **ECMAScript 5**'s native `every` if available. - // Aliased as `all`. - _.every = _.all = function(obj, iterator, context) { - var result = true; - if (obj == null) return result; - if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context); - each(obj, function(value, index, list) { - if (!(result = result && iterator.call(context, value, index, list))) return breaker; - }); - return !!result; - }; - - // Determine if at least one element in the object matches a truth test. - // Delegates to **ECMAScript 5**'s native `some` if available. - // Aliased as `any`. - var any = _.some = _.any = function(obj, iterator, context) { - iterator || (iterator = _.identity); - var result = false; - if (obj == null) return result; - if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context); - each(obj, function(value, index, list) { - if (result || (result = iterator.call(context, value, index, list))) return breaker; - }); - return !!result; - }; - - // Determine if a given value is included in the array or object using `===`. - // Aliased as `contains`. - _.include = _.contains = function(obj, target) { - var found = false; - if (obj == null) return found; - if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; - found = any(obj, function(value) { - return value === target; - }); - return found; - }; - - // Invoke a method (with arguments) on every item in a collection. - _.invoke = function(obj, method) { - var args = slice.call(arguments, 2); - return _.map(obj, function(value) { - return (_.isFunction(method) ? method || value : value[method]).apply(value, args); - }); - }; - - // Convenience version of a common use case of `map`: fetching a property. - _.pluck = function(obj, key) { - return _.map(obj, function(value){ return value[key]; }); - }; - - // Return the maximum element or (element-based computation). - _.max = function(obj, iterator, context) { - if (!iterator && _.isArray(obj) && obj[0] === +obj[0]) return Math.max.apply(Math, obj); - if (!iterator && _.isEmpty(obj)) return -Infinity; - var result = {computed : -Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed >= result.computed && (result = {value : value, computed : computed}); - }); - return result.value; - }; - - // Return the minimum element (or element-based computation). - _.min = function(obj, iterator, context) { - if (!iterator && _.isArray(obj) && obj[0] === +obj[0]) return Math.min.apply(Math, obj); - if (!iterator && _.isEmpty(obj)) return Infinity; - var result = {computed : Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed < result.computed && (result = {value : value, computed : computed}); - }); - return result.value; - }; - - // Shuffle an array. - _.shuffle = function(obj) { - var shuffled = [], rand; - each(obj, function(value, index, list) { - rand = Math.floor(Math.random() * (index + 1)); - shuffled[index] = shuffled[rand]; - shuffled[rand] = value; - }); - return shuffled; - }; - - // Sort the object's values by a criterion produced by an iterator. - _.sortBy = function(obj, val, context) { - var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; }; - return _.pluck(_.map(obj, function(value, index, list) { - return { - value : value, - criteria : iterator.call(context, value, index, list) - }; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - if (a === void 0) return 1; - if (b === void 0) return -1; - return a < b ? -1 : a > b ? 1 : 0; - }), 'value'); - }; - - // Groups the object's values by a criterion. Pass either a string attribute - // to group by, or a function that returns the criterion. - _.groupBy = function(obj, val) { - var result = {}; - var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; }; - each(obj, function(value, index) { - var key = iterator(value, index); - (result[key] || (result[key] = [])).push(value); - }); - return result; - }; - - // Use a comparator function to figure out at what index an object should - // be inserted so as to maintain order. Uses binary search. - _.sortedIndex = function(array, obj, iterator) { - iterator || (iterator = _.identity); - var low = 0, high = array.length; - while (low < high) { - var mid = (low + high) >> 1; - iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid; - } - return low; - }; - - // Safely convert anything iterable into a real, live array. - _.toArray = function(obj) { - if (!obj) return []; - if (_.isArray(obj)) return slice.call(obj); - if (_.isArguments(obj)) return slice.call(obj); - if (obj.toArray && _.isFunction(obj.toArray)) return obj.toArray(); - return _.values(obj); - }; - - // Return the number of elements in an object. - _.size = function(obj) { - return _.isArray(obj) ? obj.length : _.keys(obj).length; - }; - - // Array Functions - // --------------- - - // Get the first element of an array. Passing **n** will return the first N - // values in the array. Aliased as `head` and `take`. The **guard** check - // allows it to work with `_.map`. - _.first = _.head = _.take = function(array, n, guard) { - return (n != null) && !guard ? slice.call(array, 0, n) : array[0]; - }; - - // Returns everything but the last entry of the array. Especcialy useful on - // the arguments object. Passing **n** will return all the values in - // the array, excluding the last N. The **guard** check allows it to work with - // `_.map`. - _.initial = function(array, n, guard) { - return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); - }; - - // Get the last element of an array. Passing **n** will return the last N - // values in the array. The **guard** check allows it to work with `_.map`. - _.last = function(array, n, guard) { - if ((n != null) && !guard) { - return slice.call(array, Math.max(array.length - n, 0)); - } else { - return array[array.length - 1]; - } - }; - - // Returns everything but the first entry of the array. Aliased as `tail`. - // Especially useful on the arguments object. Passing an **index** will return - // the rest of the values in the array from that index onward. The **guard** - // check allows it to work with `_.map`. - _.rest = _.tail = function(array, index, guard) { - return slice.call(array, (index == null) || guard ? 1 : index); - }; - - // Trim out all falsy values from an array. - _.compact = function(array) { - return _.filter(array, function(value){ return !!value; }); - }; - - // Return a completely flattened version of an array. - _.flatten = function(array, shallow) { - return _.reduce(array, function(memo, value) { - if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value)); - memo[memo.length] = value; - return memo; - }, []); - }; - - // Return a version of the array that does not contain the specified value(s). - _.without = function(array) { - return _.difference(array, slice.call(arguments, 1)); - }; - - // Produce a duplicate-free version of the array. If the array has already - // been sorted, you have the option of using a faster algorithm. - // Aliased as `unique`. - _.uniq = _.unique = function(array, isSorted, iterator) { - var initial = iterator ? _.map(array, iterator) : array; - var results = []; - // The `isSorted` flag is irrelevant if the array only contains two elements. - if (array.length < 3) isSorted = true; - _.reduce(initial, function (memo, value, index) { - if (isSorted ? _.last(memo) !== value || !memo.length : !_.include(memo, value)) { - memo.push(value); - results.push(array[index]); - } - return memo; - }, []); - return results; - }; - - // Produce an array that contains the union: each distinct element from all of - // the passed-in arrays. - _.union = function() { - return _.uniq(_.flatten(arguments, true)); - }; - - // Produce an array that contains every item shared between all the - // passed-in arrays. (Aliased as "intersect" for back-compat.) - _.intersection = _.intersect = function(array) { - var rest = slice.call(arguments, 1); - return _.filter(_.uniq(array), function(item) { - return _.every(rest, function(other) { - return _.indexOf(other, item) >= 0; - }); - }); - }; - - // Take the difference between one array and a number of other arrays. - // Only the elements present in just the first array will remain. - _.difference = function(array) { - var rest = _.flatten(slice.call(arguments, 1), true); - return _.filter(array, function(value){ return !_.include(rest, value); }); - }; - - // Zip together multiple lists into a single array -- elements that share - // an index go together. - _.zip = function() { - var args = slice.call(arguments); - var length = _.max(_.pluck(args, 'length')); - var results = new Array(length); - for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i); - return results; - }; - - // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), - // we need this function. Return the position of the first occurrence of an - // item in an array, or -1 if the item is not included in the array. - // Delegates to **ECMAScript 5**'s native `indexOf` if available. - // If the array is large and already in sort order, pass `true` - // for **isSorted** to use binary search. - _.indexOf = function(array, item, isSorted) { - if (array == null) return -1; - var i, l; - if (isSorted) { - i = _.sortedIndex(array, item); - return array[i] === item ? i : -1; - } - if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item); - for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i; - return -1; - }; - - // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. - _.lastIndexOf = function(array, item) { - if (array == null) return -1; - if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item); - var i = array.length; - while (i--) if (i in array && array[i] === item) return i; - return -1; - }; - - // Generate an integer Array containing an arithmetic progression. A port of - // the native Python `range()` function. See - // [the Python documentation](http://docs.python.org/library/functions.html#range). - _.range = function(start, stop, step) { - if (arguments.length <= 1) { - stop = start || 0; - start = 0; - } - step = arguments[2] || 1; - - var len = Math.max(Math.ceil((stop - start) / step), 0); - var idx = 0; - var range = new Array(len); - - while(idx < len) { - range[idx++] = start; - start += step; - } - - return range; - }; - - // Function (ahem) Functions - // ------------------ - - // Reusable constructor function for prototype setting. - var ctor = function(){}; - - // Create a function bound to a given object (assigning `this`, and arguments, - // optionally). Binding with arguments is also known as `curry`. - // Delegates to **ECMAScript 5**'s native `Function.bind` if available. - // We check for `func.bind` first, to fail fast when `func` is undefined. - _.bind = function bind(func, context) { - var bound, args; - if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); - if (!_.isFunction(func)) throw new TypeError; - args = slice.call(arguments, 2); - return bound = function() { - if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); - ctor.prototype = func.prototype; - var self = new ctor; - var result = func.apply(self, args.concat(slice.call(arguments))); - if (Object(result) === result) return result; - return self; - }; - }; - - // Bind all of an object's methods to that object. Useful for ensuring that - // all callbacks defined on an object belong to it. - _.bindAll = function(obj) { - var funcs = slice.call(arguments, 1); - if (funcs.length == 0) funcs = _.functions(obj); - each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); - return obj; - }; - - // Memoize an expensive function by storing its results. - _.memoize = function(func, hasher) { - var memo = {}; - hasher || (hasher = _.identity); - return function() { - var key = hasher.apply(this, arguments); - return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); - }; - }; - - // Delays a function for the given number of milliseconds, and then calls - // it with the arguments supplied. - _.delay = function(func, wait) { - var args = slice.call(arguments, 2); - return setTimeout(function(){ return func.apply(null, args); }, wait); - }; - - // Defers a function, scheduling it to run after the current call stack has - // cleared. - _.defer = function(func) { - return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); - }; - - // Returns a function, that, when invoked, will only be triggered at most once - // during a given window of time. - _.throttle = function(func, wait) { - var context, args, timeout, throttling, more, result; - var whenDone = _.debounce(function(){ more = throttling = false; }, wait); - return function() { - context = this; args = arguments; - var later = function() { - timeout = null; - if (more) func.apply(context, args); - whenDone(); - }; - if (!timeout) timeout = setTimeout(later, wait); - if (throttling) { - more = true; - } else { - result = func.apply(context, args); - } - whenDone(); - throttling = true; - return result; - }; - }; - - // Returns a function, that, as long as it continues to be invoked, will not - // be triggered. The function will be called after it stops being called for - // N milliseconds. If `immediate` is passed, trigger the function on the - // leading edge, instead of the trailing. - _.debounce = function(func, wait, immediate) { - var timeout; - return function() { - var context = this, args = arguments; - var later = function() { - timeout = null; - if (!immediate) func.apply(context, args); - }; - if (immediate && !timeout) func.apply(context, args); - clearTimeout(timeout); - timeout = setTimeout(later, wait); - }; - }; - - // Returns a function that will be executed at most one time, no matter how - // often you call it. Useful for lazy initialization. - _.once = function(func) { - var ran = false, memo; - return function() { - if (ran) return memo; - ran = true; - return memo = func.apply(this, arguments); - }; - }; - - // Returns the first function passed as an argument to the second, - // allowing you to adjust arguments, run code before and after, and - // conditionally execute the original function. - _.wrap = function(func, wrapper) { - return function() { - var args = [func].concat(slice.call(arguments, 0)); - return wrapper.apply(this, args); - }; - }; - - // Returns a function that is the composition of a list of functions, each - // consuming the return value of the function that follows. - _.compose = function() { - var funcs = arguments; - return function() { - var args = arguments; - for (var i = funcs.length - 1; i >= 0; i--) { - args = [funcs[i].apply(this, args)]; - } - return args[0]; - }; - }; - - // Returns a function that will only be executed after being called N times. - _.after = function(times, func) { - if (times <= 0) return func(); - return function() { - if (--times < 1) { return func.apply(this, arguments); } - }; - }; - - // Object Functions - // ---------------- - - // Retrieve the names of an object's properties. - // Delegates to **ECMAScript 5**'s native `Object.keys` - _.keys = nativeKeys || function(obj) { - if (obj !== Object(obj)) throw new TypeError('Invalid object'); - var keys = []; - for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key; - return keys; - }; - - // Retrieve the values of an object's properties. - _.values = function(obj) { - return _.map(obj, _.identity); - }; - - // Return a sorted list of the function names available on the object. - // Aliased as `methods` - _.functions = _.methods = function(obj) { - var names = []; - for (var key in obj) { - if (_.isFunction(obj[key])) names.push(key); - } - return names.sort(); - }; - - // Extend a given object with all the properties in passed-in object(s). - _.extend = function(obj) { - each(slice.call(arguments, 1), function(source) { - for (var prop in source) { - obj[prop] = source[prop]; - } - }); - return obj; - }; - - // Return a copy of the object only containing the whitelisted properties. - _.pick = function(obj) { - var result = {}; - each(_.flatten(slice.call(arguments, 1)), function(key) { - if (key in obj) result[key] = obj[key]; - }); - return result; - }; - - // Fill in a given object with default properties. - _.defaults = function(obj) { - each(slice.call(arguments, 1), function(source) { - for (var prop in source) { - if (obj[prop] == null) obj[prop] = source[prop]; - } - }); - return obj; - }; - - // Create a (shallow-cloned) duplicate of an object. - _.clone = function(obj) { - if (!_.isObject(obj)) return obj; - return _.isArray(obj) ? obj.slice() : _.extend({}, obj); - }; - - // Invokes interceptor with the obj, and then returns obj. - // The primary purpose of this method is to "tap into" a method chain, in - // order to perform operations on intermediate results within the chain. - _.tap = function(obj, interceptor) { - interceptor(obj); - return obj; - }; - - // Internal recursive comparison function. - function eq(a, b, stack) { - // Identical objects are equal. `0 === -0`, but they aren't identical. - // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal. - if (a === b) return a !== 0 || 1 / a == 1 / b; - // A strict comparison is necessary because `null == undefined`. - if (a == null || b == null) return a === b; - // Unwrap any wrapped objects. - if (a._chain) a = a._wrapped; - if (b._chain) b = b._wrapped; - // Invoke a custom `isEqual` method if one is provided. - if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b); - if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a); - // Compare `[[Class]]` names. - var className = toString.call(a); - if (className != toString.call(b)) return false; - switch (className) { - // Strings, numbers, dates, and booleans are compared by value. - case '[object String]': - // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is - // equivalent to `new String("5")`. - return a == String(b); - case '[object Number]': - // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for - // other numeric values. - return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b); - case '[object Date]': - case '[object Boolean]': - // Coerce dates and booleans to numeric primitive values. Dates are compared by their - // millisecond representations. Note that invalid dates with millisecond representations - // of `NaN` are not equivalent. - return +a == +b; - // RegExps are compared by their source patterns and flags. - case '[object RegExp]': - return a.source == b.source && - a.global == b.global && - a.multiline == b.multiline && - a.ignoreCase == b.ignoreCase; - } - if (typeof a != 'object' || typeof b != 'object') return false; - // Assume equality for cyclic structures. The algorithm for detecting cyclic - // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. - var length = stack.length; - while (length--) { - // Linear search. Performance is inversely proportional to the number of - // unique nested structures. - if (stack[length] == a) return true; - } - // Add the first object to the stack of traversed objects. - stack.push(a); - var size = 0, result = true; - // Recursively compare objects and arrays. - if (className == '[object Array]') { - // Compare array lengths to determine if a deep comparison is necessary. - size = a.length; - result = size == b.length; - if (result) { - // Deep compare the contents, ignoring non-numeric properties. - while (size--) { - // Ensure commutative equality for sparse arrays. - if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break; - } - } - } else { - // Objects with different constructors are not equivalent. - if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false; - // Deep compare objects. - for (var key in a) { - if (_.has(a, key)) { - // Count the expected number of properties. - size++; - // Deep compare each member. - if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break; - } - } - // Ensure that both objects contain the same number of properties. - if (result) { - for (key in b) { - if (_.has(b, key) && !(size--)) break; - } - result = !size; - } - } - // Remove the first object from the stack of traversed objects. - stack.pop(); - return result; - } - - // Perform a deep comparison to check if two objects are equal. - _.isEqual = function(a, b) { - return eq(a, b, []); - }; - - // Is a given array, string, or object empty? - // An "empty" object has no enumerable own-properties. - _.isEmpty = function(obj) { - if (obj == null) return true; - if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; - for (var key in obj) if (_.has(obj, key)) return false; - return true; - }; - - // Is a given value a DOM element? - _.isElement = function(obj) { - return !!(obj && obj.nodeType == 1); - }; - - // Is a given value an array? - // Delegates to ECMA5's native Array.isArray - _.isArray = nativeIsArray || function(obj) { - return toString.call(obj) == '[object Array]'; - }; - - // Is a given variable an object? - _.isObject = function(obj) { - return obj === Object(obj); - }; - - // Is a given variable an arguments object? - _.isArguments = function(obj) { - return toString.call(obj) == '[object Arguments]'; - }; - if (!_.isArguments(arguments)) { - _.isArguments = function(obj) { - return !!(obj && _.has(obj, 'callee')); - }; - } - - // Is a given value a function? - _.isFunction = function(obj) { - return toString.call(obj) == '[object Function]'; - }; - - // Is a given value a string? - _.isString = function(obj) { - return toString.call(obj) == '[object String]'; - }; - - // Is a given value a number? - _.isNumber = function(obj) { - return toString.call(obj) == '[object Number]'; - }; - - // Is a given object a finite number? - _.isFinite = function(obj) { - return _.isNumber(obj) && isFinite(obj); - }; - - // Is the given value `NaN`? - _.isNaN = function(obj) { - // `NaN` is the only value for which `===` is not reflexive. - return obj !== obj; - }; - - // Is a given value a boolean? - _.isBoolean = function(obj) { - return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; - }; - - // Is a given value a date? - _.isDate = function(obj) { - return toString.call(obj) == '[object Date]'; - }; - - // Is the given value a regular expression? - _.isRegExp = function(obj) { - return toString.call(obj) == '[object RegExp]'; - }; - - // Is a given value equal to null? - _.isNull = function(obj) { - return obj === null; - }; - - // Is a given variable undefined? - _.isUndefined = function(obj) { - return obj === void 0; - }; - - // Has own property? - _.has = function(obj, key) { - return hasOwnProperty.call(obj, key); - }; - - // Utility Functions - // ----------------- - - // Run Underscore.js in *noConflict* mode, returning the `_` variable to its - // previous owner. Returns a reference to the Underscore object. - _.noConflict = function() { - root._ = previousUnderscore; - return this; - }; - - // Keep the identity function around for default iterators. - _.identity = function(value) { - return value; - }; - - // Run a function **n** times. - _.times = function (n, iterator, context) { - for (var i = 0; i < n; i++) iterator.call(context, i); - }; - - // Escape a string for HTML interpolation. - _.escape = function(string) { - return (''+string).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/\//g,'/'); - }; - - // If the value of the named property is a function then invoke it; - // otherwise, return it. - _.result = function(object, property) { - if (object == null) return null; - var value = object[property]; - return _.isFunction(value) ? value.call(object) : value; - }; - - // Add your own custom functions to the Underscore object, ensuring that - // they're correctly added to the OOP wrapper as well. - _.mixin = function(obj) { - each(_.functions(obj), function(name){ - addToWrapper(name, _[name] = obj[name]); - }); - }; - - // Generate a unique integer id (unique within the entire client session). - // Useful for temporary DOM ids. - var idCounter = 0; - _.uniqueId = function(prefix) { - var id = idCounter++; - return prefix ? prefix + id : id; - }; - - // By default, Underscore uses ERB-style template delimiters, change the - // following template settings to use alternative delimiters. - _.templateSettings = { - evaluate : /<%([\s\S]+?)%>/g, - interpolate : /<%=([\s\S]+?)%>/g, - escape : /<%-([\s\S]+?)%>/g - }; - - // When customizing `templateSettings`, if you don't want to define an - // interpolation, evaluation or escaping regex, we need one that is - // guaranteed not to match. - var noMatch = /.^/; - - // Certain characters need to be escaped so that they can be put into a - // string literal. - var escapes = { - '\\': '\\', - "'": "'", - 'r': '\r', - 'n': '\n', - 't': '\t', - 'u2028': '\u2028', - 'u2029': '\u2029' - }; - - for (var p in escapes) escapes[escapes[p]] = p; - var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; - var unescaper = /\\(\\|'|r|n|t|u2028|u2029)/g; - - // Within an interpolation, evaluation, or escaping, remove HTML escaping - // that had been previously added. - var unescape = function(code) { - return code.replace(unescaper, function(match, escape) { - return escapes[escape]; - }); - }; - - // JavaScript micro-templating, similar to John Resig's implementation. - // Underscore templating handles arbitrary delimiters, preserves whitespace, - // and correctly escapes quotes within interpolated code. - _.template = function(text, data, settings) { - settings = _.defaults(settings || {}, _.templateSettings); - - // Compile the template source, taking care to escape characters that - // cannot be included in a string literal and then unescape them in code - // blocks. - var source = "__p+='" + text - .replace(escaper, function(match) { - return '\\' + escapes[match]; - }) - .replace(settings.escape || noMatch, function(match, code) { - return "'+\n_.escape(" + unescape(code) + ")+\n'"; - }) - .replace(settings.interpolate || noMatch, function(match, code) { - return "'+\n(" + unescape(code) + ")+\n'"; - }) - .replace(settings.evaluate || noMatch, function(match, code) { - return "';\n" + unescape(code) + "\n;__p+='"; - }) + "';\n"; - - // If a variable is not specified, place data values in local scope. - if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; - - source = "var __p='';" + - "var print=function(){__p+=Array.prototype.join.call(arguments, '')};\n" + - source + "return __p;\n"; - - var render = new Function(settings.variable || 'obj', '_', source); - if (data) return render(data, _); - var template = function(data) { - return render.call(this, data, _); - }; - - // Provide the compiled function source as a convenience for build time - // precompilation. - template.source = 'function(' + (settings.variable || 'obj') + '){\n' + - source + '}'; - - return template; - }; - - // Add a "chain" function, which will delegate to the wrapper. - _.chain = function(obj) { - return _(obj).chain(); - }; - - // The OOP Wrapper - // --------------- - - // If Underscore is called as a function, it returns a wrapped object that - // can be used OO-style. This wrapper holds altered versions of all the - // underscore functions. Wrapped objects may be chained. - var wrapper = function(obj) { this._wrapped = obj; }; - - // Expose `wrapper.prototype` as `_.prototype` - _.prototype = wrapper.prototype; - - // Helper function to continue chaining intermediate results. - var result = function(obj, chain) { - return chain ? _(obj).chain() : obj; - }; - - // A method to easily add functions to the OOP wrapper. - var addToWrapper = function(name, func) { - wrapper.prototype[name] = function() { - var args = slice.call(arguments); - unshift.call(args, this._wrapped); - return result(func.apply(_, args), this._chain); - }; - }; - - // Add all of the Underscore functions to the wrapper object. - _.mixin(_); - - // Add all mutator Array functions to the wrapper. - each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { - var method = ArrayProto[name]; - wrapper.prototype[name] = function() { - var wrapped = this._wrapped; - method.apply(wrapped, arguments); - var length = wrapped.length; - if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0]; - return result(wrapped, this._chain); - }; - }); - - // Add all accessor Array functions to the wrapper. - each(['concat', 'join', 'slice'], function(name) { - var method = ArrayProto[name]; - wrapper.prototype[name] = function() { - return result(method.apply(this._wrapped, arguments), this._chain); - }; - }); - - // Start chaining a wrapped Underscore object. - wrapper.prototype.chain = function() { - this._chain = true; - return this; - }; - - // Extracts the result from a wrapped and chained object. - wrapper.prototype.value = function() { - return this._wrapped; - }; - -}).call(this); diff --git a/assets/webconfig/js/ui_utils.js b/assets/webconfig/js/ui_utils.js index 3d921e76..f7a6c529 100644 --- a/assets/webconfig/js/ui_utils.js +++ b/assets/webconfig/js/ui_utils.js @@ -81,7 +81,7 @@ function loadContent(event) $("#page-content").off(); $("#page-content").load("/content/"+tag+".html", function(response,status,xhr){ if(status == "error") - $("#page-content").html('

The page you requested is no longer available, click on another menu item!

'); + $("#page-content").html('

'+$.i18n('info_404')+'

'); removeOverlay(); }); } @@ -218,6 +218,39 @@ function createHint(type, text, container) } } +function valValue(id,value,min,max) +{ + //TODO: Do not use parser, all values are now typeof number + value = parseInt(value) + if(typeof value === 'number') + { + if(typeof max === 'undefined' || max == "") + max = 999999; + + if(value > max || value < min) + { + $('#'+id).val(min); + return min; + } + return value; + } + return value; +} + +function readImg(input,cb) +{ + if (input.files && input.files[0]) { + var reader = new FileReader(); + + reader.onload = function (e) { + var i = new Image(); + i.src = e.target.result; + cb(i.src,i.width,i.height); + } + reader.readAsDataURL(input.files[0]); + } +} + function isJsonString(str) { try diff --git a/include/hyperion/Hyperion.h b/include/hyperion/Hyperion.h index 230514b3..fb492e79 100644 --- a/include/hyperion/Hyperion.h +++ b/include/hyperion/Hyperion.h @@ -191,8 +191,10 @@ public slots: /// @param[in] priority The priority of the written colors /// @param[in] ledColors The colors to write to the leds /// @param[in] timeout_ms The time the leds are set to the given colors [ms] + /// @param[in] component The current component + /// @param[in] origin Who set it /// - void setColors(int priority, const std::vector &ledColors, const int timeout_ms, bool clearEffects = true, hyperion::Components component=hyperion::COMP_INVALID); + void setColors(int priority, const std::vector &ledColors, const int timeout_ms, bool clearEffects = true, hyperion::Components component=hyperion::COMP_INVALID, const QString origin="System"); /// /// Writes the given colors to all leds for the given time and priority diff --git a/include/hyperion/PriorityMuxer.h b/include/hyperion/PriorityMuxer.h index b3d47b8f..cd908f0e 100644 --- a/include/hyperion/PriorityMuxer.h +++ b/include/hyperion/PriorityMuxer.h @@ -33,7 +33,10 @@ public: int64_t timeoutTime_ms; /// The colors for each led of the channel std::vector ledColors; + /// The component hyperion::Components componentId; + /// Who set it + QString origin; }; /// The lowest possible priority, which is used when no priority channels are active @@ -90,8 +93,10 @@ public: /// @param[in] priority The priority of the channel /// @param[in] ledColors The led colors of the priority channel /// @param[in] timeoutTime_ms The absolute timeout time of the channel + /// @param[in] component The component of the channel + /// @param[in] origin Who set the channel /// - void setInput(const int priority, const std::vector& ledColors, const int64_t timeoutTime_ms=-1, hyperion::Components component=hyperion::COMP_INVALID); + void setInput(const int priority, const std::vector& ledColors, const int64_t timeoutTime_ms=-1, hyperion::Components component=hyperion::COMP_INVALID, const QString origin="System"); /// /// Clears the specified priority channel diff --git a/libsrc/hyperion/Hyperion.cpp b/libsrc/hyperion/Hyperion.cpp index cdc327af..6fc65b6a 100644 --- a/libsrc/hyperion/Hyperion.cpp +++ b/libsrc/hyperion/Hyperion.cpp @@ -571,7 +571,7 @@ void Hyperion::setColor(int priority, const ColorRgb &color, const int timeout_m setColors(priority, ledColors, timeout_ms, clearEffects, hyperion::COMP_COLOR); } -void Hyperion::setColors(int priority, const std::vector& ledColors, const int timeout_ms, bool clearEffects, hyperion::Components component) +void Hyperion::setColors(int priority, const std::vector& ledColors, const int timeout_ms, bool clearEffects, hyperion::Components component, const QString origin) { // clear effects if this call does not come from an effect if (clearEffects) @@ -582,11 +582,11 @@ void Hyperion::setColors(int priority, const std::vector& ledColors, c if (timeout_ms > 0) { const uint64_t timeoutTime = QDateTime::currentMSecsSinceEpoch() + timeout_ms; - _muxer.setInput(priority, ledColors, timeoutTime, component); + _muxer.setInput(priority, ledColors, timeoutTime, component, origin); } else { - _muxer.setInput(priority, ledColors, -1, component); + _muxer.setInput(priority, ledColors, -1, component, origin); } if (! _sourceAutoSelectEnabled || priority == _muxer.getCurrentPriority()) diff --git a/libsrc/hyperion/PriorityMuxer.cpp b/libsrc/hyperion/PriorityMuxer.cpp index 707109f4..7aef7ae9 100644 --- a/libsrc/hyperion/PriorityMuxer.cpp +++ b/libsrc/hyperion/PriorityMuxer.cpp @@ -48,13 +48,14 @@ const PriorityMuxer::InputInfo& PriorityMuxer::getInputInfo(const int priority) return elemIt.value(); } -void PriorityMuxer::setInput(const int priority, const std::vector& ledColors, const int64_t timeoutTime_ms, hyperion::Components component) +void PriorityMuxer::setInput(const int priority, const std::vector& ledColors, const int64_t timeoutTime_ms, hyperion::Components component, const QString origin) { InputInfo& input = _activeInputs[priority]; input.priority = priority; input.timeoutTime_ms = timeoutTime_ms; input.ledColors = ledColors; input.componentId = component; + input.origin = origin; _currentPriority = std::min(_currentPriority, priority); } diff --git a/libsrc/hyperion/schemas/hyperion.schema-2.json b/libsrc/hyperion/schemas/hyperion.schema-2.json index c2cbe87f..ba852278 100644 --- a/libsrc/hyperion/schemas/hyperion.schema-2.json +++ b/libsrc/hyperion/schemas/hyperion.schema-2.json @@ -649,7 +649,7 @@ "width" : { "type" : "integer", - "title" : "edt_conf_v4l2_width_title", + "title" : "edt_conf_fg_width_title", "minimum" : 10, "default" : 80, "append" : "edt_append_pixel", @@ -658,7 +658,7 @@ "height" : { "type" : "integer", - "title" : "edt_conf_v4l2_height_title", + "title" : "edt_conf_fg_height_title", "minimum" : 10, "default" : 45, "append" : "edt_append_pixel", diff --git a/libsrc/jsonserver/JsonClientConnection.cpp b/libsrc/jsonserver/JsonClientConnection.cpp index 1cc52db8..c17dd422 100644 --- a/libsrc/jsonserver/JsonClientConnection.cpp +++ b/libsrc/jsonserver/JsonClientConnection.cpp @@ -365,6 +365,7 @@ void JsonClientConnection::handleColorCommand(const QJsonObject& message, const // extract parameters int priority = message["priority"].toInt(); int duration = message["duration"].toInt(-1); + QString origin = message["origin"].toString(); std::vector colorData(_hyperion->getLedCount()); const QJsonArray & jsonColor = message["color"].toArray(); @@ -391,7 +392,7 @@ void JsonClientConnection::handleColorCommand(const QJsonObject& message, const } // set output - _hyperion->setColors(priority, colorData, duration, true, hyperion::COMP_COLOR); + _hyperion->setColors(priority, colorData, duration, true, hyperion::COMP_COLOR, origin); // send reply sendSuccessReply(command, tan); @@ -598,6 +599,7 @@ void JsonClientConnection::handleServerInfoCommand(const QJsonObject&, const QSt item["owner"] = QString(hyperion::componentToIdString(priorityInfo.componentId)); item["componentId"] = priorityInfo.componentId; + item["origin"] = priorityInfo.origin; item["component"] = QString(hyperion::componentToString(priorityInfo.componentId)); item["active"] = true; item["visible"] = (priority == currentPriority); diff --git a/libsrc/jsonserver/schema/schema-color.json b/libsrc/jsonserver/schema/schema-color.json index 02ab77da..fcbd606a 100644 --- a/libsrc/jsonserver/schema/schema-color.json +++ b/libsrc/jsonserver/schema/schema-color.json @@ -20,6 +20,10 @@ "type": "integer", "required": false }, + "origin": { + "type": "string", + "required": true + }, "color": { "type": "array", "required": true, diff --git a/libsrc/jsonserver/schema/schema-effect.json b/libsrc/jsonserver/schema/schema-effect.json index 0db56d22..dd203238 100644 --- a/libsrc/jsonserver/schema/schema-effect.json +++ b/libsrc/jsonserver/schema/schema-effect.json @@ -20,6 +20,10 @@ "type": "integer", "required": false }, + "origin": { + "type": "string", + "required": true + }, "effect": { "type": "object", "required": true, From 221af075a4c36e2c83af58d9d4a57a80d6b3f5e5 Mon Sep 17 00:00:00 2001 From: redPanther Date: Wed, 1 Mar 2017 15:23:53 +0100 Subject: [PATCH 04/29] implement origin for effects (#408) * implement rigin for efx * implement origin for effects and other components add experimental adalight firmware for arduino with upto 5 pwm channels * cleanup * origin ip now with dns lookup * fix compile * move some code --- .../adalight_mega_pwm/hyperion_mega.ino | 250 ++++++++++++++++++ include/boblightserver/BoblightServer.h | 2 +- include/effectengine/EffectEngine.h | 9 +- include/hyperion/Hyperion.h | 12 +- include/udplistener/UDPListener.h | 8 +- include/utils/Components.h | 8 +- include/utils/Logger.h | 4 +- include/utils/global_defines.h | 4 + .../BoblightClientConnection.cpp | 33 ++- .../boblightserver/BoblightClientConnection.h | 16 +- libsrc/effectengine/Effect.cpp | 13 +- libsrc/effectengine/Effect.h | 5 +- libsrc/effectengine/EffectEngine.cpp | 25 +- libsrc/hyperion/GrabberWrapper.cpp | 5 +- libsrc/hyperion/Hyperion.cpp | 18 +- libsrc/jsonserver/JsonClientConnection.cpp | 15 +- libsrc/jsonserver/JsonClientConnection.h | 6 +- libsrc/jsonserver/schema/schema-image.json | 4 + libsrc/protoserver/ProtoClientConnection.cpp | 7 +- libsrc/protoserver/ProtoClientConnection.h | 6 +- libsrc/udplistener/UDPListener.cpp | 18 +- libsrc/utils/CMakeLists.txt | 1 + libsrc/utils/Logger.cpp | 1 + src/hyperion-remote/JsonConnection.cpp | 4 + 24 files changed, 376 insertions(+), 98 deletions(-) create mode 100644 assets/firmware/arduino/adalight_mega_pwm/hyperion_mega.ino create mode 100644 include/utils/global_defines.h diff --git a/assets/firmware/arduino/adalight_mega_pwm/hyperion_mega.ino b/assets/firmware/arduino/adalight_mega_pwm/hyperion_mega.ino new file mode 100644 index 00000000..519cdb33 --- /dev/null +++ b/assets/firmware/arduino/adalight_mega_pwm/hyperion_mega.ino @@ -0,0 +1,250 @@ + +#include "FastLED.h" + +#define ANALOG_MODE_AVERAGE 0 +#define ANALOG_MODE_LAST_LED 1 + +/************************************** + S E T U P + + set following values to your needs + **************************************/ + +// Number of leds in your strip. set to 1 and ANALOG_OUTPUT_ENABLED to true to activate analog only +#define NUM_LEDS 100 + +#define LED_TYPE WS2812B // type of your led controller, possible values, see below + +// 3 wire (pwm): NEOPIXEL BTM1829 TM1812 TM1809 TM1804 TM1803 UCS1903 UCS1903B UCS1904 UCS2903 WS2812 WS2852 +// S2812B SK6812 SK6822 APA106 PL9823 WS2811 WS2813 APA104 WS2811_40 GW6205 GW6205_40 LPD1886 LPD1886_8BIT +// 4 wire (spi): LPD8806 WS2801 WS2803 SM16716 P9813 APA102 SK9822 DOTSTAR + +// For 3 wire led stripes line Neopixel/Ws2812, which have a data line, ground, and power, you just need to define DATA_PIN. +// For led chipsets that are SPI based (four wires - data, clock, ground, and power), both defines DATA_PIN and CLOCK_PIN are needed + +// DATA_PIN, or DATA_PIN, CLOCK_PIN +#define LED_PINS MOSI // 3 wire leds +//#define LED_PINS MOSI, SCK // 4 wire leds + +#define COLOR_ORDER GRB // colororder of the stripe, set RGB in hyperion + +#define OFF_TIMEOUT 15000 // ms to switch off after no data was received, set 0 to deactivate + +// analog rgb uni color led stripe - using of hyperion smoothing is recommended +#define ANALOG_MODE ANALOG_MODE_LAST_LED // use ANALOG_MODE_AVERAGE or ANALOG_MODE_LAST_LED + + +// overall color adjustments +#define ANALOG_BRIGHTNESS_RED 255 // maximum brightness for analog 0-255 +#define ANALOG_BRIGHTNESS_GREEN 255 // maximum brightness for analog 0-255 +#define ANALOG_BRIGHTNESS_BLUE 255 // maximum brightness for analog 0-255 + +#define BRIGHTNESS 128 // maximum brightness 0-255 +#define DITHER_MODE BINARY_DITHER // BINARY_DITHER or DISABLE_DITHER +#define COLOR_TEMPERATURE CRGB(255,255,255) // RGB value describing the color temperature +#define COLOR_CORRECTION TypicalLEDStrip // predefined fastled color correction +//#define COLOR_CORRECTION CRGB(255,255,255) // or RGB value describing the color correction + + +// Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf) + #define serialRate 115200 // use 115200 for ftdi based boards +//#define serialRate 460800 // use 115200 for ftdi based boards + +// ATTENTION this pin config is default for atmega328 based arduinos, others might work to +// if you have flickering analog leds this might be caused by unsynced pwm signals +// try other pins is more or less the only thing that helps + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + // 2 3 4 5 6 7 8 9 10 11 12 13 44 45 46 + // R B G R B G R B G R B G R B G + #define ANALOG_PINS_MAX 15 + #define ANALOG_RGB_STRIPES 4 + const byte ANALOG_PINS[ANALOG_PINS_MAX] = {2,4,3,5,7,6,8,10,9,11,13,12,44,46,45}; +#else +// 9 10 11 +// R B G + #define ANALOG_PINS_MAX 3 + #define ANALOG_RGB_STRIPES 1 + const byte ANALOG_PINS[ANALOG_PINS_MAX] = {9,11,10}; +#endif + +/************************************** + A D A L I G H T C O D E + + no user changes needed + **************************************/ + +// Adalight sends a "Magic Word" (defined in /etc/boblight.conf) before sending the pixel data +uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i; + +unsigned long endTime; + +// Define the array of leds +CRGB leds[NUM_LEDS]; + +// set rgb to analog led stripe +void showAnalogRGB(const CRGB& led, const short stripeId=-1) { + if (ANALOG_RGB_STRIPES > 0) { + byte r = map(led.r, 0,255,0,ANALOG_BRIGHTNESS_RED); + byte g = map(led.g, 0,255,0,ANALOG_BRIGHTNESS_GREEN); + byte b = map(led.b, 0,255,0,ANALOG_BRIGHTNESS_BLUE); + if (stripeId<0) { + for (byte i=0;i ANALOG_RGB_STRIPES + LEDS.showColor(led); + #endif + showAnalogRGB(led); +} + + +// function to check if serial data is available +// if timeout occured leds switch of, if configured +bool checkIncommingData() { + boolean dataAvailable = true; + while (!Serial.available()) { + if ( OFF_TIMEOUT > 0 && endTime < millis()) { + showColor(CRGB(0,0,0)); // leds off + dataAvailable = false; + endTime = millis() + OFF_TIMEOUT; + } + } + + return dataAvailable; +} + +// main function that setups and runs the code +void setup() { + + // analog output + if (ANALOG_RGB_STRIPES > 0) { + for (byte i=0;i ANALOG_RGB_STRIPES + FastLED.addLeds(leds, ledCount); + #endif + + // color adjustments + FastLED.setBrightness ( BRIGHTNESS ); + FastLED.setTemperature( COLOR_TEMPERATURE ); + FastLED.setCorrection ( COLOR_CORRECTION ); + FastLED.setDither ( DITHER_MODE ); + + // initial RGB flash + showColor(CRGB(255, 0, 0)); delay(400); + showColor(CRGB(0, 255, 0)); delay(400); + showColor(CRGB(0, 0, 255)); delay(400); + showColor(CRGB(0, 0, 0)); + + Serial.begin(serialRate); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB + } + Serial.print("Ada\n"); // Send "Magic Word" string to host + + boolean transmissionSuccess; + unsigned long sum_r, sum_g, sum_b; + + // loop() is avoided as even that small bit of function overhead + // has a measurable impact on this code's overall throughput. + while (true) { + // wait for first byte of Magic Word + for (i = 0; i < sizeof prefix; ++i) { + // If next byte is not in Magic Word, the start over + if (!checkIncommingData() || prefix[i] != Serial.read()) { + i = 0; + } + } + // Hi, Lo, Checksum + if (!checkIncommingData()) continue; + hi = Serial.read(); + if (!checkIncommingData()) continue; + lo = Serial.read(); + if (!checkIncommingData()) continue; + chk = Serial.read(); + + // if checksum does not match go back to wait + if (chk != (hi ^ lo ^ 0x55)) continue; + + memset(leds, 0, NUM_LEDS * sizeof(struct CRGB)); + transmissionSuccess = true; + sum_r = 0; + sum_g = 0; + sum_b = 0; + + // read the transmission data and set LED values + for (uint8_t idx = 0; idx < NUM_LEDS; idx++) { + byte r, g, b; + if (!checkIncommingData()) { + transmissionSuccess = false; + break; + } + r = Serial.read(); + if (!checkIncommingData()) { + transmissionSuccess = false; + break; + } + g = Serial.read(); + if (!checkIncommingData()) { + transmissionSuccess = false; + break; + } + b = Serial.read(); + leds[idx].r = r; + leds[idx].g = g; + leds[idx].b = b; + #if ANALOG_OUTPUT_ENABLED == true && ANALOG_MODE == ANALOG_MODE_AVERAGE + sum_r += r; + sum_g += g; + sum_b += b; + #endif + } + + // shows new values + if (transmissionSuccess) { + endTime = millis() + OFF_TIMEOUT; + #if NUM_LEDS > ANALOG_RGB_STRIPES + FastLED.show(); + #endif + + #if ANALOG_RGB_STRIPES > 0 + #if ANALOG_MODE == ANALOG_MODE_LAST_LED + for ( byte x=1; x<=ANALOG_RGB_STRIPES; x++) { + showAnalogRGB(leds[NUM_LEDS-x], x-1); + } + #else + showAnalogRGB(CRGB(sum_r/NUM_LEDS, sum_g/NUM_LEDS, sum_b/NUM_LEDS)); + #endif + #endif + } + } +} // end of setup + + +void loop() { + // Not used. See note in setup() function. +} + diff --git a/include/boblightserver/BoblightServer.h b/include/boblightserver/BoblightServer.h index 647f889f..42ed587c 100644 --- a/include/boblightserver/BoblightServer.h +++ b/include/boblightserver/BoblightServer.h @@ -87,5 +87,5 @@ private: /// state of connection bool _isActive; - uint16_t _port; + uint16_t _port; }; diff --git a/include/effectengine/EffectEngine.h b/include/effectengine/EffectEngine.h index 6fcf3808..0a070d9e 100644 --- a/include/effectengine/EffectEngine.h +++ b/include/effectengine/EffectEngine.h @@ -45,13 +45,10 @@ public: public slots: /// Run the specified effect on the given priority channel and optionally specify a timeout - int runEffect(const QString &effectName, int priority, int timeout = -1) - { - return runEffect(effectName, QJsonObject(), priority, timeout); - }; + int runEffect(const QString &effectName, int priority, int timeout = -1, const QString &origin="System"); /// Run the specified effect on the given priority channel and optionally specify a timeout - int runEffect(const QString &effectName, const QJsonObject & args, int priority, int timeout = -1, QString pythonScript = ""); + int runEffect(const QString &effectName, const QJsonObject & args, int priority, int timeout = -1, const QString &pythonScript = "", const QString &origin = "System"); /// Clear any effect running on the provided channel void channelCleared(int priority); @@ -68,7 +65,7 @@ private: bool loadEffectSchema(const QString & path, const QString & effectSchemaFile, EffectSchema &effectSchema); /// Run the specified effect on the given priority channel and optionally specify a timeout - int runEffectScript(const QString &script, const QString &name, const QJsonObject & args, int priority, int timeout = -1); + int runEffectScript(const QString &script, const QString &name, const QJsonObject & args, int priority, int timeout = -1, const QString & origin="System"); private: Hyperion * _hyperion; diff --git a/include/hyperion/Hyperion.h b/include/hyperion/Hyperion.h index fb492e79..6e817284 100644 --- a/include/hyperion/Hyperion.h +++ b/include/hyperion/Hyperion.h @@ -52,7 +52,7 @@ class Hyperion : public QObject public: /// Type definition of the info structure used by the priority muxer typedef PriorityMuxer::InputInfo InputInfo; - typedef std::map PriorityRegister; + typedef std::map PriorityRegister; /// /// RGB-Color channel enumeration @@ -132,12 +132,13 @@ public: /// register a input source to a priority channel /// @param name uniq name of input source + /// @param origin External setter /// @param priority priority channel - void registerPriority(const std::string name, const int priority); + void registerPriority(const QString &name, const int priority); /// unregister a input source to a priority channel /// @param name uniq name of input source - void unRegisterPriority(const std::string name); + void unRegisterPriority(const QString &name); /// gets current priority register /// @return the priority register @@ -243,14 +244,15 @@ public slots: /// @param effectName Name of the effec to run /// @param priority The priority channel of the effect /// @param timeout The timeout of the effect (after the timout, the effect will be cleared) - int setEffect(const QString & effectName, int priority, int timeout = -1); + int setEffect(const QString & effectName, int priority, int timeout = -1, const QString & origin="System"); /// Run the specified effect on the given priority channel and optionally specify a timeout /// @param effectName Name of the effec to run /// @param args arguments of the effect script /// @param priority The priority channel of the effect /// @param timeout The timeout of the effect (after the timout, the effect will be cleared) - int setEffect(const QString & effectName, const QJsonObject & args, int priority, int timeout = -1, QString pythonScript = ""); + int setEffect(const QString & effectName, const QJsonObject & args, int priority, + int timeout = -1, const QString & pythonScript = "", const QString & origin="System"); /// sets the methode how image is maped to leds void setLedMappingType(int mappingType); diff --git a/include/udplistener/UDPListener.h b/include/udplistener/UDPListener.h index 6fdec310..2e7c9e64 100644 --- a/include/udplistener/UDPListener.h +++ b/include/udplistener/UDPListener.h @@ -63,7 +63,7 @@ private slots: /// Slot which is called when a client tries to create a new connection /// void readPendingDatagrams(); - void processTheDatagram(const QByteArray * _datagram); + void processTheDatagram(const QByteArray * datagram, const QHostAddress * sender); private: /// Hyperion instance @@ -78,7 +78,7 @@ private: /// hyperion priority int _priority; - /// hyperion priority + /// hyperion timeout int _timeout; /// Logger instance @@ -88,7 +88,7 @@ private: bool _isActive; /// address to bind - QHostAddress _listenAddress; - quint16 _listenPort; + QHostAddress _listenAddress; + quint16 _listenPort; QAbstractSocket::BindFlag _bondage; }; diff --git a/include/utils/Components.h b/include/utils/Components.h index 297a1c63..37165a6e 100644 --- a/include/utils/Components.h +++ b/include/utils/Components.h @@ -18,7 +18,8 @@ enum Components COMP_GRABBER, COMP_V4L, COMP_COLOR, - COMP_EFFECT + COMP_EFFECT, + COMP_PROTOSERVER }; inline const char* componentToString(Components c) @@ -35,6 +36,7 @@ inline const char* componentToString(Components c) case COMP_V4L: return "V4L capture device"; case COMP_COLOR: return "Solid color"; case COMP_EFFECT: return "Effect"; + case COMP_PROTOSERVER: return "Proto Server"; default: return ""; } } @@ -53,6 +55,7 @@ inline const char* componentToIdString(Components c) case COMP_V4L: return "V4L"; case COMP_COLOR: return "COLOR"; case COMP_EFFECT: return "EFFECT"; + case COMP_PROTOSERVER: return "PROTOSERVER"; default: return ""; } } @@ -70,8 +73,9 @@ inline Components stringToComponent(QString component) if (component == "V4L") return COMP_V4L; if (component == "COLOR") return COMP_COLOR; if (component == "EFFECT") return COMP_EFFECT; + if (component == "PROTOSERVER") return COMP_PROTOSERVER; return COMP_INVALID; } -} +}; // end of namespace diff --git a/include/utils/Logger.h b/include/utils/Logger.h index 0b1a58b2..504f6901 100644 --- a/include/utils/Logger.h +++ b/include/utils/Logger.h @@ -11,7 +11,7 @@ #include #include - +#include // standard log messages //#define _FUNCNAME_ __PRETTY_FUNCTION__ @@ -99,3 +99,5 @@ protected: QVector _logMessageBuffer; const int _loggerMaxMsgBufferSize; }; + +Q_DECLARE_METATYPE(Logger::T_LOG_MESSAGE); diff --git a/include/utils/global_defines.h b/include/utils/global_defines.h new file mode 100644 index 00000000..eb75d339 --- /dev/null +++ b/include/utils/global_defines.h @@ -0,0 +1,4 @@ +#pragma once + +#define QSTRING_CSTR(str) str.toLocal8Bit().constData() + diff --git a/libsrc/boblightserver/BoblightClientConnection.cpp b/libsrc/boblightserver/BoblightClientConnection.cpp index b8734ea3..17dc3491 100644 --- a/libsrc/boblightserver/BoblightClientConnection.cpp +++ b/libsrc/boblightserver/BoblightClientConnection.cpp @@ -12,6 +12,7 @@ // Qt includes #include #include +#include // hyperion util includes #include "hyperion/ImageProcessorFactory.h" @@ -32,6 +33,7 @@ BoblightClientConnection::BoblightClientConnection(QTcpSocket *socket, const int , _priority(priority) , _ledColors(Hyperion::getInstance()->getLedCount(), ColorRgb::BLACK) , _log(Logger::getInstance("BOBLIGHT")) + , _clientAddress(QHostInfo::fromName(socket->peerAddress().toString()).hostName()) { // initalize the locale. Start with the default C-locale _locale.setNumberOptions(QLocale::OmitGroupSeparator | QLocale::RejectGroupSeparator); @@ -165,16 +167,16 @@ void BoblightClientConnection::handleMessage(const QString & message) // send current color values to hyperion if this is the last led assuming leds values are send in order of id if ((ledIndex == _ledColors.size() -1) && _priority < 255) { - _hyperion->setColors(_priority, _ledColors, -1, hyperion::COMP_BOBLIGHTSERVER); + _hyperion->setColors(_priority, _ledColors, -1, true, hyperion::COMP_BOBLIGHTSERVER, _clientAddress); } return; } } else if(messageParts[3] == "speed" || - messageParts[3] == "interpolation" || - messageParts[3] == "use" || - messageParts[3] == "singlechange") + messageParts[3] == "interpolation" || + messageParts[3] == "use" || + messageParts[3] == "singlechange") { // these message are ignored by Hyperion return; @@ -203,38 +205,33 @@ void BoblightClientConnection::handleMessage(const QString & message) // send current color values to hyperion if (_priority < 255) { - _hyperion->setColors(_priority, _ledColors, -1, hyperion::COMP_BOBLIGHTSERVER); + _hyperion->setColors(_priority, _ledColors, -1, true, hyperion::COMP_BOBLIGHTSERVER, _clientAddress); } return; } } - Debug(_log, "unknown boblight message: %s", message.toStdString().c_str()); + Debug(_log, "unknown boblight message: %s", QSTRING_CSTR(message)); } -void BoblightClientConnection::sendMessage(const std::string & message) +void BoblightClientConnection::sendMessage(const QByteArray & message) { //std::cout << "send boblight message: " << message; - _socket->write(message.c_str(), message.size()); -} - -void BoblightClientConnection::sendMessage(const char * message, int size) -{ - //std::cout << "send boblight message: " << std::string(message, size); - _socket->write(message, size); + _socket->write(message); } void BoblightClientConnection::sendLightMessage() { char buffer[256]; - int n = snprintf(buffer, sizeof(buffer), "lights %d\n", _hyperion->getLedCount()); - sendMessage(buffer, n); + int n = snprintf(buffer, sizeof(buffer), "lights %d\n", _hyperion->getLedCount()); + sendMessage(QByteArray(buffer, n)); + + double h0, h1, v0, v1; for (unsigned i = 0; i < _hyperion->getLedCount(); ++i) { - double h0, h1, v0, v1; _imageProcessor->getScanParameters(i, h0, h1, v0, v1); n = snprintf(buffer, sizeof(buffer), "light %03d scan %f %f %f %f\n", i, 100*v0, 100*v1, 100*h0, 100*h1); - sendMessage(buffer, n); + sendMessage(QByteArray(buffer, n)); } } diff --git a/libsrc/boblightserver/BoblightClientConnection.h b/libsrc/boblightserver/BoblightClientConnection.h index 6f91060c..d4baffa6 100644 --- a/libsrc/boblightserver/BoblightClientConnection.h +++ b/libsrc/boblightserver/BoblightClientConnection.h @@ -1,8 +1,5 @@ #pragma once -// stl includes -#include - // Qt includes #include #include @@ -65,15 +62,7 @@ private: /// /// @param message The boblight message to send /// - void sendMessage(const std::string &message); - - /// - /// Send a message to the connected client - /// - /// @param message The boblight message to send - /// @param size The size of the message - /// - void sendMessage(const char * message, int size); + void sendMessage(const QByteArray &message); /// /// Send a lights message the to connected client @@ -104,4 +93,7 @@ private: /// logger instance Logger * _log; + + /// address of client + QString _clientAddress; }; diff --git a/libsrc/effectengine/Effect.cpp b/libsrc/effectengine/Effect.cpp index 7d17d0ed..74e17ee9 100644 --- a/libsrc/effectengine/Effect.cpp +++ b/libsrc/effectengine/Effect.cpp @@ -66,7 +66,7 @@ void Effect::registerHyperionExtensionModule() PyImport_AppendInittab("hyperion", &PyInit_hyperion); } -Effect::Effect(PyThreadState * mainThreadState, int priority, int timeout, const QString & script, const QString & name, const QJsonObject & args) +Effect::Effect(PyThreadState * mainThreadState, int priority, int timeout, const QString & script, const QString & name, const QJsonObject & args, const QString & origin) : QThread() , _mainThreadState(mainThreadState) , _priority(priority) @@ -79,6 +79,7 @@ Effect::Effect(PyThreadState * mainThreadState, int priority, int timeout, const , _abortRequested(false) , _imageProcessor(ImageProcessorFactory::getInstance().newImageProcessor()) , _colors() + , _origin(origin) { _colors.resize(_imageProcessor->getLedCount(), ColorRgb::BLACK); @@ -146,7 +147,7 @@ void Effect::run() } else { - Error(Logger::getInstance("EFFECTENGINE"), "Unable to open script file %s", _script.toUtf8().constData()); + Error(Logger::getInstance("EFFECTENGINE"), "Unable to open script file %s.", QSTRING_CSTR(_script)); } file.close(); @@ -265,7 +266,7 @@ PyObject* Effect::wrapSetColor(PyObject *self, PyObject *args) if (PyArg_ParseTuple(args, "bbb", &color.red, &color.green, &color.blue)) { std::fill(effect->_colors.begin(), effect->_colors.end(), color); - effect->setColors(effect->_priority, effect->_colors, timeout, false, hyperion::COMP_EFFECT); + effect->setColors(effect->_priority, effect->_colors, timeout, false, hyperion::COMP_EFFECT, effect->_origin); return Py_BuildValue(""); } else @@ -286,7 +287,7 @@ PyObject* Effect::wrapSetColor(PyObject *self, PyObject *args) { char * data = PyByteArray_AS_STRING(bytearray); memcpy(effect->_colors.data(), data, length); - effect->setColors(effect->_priority, effect->_colors, timeout, false, hyperion::COMP_EFFECT); + effect->setColors(effect->_priority, effect->_colors, timeout, false, hyperion::COMP_EFFECT, effect->_origin); return Py_BuildValue(""); } else @@ -356,7 +357,7 @@ PyObject* Effect::wrapSetImage(PyObject *self, PyObject *args) memcpy(image.memptr(), data, length); effect->_imageProcessor->process(image, effect->_colors); - effect->setColors(effect->_priority, effect->_colors, timeout, false, hyperion::COMP_EFFECT); + effect->setColors(effect->_priority, effect->_colors, timeout, false, hyperion::COMP_EFFECT, effect->_origin); return Py_BuildValue(""); } else @@ -432,7 +433,7 @@ PyObject* Effect::wrapImageShow(PyObject *self, PyObject *args) memcpy(image.memptr(), binaryImage.data(), binaryImage.size()); effect->_imageProcessor->process(image, effect->_colors); - effect->setColors(effect->_priority, effect->_colors, timeout, false, hyperion::COMP_EFFECT); + effect->setColors(effect->_priority, effect->_colors, timeout, false, hyperion::COMP_EFFECT, effect->_origin); return Py_BuildValue(""); } diff --git a/libsrc/effectengine/Effect.h b/libsrc/effectengine/Effect.h index 0eb3ea08..7fbf26e9 100644 --- a/libsrc/effectengine/Effect.h +++ b/libsrc/effectengine/Effect.h @@ -18,7 +18,7 @@ class Effect : public QThread Q_OBJECT public: - Effect(PyThreadState * mainThreadState, int priority, int timeout, const QString & script, const QString & name, const QJsonObject & args = QJsonObject()); + Effect(PyThreadState * mainThreadState, int priority, int timeout, const QString & script, const QString & name, const QJsonObject & args = QJsonObject(), const QString & origin="System"); virtual ~Effect(); virtual void run(); @@ -43,7 +43,7 @@ public slots: signals: void effectFinished(Effect * effect); - void setColors(int priority, const std::vector &ledColors, const int timeout_ms, bool clearEffects, hyperion::Components component); + void setColors(int priority, const std::vector &ledColors, const int timeout_ms, bool clearEffects, hyperion::Components componentconst, QString origin); private slots: void effectFinished(); @@ -102,5 +102,6 @@ private: QImage * _image; QPainter * _painter; + QString _origin; }; diff --git a/libsrc/effectengine/EffectEngine.cpp b/libsrc/effectengine/EffectEngine.cpp index dd148a61..414e6f19 100644 --- a/libsrc/effectengine/EffectEngine.cpp +++ b/libsrc/effectengine/EffectEngine.cpp @@ -342,11 +342,16 @@ void EffectEngine::readEffects() } } -int EffectEngine::runEffect(const QString &effectName, const QJsonObject &args, int priority, int timeout, QString pythonScript) +int EffectEngine::runEffect(const QString &effectName, int priority, int timeout, const QString &origin) +{ + return runEffect(effectName, QJsonObject(), priority, timeout, "", origin); +} + +int EffectEngine::runEffect(const QString &effectName, const QJsonObject &args, int priority, int timeout, const QString &pythonScript, const QString &origin) { Info( _log, "run effect %s on channel %d", effectName.toUtf8().constData(), priority); - if (pythonScript == "") + if (pythonScript.isEmpty()) { const EffectDefinition * effectDefinition = nullptr; for (const EffectDefinition & e : _availableEffects) @@ -364,24 +369,24 @@ int EffectEngine::runEffect(const QString &effectName, const QJsonObject &args, return -1; } - return runEffectScript(effectDefinition->script, effectName, args.isEmpty() ? effectDefinition->args : args, priority, timeout); - } else - return runEffectScript(pythonScript, effectName, args, priority, timeout); + return runEffectScript(effectDefinition->script, effectName, (args.isEmpty() ? effectDefinition->args : args), priority, timeout, origin); + } + return runEffectScript(pythonScript, effectName, args, priority, timeout, origin); } -int EffectEngine::runEffectScript(const QString &script, const QString &name, const QJsonObject &args, int priority, int timeout) +int EffectEngine::runEffectScript(const QString &script, const QString &name, const QJsonObject &args, int priority, int timeout, const QString & origin) { // clear current effect on the channel channelCleared(priority); // create the effect - Effect * effect = new Effect(_mainThreadState, priority, timeout, script, name, args); - connect(effect, SIGNAL(setColors(int,std::vector,int,bool,hyperion::Components)), _hyperion, SLOT(setColors(int,std::vector,int,bool,hyperion::Components)), Qt::QueuedConnection); + Effect * effect = new Effect(_mainThreadState, priority, timeout, script, name, args, origin); + connect(effect, SIGNAL(setColors(int,std::vector,int,bool,hyperion::Components,const QString)), _hyperion, SLOT(setColors(int,std::vector,int,bool,hyperion::Components,const QString)), Qt::QueuedConnection); connect(effect, SIGNAL(effectFinished(Effect*)), this, SLOT(effectFinished(Effect*))); _activeEffects.push_back(effect); // start the effect - _hyperion->registerPriority(name.toStdString(), priority); + _hyperion->registerPriority(name, priority); effect->start(); return 0; @@ -426,5 +431,5 @@ void EffectEngine::effectFinished(Effect *effect) // cleanup the effect effect->deleteLater(); - _hyperion->unRegisterPriority(effect->getName().toStdString()); + _hyperion->unRegisterPriority(effect->getName()); } diff --git a/libsrc/hyperion/GrabberWrapper.cpp b/libsrc/hyperion/GrabberWrapper.cpp index 3647cc03..734fb539 100644 --- a/libsrc/hyperion/GrabberWrapper.cpp +++ b/libsrc/hyperion/GrabberWrapper.cpp @@ -4,7 +4,6 @@ #include #include -#define QSTRING_CSTR(str) str.toLocal8Bit().constData() GrabberWrapper::GrabberWrapper(QString grabberName, const int priority, hyperion::Components grabberComponentId) : _grabberName(grabberName) , _hyperion(Hyperion::getInstance()) @@ -37,7 +36,7 @@ bool GrabberWrapper::start() { // Start the timer with the pre configured interval _timer.start(); - _hyperion->registerPriority(_grabberName.toStdString(), _priority); + _hyperion->registerPriority(_grabberName, _priority); return _timer.isActive(); } @@ -46,7 +45,7 @@ void GrabberWrapper::stop() { // Stop the timer, effectivly stopping the process _timer.stop(); - _hyperion->unRegisterPriority(_grabberName.toStdString()); + _hyperion->unRegisterPriority(_grabberName); } void GrabberWrapper::componentStateChanged(const hyperion::Components component, bool enable) diff --git a/libsrc/hyperion/Hyperion.cpp b/libsrc/hyperion/Hyperion.cpp index 6fc65b6a..2cf31447 100644 --- a/libsrc/hyperion/Hyperion.cpp +++ b/libsrc/hyperion/Hyperion.cpp @@ -504,22 +504,22 @@ bool Hyperion::configWriteable() } -void Hyperion::registerPriority(const std::string name, const int priority) +void Hyperion::registerPriority(const QString &name, const int priority/*, const QString &origin*/) { - Info(_log, "Register new input source named '%s' for priority channel '%d'", name.c_str(), priority ); + Info(_log, "Register new input source named '%s' for priority channel '%d'", QSTRING_CSTR(name), priority ); for(auto const &entry : _priorityRegister) { WarningIf( ( entry.first != name && entry.second == priority), _log, - "Input source '%s' uses same priority channel (%d) as '%s'.", name.c_str(), priority, entry.first.c_str()); + "Input source '%s' uses same priority channel (%d) as '%s'.", QSTRING_CSTR(name), priority, QSTRING_CSTR(entry.first)); } _priorityRegister.emplace(name,priority); } -void Hyperion::unRegisterPriority(const std::string name) +void Hyperion::unRegisterPriority(const QString &name) { - Info(_log, "Unregister input source named '%s' from priority register", name.c_str()); + Info(_log, "Unregister input source named '%s' from priority register", QSTRING_CSTR(name)); _priorityRegister.erase(name); } @@ -688,14 +688,14 @@ const std::list & Hyperion::getEffectSchemas() return _effectEngine->getEffectSchemas(); } -int Hyperion::setEffect(const QString &effectName, int priority, int timeout) +int Hyperion::setEffect(const QString &effectName, int priority, int timeout, const QString & origin) { - return _effectEngine->runEffect(effectName, priority, timeout); + return _effectEngine->runEffect(effectName, priority, timeout, origin); } -int Hyperion::setEffect(const QString &effectName, const QJsonObject &args, int priority, int timeout, QString pythonScript) +int Hyperion::setEffect(const QString &effectName, const QJsonObject &args, int priority, int timeout, const QString & pythonScript, const QString & origin) { - return _effectEngine->runEffect(effectName, args, priority, timeout, pythonScript); + return _effectEngine->runEffect(effectName, args, priority, timeout, pythonScript, origin); } void Hyperion::setLedMappingType(int mappingType) diff --git a/libsrc/jsonserver/JsonClientConnection.cpp b/libsrc/jsonserver/JsonClientConnection.cpp index c17dd422..84bea379 100644 --- a/libsrc/jsonserver/JsonClientConnection.cpp +++ b/libsrc/jsonserver/JsonClientConnection.cpp @@ -27,6 +27,7 @@ #include #include #include +#include // hyperion util includes #include @@ -57,6 +58,7 @@ JsonClientConnection::JsonClientConnection(QTcpSocket *socket) , _forwarder_enabled(true) , _streaming_logging_activated(false) , _image_stream_timeout(0) + , _clientAddress(socket->peerAddress()) { // connect internal signals and slots connect(_socket, SIGNAL(disconnected()), this, SLOT(socketClosed())); @@ -365,7 +367,7 @@ void JsonClientConnection::handleColorCommand(const QJsonObject& message, const // extract parameters int priority = message["priority"].toInt(); int duration = message["duration"].toInt(-1); - QString origin = message["origin"].toString(); + QString origin = message["origin"].toString() + "@"+QHostInfo::fromName(_clientAddress.toString()).hostName(); std::vector colorData(_hyperion->getLedCount()); const QJsonArray & jsonColor = message["color"].toArray(); @@ -438,18 +440,19 @@ void JsonClientConnection::handleEffectCommand(const QJsonObject& message, const // extract parameters int priority = message["priority"].toInt(); int duration = message["duration"].toInt(-1); - QString pythonScript = message["pythonScript"].toString(""); + QString pythonScript = message["pythonScript"].toString(); + QString origin = message["origin"].toString() + "@"+_clientAddress.toString(); const QJsonObject & effect = message["effect"].toObject(); const QString & effectName = effect["name"].toString(); // set output if (effect.contains("args")) { - _hyperion->setEffect(effectName, effect["args"].toObject(), priority, duration, pythonScript); + _hyperion->setEffect(effectName, effect["args"].toObject(), priority, duration, pythonScript, origin); } else { - _hyperion->setEffect(effectName, priority, duration); + _hyperion->setEffect(effectName, priority, duration, origin); } // send reply @@ -607,7 +610,7 @@ void JsonClientConnection::handleServerInfoCommand(const QJsonObject&, const QSt { if (entry.second == priority) { - item["owner"] = QString::fromStdString(entry.first); + item["owner"] = entry.first; priorityRegister.erase(entry.first); break; } @@ -665,7 +668,7 @@ void JsonClientConnection::handleServerInfoCommand(const QJsonObject&, const QSt item["priority"] = entry.second; item["active"] = false; item["visible"] = false; - item["owner"] = QString::fromStdString(entry.first); + item["owner"] = entry.first; priorities.append(item); } diff --git a/libsrc/jsonserver/JsonClientConnection.h b/libsrc/jsonserver/JsonClientConnection.h index 5adc067c..7decad84 100644 --- a/libsrc/jsonserver/JsonClientConnection.h +++ b/libsrc/jsonserver/JsonClientConnection.h @@ -7,6 +7,7 @@ #include #include #include +#include // Hyperion includes #include @@ -348,7 +349,10 @@ private: /// timeout for live video refresh volatile qint64 _image_stream_timeout; - + + /// address of client + QHostAddress _clientAddress; + // masks for fields in the basic header static uint8_t const BHB0_OPCODE = 0x0F; static uint8_t const BHB0_RSV3 = 0x10; diff --git a/libsrc/jsonserver/schema/schema-image.json b/libsrc/jsonserver/schema/schema-image.json index 62b0922f..50674717 100644 --- a/libsrc/jsonserver/schema/schema-image.json +++ b/libsrc/jsonserver/schema/schema-image.json @@ -16,6 +16,10 @@ "maximum" : 253, "required": true }, + "origin": { + "type": "string", + "required": true + }, "duration": { "type": "integer", "required": false diff --git a/libsrc/protoserver/ProtoClientConnection.cpp b/libsrc/protoserver/ProtoClientConnection.cpp index 72cb6325..533b918d 100644 --- a/libsrc/protoserver/ProtoClientConnection.cpp +++ b/libsrc/protoserver/ProtoClientConnection.cpp @@ -11,6 +11,7 @@ #include #include #include +#include // hyperion util includes #include "hyperion/ImageProcessorFactory.h" @@ -27,13 +28,13 @@ ProtoClientConnection::ProtoClientConnection(QTcpSocket *socket) , _hyperion(Hyperion::getInstance()) , _receiveBuffer() , _priority(-1) + , _priorityChannelName("Proto-Server") + , _clientAddress(QHostInfo::fromName(socket->peerAddress().toString()).hostName()) { // connect internal signals and slots connect(_socket, SIGNAL(disconnected()), this, SLOT(socketClosed())); connect(_socket, SIGNAL(readyRead()), this, SLOT(readData())); connect(_hyperion, SIGNAL(imageToLedsMappingChanged(int)), _imageProcessor, SLOT(setLedMappingType(int))); - - _priorityChannelName = "proto@"+ _socket->peerAddress().toString().toStdString(); } ProtoClientConnection::~ProtoClientConnection() @@ -198,7 +199,7 @@ void ProtoClientConnection::handleImageCommand(const proto::ImageRequest &messag // process the image std::vector ledColors = _imageProcessor->process(image); - _hyperion->setColors(_priority, ledColors, duration); + _hyperion->setColors(_priority, ledColors, duration, true, hyperion::COMP_PROTOSERVER , "proto@"+_clientAddress); _hyperion->setImage(_priority, image, duration); // send reply diff --git a/libsrc/protoserver/ProtoClientConnection.h b/libsrc/protoserver/ProtoClientConnection.h index f2777d4c..ce39e734 100644 --- a/libsrc/protoserver/ProtoClientConnection.h +++ b/libsrc/protoserver/ProtoClientConnection.h @@ -7,6 +7,7 @@ #include #include #include +#include // Hyperion includes #include @@ -140,5 +141,8 @@ private: int _priority; - std::string _priorityChannelName; + QString _priorityChannelName; + + /// address of client + QString _clientAddress; }; diff --git a/libsrc/udplistener/UDPListener.cpp b/libsrc/udplistener/UDPListener.cpp index 1a7a98a7..9ebc146f 100644 --- a/libsrc/udplistener/UDPListener.cpp +++ b/libsrc/udplistener/UDPListener.cpp @@ -109,27 +109,29 @@ void UDPListener::readPendingDatagrams() _server->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort); - processTheDatagram(&datagram); + processTheDatagram(&datagram, &sender); } } -void UDPListener::processTheDatagram(const QByteArray * datagram) +void UDPListener::processTheDatagram(const QByteArray * datagram, const QHostAddress * sender) { int packetLedCount = datagram->size()/3; int hyperionLedCount = Hyperion::getInstance()->getLedCount(); DebugIf( (packetLedCount != hyperionLedCount), _log, "packetLedCount (%d) != hyperionLedCount (%d)", packetLedCount, hyperionLedCount); - std::vector _ledColors(Hyperion::getInstance()->getLedCount(), ColorRgb::BLACK); + std::vector _ledColors(Hyperion::getInstance()->getLedCount(), ColorRgb::BLACK); - for (int ledIndex=0; ledIndex < std::min(packetLedCount, hyperionLedCount); ledIndex++) { + for (int ledIndex=0; ledIndex < std::min(packetLedCount, hyperionLedCount); ledIndex++) { ColorRgb & rgb = _ledColors[ledIndex]; - rgb.red = datagram->at(ledIndex*3+0); + rgb.red = datagram->at(ledIndex*3+0); rgb.green = datagram->at(ledIndex*3+1); - rgb.blue = datagram->at(ledIndex*3+2); + rgb.blue = datagram->at(ledIndex*3+2); } - _hyperion->setColors(_priority, _ledColors, _timeout, -1, hyperion::COMP_UDPLISTENER); - + _hyperion->setColors(_priority, _ledColors, _timeout, -1, hyperion::COMP_UDPLISTENER, sender->toString()); } + + + diff --git a/libsrc/utils/CMakeLists.txt b/libsrc/utils/CMakeLists.txt index 9b31f2c1..9aef0dee 100644 --- a/libsrc/utils/CMakeLists.txt +++ b/libsrc/utils/CMakeLists.txt @@ -25,6 +25,7 @@ SET(Utils_HEADERS ${CURRENT_HEADER_DIR}/RgbToRgbw.h ${CURRENT_HEADER_DIR}/jsonschema/QJsonFactory.h ${CURRENT_HEADER_DIR}/jsonschema/QJsonSchemaChecker.h + ${CURRENT_HEADER_DIR}/global_defines.h ) SET(Utils_SOURCES diff --git a/libsrc/utils/Logger.cpp b/libsrc/utils/Logger.cpp index 76e8e74e..3c134538 100644 --- a/libsrc/utils/Logger.cpp +++ b/libsrc/utils/Logger.cpp @@ -18,6 +18,7 @@ LoggerManager* LoggerManager::_instance = nullptr; Logger* Logger::getInstance(QString name, Logger::LogLevel minLevel) { + qRegisterMetaType(); std::string loggerName = name.toStdString(); Logger* log = nullptr; if (LoggerMap == nullptr) diff --git a/src/hyperion-remote/JsonConnection.cpp b/src/hyperion-remote/JsonConnection.cpp index 9f93a539..25b0738e 100644 --- a/src/hyperion-remote/JsonConnection.cpp +++ b/src/hyperion-remote/JsonConnection.cpp @@ -9,6 +9,7 @@ #include #include #include +#include // hyperion-remote includes #include "JsonConnection.h" @@ -51,6 +52,7 @@ void JsonConnection::setColor(std::vector colors, int priority, int dura // create command QJsonObject command; command["command"] = QString("color"); + command["origin"] = QString("hyperion-remote"); command["priority"] = priority; QJsonArray rgbValue; for (const QColor & color : colors) @@ -97,6 +99,7 @@ void JsonConnection::setImage(QImage &image, int priority, int duration) QJsonObject command; command["command"] = QString("image"); command["priority"] = priority; + command["origin"] = QString("hyperion-remote"); command["imagewidth"] = image.width(); command["imageheight"] = image.height(); command["imagedata"] = QString(base64Image.data()); @@ -119,6 +122,7 @@ void JsonConnection::setEffect(const QString &effectName, const QString & effect // create command QJsonObject command, effect; command["command"] = QString("effect"); + command["origin"] = QString("hyperion-remote"); command["priority"] = priority; effect["name"] = effectName; From 7207756978dcd479879b7a7f89fa34d906058621 Mon Sep 17 00:00:00 2001 From: redPanther Date: Thu, 2 Mar 2017 10:50:31 +0100 Subject: [PATCH 05/29] Sysinfo (#409) * new sysinfo * finish sysinfo --- include/utils/SysInfo.h | 55 +++++++ libsrc/utils/CMakeLists.txt | 2 + libsrc/utils/SysInfo.cpp | 305 ++++++++++++++++++++++++++++++++++++ 3 files changed, 362 insertions(+) create mode 100644 include/utils/SysInfo.h create mode 100644 libsrc/utils/SysInfo.cpp diff --git a/include/utils/SysInfo.h b/include/utils/SysInfo.h new file mode 100644 index 00000000..1e47a796 --- /dev/null +++ b/include/utils/SysInfo.h @@ -0,0 +1,55 @@ +#pragma once + +#include +#include +#include + +class SysInfo : public QObject +{ +// Q_OBJECT + +public: + struct HyperionSysInfo + { + QString kernelType; + QString kernelVersion; + QString architecture; + QString wordSize; + QString productType; // $ID $DISTRIB_ID // single line file containing: // Debian + QString productVersion; // $VERSION_ID $DISTRIB_RELEASE // // single line file + QString prettyName; // $PRETTY_NAME $DISTRIB_DESCRIPTION + }; + + static HyperionSysInfo get(); + +private: + SysInfo(); + ~SysInfo(); + static SysInfo* _instance; + + HyperionSysInfo _sysinfo; + + struct QUnixOSVersion + { + // from /etc/os-release older /etc/lsb-release // redhat /etc/redhat-release // debian /etc/debian_version + QString productType; // $ID $DISTRIB_ID // single line file containing: // Debian + QString productVersion; // $VERSION_ID $DISTRIB_RELEASE // // single line file + QString prettyName; // $PRETTY_NAME $DISTRIB_DESCRIPTION + }; + + QString machineHostName(); + QString currentCpuArchitecture(); + QString kernelType(); + QString kernelVersion(); + bool findUnixOsVersion(QUnixOSVersion &v); + + QByteArray getEtcFileFirstLine(const char *fileName); + bool readEtcRedHatRelease(QUnixOSVersion &v); + bool readEtcDebianVersion(QUnixOSVersion &v); + + bool readEtcOsRelease(SysInfo::QUnixOSVersion &v); + bool readEtcFile(SysInfo::QUnixOSVersion &v, const char *filename, const QByteArray &idKey, const QByteArray &versionKey, const QByteArray &prettyNameKey); + QByteArray getEtcFileContent(const char *filename); + QString unquote(const char *begin, const char *end); + bool readEtcLsbRelease(SysInfo::QUnixOSVersion &v); +}; diff --git a/libsrc/utils/CMakeLists.txt b/libsrc/utils/CMakeLists.txt index 9aef0dee..2ee4c261 100644 --- a/libsrc/utils/CMakeLists.txt +++ b/libsrc/utils/CMakeLists.txt @@ -26,6 +26,7 @@ SET(Utils_HEADERS ${CURRENT_HEADER_DIR}/jsonschema/QJsonFactory.h ${CURRENT_HEADER_DIR}/jsonschema/QJsonSchemaChecker.h ${CURRENT_HEADER_DIR}/global_defines.h + ${CURRENT_HEADER_DIR}/SysInfo.h ) SET(Utils_SOURCES @@ -42,6 +43,7 @@ SET(Utils_SOURCES ${CURRENT_SOURCE_DIR}/RgbChannelAdjustment.cpp ${CURRENT_SOURCE_DIR}/RgbTransform.cpp ${CURRENT_SOURCE_DIR}/RgbToRgbw.cpp + ${CURRENT_SOURCE_DIR}/SysInfo.cpp ${CURRENT_SOURCE_DIR}/jsonschema/QJsonSchemaChecker.cpp ) diff --git a/libsrc/utils/SysInfo.cpp b/libsrc/utils/SysInfo.cpp new file mode 100644 index 00000000..b098f389 --- /dev/null +++ b/libsrc/utils/SysInfo.cpp @@ -0,0 +1,305 @@ +#include "utils/SysInfo.h" + +#include +#include +#include +#include "HyperionConfig.h" + +#include +#include +#include +#include +#include +#include +#include + +SysInfo* SysInfo::_instance = nullptr; + +SysInfo::SysInfo() + : QObject() +{ + SysInfo::QUnixOSVersion v; + findUnixOsVersion(v); + + std::cout + << currentCpuArchitecture().toStdString() << " " + << kernelType().toStdString() << " " + << kernelVersion().toStdString() << " " + << v.productType.toStdString() << " " + << v.productVersion.toStdString() << " " + << v.prettyName.toStdString() << " " + << std::endl; + + _sysinfo.kernelType = kernelType(); + _sysinfo.kernelVersion = kernelVersion(); + _sysinfo.architecture = currentCpuArchitecture(); + _sysinfo.wordSize = QSysInfo::WordSize; + _sysinfo.productType = v.productType; + _sysinfo.productVersion = v.productVersion; + _sysinfo.prettyName = v.prettyName; +} + +SysInfo::~SysInfo() +{ +} + +SysInfo::HyperionSysInfo SysInfo::get() +{ + if ( SysInfo::_instance == nullptr ) + SysInfo::_instance = new SysInfo(); + + return SysInfo::_instance->_sysinfo; +} + + + +QString SysInfo::kernelType() +{ +#if defined(Q_OS_WIN) + return QStringLiteral("winnt"); +#elif defined(Q_OS_UNIX) + struct utsname u; + if (uname(&u) == 0) + return QString::fromLatin1(u.sysname).toLower(); +#endif + return QString(); +} + +QString SysInfo::kernelVersion() +{ + struct utsname u; + if (uname(&u) == 0) + return QString::fromLocal8Bit(u.release).toLower(); + + return QString(); +} + +QString SysInfo::machineHostName() +{ +#if defined(Q_OS_LINUX) + // gethostname(3) on Linux just calls uname(2), so do it ourselves and avoid a memcpy + struct utsname u; + if (uname(&u) == 0) + return QString::fromLocal8Bit(u.nodename); +#else + char hostName[512]; + if (gethostname(hostName, sizeof(hostName)) == -1) + return QString(); + hostName[sizeof(hostName) - 1] = '\0'; + return QString::fromLocal8Bit(hostName); +#endif + return QString(); +} + + +QString SysInfo::currentCpuArchitecture() +{ +#if defined(Q_OS_UNIX) + long ret = -1; + struct utsname u; + + if (ret == -1) + ret = uname(&u); + + // we could use detectUnixVersion() above, but we only need a field no other function does + if (ret != -1) + { + // the use of QT_BUILD_INTERNAL here is simply to ensure all branches build + // as we don't often build on some of the less common platforms +# if defined(Q_PROCESSOR_ARM) + if (strcmp(u.machine, "aarch64") == 0) + return QStringLiteral("arm64"); + if (strncmp(u.machine, "armv", 4) == 0) + return QStringLiteral("arm"); +# endif +# if defined(Q_PROCESSOR_POWER) + // harmonize "powerpc" and "ppc" to "power" + if (strncmp(u.machine, "ppc", 3) == 0) + return QLatin1String("power") + QLatin1String(u.machine + 3); + if (strncmp(u.machine, "powerpc", 7) == 0) + return QLatin1String("power") + QLatin1String(u.machine + 7); + if (strcmp(u.machine, "Power Macintosh") == 0) + return QLatin1String("power"); +# endif +# if defined(Q_PROCESSOR_X86) + // harmonize all "i?86" to "i386" + if (strlen(u.machine) == 4 && u.machine[0] == 'i' && u.machine[2] == '8' && u.machine[3] == '6') + return QStringLiteral("i386"); + if (strcmp(u.machine, "amd64") == 0) // Solaris + return QStringLiteral("x86_64"); +# endif + return QString::fromLatin1(u.machine); + } +#endif + return QString(); +} + +bool SysInfo::findUnixOsVersion(SysInfo::QUnixOSVersion &v) +{ + if (readEtcOsRelease(v)) + return true; + if (readEtcLsbRelease(v)) + return true; +#if defined(Q_OS_LINUX) + if (readEtcRedHatRelease(v)) + return true; + if (readEtcDebianVersion(v)) + return true; +#endif + return false; +} + + +QByteArray SysInfo::getEtcFileFirstLine(const char *fileName) +{ + QByteArray buffer = getEtcFileContent(fileName); + if (buffer.isEmpty()) + return QByteArray(); + + const char *ptr = buffer.constData(); + int eol = buffer.indexOf("\n"); + return QByteArray(ptr, eol).trimmed(); +} + +bool SysInfo::readEtcRedHatRelease(SysInfo::QUnixOSVersion &v) +{ + // /etc/redhat-release analysed should be a one line file + // the format of its content is + // i.e. "Red Hat Enterprise Linux Workstation release 6.5 (Santiago)" + QByteArray line = getEtcFileFirstLine("/etc/redhat-release"); + if (line.isEmpty()) + return false; + + v.prettyName = QString::fromLatin1(line); + + const char keyword[] = "release "; + int releaseIndex = line.indexOf(keyword); + v.productType = QString::fromLatin1(line.mid(0, releaseIndex)).remove(QLatin1Char(' ')); + int spaceIndex = line.indexOf(' ', releaseIndex + strlen(keyword)); + v.productVersion = QString::fromLatin1(line.mid(releaseIndex + strlen(keyword), + spaceIndex > -1 ? spaceIndex - releaseIndex - int(strlen(keyword)) : -1)); + return true; +} + +bool SysInfo::readEtcDebianVersion(SysInfo::QUnixOSVersion &v) +{ + // /etc/debian_version analysed should be a one line file + // the format of its content is + // i.e. "jessie/sid" + QByteArray line = getEtcFileFirstLine("/etc/debian_version"); + if (line.isEmpty()) + return false; + + v.productType = QStringLiteral("Debian"); + v.productVersion = QString::fromLatin1(line); + return true; +} + +QString SysInfo::unquote(const char *begin, const char *end) +{ + if (*begin == '"') { + Q_ASSERT(end[-1] == '"'); + return QString::fromLatin1(begin + 1, end - begin - 2); + } + return QString::fromLatin1(begin, end - begin); +} + +QByteArray SysInfo::getEtcFileContent(const char *filename) +{ + // we're avoiding QFile here + int fd = open(filename, O_RDONLY); + if (fd == -1) + return QByteArray(); + + struct stat sbuf; + if (::fstat(fd, &sbuf) == -1) { + close(fd); + return QByteArray(); + } + + QByteArray buffer(sbuf.st_size, Qt::Uninitialized); + buffer.resize(read(fd, buffer.data(), sbuf.st_size)); + close(fd); + return buffer; +} + +bool SysInfo::readEtcFile(SysInfo::QUnixOSVersion &v, const char *filename, + const QByteArray &idKey, const QByteArray &versionKey, const QByteArray &prettyNameKey) +{ + + QByteArray buffer = getEtcFileContent(filename); + if (buffer.isEmpty()) + return false; + + const char *ptr = buffer.constData(); + const char *end = buffer.constEnd(); + const char *eol; + QByteArray line; + for ( ; ptr != end; ptr = eol + 1) { + // find the end of the line after ptr + eol = static_cast(memchr(ptr, '\n', end - ptr)); + if (!eol) + eol = end - 1; + line.setRawData(ptr, eol - ptr); + + if (line.startsWith(idKey)) { + ptr += idKey.length(); + v.productType = unquote(ptr, eol); + continue; + } + + if (line.startsWith(prettyNameKey)) { + ptr += prettyNameKey.length(); + v.prettyName = unquote(ptr, eol); + continue; + } + + if (line.startsWith(versionKey)) { + ptr += versionKey.length(); + v.productVersion = unquote(ptr, eol); + continue; + } + } + + return true; +} + +bool SysInfo::readEtcOsRelease(SysInfo::QUnixOSVersion &v) +{ + return readEtcFile(v, "/etc/os-release", QByteArrayLiteral("ID="), + QByteArrayLiteral("VERSION_ID="), QByteArrayLiteral("PRETTY_NAME=")); +} + +bool SysInfo::readEtcLsbRelease(SysInfo::QUnixOSVersion &v) +{ + bool ok = readEtcFile(v, "/etc/lsb-release", QByteArrayLiteral("DISTRIB_ID="), + QByteArrayLiteral("DISTRIB_RELEASE="), QByteArrayLiteral("DISTRIB_DESCRIPTION=")); + if (ok && (v.prettyName.isEmpty() || v.prettyName == v.productType)) { + // some distributions have redundant information for the pretty name, + // so try /etc/-release + + // we're still avoiding QFile here + QByteArray distrorelease = "/etc/" + v.productType.toLatin1().toLower() + "-release"; + int fd = open(distrorelease, O_RDONLY); + if (fd != -1) { + struct stat sbuf; + if (::fstat(fd, &sbuf) != -1 && sbuf.st_size > v.prettyName.length()) { + // file apparently contains interesting information + QByteArray buffer(sbuf.st_size, Qt::Uninitialized); + buffer.resize(read(fd, buffer.data(), sbuf.st_size)); + v.prettyName = QString::fromLatin1(buffer.trimmed()); + } + close(fd); + } + } + + // some distributions have a /etc/lsb-release file that does not provide the values + // we are looking for, i.e. DISTRIB_ID, DISTRIB_RELEASE and DISTRIB_DESCRIPTION. + // Assuming that neither DISTRIB_ID nor DISTRIB_RELEASE were found, or contained valid values, + // returning false for readEtcLsbRelease will allow further /etc/-release parsing. + return ok && !(v.productType.isEmpty() && v.productVersion.isEmpty()); +} + + + + From 976dd7873ffec30c451c9fea53c5467752d7134b Mon Sep 17 00:00:00 2001 From: redPanther Date: Thu, 2 Mar 2017 10:50:47 +0100 Subject: [PATCH 06/29] lock out IE ... (#410) * lock out IE * add new line * add styling --- assets/webconfig/content/ie_not_supported.html | 11 +++++++++++ assets/webconfig/index.html | 7 +++++++ 2 files changed, 18 insertions(+) create mode 100644 assets/webconfig/content/ie_not_supported.html diff --git a/assets/webconfig/content/ie_not_supported.html b/assets/webconfig/content/ie_not_supported.html new file mode 100644 index 00000000..0bb150cc --- /dev/null +++ b/assets/webconfig/content/ie_not_supported.html @@ -0,0 +1,11 @@ + + + Hyperion WebUI - IE not supported + + + + + Redefine ambient light! +

We are sorry, Internet Explorer is not supported!

Please use recent versions of Firefox, Chrome, Safari or MS Edge.

+ + diff --git a/assets/webconfig/index.html b/assets/webconfig/index.html index d0490abc..0fc9bc27 100644 --- a/assets/webconfig/index.html +++ b/assets/webconfig/index.html @@ -2,6 +2,13 @@ + + From 19f8928869a265091ea38c452e1f2d8cbcdcf3d3 Mon Sep 17 00:00:00 2001 From: brindosch Date: Thu, 2 Mar 2017 11:52:27 +0100 Subject: [PATCH 07/29] update/fix remote --- assets/webconfig/content/remote.html | 2 +- assets/webconfig/i18n/de.json | 1 - assets/webconfig/i18n/en.json | 1 - assets/webconfig/js/content_remote.js | 30 +++++++++++++++++---------- assets/webconfig/js/hyperion.js | 29 +++++++------------------- assets/webconfig/js/ui_utils.js | 8 +++++++ 6 files changed, 35 insertions(+), 36 deletions(-) diff --git a/assets/webconfig/content/remote.html b/assets/webconfig/content/remote.html index 399e0fe9..1b0182d5 100644 --- a/assets/webconfig/content/remote.html +++ b/assets/webconfig/content/remote.html @@ -63,7 +63,7 @@ - +
diff --git a/assets/webconfig/i18n/de.json b/assets/webconfig/i18n/de.json index 092c2713..533d080f 100644 --- a/assets/webconfig/i18n/de.json +++ b/assets/webconfig/i18n/de.json @@ -253,7 +253,6 @@ "infoDialog_general_error_title" : "Fehler", "infoDialog_general_warning_title" : "Warnung", "infoDialog_checklist_title" : "Checkliste!", - "InfoDialog_leds_validfail_title" : "JSON Überprüfung fehlgeschlagen!", "infoDialog_effconf_deleted_text" : "Der Effekt \"$1\" wurde erfolgreich entfernt!", "infoDialog_effconf_created_text" : "Der Effekt \"$1\" wurde erfolgreich erstellt!", "InfoDialog_lang_title" : "Spracheinstellung", diff --git a/assets/webconfig/i18n/en.json b/assets/webconfig/i18n/en.json index e3bad5fd..d1062bc4 100644 --- a/assets/webconfig/i18n/en.json +++ b/assets/webconfig/i18n/en.json @@ -253,7 +253,6 @@ "infoDialog_general_error_title" : "Error", "infoDialog_general_warning_title" : "Warning", "infoDialog_checklist_title" : "Checklist!", - "InfoDialog_leds_validfail_title" : "JSON Validation failed!", "infoDialog_effconf_deleted_text" : "The effect \"$1\" has been deleted successfully!", "infoDialog_effconf_created_text" : "The effect \"$1\" has been created successfully!", "InfoDialog_lang_title" : "Language setting", diff --git a/assets/webconfig/js/content_remote.js b/assets/webconfig/js/content_remote.js index c4c6c3cd..40b70f1a 100644 --- a/assets/webconfig/js/content_remote.js +++ b/assets/webconfig/js/content_remote.js @@ -92,7 +92,15 @@ $(document).ready(function() { for(i = 0; i < prios.length; i++) { var origin = prios[i].origin; - var ip = "xxx.xxx.xxx.xxx"; + if(typeof origin !== "undefined" && origin != "") + { + origin = origin.split("@"); + var ip = origin[1]; + origin = origin[0]; + } + else + origin = "System"; + var owner = prios[i].owner; var active = prios[i].active; var visible = prios[i].visible; @@ -102,7 +110,7 @@ $(document).ready(function() { var btn_type = "default"; var btn_text = $.i18n('remote_input_setsource_btn'); var btn_state = "enabled"; - if (active) btn_type = "warning"; + if (active) btn_type = "primary"; if (visible) { btn_state = "disabled"; @@ -111,26 +119,26 @@ $(document).ready(function() { } if(ip) origin += '
'+$.i18n('remote_input_ip')+' '+ip+''; - if(compId == "10") + if(compId == 10) owner = $.i18n('remote_effects_label_effects')+' '+owner; - if(compId == "9") + if(compId == 9) owner = $.i18n('remote_color_label_color')+' '+'
'; - if(compId == "7") + if(compId == 7) owner = $.i18n('general_comp_GRABBER')+': ('+owner+')'; - if(compId == "8") + if(compId == 8) owner = $.i18n('general_comp_V4L')+': ('+owner+')'; - if(compId == "6") + if(compId == 6) owner = $.i18n('general_comp_BOBLIGHTSERVER'); - if(compId == "5") + if(compId == 5) owner = $.i18n('general_comp_UDPLISTENER'); if(owner == "Off") owner = $.i18n('general_btn_off'); - if(duration) + if(duration && compId != 7 && compId != 11) owner += '
'+$.i18n('remote_input_duration')+' '+duration.toFixed(0)+$.i18n('edt_append_s')+''; var btn = ''; - if((compId == "10" || compId == "9") && priority != 254) + if((compId == 10 || compId == 9) && priority != 254) btn += ''; if(btn_type != 'default') @@ -159,7 +167,7 @@ $(document).ready(function() { if(mapping == mappingList[ix]) btn_style = 'btn-success'; else - btn_style = 'btn-warning'; + btn_style = 'btn-primary'; $('#mappingsbutton').append('
'); } diff --git a/assets/webconfig/js/hyperion.js b/assets/webconfig/js/hyperion.js index 8b4e0d44..b08b00ff 100644 --- a/assets/webconfig/js/hyperion.js +++ b/assets/webconfig/js/hyperion.js @@ -219,33 +219,18 @@ function requestPriorityClear(prio) } function requestPlayEffect(effectName, duration) -{ - if(typeof duration === "undefined" || duration < 0) - duration = 0; - else - duration *= 1000; - - sendToHyperion("effect", "", '"effect":{"name":"'+effectName+'"},"priority":'+webPrio+',"duration":'+duration+',"origin":"'+webOrigin+'"'); +{ + sendToHyperion("effect", "", '"effect":{"name":"'+effectName+'"},"priority":'+webPrio+',"duration":'+validateDuration(duration)+',"origin":"'+webOrigin+'"'); } function requestSetColor(r,g,b,duration) -{ - if(typeof duration === "undefined" || duration < 0) - duration = 0; - else - duration *= 1000; - - sendToHyperion("color", "", '"color":['+r+','+g+','+b+'], "priority":'+webPrio+',"duration":'+duration+',"origin":"'+webOrigin+'"'); +{ + sendToHyperion("color", "", '"color":['+r+','+g+','+b+'], "priority":'+webPrio+',"duration":'+validateDuration(duration)+',"origin":"'+webOrigin+'"'); } function requestSetImage(data,width,height,duration) -{ - if(typeof duration === "undefined" || duration < 0) - duration = 0; - else - duration *= 1000; - - sendToHyperion("image", "", '"imagedata":"'+data+'", "imagewidth":'+width+',"imageheight":'+height+', "priority":'+webPrio+',"duration":'+duration+''); +{ + sendToHyperion("image", "", '"imagedata":"'+data+'", "imagewidth":'+width+',"imageheight":'+height+', "priority":'+webPrio+',"duration":'+validateDuration(duration)+''); } function requestSetComponentState(comp, state) @@ -292,7 +277,7 @@ function requestWriteEffect(effectName,effectPy,effectArgs) function requestTestEffect(effectName,effectPy,effectArgs) { - sendToHyperion("effect", "", '"effect":{"name":"'+effectName+'", "args":'+effectArgs+'},"priority":'+webPrio+', "pythonScript":"'+effectPy+'"}'); + sendToHyperion("effect", "", '"effect":{"name":"'+effectName+'", "args":'+effectArgs+'}, "priority":'+webPrio+', "origin":"'+webOrigin+'", "pythonScript":"'+effectPy+'"}'); } function requestDeleteEffect(effectName) diff --git a/assets/webconfig/js/ui_utils.js b/assets/webconfig/js/ui_utils.js index f7a6c529..4e698a23 100644 --- a/assets/webconfig/js/ui_utils.js +++ b/assets/webconfig/js/ui_utils.js @@ -48,6 +48,14 @@ function debugMessage(msg) } } +function validateDuration(d) +{ + if(typeof d === "undefined" || d < 0) + return d = 0; + else + return d *= 1000; +} + function getHashtag() { if(getStorage('lasthashtag', true) != null) From bfb9a08c80c08fdaba33a3f097e84df440fe6529 Mon Sep 17 00:00:00 2001 From: redPanther Date: Sat, 4 Mar 2017 22:17:42 +0100 Subject: [PATCH 08/29] migrate std::string to qstring + add sysinfo via json (#412) * std::string -> qstring part 1 * more string migration * more string migration ... * ... * more qstring mogrations add sysinfo via json * remove unneccessary includes * integrate sysinfo into webui --- assets/webconfig/js/content_dashboard.js | 2 +- assets/webconfig/js/content_index.js | 14 +- assets/webconfig/js/hyperion.js | 9 +- include/blackborder/BlackBorderProcessor.h | 2 +- include/commandline/Option.h | 51 +++---- include/grabber/FramebufferFrameGrabber.h | 4 +- include/grabber/FramebufferWrapper.h | 2 +- include/grabber/V4L2Grabber.h | 11 +- include/grabber/V4L2Wrapper.h | 2 +- include/grabber/VideoStandard.h | 7 +- include/hyperion/ColorAdjustment.h | 4 +- include/hyperion/GrabberWrapper.h | 1 - include/hyperion/Hyperion.h | 6 +- include/hyperion/LedString.h | 1 - include/hyperion/MessageForwarder.h | 4 +- include/kodivideochecker/KODIVideoChecker.h | 1 - include/leddevice/LedDevice.h | 11 +- include/protoserver/ProtoConnection.h | 6 +- include/utils/ColorRgb.h | 1 - include/utils/Logger.h | 21 ++- include/utils/PixelFormat.h | 7 +- include/utils/Profiler.h | 15 +- include/utils/RgbToRgbw.h | 3 +- include/utils/SysInfo.h | 20 +-- include/utils/VideoMode.h | 7 +- include/utils/jsonschema/QJsonFactory.h | 27 ++-- include/utils/jsonschema/QJsonSchemaChecker.h | 12 +- include/webconfig/WebConfig.h | 1 - libsrc/blackborder/BlackBorderProcessor.cpp | 4 +- libsrc/commandline/Option.cpp | 22 ++- libsrc/effectengine/EffectEngine.cpp | 6 +- libsrc/grabber/amlogic/AmlogicGrabber.cpp | 6 +- .../framebuffer/FramebufferFrameGrabber.cpp | 8 +- .../framebuffer/FramebufferWrapper.cpp | 2 +- libsrc/grabber/v4l2/V4L2Grabber.cpp | 48 +++--- libsrc/grabber/v4l2/V4L2Wrapper.cpp | 4 +- libsrc/hyperion/Hyperion.cpp | 21 ++- libsrc/hyperion/LinearColorSmoothing.h | 1 - libsrc/hyperion/MessageForwarder.cpp | 10 +- libsrc/hyperion/MultiColorAdjustment.cpp | 6 +- libsrc/hyperion/MultiColorAdjustment.h | 14 +- libsrc/jsonserver/JsonClientConnection.cpp | 143 +++++++++--------- libsrc/jsonserver/JsonClientConnection.h | 11 +- libsrc/jsonserver/JsonSchemas.qrc | 1 + libsrc/jsonserver/schema/schema-sysinfo.json | 15 ++ libsrc/jsonserver/schema/schema.json | 2 +- libsrc/leddevice/LedDevice.cpp | 15 +- libsrc/leddevice/LedDeviceAtmoOrb.cpp | 39 ++--- libsrc/leddevice/LedDeviceAtmoOrb.h | 4 +- libsrc/leddevice/LedDeviceDMX.cpp | 10 +- libsrc/leddevice/LedDeviceFactory.cpp | 14 +- libsrc/leddevice/LedDeviceFadeCandy.cpp | 6 +- libsrc/leddevice/LedDeviceFadeCandy.h | 3 +- libsrc/leddevice/LedDeviceFile.cpp | 4 +- libsrc/leddevice/LedDeviceHyperionUsbasp.cpp | 18 +-- libsrc/leddevice/LedDeviceHyperionUsbasp.h | 5 +- libsrc/leddevice/LedDeviceLightpack.cpp | 24 +-- libsrc/leddevice/LedDeviceLightpack.h | 10 +- libsrc/leddevice/LedDeviceMultiLightpack.cpp | 20 +-- libsrc/leddevice/LedDeviceMultiLightpack.h | 8 +- libsrc/leddevice/LedDevicePiBlaster.cpp | 14 +- libsrc/leddevice/LedDevicePiBlaster.h | 2 +- libsrc/leddevice/LedDeviceSk6812SPI.cpp | 6 +- libsrc/leddevice/LedDeviceTinkerforge.cpp | 10 +- libsrc/leddevice/LedDeviceTinkerforge.h | 6 +- libsrc/leddevice/LedDeviceUdpE131.cpp | 8 +- libsrc/leddevice/LedDeviceUdpE131.h | 2 +- libsrc/leddevice/LedDeviceWS281x.cpp | 6 +- libsrc/leddevice/ProviderSpi.cpp | 6 +- libsrc/leddevice/ProviderSpi.h | 2 +- libsrc/protoserver/ProtoConnection.cpp | 3 +- libsrc/protoserver/ProtoConnectionWrapper.cpp | 2 +- libsrc/utils/CMakeLists.txt | 2 +- libsrc/utils/Logger.cpp | 52 +++---- libsrc/utils/Process.cpp | 5 +- libsrc/utils/Profiler.cpp | 20 +-- libsrc/utils/RgbToRgbw.cpp | 4 +- libsrc/utils/SysInfo.cpp | 16 +- .../utils/jsonschema/QJsonSchemaChecker.cpp | 51 +++---- libsrc/webconfig/CgiHandler.cpp | 15 +- libsrc/webconfig/StaticFileServing.cpp | 4 +- .../FramebufferWrapper.cpp | 2 +- src/hyperion-framebuffer/FramebufferWrapper.h | 2 +- .../hyperion-framebuffer.cpp | 2 +- src/hyperion-remote/JsonConnection.cpp | 27 ++++ src/hyperion-remote/JsonConnection.h | 10 +- src/hyperion-remote/hyperion-remote.cpp | 11 +- src/hyperion-v4l2/hyperion-v4l2.cpp | 2 +- src/hyperiond/hyperiond.cpp | 15 +- test/TestConfigFile.cpp | 5 +- 90 files changed, 539 insertions(+), 529 deletions(-) create mode 100644 libsrc/jsonserver/schema/schema-sysinfo.json diff --git a/assets/webconfig/js/content_dashboard.js b/assets/webconfig/js/content_dashboard.js index 47159064..d2b13392 100644 --- a/assets/webconfig/js/content_dashboard.js +++ b/assets/webconfig/js/content_dashboard.js @@ -105,4 +105,4 @@ $(document).ready( function() { createHintH("intro", $.i18n('dashboard_label_intro'), "dash_intro"); removeOverlay(); -}); \ No newline at end of file +}); diff --git a/assets/webconfig/js/content_index.js b/assets/webconfig/js/content_index.js index dcd0cf93..e476df31 100644 --- a/assets/webconfig/js/content_index.js +++ b/assets/webconfig/js/content_index.js @@ -6,11 +6,14 @@ $(document).ready( function() { initWebSocket(); $(hyperion).on("cmd-serverinfo",function(event){ + // get sysinfo only once + if ( typeof(sysInfo.info) == "undefined" ) + requestSysInfo(); + serverInfo = event.response; - currentVersion = serverInfo.info.hyperion[0].version; $(hyperion).trigger("ready"); - if (serverInfo.info.hyperion[0].config_modified) + if (serverInfo.info.hyperion.config_modified) $("#hyperion_reload_notify").fadeIn("fast"); else $("#hyperion_reload_notify").fadeOut("fast"); @@ -22,7 +25,7 @@ $(document).ready( function() { loggingStreamActive = false; } - if (!serverInfo.info.hyperion[0].config_writeable) + if (!serverInfo.info.hyperion.config_writeable) { showInfoDialog('uilock',$.i18n('InfoDialog_nowrite_title'),$.i18n('InfoDialog_nowrite_text')); $('#wrapper').toggle(false); @@ -37,6 +40,11 @@ $(document).ready( function() { }); // end cmd-serverinfo + $(hyperion).one("cmd-sysinfo", function(event) { + sysInfo = event.response; + currentVersion = sysInfo.info.hyperion.version; + }); + $(hyperion).one("cmd-config-getschema", function(event) { serverSchema = event.response.result; requestServerConfig(); diff --git a/assets/webconfig/js/hyperion.js b/assets/webconfig/js/hyperion.js index b08b00ff..316638f2 100644 --- a/assets/webconfig/js/hyperion.js +++ b/assets/webconfig/js/hyperion.js @@ -3,12 +3,13 @@ var webPrio = 1; var webOrigin = "Web Configuration"; var showOptHelp; -var currentVersion; +var currentVersion = ""; var latestVersion; var serverInfo = {}; var parsedUpdateJSON = {}; var serverSchema = {}; var serverConfig = {}; +var sysInfo = {}; var schema; var jsonPort = 19444; var websocket = null; @@ -76,7 +77,6 @@ function initWebSocket() websocket.onopen = function (event) { $(hyperion).trigger({type:"open"}); - $(hyperion).on("cmd-serverinfo", function(event) { watchdog = 0; }); @@ -171,6 +171,11 @@ function requestServerInfo() sendToHyperion("serverinfo"); } +function requestSysInfo() +{ + sendToHyperion("sysinfo"); +} + function requestServerConfigSchema() { sendToHyperion("config","getschema"); diff --git a/include/blackborder/BlackBorderProcessor.h b/include/blackborder/BlackBorderProcessor.h index 03fef409..d5f1b9de 100644 --- a/include/blackborder/BlackBorderProcessor.h +++ b/include/blackborder/BlackBorderProcessor.h @@ -116,7 +116,7 @@ namespace hyperion unsigned _blurRemoveCnt; /// The border detection mode - const std::string _detectionMode; + const QString _detectionMode; /// The blackborder detector BlackBorderDetector _detector; diff --git a/include/commandline/Option.h b/include/commandline/Option.h index 722a002f..0981bc3d 100644 --- a/include/commandline/Option.h +++ b/include/commandline/Option.h @@ -1,5 +1,4 @@ -#ifndef HYPERION_OPTION_H -#define HYPERION_OPTION_H +#pragma once #include #include @@ -13,38 +12,30 @@ class Parser; * regular QCommandLineOption it is _not_ idempotent! */ class Option: public QCommandLineOption { -protected: - QString _error; public: - Option(const QString &name, - const QString &description = QString(), - const QString &valueName = QString::null, - const QString &defaultValue = QString() - ) - : QCommandLineOption(name, description, valueName, defaultValue) - {} - Option(const QStringList &names, - const QString &description = QString(), - const QString &valueName = QString::null, - const QString &defaultValue = QString() - ) - : QCommandLineOption(names, description, valueName, defaultValue) - {} - Option(const QCommandLineOption &other) - : QCommandLineOption(other) - {} + Option(const QString &name, + const QString &description = QString(), + const QString &valueName = QString::null, + const QString &defaultValue = QString() + ); - virtual bool validate(Parser &parser, QString &value); - QString name() - { return this->names().last();} - QString getError() - { return this->_error; } + Option(const QStringList &names, + const QString &description = QString(), + const QString &valueName = QString::null, + const QString &defaultValue = QString() + ); + + Option(const QCommandLineOption &other); + + virtual bool validate(Parser &parser, QString &value); + QString name(); + QString getError(); QString value(Parser &parser); - std::string getStdString(Parser &parser); - std::wstring getStdWString(Parser &parser); - const char* getCString(Parser &parser); + const char* getCString(Parser &parser); + +protected: + QString _error; }; } -#endif //HYPERION_OPTION_H diff --git a/include/grabber/FramebufferFrameGrabber.h b/include/grabber/FramebufferFrameGrabber.h index ae74a818..fd5add9c 100644 --- a/include/grabber/FramebufferFrameGrabber.h +++ b/include/grabber/FramebufferFrameGrabber.h @@ -20,7 +20,7 @@ public: /// @param[in] width The width of the captured screenshot /// @param[in] height The heigth of the captured screenshot /// - FramebufferFrameGrabber(const std::string & device, const unsigned width, const unsigned height); + FramebufferFrameGrabber(const QString & device, const unsigned width, const unsigned height); ~FramebufferFrameGrabber(); /// @@ -47,7 +47,7 @@ private: unsigned char * _fbp; /// Framebuffer device e.g. /dev/fb0 - const std::string _fbDevice; + const QString _fbDevice; /// With of the captured snapshot [pixels] const unsigned _width; diff --git a/include/grabber/FramebufferWrapper.h b/include/grabber/FramebufferWrapper.h index e0aa9602..4b5a80ef 100644 --- a/include/grabber/FramebufferWrapper.h +++ b/include/grabber/FramebufferWrapper.h @@ -28,7 +28,7 @@ public: /// @param[in] grabHeight The height of the grabbed images [pixels] /// @param[in] updateRate_Hz The image grab rate [Hz] /// - FramebufferWrapper(const std::string & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, const int priority); + FramebufferWrapper(const QString & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, const int priority); /// /// Destructor of this framebuffer frame grabber. Releases any claimed resources. diff --git a/include/grabber/V4L2Grabber.h b/include/grabber/V4L2Grabber.h index 9f3f9a31..4d157af9 100644 --- a/include/grabber/V4L2Grabber.h +++ b/include/grabber/V4L2Grabber.h @@ -1,7 +1,6 @@ #pragma once // stl includes -#include #include #include @@ -29,7 +28,7 @@ class V4L2Grabber : public QObject Q_OBJECT public: - V4L2Grabber(const std::string & device, + V4L2Grabber(const QString & device, int input, VideoStandard videoStandard, PixelFormat pixelFormat, int width, @@ -103,9 +102,9 @@ private: int xioctl(int request, void *arg); - void throw_exception(const std::string &error); + void throw_exception(const QString &error); - void throw_errno_exception(const std::string &error); + void throw_errno_exception(const QString &error); private: enum io_method { @@ -120,8 +119,8 @@ private: }; private: - std::string _deviceName; - std::map _v4lDevices; + QString _deviceName; + std::map _v4lDevices; int _input; VideoStandard _videoStandard; io_method _ioMethod; diff --git a/include/grabber/V4L2Wrapper.h b/include/grabber/V4L2Wrapper.h index 2f6e7915..bf347a12 100644 --- a/include/grabber/V4L2Wrapper.h +++ b/include/grabber/V4L2Wrapper.h @@ -13,7 +13,7 @@ class V4L2Wrapper : public GrabberWrapper Q_OBJECT public: - V4L2Wrapper(const std::string & device, + V4L2Wrapper(const QString & device, int input, VideoStandard videoStandard, PixelFormat pixelFormat, diff --git a/include/grabber/VideoStandard.h b/include/grabber/VideoStandard.h index 56636af8..72e7b58e 100644 --- a/include/grabber/VideoStandard.h +++ b/include/grabber/VideoStandard.h @@ -1,8 +1,5 @@ #pragma once -#include -#include - /** * Enumeration of the possible video standards the grabber can be set to */ @@ -12,10 +9,10 @@ enum VideoStandard { VIDEOSTANDARD_NO_CHANGE }; -inline VideoStandard parseVideoStandard(std::string videoStandard) +inline VideoStandard parseVideoStandard(QString videoStandard) { // convert to lower case - std::transform(videoStandard.begin(), videoStandard.end(), videoStandard.begin(), ::tolower); + videoStandard = videoStandard.toLower(); if (videoStandard == "pal") { diff --git a/include/hyperion/ColorAdjustment.h b/include/hyperion/ColorAdjustment.h index f3bb5228..2e04b07c 100644 --- a/include/hyperion/ColorAdjustment.h +++ b/include/hyperion/ColorAdjustment.h @@ -1,7 +1,7 @@ #pragma once // STL includes -#include +#include // Utils includes #include @@ -12,7 +12,7 @@ class ColorAdjustment public: /// Unique identifier for this color transform - std::string _id; + QString _id; /// The BLACK (RGB-Channel) adjustment RgbChannelAdjustment _rgbBlackAdjustment; diff --git a/include/hyperion/GrabberWrapper.h b/include/hyperion/GrabberWrapper.h index b066d814..d73d4587 100644 --- a/include/hyperion/GrabberWrapper.h +++ b/include/hyperion/GrabberWrapper.h @@ -2,7 +2,6 @@ #include #include -#include #include #include diff --git a/include/hyperion/Hyperion.h b/include/hyperion/Hyperion.h index 6e817284..3202b7af 100644 --- a/include/hyperion/Hyperion.h +++ b/include/hyperion/Hyperion.h @@ -128,7 +128,7 @@ public: /// get filename of configfile /// @return the current config filename - std::string getConfigFileName() { return _configFile.toStdString(); }; + QString getConfigFileName() { return _configFile; }; /// register a input source to a priority channel /// @param name uniq name of input source @@ -210,13 +210,13 @@ public slots: /// Returns the list with unique adjustment identifiers /// @return The list with adjustment identifiers /// - const std::vector & getAdjustmentIds() const; + const QStringList & getAdjustmentIds() const; /// /// Returns the ColorAdjustment with the given identifier /// @return The adjustment with the given identifier (or nullptr if the identifier does not exist) /// - ColorAdjustment * getAdjustment(const std::string& id); + ColorAdjustment * getAdjustment(const QString& id); /// /// Returns MessageForwarder Object diff --git a/include/hyperion/LedString.h b/include/hyperion/LedString.h index 186bf724..18808cc0 100644 --- a/include/hyperion/LedString.h +++ b/include/hyperion/LedString.h @@ -3,7 +3,6 @@ // STL includes #include -#include #include // Local includes diff --git a/include/hyperion/MessageForwarder.h b/include/hyperion/MessageForwarder.h index 48b084bc..d0d5de1a 100644 --- a/include/hyperion/MessageForwarder.h +++ b/include/hyperion/MessageForwarder.h @@ -25,8 +25,8 @@ public: MessageForwarder(); ~MessageForwarder(); - void addJsonSlave(std::string slave); - void addProtoSlave(std::string slave); + void addJsonSlave(QString slave); + void addProtoSlave(QString slave); bool protoForwardingEnabled(); bool jsonForwardingEnabled(); diff --git a/include/kodivideochecker/KODIVideoChecker.h b/include/kodivideochecker/KODIVideoChecker.h index f1731c4a..3c606fe9 100644 --- a/include/kodivideochecker/KODIVideoChecker.h +++ b/include/kodivideochecker/KODIVideoChecker.h @@ -3,7 +3,6 @@ // system includes #include -#include // QT includes #include diff --git a/include/leddevice/LedDevice.h b/include/leddevice/LedDevice.h index 522cd629..aae575eb 100644 --- a/include/leddevice/LedDevice.h +++ b/include/leddevice/LedDevice.h @@ -8,7 +8,6 @@ // STL incldues #include -#include #include #include @@ -24,7 +23,7 @@ class LedDevice; typedef LedDevice* ( *LedDeviceCreateFuncType ) ( const QJsonObject& ); -typedef std::map LedDeviceRegistry; +typedef std::map LedDeviceRegistry; /// /// Interface (pure virtual base class) for LedDevices. @@ -52,10 +51,10 @@ public: /// virtual int open(); - static int addToDeviceMap(std::string name, LedDeviceCreateFuncType funcPtr); + static int addToDeviceMap(QString name, LedDeviceCreateFuncType funcPtr); static const LedDeviceRegistry& getDeviceMap(); - static void setActiveDevice(std::string dev); - static std::string activeDevice() { return _activeDevice; } + static void setActiveDevice(QString dev); + static QString activeDevice() { return _activeDevice; } static QJsonObject getLedDeviceSchemas(); static void setLedCount(int ledCount); static int getLedCount() { return _ledCount; } @@ -78,7 +77,7 @@ protected: bool _deviceReady; - static std::string _activeDevice; + static QString _activeDevice; static LedDeviceRegistry _ledDeviceMap; static int _ledCount; diff --git a/include/protoserver/ProtoConnection.h b/include/protoserver/ProtoConnection.h index 732a4625..ee11bd37 100644 --- a/include/protoserver/ProtoConnection.h +++ b/include/protoserver/ProtoConnection.h @@ -1,9 +1,7 @@ #pragma once -// stl includes -#include - // Qt includes +#include #include #include #include @@ -33,7 +31,7 @@ public: /// /// @param address The address of the Hyperion server (for example "192.168.0.32:19444) /// - ProtoConnection(const std::string & address); + ProtoConnection(const QString & address); /// /// Destructor diff --git a/include/utils/ColorRgb.h b/include/utils/ColorRgb.h index 0bdd850a..3a05075a 100644 --- a/include/utils/ColorRgb.h +++ b/include/utils/ColorRgb.h @@ -49,7 +49,6 @@ inline std::ostream& operator<<(std::ostream& os, const ColorRgb& color) return os; } - /// Compare operator to check if a color is 'smaller' than another color inline bool operator<(const ColorRgb & lhs, const ColorRgb & rhs) { diff --git a/include/utils/Logger.h b/include/utils/Logger.h index 504f6901..2504b48e 100644 --- a/include/utils/Logger.h +++ b/include/utils/Logger.h @@ -5,7 +5,6 @@ #include // stl includes -#include #include #include #include @@ -51,9 +50,9 @@ public: } T_LOG_MESSAGE; static Logger* getInstance(QString name="", LogLevel minLevel=Logger::INFO); - static void deleteInstance(std::string name=""); - static void setLogLevel(LogLevel level,std::string name=""); - static LogLevel getLogLevel(std::string name=""); + static void deleteInstance(QString name=""); + static void setLogLevel(LogLevel level, QString name=""); + static LogLevel getLogLevel(QString name=""); void Message(LogLevel level, const char* sourceFile, const char* func, unsigned int line, const char* fmt, ...); void setMinLevel(LogLevel level) { _minLevel = level; }; @@ -63,18 +62,18 @@ signals: void newLogMessage(Logger::T_LOG_MESSAGE); protected: - Logger( std::string name="", LogLevel minLevel=INFO); + Logger( QString name="", LogLevel minLevel=INFO); ~Logger(); private: - static std::map *LoggerMap; + static std::map *LoggerMap; static LogLevel GLOBAL_MIN_LOG_LEVEL; - std::string _name; - std::string _appname; - LogLevel _minLevel; - bool _syslogEnabled; - unsigned int _loggerId; + QString _name; + QString _appname; + LogLevel _minLevel; + bool _syslogEnabled; + unsigned _loggerId; }; diff --git a/include/utils/PixelFormat.h b/include/utils/PixelFormat.h index 472b18f2..cade1817 100644 --- a/include/utils/PixelFormat.h +++ b/include/utils/PixelFormat.h @@ -1,7 +1,6 @@ #pragma once -#include -#include +#include /** * Enumeration of the possible pixel formats the grabber can be set to @@ -16,10 +15,10 @@ enum PixelFormat { PIXELFORMAT_NO_CHANGE }; -inline PixelFormat parsePixelFormat(std::string pixelFormat) +inline PixelFormat parsePixelFormat(QString pixelFormat) { // convert to lower case - std::transform(pixelFormat.begin(), pixelFormat.end(), pixelFormat.begin(), ::tolower); + pixelFormat = pixelFormat.toLower(); if (pixelFormat == "yuyv") { diff --git a/include/utils/Profiler.h b/include/utils/Profiler.h index 79e3d8b0..ba930e58 100644 --- a/include/utils/Profiler.h +++ b/include/utils/Profiler.h @@ -1,4 +1,3 @@ -#include #include #include #include @@ -23,16 +22,16 @@ public: Profiler(const char* sourceFile, const char* func, unsigned int line); ~Profiler(); - static void TimerStart(const std::string stopWatchName, const char* sourceFile, const char* func, unsigned int line); - static void TimerGetTime(const std::string stopWatchName, const char* sourceFile, const char* func, unsigned int line); + static void TimerStart(const QString stopWatchName, const char* sourceFile, const char* func, unsigned int line); + static void TimerGetTime(const QString stopWatchName, const char* sourceFile, const char* func, unsigned int line); private: static void initLogger(); static Logger* _logger; - const char* _file; - const char* _func; - unsigned int _line; - unsigned int _blockId; - clock_t _startTime; + const char* _file; + const char* _func; + unsigned int _line; + unsigned int _blockId; + clock_t _startTime; }; diff --git a/include/utils/RgbToRgbw.h b/include/utils/RgbToRgbw.h index 290e215b..f1450427 100644 --- a/include/utils/RgbToRgbw.h +++ b/include/utils/RgbToRgbw.h @@ -1,4 +1,5 @@ #pragma once +#include #include #include @@ -7,7 +8,7 @@ namespace RGBW { enum WhiteAlgorithm { INVALID, SUBTRACT_MINIMUM, SUB_MIN_WARM_ADJUST, WHITE_OFF }; - WhiteAlgorithm stringToWhiteAlgorithm(std::string str); + WhiteAlgorithm stringToWhiteAlgorithm(QString str); void Rgb_to_Rgbw(ColorRgb input, ColorRgbw * output, const WhiteAlgorithm algorithm); }; diff --git a/include/utils/SysInfo.h b/include/utils/SysInfo.h index 1e47a796..b6b97bb6 100644 --- a/include/utils/SysInfo.h +++ b/include/utils/SysInfo.h @@ -6,8 +6,7 @@ class SysInfo : public QObject { -// Q_OBJECT - + public: struct HyperionSysInfo { @@ -15,26 +14,27 @@ public: QString kernelVersion; QString architecture; QString wordSize; - QString productType; // $ID $DISTRIB_ID // single line file containing: // Debian - QString productVersion; // $VERSION_ID $DISTRIB_RELEASE // // single line file - QString prettyName; // $PRETTY_NAME $DISTRIB_DESCRIPTION + QString productType; + QString productVersion; + QString prettyName; + QString hostName; }; + ~SysInfo(); static HyperionSysInfo get(); private: SysInfo(); - ~SysInfo(); + static SysInfo* _instance; HyperionSysInfo _sysinfo; struct QUnixOSVersion { - // from /etc/os-release older /etc/lsb-release // redhat /etc/redhat-release // debian /etc/debian_version - QString productType; // $ID $DISTRIB_ID // single line file containing: // Debian - QString productVersion; // $VERSION_ID $DISTRIB_RELEASE // // single line file - QString prettyName; // $PRETTY_NAME $DISTRIB_DESCRIPTION + QString productType; + QString productVersion; + QString prettyName; }; QString machineHostName(); diff --git a/include/utils/VideoMode.h b/include/utils/VideoMode.h index ae727657..226a0e1f 100644 --- a/include/utils/VideoMode.h +++ b/include/utils/VideoMode.h @@ -1,7 +1,6 @@ #pragma once -#include -#include +#include /** * Enumeration of the possible modes in which video can be playing (2D, 3D) @@ -13,10 +12,10 @@ enum VideoMode VIDEO_3DTAB }; -inline VideoMode parse3DMode(std::string videoMode) +inline VideoMode parse3DMode(QString videoMode) { // convert to lower case - std::transform(videoMode.begin(), videoMode.end(), videoMode.begin(), ::tolower); + videoMode = videoMode.toLower(); if (videoMode == "3DTAB") { diff --git a/include/utils/jsonschema/QJsonFactory.h b/include/utils/jsonschema/QJsonFactory.h index 83b2a53e..89e5ef61 100644 --- a/include/utils/jsonschema/QJsonFactory.h +++ b/include/utils/jsonschema/QJsonFactory.h @@ -1,9 +1,7 @@ #pragma once #include -#include #include -#include // JSON-Schema includes #include @@ -30,9 +28,10 @@ public: bool valid = schemaChecker.validate(configTree); - for (std::list::const_iterator i = schemaChecker.getMessages().begin(); i != schemaChecker.getMessages().end(); ++i) + QStringList messages = schemaChecker.getMessages(); + for (int i = 0; i < messages.size(); ++i) { - std::cout << *i << std::endl; + std::cout << messages[i].toStdString() << std::endl; } if (!valid) @@ -52,9 +51,7 @@ public: if (!file.open(QIODevice::ReadOnly)) { - std::stringstream sstream; - sstream << "Configuration file not found: '" << path.toStdString() << "' (" << file.errorString().toStdString() << ")"; - throw std::runtime_error(sstream.str()); + throw std::runtime_error(QString("Configuration file not found: '" + path + "' (" + file.errorString() + ")").toStdString()); } QString config = QString(file.readAll()); @@ -78,9 +75,9 @@ public: } } - std::stringstream sstream; - sstream << "Failed to parse configuration: " << error.errorString().toStdString() << " at Line: " << errorLine << ", Column: " << errorColumn; - throw std::runtime_error(sstream.str()); + throw std::runtime_error ( + QString("Failed to parse configuration: " + error.errorString() + " at Line: " + QString::number(errorLine) + ", Column: " + QString::number(errorColumn)).toStdString() + ); } return doc.object(); @@ -93,9 +90,7 @@ public: if (!schemaData.open(QIODevice::ReadOnly)) { - std::stringstream sstream; - sstream << "Schema not found: '" << path.toStdString() << "' (" << schemaData.errorString().toStdString() << ")"; - throw std::runtime_error(sstream.str()); + throw std::runtime_error(QString("Schema not found: '" + path + "' (" + schemaData.errorString() + ")").toStdString()); } QByteArray schema = schemaData.readAll(); @@ -117,9 +112,9 @@ public: } } - std::stringstream sstream; - sstream << "ERROR: Json schema wrong: " << error.errorString().toStdString() << " at Line: " << errorLine << ", Column: " << errorColumn; - throw std::runtime_error(sstream.str()); + throw std::runtime_error(QString("ERROR: Json schema wrong: " + error.errorString() + " at Line: " + QString::number(errorLine) + + ", Column: " + QString::number(errorColumn)).toStdString() + ); } return doc.object(); diff --git a/include/utils/jsonschema/QJsonSchemaChecker.h b/include/utils/jsonschema/QJsonSchemaChecker.h index fce7b112..f250d41b 100644 --- a/include/utils/jsonschema/QJsonSchemaChecker.h +++ b/include/utils/jsonschema/QJsonSchemaChecker.h @@ -1,9 +1,5 @@ #pragma once -// stl includes -#include -#include - #include #include #include @@ -48,7 +44,7 @@ public: /// /// @return A list of error messages /// - const std::list & getMessages() const; + const QStringList & getMessages() const; private: /// @@ -65,7 +61,7 @@ private: /// /// @param[in] message The message to add to the queue /// - void setMessage(const std::string & message); + void setMessage(const QString & message); private: // attribute check functions @@ -166,9 +162,9 @@ private: /// ignore the required value in json schema bool _ignoreRequired; /// The current location into a json-configuration structure being checked - std::list _currentPath; + QStringList _currentPath; /// The result messages collected during the schema verification - std::list _messages; + QStringList _messages; /// Flag indicating an error occured during validation bool _error; }; diff --git a/include/webconfig/WebConfig.h b/include/webconfig/WebConfig.h index 379459d2..b29c89cb 100644 --- a/include/webconfig/WebConfig.h +++ b/include/webconfig/WebConfig.h @@ -3,7 +3,6 @@ #include #include -#include #include class StaticFileServing; diff --git a/libsrc/blackborder/BlackBorderProcessor.cpp b/libsrc/blackborder/BlackBorderProcessor.cpp index cbe4bc33..75148c8e 100644 --- a/libsrc/blackborder/BlackBorderProcessor.cpp +++ b/libsrc/blackborder/BlackBorderProcessor.cpp @@ -14,7 +14,7 @@ BlackBorderProcessor::BlackBorderProcessor(const QJsonObject &blackborderConfig) , _borderSwitchCnt(blackborderConfig["borderFrameCnt"].toInt(50)) , _maxInconsistentCnt(blackborderConfig["maxInconsistentCnt"].toInt(10)) , _blurRemoveCnt(blackborderConfig["blurRemoveCnt"].toInt(1)) - , _detectionMode(blackborderConfig["mode"].toString("default").toStdString()) + , _detectionMode(blackborderConfig["mode"].toString("default")) , _detector(blackborderConfig["threshold"].toDouble(0.01)) , _currentBorder({true, -1, -1}) , _previousDetectedBorder({true, -1, -1}) @@ -23,7 +23,7 @@ BlackBorderProcessor::BlackBorderProcessor(const QJsonObject &blackborderConfig) { if (_enabled) { - Debug(Logger::getInstance("BLACKBORDER"), "mode: %s", _detectionMode.c_str()); + Debug(Logger::getInstance("BLACKBORDER"), "mode: %s", QSTRING_CSTR(_detectionMode)); } } diff --git a/libsrc/commandline/Option.cpp b/libsrc/commandline/Option.cpp index aa045bf3..4b25ad9d 100644 --- a/libsrc/commandline/Option.cpp +++ b/libsrc/commandline/Option.cpp @@ -3,29 +3,41 @@ using namespace commandline; +Option::Option(const QString &name, const QString &description, const QString &valueName, const QString &defaultValue) + : QCommandLineOption(name, description, valueName, defaultValue) +{} + +Option::Option(const QStringList &names, const QString &description, const QString &valueName, const QString &defaultValue) + : QCommandLineOption(names, description, valueName, defaultValue) +{} + + bool Option::validate(Parser & parser, QString &value) { /* By default everything is accepted */ return true; } +Option::Option(const QCommandLineOption &other) + : QCommandLineOption(other) +{} + QString Option::value(Parser &parser) { return parser.value(*this); } -std::string Option::getStdString(Parser &parser) +QString Option::name() { - return value(parser).toStdString(); + return this->names().last(); } -std::wstring Option::getStdWString(Parser &parser) +QString Option::getError() { - return value(parser).toStdWString(); + return this->_error; } const char* Option::getCString(Parser &parser) { return value(parser).toLocal8Bit().constData(); } - diff --git a/libsrc/effectengine/EffectEngine.cpp b/libsrc/effectengine/EffectEngine.cpp index 414e6f19..a84dd9fa 100644 --- a/libsrc/effectengine/EffectEngine.cpp +++ b/libsrc/effectengine/EffectEngine.cpp @@ -152,10 +152,10 @@ bool EffectEngine::loadEffectDefinition(const QString &path, const QString &effe schemaChecker.setSchema(configSchema.object()); if (!schemaChecker.validate(configEffect.object())) { - const std::list & errors = schemaChecker.getMessages(); - foreach (const std::string & error, errors) + const QStringList & errors = schemaChecker.getMessages(); + foreach (auto & error, errors) { - Error( log, "Error while checking '%s':%s", fileName.toUtf8().constData(), error.c_str()); + Error( log, "Error while checking '%s':%s", QSTRING_CSTR(fileName), QSTRING_CSTR(error)); } return false; } diff --git a/libsrc/grabber/amlogic/AmlogicGrabber.cpp b/libsrc/grabber/amlogic/AmlogicGrabber.cpp index 3e575f7e..a609b3b8 100755 --- a/libsrc/grabber/amlogic/AmlogicGrabber.cpp +++ b/libsrc/grabber/amlogic/AmlogicGrabber.cpp @@ -69,13 +69,13 @@ void AmlogicGrabber::setVideoMode(const VideoMode videoMode) bool AmlogicGrabber::isVideoPlaying() { - const std::string videoDevice = "/dev/amvideo"; + const QString videoDevice = "/dev/amvideo"; // Open the video device - int video_fd = open(videoDevice.c_str(), O_RDONLY); + int video_fd = open(QSTRING_CSTR(videoDevice), O_RDONLY); if (video_fd < 0) { - Error(_log, "Failed to open video device(%s): %d - %s", videoDevice.c_str(), errno, strerror(errno)); + Error(_log, "Failed to open video device(%s): %d - %s", QSTRING_CSTR(videoDevice), errno, strerror(errno)); return false; } diff --git a/libsrc/grabber/framebuffer/FramebufferFrameGrabber.cpp b/libsrc/grabber/framebuffer/FramebufferFrameGrabber.cpp index 699d832d..fa320f22 100755 --- a/libsrc/grabber/framebuffer/FramebufferFrameGrabber.cpp +++ b/libsrc/grabber/framebuffer/FramebufferFrameGrabber.cpp @@ -12,7 +12,7 @@ // Local includes #include -FramebufferFrameGrabber::FramebufferFrameGrabber(const std::string & device, const unsigned width, const unsigned height) : +FramebufferFrameGrabber::FramebufferFrameGrabber(const QString & device, const unsigned width, const unsigned height) : _fbfd(0), _fbp(0), _fbDevice(device), @@ -25,10 +25,10 @@ FramebufferFrameGrabber::FramebufferFrameGrabber(const std::string & device, con struct fb_var_screeninfo vinfo; // Check if the framebuffer device can be opened and display the current resolution - _fbfd = open(_fbDevice.c_str(), O_RDONLY); + _fbfd = open(QSTRING_CSTR(_fbDevice), O_RDONLY); if (_fbfd == 0) { - Error(_log, "Error openning %s", _fbDevice.c_str()); + Error(_log, "Error openning %s", QSTRING_CSTR(_fbDevice)); } else { @@ -63,7 +63,7 @@ void FramebufferFrameGrabber::grabFrame(Image & image) PixelFormat pixelFormat; /* Open the framebuffer device */ - _fbfd = open(_fbDevice.c_str(), O_RDONLY); + _fbfd = open(QSTRING_CSTR(_fbDevice), O_RDONLY); /* get variable screen information */ ioctl (_fbfd, FBIOGET_VSCREENINFO, &vinfo); diff --git a/libsrc/grabber/framebuffer/FramebufferWrapper.cpp b/libsrc/grabber/framebuffer/FramebufferWrapper.cpp index 3c60607b..6deb0d9b 100644 --- a/libsrc/grabber/framebuffer/FramebufferWrapper.cpp +++ b/libsrc/grabber/framebuffer/FramebufferWrapper.cpp @@ -7,7 +7,7 @@ #include #include -FramebufferWrapper::FramebufferWrapper(const std::string & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, const int priority) +FramebufferWrapper::FramebufferWrapper(const QString & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, const int priority) : GrabberWrapper("FrameBuffer", priority) , _updateInterval_ms(1000/updateRate_Hz) , _timeout_ms(2 * _updateInterval_ms) diff --git a/libsrc/grabber/v4l2/V4L2Grabber.cpp b/libsrc/grabber/v4l2/V4L2Grabber.cpp index c04587f7..dc71fe5c 100644 --- a/libsrc/grabber/v4l2/V4L2Grabber.cpp +++ b/libsrc/grabber/v4l2/V4L2Grabber.cpp @@ -23,7 +23,7 @@ #define CLEAR(x) memset(&(x), 0, sizeof(x)) -V4L2Grabber::V4L2Grabber(const std::string & device +V4L2Grabber::V4L2Grabber(const QString & device , int input , VideoStandard videoStandard , PixelFormat pixelFormat @@ -51,7 +51,7 @@ V4L2Grabber::V4L2Grabber(const std::string & device , _noSignalCounter(0) , _streamNotifier(nullptr) , _imageResampler() - , _log(Logger::getInstance("V4L2:"+QString::fromStdString(device))) + , _log(Logger::getInstance("V4L2:"+device)) , _initialized(false) , _deviceAutoDiscoverEnabled(false) , _noSignalDetected(false) @@ -74,7 +74,7 @@ V4L2Grabber::~V4L2Grabber() void V4L2Grabber::uninit() { - Debug(_log,"uninit grabber: %s", _deviceName.c_str()); + Debug(_log,"uninit grabber: %s", QSTRING_CSTR(_deviceName)); // stop if the grabber was not stopped if (_initialized) { @@ -91,16 +91,16 @@ bool V4L2Grabber::init() if (! _initialized) { getV4Ldevices(); - std::string v4lDevices_str; + QString v4lDevices_str; // show list only once - if ( ! QString(_deviceName.c_str()).startsWith("/dev/") ) + if ( ! QString(QSTRING_CSTR(_deviceName)).startsWith("/dev/") ) { for (auto& dev: _v4lDevices) { v4lDevices_str += "\t"+ dev.first + "\t" + dev.second + "\n"; } - Info(_log, "available V4L2 devices:\n%s", v4lDevices_str.c_str()); + Info(_log, "available V4L2 devices:\n%s", QSTRING_CSTR(v4lDevices_str)); } if ( _deviceName == "auto" ) @@ -113,28 +113,28 @@ bool V4L2Grabber::init() _deviceName = dev.first; if ( init() ) { - Info(_log, "found usable v4l2 device: %s (%s)",dev.first.c_str(), dev.second.c_str()); + Info(_log, "found usable v4l2 device: %s (%s)",QSTRING_CSTR(dev.first), QSTRING_CSTR(dev.second)); _deviceAutoDiscoverEnabled = false; return _initialized; } } Info( _log, "no usable device found" ); } - else if ( ! QString(_deviceName.c_str()).startsWith("/dev/") ) + else if ( ! _deviceName.startsWith("/dev/") ) { for (auto& dev: _v4lDevices) { - if ( QString(_deviceName.c_str()).toLower() == QString(dev.second.c_str()).toLower() ) + if ( _deviceName.toLower() == dev.second.toLower() ) { _deviceName = dev.first; - Info(_log, "found v4l2 device with configured name: %s (%s)", dev.second.c_str(), dev.first.c_str() ); + Info(_log, "found v4l2 device with configured name: %s (%s)", QSTRING_CSTR(dev.second), QSTRING_CSTR(dev.first) ); break; } } } else { - Info(_log, "%s v4l device: %s", (_deviceAutoDiscoverEnabled? "test" : "configured"),_deviceName.c_str()); + Info(_log, "%s v4l device: %s", (_deviceAutoDiscoverEnabled? "test" : "configured"), QSTRING_CSTR(_deviceName)); } bool opened = false; @@ -177,7 +177,7 @@ void V4L2Grabber::getV4Ldevices() devName = devName.trimmed(); devNameFile.close(); } - _v4lDevices.emplace("/dev/"+it.fileName().toStdString(), devName.toStdString()); + _v4lDevices.emplace("/dev/"+it.fileName(), devName); } } } @@ -194,14 +194,12 @@ void V4L2Grabber::set3D(VideoMode mode) void V4L2Grabber::setSignalThreshold(double redSignalThreshold, double greenSignalThreshold, double blueSignalThreshold, int noSignalCounterThreshold) { - _noSignalThresholdColor.red = uint8_t(255*redSignalThreshold); + _noSignalThresholdColor.red = uint8_t(255*redSignalThreshold); _noSignalThresholdColor.green = uint8_t(255*greenSignalThreshold); - _noSignalThresholdColor.blue = uint8_t(255*blueSignalThreshold); - _noSignalCounterThreshold = std::max(1, noSignalCounterThreshold); + _noSignalThresholdColor.blue = uint8_t(255*blueSignalThreshold); + _noSignalCounterThreshold = std::max(1, noSignalCounterThreshold); - std::stringstream ss; - ss << _noSignalThresholdColor; - Info(_log, "Signal threshold set to: %s", ss.str().c_str() ); + Info(_log, "Signal threshold set to: {%d, %d, %d}", _noSignalThresholdColor.red, _noSignalThresholdColor.green, _noSignalThresholdColor.blue ); } void V4L2Grabber::setSignalDetectionOffset(double horizontalMin, double verticalMin, double horizontalMax, double verticalMax) @@ -256,7 +254,7 @@ void V4L2Grabber::open_device() { struct stat st; - if (-1 == stat(_deviceName.c_str(), &st)) + if (-1 == stat(QSTRING_CSTR(_deviceName), &st)) { throw_errno_exception("Cannot identify '" + _deviceName + "'"); } @@ -266,7 +264,7 @@ void V4L2Grabber::open_device() throw_exception("'" + _deviceName + "' is no device"); } - _fileDescriptor = open(_deviceName.c_str(), O_RDWR /* required */ | O_NONBLOCK, 0); + _fileDescriptor = open(QSTRING_CSTR(_deviceName), O_RDWR | O_NONBLOCK, 0); if (-1 == _fileDescriptor) { @@ -870,14 +868,12 @@ int V4L2Grabber::xioctl(int request, void *arg) return r; } -void V4L2Grabber::throw_exception(const std::string & error) +void V4L2Grabber::throw_exception(const QString & error) { - throw std::runtime_error(error); + throw std::runtime_error(error.toStdString()); } -void V4L2Grabber::throw_errno_exception(const std::string & error) +void V4L2Grabber::throw_errno_exception(const QString & error) { - std::ostringstream oss; - oss << error << " error code " << errno << ", " << strerror(errno); - throw std::runtime_error(oss.str()); + throw std::runtime_error(QString(error + " error code " + QString::number(errno) + ", " + strerror(errno)).toStdString()); } diff --git a/libsrc/grabber/v4l2/V4L2Wrapper.cpp b/libsrc/grabber/v4l2/V4L2Wrapper.cpp index 2358528c..3ff2664f 100644 --- a/libsrc/grabber/v4l2/V4L2Wrapper.cpp +++ b/libsrc/grabber/v4l2/V4L2Wrapper.cpp @@ -4,7 +4,7 @@ #include -V4L2Wrapper::V4L2Wrapper(const std::string &device, +V4L2Wrapper::V4L2Wrapper(const QString &device, int input, VideoStandard videoStandard, PixelFormat pixelFormat, @@ -16,7 +16,7 @@ V4L2Wrapper::V4L2Wrapper(const std::string &device, double greenSignalThreshold, double blueSignalThreshold, const int priority) - : GrabberWrapper("V4L2:"+QString::fromStdString(device), priority, hyperion::COMP_V4L) + : GrabberWrapper("V4L2:"+device, priority, hyperion::COMP_V4L) , _timeout_ms(1000) , _grabber(device, input, diff --git a/libsrc/hyperion/Hyperion.cpp b/libsrc/hyperion/Hyperion.cpp index 2cf31447..8835e396 100644 --- a/libsrc/hyperion/Hyperion.cpp +++ b/libsrc/hyperion/Hyperion.cpp @@ -58,7 +58,7 @@ ColorOrder Hyperion::createColorOrder(const QJsonObject &deviceConfig) ColorAdjustment * Hyperion::createColorAdjustment(const QJsonObject & adjustmentConfig) { - const std::string id = adjustmentConfig["id"].toString("default").toStdString(); + const QString id = adjustmentConfig["id"].toString("default"); RgbChannelAdjustment * blackAdjustment = createRgbChannelAdjustment(adjustmentConfig, "black" , 0, 0, 0); RgbChannelAdjustment * whiteAdjustment = createRgbChannelAdjustment(adjustmentConfig, "white" , 255,255,255); @@ -117,13 +117,13 @@ MultiColorAdjustment * Hyperion::createLedColorsAdjustment(const unsigned ledCnt { // Special case for indices '*' => all leds adjustment->setAdjustmentForLed(colorAdjustment->_id, 0, ledCnt-1); - Info(CORE_LOGGER, "ColorAdjustment '%s' => [0; %d]", colorAdjustment->_id.c_str(), ledCnt-1); + Info(CORE_LOGGER, "ColorAdjustment '%s' => [0; %d]", QSTRING_CSTR(colorAdjustment->_id), ledCnt-1); continue; } if (!overallExp.exactMatch(ledIndicesStr)) { - Error(CORE_LOGGER, "Given led indices %d not correct format: %s", i, ledIndicesStr.toStdString().c_str()); + Error(CORE_LOGGER, "Given led indices %d not correct format: %s", i, QSTRING_CSTR(ledIndicesStr)); continue; } @@ -150,7 +150,7 @@ MultiColorAdjustment * Hyperion::createLedColorsAdjustment(const unsigned ledCnt ss << index; } } - Info(CORE_LOGGER, "ColorAdjustment '%s' => [%s]", colorAdjustment->_id.c_str(), ss.str().c_str()); + Info(CORE_LOGGER, "ColorAdjustment '%s' => [%s]", QSTRING_CSTR(colorAdjustment->_id), ss.str().c_str()); } return adjustment; @@ -319,8 +319,7 @@ QSize Hyperion::getLedLayoutGridSize(const QJsonValue& ledsConfig) LinearColorSmoothing * Hyperion::createColorSmoothing(const QJsonObject & smoothingConfig, LedDevice* leddevice) { - std::string type = smoothingConfig["type"].toString("linear").toStdString(); - std::transform(type.begin(), type.end(), type.begin(), ::tolower); + QString type = smoothingConfig["type"].toString("linear").toLower(); LinearColorSmoothing * device = nullptr; type = "linear"; // TODO currently hardcoded type, delete it if we have more types @@ -337,7 +336,7 @@ LinearColorSmoothing * Hyperion::createColorSmoothing(const QJsonObject & smooth } else { - Error(CORE_LOGGER, "Smoothing disabled, because of unknown type '%s'.", type.c_str()); + Error(CORE_LOGGER, "Smoothing disabled, because of unknown type '%s'.", QSTRING_CSTR(type)); } device->setEnable(smoothingConfig["enable"].toBool(true)); @@ -358,7 +357,7 @@ MessageForwarder * Hyperion::createMessageForwarder(const QJsonObject & forwarde for (signed i = 0; i < addr.size(); ++i) { Info(CORE_LOGGER, "Json forward to %s", addr.at(i).toString().toStdString().c_str()); - forwarder->addJsonSlave(addr[i].toString().toStdString()); + forwarder->addJsonSlave(addr[i].toString()); } } @@ -368,7 +367,7 @@ MessageForwarder * Hyperion::createMessageForwarder(const QJsonObject & forwarde for (signed i = 0; i < addr.size(); ++i) { Info(CORE_LOGGER, "Proto forward to %s", addr.at(i).toString().toStdString().c_str()); - forwarder->addProtoSlave(addr[i].toString().toStdString()); + forwarder->addProtoSlave(addr[i].toString()); } } } @@ -603,12 +602,12 @@ void Hyperion::setImage(int priority, const Image & image, int duratio } } -const std::vector & Hyperion::getAdjustmentIds() const +const QStringList & Hyperion::getAdjustmentIds() const { return _raw2ledAdjustment->getAdjustmentIds(); } -ColorAdjustment * Hyperion::getAdjustment(const std::string& id) +ColorAdjustment * Hyperion::getAdjustment(const QString& id) { return _raw2ledAdjustment->getAdjustment(id); } diff --git a/libsrc/hyperion/LinearColorSmoothing.h b/libsrc/hyperion/LinearColorSmoothing.h index 03cbbae1..d321cb01 100644 --- a/libsrc/hyperion/LinearColorSmoothing.h +++ b/libsrc/hyperion/LinearColorSmoothing.h @@ -1,7 +1,6 @@ #pragma once // STL includes -#include #include diff --git a/libsrc/hyperion/MessageForwarder.cpp b/libsrc/hyperion/MessageForwarder.cpp index 95d007ee..9ddb9863 100644 --- a/libsrc/hyperion/MessageForwarder.cpp +++ b/libsrc/hyperion/MessageForwarder.cpp @@ -13,11 +13,11 @@ MessageForwarder::~MessageForwarder() } -void MessageForwarder::addJsonSlave(std::string slave) +void MessageForwarder::addJsonSlave(QString slave) { - QStringList parts = QString(slave.c_str()).split(":"); + QStringList parts = slave.split(":"); if (parts.size() != 2) - throw std::runtime_error(QString("HYPERION (forwarder) ERROR: Wrong address: unable to parse address (%1)").arg(slave.c_str()).toStdString()); + throw std::runtime_error(QString("HYPERION (forwarder) ERROR: Wrong address: unable to parse address (%1)").arg(slave).toStdString()); bool ok; quint16 port = parts[1].toUShort(&ok); @@ -30,9 +30,9 @@ void MessageForwarder::addJsonSlave(std::string slave) _jsonSlaves << c; } -void MessageForwarder::addProtoSlave(std::string slave) +void MessageForwarder::addProtoSlave(QString slave) { - _protoSlaves << QString(slave.c_str()); + _protoSlaves << slave; } QStringList MessageForwarder::getProtoSlaves() diff --git a/libsrc/hyperion/MultiColorAdjustment.cpp b/libsrc/hyperion/MultiColorAdjustment.cpp index b1662ba6..8af98804 100644 --- a/libsrc/hyperion/MultiColorAdjustment.cpp +++ b/libsrc/hyperion/MultiColorAdjustment.cpp @@ -27,7 +27,7 @@ void MultiColorAdjustment::addAdjustment(ColorAdjustment * adjustment) _adjustment.push_back(adjustment); } -void MultiColorAdjustment::setAdjustmentForLed(const std::string& id, const unsigned startLed, const unsigned endLed) +void MultiColorAdjustment::setAdjustmentForLed(const QString& id, const unsigned startLed, const unsigned endLed) { assert(startLed <= endLed); assert(endLed < _ledAdjustments.size()); @@ -61,12 +61,12 @@ bool MultiColorAdjustment::verifyAdjustments() const return true; } -const std::vector & MultiColorAdjustment::getAdjustmentIds() +const QStringList & MultiColorAdjustment::getAdjustmentIds() { return _adjustmentIds; } -ColorAdjustment* MultiColorAdjustment::getAdjustment(const std::string& id) +ColorAdjustment* MultiColorAdjustment::getAdjustment(const QString& id) { // Iterate through the unique adjustments until we find the one with the given id for (ColorAdjustment* adjustment : _adjustment) diff --git a/libsrc/hyperion/MultiColorAdjustment.h b/libsrc/hyperion/MultiColorAdjustment.h index eaeb94ba..f6568049 100644 --- a/libsrc/hyperion/MultiColorAdjustment.h +++ b/libsrc/hyperion/MultiColorAdjustment.h @@ -2,11 +2,11 @@ // STL includes #include - -// Utils includes -#include +#include +#include // Hyperion includes +#include #include /// @@ -26,7 +26,7 @@ public: */ void addAdjustment(ColorAdjustment * adjustment); - void setAdjustmentForLed(const std::string& id, const unsigned startLed, const unsigned endLed); + void setAdjustmentForLed(const QString& id, const unsigned startLed, const unsigned endLed); bool verifyAdjustments() const; @@ -36,7 +36,7 @@ public: /// Returns the identifier of all the unique ColorAdjustment /// /// @return The list with unique id's of the ColorAdjustment - const std::vector & getAdjustmentIds(); + const QStringList & getAdjustmentIds(); /// /// Returns the pointer to the ColorAdjustment with the given id @@ -45,7 +45,7 @@ public: /// /// @return The ColorAdjustment with the given id (or nullptr if it does not exist) /// - ColorAdjustment* getAdjustment(const std::string& id); + ColorAdjustment* getAdjustment(const QString& id); /// /// Performs the color adjustment from raw-color to led-color @@ -56,7 +56,7 @@ public: private: /// List with transform ids - std::vector _adjustmentIds; + QStringList _adjustmentIds; /// List with unique ColorTransforms std::vector _adjustment; diff --git a/libsrc/jsonserver/JsonClientConnection.cpp b/libsrc/jsonserver/JsonClientConnection.cpp index 84bea379..a7cba33d 100644 --- a/libsrc/jsonserver/JsonClientConnection.cpp +++ b/libsrc/jsonserver/JsonClientConnection.cpp @@ -41,6 +41,7 @@ #include #include #include +#include // project includes #include "JsonClientConnection.h" @@ -98,13 +99,13 @@ void JsonClientConnection::readData() while(bytes > 0) { // create message string - std::string message(_receiveBuffer.data(), bytes); + QString message(QByteArray(_receiveBuffer.data(), bytes)); // remove message data from buffer _receiveBuffer = _receiveBuffer.mid(bytes); // handle message - handleMessage(QString::fromStdString(message)); + handleMessage(message); // try too look up '\n' again bytes = _receiveBuffer.indexOf('\n') + 1; @@ -215,14 +216,14 @@ void JsonClientConnection::doWebSocketHandshake() // get the key to prepare an answer int start = _receiveBuffer.indexOf("Sec-WebSocket-Key") + 19; - std::string value(_receiveBuffer.mid(start, _receiveBuffer.indexOf("\r\n", start) - start).data()); + QByteArray value = _receiveBuffer.mid(start, _receiveBuffer.indexOf("\r\n", start) - start); _receiveBuffer.clear(); // must be always appended value += "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; // generate sha1 hash - QByteArray hash = QCryptographicHash::hash(value.c_str(), QCryptographicHash::Sha1); + QByteArray hash = QCryptographicHash::hash(value, QCryptographicHash::Sha1); // prepare an answer std::ostringstream h; @@ -292,38 +293,23 @@ void JsonClientConnection::handleMessage(const QString& messageString) int tan = message["tan"].toInt(0); // switch over all possible commands and handle them - if (command == "color") - handleColorCommand(message, command, tan); - else if (command == "image") - handleImageCommand(message, command, tan); - else if (command == "effect") - handleEffectCommand(message, command, tan); - else if (command == "create-effect") - handleCreateEffectCommand(message, command, tan); - else if (command == "delete-effect") - handleDeleteEffectCommand(message, command, tan); - else if (command == "serverinfo") - handleServerInfoCommand(message, command, tan); - else if (command == "clear") - handleClearCommand(message, command, tan); - else if (command == "clearall") - handleClearallCommand(message, command, tan); - else if (command == "adjustment") - handleAdjustmentCommand(message, command, tan); - else if (command == "sourceselect") - handleSourceSelectCommand(message, command, tan); - else if (command == "config") - handleConfigCommand(message, command, tan); - else if (command == "componentstate") - handleComponentStateCommand(message, command, tan); - else if (command == "ledcolors") - handleLedColorsCommand(message, command, tan); - else if (command == "logging") - handleLoggingCommand(message, command, tan); - else if (command == "processing") - handleProcessingCommand(message, command, tan); - else - handleNotImplemented(); + if (command == "color") handleColorCommand (message, command, tan); + else if (command == "image") handleImageCommand (message, command, tan); + else if (command == "effect") handleEffectCommand (message, command, tan); + else if (command == "create-effect") handleCreateEffectCommand (message, command, tan); + else if (command == "delete-effect") handleDeleteEffectCommand (message, command, tan); + else if (command == "serverinfo") handleServerInfoCommand (message, command, tan); + else if (command == "sysinfo") handleSysInfoCommand (message, command, tan); + else if (command == "clear") handleClearCommand (message, command, tan); + else if (command == "clearall") handleClearallCommand (message, command, tan); + else if (command == "adjustment") handleAdjustmentCommand (message, command, tan); + else if (command == "sourceselect") handleSourceSelectCommand (message, command, tan); + else if (command == "config") handleConfigCommand (message, command, tan); + else if (command == "componentstate") handleComponentStateCommand(message, command, tan); + else if (command == "ledcolors") handleLedColorsCommand (message, command, tan); + else if (command == "logging") handleLoggingCommand (message, command, tan); + else if (command == "processing") handleProcessingCommand (message, command, tan); + else handleNotImplemented (); } catch (std::exception& e) { @@ -571,6 +557,41 @@ void JsonClientConnection::handleDeleteEffectCommand(const QJsonObject& message, sendErrorReply("Error while parsing json: Message size " + QString(message.size()), command, tan); } + +void JsonClientConnection::handleSysInfoCommand(const QJsonObject&, const QString& command, const int tan) +{ + // create result + QJsonObject result; + QJsonObject info; + result["success"] = true; + result["command"] = command; + result["tan"] = tan; + + SysInfo::HyperionSysInfo data = SysInfo::get(); + QJsonObject system; + system["kernelType" ] = data.kernelType; + system["kernelVersion" ] = data.kernelVersion; + system["architecture" ] = data.architecture; + system["wordSize" ] = data.wordSize; + system["productType" ] = data.productType; + system["productVersion"] = data.productVersion; + system["prettyName" ] = data.prettyName; + system["hostName" ] = data.hostName; + info["system"] = system; + + QJsonObject hyperion; + hyperion["jsonrpc_version" ] = QString(HYPERION_JSON_VERSION); + hyperion["version" ] = QString(HYPERION_VERSION); + hyperion["build" ] = QString(HYPERION_BUILD_ID); + hyperion["time" ] = QString(__DATE__ " " __TIME__); + info["hyperion"] = hyperion; + + // send the result + result["info" ] = info; + sendMessage(result); +} + + void JsonClientConnection::handleServerInfoCommand(const QJsonObject&, const QString& command, const int tan) { // create result @@ -581,9 +602,6 @@ void JsonClientConnection::handleServerInfoCommand(const QJsonObject&, const QSt QJsonObject info; - // add host name for remote clients - info["hostname"] = QHostInfo::localHostName(); - // collect priority information QJsonArray priorities; uint64_t now = QDateTime::currentMSecsSinceEpoch(); @@ -677,17 +695,17 @@ void JsonClientConnection::handleServerInfoCommand(const QJsonObject&, const QSt // collect adjustment information QJsonArray adjustmentArray; - for (const std::string& adjustmentId : _hyperion->getAdjustmentIds()) + for (const QString& adjustmentId : _hyperion->getAdjustmentIds()) { const ColorAdjustment * colorAdjustment = _hyperion->getAdjustment(adjustmentId); if (colorAdjustment == nullptr) { - Error(_log, "Incorrect color adjustment id: %s", adjustmentId.c_str()); + Error(_log, "Incorrect color adjustment id: %s", QSTRING_CSTR(adjustmentId)); continue; } QJsonObject adjustment; - adjustment["id"] = QString::fromStdString(adjustmentId); + adjustment["id"] = adjustmentId; QJsonArray blackAdjust; blackAdjust.append(colorAdjustment->_rgbBlackAdjustment.getAdjustmentR()); @@ -766,11 +784,11 @@ void JsonClientConnection::handleServerInfoCommand(const QJsonObject&, const QSt // get available led devices QJsonObject ledDevices; - ledDevices["active"] = QString::fromStdString(LedDevice::activeDevice()); + ledDevices["active"] =LedDevice::activeDevice(); QJsonArray availableLedDevices; for (auto dev: LedDevice::getDeviceMap()) { - availableLedDevices.append(QString::fromStdString(dev.first)); + availableLedDevices.append(dev.first); } ledDevices["available"] = availableLedDevices; @@ -805,17 +823,10 @@ void JsonClientConnection::handleServerInfoCommand(const QJsonObject&, const QSt info["components"] = component; info["ledMAppingType"] = ImageProcessor::mappingTypeToStr(_hyperion->getLedMappingType()); - // Add Hyperion Version, build time - QJsonArray hyperion; - QJsonObject ver; - ver["jsonrpc_version"] = QString(HYPERION_JSON_VERSION); - ver["version"] = QString(HYPERION_VERSION); - ver["build"] = QString(HYPERION_BUILD_ID); - ver["time"] = QString(__DATE__ " " __TIME__); - ver["config_modified"] = _hyperion->configModified(); - ver["config_writeable"] = _hyperion->configWriteable(); - - hyperion.append(ver); + // Add Hyperion + QJsonObject hyperion; + hyperion["config_modified" ] = _hyperion->configModified(); + hyperion["config_writeable"] = _hyperion->configWriteable(); info["hyperion"] = hyperion; // send the result @@ -852,8 +863,8 @@ void JsonClientConnection::handleAdjustmentCommand(const QJsonObject& message, c { const QJsonObject & adjustment = message["adjustment"].toObject(); - const QString adjustmentId = adjustment["id"].toString(QString::fromStdString(_hyperion->getAdjustmentIds().front())); - ColorAdjustment * colorAdjustment = _hyperion->getAdjustment(adjustmentId.toStdString()); + const QString adjustmentId = adjustment["id"].toString(_hyperion->getAdjustmentIds().first()); + ColorAdjustment * colorAdjustment = _hyperion->getAdjustment(adjustmentId); if (colorAdjustment == nullptr) { Warning(_log, "Incorrect adjustment identifier: %s", adjustmentId.toStdString().c_str()); @@ -1008,7 +1019,7 @@ void JsonClientConnection::handleConfigGetCommand(const QJsonObject& message, co try { - result["result"] = QJsonFactory::readConfig(QString::fromStdString(_hyperion->getConfigFileName())); + result["result"] = QJsonFactory::readConfig(_hyperion->getConfigFileName()); } catch(...) { @@ -1387,9 +1398,7 @@ bool JsonClientConnection::checkJson(const QJsonObject& message, const QString& } } - std::stringstream sstream; - sstream << "Schema error: " << error.errorString().toStdString() << " at Line: " << errorLine << ", Column: " << errorColumn; - errorMessage = QString::fromStdString(sstream.str()); + errorMessage = "Schema error: " + error.errorString() + " at Line: " + QString::number(errorLine) + ", Column: " + QString::number(errorColumn); return false; } @@ -1399,15 +1408,13 @@ bool JsonClientConnection::checkJson(const QJsonObject& message, const QString& // check the message if (!schemaChecker.validate(message, ignoreRequired)) { - const std::list & errors = schemaChecker.getMessages(); - std::stringstream ss; - ss << "{"; - foreach (const std::string & error, errors) + const QStringList & errors = schemaChecker.getMessages(); + errorMessage = "{"; + foreach (auto & error, errors) { - ss << error << " "; + errorMessage += error + " "; } - ss << "}"; - errorMessage = QString::fromStdString(ss.str()); + errorMessage += "}"; return false; } diff --git a/libsrc/jsonserver/JsonClientConnection.h b/libsrc/jsonserver/JsonClientConnection.h index 7decad84..ceb0c478 100644 --- a/libsrc/jsonserver/JsonClientConnection.h +++ b/libsrc/jsonserver/JsonClientConnection.h @@ -1,13 +1,11 @@ #pragma once -// stl includes -#include - // Qt includes #include #include #include #include +#include // Hyperion includes #include @@ -189,6 +187,13 @@ private: /// void handleServerInfoCommand(const QJsonObject & message, const QString &command, const int tan); + /// + /// Handle an incoming JSON System info message + /// + /// @param message the incoming message + /// + void handleSysInfoCommand(const QJsonObject & message, const QString &command, const int tan); + /// /// Handle an incoming JSON Clear message /// diff --git a/libsrc/jsonserver/JsonSchemas.qrc b/libsrc/jsonserver/JsonSchemas.qrc index 666ec0dc..c7988d2b 100644 --- a/libsrc/jsonserver/JsonSchemas.qrc +++ b/libsrc/jsonserver/JsonSchemas.qrc @@ -4,6 +4,7 @@ schema/schema-color.json schema/schema-image.json schema/schema-serverinfo.json + schema/schema-sysinfo.json schema/schema-clear.json schema/schema-clearall.json schema/schema-adjustment.json diff --git a/libsrc/jsonserver/schema/schema-sysinfo.json b/libsrc/jsonserver/schema/schema-sysinfo.json new file mode 100644 index 00000000..33fcda88 --- /dev/null +++ b/libsrc/jsonserver/schema/schema-sysinfo.json @@ -0,0 +1,15 @@ +{ + "type":"object", + "required":true, + "properties":{ + "command": { + "type" : "string", + "required" : true, + "enum" : ["sysinfo"] + }, + "tan" : { + "type" : "integer" + } + }, + "additionalProperties": false +} diff --git a/libsrc/jsonserver/schema/schema.json b/libsrc/jsonserver/schema/schema.json index f75522ea..20156ff7 100644 --- a/libsrc/jsonserver/schema/schema.json +++ b/libsrc/jsonserver/schema/schema.json @@ -5,7 +5,7 @@ "command": { "type" : "string", "required" : true, - "enum" : ["color", "image", "effect", "create-effect", "delete-effect", "serverinfo", "clear", "clearall", "adjustment", "sourceselect", "config", "componentstate", "ledcolors", "logging", "processing"] + "enum" : ["color", "image", "effect", "create-effect", "delete-effect", "serverinfo", "clear", "clearall", "adjustment", "sourceselect", "config", "componentstate", "ledcolors", "logging", "processing", "sysinfo"] } } } diff --git a/libsrc/leddevice/LedDevice.cpp b/libsrc/leddevice/LedDevice.cpp index 1be6277b..54d825ff 100644 --- a/libsrc/leddevice/LedDevice.cpp +++ b/libsrc/leddevice/LedDevice.cpp @@ -7,7 +7,7 @@ #include LedDeviceRegistry LedDevice::_ledDeviceMap = LedDeviceRegistry(); -std::string LedDevice::_activeDevice = ""; +QString LedDevice::_activeDevice = ""; int LedDevice::_ledCount = 0; int LedDevice::_ledRGBCount = 0; int LedDevice::_ledRGBWCount= 0; @@ -34,7 +34,7 @@ int LedDevice::open() return 0; } -int LedDevice::addToDeviceMap(std::string name, LedDeviceCreateFuncType funcPtr) +int LedDevice::addToDeviceMap(QString name, LedDeviceCreateFuncType funcPtr) { _ledDeviceMap.emplace(name,funcPtr); return 0; @@ -45,7 +45,7 @@ const LedDeviceRegistry& LedDevice::getDeviceMap() return _ledDeviceMap; } -void LedDevice::setActiveDevice(std::string dev) +void LedDevice::setActiveDevice(QString dev) { _activeDevice = dev; } @@ -74,7 +74,7 @@ QJsonObject LedDevice::getLedDeviceSchemas() if (!schemaData.open(QIODevice::ReadOnly)) { - Error(Logger::getInstance("LedDevice"), "Schema not found: %s", item.toUtf8().constData()); + Error(Logger::getInstance("LedDevice"), "Schema not found: %s", QSTRING_CSTR(item)); throw std::runtime_error("ERROR: Schema not found: " + item.toStdString()); } @@ -97,10 +97,9 @@ QJsonObject LedDevice::getLedDeviceSchemas() } } - std::stringstream sstream; - sstream << error.errorString().toStdString() << " at Line: " << errorLine << ", Column: " << errorColumn; - Error(Logger::getInstance("LedDevice"), "LedDevice JSON schema error in %s (%s)", item.toUtf8().constData(), sstream.str().c_str()); - throw std::runtime_error("ERROR: Json schema wrong: " + sstream.str()); + QString errorMsg = error.errorString() + " at Line: " + QString::number(errorLine) + ", Column: " + QString::number(errorColumn); + Error(Logger::getInstance("LedDevice"), "LedDevice JSON schema error in %s (%s)", QSTRING_CSTR(item), QSTRING_CSTR(errorMsg)); + throw std::runtime_error("ERROR: Json schema wrong: " + errorMsg.toStdString()); } schemaJson = doc.object(); diff --git a/libsrc/leddevice/LedDeviceAtmoOrb.cpp b/libsrc/leddevice/LedDeviceAtmoOrb.cpp index 6265c021..a731b9d8 100644 --- a/libsrc/leddevice/LedDeviceAtmoOrb.cpp +++ b/libsrc/leddevice/LedDeviceAtmoOrb.cpp @@ -6,13 +6,10 @@ #include #include #include +#include -#include -#include -#include -#include - -AtmoOrbLight::AtmoOrbLight(unsigned int id) { +AtmoOrbLight::AtmoOrbLight(unsigned int id) +{ // Not implemented } @@ -38,28 +35,20 @@ bool LedDeviceAtmoOrb::init(const QJsonObject &deviceConfig) _multiCastGroupPort = deviceConfig["port"].toInt(49692); _numLeds = deviceConfig["numLeds"].toInt(24); - const std::string orbId = deviceConfig["orbIds"].toString().toStdString(); + const QStringList orbIds = deviceConfig["orbIds"].toString().simplified().remove(" ").split(",", QString::SkipEmptyParts); _orbIds.clear(); - // If we find multiple Orb ids separate them and add to list - const std::string separator (","); - if (orbId.find(separator) != std::string::npos) + foreach(auto & id_str, orbIds) { - std::stringstream ss(orbId); - std::vector output; - unsigned int i; - while (ss >> i) - { - _orbIds.push_back(i); - if (ss.peek() == ',' || ss.peek() == ' ') ss.ignore(); - } - } - else - { - _orbIds.push_back(atoi(orbId.c_str())); + bool ok; + int id = id_str.toInt(&ok); + if (ok) + _orbIds.append(id); + else + Error(_log, "orb id '%s' is not a number", QSTRING_CSTR(id_str)); } - return true; + return _orbIds.size() > 0; } LedDevice* LedDeviceAtmoOrb::construct(const QJsonObject &deviceConfig) @@ -104,7 +93,7 @@ int LedDeviceAtmoOrb::write(const std::vector &ledValues) abs(color.green - lastGreen) >= _skipSmoothingDiff)) { // Skip Orb smoothing when using (command type 4) - for (unsigned int i = 0; i < _orbIds.size(); i++) + for (int i = 0; i < _orbIds.size(); i++) { if (_orbIds[i] == idx) { @@ -115,7 +104,7 @@ int LedDeviceAtmoOrb::write(const std::vector &ledValues) else { // Send color - for (unsigned int i = 0; i < _orbIds.size(); i++) + for (int i = 0; i < _orbIds.size(); i++) { if (_orbIds[i] == idx) { diff --git a/libsrc/leddevice/LedDeviceAtmoOrb.h b/libsrc/leddevice/LedDeviceAtmoOrb.h index ecb26eea..bbc36a87 100644 --- a/libsrc/leddevice/LedDeviceAtmoOrb.h +++ b/libsrc/leddevice/LedDeviceAtmoOrb.h @@ -5,6 +5,8 @@ #include #include #include +#include +#include // Leddevice includes #include @@ -101,7 +103,7 @@ private: QUdpSocket * _udpSocket; /// Array of the orb ids. - std::vector _orbIds; + QVector _orbIds; /// /// Set Orbcolor diff --git a/libsrc/leddevice/LedDeviceDMX.cpp b/libsrc/leddevice/LedDeviceDMX.cpp index 13709504..fe1c06aa 100644 --- a/libsrc/leddevice/LedDeviceDMX.cpp +++ b/libsrc/leddevice/LedDeviceDMX.cpp @@ -17,14 +17,14 @@ bool LedDeviceDMX::init(const QJsonObject &deviceConfig) { ProviderRs232::init(deviceConfig); - std::string _dmxString = deviceConfig["dmxdevice"].toString("invalid").toStdString(); - if (_dmxString == "raw") + QString dmxString = deviceConfig["dmxdevice"].toString("invalid"); + if (dmxString == "raw") { _dmxDeviceType = 0; _dmxStart = 1; _dmxSlotsPerLed = 3; } - else if (_dmxString == "McCrypt") + else if (dmxString == "McCrypt") { _dmxDeviceType = 1; _dmxStart = 1; @@ -32,10 +32,10 @@ bool LedDeviceDMX::init(const QJsonObject &deviceConfig) } else { - Error(_log, "unknown dmx device type %s", _dmxString.c_str()); + Error(_log, "unknown dmx device type %s", QSTRING_CSTR(dmxString)); } - Debug(_log, "_dmxString \"%s\", _dmxDeviceType %d", _dmxString.c_str(), _dmxDeviceType ); + Debug(_log, "_dmxString \"%s\", _dmxDeviceType %d", QSTRING_CSTR(dmxString), _dmxDeviceType ); _rs232Port.setStopBits(QSerialPort::TwoStop); _dmxLedCount = std::min(_ledCount, 512/_dmxSlotsPerLed); diff --git a/libsrc/leddevice/LedDeviceFactory.cpp b/libsrc/leddevice/LedDeviceFactory.cpp index 6e68efa0..ee2c3a09 100755 --- a/libsrc/leddevice/LedDeviceFactory.cpp +++ b/libsrc/leddevice/LedDeviceFactory.cpp @@ -1,7 +1,4 @@ // Stl includes -#include -#include -#include #include #include @@ -60,13 +57,12 @@ LedDevice * LedDeviceFactory::construct(const QJsonObject & deviceConfig, const QString ss(config.toJson(QJsonDocument::Indented)); Info(log, "configuration: %s ", ss.toUtf8().constData()); - std::string type = deviceConfig["type"].toString("UNSPECIFIED").toStdString(); - std::transform(type.begin(), type.end(), type.begin(), ::tolower); + QString type = deviceConfig["type"].toString("UNSPECIFIED").toLower(); // set amount of led to leddevice LedDevice::setLedCount(ledCount); - #define REGISTER(className) LedDevice::addToDeviceMap(QString(#className).toLower().toStdString(), LedDevice##className::construct); + #define REGISTER(className) LedDevice::addToDeviceMap(QString(#className).toLower(), LedDevice##className::construct); // rs232 devices REGISTER(Adalight); REGISTER(Sedu); @@ -126,21 +122,21 @@ LedDevice * LedDeviceFactory::construct(const QJsonObject & deviceConfig, const { device = dev.second(deviceConfig); LedDevice::setActiveDevice(dev.first); - Info(log,"LedDevice '%s' configured.", dev.first.c_str()); + Info(log,"LedDevice '%s' configured.", QSTRING_CSTR(dev.first)); break; } } if (device == nullptr) { - Error(log, "Dummy device used, because configured device '%s' is unknown", type.c_str() ); + Error(log, "Dummy device used, because configured device '%s' is unknown", QSTRING_CSTR(type) ); throw std::runtime_error("unknown device"); } } catch(std::exception& e) { - Error(log, "Dummy device used, because configured device '%s' throws error '%s'", type.c_str(), e.what()); + Error(log, "Dummy device used, because configured device '%s' throws error '%s'", QSTRING_CSTR(type), e.what()); const QJsonObject dummyDeviceConfig; device = LedDeviceFile::construct(QJsonObject()); } diff --git a/libsrc/leddevice/LedDeviceFadeCandy.cpp b/libsrc/leddevice/LedDeviceFadeCandy.cpp index b924b53f..e5ada501 100644 --- a/libsrc/leddevice/LedDeviceFadeCandy.cpp +++ b/libsrc/leddevice/LedDeviceFadeCandy.cpp @@ -34,7 +34,7 @@ bool LedDeviceFadeCandy::init(const QJsonObject &deviceConfig) return false; } - _host = deviceConfig["output"].toString("127.0.0.1").toStdString(); + _host = deviceConfig["output"].toString("127.0.0.1"); _port = deviceConfig["port"].toInt(7890); _channel = deviceConfig["channel"].toInt(0); _gamma = deviceConfig["gamma"].toDouble(1.0); @@ -74,10 +74,10 @@ bool LedDeviceFadeCandy::isConnected() bool LedDeviceFadeCandy::tryConnect() { if ( _client.state() == QAbstractSocket::UnconnectedState ) { - _client.connectToHost( _host.c_str(), _port); + _client.connectToHost( _host, _port); if ( _client.waitForConnected(1000) ) { - Info(_log,"fadecandy/opc: connected to %s:%i on channel %i", _host.c_str(), _port, _channel); + Info(_log,"fadecandy/opc: connected to %s:%i on channel %i", QSTRING_CSTR(_host), _port, _channel); if (_setFcConfig) { sendFadeCandyConfiguration(); diff --git a/libsrc/leddevice/LedDeviceFadeCandy.h b/libsrc/leddevice/LedDeviceFadeCandy.h index e00bcc5e..11cd6f68 100644 --- a/libsrc/leddevice/LedDeviceFadeCandy.h +++ b/libsrc/leddevice/LedDeviceFadeCandy.h @@ -2,6 +2,7 @@ // STL/Qt includes #include +#include // Leddevice includes #include @@ -65,7 +66,7 @@ public: private: QTcpSocket _client; - std::string _host; + QString _host; uint16_t _port; unsigned _channel; QByteArray _opc_data; diff --git a/libsrc/leddevice/LedDeviceFile.cpp b/libsrc/leddevice/LedDeviceFile.cpp index 0f8f11b7..2728440b 100644 --- a/libsrc/leddevice/LedDeviceFile.cpp +++ b/libsrc/leddevice/LedDeviceFile.cpp @@ -25,8 +25,8 @@ bool LedDeviceFile::init(const QJsonObject &deviceConfig) _refresh_timer_interval = 0; LedDevice::init(deviceConfig); - std::string fileName = deviceConfig["output"].toString("/dev/null").toStdString(); - _ofs.open( fileName.c_str() ); + QString fileName = deviceConfig["output"].toString("/dev/null"); + _ofs.open( QSTRING_CSTR(fileName) ); return true; } diff --git a/libsrc/leddevice/LedDeviceHyperionUsbasp.cpp b/libsrc/leddevice/LedDeviceHyperionUsbasp.cpp index 542c7b7d..b1f02f38 100644 --- a/libsrc/leddevice/LedDeviceHyperionUsbasp.cpp +++ b/libsrc/leddevice/LedDeviceHyperionUsbasp.cpp @@ -8,7 +8,7 @@ // Static constants which define the Hyperion Usbasp device uint16_t LedDeviceHyperionUsbasp::_usbVendorId = 0x16c0; uint16_t LedDeviceHyperionUsbasp::_usbProductId = 0x05dc; -std::string LedDeviceHyperionUsbasp::_usbProductDescription = "Hyperion led controller"; +QString LedDeviceHyperionUsbasp::_usbProductDescription = "Hyperion led controller"; LedDeviceHyperionUsbasp::LedDeviceHyperionUsbasp(const QJsonObject &deviceConfig) @@ -41,7 +41,7 @@ bool LedDeviceHyperionUsbasp::init(const QJsonObject &deviceConfig) { LedDevice::init(deviceConfig); - std::string ledType = deviceConfig["output"].toString("ws2801").toStdString(); + QString ledType = deviceConfig["output"].toString("ws2801"); if (ledType != "ws2801" && ledType != "ws2812") { throw std::runtime_error("HyperionUsbasp: invalid output; must be 'ws2801' or 'ws2812'."); @@ -94,7 +94,7 @@ int LedDeviceHyperionUsbasp::open() if (_deviceHandle == nullptr) { - Error(_log, "No %s has been found", _usbProductDescription.c_str()); + Error(_log, "No %s has been found", QSTRING_CSTR(_usbProductDescription)); } return _deviceHandle == nullptr ? -1 : 0; @@ -119,18 +119,18 @@ int LedDeviceHyperionUsbasp::testAndOpen(libusb_device * device) int busNumber = libusb_get_bus_number(device); int addressNumber = libusb_get_device_address(device); - Info(_log, "%s found: bus=%d address=%d", _usbProductDescription.c_str(), busNumber, addressNumber); + Info(_log, "%s found: bus=%d address=%d", QSTRING_CSTR(_usbProductDescription), busNumber, addressNumber); try { _deviceHandle = openDevice(device); - Info(_log, "%s successfully opened", _usbProductDescription.c_str() ); + Info(_log, "%s successfully opened", QSTRING_CSTR(_usbProductDescription) ); return 0; } catch(int e) { _deviceHandle = nullptr; - Error(_log, "Unable to open %s. Searching for other device(%d): %s", _usbProductDescription.c_str(), e, libusb_error_name(e)); + Error(_log, "Unable to open %s. Searching for other device(%d): %s", QSTRING_CSTR(_usbProductDescription), e, libusb_error_name(e)); } } @@ -152,7 +152,7 @@ int LedDeviceHyperionUsbasp::write(const std::vector &ledValues) // Disabling interupts for a little while on the device results in a PIPE error. All seems to keep functioning though... if(nbytes < 0 && nbytes != LIBUSB_ERROR_PIPE) { - Error(_log, "Error while writing data to %s (%s)", _usbProductDescription.c_str(), libusb_error_name(nbytes)); + Error(_log, "Error while writing data to %s (%s)", QSTRING_CSTR(_usbProductDescription), libusb_error_name(nbytes)); return -1; } @@ -195,7 +195,7 @@ libusb_device_handle * LedDeviceHyperionUsbasp::openDevice(libusb_device *device return handle; } -std::string LedDeviceHyperionUsbasp::getString(libusb_device * device, int stringDescriptorIndex) +QString LedDeviceHyperionUsbasp::getString(libusb_device * device, int stringDescriptorIndex) { libusb_device_handle * handle = nullptr; @@ -214,5 +214,5 @@ std::string LedDeviceHyperionUsbasp::getString(libusb_device * device, int strin } libusb_close(handle); - return std::string(buffer, error); + return QString(QByteArray(buffer, error)); } diff --git a/libsrc/leddevice/LedDeviceHyperionUsbasp.h b/libsrc/leddevice/LedDeviceHyperionUsbasp.h index 72f61753..f1a8c307 100644 --- a/libsrc/leddevice/LedDeviceHyperionUsbasp.h +++ b/libsrc/leddevice/LedDeviceHyperionUsbasp.h @@ -3,7 +3,6 @@ // stl includes #include #include -#include // libusb include #include @@ -71,7 +70,7 @@ protected: static libusb_device_handle * openDevice(libusb_device * device); - static std::string getString(libusb_device * device, int stringDescriptorIndex); + static QString getString(libusb_device * device, int stringDescriptorIndex); /// command to write the leds uint8_t _writeLedsCommand; @@ -85,5 +84,5 @@ protected: /// Usb device identifiers static uint16_t _usbVendorId; static uint16_t _usbProductId; - static std::string _usbProductDescription; + static QString _usbProductDescription; }; diff --git a/libsrc/leddevice/LedDeviceLightpack.cpp b/libsrc/leddevice/LedDeviceLightpack.cpp index cba6f4fc..5dc3aa02 100644 --- a/libsrc/leddevice/LedDeviceLightpack.cpp +++ b/libsrc/leddevice/LedDeviceLightpack.cpp @@ -32,7 +32,7 @@ enum DATA_VERSION_INDEXES{ INDEX_FW_VER_MINOR }; -LedDeviceLightpack::LedDeviceLightpack(const std::string & serialNumber) +LedDeviceLightpack::LedDeviceLightpack(const QString & serialNumber) : LedDevice() , _libusbContext(nullptr) , _deviceHandle(nullptr) @@ -72,7 +72,7 @@ LedDeviceLightpack::~LedDeviceLightpack() bool LedDeviceLightpack::init(const QJsonObject &deviceConfig) { LedDevice::init(deviceConfig); - _serialNumber = deviceConfig["output"].toString("").toStdString(); + _serialNumber = deviceConfig["output"].toString(""); return true; } @@ -118,20 +118,20 @@ int LedDeviceLightpack::open() if (_deviceHandle == nullptr) { - if (_serialNumber.empty()) + if (_serialNumber.isEmpty()) { Warning(_log, "No Lightpack device has been found"); } else { - Error(_log,"No Lightpack device has been found with serial %s", _serialNumber.c_str()); + Error(_log,"No Lightpack device has been found with serial %s", QSTRING_CSTR(_serialNumber)); } } return _deviceHandle == nullptr ? -1 : 0; } -int LedDeviceLightpack::testAndOpen(libusb_device * device, const std::string & requestedSerialNumber) +int LedDeviceLightpack::testAndOpen(libusb_device * device, const QString & requestedSerialNumber) { libusb_device_descriptor deviceDescriptor; int error = libusb_get_device_descriptor(device, &deviceDescriptor); @@ -151,7 +151,7 @@ int LedDeviceLightpack::testAndOpen(libusb_device * device, const std::string & int addressNumber = libusb_get_device_address(device); // get the serial number - std::string serialNumber; + QString serialNumber; if (deviceDescriptor.iSerialNumber != 0) { try @@ -165,10 +165,10 @@ int LedDeviceLightpack::testAndOpen(libusb_device * device, const std::string & } } - Debug(_log,"Lightpack device found: bus=%d address=%d serial=%s", busNumber, addressNumber, serialNumber.c_str()); + Debug(_log,"Lightpack device found: bus=%d address=%d serial=%s", busNumber, addressNumber, QSTRING_CSTR(serialNumber)); // check if this is the device we are looking for - if (requestedSerialNumber.empty() || requestedSerialNumber == serialNumber) + if (requestedSerialNumber.isEmpty() || requestedSerialNumber == serialNumber) { // This is it! try @@ -231,7 +231,7 @@ int LedDeviceLightpack::testAndOpen(libusb_device * device, const std::string & _ledBuffer[0] = CMD_UPDATE_LEDS; // return success - Debug(_log, "Lightpack device opened: bus=%d address=%d serial=%s version=%s.%s.", _busNumber, _addressNumber, _serialNumber.c_str(), _firmwareVersion.majorVersion, _firmwareVersion.minorVersion ); + Debug(_log, "Lightpack device opened: bus=%d address=%d serial=%s version=%s.%s.", _busNumber, _addressNumber, QSTRING_CSTR(_serialNumber), _firmwareVersion.majorVersion, _firmwareVersion.minorVersion ); return 0; } catch(int e) @@ -279,7 +279,7 @@ int LedDeviceLightpack::switchOff() return writeBytes(buf, sizeof(buf)) == sizeof(buf); } -const std::string &LedDeviceLightpack::getSerialNumber() const +const QString &LedDeviceLightpack::getSerialNumber() const { return _serialNumber; } @@ -352,7 +352,7 @@ libusb_device_handle * LedDeviceLightpack::openDevice(libusb_device *device) return handle; } -std::string LedDeviceLightpack::getString(libusb_device * device, int stringDescriptorIndex) +QString LedDeviceLightpack::getString(libusb_device * device, int stringDescriptorIndex) { libusb_device_handle * handle = nullptr; @@ -371,5 +371,5 @@ std::string LedDeviceLightpack::getString(libusb_device * device, int stringDesc } libusb_close(handle); - return std::string(buffer, error); + return QString(QByteArray(buffer, error)); } diff --git a/libsrc/leddevice/LedDeviceLightpack.h b/libsrc/leddevice/LedDeviceLightpack.h index 47cfb83c..c9b34ce2 100644 --- a/libsrc/leddevice/LedDeviceLightpack.h +++ b/libsrc/leddevice/LedDeviceLightpack.h @@ -20,7 +20,7 @@ public: /// /// @param serialNumber serial output device /// - LedDeviceLightpack(const std::string & serialNumber = ""); + LedDeviceLightpack(const QString & serialNumber = ""); /// /// Constructs specific LedDevice /// @@ -68,7 +68,7 @@ public: virtual int switchOff(); /// Get the serial of the Lightpack - const std::string & getSerialNumber() const; + const QString & getSerialNumber() const; /// Get the number of leds int getLedCount() const; @@ -88,7 +88,7 @@ private: /// /// @return Zero on succes else negative /// - int testAndOpen(libusb_device * device, const std::string & requestedSerialNumber); + int testAndOpen(libusb_device * device, const QString & requestedSerialNumber); /// write bytes to the device int writeBytes(uint8_t *data, int size); @@ -103,7 +103,7 @@ private: }; static libusb_device_handle * openDevice(libusb_device * device); - static std::string getString(libusb_device * device, int stringDescriptorIndex); + static QString getString(libusb_device * device, int stringDescriptorIndex); /// libusb context libusb_context * _libusbContext; @@ -118,7 +118,7 @@ private: int _addressNumber; /// device serial number - std::string _serialNumber; + QString _serialNumber; /// firmware version of the device Version _firmwareVersion; diff --git a/libsrc/leddevice/LedDeviceMultiLightpack.cpp b/libsrc/leddevice/LedDeviceMultiLightpack.cpp index bb96553c..9f1082a1 100644 --- a/libsrc/leddevice/LedDeviceMultiLightpack.cpp +++ b/libsrc/leddevice/LedDeviceMultiLightpack.cpp @@ -40,13 +40,13 @@ LedDevice* LedDeviceMultiLightpack::construct(const QJsonObject &deviceConfig) int LedDeviceMultiLightpack::open() { // retrieve a list with Lightpack serials - std::list serialList = getLightpackSerials(); + QStringList serialList = getLightpackSerials(); // sort the list of Lightpacks based on the serial to get a fixed order std::sort(_lightpacks.begin(), _lightpacks.end(), compareLightpacks); // open each lightpack device - for (const std::string & serial : serialList) + foreach (auto serial , serialList) { LedDeviceLightpack * device = new LedDeviceLightpack(serial); int error = device->open(); @@ -57,7 +57,7 @@ int LedDeviceMultiLightpack::open() } else { - Error(_log, "Error while creating Lightpack device with serial %s", serial.c_str()); + Error(_log, "Error while creating Lightpack device with serial %s", QSTRING_CSTR(serial)); delete device; } } @@ -109,9 +109,9 @@ int LedDeviceMultiLightpack::switchOff() return 0; } -std::list LedDeviceMultiLightpack::getLightpackSerials() +QStringList LedDeviceMultiLightpack::getLightpackSerials() { - std::list serialList; + QStringList serialList; Logger * log = Logger::getInstance("LedDevice"); Debug(log, "Getting list of Lightpack serials"); @@ -148,7 +148,7 @@ std::list LedDeviceMultiLightpack::getLightpackSerials() Info(log, "Found a lightpack device. Retrieving serial..."); // get the serial number - std::string serialNumber; + QString serialNumber; if (deviceDescriptor.iSerialNumber != 0) { try @@ -162,8 +162,8 @@ std::list LedDeviceMultiLightpack::getLightpackSerials() } } - Error(log, "Lightpack device found with serial %s", serialNumber.c_str());; - serialList.push_back(serialNumber); + Error(log, "Lightpack device found with serial %s", QSTRING_CSTR(serialNumber));; + serialList.append(serialNumber); } } @@ -174,7 +174,7 @@ std::list LedDeviceMultiLightpack::getLightpackSerials() return serialList; } -std::string LedDeviceMultiLightpack::getString(libusb_device * device, int stringDescriptorIndex) +QString LedDeviceMultiLightpack::getString(libusb_device * device, int stringDescriptorIndex) { libusb_device_handle * handle = nullptr; @@ -193,5 +193,5 @@ std::string LedDeviceMultiLightpack::getString(libusb_device * device, int strin } libusb_close(handle); - return std::string(buffer, error); + return QString(QByteArray(buffer, error)); } diff --git a/libsrc/leddevice/LedDeviceMultiLightpack.h b/libsrc/leddevice/LedDeviceMultiLightpack.h index 0b285fd3..419e5bed 100644 --- a/libsrc/leddevice/LedDeviceMultiLightpack.h +++ b/libsrc/leddevice/LedDeviceMultiLightpack.h @@ -3,8 +3,8 @@ // stl includes #include #include -#include -#include +#include +#include // libusb include #include @@ -56,8 +56,8 @@ private: /// virtual int write(const std::vector& ledValues); - static std::list getLightpackSerials(); - static std::string getString(libusb_device * device, int stringDescriptorIndex); + static QStringList getLightpackSerials(); + static QString getString(libusb_device * device, int stringDescriptorIndex); /// buffer for led data std::vector _lightpacks; diff --git a/libsrc/leddevice/LedDevicePiBlaster.cpp b/libsrc/leddevice/LedDevicePiBlaster.cpp index dca25f9b..c39ab668 100644 --- a/libsrc/leddevice/LedDevicePiBlaster.cpp +++ b/libsrc/leddevice/LedDevicePiBlaster.cpp @@ -44,7 +44,7 @@ bool LedDevicePiBlaster::init(const QJsonObject &deviceConfig) { LedDevice::init(deviceConfig); - _deviceName = deviceConfig["output"].toString("/dev/pi-blaster").toStdString(); + QString _deviceName = deviceConfig["output"].toString("/dev/pi-blaster"); QJsonArray gpioMapping = deviceConfig["gpiomap"].toArray(); if (gpioMapping.isEmpty()) @@ -82,24 +82,24 @@ int LedDevicePiBlaster::open() if (_fid != nullptr) { // The file pointer is already open - Error( _log, "Device (%s) is already open.", _deviceName.c_str() ); + Error( _log, "Device (%s) is already open.", QSTRING_CSTR(_deviceName) ); return -1; } - if (!QFile::exists(_deviceName.c_str())) + if (!QFile::exists(_deviceName)) { - Error( _log, "The device (%s) does not yet exist.", _deviceName.c_str() ); + Error( _log, "The device (%s) does not yet exist.",QSTRING_CSTR(_deviceName) ); return -1; } - _fid = fopen(_deviceName.c_str(), "w"); + _fid = fopen(QSTRING_CSTR(_deviceName), "w"); if (_fid == nullptr) { - Error( _log, "Failed to open device (%s). Error message: %s", _deviceName.c_str(), strerror(errno) ); + Error( _log, "Failed to open device (%s). Error message: %s", QSTRING_CSTR(_deviceName), strerror(errno) ); return -1; } - Info( _log, "Connected to device(%s)", _deviceName.c_str()); + Info( _log, "Connected to device(%s)", QSTRING_CSTR(_deviceName)); return 0; } diff --git a/libsrc/leddevice/LedDevicePiBlaster.h b/libsrc/leddevice/LedDevicePiBlaster.h index e42479c7..35115e29 100644 --- a/libsrc/leddevice/LedDevicePiBlaster.h +++ b/libsrc/leddevice/LedDevicePiBlaster.h @@ -48,7 +48,7 @@ private: int write(const std::vector &ledValues); /// The name of the output device (very likely '/dev/pi-blaster') - std::string _deviceName; + QString _deviceName; int _gpio_to_led[64]; char _gpio_to_color[64]; diff --git a/libsrc/leddevice/LedDeviceSk6812SPI.cpp b/libsrc/leddevice/LedDeviceSk6812SPI.cpp index 5d10bf89..2c98a5b6 100644 --- a/libsrc/leddevice/LedDeviceSk6812SPI.cpp +++ b/libsrc/leddevice/LedDeviceSk6812SPI.cpp @@ -21,15 +21,15 @@ LedDevice* LedDeviceSk6812SPI::construct(const QJsonObject &deviceConfig) bool LedDeviceSk6812SPI::init(const QJsonObject &deviceConfig) { - std::string whiteAlgorithm = deviceConfig["white_algorithm"].toString("white_off").toStdString(); + QString whiteAlgorithm = deviceConfig["white_algorithm"].toString("white_off"); _whiteAlgorithm = RGBW::stringToWhiteAlgorithm(whiteAlgorithm); if (_whiteAlgorithm == RGBW::INVALID) { - Error(_log, "unknown whiteAlgorithm %s", whiteAlgorithm.c_str()); + Error(_log, "unknown whiteAlgorithm %s", QSTRING_CSTR(whiteAlgorithm)); return false; } - Debug( _log, "whiteAlgorithm : %s", whiteAlgorithm.c_str()); + Debug( _log, "whiteAlgorithm : %s", QSTRING_CSTR(whiteAlgorithm)); _baudRate_Hz = 3000000; if ( !ProviderSpi::init(deviceConfig) ) diff --git a/libsrc/leddevice/LedDeviceTinkerforge.cpp b/libsrc/leddevice/LedDeviceTinkerforge.cpp index 70e94e1f..b0c319ae 100644 --- a/libsrc/leddevice/LedDeviceTinkerforge.cpp +++ b/libsrc/leddevice/LedDeviceTinkerforge.cpp @@ -35,9 +35,9 @@ bool LedDeviceTinkerforge::init(const QJsonObject &deviceConfig) { LedDevice::init(deviceConfig); - _host = deviceConfig["output"].toString("127.0.0.1").toStdString(); + _host = deviceConfig["output"].toString("127.0.0.1"); _port = deviceConfig["port"].toInt(4223); - _uid = deviceConfig["uid"].toString().toStdString(); + _uid = deviceConfig["uid"].toString(); _interval = deviceConfig["rate"].toInt(); if ((unsigned)_ledCount > MAX_NUM_LEDS) @@ -75,16 +75,16 @@ int LedDeviceTinkerforge::open() _ipConnection = new IPConnection; ipcon_create(_ipConnection); - int connectionStatus = ipcon_connect(_ipConnection, _host.c_str(), _port); + int connectionStatus = ipcon_connect(_ipConnection, QSTRING_CSTR(_host), _port); if (connectionStatus < 0) { - Warning(_log, "Attempt to connect to master brick (%s:%d) failed with status %d", _host.c_str(), _port, connectionStatus); + Warning(_log, "Attempt to connect to master brick (%s:%d) failed with status %d", QSTRING_CSTR(_host), _port, connectionStatus); return -1; } // Create the 'LedStrip' _ledStrip = new LEDStrip; - led_strip_create(_ledStrip, _uid.c_str(), _ipConnection); + led_strip_create(_ledStrip, QSTRING_CSTR(_uid), _ipConnection); int frameStatus = led_strip_set_frame_duration(_ledStrip, _interval); if (frameStatus < 0) diff --git a/libsrc/leddevice/LedDeviceTinkerforge.h b/libsrc/leddevice/LedDeviceTinkerforge.h index d282c14b..fd086cf1 100644 --- a/libsrc/leddevice/LedDeviceTinkerforge.h +++ b/libsrc/leddevice/LedDeviceTinkerforge.h @@ -3,6 +3,8 @@ // STL includes #include +#include + // Hyperion-Leddevice includes #include @@ -56,13 +58,13 @@ private: int transferLedData(LEDStrip *ledstrip, unsigned int index, unsigned int length, uint8_t *redChannel, uint8_t *greenChannel, uint8_t *blueChannel); /// The host of the master brick - std::string _host; + QString _host; /// The port of the master brick uint16_t _port; /// The uid of the led strip bricklet - std::string _uid; + QString _uid; /// The interval/rate unsigned _interval; diff --git a/libsrc/leddevice/LedDeviceUdpE131.cpp b/libsrc/leddevice/LedDeviceUdpE131.cpp index 2df5a1e2..ae15ab9d 100644 --- a/libsrc/leddevice/LedDeviceUdpE131.cpp +++ b/libsrc/leddevice/LedDeviceUdpE131.cpp @@ -16,16 +16,16 @@ bool LedDeviceUdpE131::init(const QJsonObject &deviceConfig) _port = 5568; ProviderUdp::init(deviceConfig); _e131_universe = deviceConfig["universe"].toInt(1); - _e131_source_name = deviceConfig["source-name"].toString("hyperion on "+QHostInfo::localHostName()).toStdString(); + _e131_source_name = deviceConfig["source-name"].toString("hyperion on "+QHostInfo::localHostName()); QString _json_cid = deviceConfig["cid"].toString(""); if (_json_cid.isEmpty()) { _e131_cid = QUuid::createUuid(); - Debug( _log, "e131 no cid found, generated %s", _e131_cid.toString().toStdString().c_str()); + Debug( _log, "e131 no cid found, generated %s", QSTRING_CSTR(_e131_cid.toString())); } else { _e131_cid = QUuid(_json_cid); - Debug( _log, "e131 cid found, using %s", _e131_cid.toString().toStdString().c_str()); + Debug( _log, "e131 cid found, using %s", QSTRING_CSTR(_e131_cid.toString())); } return true; @@ -53,7 +53,7 @@ void LedDeviceUdpE131::prepare(const unsigned this_universe, const unsigned this /* Frame Layer */ e131_packet.frame_flength = htons(0x7000 | (88+this_dmxChannelCount)); e131_packet.frame_vector = htonl(VECTOR_E131_DATA_PACKET); - snprintf (e131_packet.source_name, sizeof(e131_packet.source_name), "%s", _e131_source_name.c_str() ); + snprintf (e131_packet.source_name, sizeof(e131_packet.source_name), "%s", QSTRING_CSTR(_e131_source_name) ); e131_packet.priority = 100; e131_packet.reserved = htons(0); e131_packet.options = 0; // Bit 7 = Preview_Data diff --git a/libsrc/leddevice/LedDeviceUdpE131.h b/libsrc/leddevice/LedDeviceUdpE131.h index 4c153822..5591b123 100644 --- a/libsrc/leddevice/LedDeviceUdpE131.h +++ b/libsrc/leddevice/LedDeviceUdpE131.h @@ -133,6 +133,6 @@ private: uint8_t _e131_seq = 0; uint8_t _e131_universe = 1; uint8_t _acn_id[12] = {0x41, 0x53, 0x43, 0x2d, 0x45, 0x31, 0x2e, 0x31, 0x37, 0x00, 0x00, 0x00 }; - std::string _e131_source_name; + QString _e131_source_name; QUuid _e131_cid; }; diff --git a/libsrc/leddevice/LedDeviceWS281x.cpp b/libsrc/leddevice/LedDeviceWS281x.cpp index 2ac10a08..47d80465 100644 --- a/libsrc/leddevice/LedDeviceWS281x.cpp +++ b/libsrc/leddevice/LedDeviceWS281x.cpp @@ -20,12 +20,12 @@ bool LedDeviceWS281x::init(const QJsonObject &deviceConfig) { LedDevice::init(deviceConfig); - std::string whiteAlgorithm = deviceConfig["white_algorithm"].toString("white_off").toStdString(); + QString whiteAlgorithm = deviceConfig["white_algorithm"].toString("white_off"); _whiteAlgorithm = RGBW::stringToWhiteAlgorithm(whiteAlgorithm); - Debug( _log, "whiteAlgorithm : %s", whiteAlgorithm.c_str()); + Debug( _log, "whiteAlgorithm : %s", QSTRING_CSTR(whiteAlgorithm)); if (_whiteAlgorithm == RGBW::INVALID) { - Error(_log, "unknown whiteAlgorithm %s", whiteAlgorithm.c_str()); + Error(_log, "unknown whiteAlgorithm %s", QSTRING_CSTR(whiteAlgorithm)); return false; } diff --git a/libsrc/leddevice/ProviderSpi.cpp b/libsrc/leddevice/ProviderSpi.cpp index e7d59e14..d78a4999 100644 --- a/libsrc/leddevice/ProviderSpi.cpp +++ b/libsrc/leddevice/ProviderSpi.cpp @@ -35,7 +35,7 @@ bool ProviderSpi::init(const QJsonObject &deviceConfig) { LedDevice::init(deviceConfig); - _deviceName = deviceConfig["output"].toString(QString::fromStdString(_deviceName)).toStdString(); + _deviceName = deviceConfig["output"].toString(_deviceName); _baudRate_Hz = deviceConfig["rate"].toInt(_baudRate_Hz); _latchTime_ns = deviceConfig["latchtime"].toInt(_latchTime_ns); _spiMode = deviceConfig["spimode"].toInt(_spiMode); @@ -51,11 +51,11 @@ int ProviderSpi::open() const int bitsPerWord = 8; - _fid = ::open(_deviceName.c_str(), O_RDWR); + _fid = ::open(QSTRING_CSTR(_deviceName), O_RDWR); if (_fid < 0) { - Error( _log, "Failed to open device (%s). Error message: %s", _deviceName.c_str(), strerror(errno) ); + Error( _log, "Failed to open device (%s). Error message: %s", QSTRING_CSTR(_deviceName), strerror(errno) ); return -1; } diff --git a/libsrc/leddevice/ProviderSpi.h b/libsrc/leddevice/ProviderSpi.h index 0d20cb4c..11b88ffb 100644 --- a/libsrc/leddevice/ProviderSpi.h +++ b/libsrc/leddevice/ProviderSpi.h @@ -49,7 +49,7 @@ protected: int writeBytes(const unsigned size, const uint8_t *data); /// The name of the output device - std::string _deviceName; + QString _deviceName; /// The used baudrate of the output device int _baudRate_Hz; diff --git a/libsrc/protoserver/ProtoConnection.cpp b/libsrc/protoserver/ProtoConnection.cpp index 42e8babe..add6c9f3 100644 --- a/libsrc/protoserver/ProtoConnection.cpp +++ b/libsrc/protoserver/ProtoConnection.cpp @@ -7,13 +7,12 @@ // protoserver includes #include "protoserver/ProtoConnection.h" -ProtoConnection::ProtoConnection(const std::string & a) : +ProtoConnection::ProtoConnection(const QString & address) : _socket(), _skipReply(false), _prevSocketState(QAbstractSocket::UnconnectedState), _log(Logger::getInstance("PROTOCONNECTION")) { - QString address(a.c_str()); QStringList parts = address.split(":"); if (parts.size() != 2) { diff --git a/libsrc/protoserver/ProtoConnectionWrapper.cpp b/libsrc/protoserver/ProtoConnectionWrapper.cpp index bc38e735..000918fa 100644 --- a/libsrc/protoserver/ProtoConnectionWrapper.cpp +++ b/libsrc/protoserver/ProtoConnectionWrapper.cpp @@ -7,7 +7,7 @@ ProtoConnectionWrapper::ProtoConnectionWrapper(const QString &address, bool skipProtoReply) : _priority(priority) , _duration_ms(duration_ms) - , _connection(address.toStdString()) + , _connection(address) { _connection.setSkipReply(skipProtoReply); connect(&_connection, SIGNAL(setGrabbingMode(GrabbingMode)), this, SIGNAL(setGrabbingMode(GrabbingMode))); diff --git a/libsrc/utils/CMakeLists.txt b/libsrc/utils/CMakeLists.txt index 2ee4c261..72ce2ecd 100644 --- a/libsrc/utils/CMakeLists.txt +++ b/libsrc/utils/CMakeLists.txt @@ -62,7 +62,7 @@ add_library(hyperion-utils ${PROFILER_SOURCE} ) -qt5_use_modules(hyperion-utils Core Gui) +qt5_use_modules(hyperion-utils Core Gui Network) target_link_libraries(hyperion-utils ${QT_LIBRARIES}) diff --git a/libsrc/utils/Logger.cpp b/libsrc/utils/Logger.cpp index 3c134538..93409e4d 100644 --- a/libsrc/utils/Logger.cpp +++ b/libsrc/utils/Logger.cpp @@ -12,43 +12,42 @@ static const int LogLevelSysLog[] = { LOG_DEBUG, LOG_DEBUG, LOG_INFO, LOG_ static unsigned int loggerCount = 0; static unsigned int loggerId = 0; -std::map *Logger::LoggerMap = nullptr; +std::map *Logger::LoggerMap = nullptr; Logger::LogLevel Logger::GLOBAL_MIN_LOG_LEVEL = Logger::UNSET; LoggerManager* LoggerManager::_instance = nullptr; Logger* Logger::getInstance(QString name, Logger::LogLevel minLevel) { qRegisterMetaType(); - std::string loggerName = name.toStdString(); Logger* log = nullptr; if (LoggerMap == nullptr) { - LoggerMap = new std::map; + LoggerMap = new std::map; } - if ( LoggerMap->find(loggerName) == LoggerMap->end() ) + if ( LoggerMap->find(name) == LoggerMap->end() ) { - log = new Logger(loggerName,minLevel); - LoggerMap->insert(std::pair(loggerName,log)); // compat version, replace it with following line if we have 100% c++11 - //LoggerMap->emplace(loggerName,log); // not compat with older linux distro's e.g. wheezy + log = new Logger(name,minLevel); + LoggerMap->insert(std::pair(name,log)); // compat version, replace it with following line if we have 100% c++11 + //LoggerMap->emplace(name,log); // not compat with older linux distro's e.g. wheezy connect(log, SIGNAL(newLogMessage(Logger::T_LOG_MESSAGE)), LoggerManager::getInstance(), SLOT(handleNewLogMessage(Logger::T_LOG_MESSAGE))); } else { - log = LoggerMap->at(loggerName); + log = LoggerMap->at(name); } return log; } -void Logger::deleteInstance(std::string name) +void Logger::deleteInstance(QString name) { if (LoggerMap == nullptr) return; - if ( name.empty() ) + if ( name.isEmpty() ) { - std::map::iterator it; + std::map::iterator it; for ( it=LoggerMap->begin(); it != LoggerMap->end(); it++) { delete it->second; @@ -63,31 +62,31 @@ void Logger::deleteInstance(std::string name) } -void Logger::setLogLevel(LogLevel level,std::string name) +void Logger::setLogLevel(LogLevel level,QString name) { - if ( name.empty() ) + if ( name.isEmpty() ) { GLOBAL_MIN_LOG_LEVEL = level; } else { - Logger* log = Logger::getInstance(QString::fromStdString(name),level); + Logger* log = Logger::getInstance(name,level); log->setMinLevel(level); } } -Logger::LogLevel Logger::getLogLevel(std::string name) +Logger::LogLevel Logger::getLogLevel(QString name) { - if ( name.empty() ) + if ( name.isEmpty() ) { return GLOBAL_MIN_LOG_LEVEL; } - Logger* log = Logger::getInstance(QString::fromStdString(name)); + Logger* log = Logger::getInstance(name); return log->getMinLevel(); } -Logger::Logger ( std::string name, LogLevel minLevel ) +Logger::Logger ( QString name, LogLevel minLevel ) : QObject() , _name(name) , _minLevel(minLevel) @@ -99,8 +98,8 @@ Logger::Logger ( std::string name, LogLevel minLevel ) #else const char* _appname_char = getprogname(); #endif - _appname = std::string(_appname_char); - std::transform(_appname.begin(), _appname.end(),_appname.begin(), ::toupper); + _appname = QString(_appname_char).toLower(); + loggerCount++; @@ -112,7 +111,7 @@ Logger::Logger ( std::string name, LogLevel minLevel ) Logger::~Logger() { - Debug(this, "logger '%s' destroyed", _name.c_str() ); + Debug(this, "logger '%s' destroyed", QSTRING_CSTR(_name) ); loggerCount--; if ( loggerCount == 0 ) closelog(); @@ -134,15 +133,15 @@ void Logger::Message(LogLevel level, const char* sourceFile, const char* func, u Logger::T_LOG_MESSAGE logMsg; - logMsg.appName = QString::fromStdString(_appname); - logMsg.loggerName = QString::fromStdString(_name); + logMsg.appName = _appname; + logMsg.loggerName = _name; logMsg.function = QString(func); logMsg.line = line; logMsg.fileName = FileUtils::getBaseName(sourceFile); time(&(logMsg.utime)); logMsg.message = QString(msg); logMsg.level = level; - logMsg.levelString = QString::fromStdString(LogLevelStrings[level]); + logMsg.levelString = LogLevelStrings[level]; emit newLogMessage(logMsg); @@ -152,10 +151,7 @@ void Logger::Message(LogLevel level, const char* sourceFile, const char* func, u location = "<" + logMsg.fileName + ":" + QString::number(line)+":"+ logMsg.function + "()> "; } - std::cout - << "[" << _appname << " " << _name << "] <" - << LogLevelStrings[level] << "> " << location.toStdString() << msg - << std::endl; + std::cout << QString("[" + _appname + " " + _name + "] <" + LogLevelStrings[level] + "> " + location + msg).toStdString() << std::endl; if ( _syslogEnabled && level >= Logger::WARNING ) syslog (LogLevelSysLog[level], "%s", msg); diff --git a/libsrc/utils/Process.cpp b/libsrc/utils/Process.cpp index 8005e919..83bfad94 100644 --- a/libsrc/utils/Process.cpp +++ b/libsrc/utils/Process.cpp @@ -3,7 +3,6 @@ #include #include -#include #include #include @@ -41,7 +40,7 @@ void restartHyperion(bool asNewProcess) QByteArray command_exec(QString cmd, QByteArray data) { char buffer[128]; - std::string result = ""; + QString result = ""; std::shared_ptr pipe(popen(cmd.toLocal8Bit().constData(), "r"), pclose); if (pipe) @@ -52,7 +51,7 @@ QByteArray command_exec(QString cmd, QByteArray data) result += buffer; } } - return result.c_str(); + return QSTRING_CSTR(result); } }; \ No newline at end of file diff --git a/libsrc/utils/Profiler.cpp b/libsrc/utils/Profiler.cpp index 70c207fe..c478fb06 100644 --- a/libsrc/utils/Profiler.cpp +++ b/libsrc/utils/Profiler.cpp @@ -13,7 +13,7 @@ struct StopWatchItem { }; static unsigned int blockCounter = 0; -static std::map GlobalProfilerMap; +static std::map GlobalProfilerMap; Logger* Profiler::_logger = nullptr; double getClockDelta(clock_t start) @@ -44,9 +44,9 @@ void Profiler::initLogger() _logger = Logger::getInstance("PROFILER", Logger::DEBUG); } -void Profiler::TimerStart(const std::string timerName, const char* sourceFile, const char* func, unsigned int line) +void Profiler::TimerStart(const QString timerName, const char* sourceFile, const char* func, unsigned int line) { - std::pair::iterator,bool> ret; + std::pair::iterator,bool> ret; Profiler::initLogger(); StopWatchItem item = {sourceFile, func, line}; @@ -56,34 +56,34 @@ void Profiler::TimerStart(const std::string timerName, const char* sourceFile, c { if ( ret.first->second.sourceFile == sourceFile && ret.first->second.func == func && ret.first->second.line == line ) { - _logger->Message(Logger::DEBUG, sourceFile, func, line, "restart timer '%s'", timerName.c_str() ); + _logger->Message(Logger::DEBUG, sourceFile, func, line, "restart timer '%s'", QSTRING_CSTR(timerName) ); ret.first->second.startTime = clock(); } else { _logger->Message(Logger::DEBUG, sourceFile, func, line, "ERROR timer '%s' started in multiple locations. First occurence %s:%d:%s()", - timerName.c_str(), FileUtils::getBaseName(ret.first->second.sourceFile).toLocal8Bit().constData(), ret.first->second.line, ret.first->second.func ); + QSTRING_CSTR(timerName), FileUtils::getBaseName(ret.first->second.sourceFile).toLocal8Bit().constData(), ret.first->second.line, ret.first->second.func ); } } else { - _logger->Message(Logger::DEBUG, sourceFile, func, line, "start timer '%s'", timerName.c_str() ); + _logger->Message(Logger::DEBUG, sourceFile, func, line, "start timer '%s'", QSTRING_CSTR(timerName) ); } } -void Profiler::TimerGetTime(const std::string timerName, const char* sourceFile, const char* func, unsigned int line) +void Profiler::TimerGetTime(const QString timerName, const char* sourceFile, const char* func, unsigned int line) { - std::map::iterator ret = GlobalProfilerMap.find(timerName); + std::map::iterator ret = GlobalProfilerMap.find(timerName); Profiler::initLogger(); if (ret != GlobalProfilerMap.end()) { - _logger->Message(Logger::DEBUG, sourceFile, func, line, "timer '%s' started at %s:%d:%s() took %f s execution time until here", timerName.c_str(), + _logger->Message(Logger::DEBUG, sourceFile, func, line, "timer '%s' started at %s:%d:%s() took %f s execution time until here", QSTRING_CSTR(timerName), FileUtils::getBaseName(ret->second.sourceFile).toLocal8Bit().constData(), ret->second.line, ret->second.func, getClockDelta(ret->second.startTime) ); } else { - _logger->Message(Logger::DEBUG, sourceFile, func, line, "ERROR timer '%s' not started", timerName.c_str() ); + _logger->Message(Logger::DEBUG, sourceFile, func, line, "ERROR timer '%s' not started", QSTRING_CSTR(timerName) ); } } diff --git a/libsrc/utils/RgbToRgbw.cpp b/libsrc/utils/RgbToRgbw.cpp index 4dd816c2..11aaa585 100755 --- a/libsrc/utils/RgbToRgbw.cpp +++ b/libsrc/utils/RgbToRgbw.cpp @@ -5,11 +5,11 @@ namespace RGBW { -WhiteAlgorithm stringToWhiteAlgorithm(std::string str) +WhiteAlgorithm stringToWhiteAlgorithm(QString str) { if (str == "subtract_minimum") return SUBTRACT_MINIMUM; if (str == "sub_min_warm_adjust") return SUB_MIN_WARM_ADJUST; - if (str.empty() || str == "white_off") return WHITE_OFF; + if (str.isEmpty() || str == "white_off") return WHITE_OFF; return INVALID; } diff --git a/libsrc/utils/SysInfo.cpp b/libsrc/utils/SysInfo.cpp index b098f389..92762ec6 100644 --- a/libsrc/utils/SysInfo.cpp +++ b/libsrc/utils/SysInfo.cpp @@ -1,5 +1,6 @@ #include "utils/SysInfo.h" +#include #include #include #include @@ -8,7 +9,6 @@ #include #include #include -#include #include #include #include @@ -20,23 +20,15 @@ SysInfo::SysInfo() { SysInfo::QUnixOSVersion v; findUnixOsVersion(v); - - std::cout - << currentCpuArchitecture().toStdString() << " " - << kernelType().toStdString() << " " - << kernelVersion().toStdString() << " " - << v.productType.toStdString() << " " - << v.productVersion.toStdString() << " " - << v.prettyName.toStdString() << " " - << std::endl; - + _sysinfo.kernelType = kernelType(); _sysinfo.kernelVersion = kernelVersion(); _sysinfo.architecture = currentCpuArchitecture(); - _sysinfo.wordSize = QSysInfo::WordSize; + _sysinfo.wordSize = QString::number(QSysInfo::WordSize); _sysinfo.productType = v.productType; _sysinfo.productVersion = v.productVersion; _sysinfo.prettyName = v.prettyName; + _sysinfo.hostName = QHostInfo::localHostName(); } SysInfo::~SysInfo() diff --git a/libsrc/utils/jsonschema/QJsonSchemaChecker.cpp b/libsrc/utils/jsonschema/QJsonSchemaChecker.cpp index 29afcba5..94491137 100644 --- a/libsrc/utils/jsonschema/QJsonSchemaChecker.cpp +++ b/libsrc/utils/jsonschema/QJsonSchemaChecker.cpp @@ -1,6 +1,5 @@ // stdlib includes #include -#include #include #include @@ -33,7 +32,7 @@ bool QJsonSchemaChecker::validate(const QJsonObject & value, bool ignoreRequired _error = false; _messages.clear(); _currentPath.clear(); - _currentPath.push_back("[root]"); + _currentPath.append("[root]"); // validate validate(value, _qSchema); @@ -116,21 +115,18 @@ void QJsonSchemaChecker::validate(const QJsonValue & value, const QJsonObject &s { // no check function defined for this attribute _error = true; - setMessage(std::string("No check function defined for attribute ") + attribute.toStdString()); + setMessage("No check function defined for attribute " + attribute); continue; } } } -void QJsonSchemaChecker::setMessage(const std::string & message) +void QJsonSchemaChecker::setMessage(const QString & message) { - std::ostringstream oss; - std::copy(_currentPath.begin(), _currentPath.end(), std::ostream_iterator(oss, "")); - oss << ": " << message; - _messages.push_back(oss.str()); + _messages.append(_currentPath.join("") +": "+message); } -const std::list & QJsonSchemaChecker::getMessages() const +const QStringList & QJsonSchemaChecker::getMessages() const { return _messages; } @@ -166,7 +162,7 @@ void QJsonSchemaChecker::checkType(const QJsonValue & value, const QJsonValue & if (wrongType) { _error = true; - setMessage(type.toStdString() + " expected"); + setMessage(type + " expected"); } } @@ -178,7 +174,7 @@ void QJsonSchemaChecker::checkProperties(const QJsonObject & value, const QJsonO const QJsonValue & propertyValue = i.value(); - _currentPath.push_back(std::string(".") + property.toStdString()); + _currentPath.append("." + property); QJsonObject::const_iterator required = propertyValue.toObject().find("required"); if (value.contains(property)) @@ -190,7 +186,7 @@ void QJsonSchemaChecker::checkProperties(const QJsonObject & value, const QJsonO _error = true; setMessage("missing member"); } - _currentPath.pop_back(); + _currentPath.removeLast(); } } @@ -202,7 +198,7 @@ void QJsonSchemaChecker::checkAdditionalProperties(const QJsonObject & value, co if (std::find(ignoredProperties.begin(), ignoredProperties.end(), property) == ignoredProperties.end()) { // property has no property definition. check against the definition for additional properties - _currentPath.push_back(std::string(".") + property.toStdString()); + _currentPath.append("." + property); if (schema.isBool()) { if (schema.toBool() == false) @@ -215,7 +211,7 @@ void QJsonSchemaChecker::checkAdditionalProperties(const QJsonObject & value, co { validate(value[property].toObject(), schema.toObject()); } - _currentPath.pop_back(); + _currentPath.removeLast(); } } } @@ -233,9 +229,7 @@ void QJsonSchemaChecker::checkMinimum(const QJsonValue & value, const QJsonValue if (value.toDouble() < schema.toDouble()) { _error = true; - std::ostringstream oss; - oss << "value is too small (minimum=" << schema.toDouble() << ")"; - setMessage(oss.str()); + setMessage("value is too small (minimum=" + schema.toString() + ")"); } } @@ -252,9 +246,7 @@ void QJsonSchemaChecker::checkMaximum(const QJsonValue & value, const QJsonValue if (value.toDouble() > schema.toDouble()) { _error = true; - std::ostringstream oss; - oss << "value is too large (maximum=" << schema.toDouble() << ")"; - setMessage(oss.str()); + setMessage("value is too large (maximum=" + schema.toString() + ")"); } } @@ -272,11 +264,9 @@ void QJsonSchemaChecker::checkItems(const QJsonValue & value, const QJsonObject for(int i = 0; i < jArray.size(); ++i) { // validate each item - std::ostringstream oss; - oss << "[" << i << "]"; - _currentPath.push_back(oss.str()); + _currentPath.append("[" + QString::number(i) + "]"); validate(jArray[i], schema); - _currentPath.pop_back(); + _currentPath.removeLast(); } } @@ -296,9 +286,7 @@ void QJsonSchemaChecker::checkMinItems(const QJsonValue & value, const QJsonValu if (static_cast(jArray.size()) < minimum) { _error = true; - std::ostringstream oss; - oss << "array is too small (minimum=" << minimum << ")"; - setMessage(oss.str()); + setMessage("array is too large (minimum=" + QString::number(minimum) + ")"); } } @@ -318,9 +306,7 @@ void QJsonSchemaChecker::checkMaxItems(const QJsonValue & value, const QJsonValu if (static_cast(jArray.size()) > maximum) { _error = true; - std::ostringstream oss; - oss << "array is too large (maximum=" << maximum << ")"; - setMessage(oss.str()); + setMessage("array is too large (maximum=" + QString::number(maximum) + ")"); } } @@ -371,10 +357,7 @@ void QJsonSchemaChecker::checkEnum(const QJsonValue & value, const QJsonValue & // nothing found _error = true; - std::ostringstream oss; - oss << "Unknown enum value (allowed values are: " << schema.toString().toStdString(); QJsonDocument doc(schema.toArray()); QString strJson(doc.toJson(QJsonDocument::Compact)); - oss << strJson.toStdString() << ")"; - setMessage(oss.str()); + setMessage("Unknown enum value (allowed values are: " + schema.toString() + strJson+ ")"); } diff --git a/libsrc/webconfig/CgiHandler.cpp b/libsrc/webconfig/CgiHandler.cpp index 3796f135..97af4f83 100644 --- a/libsrc/webconfig/CgiHandler.cpp +++ b/libsrc/webconfig/CgiHandler.cpp @@ -73,7 +73,7 @@ void CgiHandler::cmd_cfg_get() { if ( _args.at(0) == "cfg_get" ) { - QFile file ( _hyperion->getConfigFileName().c_str() ); + QFile file ( _hyperion->getConfigFileName() ); if (file.exists ()) { if (file.open (QFile::ReadOnly)) { @@ -110,17 +110,18 @@ void CgiHandler::cmd_cfg_set() schemaChecker.setSchema(schemaJson); if ( schemaChecker.validate(hyperionConfigJsonObj) ) { - QJsonFactory::writeJson(QString::fromStdString(_hyperion->getConfigFileName()), hyperionConfigJsonObj); + QJsonFactory::writeJson(_hyperion->getConfigFileName(), hyperionConfigJsonObj); } else { - std::string errorMsg = "ERROR: Json validation failed: \n"; - for (std::list::const_iterator i = schemaChecker.getMessages().begin(); i != schemaChecker.getMessages().end(); ++i) + QString errorMsg = "ERROR: Json validation failed: \n"; + QStringList schemaErrors = schemaChecker.getMessages(); + foreach (auto & schemaError, schemaErrors) { - Error(_log, "config write validation: %s", (*i).c_str()); - errorMsg += *i + "\n"; + Error(_log, "config write validation: %s", QSTRING_CSTR(schemaError)); + errorMsg += schemaError + "\n"; } - throw std::runtime_error(errorMsg.c_str()); + throw std::runtime_error(errorMsg.toStdString()); } } catch(const std::runtime_error& validate_error) diff --git a/libsrc/webconfig/StaticFileServing.cpp b/libsrc/webconfig/StaticFileServing.cpp index dc79e247..8389a6aa 100644 --- a/libsrc/webconfig/StaticFileServing.cpp +++ b/libsrc/webconfig/StaticFileServing.cpp @@ -45,11 +45,11 @@ void StaticFileServing::onServerStarted (quint16 port) { Info(_log, "started on port %d name \"%s\"", port ,_server->getServerName().toStdString().c_str()); - const std::string mDNSDescr = (_server->getServerName().toStdString() + "@" + QHostInfo::localHostName().toStdString()); + const QString mDNSDescr = _server->getServerName() + "@" + QHostInfo::localHostName(); BonjourServiceRegister *bonjourRegister_http = new BonjourServiceRegister(); bonjourRegister_http->registerService( - BonjourRecord(mDNSDescr.c_str(), "_hyperiond-http._tcp", QString()), + BonjourRecord(mDNSDescr, "_hyperiond-http._tcp", QString()), port ); Debug(_log, "Web Config mDNS responder started"); diff --git a/src/hyperion-framebuffer/FramebufferWrapper.cpp b/src/hyperion-framebuffer/FramebufferWrapper.cpp index 48ef4ec7..66568288 100644 --- a/src/hyperion-framebuffer/FramebufferWrapper.cpp +++ b/src/hyperion-framebuffer/FramebufferWrapper.cpp @@ -2,7 +2,7 @@ // Hyperion-AmLogic includes #include "FramebufferWrapper.h" -FramebufferWrapper::FramebufferWrapper(const std::string & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz) : +FramebufferWrapper::FramebufferWrapper(const QString & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz) : _timer(this), _grabber(device,grabWidth, grabHeight) { diff --git a/src/hyperion-framebuffer/FramebufferWrapper.h b/src/hyperion-framebuffer/FramebufferWrapper.h index b763b52b..6103d403 100644 --- a/src/hyperion-framebuffer/FramebufferWrapper.h +++ b/src/hyperion-framebuffer/FramebufferWrapper.h @@ -9,7 +9,7 @@ class FramebufferWrapper : public QObject { Q_OBJECT public: - FramebufferWrapper(const std::string & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz); + FramebufferWrapper(const QString & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz); const Image & getScreenshot(); diff --git a/src/hyperion-framebuffer/hyperion-framebuffer.cpp b/src/hyperion-framebuffer/hyperion-framebuffer.cpp index 2f920f81..c6fc396d 100644 --- a/src/hyperion-framebuffer/hyperion-framebuffer.cpp +++ b/src/hyperion-framebuffer/hyperion-framebuffer.cpp @@ -46,7 +46,7 @@ int main(int argc, char ** argv) parser.showHelp(0); } - FramebufferWrapper fbWrapper(argDevice.getStdString(parser), argWidth.getInt(parser), argHeight.getInt(parser), 1000 / argFps.getInt(parser)); + FramebufferWrapper fbWrapper(argDevice.value(parser), argWidth.getInt(parser), argHeight.getInt(parser), 1000 / argFps.getInt(parser)); if (parser.isSet(argScreenshot)) { diff --git a/src/hyperion-remote/JsonConnection.cpp b/src/hyperion-remote/JsonConnection.cpp index 25b0738e..bfb42f7b 100644 --- a/src/hyperion-remote/JsonConnection.cpp +++ b/src/hyperion-remote/JsonConnection.cpp @@ -256,6 +256,33 @@ QString JsonConnection::getServerInfo() return QString(); } +QString JsonConnection::getSysInfo() +{ + qDebug() << "Get system info"; + + // create command + QJsonObject command; + command["command"] = QString("sysinfo"); + + // send command message + QJsonObject reply = sendMessage(command); + + // parse reply message + if (parseReply(reply)) + { + if (!reply.contains("info") || !reply["info"].isObject()) + { + throw std::runtime_error("No info available in result"); + } + + QJsonDocument doc(reply["info"].toObject()); + QString info(doc.toJson(QJsonDocument::Indented)); + return info; + } + + return QString(); +} + void JsonConnection::clear(int priority) { qDebug() << "Clear priority channel " << priority; diff --git a/src/hyperion-remote/JsonConnection.h b/src/hyperion-remote/JsonConnection.h index 0cef3e44..5e1df5b6 100644 --- a/src/hyperion-remote/JsonConnection.h +++ b/src/hyperion-remote/JsonConnection.h @@ -1,8 +1,5 @@ #pragma once -// stl includes -#include - // Qt includes #include #include @@ -79,6 +76,13 @@ public: /// QString getServerInfo(); + /// + /// Retrieve system info + /// + /// @return String with the sys info + /// + QString getSysInfo(); + /// /// Clear the given priority channel /// diff --git a/src/hyperion-remote/hyperion-remote.cpp b/src/hyperion-remote/hyperion-remote.cpp index 1caaabbd..8966d946 100644 --- a/src/hyperion-remote/hyperion-remote.cpp +++ b/src/hyperion-remote/hyperion-remote.cpp @@ -67,6 +67,7 @@ int main(int argc, char * argv[]) Option & argCreateEffect= parser.add