From fb5d21719297e27fc8f033534259c016b4217210 Mon Sep 17 00:00:00 2001 From: Michael Chen Date: Tue, 3 Nov 2015 13:51:06 -0600 Subject: [PATCH 001/491] ZEPPELIN-389: Longer Paragraph Title will wrap to new line and interfere with code below This PR relates to: https://issues.apache.org/jira/browse/ZEPPELIN-389 fixing a bug with paragraph titles longer than 1 line. Current long paragraph title: screen shot 2015-11-03 at 12 16 26 pm After the pull request: screen shot 2015-11-03 at 1 15 35 pm Author: Michael Chen Closes #388 from MikeTYChen/ZEPPELIN-389 and squashes the following commits: d4daad0 [Michael Chen] ZEPPELIN-389: longer paragraph title --- zeppelin-web/src/app/notebook/paragraph/paragraph.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.css b/zeppelin-web/src/app/notebook/paragraph/paragraph.css index 4cb38de6a4f..79725ef9251 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.css +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.css @@ -178,7 +178,7 @@ .paragraph .title { margin: 3px 0px 0px 0px; - height: 20px; + min-height: 20px; font-size: 12px; } From 2d893abafad4ab6309e532b1134435c1991b0659 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Wed, 4 Nov 2015 03:21:16 +0900 Subject: [PATCH 002/491] ZEPPELIN-386 provide links to individual bin/src artifact as well as signatures and KEYS This PR addresses https://issues.apache.org/jira/browse/ZEPPELIN-386, by provide links to individual bin/src artifact as well as signatures and KEYS Current download page ![image](https://cloud.githubusercontent.com/assets/1540981/10917324/82d05766-82a3-11e5-9bd3-f60ff694f01f.png) After applying this PR ![image](https://cloud.githubusercontent.com/assets/1540981/10917314/76fce2e2-82a3-11e5-8e6f-41a9da386317.png) Author: Lee moon soo Closes #387 from Leemoonsoo/ZEPPELIN-386 and squashes the following commits: 8dc6581 [Lee moon soo] ZEPPELIN-386 provide link to individual bin/src package as well as signatures and KEYS --- docs/_includes/themes/zeppelin/default.html | 9 ++++--- docs/download.md | 28 ++++++++++++++++++++- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/docs/_includes/themes/zeppelin/default.html b/docs/_includes/themes/zeppelin/default.html index 50e97108d5f..29c2be27457 100644 --- a/docs/_includes/themes/zeppelin/default.html +++ b/docs/_includes/themes/zeppelin/default.html @@ -24,7 +24,11 @@ - --> + --> + + + + @@ -44,8 +48,5 @@ {% include JB/analytics %} - - - diff --git a/docs/download.md b/docs/download.md index 28f3e413489..c05eb56244c 100644 --- a/docs/download.md +++ b/docs/download.md @@ -12,7 +12,33 @@ The latest release of Apache Zeppelin (incubating) is *0.5.0-incubating*. - 0.5.0-incubating released on July 23, 2015 ([release notes](./docs/releases/zeppelin-release-0.5.0-incubating.html)) ([git tag](https://git-wip-us.apache.org/repos/asf?p=incubator-zeppelin.git;a=tag;h=refs/tags/v0.5.0)) - [Download](http://www.apache.org/dyn/closer.cgi/incubator/zeppelin/0.5.0-incubating) + + * Source: + zeppelin-0.5.0-incubating.tgz + ([pgp](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating.tgz.asc), + [md5](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating.tgz.md5), + [sha](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating.tgz.sha)) + + * Binary built with spark-1.4.0 and hadoop-2.3: + zeppelin-0.5.0-incubating-bin-spark-1.4.0_hadoop-2.3.tgz + ([pgp](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating-bin-spark-1.4.0_hadoop-2.3.tgz.asc), + [md5](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating-bin-spark-1.4.0_hadoop-2.3.tgz.md5), + [sha](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating-bin-spark-1.4.0_hadoop-2.3.tgz.sha)) + + * Binary built with spark-1.3.1 and hadoop-2.3: + zeppelin-0.5.0-incubating-bin-spark-1.3.1_hadoop-2.3.tgz + ([pgp](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating-bin-spark-1.3.1_hadoop-2.3.tgz.asc), + [md5](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating-bin-spark-1.3.1_hadoop-2.3.tgz.md5), + [sha](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating-bin-spark-1.3.1_hadoop-2.3.tgz.sha)) + + + + + +### Verify the integrity of the files + +It is essential that you [verify](https://www.apache.org/info/verification.html) the integrity of the downloaded files using the PGP or MD5 signatures. This signature should be matched against the [KEYS](https://www.apache.org/dist/incubator/zeppelin/KEYS) file. + ### Build from source From dfbc0e690c1dfdb6533207a98ef814ec79bff01e Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Fri, 6 Nov 2015 13:16:51 +0900 Subject: [PATCH 003/491] ZEPPELIN-396 Add -Pypspark profile for release binary https://issues.apache.org/jira/browse/ZEPPELIN-396 Add -Ppyspark to enable pyspark in default configuration (without SPARK_HOME specified). Author: Lee moon soo Closes #396 from Leemoonsoo/ZEPPELIN-396 and squashes the following commits: 4e599af [Lee moon soo] Add -Pypspark profile for release binary --- dev/create_release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/create_release.sh b/dev/create_release.sh index 833753c4619..3d5a61cdbf7 100755 --- a/dev/create_release.sh +++ b/dev/create_release.sh @@ -122,7 +122,7 @@ function make_binary_release() { rm -rf ${WORKING_DIR}/zeppelin-${RELEASE_NAME}-bin-${BIN_RELEASE_NAME} } -make_binary_release all -Pyarn +make_binary_release all "-Pyarn -Ppyspark" # remove non release files and dirs rm -rf ${WORKING_DIR}/zeppelin From a4db1688c9ce0a172722e289171e82099a43b55d Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Fri, 6 Nov 2015 13:57:13 +0900 Subject: [PATCH 004/491] ZEPPELIN-397 Activate spark-1.5 and hadoop-2.4 by default in release script https://issues.apache.org/jira/browse/ZEPPELIN-397 Activate spark-1.5 and hadoop-2.4 by default That'll enable use sc.textFile("s3...") with default configuration without specify SPARK_HOME. Author: Lee moon soo This patch had conflicts when merged, resolved by Committer: Lee moon soo Closes #397 from Leemoonsoo/ZEPPELIN-397 and squashes the following commits: 9855dde [Lee moon soo] Activate spark-1.5 and hadoop-2.4 by default --- dev/create_release.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/create_release.sh b/dev/create_release.sh index 3d5a61cdbf7..63fcbade273 100755 --- a/dev/create_release.sh +++ b/dev/create_release.sh @@ -122,7 +122,7 @@ function make_binary_release() { rm -rf ${WORKING_DIR}/zeppelin-${RELEASE_NAME}-bin-${BIN_RELEASE_NAME} } -make_binary_release all "-Pyarn -Ppyspark" +make_binary_release all "-Pspark-1.5 -Phadoop-2.4 -Pyarn -Ppyspark" # remove non release files and dirs rm -rf ${WORKING_DIR}/zeppelin From e3e61832bcaa3fcce5b1096a20180631c2a8d6e8 Mon Sep 17 00:00:00 2001 From: Ryu Ah young Date: Mon, 26 Oct 2015 10:31:32 +0900 Subject: [PATCH 005/491] ZEPPELIN-338 Add documentation for Ignite Interpreter [ZEPPELIN-338](https://issues.apache.org/jira/browse/ZEPPELIN-338?jql=project%20%3D%20ZEPPELIN%20AND%20text%20~%20%22ignite%22) Add documentation for Ignite Interpreter Since the last PR that I opened few days ago has some problems, so I create new one. I read all comments in the last one and edited below files. Author: Ryu Ah young This patch had conflicts when merged, resolved by Committer: Lee moon soo Closes #359 from AhyoungRyu/ZEPPELIN-338-Add-documentation-for-Ignite-Interpreter and squashes the following commits: 6ae854d [Ryu Ah young] edit 'next' to 'binary' 3e0509d [Ryu Ah young] edit next to future 1acf2ee [Ryu Ah young] add explanation about Zeppelin binary release to check ignite version 814d8fa [Ryu Ah young] add explanation about Zeppelin binary release to check ignite version 8689915 [Ryu Ah young] ZEPPELIN-338 Add documentation for Ignite Interpreter --- .../docs-img/ignite-interpreter-binding.png | Bin 0 -> 79676 bytes .../docs-img/ignite-interpreter-setting.png | Bin 0 -> 63120 bytes .../zeppelin/img/docs-img/ignite-logo.png | Bin 0 -> 287178 bytes .../img/docs-img/ignite-scala-example.png | Bin 0 -> 198682 bytes .../img/docs-img/ignite-sql-example.png | Bin 0 -> 51647 bytes docs/docs/index.md | 2 +- docs/docs/interpreter/ignite.md | 116 ++++++++++++++++++ 7 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 docs/assets/themes/zeppelin/img/docs-img/ignite-interpreter-binding.png create mode 100644 docs/assets/themes/zeppelin/img/docs-img/ignite-interpreter-setting.png create mode 100644 docs/assets/themes/zeppelin/img/docs-img/ignite-logo.png create mode 100644 docs/assets/themes/zeppelin/img/docs-img/ignite-scala-example.png create mode 100644 docs/assets/themes/zeppelin/img/docs-img/ignite-sql-example.png create mode 100644 docs/docs/interpreter/ignite.md diff --git a/docs/assets/themes/zeppelin/img/docs-img/ignite-interpreter-binding.png b/docs/assets/themes/zeppelin/img/docs-img/ignite-interpreter-binding.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e10d52b7d902987b35a97cef9df5bd4fff70ad GIT binary patch literal 79676 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 literal 0 HcmV?d00001 diff --git a/docs/assets/themes/zeppelin/img/docs-img/ignite-interpreter-setting.png b/docs/assets/themes/zeppelin/img/docs-img/ignite-interpreter-setting.png new file mode 100644 index 0000000000000000000000000000000000000000..06674bff9bdcb5ca5d729b0c8085585710801437 GIT binary patch literal 63120 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 literal 0 HcmV?d00001 diff --git a/docs/assets/themes/zeppelin/img/docs-img/ignite-logo.png b/docs/assets/themes/zeppelin/img/docs-img/ignite-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..97a63e8096714103bd79fb2919a15d5aeceacb8b GIT binary patch literal 287178 zcmZs@byQrb0w@s;i!=rz3z$GUzD8C{R#P=(1lVRiU6@1)-o|WRVcwpTyLDQh6Vs zomFMTp(-ax58wYFJABc0hJqsa@Xrt0B76FMiYSz_R~h zCN_X(1BnkNRy3SuGG7KWSr(sF|Aa#}JXLzZIH%RxteC@TW-&h^?l+1i&7qcqo9))} zo525>6+koDft0hu#lzERpO>Z6B${KRBVR4mh9Io|CC+>&sDoFxhh9 zy#LQq|5@>$!G#-6Z|Rd*L>}WTBCW+Ce2mjr0g=;ExLTodud()Goz-puoNN*;O1hNT zq2vG0Wy%s&4$Cfw}j;r7}5z#5*#|?q8uj zTL0G$xv;^!9tL8tKq;@i%WWj~{j)z&+98c7u3zMqZPO{G?(XxBiUg6U2AYAGmK)1VPYgYc7Nr~O66|@9p)((W+)W^AM9N5)xvw zg;lrY1q1JI12H7@41zdx3X^l`t^?&X=k51dKKFmtlffcS3dxys8s8MNeDAcEtikO& z*I+d-wc?}e zU)B|$z<~QUJ(o+VtBYRD(LPxmvoR2RtANY2EPbi5%SAWh@e#PXFnm~s!v7<>krZnG z(XOU`3MSwg_`CN$c!mF8ZjBEn6CQfKF0rn_Ye+27VssJ02`e?TmND1+TV~zRn5Uvh zXRYEWle54xI#W=>Et5ly7&RxlCm5o2GOuNVez?$NFc3@3S-ZTfBTQc3`df#XAhcb$ zTQ62Uca6K<72dKd09uto;gpXU+DpS2Sde2vF;P3p!lbUQ{<|KHh(i*OX$=R_+=+qr zdT&BaYJX1CAlZH0TT|cnR6UK~*?gb?!|U$pVtXy)6jo<(@~R#3H1}W5@jtH8(jLy| zw+QMMsH%eBB$iZ&hCyH|VQj#eU}$<%>kzWJ5eWFq32e+{lmG2y3MdG$v<^ zHbh$`p@Vbg({KfjXlNP16A5`#ubG(NU+%=IV;h69M{qHA ze>D5je%ZVL{M!=ALIToj%%HQ*4>GXt4x?>$`WjfjDFSWqS;|w25f?@X+P&mlFZ8QA zM6h<|jlB@zjaK<%t~LThIGS25=3!BRTzBjK{zhg4q~Yi*zW1xY`*IfB-mS9LAY2{f z|Ms+g1@?bcla3>=C=>R7`nzsAFh=BbT+#H~xaT!vsm@#;Ty1cW_2)dkINM8SasB$l z89b5`7`zk1yZ#gKdKq`MRGfYIQg1a=AhHwOi?rsqZ@YRQymdWNRyAaB28m)WF~}KF zmyihdd8JgGfqX{ElImS;UQLMqPo^O|}3=B6TrT*t5BlMtD)J5}{> zDa4BMV_zg^!nNLt)o58yz-V(KJuIy#Ih&8da(a(i2R{yd8^!opbI$rxKt0l_;(|E= zFX%0lLLu?Is=j^<8AaI@7!c{mfC?%UzMWOOx|vZfgAhg{7FmLY?=x1eQ@v+#(Q&wO z=`{?=eGbIbIesW{M_D_W@7Mi1e@(~h^AsYg@%i<|1c&+jzhOo_ zJhZ0Uhl83<^Vv2j4nuY(o_KU!&eh3_*Yw2VQ6gWj;o0Ty{N9jUr=5|mszJ|xV z6^Lm)olTL2Lip=ZS4T0tIH4|E=T)*oKdTXSyWd?_bT{vnyfQvrT&Rki@@EMYy4@Z&k!0qs6>XT6@#p&C&u-_v)Xn%<@$|81R=NJ)bH5ke@=YEX3&YkUX= z6TJ^+IA)-e5cdeOxAB1bRapj*K$bPmaZU5c6Aq=m_kYS;k5vyoup1P(c0e${` zIH}VQ^5XH{cS~`Gj2gV=^-yniJkC`esVtum{XSJo*N&&oF6V2%KlAqbwUQqv{5vwK zuv3yc^SM6=9@RyiISrj{OEhvG1*cJG9?y}+eil2)osAi%tR3V+yrTBVrpLGrKvbX}sbnnj87PASlj!JREvQS}~;;wVS)qpRuN>Gouj zV(mJ3Ahm(uN=cZ`ACfUOgTP0XR09_U)pO01%DGYzU6L5p11;RJ=`t&Brooc+gP>yr zp84_CT0p_ld~siQebVy@UeM>qqiE({nzi*{uIiSu_RRj3yg*s+@cphA0>Oh}#wS{y zdiG^U@BLyuK6TZ$-Q!%wPpMKDK`;r&qE=BwzXy%^sZZh$u`w7QPMwVGN4tn2uPD7c zCvhUlcqFN~7|eQc)mL?=&)Qdy#p+Hnd>c7MT^q)mgwgz&r}O|wM0wlQ$X#oHa(4^{ z0lfLsX;Z5I+wuDM+5s^*9xQggs`_a;r{~MT(s2#^tSfP+wC(&<=E>b7X4jcDp2<+13HkA6G2_7THy z17tfY!;v}hs4y5dJ$R%ut)k(xZuxj~C|eZ-P8#MIWzK&HA_0Hv4rGx~MIA9ar31x=kBrFT-LAQPx+SRXKnRGqypB2?|zLo+;fSZ zTi7%(WQk>%p80b^Z;^j)iZw4{=zc@aMaHr<5&z-#VePn3Y}v%w?_fsP*?OWY@i!gM zD*u?Tyn6(aR$8Qb4x6C_-v<+g=Tq#hJbVmY##&8wqB$pkY8(s?Ul>qkbgV1pI7GAP zMU>)18-y7Zc z(k#9clYIi3ZdZLiCnUub-T^LsKdwmmVXm@G%@0XR+?|r4u-%kdB1SNjC*3s)lWkU?03jgkDzq&v~kjY$1iHHlfI~Bzd>$ zZovQceBBU@M6oSJ%5y=PS|8>*Km@@-mcV{R z`WIiwqczJc^c;tubwy6vH%&c)F^w+wi3dkHL1|IFbe>&ckKnbfO>%%z^~$?uamNuD z_|&A(z_ee&lVSLE!BYM7`x$KVdj9sRjMwcvAuOX@CAla!5A8uqmN6FtLhKboUcNvS zl4j-=XKC5_kg50hu6p$AkMm6&R*6N0${ZJ=+ot2!tb7Kq9>)~BE&JIsZuTx=OfG%k zg1I=q8=3~j4YEiKicWF@xR<6iFZl_9W9AnJZo;2gyMK?GcDaX9Zyq*l=iG58Z|8LZ z(Ygdf+7?-bPjZ+d4?lBED_NgTJF_cy5)c5+!}VJNaEckcs58HqaNOuK9D*1<>&(Ze zJyiPcR_zUTZ%f~ER>NNvD-~J&&yHa5Rj=?facroi3A2gK=g(VPYZ;gDpU($FuRbc% zXL%R{9rlh6D>@%{t9D`q&xbb5&E!ezQMaeIm>2N+-Tv4%%?wYQ5=VR1%PXaG!!I6j z)DPs(0ea~cIB#mA9DD3XKR4ob*bjxTv9}NQH|spNHE}ibTDT@zl-*ynPiW3hv7c;S ze3ra3p@&po_NLCuG;6yG54k zE}^=bPdds$QcU&Zzq>%wX#+N5P|#*hHWfx_H`ZH1WjGC>$xpK%D@)|FJMuw!dm8gP z?R+_H?zql8x0H}{94b0cK$4N~e46;PY*p2|{9C@9i}GaZ;lbe(**6;jNiVJ|o0tz` zFWrdbUjvicCC6gV-*Zd$C@=6BQaC-EMBVJP{NZm&g}##|yFX`iO{;#o&#m$+Y8}nl zuQ$ctc?i>`*we#)sx%pA{(1~G#;CJZ!($Rq(^v)_ZvByOZn@q&Vy^H_a)V%xjuKl} z=6W}S*n7s}+qIGi=;F&mssWL{nl2q}#Tbeid@2@Kp!V+^_VH}aFA)|vlM-BuE&v7ZcF{azOKJcn?d2|O2h zdgi>9SmZ`rl_s(K2oO3BC*Chi)n|NrPp;};X%0v|cjCQBg*Y9OXk>bH|7vM<0z1|E zp9)iTbflR9;+IrP<_c*oy+$9nzK5!)u9nH>h*`cqUxOPmr}hvrkj$MoDPXD1=CU}; zW6%}Fu_@>~-m~fkmXqpUjNf03^CAPnJsEw2&ZyA#g!nv68&U%nuIzb9zaC%zeO>drsAL<4@}}?5OMj4)Qxr_h1t&)-rY{@1tSnW-4T}f1An0 z2w+`*%d=5P+jNm%eIh)9ii9zf(Mv+T^*#i4dWR)@KWd1KDg34K^Qc5EBVI|A(YOae z!dPa=VaaDdCD~p{lZ0h?$v<8g?aKPq-e#hhjsTD{Zl>_hL9PQOo*cIy^elVF!g?uu z66omNdNAom4V7Df`XD?_bxo^p`J@gZVxB!d#48j0Po)23*E&V(e0L-QHFq!P{sx1k z&@YHz-k@Lbytj64!0}Acv&pOuAq0=i%OBSxO{8M(3%ZZSe|AgYVm_CgU%VgrOrOqn z0+q>xuE%DUF{w8a+>>|)IwkY1Ak^vcQmGCY+QY+n%+=XfiQYcAWH$WCDP99vMjl}cX?5n`SItNZlyb^v<{>FYs|N!82^I&3 zs3mbp5@2#81yrxNv`^H<2aIg%oM?pc?ngNTBqA@}$jxo}N_ESnhlqaNamhwoL0Q7X z*Lz^KF~X`_k_amM4Mp-q6B19i1)g`nQg&l-WFlkoaJ_aGir*cjXEv2n8d=r1kIOc^ zI-zbk1m5YCLt>|t%6A9Th!s3)w7VBlI%Agkc!DyM!f7%3t@m;Cc0-2Ep1%3 zyiZzW6n@t&f|9z`PQIiMWR4rHIV`NY9|lMjdp#J1mxWBy?q~eS{M=XNpc@ONOlponB&szqw1O%m8s!=4{#UGyM zs{9HwSqF1zpf<7Klm$<@b|dC+LR6hu+b)8xVBXNa)Z{DFwS4@>^J~6?h5}85KGP-P zmy3=N12#d1f1uFi4vqkc|3)C<@0?fwEKc2B9N@KiUUQAAkHSx~q;3;VTm!$f3{8LI z{yj}lg*VK?o{oDOaCGVlL^SQG<+wj4@vqn`AkcFNEPqLEh)^Z#5vkijO0>vwEV8ND z#osI3bKGc~k|r6(^t*uljCuVGZhuoD$2LxQFze-)HMzv~HoGYFqxN{cYwDcqeocsC zjkg`J&9_a3RgLA_Lc%+WAPGFV=Y7+!>^$@0zJ~tO+S;m68z+1R+S}Hp_m%$#P(vj1 z`H3Q5R@K=0ycK3J)Or5W)b=`X{QJuX0y%z+%~%dDHT}mtCV#KO6~Dn#r<*Am>r9?H zZCtD)fgofQBEgS{7{s8>z?UB&s`K`RwdHd*st^ZBqU`6@M6=mQgL!+nA$oFuaSY)T zVBxCwdHd~?87ZU_qRE^3*S_;xD3t~Th%g?{gTk@d4P%tfW4jxaCn-!xaW~OZ)INQ0 zT-*BM_O~qO{?WSXm>$|~&B}sXidwiMeSqFIl6ksqlHG2y#=JVgNGx(?6l;rC=k>r5 z6jK3%`QDn>^=Eao2k8}}_Y}f7@3mIUak z2Q-RYIEy-PT;+Re&A6zl#5dqHKnptM=Ct>BjTW&7Ywdo|yG z^N$aMVKjEqspB9Sy@Fc;-TGe|5nLD&d#%h~6gV@#UUc3hXjnwcRXY76VF-xZJB1Be zTsQke63qa};CYL{OOE*#sG|!`y!?s32n4*{6a%cjnKvZgDZIhNUDzC| zxR+i>t0YZHV2TvHpwhirWIH#uJ#0nkC^68^5+%`H^@LE30JJvsJ$Lac?31u#Z{oFo zq@R=gO2by-( z!buReIY|3;uF9X5YkrY^RG~NmD|PMkf#N5&pS%-dV#p~9`(7p;j5u{_)1y~Q;t*K#@PEv zgnHnTb>xOrdrpNClupL{jE*4K`!*&}yM9J&X*6h6&*)$ggMYgINHZ{9r_n zYzwLDj*5U9kJpVQ8JjFl_ttw>IUkr92yaIG*I(du5gRj;4+R&736O-9P8($EYf>L2^O6Kzkj7Ijg@`5|D`Dh*^&}qPuhNe9Ej8A@v@s5rDOUMSrIG$X?B{J-jg} zxD3r%&%mjv?^?JQMO-EJf*E-LLK6MTqdN3ejSh9fF7VE45?8|DRU z6}(L)x3NXZ`UV)ViOcq8L~zCN9})Hw<>s>_!E@GxQ}{JACX&YXP{v&a_819qq*J&g zP=4e&oyh_8&6BShp_rb-Wc$WBvI1fR&0;BS%$tX3U* z(RDBTb=!u$p)GbiZQBOttJCS?>hEVgLiNcfW5HL@>4m2+N_MFcaP! z{*~D-CeOv1w2xO_W_!7lrOzsOVS&N9jdKhBAadCo!QpmX(|TkIu~%#XVs_Wr6$%(l z2X=T5+z|aXr3{%`E0G`jLg9L&;`DO6P)6DDwBWWdBcu%t?~IFpOQs+J7JL&TlVPx5 zhVkLlmTKvIkNN~OHe}jO5FXQtv!|RS*+OC;940N(!kz}OFgec|1a63KERbHxs%l#A zxOMFs3K<2Gpo_#v>w~W((;qqwp0fwu%Nnmrqd#0ec^~mVDIdmJ_R3JW*57#>pnH=8 z{ZzuV*v-^K=ThzckN+}KUdQk`)VNi~6I_N12zpE!rUC3blti>UyOP~R$q(FRxBsla zRH9Mv=*_&Hxp$O_a~+z*_Jg9J#^hL0u=!NY%Z-hDqQ#ZoS}vtYcs~tOee)>thdiyn zRr=zTB_yr7F6bA(09*s{LVoERR00#ZM_`H<;q@5QM9c!G!$e~v=$>REvTFi_J1r1H z<1b&&{h$6QDG5RP5^Kk5M~8~iZGS@wd>FzJ&-^JlwSPy10P6X#>|Z)=U*7YT4&7(H zVH|)%fnDCS`odT1KW5M39Y$OD{U1ov_(JIE8i!atYh)P|@=O1e!_aW5fYVNl^P(O{ zLMUxbGF|86TU!OxABPZkWtMUe*i;6ZgRW4=Bj__qP0dsv_K~dW6-}U=`xzAx}WYiL=#J`J3K@sc@D&}C3>v9a63}84% zlz1?8aKHe9teT~Y27|JI-(3YWs8jT;{a)Ym__PUElL_-`qFp#q`X$IK(^cw+X%R>u zw1>;)fh{I(Np89!O%!g7-DKcE1kt<{3jx_AwmBkI+X2BGqcI@$uiYO-cy^D^+14YN zbw6E=CXJ+VPF~+DBj2+&$krA&+O|sYT<4DRWsRWFf)?bMs%BNKP=nZDXm4ZLYVw7n zF(O9^W;%dISrXVe5`5A_+iPRk^SbWBOCE_ayAXn`1t*iP{tgP96aoV;6-d{~5A}R4 zM@e8m+KIv2YbpvLNg|rlYO+#E1Y*iv18V^%sj&|#RA7{5f2(LggncBxnyaoBgJ*xl z6j4>+r^%^73{giz@KfLd;<9!=JFPm5en%BbP|lbWI~$IglRtCpgpAvBP5e`W8-)*q zkqT-B4{J{5@=?1~Ylhyz+B4LGq-^UirHL_Y?AtD-@w9-ihpgSNF$?RHd>8(EOBP?D zETo{FmCd(R#vI3}X`lk>nYfW6XHju!;RJc`u6>rwQcEj@A%%VwZ6hP91V@yKTveeL zoh_HVzXrCIg(`#iB9nL3aTvESwc;@~QcG|QBPm0sn~YZ@TLX#x4mD*$1nS@Xo{q}_ zzQ^rvEt*fh&p@p>w2@`RbN?I|mc=EID6!!vCnV|^$FJVReB5#6db^!}R2K}iZ$udZ z;834PiIyNLi};P3BGX0jCHZS4yn2BR8lqJ;9yS@WWypOc&o|Q>#=Be)OU4MP${d^xz z?)ODArQ7n)X?habSz3YQrO7((S(X1&+4J`K8!$J`LLon=m)$BjG?Z+thmqmsyf;p$ zd{_Ai&fg(!G|>AA8`I=DSyR9CmT;FWTwI)QOB6a^_;T#wviR@od(7c8=}&D~2NM$1 zJzT+#Fu4&|E7@Uru2B00xy{yG*V3P9>3wF^8nbzsT*uPGX^M_T^ga@V2cu?@%qp{x z@_(&-bjW2cBh#3noLC>26m{koutLy57+qxFxVThC$SIJZ>R#jFDGo%S65!dac0kjc zFF9c5VBwOkTWE4;uHYz}{FRJH%qnga#U2Ns{2@#j$_g3G~X2H*oeB4VzuoR{2i(~Ut1Z49Wx5z40{!LT$72k;0Cfo zU^xgMYUd2(%QhNXeouD~S~-EMG>6^<&pYyiPkCeC!p?9^st7$Lu_WXB`XTwB557wk zREza`J4i!IS`Nk|Fqsr*_(Y=Uf%J3X>_`;8XxE4m8D7A_D##8o)y<7TZT&!`3gn4U z?HViR$Nf5{V)p<+_cC+nZ3}S=ua*&T%=+Z4;f`IqiI*rtCyd3Vm1d1IG4RzzYDjWe zN=r2GV|Km$m4tBLrI_(m08rM~xIgMec-A&a=!p6JGypbAWFoZzwdX2pNoma&8zWR~ zvbr@kJB^{n$q)k?L5wyQ5gOKyq-TU8mdI+yL1qMIY!kIG@Fi@X9Dt021%kP>VcK!b;?AXh1->009k~=`8kS#NaW>tHc$X33 zcpA;Y7G_hNf*QYQ|HKT@dmt2Ysc!VuxF3(#yprf4jwIzkdP6f9m2w@^U zft&L{>G>imP4+L_6&&0rGJT|R$yTIt7~bj!y$%;Wn24RTRJbo-@jnReBe8hQ8sjB6 z8W;*$*s=A<#Q>D1WR`Mz1~3D6`EpLZ%6$ZZAE?5jC&-alrZbY_&{+%ZC3?>23e#U` z26MZ*K4AWcz(^KHW=YiAHpc0reH$k+ZS*Tv7SDGKuMsS5nCLARW8$qoG3CzQ0yOjR zlbPIX6OKUN7SMQi6@L%=r{FYv^C*SoK3rWzliDs`KiIi81P=)*7URlK5UEy{bKvpk1%WyZeS6_X(GwH5cD1&3I(! z2y+`HlGVj<+>~8|Ur3GqZqWpj|Eh$>bql&JS4^eH_i?E>lKrro(@%p=4(mm%hIT@& z2L(G;uGIYCfc8Qfxxw@X29HsopOF z#7LY8HbsRrJTm(x>5Hdi3pS1=02^9uRB**AlY~XOZK*4`{Vu8M^p#tY<5gm#kh`v7MnU_G`3{Ds|d7>%997AR)abw*l8XpXck z7WY6z3CiR(3qpVGTlh}k!4*ovNp)dtNK2-nQ$q6|j8q!hIj(Xq3|m)q7S$P?V2cs< zJ>$5qwd@}%usf1^_Qlt({Mh{}+UO>hfuwg_*;I*fHnvP9dYzT#qcoLY;cJ#zb+9o^ z>GkTl&!lvc3{z|y3=;wj5by1heMH)Qpt@mWGkNVdM0*3RPwFpnhI0fiVT;oi>48Mr zUgrOLee`5zo9rO^D2v0a1*HK&58*Tht_fjNF{^ zuEn;T3^$pDCH@NN%?kE$)1i z>?9OzF{`%)z+0g>HN+GqxLr^IEr8~f2uIGZ9#-Rfny)!4Mww<3jW2EwXBpi|AZ3P8 zA0xV*QCIYpjHe_vJ*jK3EEXvWS2LN%MPTj8g;@hxH6R=hYnd$8O@@CH_%$L*U@(_w zmNkjvQEbFWqr^K&yOa!+$a|M$TfK?!h>WPgW9dGNIhGHy3XfGhXvUMS$kDvwZMCa! zq_QjpOyd3CCT@l(C-6YZO>^T+p9kW&*f+&h8Xk!UQ}?nQcG855ucTKWAN>q8ccUYi zNFhJSTmvqneVG{e6n1iP8%odPJ_JyVWV;Nn2O^S|gpapfJfm`W6;6F`RW^_kl#0#M z2jzcLe)9Qs(mWG;Agt4Qw6v5KSM|&=^3)XWz+=Ai*W8cGDz$FO$?7 z&SEW}lB z9rEub&r0n)pg+Dgn%dAm*JZjc({aQ4+{^2#Q3DKqJK?WufR&$K=0r#6rqXb`u%?#i~Lor ztEUD49~hKIqd+%SkJ23w*U2#ht`+9o0_CP@>K;-u4upN0hWWu!9UULEg~gxaOild{1cjp^@##k z7eOAuc6mkjysfZ|rXbfWrSNag8s$kYX)=t(G)H(T7L$o#RP|_+JMi)K66}A_H6eyc z+EjM8m#gRu&hZ7C z6KRh+Pg}a;IJ%k9&7jPnL&Ke9v<7!#lG~1e=Q_f$m1Aux_Ge zi4-C?B8E{$vV;BE0?H3_jT)FZ5XlNRjQa6Bi-CR?${#WED0U+?dx%n#peF>7{vE0@^9 zv%C}m-Ehbwh`z(`ZHT2PFVWhZTztNWzDQ<){369Os^n@SX?ZVb-Wc7B<>*&2#UZ^u z=rWm{3OAu|!x8UYxyY6_N{;DE*Jit+*QPOtFFWJi4bx06tzgVklGwtt&)Xd!*1@o} zK%*!WFsW^|VPkX}zbLux?>Hgio>+*Foz|*Vl0W7VlXI`E&76@2XKH>Ay+!fCLtTZJ z7OBlh`Kj7-v|SBZZei-(uL>~^lA#1&Vwu6wj-NJ{1;_@aTnyY}(+)9YnS?wuC!wN- zki%qvx;=seE@G^lIUNafHbrqWn{#9YwEWGYHVvtvYPZ!__Z7eJ42LabFL6BVnusL@ zj}nuDxI=1KT=7rd)Ig7u`~;-<#i)ENJ+I+HFF7Lmw^73#(acpJ7ApAULq}sJc_+CHlmtxq^q?i^fB@*_kpZK0kV&1n~XuKXdnSW=!?>gOhHUF zDr=ieNjSapO&sWqvTIVL!+qp_R-fG8qxrdZbhrKTywsu8++-XDVe<#cX6T({YsObu z0nqMA!@j=PB+RAH-Jyk!JrHUU9F`YT8{8vLp0u9xwZ=267t3wk#9f^jNziKRB@%Ei+T~NbU2#y&^5anEYBSf1WuM zBi;P2Kl7HQk+}*HhJUIAy+@~_{=ra#a@eo+h$A2Txn2u`u-9PYrLsUplkB_pyRru7xI1S~7A7BE;px&GfKto7--x>HBszD8o zeIoBo&!k0Nkvx%PfE5}{K*CZTzKKF+tw2Rc#WU;x=(|%SL7Cxf=0ky6bsjiW`H>u> zbmPFz8L6*aH17n&PvZ*Xb%Y~yonZwVc>bVo)f*WzrPG##xZ6J>^g=lT^`zlo80w@T zG}%vQABJo@{@hZ_*!LUlG`l@U;cHIY%&YsNBVy)5AmYW)?nbh~C(=tc2tsE$^Hpyk zL79JaxWZ5kN(6`Gx7M9$`J}Mtx;*i0DWTaJ$8L_G$MET~5V%W+UsQ64+pv6>6DwPL z7S%=xSbzb=W%LJNafQBfE14X5VjyU=CT|3DE$yJE*7$myXTkAgtZrg<&SW~*_5-U+ zi{2;p@nmUDpLH6SmE6S@BAD_cX0>&Og*JdXn^byZv$P$dh$K0Q4ijfDnqhJtUhJ2w zb;@vsw9kLWklk`U0V0f7O&zd1SFMF+J8fQ&-H=aLe$|&Ewl~v8X7nJ95DbJFl2}%= znIe835KXk>2OLhUJy5bCmIQ;m8#R}bg88DR5e&&DmfqnrUkroW7)Es|i(8*q@ldoU zvn2JGYiI>-U6i17eqxck{IP0>kB%pNR0vd{fv8DaI#g-rxn#}Z?DNOE38lq9KAHkh za9NdGT^P9$wc>m<_Ks<)_(*Ig1l=LX{&0dgC`-Cs(fAKnS&ALy%+<)`MkHd07LF$3 zApjVLCmW#6g~>onGVvXb7GfL)6L}vdI{j1*C;?xn4$^4nk~z?Cu29Fh0QYwj(?@lm zXUPNS8+5K++tn45fQbbxeDieC5U;1<0ESd>H4^-o0;gf^I`Y^>)FnMhQhZ@QulpkI zIOh#(c+Aua=OQPc(=$u4voN00(D7WEPN=biMEuqhZHO6Nd?3+oe08}?F0SJ*Oxs7u z{yWM>X?qneDhV<18thUKDZ$xw+e!Bd%!z;{Sla}R7f=LYdJh(@-tuZ0)EG*A2!z(d z3S&Fo_$X!0!!H!v29$o-4xdyK0t-K7pkS73sDcj&hFNd3>bnRxVW`mjy23r)+Xt6m zzX;~qB!@>N&fd)Qh{^D6!Mi_lP4`piYdM=N|!l3UdB0X(<(S<{`l*RG(?YQjYJdbki6BGGDA@pUP)Gv&nc>_~}!HN&= zy@@MM9jS-7=t5S+qtQKtO6edXoF|w~7SLw{pewIuSKwATvD8EwLIRlwNoP`tjD)oY zv=9Vw`6AlFJV&H!dydJfFqYD5taF;-vJJ)q%&$sG9;TFzj*h;H^|U42C$anD-512< zizEU@vYzYbiO36LS}0!_U14Z(%z|6RvK-1AgN4nco?Z{O<7O$!5A!!dt1n1W>3u!` zc1?B_eW~nv;(3__FRBHkeP;RTejn)a{rGWb35rLEZML+SpEyL+M(0j|!N~PX&8vnVBdQykaXy z6Wk76!0BFLka>otcsNc1{Yw%H(3Kvv0iu8R|F|UrvdV4O>72Bs3jJ!qDFTXr^L>HJ zmJ}yATaGc`qPE?YL!9~xN;w>`m$}L2sXYtq{UL)J&{wJt z8wV$oSc|6tg*%Pe6N$k^%8BZ|MUQ%R2{$P;3xrfJ65(#+52a4M)l^pps=kGEU%xZD z@t7eR{UGu_d9oddd^l{bsgQ0~bmKt#g(fuSrY$26iq&u<{0d4Au3`hj${*Ri^j3Je zR0$7i3K;ph2#n=nMaQDGwI)PeOIW13Jp9E3jLaQ$&GlTb9Yha2BgqgRKpgFFgT3?X zJaU_w$G}@$fYkybT-PWj3{*vLK94B&FINd;!4MLA$3;H>Jqm+FE28$@zt6}xotzml z1kazD@9#udQu*30Ese(Fs!umJSkvXNjC{nSvUk%hdc&+aDE1J)k%n35WyD?@pVtca zhKJTY)J_qhYhLe@57xEQU_{Np71I4?eH(bj!tm;)yrYq<+-EgmI-7W?_t>7?vp8p_ zm|O;1CTx0U`^X5j(UYTEJY2-Srm@NT%ToY)v`K|<)~0LjrL%A9?%fo_Xxc&}UUI;< zHjWK<--Vp}X=nB`ryMXT?&{cN*P>&~rX1opb*G z&HLo1r`we9lrz?u@4t8KNAD6X5Eh2SjO-^CER<4@s`av6B)mejM}RF)AtjXt=0AkU zMT8>r62V5l2NY1{AvGp$fibQbFR^vdg#7{CVK^RJ2sq)k=icV@p^3O!i#QWLR2NC(x%d^PDJLCgSw1?+WlK=F`8LUq9TEn zH>K~~A$VvyZOAKbQHFwaZQjgUq>_x0`j@Fgh7O_CEi4B!`an%^&JSj!y8b3+VW1yJ z=nIuWj&{93xOEOx<4A;RzYI-&U&koj0j-aD*W0C7zk<;f33CiljxE;hSnq#!Y+ zVKVUG32zsnhpx%R^oCFchab>+{}r-#2{8jp3DFq)`TaMkGVqEjAQ@qvxY=gg7ovIw z0>yU&Pe6vZvH`K5f>n!-MwIZm$|Ptll*jR6zXB()Zoc(o+e-BbG8Fn*kdmoW5 zIoSEPxIw5kY4YTU3vqfi%SnJKUL)7--pGg)JI+S&^`X3O8GNw~JH62vwGCzuFb(`7 z^#fMY&&D#_rkqrpI>(kP{l6lY=sNfmd4N}+KdeNtwv`lLt~mZBb6VUC?>F_5T?ZO;vv9z{f8I%pFLT|gw}Lf#yoZ^n(fxO-yPHWyJZf)mu2=idYB(J zYVe2_@9uRQ?-><{T3AqMEH2mH%Q#_IXE7p$Qxpn|<~6iCiV+WQBo#iFsfl=pzTdFB z;P(BuE+aiNcD~ESwhLCQ{jN70gftzA-*LPH-==<9tL|gAZF0yBAAfkFys<^w$KDJ5 z@zb6r?GDhL6lp=faGiMhyq@=I!_~gvTX`|Ko^t52%ZfJRwFjB5pV5#%?`GlO^q*BY zXoIC;mB|AHAKm>JzlN(Lxdx854l(I5>z_ub1f$i}h-O+3DFauVO(V}+vj`O7|R z&}Bjv3OdaDA^Ao26kL*b+1!fy=j*!oIGYIqs&uZnc(Ec<>|%i%>6ASA0YAYt^%;lY zQgiRKn&OM@?nTF+(Cc0vJ5w?{lfjrV?Y~kodd0Eb8r>=ZOcJE-X)Xoh-W?IZ_jXsC z=BY5R=zMa2A`T#hQYHvr9b^%e*avdt;)Z{)kD6!(vBnR*kvOq+{Y9;Z z#O&vS!#_;pD4KB&eLPIkKHHS(G>T)B4|mW$++mn6mt-F%R`;!MGk%&AZ3$BQ3_|Ji z83qXR`z$84OZmVhH`DoZ@H^WHl?gEbCM(&T;8(5t!iiL(wYt;z9P<>A)^Tf`kLo^2 zEP33y|9ih z28w@L6nbdy;eaF(3k4PAukC_UhIrWhq5snKT6tQ_N1CJP+x@M+(!@yJg$&e*Xs_8(np{X zNptAT+5dn-YlbQ6xc?skyNh>?FEX~(L!`&qWyomgvz?rjl=#^KU=eFu-kHTR6TtC1oCJ7QdQvJm((@u;0(wc#z@y+hile{qL_Bk@!cDRSHf{As>SCf}Kn#R-z-8QiD4M z|NFgnPJbhq8$#ARKX^bz_HNYq?+0LU{!e>}R+pZ6>?SH=%%lJN@&PNj-%F^|*p-|} z$5tMu^YrN7WDHNNQt+WimdqjLW2Y_kpFC~;V>ZbF0r!{5K$O*}@OmdRi<0!h9rl#& z$O`N^=e@CEl7W!cHpyu>oNt&S@HA60)D6;~ImYr{AM4Z&T5ySoMmPC{@95VV84y9H0M#$AKEyE~zAcXxNb z#dFR+`+ND*0|wAN=bBP=SJhQUWA5O(bWq?+Kk&F2kfCw-B=ncA08yZ%_joxl-rtVP ziP`WB`Mm#DX!3MUrNinnBx}qAk z8D$bVPLwsxmdB#1h{>EOku-SdpaX3}!VP744OFWIK6ynmSFILjshuj3@v;_9w+P0X zr!!u{@Nr`vUL(#=3|q;TpBm@naLri+d{&*|P%Q}2(zM4(6(ffU6Yh&EHed}Fp>Oet z{gA~v7MvDD_)Yn-cu?E;HY#MXE;*C5o`K|W>*GaT1K)KI4-c>9RtGQ&yi6PF%)1XD zSN$uy&xM7UQtJ#iJj~@JQefPM8csO%4$!7k6D6iOE+3Lql4hg%v*B9!6DRwlZ=zq9 z4X~}r{h*#D>qID9hOZc%$v&4x*T3|aE!#0x<+z zuAp}a9a@&ot@bn152L;npo)4g28kM*Fc8gDYdV$s?%!G!GOOMP)bTiAbH%|xr|=EZ zQC)ppCyP=udcf9smtAhCu9}h3zpE>>MU-KsFpg6v*y4iPBuVc<+ROk$C%{-*6LUbf zNgDy4uQs(%ha6B%+aVhGZ7?pxG2_iY%E57t$%woNgt3q*SCR#26KV{a{0V-Q%ggd! z)1HbwlRKA2GUUjdU;1>KrL18bpKP)_3@o<=EWdn~e5tUcXZ|eK_4GD)ss4wohSh&B zH1fm~Yi3@FG!qJDLop1Ro!t*CXb}HcmaF#{Wnm_l(<9M?SsR^OIEjr8aQ5WClM)Bk z^~+|N7i`l%O-^oy{&-hjW0#+&L+J;@%CyoDErC(AuSX>rf9Si8U&$j}37A6D+U)?Sz(>r1MGdx8o?FI+`pnuhQ9`rpl@)mHrR-isMhQaP_1620 zAnwl2K9oMN!js|`$N6@e!h=LY+X!|Q&%4br%z*%3`d+usLmN^$^>rz%el?Ew8=oKY zA~~7$I9?>iam#BpuFxHSyIt-K#?hb+UnGEZ+=$I!SHGKrI%uYnjx^g=G~RM_h^($RCCt4 z25_>Pk9mJ!j7gc?Yf4V-t?4rL}5uU#A-;bqxL8BQXt;KZyC(L(Ts#Si(oj4JgSI%rZ!UV|=uPV{Y98x4>pv+&sm!Al*L zc5+DhI^OGNs{0W^Zlg^EaE%+)5A1ZHGG!Ocy{}h2L~%1aWw+=)uw3s7Dl)Fd zl~L};TmXCn;LiFpUu|Y)T7OwR$KIw53b0onaKhH3Xd4kd^fgWYH$6n_zFlAXiM%iM z!4NsB^r&zHOW>1*@r2+@DO@v&{}++Ccn0B7J^%Tm<}L_2{F-bH@L6>nOR`xGITUW_ zjI^mXKYKnfJ+OLnxBg7N`O6g@-9(7}t9DiLgjLAWRJjGKh1;_uP{h})ms@wV9Lu;{ ziwP5kCs=j&I^9BZdH)NJwZBNorX;n@j)lj^AM_Sn1R~WB-uE2L%U}xR)&F+sI=0SN z%@(^yg|_bKX8}*+xItoUvX%MV;6Yp5C~R#yLFQP?8FxuInycPFA3@Lan0s+Zft}w4 zYbIvZu1h8n0_l;Qgsthe6oUftQ8t2vJ**h zzV5Nf_MqI7$*Zu~()&`6AWe~{Sl?CF~Pp=q~n=I*V+qP?l4+w_)ql zO;P;I^P@#ty?be(471Q2 z4u59CsOwJJCoeY6aHh#yycPW=>4m8VQ@EFTqVHL&Xu&|rXi9oV09N{}(358tUd?hb z@stHK^#-%gw_)sdA0mT*j*n0Nv#&(nxW+2!*ZClxs&R$+kyjXuyf*epknGKQFSauOWQqTjM0%eBjl z_{jWyH@q0$aEK4mS5WQ6((;jl<$wUyXgkKe?O!m_pgmPW>>F6ae;;=2;1i8~zc8#+ zC2z3XjQh$GRjDBXn}Vyqc9{(3k>L{0t{P0qBnY^ zmjNu+;R5Nj4^rk$&5&~*Xo-}EqEEVc?o(9}5C0T=4ow!|?50F4BMQsVALqL?%g43) z5ORh!q(SCPp4tmvAvm$#3pJsf%vRb0o7E~yxMTvz`As!4BlBFkdzbF&+@;(2dfb7s zAqDSHoyj1*w{|kJLW8@;OEG{Fip3EfI4RghLQABGP-zfKowW07 zs&||}A(|h{npJ~1RxGtq%0r56;c8wWqFNcfUJee~t=GCsPt3>*Vws_fnRTP&7@9<- zXC-wg9>KI4sW+;l&#Fv}H7K0)AN-V`xoLX0fXGm6w;{n%IbOn*#sKsIkMv(qC|- z;<@4(EIyY`>fP?$wC2gdamZ zDrOOW&?wU%d~@lqn0sOzqf3(Q4WI|_xa*fS>6N*L_jc@)_(h44m%T2r{zHIOy%EVj zM*1!&pvd{m8DZ(fr|!srL*?4Tg|gygxmi=GvJyXJBa`4nq0mwBUNQJJbr^vlEI$SN zLhsFf{m3`)n8-6$kh|fcp;IH6XsMuZdC`>-`=DiCMU3H+--SOqbap1i+CU=e9FBu zV-#%eOI&D{OY3A5sgK8`46rZ=@p$ai^VBC;QisB$6A<5%5Oa!+L#B&n>5ypS`F!)^ zmF4%cx=AOSn3kBqu zRBb_<3i28X3m|hNer8!4(^R_0l7Xr&*o?q^4o1OyC^oT7SxH2%qWy>v35|qwh-1FG zZ_tLr>k^VC!6J@abG?NO_ui7Oi#1vIbXl4p@Amo%kBpgR6lRr*tHf*X2+rv;KTN4q z$3nVZ?D>{^M(!c{xB|!A5!>z06WuJvX90EYTO1y1ldZs=+vThgxg?nde?zSySCrm( zp5+?Hpvmy(w@1nn)r@`HI7GFBDAnH9_8o&!?3`8sm`!^4U!);aP%vB(4dU~ydL$oZ zGE~;Tvy1D>{;jteS3^o?(lRyBZEkK0o$#U}3WAu(lF6UOKnF8N$ZcH{gkRe>EVTgVlVBK&6mA^#=wI|e^@=w))DcPZxk3vj9nGRS zKYXx=*l&iy!0GpdKuW{~$xT#aHbg*3IF3q%3x*E0v*@01mRxLKv*WMQS@Bk7M<2@_ zugLL`pvykyug8t6tOcc{w;}f0#=Y&_-rTfc9xbq2ol76qaeVYIqp|#0ob|S0I>Cf_ z34{M*uaR-qag8B!qm@E(WjYQJ@9f9NE9xvB=29my=}4iA18`%;2=i#~SDv2V^pB6y znQk9@)U`k!3+UbP@iB75C?!4IWjpJ)xA1`z^J}}BV27|OH$FV?ft6^LA=l}ER zc-jUuz-pC-EfEX!Sh&v**M|Z_N<`y_NH zgL*_-gbB6l$@#8`%3eYy69>sv&<5U|vCLZYq&eoQ0U5LB_{k_N&UHgf zqSBRMV<7)ursW&jZ&n&AFC^n+d!IpzTd_<9@N3K7>+hVJS_XgW*GoeCbr?EkU<;!x zht(amxuoj+KVbx7zpv!)hoSR+v04$ojRwr4w>SAehgZJV7Y>3k^ZOGeFuRfbe{T!I ztdNe$GGkP0I{ubK?!Ec{5x6G2kurZJbr}`VITM(ey<6u(ECb||fV7X_AJfx5lAq)K z{|mx3j4+_>-mjehZLr=m@c*p7x;dPWH-~#JE|Z^D2+Sv8CcZdI84eUUBR_|QO@snE z+ka3^zp_xV1-n*@ofQW)7Py-4I5E9vfXS+p@us4D|34~RN5rQLZS*^;t0m zS^pZkKIn>odCKoMY}=oZa!W7ojqLs};Ly*WT#PJIxQ&z)D|kdI9B+T?8zFxt@sn$+ z9)=&6QxUl$^%zbJw0MPq=O|l29-~Yu2*SdxXK@+x#aW@kqK|F&BQptRZl0nfI5>X_ zgo~9inJ-jUjO`{%gy`8QA1ziFysuf%KTiMORMYXo%qZvVX}(%&$O{7I46vnhrF`Ah z3rX{`-$9n1`s06^&?+|Nnpu5R6p3s9Py(fuoEOGACX>bIkf&D%nL~y~>29cTRGi9t zwdk%(cc2?6t32{)BHtyzw}++j7AV zr<}T}eQ&Z&?ED^PAUZ3}wuULn29zi^FHY=MrHAS#m(Y!TKJ!QF3;GJMYQxJchm>Ss z^eh)>R8UC-z9o=VwxlmjG|)MwzJ)T$8DVH5%&xD%c~VfV1#apUHJBcjQDVDNzO8Z3 zkJn)D=LcD!=3C9(b@x9(+>aWDfU_=FMkfO^*dC;5w*+|IYFQf6msomHI(M4uJQ z3Edvk>aR5p9DiYWj7khA%4tBgbIm0Lyjo+KQS1Ipsw9h0toWxXw_K~$YaJjzP)IM} z4qt#2i;q~I!%nz=il#4NJFZ+Aagb}2LaJPF5!>wqurCu_K<8@-cu?VP5x?`i2C%3;>2Hsxe+t=@;lkd82!Q0tTI==Gd|?m;{ay@9VX1%EFk-X_T}PMQ~!1J)2fPm$?}gU z!Q!z;Fwa9Iu}_{(lW2$wZ&x=h9)_1sF7e|vi5bOVD7G|g8WOb4YMq*z+8cr`##knZ z{u)~8q*inmU79q!aw;B)vFuQ)HeIG>v*4{NJqo|v@L&k(IWco%prh89tGgCOy-fVzt1f`UJL~fkOFYD5sJ7r>nAF#XB=)mnRZ1s2Q zottNr811KyhwshWK9XdC)gnz;rlVSA;&*Fi*WtzM<_#Z;TP^gENry1^mXLa^dh9>c z6L{Ja@RI_=jc5I zoK_bF=V#&1CE_1f!5Q5{vYl)d0q+t`dP_kVHNDG{hEJ|MWI z8%5*gd=!NTa;uB2Fqf?1(xkJUVhWIrm>h8Yv<>8P65Z%J?8#aX&TW1a@wvPFeFnn0hV5ZX6yF-Q<7|XM-Ck{~W zs;hXs9vt0{YiDcHZP&t@C#ejEb^!R=$2Sojjt!E)oyK-4+?!amApX{)3$Y zB5!)w&n@k8$yZ*B878;OQeL%6alcMX(}_&+sy;#sUXzoS#xhq1 ziI)O=xDB2(W?~~fie$@mx%0A|NyToD|2;B5P(VprCMV^@40=@GfPq&Jrpy~5=3{Yr zn>z#idUA33pVgO>dK`GIh@jG|Z`c8PzX`C9-w=>W00p$9F@@bIc**DW*&cY);lOuT z9IL3qa!0J;(!SFnUl=1|B+>alInUXJL{!B_?D-**{suyc!uJaq)#PFspY<=UpW9hN zNW3+1k>AwH;aFuMdX48JhPT)@sf)5!N!`IudjQm7jHcS2`90ljhXAMy<~^u&IbG4( zf6431zctCSsH6*x$FcL4>9S!v4DP<`ii`9JP}3j z{Kh`#M>>R%IR6IJIp;Zruc`HkW+%tt#9%gA)kdDCr!%jBB zi#u~w_J_G{NrI(e4d&Ql-ve-oK$vt~>D$E~Ac#4$9>t0_kqtet*8ksTtNQ?Ka4G0- z62zwVUw?rm8nzfFB+i?B7T*J-2>M}zbhGzX&qeGx(J7UZQ(85|P&JcmVS;ck0c!M_ zmGT7+Tx$U9_ig|D89C^;+$lx^UCd#5yLYFU)iEP7&BQd4KaN4Nd+QsL^t_);e=2wU zVwjbcHr+NGh%-2IPYH>de9BZII{D0B^4_Ln^2<}+dg#`G~32V#$#fO+Com{4xL$BjNdWwf%k3 zBbdN%w7sb@vm^IQR789v?~3Ma6Ao5i*TXbsp(9+3gvj^+^0~*!vBv&AJ-5&QyI|7J zqr%2V=LC@NCv)Xx#M7)sU$6zz|AW&k*>fjjYpc0aLyF&uRGI0|Ij6Tw1LAW>$XH3kwrQbCVxfJXxMXa=SW4 zK$1BcglWM-jH3fM(#WR7Cn7~ZZqlm1s+65As!rND zQ@FtaZjw@^FbaqB1(1`N^o;hxZZTBTf@7 zs@GPUPn#;h%ARfsL#=rWwgH&;`tEiL6X0*g3f2u~=f+P-{Jv5eTt_pC9;DLq*D$8v z&$s@IiwTj7E(WY#Z8pfHn!s<+z0nQB=z$W2ZVRkpxGQMCM0f9VL;bEq5f=~F!C$5E zzmrV)Z_JsC`u11m;!N#d;F$-=7miE0^!pWzl)!twp8(ODMh>XIIazAtuvrnh?tdzq za!L?Z@#M|1`;vpYCraKO?R3!>cMiua|KOSWo^-uA&a*RmQ~`sSPvxh_tel#YTDWI- z_`lI~Zk+?X8E`7buuB=^egLdni1G;ICP&T1X83g+nd43GgRUL!BPnqQ^7lgdr_Z!n z&Sw&horu@(z$Fg7`Ff#OTYt#hHa$4hX$E;4{Ft(uLvx(iY(Rvcv z%(T&s*PThN0`(+hLn$_GNuh!}K#Dg>=N}$?0t|M&Hh{)^qFO$JDU(X(k#Q)ex#3IJ z9dLtn`Qw;a;DC9E0EGYAxN&nE9|X0XIR0fP$owM6CR{(&TKD!Br?=8d|G1T`sQz4H zy{BXE9pLEW>Ajf@zJOm-*kZkM}*W*J^IMEVRAO@d z=L3!F+>c5b;?(^&v1m9Uy8^!hBw8Lza zd-j{cTuSZaUcB*ICXGqg1u82YCcwpu2dJ46D;}r9e$j6rPxx1RpLMU7r~8L53QBn! zA+pqb=!ATq*^M|E=ei(osWZ*BHTqTDiAboP7A@m4S7zfC+%yn}TK>EM&S!U-O z(a|&Wh0{+g&Fy+xqqY?C0@8^ii=_lDW%o&O{Ak2<_eF726u5Z4S+uDy44L1HSwAAM z48|ZUb3*Hd?H4?IHJ_A`x7@0;b^e&K72-U`K0_rF6<1ofAXn}=z!fc>8uQ8C|Ta&ie!%WLJKO=Frb_6WLfPGFqiJ?zsn! zsj1D@i1F#2P|D{F(0S|6^r!yG>*PmM9D`fRQA3*WBaiSCzD4y78iIy4sb6-E1(pXF z)xfr#C*U}7nB5R-nM|wM|1n-!1sJdP(`p*E`yBxa#-T*RMCJT`Kg)%0V0?}n)B#BdvpCM3(1I<+eiipGU7qR<5R#oqg4icI6_M>E} z9g^{x)9Ul>pd^NHu7t9EFpqxAS+^z69kFYNU)8!a(O+_$@|Z0Y8*d~#q))fYE*Wo4 z4kjPsSkVuN$?}Ac9}Bdw`OE3lL&%&PA~M*%|8$=oP!c?$MkIC2WLN>6%K%v-eu!H$ zIyUhHoTfGI&V-%Vq~<6(Hm$X1|5W23KZyPJ0iYZe(AXhx$$Qc2!c8TxL>L!K*}{B1 zw20%TvT7^jlrI3*GHfwODDM@sU-@)IgQiU4-30u>lB#24h1w_9&wHjE#EGc zTA{RiUiWvIHfuMBv^&k}X*e%CX|!esCVfa|*1aI{%!v)!UlkaLVeo$_?^MTEH;w&4~1lK;r{33hE2zdWvW0! z!eH_`ApZ`q2ahP_nQOnbk-I&w*&Q`hJ}g?zF8|lU!sqFdj6k)j#VT%to72_M?>a914{q=ZR!t8e+#m7w}l;@&8hFAl3dj_|Q+T@u%PN{Q|; z!i;?~ByMq*!p;_YdSRf+m2SLZ(i#mK81L(1{Xwc|5lRKmE$!B$f7KynLtmrjhhnD7 zy3s`y)b*^??*B!5=i23MBMQXPKV;`_3Q{Mcn;y;<)$=`coTgm}gGT!^nOjW~^rW42 z0meykQ|-($qqlod%j?VILUgW`JT6#&5z)`miBc)ap79eF1bop3ctEis|JUnNGwcw> z+kpTGnPI)DwyId7l(8eD$o>Nn81bdS`A18)Pre4fMfP)JzwHl7$GYLsIL?K1N9;8i zAWS#&yn;{J9o!y@3bq3lu*fBe5&VQB?G7R5nrds zYvXP@#E+89y9fSdq5~4`b7drMPM0TXTM(h*$>s#0LBQdxL)cPVI;#%}4DUS~s)^&lEI08STMsT2L?Hy*Bp z)%bIT9RSou8t`}fqOzS_Gz~fj176rKVTUm z-VQ9HbV{B+v}7cV$WTBoZC+_|i_MJeI0cUCGDqTvsz=i1U9{NoSe}cFS1$Tr?E1NW z_Kq9xXoqfW*T>Asmr?X^?LB1!@2e$$uMbeWVCeH zM32^yPVM>GfPOUXMaV`LiZk}TB<(V1#tBOb0afopk;Fz|IICMu+aBu(F8REg5pR#{ z7r(!y=9}ixv*?_CEWI%44WjE8ifO zve^gm&$0`da zF`#nhONOA1(is%Nm{4p?kq08&Kmjo&Vd91gcQ|R&`~(H?=+RqyCSvcqbvO7rqLuXvA0oeS4gzfip*MJX#KA=zPNq? z*SB@-h%H;AW$A**ck%}{N&Z21FWz^gbiIZA$`qD$vuPB zfnKn#ZcHm1u1zwdjJZ)rwEPaVNq|}?mJ(l2T>D zzOq{9)ajP0(u^>RZ11o+@^{E6KTZUVEE~{?14kQ^?@L^4l*`e*0MNQ6Pyh9z z+rC8uGOv(oRGc@)sM>54t7hza46A#An7xY74p{-_YKl+Y;cK-EDU>?SY_}-WQ56bh z>ulby?Cfk!qfSC2isT+#9j?A_&o9Y|J-`=kq-=zAY+}zREcp_A4;jpFVq$-Nzlk?p zRmIzQSEriX*blcX-`4GsxC%O$jioy5C1t#@rm-%FLQ?WxyOCo_QQ8Zv#(1jEYd ze0bXqqx}0<@mP>$^fqPIBQMGsg*Te{Y@6?M*O9xSt{aS^t3CE}T)+C%8QB(pfc;== zFFAX}uVyBLO*3N3bCDaXgp7iGt-8Xc0_i~R5_vqzS-Jk{P?2m!Zzx^fgoZMlw<_L^ z@c~;FVQk=63ji$=KIS1Cz0{r5SQ;_#xtz3F2w0>W?|f2ipcAzAF!)BS?=z;vPPc^$ zzyPhsJap~%KN76g?Z^uvM>TbXNl*Sv9JYB6CfaEVux(qN0@dZ(qkQ*DAlX)CWkV|S z@4(yDpNrC34YmrQE0Dd9V{H2@7#;K7W!cG@sG{s3)6#Yxw!Un-z)-@sDG&z9rjcu& z4kG(x5-W{eM)yj+!tu`K&;q}etzG2_Ggj%#W{(Onv@*C}Or11Fd~?&;O!G2V*p7>XCn%A&;6buh$Al6_J3WG*nJ51KHnGzqYf^BOtAFk9p$I1+JI zMc}g(eu(^M-vNzCExo&-U6)x2uOw(i*_lGPEpK(*f3i~A?0IdW@6^g+&nadw(Un=x zb1GBu*KuWbJQgsBm(gR^Q^*j-F_Lf;+9qHa-ky z!Zx0%BXMjh{^1b{OEg}3Stg|G!>aqsUdE-wNUXMXBLphw{QXYBmv<;bO6${Pn%5B5 zxnyTNrDwesYk)z$4q=;B7m^!B>m~{5kKF8PJi%qTlvBW5L>NH&Y=t)?MQR*ogErf6 z_mAzO6v6$ZzN^WTuEfHkp>O-WrFb~Z{z7pv2^)h|FImmHq+!S5MIK-L_u3EHq+f2L zoGFwqjBYwn?!Y@A(nk{ zk3ql`itG2=0zlpMeN4?M(yl!XZoxzX1<^vwBKUjV1zmCR32&@0Q;c_z&f+Rb+HpY! z)G;+BLfSDA=N{l##ZsP2303+0n-&(mEa{q^h{rOn`Spr+y#x!xNqsk@2#jhEBx9JF zRk}d}L%6&Y?Ck8W-6*j$6za>*k#;ttg{^IdRZS4@*@nkQ?cY8I29bIvw0BqFJ7=~$ zw|yLbIP=j1?i(u#>u$-$0nTIWu-NyDf_nN`=an77WSsGu;8>SJ3&UKSe-Vqnu`KsNzqDuox5bQvTk@(W!=BK~< zkvIR=)O_-GH@=7-vGG0KN%h)oHe2&X5zRW)BYi-nT+=bs4P?R-P=bGRRm6FKYI-EGP$U2Wh_ zg{IQsMh=fDPuRXGmyM;FZbo?m%QO;A#SA(-i4ry&!UNnlTHNP=cWns0lh7IIXg0FRu2tL!mr)M&s^6#x{ z75q;@Y47X^j0~P`+g}w)y|)a9L&m(D@2foT?L9^hL#jpNe1KoRVTuo@8j1YcWq=gq zOO)ifDrq>;qa*Qz|MZ*eX$_I!oapgJ(}Qi^nj*}cQ8(Rn?a!tD0I}BW4B+|>wYha! z+?L=sG^l*nl6|@^_euL_`8tvHsO75mwSygq)Y#zCMr0UhTn`XkeAQU}jkSte0W>Xh zYTWNjX{ih3__fV6ho~xA_=UF{pHev{qDxbdpansI23k{if4W%%?X@AAKDJ<>w0@aE zXy<4A7gcArD|osSqZLvk92*wFiB5N7kuEx))K$ZZ=&T5PStzHG*|$L0#Vi09O91U1 zAb-3M{Gm+5bN(D^zlp}{K8-_Thj7Y1myb1%@YqM)W|@k50CSfm`aEYs3W0VRx zZ~d9!99rKfEi62=0)wPfpB_yn`h5leIr!-;MD(gD5{oqWh`VRyb3e0to11)#LS(+q zap9fy<9m3l?ed1{DF4f>EIxl{>@myx?vzQ#`){K1v|0Q!_N8`pyquB0o^4*Jdm`m! z@NML}BMZFek`Z{z9#o_0+n1Z1sZp2E6&$)snmQ5-CuD%fU~_Zz*xoUo;G zt2_H+;xt+y8pgD7TYn&4PwHS0;RwmoKiQ=fk?$PwA5G>SHcj0?T_6-ShutM)29O4Y z9x_~O-EgILf8(=ANaa}ZLu}AcF3MiQIL&E;n$N_Wtnp9Cj}02U&E!Bni_j>Zd!am74iBtbmO*qXBsYCsb^&(YKCdZxMn# zyxMq^&HTuV#YGAuN_p1`=Kbnd9 zpm?$ayy8r~X2)7qRUv2L0qu3?esWQFAXZL^g`Vxc6&N} z@tKb&R{QP09eQ&C!1oha(wYa(0%B?7`I@_t368Z`&^*<_`$!Ujv%SW#!Qt}vWsE)| zpz!SV9S3ZM_w9-S|Lp%B2Uh-I^F9-dC>z#z|GmAaJWk*HDwKs(-F!bfUop+J9;TY` z=Y1qS3Sn6dPKGz*awZ8vfw#D3+h&*lnPH6!sqH%n-iy;?)BWE%3M$r#vecXJ5lD6_ zO&4L)P!Zcyt5spNHM@|zlnSTfi{O6KZeyeb2l~M+mIEbIMv1*f3Bq${Dhd6OBxd8} z)XV0*TECx1PzB{g?vG;oQLRBs4PL-rzV8=2W)ciYp(DJDO(;lrA3D(kDsqZjCOGd7 z{^f)$2TMPjs6Wk{Whh3V2(MMvMj%rC5#5r1bUr?2HtakrJe{oi+PqxS;A4mV8O;Z~ z=BJ{GF&3Vv~gtHy`PV$u@!t*TbQCbShNt zJmY*2t`U!Xd|R$Aw@q&%OORQkc%?hN6}4?| zrAgOA6A5mT63J3wr{^{3fC^`%XYmxeI+Lu6^e?B&+1?#2NUu3{ygq>lBG)Wr$cui) zU{vg}p_6mFN>{b^O+nc5~BBPba0W>CGJfcA~s26fvqtmr-v~E=kiEcQ(teMovw)PoWgR+ z(wq;CRlaDE;hurxJ;wm-3;xEBZz9$UmcI8`+u%5aUeGzw_qc?OUiBq$-2<{fw64Z= zyAw7~yR&(u08^{`Adz!DSQhWUdus^6Hg*5thSP{NmMv8cdD0LNHYdqNcAasVbl03z z7r;vQF+$Jn1*I{Wca_Ur&3Egu(C@E%`_ItdFLL<0oHy8=?-o=UO23p;k6maB|6I*# zZG{rE3kY~Vt!2+eGeJ-B!wx`<3p@3?_24jAgR+Sey6dkJ*=6w@0pc&_;~aMbaZe@) zuYl87dtbhv&s3;$8D+D;$vYB4X7KqH(AZcq%ARZbTDqr$_X=Nnx5=A)tz?P5`n z3FWBGXtn`Ytdt|a;$c9cYS%psXj>vftz#SIL_HM}XyzAmgaP4}; zverYSyZd+d_~@h6ieE1I!en}T$sgK$R?HA-3_;)cYISO@)tr{A>17nKt76uT_+rg) zsHs%Rx_d^S;4gcDb^>I|a%T97i{ND6rmg63a8u9+k^)DK?iA~_EJU&@xdbY9q>CJ;JS&P zvlb~9ZP2Y}weHjB`TnW)qL%<+_o4_e6_|LMam;r$%5*{P^E5!RmsZ|#7wWQ4p;~Za z1amoExiwgKX$@skLqLvq$a&qL&wrIA3b@?Hx5pzjN{^t{U_c)o{=EMeWQTd*fSDW4 z`b)mOw$jD!Cq6uNyHuOr2UBTzPU&uLbVA1VOwskb#uvjYY~}nqt3bu|?FrTvgh({r zO>K|QqeVi<7WW+g;@T@b3wJW)ssaL)34aTV8aPRZK?e#JBb>154n?P=o3f9I{tpX) zjgMDo46V(;?N`9Kw5Hx&kT-t2V@z(4eWA%8qTJx)Qx{XecqnV`ulG${Yj{tV6z7e& z$w`A78$UdV2=1^87zOb}VbPXdPP;xe%A_ze2rMF54}HZ)i{}g*>L>GIN)=yIP>O-Z z^SGl`PEUo?CMh!^oZp=B6yrB6CJeAaZ{)nU>sgn%Lo;q_Mn3W@Jb?+ z2w%`S*cbHe-IO&+P5n_cjsG>fT*zTpSf)IiugLH*TYzI0&FL})z4=hyMynf!cPU})X&(S}xFjJAcYju6IbLVJ$IicM6(KmNf2b3)@0 zp-%4+eW4*Xy<`y@&#kaCK@Q8)w$OLr6 zG1$sS`4KbTzBEn=lQ zv;MB{MR*_Cx|>|jf0QS!)47W;C3#x-p+#A38nE@0Z z;0McVR0&W2(?r}(Tbs*>BC^7S`Yc541Hy;`xmbTM7E~#ww3o5zuVWeA)l_3XkGNN3 zZ>Jn01m&D?|1t6;KWdEVDwCoVe!(s+`ZyvMEQ5(sPEAACn5WNF=Z`qI@-VgQKqO1{ z8dsJwFnGGr4$~UzX?TB1}}kmf=s9l1|oF2F^VKiCmN}6 zrrkyQTUaJ3t`m`)e?Hd`(8;83UZ^=Q)Snt$;s(hfPRXKLbMcZiS$+E;1k$XVQl2+7 z7{}FpI9f=gCb(aNL&Pdf6AW&@#_8!iwi_UAbE?1#eCJJNgODhKu+-{)bJ2Gk012XK zt!0L=r1QD(fIh8vwTmb+wQ5&=5L6m5-1r=xA952%LZk5hFIn#NsE1~RaN<#}b+ZW~ z{;gmLQ-8Ml_f6lUy>62kC#)~+)9S{ZHrE){UIsYQKuhNjlHFYkx+s?Fx0yN~A4 z5$ai1%ZSqH5K-|7EFbU@giw`=jKp=VpA7KNmL_}rJjWcU3GTA0WfH_;$LV6}I4xy2 zp=Hs#T@IE8#lunTaf*YB(tg z^#7yjD%hfI+O`6Mv?AR~cXx>hNSBmLNY~OGONVrKcQ-6cm(@r2?fy6D5J-HET;#tVpE;Z zL5A};YEQEpcSlcP5CaCdr`fwo$h~Yf$cB6JW$zUc7%l{`shP)9#S$Wcea*l*d zd;9CgN{hACm2Vw5pk68&;$ixYiGZ_j^oSY7h9O@xIOLA-*TE|~W-RxBxU>F4TQ?D9 z=vHbQ)x~-M_8foq``?(I6%n`el)p`O@kBXUn7XRhYF7KNatk?~@A{&Vle$Uw0FXJ4 zKNGpE-}3FIpV|LJsOpgT%Yc{d<`}2F0_N+&I2oAOhJPIwU=2x1dEaA9tnjBoRFK>b z=_=$+{EJy@I`)l%f-CjK3%NsiPl0MWO)i=3i)^TRz1lR>iJVstIxr#(QiiP#vs+6h zwFfD@`^_px(MHMCemR<&a3uQS2(ct)Z9_K1O%W~)01;K$KlKD6!G_h8Z*1CPu z@*B+dzVNlc*NM04wz}wt5cAVint8lTNVgFpZC@PLmRLkFHDn2wdlShA!yh+!$>6cT zdlF}Y6Aj5sQOn|#1Bia1LYbnn;md^L6OR#(0Pk(Y%nQ6VeF~`OSGk=}^%EXmX(ZyF zwzFAG8xd*{Fnf*3@?z=uybBLLNU*AEE>d9>Jgo{5vFF2AvlOHu*QvB#xn`k=q-kfR z0KT6*-@2bKhLLgqo-{%3L=Jm*BMoL)EKq&n}!uK*2M0+%nweC7pr z#fnaKrKG}Bh;#S%dTDjdhan87fAXWi8!Fa-xDoE-4m-4LW4ay5d`*`@Byd%25XuJf zo399|&faiaq9Y=*Oc^;@x43l&yuZVmI6BH$qK`NOk;P$H-V=_!UZ;iZLNvZ`L(y@j zOHtFOmaA(#PYncR!%gpzJUerrxe;yAl4Gdqc$P>z9uZrCU)>hoz-u(!D%YObeVdo* z^FeDHVI+^ikIyHG^c^irr|)J%{uO320v%wO$CzF;P(*Jp=PvL~%yTKfah*~4tqE~Dcj@5@(k zr{`jXsraCld#ss3tp^~CkgIW_8{r4JKt7|{sW{dBrO^`&c8w&+mDyyTWM~QKwcB2y zC^Q7-o4;L~=Lw%XQ){b*Vk^-^xN^tcmglQz$G)N^5M;9QeIq7*oCa5c2h_L$YdV_I zSoA9%_iQd#=z!SAWM|%%_Z9et(>WL8m_u=LDh<(jxAx7RZz4_;Bu}RhrUsC(083iG z+~AGoV}T!QE>$0Qrb`mZkRYa`#I2US){1ZW_|>E&`V2(5Rct^#@33F`Q(kv?(RB0l zH}DvX+n6tnxMjHYgs$?Do;lnN=?e;&0kb`zrRQ)ut{J9JsdnSrxpw&&wJZ>Z*^uwf zK<)-Sb|_CV42#LE?R}4eg>Cy?63F;G#VG1b!==Qm!&yNy5j1tD9r$sac=`Z;zU6*b zx9Yq%Sri1Y#^7w?!%C}{DJ{)J8l+m{T}x-MlBTKGqSr6Aa6?t@+{7@UL#1W)*6pcl zjAR)^Wa5<*)3&6OTLj}LiB65?|6X1gDky6`X2B5s7GSFnseu@H%eYU%hl}$Sf&b?) z3Dy7{{7Ww6LNXm^Aa#lnAsrc2A|4kcUZj}XGKyRO=86-6orzmygF{JitFj0W2cKy9 zIBW>~JGR%YY-&+AY44EwS}Y-CiO|*ahmMy`tkHV+31lm(-gf7AH%jk%H1~Kq-#F`# zqxKM-w?s3n$=ozQJSDz;@Y7{aF|&Tv7iD^Wp;Lw33v+%of7vwO3)y0d*Jc6IoitxG zq3F=7X^n9e2+^s{Ok0xk<&2XNFmT|}1hHTFaSf&}Uu!%h6mx7*e@>;$&X?EG`kn#2 zt4GhPLQ`S~6@;AgdEMHz3I$%%nE&bpKTPg2T9SXkQk+4uN8UPYV$0~ETZGR9bpl!7 zP=M9)o3Y``k(?IPX^bgQAiTYzH(S>*lrU3(GuVhk_|p+_X(Uq3pYZ%Kxf;N>HN~Z}VXe?t~OYK+MD5v%%Wg2Z<77YgPXm;Kw zf?8!^OxbQ7?CaZ%4sQ2tV5*Kf*^N57*HDspbzy1`IR6uNO}{`pnZ${;M<%D?OgufB zFB4~e3B^Lq>ESXLhorD&JxU7sesrAq^D01MVyX?TpS{)Bh_?;Oh5(k1h4=u0edfwUt4MBtL0}L7}O=5eNSP> zy&j_Wke&xPeph4ro&!=KPTQ^$O^Zdy--S{MVnXV(7&{VhiFQye7|Rp_xH}riN?_H* z-;PM~*GFvgl%L926I@z!4l>zL8~3pjAQNv(NHiwuJcyj+yE{ZI@}?R?k}?J3_9H_E zGYAu3&Dcq^L~X6VDI-V1lfszC zCcxC)zx%4?v~)F{b1K`6)K;;`y=zFl2D@{^uuS4mf6wcAD(sGBTH$5ZfYt433r7i9 zQKN(5hkyJcq3jp_M?rXevZn|+nT+zpTWm26w+VTUMf?&p-bOW4%GYqtD#6yr$$nEv zm3ubmy7X#}i%-PqRN{ur5-(H!05=T1iDAi=N+f|VGwf@oPE%9b`ZzUAf>M(P%Mp12sMlwgmB5v4OG{c|B5b6AwW~f` z>wRt_lMtj&I>ZPKvRL{TX@aTi#GI&N$k{rYqdyxsh}IC|kO-I~A{ipH3G}$5@2`&O z;1Xpkry(0{Eul9wj30H%M-PH*7maEL-2D+l?pBng^W|2G#>#;CZYnQtE(iuAh`6Xb zDervwyz0Zcx@9SPKPU1AmxDkU5beIa$n(VaZbas>dKw!kxzYFU$$=+cw`FXEQ#JO} zQnv23pC+4Z*CG-mpl{DN{iEpxN_}Wyc#a>bpj`(%jrC}>(OtE;`lStRsISJ zE7YIc@7;z5^sex=Y(hsGSf|MIesf=W=<&($RW8UpDbpT%fz`$=J#;bm^E(amc6<%g zqjOQFzY3VS4l=QI8b0h5WRl5n!mGdruILcfIa#1B4s1cEh{w@%Jj=Sh(=Bds%G4$g z?&T!0YZp$!raE69s(;o{QFHkxe#kfjTc^FK+V59$o!tuNZ$%z$x7-WCgOYsWWBKLU z0Wv0~NDt^-$U4xVXn4Ki2dU7emiuWg%7^iGN|J-^Uq(`cUE+x4Cir_lvjqWN^f&av z>)$vls2BKNr_E+uz6~D;n;fFcW^VVmLPKBev+cddOd_x;G7w514|~U^%=OU6OCT6a z-P_eJ@qp#9AxW_05ZHt3;)lQ~&I_EEXdWJ<4(Fh9Qt4`F9f@)@pOx+x@w{q4G4Q)7 zo$va*)iA9XA4?^TR{jyZf-OT~@&pI%6aTd%nJDt6z7zPkY1JAAJ>3lkpbFBWC|AWJ z_ z8N=9w{5hAuiA>d7o%TP$Y3$$~A*`gDuyeFKW9``um+M_Nof_q9nAm+gTc0MphXQ9T z*DiZqjDkhb;<0N6e?u3H|s;BZ5v!+C?g0bEtv6wkd{)T*I2hQfN zzaq_u5bD7&sK5%is1iEC0k_Z+k!P6Z71qvOP(M$f7SX)Mf1^>UL!;Z`Qd;{V?0n$s zCR6qI%0KM=Hqau;?|V2q6!JicE(Qf4F+I@q$AVmW7#2z<=o-(1?M<2}KYr5buP8xH z&Wl2Vg0+N>e8J-W7#HLTxF#(n)8IOGKQAbJyGm@uq-p(YArmV0zUfb&`~BkKU+<~n zx~%EE4oZuEm<%Km{S~e!-n^&z#Ptf;4f)%0c=R*EwNh)JweiECe~ zxO9#BCYBq)xrR0*1f*%?$VVAmpR9pCZO@wXo(zKPnd}DsnOB-Rx9+KA*74E8?WdBj zRFJxIGmBUYXWcj!q538-< zM>D3C^&upJn(dq0vn}hFuN{3v>uepjB-aN{v>$kF7n$GOy#XJ+i>{Mj6epLsCjK=4 zeEGw`nORLO6HATNE3&^^krOQ)Nt5hvf)d3evC{r+f9+FKsxF<9zx{1d=I6hnP%PmL z_uW(%oIt=E3#w%gMRE(kpz*W<-|BYZAK#m&o3$p*9j@4Xdm{juo{N!-MZ9AHNTL=GV!~;-BQ_aR7UY7e1mnb z8T9uN7Gnn`5uWI(=?O@0?UwH3SgQI{f?rl6Bv9?3evz%*Qih(u5C}`}OZc5anat~y z?*>I0BZv;asNcShH2@Xdlu(W0gYh@uSj7E5S4X&bqL=9Q%cVE+h%`s4IV*998t5LcA&1 zo)@6O_wx6IGZrW(J#SVjDnL(d)o|&ZGc05d)3mdj?=fe?VW=>90d(DctFlHhc0WPR zI!^?c^7!k%=dt4P<|&-DWsuRMy8S*)1icH|2d;zxy~r)M$O_QMIzP8KpWyd>!Sq2^ z92a|OJI)xam%pgwwYOwnKYNY2En>aI?d~)6;4mda=l&ZAS2tk=8zICEZJc_Qv{43KUGVdwCzc}+8pLAVm}?0X^-4Ziqn^dn|@|KhaU2qKV$ zt0q_0m0hjW%xoYV$eybSMCuyE3pg^mIo==3+pm}9;L1t=AGZ4CiXmp%Z}NGg%$n5} zCXl4u7?m1iI;8f0J`gTh&`J(OkpQ;PKnF|#0!w5GWX2@C_BaLNu+w}iZ)%BaaznFD z?Y?|W1f}Ar%z_u+=WFKQL}nQVY_+KU*bk<(Pn8_DiyqrWaH`UXyImjKcx}{HbO+v&9Dc z__phNE3oiko;VIU&7!j1M0CDxaUvNS;^4}cTvV(jQTE?wevSrq@!CM1TqF8L4Z}{5 zy*58frq|b0b_J1Fhv#^2%g$0U`SnS8-tu)vm-N6U_RUU*HY{1YPdP9&7H(uc;!NG* zPbY`!Iy0;_+C6U+5t6G`T9+!bULN_cNru zaBw*-rSzX_xY9wq7g~V>@X`8VwnIAcw6OTs zUsZR9PkpSW?GT%^5u1E^Amx@`}r9X1hv3=kC7Nh5DyfKPiBhO?8mr8ryFm8;C5R761LRYo0Gw$Q~C25 z1xH$&!ua1xgkunXG>YWll3ROwTw7~kp{B@t3jg2gft$Cl2sSQP67=u+$0(KVeumkx z>fvR+!)bL>zet>ry6qAFdg5zGBL>{A(#$9v3ar2tUQ0xk9 z3>fXI=Zy%P2?~+@?cJm_MWb`zYb`JaM1}cwc8)z9+jgnD7oLob@y#oN?2p5%jMtw4 zgUTApZ=Ka?)jHt5RkpUC1-Y6M-ePc8u!hCaL~ekG=OUa8^1-{22N>G=;`eYYD>>|+ z)H>t0w0RY_H$v^vO+pDpBHLlA?)Zd(#Ki%O-_|6!IG1Asm}n2H>Drl4vF_ZZnq}7l z^xUI|=k3xBYgOj%3TZuY7OV#KdXz?Y71EEP81aQO7sc7$OQO0Pjvqreb4K#No|RXM z?{9v=OrWuDZRk`3*rRmjuEo#}Vy}sJ>Rb>MlwN{N@=s4o|3V;W`QRe9Te1*|En_${ z{*X~v<#t2i&cx7s_CTG}a)!RNq@w17BxZN(d70O~tM2hpq{jhN27lAc@m=y87gb#6 zm{*DNKHF9)t+|Y!*sLAfk0+(cjw^w+IKASZkAELf63fMFA5Pjvfywf*t8yPO8$BoY zM@Z5)KJ(Vg+C23=!P~Lwe7`${x%S2LbpZnTT90SZu15~TIEZH8VbRCaUOm{M*PVht zOs{!mOi<06zf4AO4J*j5Jf6%Ilo=c(vN8(L``1BNT>j;(ol;=m0N< zs4yN!gE|rR!8g&(T{7C`<*EP;Jq_Jr3nBiO8#u_j>%a0XgPuR*Y^zAJ>3GVU&Ab)# z$pF*Z|M8D2=sbutq3ZB@=OeRC29O5>_SEc#+n*c~92lV4diWcc4mfqD&FL(Q*;9HV zHJ6;lr-SSnSRZ?~>Xn)r%RimKsG=hn*YnM6fsH|rwU@}ZF3$e;y*l!0BB$lzb8-_{OiVMlZQdTNI*1u|Y%5ZhGsTY2F1pqR+PzHVNOD7aAJ>E{8fLG$J9 zu>SKWxWWN-#d0v`AXb{Zw!W)*ySs1n;4K>dT~cM;)@HOL%)`v|t(6fWH|vjvZ_jWR z)nL*nz%t;|7XM5Tz}qogq;qyb&~jTGwBwIcg4JwR~$bIWhSN6r+a>gq`nbS@U5f@DX! zj%cg<^NZ)-H#>7{%Z!C4g*>KQq1Xyw=SR4}3M`w)HrCQ5@_f5>4(BUL?tVbz2V-+e zjBlLjr2oSUyf4z%7SdO|V3ELc<3n9C+JF?YZNm_u5m}-=a|a8E*A|`FU8sDvs0ina zgUlKVAMBIL-;=uw5pA*zHKm2H*>@(?j4KsMGaIC?6Hia25hgPWVm__(e`_Py(e!_n42 z(ISpUB607nZSugYyQ=uQEeXmX3w~5{n&1E+LB_o-ULwblrv7FApA5IDP!;jkTOT-R z)I-AQ66%&bvE)wq0W4}4lMNW~!oYr4_ma)Ul1jXqy7A7|LdK#~rX$Eeg(ab8JeC~$z)9{kj4SqUbZ(TRR;nW_+XVM1i5#&@m_uhYQ`-ymL zP-yn^C0#0ym4;&c@imQ1pt*iZ;Ksp{4#@!(fCf&N%2Zc{=TnuM=kxc*pi8Vyf^~hK zuD~m~z^_CA0tL5;DF14<7fP|ee8Q)?6jJ+;%YeW1qW*S&`Rs3_xLDf`qr&5ZXFHJ& z3XWoGuS9-b7w%zdhNKQJ87K4UYcKQ{;bDu~7Z?4-`T27Mz|t0cY~{x1=e9V8Xd1S^ z-CQ{|kRxpObGZqlg+KQSP8lA|emUP0#59cQbsQI^>%8rAzRplg$V0SFBtY~b=gJf^ zs~T3#T)}|yhg@t?ylDM}>(35uY~$W>y)&eAg=5#l)=jIXn(c9$x4~>Fou8jiUY?bn z;Y`B?yi9sYX_Ku0z7JXyUa4K5(}j1TSMZ$a5RbTE+#Igh-JJl`OZnXa@BSu!{qvK`A(9tTBiUiaOV6@;q}!z@zTovVt%GerAXNc6>;dT{MuIxmNfKMjCeO*mDK zvMM7$Vfg26iX%xrD{R4GI92Q#IDE}zPXb7}^?GB{l2!9Z;NoJJNn9Wor+;HgHcUYx z4Jo@G$*2F_#q&SY3)|{<*D}ORIBkb9;bRyX>=PO( zR|Uqz=7Cxa{%OVsH#nBElj*t^d(r9LLF(}5<*cdsuEd>#5a%xyNM>@p_y;^nzwl`RVLnpgs79EP4e9kzpy?4LkInxq#w zcIBTsU2D+7%QS|UMX9T*-t~V)2qPr$&bUkDqJqiUl?%f!2_ydgey-M@HO)0aiOL%8 z5abrCrmAlG*fkwC3iWyVrh=XQV(HYI?A_s1vkZn_Y;wJFz`VJb_D*qD{ZeT;I4$ZM z^0Y5<{40}G2MUwTp1jSO5V5Tv6hU+hpsQ{x+(_UsICbCdiz8=lLfs`o zG2yEa18MVJ*KJSVhJz68{PC{t!I%z$la`JEnR6n0-P{6{E1NHuIC7|M`-o#^(g07Boq@j1@RA`*BkDjrDL&(sd&ZgiFjO|{?PsUahgRk zHA!rH6s>67xrIrys$pJ%ZqnCPqYtv457DnZY9C*{PFsT;rlm3!!~PN;{XL3Xr`W-L zEHHY!J#&$a!4t5%!-~o`P7M{iTxzniWxF>|GL!oObV|^GdS!_B4+adVHH$u>>)-l= zNYkYm&_^sSvvPai&;gpP8#!}W&m;tjF%J(CSV))3XXy1g1!j6__n4!e6#LF8r- z-6IMnsc|CN!FyRUO}CrBv#=s)9LWnSg;?|m9TQA`s~~1!!Lx=_6DqNY^3&v z1`3T4n6AI>>4icsb-aX@kOsNudUVa2w2M3E7@H3@WmCuFNLB(6GwFv3YB_W)F%Y^IgL?Rxcom48i{#3bZ0)_c24-Zh=q`pB1j`H_2N;k3`!Uw_In2>YeW_rtw#T}geN zx|0Igo32Mc@H72Q7Z=1pImnM-Dpn!??v>IY{vwh|Pn9;Z{Aob|%ccnUK?C1{bQi!lJf2IsyyjB zw(h#_Gq+8Of&iUfiVAU<+|E1X!~56OoOVz4RxR8LXyKJkzSDJ*+9L%bzS5h@11oI^ zP0%-hv-!fTUNcK#MTBjGxFP(AsnEW?(j#NQq+gR(hj35(RPkq_BkD9?nr?H*nunL~ z>nEg8m|KYttF^wzs-0+{^>42D^MiB|XVVdmpOyO(wdVBjx2;H4zfnjE5})qwRP8AXc+CMi!re zj!WwPl8B*=?dT__&}&^4lbh6&GOWr2k?&LW{JYj+#T|a>;!Zjs2a{L88=IB(>Mpv> z3f^vPli5miXm})C)E8 zSalt}W_v4%fynF@5-Eg)Sjag!!5llOrV0;Lj1vif5|NYSGL_)4;;Zlcl6HdBpil;7=-+kXx5lMw=yjV8Qv1^ud~#tm$-4Mce3rQPb}Zv zW`IgEM9qd2-@y(bRR?10+XPNWkFNpcaO!KpZ1WnfRH}FGJ2(9S0n#kj1%}J{R**VtY5;2AoV; z(~fNtKoP*|oc{-dLR825rgd#G;H6_wfPVb7JNWx-e*s9=x*(}v22Mf9;rRA*o*@eZ zf;NU^@~&|%rvtN!Pe-KcAjaIb0|$(JH@I53(_+Q)$Zc4F^u5E9iE>TUz3{X&6aEEV zX3_{56dTtK)fsnq7PCtyWqY8Izg83w5FC=*-d9nA$-U*z?hnJb{hw%Cz@ec1i|7X# z`(q9>`MfdGX6xj`V5uorTCakdQlzvnq=uKM&E$@Djv8rZOIumL1FEt;R6XmbH zyilT6?XoAWfs65OVGRGq{%^)Dsb1qIgnpod9tqSR^YnG_x40ZLuEE9UJN_4JF>vm} zB2$t(ML5#{7YH8ulg?+Il&tS9aA}CApQQ@$|VwYZ7$`t+k z$VeH+`KwWp$3NpC;G{?SO*lcar)2rmbwwOy6Y8SMUw7em7Ie{vH&TBo#D_ES znA3A+^fUM2c(HRW1*7d?Jfs>5MN2RG?;|Ps%u6uri)rECnDpwn%X4cjUQ-VwsVKN# z;Gu-J7fkMT+HKilky(Z>dGL)!nGV(5N1cwENGh1N$m5gfrw&GmEA_SVJJ~<=j&ICN zaJ~TcB^iYn#q`DRdL%g#m^@_OdHz!b-w9{}Cc;H}n!#9P zjPMABYCdp|=lIIaAlyC(*IlD{HAM!s5XamQXTn=}9%x1JHWPU1nsgEv>ZNb;&ApsS zzr(E#)oiCm;-`{zEF>gR>meoh?;S3vj;CoVq7} z=DPTm>e$&^wfSu-i#wQ&^whq_-awWKRT>i#2nxs7BtNjLJKJCZu-knIVPa(#pkesR zN}UrH8J_N?`qH0dMo$R0989@9S?l~UR?#` zHPD?(?pL76!CCK~h$0h${_DdQChIZkwmMfjlfmjt!kP8jwA_;S8t3)mO@@=SX^KS; zDvIdf+yF0pnjDa-&Qjg$tpEx4Q@=*`TB?VmmEGOpWbCzdC~ZbKlg8qZvE43uI#M!j zmH$<+oU#iuxtK1U#+`CU&6Zm@`bA%^T?YhLw9%37H6z|#ZX&wm7ftsZsH@Qk+btSb zK>!6}k&i@~Y)%LD=au}U`gXY9Sg}5t;Gb2P$JGJeLz1Gqc5{Vp zlg2KHdt6bfMwJ`1&L$=XQNY z4o&A#ya}6ple(KGsMQH%u(j@QP+Dh%T!MP9>`Z=()v~$1*;9r}6av4~MTB!X?zszk{0Ln6k`9>Uv#GXq!kRGcRYV=xIRNM)x{ z=6VWX3ziMJwFJ1^c^^mLD6$|m*4B?=2Qg!r>7)$%;OO9x5ojKawIdC(HN97*K@q!B zf{)!XRn?pk=PeVHfwuyU2t&3v&d(rP-NLhYb+klT%6Xi(*N5UBOHC+GB=_m*b8+C3 zyDsjpf^o)G!Zh7)E@~& zNb~x+Ih9pjL!HXBLJj%3`rF1xt>Az4`*R&qgF|U1DOJ!nnwoMXda<%UHF5d0ESij= zGyhh>|Lz#y5uR~==`IdQ?xmq;JP)nlal#(ITBP5$8g!pfn#p)IL;UThPx@*6xT}dZ zy}4a%dZ6fg{5_8(olQ;`Uc*o+c0DQj>_ z!!yw{B15xFFy7u@kX<@X$5IzVAgoz4E2lW$F3L78a!MUOFIr6I1+@ojje~e*8w$LN z;U^4yoifPelt%S>{r6w!(G2Oh%le~7wHhXp!T*cKX+~oq3VuK6n!mR%vw}KKvEmVwe z|5jp0T)x~iP09}0^0({ehMf5uc+vG?hsWQ;fiUju8eP{X$2e6WBTi0+@{2a=_5j~; za8h#rXPhCRhqRY-nfc8e%=4c#DgSVmQ@;zrE}z4n5PPD zN|w`e%r`=Y8nPQX{8kJDzoz-Tvz@%_jA;7h1I;m*N`V`d0rvlE6+Y+U)bGlVwhfh& z&@-H4b-;I_BqO}TZ) zVYNwkA}5Vig+IoxtIp`ON4K47D#e7j!o@+5DSfQ8(29`-p%?RU!>uHmFKDjCU zOme6hO$azg8)7qOV7UMw?KS6p`+i6A2nHr4$>@c9F)(wRa9N9Pnj{4m;S9zh5r$Zh zkOp(IGXF!h7xIdXM(EQ-*;VWv_p{-vH4}+oBwfn{WxYVW3Fo@e(Qi80g%Cb=)cEB4 zQh1}OmDh`=54$(@o+kt8(jV=d1!hvUp?bBL)3yS9f7tr+o)f6dwpiy-6_LrV22M%` zSI-T>Y;aS&7H_(!jHA6X<#nrLnvGVIw9Cctxbmv~8r!&)T5g1OutY10x%rNd%c4z( zZc8a-o16VG?|+OlaM24ZET(wk7g(<$ZqFdz%W*kk$qXEgj>z6zhdJCi^%E6RwQ($&^xH7S(R9_2z)6Zgh(bGp5jWf-<%d7yBvz&L10S8*##m?eH6k*B6z zC)FR3NuLf*_`autN%)|mjulMq6nHe-88DK?D^oP~r1b*{+EsPta{oOcQ6~H2!%$88 zO#&vmSb{69VzMe#`cm>}CPYp1-;zJW$ytfyTFM^i=KiV`mxrh%%8uFN=|7TKEPp}! zebFApNabzg2aTTp&Z9OYry64Q;!UIC+~&AfC@<1_k7Uh%{(y|9kIZ&5i0Vy-TR6Gw zs*YpoRAps+c=F1RW&sif|CqWdYln$Yv%zszQikjZkgRE& zh>XUO26Zl(t8f`N_kSlvHUPE34n?o5u!XGr&?PZvNp_@96F|Bc0j~>j#@ljisH~xi zye0{o&?uy3VTB7eA?a?|JDFFfZ?rQUE2;?vpPAZGH+e&-2e@?yGyH%F)@oL ztxu#dJ5$m~Y^q~2Q8T}LmYLg9gEFt}sz!U6nuW2J%{dkkFW=ovk9O*mgL2dnrhMw+ zs+Np*O5MySRTa)0+IACKC9x-`c;G^vWKy+08*BmXxL`~{6TN=4GL-FEfI%)3{`}BG zxLjf^-J^)oN{7SL)0=VJT|5V1VyKPZ&@%8)9lxVB30z1bPKdesBrV#EF zbDS2n6YVzJL|$F&41ecV>Cs6{ z79Z41{OBh^|+6FY-ztBKO2vkVC%Nr@4d4ZEw+_ zo7`teN(BqyQrG7Nl`_LLeJMLYN%NX6tmhVpT!I-IScaT%KC-*MivkPkuiIW`!~D&4RSTsO50h?L4wb z?Y3#o?Wqd#0-7yWp7oVf8%~u6jXLEiLL%R~>{J&;zgg-cIq3 zD;^3|#5L<b~?i6^1(l0YWsRjqpLZZiJaR5dj>ShEa72XxxBd!6=B z?A*L~sm~>(B-Z_5ov12mw#`?k$+3JBG1S%5@i5GzsmCCVu}?#`^w(xgH*pBL9-;nc zKgm#|aG+T^noX)5@B>JCIi7S_oQj*y`}pp3Pz& zoS2XdPynLY_E;es`Khvt5NP34Wjc#DwA>1R=J_LXk&L7M=)O$ z?j_ZMhKtW9+wi6;^?mj`*WNokj8<+xB!i@RPv*q$ac`2V0`7;sX?LZ1r`vcwAwFCu zNGJ)6KSu0bS9023OHaX*y`266m0V$hK8fdq?r2S>)xBMmqCRU(m^lsr5!! z&*pyiB_7mDBx!Oe6`#~x=Q*!udb$Qs6nWuvcfIp5jweEFw1Q0;TH0u|3%VYBl6*5- zXqBD6P1o6`cYUm5{<~djcTD%wam#gV)r#jJYVtDWaFIfySV#L3eZ}OH#Dhzw@gLC# zS(Vu4kJv^BHja)Pzo()Jpv8%j4r5B*Ec!&Ny+{c|oA7#a-lI6xsi|q~l39R-3ppDATs=Ep^S}$ECiWiMw9>C~$ZhHVI&5cnAf1Twgzj~rYZtYtBu5Aj=pNh83PCG=Ro>X~u z7?m!%1^s(o8q4yLoXT)&68|grlcirHvtuziFu*PG@2EKl@z+d#Y+3nfy8V3HOEKL6 z^0ZhfYh>21ZL^Fan$Bg2`uCh>LN$MyI8SF1WLQ1==3A-WK<#e&#&pCHdzkEInJqgB zcMxxWh0=@^lyfBFrbM&={vx`p!O#M*pxY_q{nnYRkWEEn%~$|aLEN5@=%7|=e|FWT z6WJ~RVa0<@7mY>=EOskovMo)DwTC|mY~`J3Nt(?*qB^WxbtX2;i6-iqGR@t1-x>)( zZeE{PUMR)_iqjpxlAdx@-b%BHQFcBJ^m4jdliZ!z+Qi2PUvYViG2U(2+Q#nbrPCi@ zzqCC5)l8PjcCjvWSMl6;?-_DW^fguUue9HCwRWeK#w*?iU0YqCB`Rk)X}pM*VM5%2FuwLK^z zm>yK->~NA_ox-ARS~nzen1>Krv#-dTtTEV=2#BbgmO}gC8c(GJ(+nn*G&`Ika)3p4 zCTJE{$E^rqC1kIhTM2koXK^+FJC>jFPlh7c^jYWioQo>b9>6+|7l?H(JE|5wgFG6O zi>3*I6wkNwoLl)jQ$=f{4*TP_NwEPg$(sfeUspZi<*_)_11frzgq5y^?ybg5@OImj zS81Df2<8VDQpvW3%l`mlP`n=<-QDt%aCTqT@g|j^!Q@qSD1-YFl{bl-U#dH?;Oq3xD%@^4YP)_$lJNiy7AKj3ugaA<8 znogpWDe?1Gl5f@K(W9p;96dIzKlrr`(@Z9WF`gOsVdL>P!zrRLiAGu&)kuH zbky&@5nVsgC;Ep?=UsfKb*`|OZMoM*iJ!yz`;c$*HrR4{FvG=@Um}rpwc@)`6jTnk zg+lA2b0s~Z4oANXFWPmBI!_xa7PJ`2gc{?O_QqrFtJ~O6^c@;-u{riMMKjFCu!w5v zb{t;Rl%OdVa@6A)bJ+%NUl+ASKoxD*k8*WWz}X+X9u3TT&Q&TdDdQgm_92MJi_tr3 zS+TI^i@b`ZG&=X4@Eu$17q#G&V>|uj-V8OtKj>37e`!7OgDYLwo}Ntart577O}W-> zI@`YOW;sJJ4%ojbiWSs*v0FBhx;`3AO_Ew`3++3n*8VIcN}0DQfv2d~`%mf6Mw78b zyNvS%ykPIF1f>^947g0KR8%=1E>A+s)x$q&H<{;-WHv#ovJ-%d%oOsOhOBY)F;l7I zgHK8cvcr;WByTM98%}0a?yq4I$gcEt_UJz}H)<%}`|#UH0ETnqVB4w}$m3v^ojQvx zVDrnfw8?}G(@s!xctMv=U5%$W#iCh_wte^Zp#TLnYu#<+{LcOZc`}Vus&%blqws0S z;Z6=BMIz!TZ|_zo_xCLJCDa%^K++JEPqX@8ABQx7CiPFA>5ek$gd^@*ZLb}sa-Uc_ zEM8jW$bFtz7&tiT0RnniFI$!zauEG@JHukY7X3=g5)^<-uI~Ydo1OCh6hC9q!GY53 zG;VBloXBZY-)8&X;`6g}2L?_+1ta6ApVRcdAvnFB2xh|8d^&Y9sCR71iV4(N(0{(T z#KeyhV;M;*<6vuJ8DIU7*rdNdwXPHtgBq{AenX0`hi=!r*3`X#E_bDrn zlWI*lH$C~%^m)oGr9-eXM>Xp2g6VqY7EKp{$gf#Onp1ZZ3r%?n(JH1+Q^v)g&>VZy z1eA=pnJxl+9C!0e(Eh|T*bd>>JE(QB*qVlx0q<0`4Y20J7ajUWfh_b@ya&X0Cl7Lk zzcJRsM=VEoXB~I$k_n)R#W!5Ad&T7cqv@^Vnts3caRCtp2}Nm`iV8?~gNTCUq`Rbr z(cK{+lF~gwK)PXccXw=b*MPwowej2Q{rUd>-{Z0KywADMee$}xECq&Cx-WTJ?31-H zf`*zLQ07s08}m1}v|sB+DiWeWi(MKl`4;9s)?0)Tb5|UQ{CHsez0W4W)MUn@qf+BD zalsl#1^UoqhYUb28V0eAYvHX=j->Mpzq{279&Id4yK@+jT#B{&WTTJ4dzeu~g)A+e#_lpu95@9XwHX=)tMos;w!=Ynd2}baSri z637$d)Ui*<{A6v;VQ9<}8dvK!iA#NZp~wO&tJCqwt8h|MVByn4?)6G|c;~A~5skR< zJ1c;%*}>Ow`e^j-)3^`RJ#KK0A#C^L)$sEH&D8>rIeTr+no&2U1bVlV>^m#%B%O-D zXt%f8F$Mt;F3R$@D=SbX| zub0B>>eN;K4GvrH#dlmX=v*+sZTD5-(IL-e1U>@3g^ySd+x&Z?vYPlTSoCK<@m0Ct z5In(J&8*>#LB3S-NBHR9?$es>F=#~`!~1_`n?J4{ro4Gvcb@7rK|2xMoG0WRZ>u|D zef5i{^`^_Rh>`5Fvi*|MMaMrRa3|;YR_TKa^g6094bk&k;iF{nGP3gQRv z3hk}8OO@=<`XPZO#aoSY;BbGp=S;`Y6wrMwO=sQ}sXl@abdy?(D^&9LTvMHrn|079Eys9z7IewAHDtE*KgVT7h zBxDWu8w|g)OQ4 zS$2RGXG1V5jCXgKPLvjkvc|W-lkqK1bAV1jT%6A*v zpc+XRX$Yxfv2}FZ=n4u74=*c&hWuBr{xkP@b&)=(R&Oi!_ zsn6qwM?GyN&!KNBKJ9S$%VniGCuKCtiZ&lqA(jix?~1nzY*W}3XZxP&H~6rPw}~l` zNcc+%?<@fZQO&LilPAi_0(hi}M4S-CQ23Q?TWjQxU>`6c?-77$ zc|^%rwMwH;5)CO8*frnKpm&BEV2Lg!dnwaF9?bXnQ%!o3!Uub%=HImHixP*_P-q1U zTMm9fYfXMwnHMTPu=_HJWK?wUNns41J%MY(larbJGL?tIIjZJMNSe2lVE<^g41N_| z{!K`Gir!e$aG*Cu`fNctB4l$sX&O}==U$T3tU&8L_k*^?U1O5>2Kv4K*kx3=E-{ak z=1u&reWHmh11lxCrlMEPO0%IU&Hbmxj~CO&MEygvf_I;@yqpqjL9<5DH+?AcZ+bPK zAfTd1FYBfOsU7ZF?e4_p^Q|*Mi{TtflH}KgK1Subi>ih+=__fJ*HH4r|as4 z(wk9kj~~UBRllY?)N!kxJKTOa9`?1V2S|(@Ipi zGnfX4Z8&HteBZI_;#*s#=vxaqu)d4bQR1GGP#ZZAGr$baMtjW@xBoJ_b{W?op(5WUh?< z?VyX?9Z?SSEHuA{jt?vYV`2eOFyN&K9JkT;YF~9Fx9(_V$mNN}?0RN0!ynmxPV9XA zDD|`9C1o028N%N~TTuk72@1->@;B)vxeaAmuSr`Qz7Za+G-cjFI5<79nq>SCn`?208~84^UGA5>r0Yc2FDfmt>2CD z+uKp^H1n;XzJTjVAnMN<3jMV&UGFrSVdl#X-ML1i^@5{-FK9&c^N&mM^>n9w*en7{ zU>G~65e|E1rs*7+8#E|*{jA`dD$r6Xi(PMw%I-x2dMm8`s;m^M|C(Ops0}Zyk;J=W z-RYP=85?=wR}O6r|C(;YGHUu(CkU)6xiQi2oK4K1+(bm)n}yJ|F}5>1i&7pbHk;Hl z$HkOA<-C40D+*j;H;ul^q!Z50%Rn95Y$+J&z58-3qM)EAAV25#_WlN1^ByynQDMRC z%J&4D`u{c+An7A^Ugl`a_MdXsZvRZj4?*fVHahYtuG`o!t*b26VX^XLX*R6-Lhv2U z(;KjzW++^j5Y*`Q>AK_SCyD!)e3l_eIt8UwY$xC4zfd{N9S*zpilVb<#us4INBgV? z#02$%!G!Xu#KENJYKB4e{Vqj zB@00vLH{N!WW|`B?=UZ`(s45~E_VpT<9%c1X*s31s5;o#`)Pl%Fy7X{hNL})o{4qj z%fks>tsf*1N`VGSuCLecb%flbTdoGc+n2W(rt~2tRvm2SmD=DZfh8te;o}piT*{Si zUfj^AH%X-P>Z6{jFvwB#LP&V}94W?+{mXIVWwC`SdDX61XaXpPv1pREAXo$iM}l?y z>YsaBTN3wYlxFljr^M{C4B+d%44MgORgB zVjkZqD38g~_q>@`c^}kLwV1_6e&}BJZS!oSQD!$sUt|WCsqJzUjVf1QGpIoeHRa!m zi&lnKc3sd9(~=&*EdNV<7VAX~!gQ^a2KR#D3t@%P`u!*#6PO;4zfL%oHWQ6ttsm?s zvKSb?Z!^MNfK{qjm?uF{w{if zwYdFNahZ`M3=1tOlP9K*NcTvzh=JVT&D+jT{+6jQxt$oHh}<4Nr7`!}``lY*?_c(C zLZg8~U67uJVrv}fzU=7GSs8jY$5*Vh*jHxhwt(46LP2V0Det2K!*1kD6beht(i76$ zl@Yor?Aq+-qlxY2J3C-i>%MI0$PF~rO${)tApf^^B*UE>6T%+lul|xBgZ;%T2LZw0 zi=;)|Z*x7DQE> zb-r2rPBPrU=RKdEN^n_EW>6=-V_e_k4IxNFZJ47!b=6T3@E7?Y|qtn-s?rueHb0ZFB{1g8GpNw^o+6P zcXingd%FFgKjzeTKdwQ>&uPD5D{-Ib-Rc16kb0U%N!dFM=UTWeOz z*K5*jS2TNCxd;|a(?=O`#xa_OHElEm0*E$?QF3X&H(v2;x z$lqL?uz&~=W~0CHt9^VuHH3K{4-YGtrwfmpJ~T5|qWF(X@OM%|n!<<3PoMo% zqwC|{-=8#J?Afd&@a}fk+x_W1r}$dLV!3actI;^Eet%Qjsls(dKd z>wX=(G1JupsP4reQvEYs*_%mfSulI_n)o0V*;iO z_#}3>(~m0!Wk>Dk*=^K)ip5C&Nm?Pup`J*qPvzmb34wnYC~lXM$X$a8Ioh3Cd#Oth zR@4SLO`SF^tVQ#bv*k_|o(0FJb0~*6qH|$}m7(SUA;w8&o>`2F$IPmdpr22(lgekp zidDyYPFp&CF1E`Nk`B918!6|+!w(CGZOg8V-+*MLzD%wgO_+57x$G9)pM(G3h~L@V zH@_iP0ejSH69jsRs9~upb?VD z)L!Gr#j4Spwb;=pvcjhuu^$CR{*c8r>9Hd~`f-VWyGcnJCxg zHvhn3z=z_C4+12@t>cDe!^FV#fL{Ri^;gs5#ZBmG){|x>l{=}z^3E2p0E421?z6Rp z8s#YQ@0OD10U1Lm6Xly>|LGQ74mQ(PY&=!~GD1qAod?5c5^7v%kcJR@NK>)<&MmKMa(Cn_vcD)>k@i@Yd7U9a5)_q6Bm zWU#0ksHgW{PzcxKmcp;n`0QoM0wI%?_0b|Jx_n2LPJt5C6RQ1(m&l2LggH`tEWJ8i zqyLO+3`?rkq*8c+5U$@M-FTNDU!$ON z9L9;zA>9C1SJ}Y|V9c(z_W2RqxpA5 zb^GVFeYpO%HCdmZ?wFpFbqG0^*1eA!s8nb0JJoa_bw9=L_h3rB_vX0DATjz%2s^v$ zq6yM=Sa?0k|Iw5#1~sUyw2four%T}C~1M>HoKp4 z?iHTy2}>kXA*rY%TkU9*Tr$sQ=`(=eM$4KrT^0Z0XQL;aeY0k=XCDR=Z-UuNdrk5+ zhpn3u#VgX{@JO#~LJ1~VbiC{j@}3@BiOMD)Rrwe3earWIG?AFGq>|>REr?WkbfRmT z8%r8IPV01MR*3qp;J4w`Dj=c2lkeAO7{`j79^;##VWng~g)sBVoSp`At7X0@6Fca? z99SJmbFAL+nMs-G_nTXiluN^?^lx$v3XRO~yb5pxMv3p@=N?RA*ljRG5443Um>h|_ z2=3Oyj4nHcc5>d&(GhHYUJ=`B&~RG28MFy@&5-QZ=})QtCnpUw|7er$reV0RF6kLO z6A$TAID5sZf9uhShY#BL)AiTP9)|u^^hA)pu!#Jpw1`B+&yDYQC&^_`6s85g zFDZ^OhMz7-d3(uB7VlVF-3{rM=oNHnaTY@qMd%_o1a7rU48s{@3eB7s{Ekjyy{~Fs&+dTFsu<=jUwOR_ z4Haj!eVrxX6nq7WqaV;p4_5P2pz8{dr1(Cbb|=7poZtc-$TyplV(p;r9e)*#akny#-h7gQnpB-}*8CJuuAtBG_EM8i}DUP%;hU~F7j%SGB{5qsU>2hK{jl{F%%Iof|zZr{t z)RF0gV6mIM2fZKIv!FkIrMLeHAi2;IFC)1R0d7wSR)jQ$v?ptugz5_`_f$pP?Xy~z zC>RL?HaC);Xp>h}j+3~?w>8?MKr;`P4w7;6GwYoaVr(Q98yvQeWmsCz9&4!Xt)EGrik)`*t!ZfM z&aec#eKr2k+o!w#$TNtX z;+=Ivc*!LAgl*9(T}!TftMEl3(w+gAN|bG8eK5D393c)fk+3t=-dQB$diXSuJ>tRK zDt0}JPmFy{D=oMm=}Bf>*>}!BOzV*rTqxwe;%d3Z$<8TE_m7zzI(DW}9u+w>P8)T1 z4bL#?`$x=>@6Gd_d9e1ZhMK2_#{J2;z9G4P_4Fk!h;?2_&S3!SN^}}k{WZCl|KO!f zfzGj>^=<+@J013*Pq{zY^hp+?kkct*;D4fAe||t~;rA!NC|o*DJ7yEvq;#o2{d%~e zj~=@hh^c;ig#(aKv0WzRdU`=b6;^d-S_i2VinY^QpMvZOHPi{SJLSU)-i--GKi_F= zdGEInjt6$31^-$5!ehO?fDPcpQ)p#iVCs2^5dBA(!YsV1E5 zf;G<3qMspd^I{bv$W}ur8WU`!9Dqk^t}_ju9evC^N5y)V9lKfzYSnud7!Gh-GMoWz z(-08bt8~XutoFIr9PX1Enf$|itI) zx?FAdts|?1Rl7ca8uedtN@KMnCEtU>w^|4+rcjj35gP<2n+q`WmxVWmpZhWY&R?UJ z@GsU!yU$362mdF_=%XAZQryy$rQiiAYC0!;2hobF^#C(3n3dby&)u0wJ z+zyY`HeWcF;s@uxyy|DGL(JIEiJ4@TR2nyyhN35Ygnxf}a#Vy%F0$YcwJZ&(Na&aX zTiYtizg##>%W6faunRp@Xl_GLA1+J6PCyi)K)lrj+G&~cr;Ss(hd5?@z-67|lz zMl5SY3DuDo)n`_#kiuIbl!mpFjR&QzNU}BZr)JS8zD*n9WQybit#7sdD--L)G5j1O zr|a?(*0r=7EyRu6|M>{#-wy;ewY$$;2v8hipblSl9|yygCe5Y4qb#2@3%}5*n63s$ zK930+H>{~}F0^pid6sfzQh01;i&X{g!bi>YuS1=7+SzyHfQh>&VCu6L6~QI_yFJcw z=>NVs9IdRT=iE(BycOiXRg+ba(*KMI(dQ%Gmg2v@KPE(%s`USiqv}=1?aMjm(oLZw zIteF_?$t>tNi!D7B;)!3m9<~b;b2T`Bczr}g14@I&Hb5%krr1%U$Kq9LGN;(awhFs z=_NMt{^#9X%`gW#Qj#zD>6xkZVxmW~CitUsrYSF$`dW}ic*oRFzxJ?g8|_mm+GdvFqe zgZr9oyAm)qOflI-ktf1Dc1V|r{i}MlLh=r8@1C2#OIx)5-c0&$6UQnkpI(TBx3Xxj z3bIIsaD~Dj$qWP%&{L%$Gvtk}{6+vGVp{=^7)&s06YLSB+baF`bw3T*rHrVvG*?xU z`H8XKJiw4r-d^Wpz4iv3^IUL2g$=ueXpkh;ZzjkM+nQXK@~dmwv{u5n1`X7%67)aiFe%9*5X@TXLA{LhSbNN`rXT}J6$ zK&7B7SGq%`S!FkRj{5@ES!UgoS-sN(KIe5)gfgy zBevDI(3wKFt2U|aUY9vdmv4iEuiYtz*3!l6*$X83l&KGTT#En*gMr$rXZ-?Y$DTu9 zxOZGb(%)ELFdF$qD0=W$irjspL?@7*q#~Uc0a15TZ4z265lu-*=TyF{T4`$7(*e?- zXr71l%(xI`Rdd7nT=jCj#IPz!IAqg{lc%iQzweQ$5sm*CZFx;>|MYcbpJ~Wted8GJ zYFulX$RmTTDD>+#Kbk9Nu>xY}D4T=~lR{U!$rUa1oLjLLf|ByCVX>&CkcIpX=~}M0 zVfdG?-I|q2>!7e-z)6V*X(Ef4gPZyDCmKI0?tqAXwxax)>>CnCmsCoa`iMy3tjFyS zz$GYaUJF_~`xD1Z9(}s_HW(w|CNE%YsW~LJ{oFJfCgkoQ{jjxm=C&Ag*C|}PIG*Nl znkZdwlFs9(L_KpSHyD707Syz%#nq$7X%^V=e&m4e*2|8*2_6e%Bem|WX8<1rOU%iaNbF@0C)zNoRnPXx&{9VY?+r3$Q_}ZGRNS1c1q)aun*Ys+x2geq zt#!V?w#w_doCH!2@g`-3q6Hq-GvKzo-xxVw`t>ZeLZFY{9^hv-&S+xLlS8md_`48~ ztw{KR_~|B+vi{U1>pc9>e&`W)WET5?@JGIer_TzmKJ)%Q=HZXw$G7?>a#dQJL2lmjCDD(0b*ilb6Bu z>$QV0u`MadAvK*TkTb{NB;dHuRZcRg;nL&Tnny2xOAywNJ><5#>dbRTeA|_W5f~t} z`B6EeDiQG&7dkU>T2iVYq9~+}}bqtEYwTu?!j-{ytu9JO% z1VERrqum{Q+PrEEylDxg_1t=AF} zGLb@iiq#3m4WzY#zy+PPI-pq;JY|Fw2DNz!cA36 zU4O)bepan+(VNo`uPB~G0tkOh6%U_n2fll(g}A|(9aIDO?RuCezW587nS3|3yY;`= z9Q?MRskeoEJLk{KF?T2~LycP#_+ZylpV15Pakm`jLMK(}Aymm~{t++d8XeaP!KCYc^zsUK&Snf?#fMAo*>$ zT%xMtyV7Lij|#B4HqU}TsIKp%L;;}!hQ9qfFO1Z)W6A@&HG8eIb~~6Gdnsvl!x+R) zp5o-~Esn?UW+e9Ks{IamlKRqLE}SrS=r#R0s2v77f$*3=q(I zjHtcr3D&a49oD*f-<6oh`r7W-1k({0)9IupbWMkv1jpEC>({ElHDE&1f)q!e$V1BX z_VU=xK=JI; zJT+WxubcD=OD^Fym!7Y>SwwSDCYG;&{vfL4!eZYeGFT|mX|&#^-Q{HqbZg3TX$+qT z0W5qIZLz`~x5q#_BaHCndp|F$gAwvhG%*K%IQG@X4hG)@IChG4W^|ISOh?f&N_70D zeX~op^=-p38tQoA=nsqD-W1p+M(0VMI>656r93_ym*n^6J3QzLdL-eLV`n?Pl=u39 zKDR7K>xHWOSubUCrl@hbC$!BY=vS-`Lp8~>ej z)ml(kFQwoYvDtO0K!iyDKS>roVRvdy^v1Vf?bF~C?p5gwp?eR8-#c=mOR{>UbwKM& zz2$BS=N)rS?^Myt1=D5r2G|A(oe){2fR6fx)wS%ib$3` z@Co1fZCls$bM-_s3C`YGkXQwgfL31toU)*Ts81veglK^`TZ9tlc@kII3L#$a8a?;= zrvnNl(ffATOc%a<;@1Feus33j+Y-IbD0#;EzOCEhrD zrH^uMM_pA?rkJtxs$(rNEK?2(Ol<`D#r4m}e^1Ca^?319043!QijkKs@16iyuF_c&PoYR<+6$ z@S4xi{jmdy107_sKZ4$5I=YbF1I8f!gEPv;{TYcxk&?dGM4;Ba+YDS9X=l?tT#^(edacg!04-b3%{8H{Ie+$5I@*n(*H^}MCCXmC~S^6IUlpMSR! z7l|YVe)oMT-%V{m>?d_!%Yf zZA*ITQ9M2bslDkr>S1Ps_S3VU!`(raE8>c$lojF<9yj^bHPM62XS5`F*@C`JE$<6B zc_RL?<3iq_bt6S1i;Q|I$4m^S`76tm;?u<+auKA-@9T0R1s7LF+EiD5f#L`<*X(<$ zsGug6yadIpt8@+=wpQ`*p|HhN`iC25yLTTSdEssCYH?|ul16m3jHb82O7LPf@X|av zOOYg>J8%g;H9#=Glb4RmFzl(k%7qX5z99bY70a)aAJ<$Z|%n$zyP=G@O9`Dc@S!V>YAFFmCH8Oye;+J-z zvz?)c*v=>?2BO`<9YS44sg)z9M|TvN6PL+kZ5uQ^Qtq?%%%|@jYtZs|@bib5*d||= z!CwdLhO^3&GX}3p!*BKPEx5HJ8pUxlNQH?r$yriW{pBrb zJn~zfF|IUn|G)3Ty0eESygrEm%aJJ~yB=f{5l=VAst5pr(k)$`6^z@Xf1EbMt@uN2_9Ol*yM67F^0Q2%>p_l|q1*_B~D+2tJR{zl6Cb0b&I zyGbJ05~g_>aM!5^n{RJj1sSD{Q40>b{4E8Od{anx>@OuPcJBS=WuSf84q|o z0>XTh=Z*j$J=kngPbX;`(mfY9@j&IQYc?FaSQ=cgxo;<0HdbWr-FJC(M>yEnl-SKm zitA|WBaF(R{=Y(I^DxG^X#D%6EcJGRcGN=>0)K`eH0!$T9RLH}@r(#BOt-QmnTosgu~mxgKRmq<_o>`uNA_UR7OR?R-^xZA$L7Mu7a zg9in;i+4q+HSL8Ta!LOGmh3^#*Be0T$#m^f_(JW;;k%d2)Hd>TzQus)y)e#GIf6Im ztOM7cwe_#!pZtYI;4OpuMS5d!oQ2S?dJ+wNK7?PU}_L$?Tu2dxfPF5{^atrq97RmFRbf=^uHf4=Y z2Sxp%O89YLJlF&MpoP}!$q?Psyo2JI%-_cluDq{5a61x#8aOSIFPoxPx8PS}I1PKN zs-b^6V1`J7q#6#NYSHV3OuPHwh9*(K$9DhbRLNKC$L6Pvpj&14&UZjp(q-2Y@2fv( zOvr=Xq;bfE_+gM53~%+OpxH8J7i0vdS1BGf`_&(F{zsa1WjYS(ILEt8n(5xyydKTj zRM$%nKb?H%KKW(bE%`QBnK>-xs-gKhFKQfzAVmYb8qeWXENXK7uX#TS3d31#Z)w?b zzHq$G@G*w(ZMdO&h&UYkeNQ;tPx5ZN)(`K9I30ltb)(B}&@#LGz?b)lT^>A8gD0C> z>myY^T_;2&m%Qj?EXkln5TO|3!f+Y?Qpquobxw^L%V_0&7W-~(_M7YA>-~0_41At6 z&TCy(!y)@z4cYzo^q1CcYuguz6@14oDmH9N5@|P0zfAQ7T%!MxBGM7Lkq0dFs1o-4 zB0SGimG8RdANy}ELVUS@gJ(@*GIE1IR^-Wk3PC*sPHVC!zfRktk~Cl1Np$)`Thx|M z^_Vc9E*E%hTS$jBkEKG6AD1?4TR7Tnb@&7T`fLe39*53)ds8xVSlz%WHZY-z1o)G_g>^iSG^@B>jlMb{;ZW6I6WjbHW6+wSy~a54NoKtW=u0 ziG>%m+75!|+EQdBFRX(>Gt9BFCM2ba1iIU*e0|9w0^dwWgb6h7ScfOfY0e!O zf*~X+x!7;6p8;r-Av%g4IrN`wz4Fw8r~wzZNshfIe6LR=wpI|{Cob-y_x;M?Yg-gi zg@2~^fpB5-=AG2WnQZ&6T^oE8?!J0ww44X@4DlYWxPvsG#m_gZfia4x+K8;RmHRQ9 z<;3yU4snmwZg}Z(a#O^Z=%o0~n)|ZSyzdAao{mXxo(H#{vhl4woBIyH?K=1Wd$!kA zeH$i;M8jMC?={>zPB_nm^8kLGL@*M6ZBav+x+i=gpC7g6Zs)Akek2fHzMOVs7_Z859mT9fk=ZRQ%)eW9K?s3BI$Ojs7U z`7qr_0jHeF5jzl)JWV6C{YK!V#CL1zT}+O$ZZ69>=;5=iTx(jBCdglmNuw&VpYpBG z70x`!V>tQ{RZsDq&`>eBuqnG6x}Zw=?x%{2Y3`%M)%YVpk}TY8(A3lSJ{_Vkq`)KM zREP7vAac8hV4_@0-oO%uc`>T=>LyW!_Few;q1?S)oF%~Yb5u~8^B2x8P5bQUxhYlOWxm| zVk$mHFdAXc8mL^kSqRkriS~M6=zEpJZNy0M;-Clfsqh|O_~x(JtvUgp<7>$=Ia9mp zFSiM@N@?}by=fAgg;U-)rEwB4FGG(_JM(pIRIb+D@7oZqJK&hOPt0xC?uk=#1!PM6 ze!IfaZX6HpF5waHjci8~qhLfpC)CQ-OH{sWbW@@DCN(_F=z3%*T#kve(cAtetr^|H4W}N5^q`M8F|_wv`*x@Xqg8m;#THYu+8ybJ z$QG$p7!b062De}TaPJK%Y!bD<3Toawt-?xaxb6qnTHU%l_HDh59~WP91EHJ;^JX8N zWJGS16WE>ROw-0(N(fozj9-7$!$JU7ZCw>hr#tFzN!N!Lu+K6@rOm6PYg-ZV%PTYO zu*&S^`43ssy=%VWNr(qKIC(^DVl!vm_n(v`a?NLdq+12^8iHaSDZI#_igg#L= z`Se%T}GS*!Rd)|BzTXC(BzXMb>0tj-f~uXZ~_)i+ZWb)Ed2^d>iG-{;kTn^c?i zLj_iJE2ns?6SL17(rvNWy__T`{m^(Y%EXq zPH$9fB@Ezra!-06hDAd6A4HFixte8TJG!j|T|<2@&``ta z#uZI(R=D0n^&~eKjD%KNH^8kunSMi#@G5DE%~@%<+6nfC z7HhQ)EnoKR{tOvSI~1{-=VTBmp~k;y}JJ&3*c533+A_6L`0Br zKh>0@5Y@ajH*CLb##Xa34OEG)y9`R+C{d&pv6Mb;$XQnav6T68w<|@yOHEMP4zx&j zjaM4_k7)}&qXsN09Gk83+* z#ukj#&J;nMuDN!!ne5a!H2SL#6s-4(ZLtO=;>*W{y4U`mcATXSET2P-rpeGL)o&Tj z6*A6;Af5qX%4h2DWz|Ue3Ab)m`U(W~RxVyABu%|F*cBqc%z7hyWX-;(mUYucZYm2c)gVCUWas*^e{+4}=bF4* z_4Zg3?FwEXahAWBB?0e|nH~q1EoGfNuDa#=!QjKib~D}bouwCFl zzJFD3h7jOTKbDaDx9MkCEw*wAsO?Pi%kJ}-O#W-b#p>U-(fJ6mPNwENM=EeieiN?t zlF{gO5U{V4Ml7KK@?B>jxKM zW5u8ZoBaLf7U37XmYB`GY`Wb3u z8oU(^^&?VsBY?NBwC=}99N9IaV!bh}F-R~<$8{A&nstIX=LPS!b9J_doIupjRilkH z<6^y;ep9(n)V~-!`!Gf0qh0|-r}W3fmT0^t+*K_)(Xq`5Ei|F;gsj{Gp=n=L*w^3D z$XU(bkH#rC0DD6mra!>~d@io#tWgp#uJ+Les-|Xzc33Ia>H&x{tG2eXoI}0kk8_tW zAt9d~xs4Xqns7x1fJ^+Y=c8Z5rKyqHv5geXg8iAcTwjo-2sCh@-<;a}TS?3dV}|gtEDH8N{lLVBs#|S)s&IWe0{S0+S@Ki-~Gy@VJ#nHQLZWR z-;=L-%Y`Tr`@sk$(7^y#KjM8$S%Tf7LnUt1 znW95{ORW|9Ke^tlAk=)50!3e8C^RKRw{)i-&a`S7H_zj=om2^6HHRma-kBzqm zN2J31`_qBKGIfq2wKR#2Jc;8fO$iUH`7=$MM@Yd)#*LD`in+6{O0_iE*c^@{UIySp zk=nBtH1&5vW!J(_@5Q0eE@&4?8G~a#z+3-H_n%-5g$;S zl-PwBNknY(s(;@${FZWgkSXgJv}RrJzUSP0+jj`Vx&Ld`?{+^!em|!PD{GK|Gf1vU zUY)FZ%|W?tsy;s*Aykx^dS@miz@&K<>QqO~L z*jrY?=MtpI@5z;=osMT@4dA>L+KDBq1ryB#GWgg|Xz69i6d|QHb&GaBml>Hn)Y*|r za~&z zT-ovS75~&e#4_4O1~xLv9>x{E<09FPm!XFqBBkclFrhKQa-4Q29rvUH(({J*wY|6A zYcihHw+;H(kLKE4c#f--O}CN4Z{FKeYgIecfHT^ylZ`HegA)dG0cK{=G^C; z>+EY^``WhytKcZ?rg(8>0kNP|?a_2ayKijyPay2^$8<}rh zynEn5d6kDg;pOQuI}&sN+7ljzjW@*%z)j~K3MH=s?tj@r^>@Rz%64n5D5#Vvld8Xv(d{d>&cjV6o}rBZjG>>md2Ojkn);ex>;K&LoQE-*x zUTIgrAj|$@6P!s#)G3>Oi)(`;P)Brq)eFju>jsT@6KloOp*T;}Nlv(?Wrn{WH{o0` z$opx^1lL2h3rZ=bC3bp5vXX}xKp9uYSj5+B6l60YpMOj-H_z{fm7^w zQ6+Xy8PRc5BDpjyT>~@>d>YCsOavRxMAO0Bwz!I-ttp#2lfP?HufC_sROijg#Q{4R zl0nt7s>pN>m$L}n*h%Ivy0eW5F{8zkfi-*qhmntrcJIl5?(@rxrx3;BwtT*3C>NIcH0QxVnuv%?Epe?EVSKA`@&0>jf zgR(n6^@G7#X`=2&M*;l8_|i2_mnlRjTicmZql7x-&S162-El+>y@)}q_lkY&)f&We zVP6ZJogE>O5PMao7gAgS8EzzTBHQL<{RMV7PFSeZ20CP=Be8w0YF4 zH!|BU)n+IS1vQ%rOhjpt-?3cueep4%tXgEkGDd!Qj*e*xW*occH#-oq$SQMY$I-xs2-^i z@W=*(gtlag?k1KdYD9vOTB91Tt5WChSuZ}fR-VHq#^gi}#yMPnnWpYjBH!`(miF@{ zOj+@ADOCZMIULy9sF#1Oy&hw2Dd%MGNGYkv+69sloiNabMaJf-ha24!I4TX&MJ9kK z4I@xZT&*>dR53Qc6x?Rir*$9{URFv@W76T_>lKCNJItced>!K%>0UEKZBxNcQyb!% z#T7*T9FyRwCEviC@;+xmy5G-uNwM7Wq!W766OoK;uVZc>#6g7=ZADQdnl+$&YpX~I z!drXepxCqZW~0fYOlaA~YyA8!(E}OcJs|4z!6D-CrqW|}c5xZ((j{|H3##tcby~-n z2Q{Ah-=;Ke9MtW4RUO8u0dAnNbyr?jyRJE_aOz7C|Ecp$pq{&TdRMVQ>i!4m)uG3UCccTYwlZ(q<>mZTQc~p?73&i#Mc;{i*ol*A1YQ_Rk zlfG-3(;n1vEJkeu8{oR`ZsXR!s&u2NeyMNrI_3)h@Pfj{_;UMJP4c4gdA<4o)+T6s z?`q6rUVFi-_RjvZ_nz1C`NEFgCZt*map`$l26DE!x+`+Vaz3!_EAjL6H1Je#EW)o{ z#!?y=o_}91DxL2YC0|sG3xPQ*R2?r$VcM;)&9oQPmKO4&@t}X%nm6y&u#%Jsy1}3Wj4O2toK(Ii%~s&j ztlsqiR*NYHI>q4W@UB2lsD!(Ch z84%d4F}gmln0LF;|hrHlF}C2FCv+^ET8y=?p|HaAy5 zld(S_c>4N0S=3F*RZh8ALs7ItY1^`%F=_5Pjt-bl%pN-ps6yWq4PL>g=0wY+0h^VC z;8>WTo@}P4E*KLokW?7`Zp0LQ?5Wt6uH-(5%{c{N^DRjN1@-XA8$J zuL%YKFEOD9g4euR7rtsX_GVosI z{#wGfxkv%yox1u>r-{b7W{Xo}@q#{kQ&4~-{Y2AtSC1)Z>cbwpi;r1S=^nc%u+_B> zl3&s@GT%m)FS&(0!*@UOrGI@iskt=R^;K!=^<}m~bw!ce^t1Y$rMscc?|00|9gJP&6ni_geT!fJ2D?v;GYb6b^!$omC~xze`H_1E4s0Uc2+m8Z6 zp|{#2sNg2&qkfBzt*OC*H2e4VZ&*-+=(*1>J|IPRA8_76t#(6wK*{yL%n}!JB2v#U zDUj)%d{rzm_As}6eJt)yF6wi<-|-J6^sTUM8kyfM=knO^#?hxl6x_9 z32tx@BbXJm85`b%+;Trcvr%D_5%)N-Vy99!lrH4&@xm`Op<+&@npENDO<0!wFYc30 zR@)XBdCg_%2!n>Q=Bt%1<18=G;jXcC7{ zZHl4sIkoZ=)e}2!ChDVWK3}Awf>}HFY>pbYV=V*r4>X&U2l5Yiv)a=6gwxUszXtpS zQ%$c8xv)x~tm*{Gs=6)L0qb1A*F|p+IJoy6avb`L$1kO=_yA4wjK>H;|X6?d)PckA;^qmglU0yMQ zyF)!#vec%RL#J+>JO_Xhg_VY26r%a55tiGTZ%qIjj#!IBxMw;zV>V9 z$*-gfsu~C)Wi#yecrhcZ27bnNrJSxDz&*PIG4D;4O8q+!=A;oceE-^vX$@E=V<5Tz ziEJ0?gBBXEZ5Y~)1z*;*2300m_Qso!yCoGx$Q~ZuhM^GB639lffFxEjWOtiw>%FDu zR*@_dWXgIa8#S?rGo)@TF=e11FD8#~;QWFqQFtoOZ1`cybtNJP1--Fy68J6Rwfp-~ zBS$Z!V98E#hTrOpjPv8Ipf`WE{ZJL^)t75^SM^Tf<1yV!<>=yzM8Mk!YG0ATypU9{O7H+Q=}=ZLplsYv1ymY za4l0(Z2_vIGnEg7RC*82HkG?mmd2)~M>U*ILQfwFj!S8ts(S@%e5lXs(|Mk7f(8!W z>3|x>14Rm_Ew+tx(Fvu?-`mXI@m4X0J?q`2L088$4;#a<1-NW33~1OowJswiwf8s8 zy2B0gGk{4hv%s-adSpY@MX8qv*^0n9YoYHymJUN7EYhu;GtY)^01pDHEOGW7Z2G8} z#1EMnJsud23_BY?cm<6yBzsk4UhW^~4)G}gFK{3u#gl7}Rl&waH{$H^8rqrlm^~bo z{=BkQ5~bb4Lzb;Vl|jgoN>U?WS!Pz7jB79!vmR4-5>FtrNF}oGV&bt7(m!=@1;!_@ z9&Q(HWE_M%!JnC8!>XNWvzih$MUIR2+!-d5zeGh3Rt}gC<&FN((B^R7QQPhqRTSFC zRSv~L55Dv(H%E604-nZ;zlkRaxZgG`)Q-prrEZnn6zq zun@Q*|IT8_x+HE#_HQQ+_sU9H1qT8L9$nL;=szs zSZ;5Sx`jE;$qgP-G8^zq25^ zZXGxV{@^u1Jlgu&5=n1Ll1c&Aqf~#-djFFj2{v}Iy3Rjm8$4VtJcJ@vBg|1Y_-!`< z&M6dwj7M9=Z-GUZ4F%lp{y>T#%Xlm3V&nYs{?}}{UG3Faw&?nhNl+=4x2o&zMXL>E z-*Zal=1hq%1zn<(v$SSATN9rb*F;(ynOb?9W}>#{vx z2u+u_6{3o>z-RNXvO}mHSDdwlA}voOgrLR@mQIH<6kzOu;#fs0$H(*%`Xks&hmKS( z*LDYa`9=0hZoO))YSc%qA(pN#;s&}2j`bThFYjxqmDJo$R5h+Q9{ICXH+UdXqBln9 zRZnt{?OdDYOJUNk!}n}x*G4^DfvVg^3EZ?#*ecWBYA4;3f~=Q!9J(L9CVS&5O|dvJ zL8O#hyp_$V{GFl#ZfA`$2=rassl*w}z!R$B?~$&jq#O%{^Q7nC(FMSd~ z8;=@KCWC3%S+JLu!urW39t%I=cid9OR+x-54;o*2_tJ-lVmIU#H>EtouFL=4VMBE? zJD%`SXdirfeg@mNktcO1Mm`FEpZSvc4Bvi=ab~2M)3K*B=f+W}vZ|D(xsn1&S7ZCt zpj^S}>;?HcpJ#LL;@5atlH*n>VRnU@u&0A1&Iz6a?hxz8s~muSl21Z-eK=bvV7p+@ zXF3#q>Rf{|iko6ToU19*le5wr*r@(E7A5JkD_leZ9yaK={OZKWsTWlscTzS{tYt7b z*1-%k;EN}?2B|3$pXR=j(2WT*@8uqc-f&Ng!4JMoZ(KOADrfa*Oc?=NU$;Z{jo7 zEtREEVCQ){hsSS9CwkPbz!n-Jx|Y(;Cw}x;Ek*wm7r_!wgh00+{{*h*%LM9fzL&hG z=Gea<-LDVVdTE`RFyV?+NuH#-Ec@K@+-~K;kM+z?=ToZ@xM?Q8p54!^Nxe}hN3J(R z0idStWktV0FQMU+Dx5m!TN(`NO&VVF|$v4ZxqNgrR( z^bah;=@FwCOMQjpxNZPk6Skn8qb2sL+VXa9UH08jZuQQXBe&xPQAG@B8@_R06)8(N{fpi~8 z!z<+5P4Oxsf}d;#^I9#bzp(ygt_BlpFqS)eClTQ+mfj9M;x39a(Z1Q-GXM3g>oc$2 z@I{LR1rMG$qo<*Eq-l_OrAqde%#7?Mh!+SfJTmo8iqS{pbgVOz@uwR5c6ep19cd14 z_A~ze4Hmw?U8IS&gG#)8jtT=jZ8{qTBuLE?sjTLe>i<9!Vc-?Lv>F!ABPW@%q)|<< z6M$S|xn}`&SFRuVAGkuTAxc`f7d}huxm?>CVw7|I9_!rZ42KM$SHlD))$n*8eR}sF z|4BG1K798k+|w@7eQ7xmsZ|DO8NlnG)9#*~0vChqE6xymGP4TA+lR*R|DqGsj6E^* z9%wq*)nbnxPbT5ncBd?v&qekuS6l{ffGM1U0@#So7I`<5H##q$p6idpkfMD|byrBX@HKues$@dQk4{OUKZ z84F2`2G~i38RYnTw6a%fWAm3xVk952wbvQ5D04@Dnjv?rn3k#o(38aV9W89|cKIR4 z25&KR!r@y9Es#$=yk9SUM4s5S8(PD-)*W^2_WOea)fYNC1wp8BJYskfXixk39R!{? z|4y+6wGt5WYybG2*X}PP~1@>LV&!JVf1a6Vg)YjRofRs!71o5KMSSf(dV}Z zT`mtmC;UpF{Rg68;)%A64q8qZq~T0P5f!=KjX#?|asP zRj(fWDU#B3e1bcis;I1*VDWwZ-srKaV5YEcT~naZ6{9?%FvBuA!SHbIWlzc?oXf+tESQaVTMFQe?br zL zvKROj@e9EBG&nWpB|t`E^m?5?zf#t1JMM>lBCmER70(8D5!CAg+T_EeUBLx`+GwMP zFDr!d3crI-HQ@s80MGH%rlaV~Sa>Op+*IrbvxBtbL8r! zOa1xPBul@VU#P)p1wX-sr&zZEQVH+%)agm{8`zBec&)UQH@tD?K8uHGw?(K~6(ayc z19aEYPG}+1ZFr$28D^ie1`Oj-3Qh%OEk*e0)H$SEuI!T%inYJ-K0Y9i-V&8&CYGU3 zmLbCnm@#Z*^7E>UF?n4;BOx%63!V}i29NY=k|P-iN2Ar?vH-9mi!FTrddc8a8g6Du zBO3mMb8A$`p4-?6Rv{$w58nDav?M|RxP{`Zc3<|ypC%f~d#87*k7SE>ypRT-@UoHE zc(VBq+)mce=Ea|YydUT29j2`}aZ-#qnb|wLcg*uFoWxkQyc3?Duvf2dZo^>3AZMZ1;LS}a@xD?2fFfs5bYp7t}jkkm8!&q4{5~TsHq!0b`Yh)d_+lv zlPTn=mavjC!lpOhfq#<*=dAcn5KTCNsro5;;dyn?U3cZR$R-#rBY3ZdO>m$O-X-Emo5V~ih@GR*|D!845HwLrT3S&=k+ z!OT$qh^?#Z-U`S#I^fae-tLE;o^d-jfj=5#ixF}*6sbp~pO(MoR~55Lm9iX`BeM{0 zi<$MSvs^zw^p*msBTE?XNAO&{F3;q-QkIB7+HnpXi1P-TFbln29a$f;_LG@@Qw;4nD39v1rWsd(j z`NpheyqTw%47joN$}IXe#BHL3B+MxpvnK;bXm66Mw(GKEPsm?&+0CrD|f;(3gtvskFz%OUI0_~epT(y7v= zl1(|^a3Iqr+E+3X;f{Mk)|+cHNBtUiXymRbYbBODecKG)?{CbjIxL^r?NCZ3Kr{$8 zhrYR(ePO5z|p z>H5birg`@v52T=Zc3OGG(zoW@VCDF~{6YYeFOg3Dk0RTEnAaN$eNcm_WaRw`UF{jn z`IO=+Z96fcgoIil3In1|niiB}Ohhe?rb&Rd3Ei3S?G(0%aoe2b7Af=Y)Uk-&7lOhu zmaYhr&WQ+{ujs2f!&Y3Zh0FM~-H2|fc>97}iYjKcRMqL%|bpC~XGyvTI)fmGVZ9lRE)nfL^h1$v>oC{yC zE%ChlD|AiKZO3QwZCOMm1AL_nP{sWLLS>QyV+_$s!+QyQ0FS`ENW{97nxjJzFDPC! zqUrwK?l1T74|4O0K8iQi$<*TYpw?$upCKO&6$vCU%BGx+riVkv!pip)96U6p9v`oq zU0DqF-LP5Azr?z0A;{4KSsaumm?6yTtYHDNGseU6B&a!jlTokW_T_z*GvvDf zH-mj&Y`AiyVF7XYJW%{J^X=}vGj5ZsDnp`C%HOI1d0oDm)QD-5q_Tdm@u2PZ6!iv= zZb~NrxS0Sq>g^B?g^Y4wWZ|Oep@)W?f+~=V3Lo-u(f&Fq1W5Q;GFfV=xbx?a=KHr1 z$R@qSdv^;a3?5SOVC|k1w8-~85FlN&@u1N5ht5`&R*(f}$qY$>ICZDYcJpPz?NTOs zD0aEeI(|WCOJwebmQ5WmX!a|eJQ$rqiV7h*ZFniG?N^C7+$^7@S;)=c+v;8f#;8FUcn ziaEMhk0Q{_)WjI53i2HF+Ua?SQa#Sq>%l_FognLd5aPgD1z}+y~A1@az{$+pSj2%6pqU)eWEQcCmoc58=zsard ze=L}*`iraEfFV{p!IM;b0P{)?*vjQ)(OmC2BS+Jhzk}D6`KHOc!##&&_oJ*Sjhm#k zw6zu)lnLB?cL{Hf9Yh(Z^hg&drEs$9?l2oIqfpV)+S$0Y6Lhs z0K6Y*J>vTqwqZ7vEgx(G0XVup4DS0PpkX0JXPX(9f}KB>KKy>P4d4CKX>iVV@bejP@%)i zw9A+)nd~he$W_&gKgIoPN$`L{_YL%}D z(w%qMN@wfbxh3@cN@>iH&As0F$#VHuA1kxyK#EH)SwTqvUEQw^Uos|w`Y;7dQw9oj zhOiyW_cv&7sI-W1f;$6wn{@7ZBGbchAW5Ad#kb2+tUt;sX-dYQ4DEhpd+gJ-D_h)B z7#_23^LMYLVB4}#y;oYVD@jGlI$m76$>gLiE{c=8&pJ8%bkMA<%%#cv`F(*s1}Nn+ zgn4xXl$-UhOsu%4g??jifgonyPOx&m8XC{t*$`v`DQq+Lq}uG`-A&Q%$p>FX`(c|^ zeo(`^;ppf6bDID{`y^x9+LD0}<@ zzJL8d;--*a_<>4@Dr$uPhkXWk5qV?1kU-k8K&+0`DpJjptu+F=O6~c zWWLel`gP)X>8`z(;;HaZ1rGp18RP2{!Ix-QiCmcT4xJto`u79eGi@SpR$EO$79)FI zUI`utlnNgj==hU=<8Y=-hnpk106W|GT1M?L>9Fr*72AuQ6F6*lLXUkH*#px+jlo;> z{twUfSM1(Ma=&;8dzXEV7iDEjX*@v`I=iMMF;ApD7wc~5_b|*45A|Me+q`?!kR2ln z4PZm7c`wqHTu9*yul59AFahoDz@a#Vho;M?R$f$EDp}O;3);tWf|Kq-orTsu?5iYf zWzF#k1y0?)uMcCvlbzN5+@qE^a~Pjo*)%!o#$8)Xp8j|ldg*s3QzsxmNfX|%3z^$oVVP@LQlg(D{RM~4Df>!*rswx7XgjKwH` zxKu#tPNyYRhr`mtWRl!hB<6Kk1;7YH(Nq2W=*i~-19>drmezYQkX~St>=JoIbwoW| z+q?j{o*(v9xAhMYvC{))?~Q1%;kR@~5+bG~N|BwZ-1$G5BM;;v^WTd)NtE!v$0AVF zY1^@RpiLV}BxIOd%^-rOT@K0Hrm&ZdMSQMb)W=LRKqihiIx@h=!5_{C(f4EX*On4) z9UQyMYN-utIim^yHS%!w@JbXF|4I*2mH`Irv6MM3U3T%cl(z7(;fpmh(j$L#|53~E zEJ~&7NVQA-oMp`CbO5`YHXozmjrP(S@o9fYqt%v%cT_#^X!1d$Ts0QyC-W&B~8d(OWkZ z>?SZ{*w`8x7b-`zpKzmA#qqITR^X<-4Wh?<`@Qn1XSb^802Pd(=bGX|++520iC@;y zY&Z9|Hk^jN7+b%v`K*Q9?N@(QnLoHd@FaMqe#O9z?C+YSyLTI3bTnnpbrr~i*LG0sx4_pj4ZyCe2t01|8bWg#ILb|%W zbg)yx&fe@)eDn|&y<>E`9PbQb6bq(G-(`BI%%fQ14>}Wyj`$%+mpS22p?& zs@cULZK=ozq`{f?Xlxy9>v1DL9{|zBQ8C&+QT@*gN;zOr0u_J+0sJkG(cRX@@`WmA z(wuYVcm-!@O0`ZtCC@jvFmrgK_cDxd=FSd!x3iu@yT2Anem`#$K$m< z^w3XleuI4)2`@hmvMaW~h9TZWESmL&h)M6aY80r=7V7v{4l&k$1+3zp1AEKstL0be z>Y)%=s6~E8aZUC${`bl98K!lfcj14Ni^CwiVz#lw;$}>_(aMgUzDFe!?=7ExVwaA_ zV6zE@jXSw)_+8ep$MfT$-Pz%tXm=kskn|?riFkifr;_L2fN*v_Y#nIsHaw zwn2C5)Ziw-FE4s)4*bLunJVSWlF3Z6>*iJ}*cFVYabbNAMBGI|^F1JZq$I={iqqH- zN(_z4!tKs9>(15fZTCEjN{cmoX?Kqs`%|X*>+FasmGX*Adk)+yCwtOzi+ip29yLHy z&m)7QUbXvwJN9=J-V#K!cN{ub%d8A}IF=v*BV+)!RCFP@PEX9}anY-;l*8Eyye$h( ze@g#=*C>nn7qykNf@MIYh~3cs6Ch$vM(qB@cRuKMCTi-t#*IFnHdI`~$5 zYmMASyEd_wA^qqHShb2(sdDG}r2~vj)e{_#V2=9?a{)K{4Sc68nG!lfEm;GxCB!(m zPhokZ(pOF|CVFO0kQ7iiIfh)FrSyKicvM+AwK04TgPYuoL+0z+7UtQ6ZVRu?L^TKZ z5asnmXSNRe+CoC?nWT>!IUTIR{O1YLYhfU!#u41Fb~AwLw?IZZHJ2TzN}c?=wf@3B zF&vDN#XP-8Y|H$Eu8G(g;s6urFXsdsVInTU8wTcMzb$4Ll*6gVu@DqZVTJj|QV$(f zIpk->8P{~F_M}<{9Rb9wkMqJOq5Q6^ICUbSoA_;;D(_z-KL?DX&m$RfuEW8_DEh?H zlJ8qPi9ERHF_j#TZ;Z2<$5aE!FyJdL>!W*rE#25Bu`ftukM4)x&NG3xf9}?^2>c5j z0_FRe{3;P2`Pc6b89Yr)b@0@lmml*K==C7EMH(14%#@sD+stqNoJ>!BOBUW+KH4&` zC##U}Xb1cRfx$n*2)^P6eVVj{nuD}=4o`ZNSnnuBdCbyRMkgj!qtYv-R3G|G8Yc)I zi3?;_z!51tdlq4a${JFwj~$5)y9Q(UU1BVE)M}p28)xU@J3HL; zYSt3BWy@se7Jq$0ZL}HKL`9is^iU{sYDSZEM(1f$v-M=1xf{GZiB-2@q3S+4YOTfck8uT&pW`3qHqe#IjPDnQ(mh;+${x>7 z&5)91KNkNI!Rr`XYJ0Lq_v~`n=?J@JEe52d zHtzk>BvKDlz5=_=hj#AH)Xr31u()A#sSSn6I{FGvQ8UZRDurM5a#$DoFFO^oOiK{( zIOet=;hOU4P208Vb)_u*IIu$5FOtHG+)cPhCM(k79o`)%d$hrOq*3TrHX&$%XMZTd zP@ekbsUmc@iW9fAc!$SS$d2CRt{9d@xod@z zCoV5o%cLHc;2hhYd+fFOS`qoQ?+m)6Fqx4TOtXK|6&?y`{@KDdQ1!?02 z5lU_+(^9%=siRkmWu30*qHmj$*{<%_wZ4O4Q1yhJP*_zoe-#7-D$qc!YqnktFQ<7f z7sNN@TLzJQaAY20+ry1GCVyK#JotfGw7%xLzZ7Wok$udpm?j$c@Sa3cn&qAD?1^0~ zd_%jYTMtBT#8?z5x9;aAHBi@PGnf za{d%bysU7Jxrhyec;&tmQ=#ze<4r&5`+4~otxCP+NW-%jVgExZob!i;I39fqk-Mm1 zImXvpk`@@@waDCcRo63{O7kqy7N<4~%6!3mC_>Y%thha6D%C`&Jw9dGNJHEcX2&j7 zIqn^fCm4f21S6FM^G+!gG*yJ|d@cg|tCSK+E&=nEG(dv#fYTSDuoDSFG5sV`_`_Pz zP|dU%eyPs8FVynGaP_Jizot2&D~7f^q!FOeUJ6ne&2*sYiOG2 z9MXg$^`iO%8jCy;(>-C3`-@v8%&cUw z+`6GsGQYp2wnhr4HUZa2|F3KK7xywzwMJi4v?l*7!o74NyJXi23h&Hvgo(J2S!zyd z%*MSMtYj*k!<45>^27L|Wl~`a85FrTS!*F(s(Typ)btqVk*$`P0TsE5_EmJ26$#JY z51;N!GEMmp-s8a;B(K=MisLc6$Mp=?kj7tFphy&DrRT8X%*fC@ULzu z#mV7O0cEzQ1$b`-+#^%sjd_MC=X2Qj+~frn%jpCwyJW~u)u4)2f6|8qepi|gk#Ta37vpdLrq?NXWhCpu|~qNtVSVh5SE4~StO6%`l42aygh zk+^PQUnc1`675BDEp6L`Cu#y{@42o!s zDPq;NnX=OA*pi@xwsetcGG$LaAn6ShLA1(y68TW@mYQnEb>N&e6EUS;Tk@p1tR!Z| zPqS-^9VuS33rW}WQx|rJEPotx%1NJjd0P^d7BksNaw@-#%ZY?~9xqTB78fPNSsP`C zJ;qlykk79vcBG(C;4G=Iyl*q8v!4=V}o>n^;jB(VCC z_m|x-e6qBhQPE2I@Z=sB3!^_91F0#ydz{Shqj!Y;;4xbAOJ%yOHk_}*3#p33$~!4r z2AJHl8E0?q^*e`4y^CfXj{X-TsKW7AVl)(yb_@uhANb4COSfV6a!)aJq;YU=5O_Xo z8Y#2LkJeNR*8%;!VyMiSogiLUjy0Q^0IUeM^CSMZL{<>48|z@9(N)xUDKL2I;{jgE z$p^5dI*cr)QginzcXM#W$2Y+qOxpiHH7y2M`R${p7{hEL?x#Mu3F=cMqX3_9~_K zKkY`L$TKECSGv+JO?bwv{$OY?VE6wh64xPTG1Qtmu9DBZ!i%WcsSYWDoc|BbkDn;r5_y zX4*ry?4}=`N1!>p?ih)F>71KL>@@$wg=0#K*_8NMCItM?w`EVlwi>0- zk^iHPcu9LA$GsjJ5xzX|;H}TKCo))OFK81CvaQQ$Vt?$BT)?kD+`zQ$AdPkH+YsLW;7XF2WFhFbm;qw-IiJBv`W zrnu)hti>_r6`xLxbEbbEmYBZ}m9rJo|9QVz=Y@V? zQVpesT<`z6;9iN5!@pnupRcm<6isOF_j<`k)&IJ4zzqzfN?bm;e#~}!~fgAQ(ER26+?7v^Jq%FMv zzsB|F^xq|FHsq$E~DW4p4pg;E<2` zm8K*J`?dRGpB#?$Y%3im2YnG>;YW{dZvMY_w%H7uQux;f5`@G`N*^e^l!$mHps)hV52o z;@k%4(5fq)npuLT#d6kVvSsnC@yXq=YEud;uV=i#v4Eg(l>n?I$LxV zca^kw*EDb1=sBi)hF&*+a*tH$MWfwi_4=sy2KeX_YkoaePgyH4yf(%U%ab(3+MxCD ziGb@`ih~zP1JvM1{KLFUzQ?K1!ls5&Q+ty4$i>D4Y_WRc<`(2Vtb2lxn`6DpJJDdg zy2%=0O9Bf1>O&>M*$>c!_1o1tscyFiCThs*B)yNuE4A;qETM-AaC;lC^SU`9uT7SN zJ{K@MQW)qh3%@$Ly8S(mBCsBM8C}tKfXcsX)%6|~c}eQKV*sd-ygOhA$qg+7g&@!q@LI0SEiPk#O?y|AqOD_;vTR>9SIKojUeDlLmvGXH$g9{(-Nx6N( zy$Y(Mcu4U5UJFZgorhhv6eAvVnArT=o7Cz$Aq*E67wlIwZ@%K#CH?kZc&M^vJ$utM zf52OX%XQk@u$gSxHMnRN8-b|nHY%oXGNP8^Ft|Rq^7?sXL!C-giAy#3t?Zk3o^D|@ zJ03`=B_uLK^z8N!wmm-^yLVbIrPB+aj`6l(_AcCvE@aTfaQ1IsgIMZ3O6@UhERG^wVJ)nT%`05gjKJrmh5`POoPASGNP@FBjl0dUi@EmxGQ@pURlj@S2&y ztHB*py5*}iR+}`!(x)s+wC6g|cP6Tj2dSH$zfhMv9*JStH@^I)7{oNzObS*+l z^O;0R@0gWJHn#XnDO31c7Upl(`NyX?T`j`_vG@n4tP-&+w9Kl#)3Q4}#z)zZ)Jppo zue&3%^?WfJE0=ms@9D@9xBV6iM6|Of%ZjdkNw#IuO&*af6ulq8zqC!EUjRV=owpbl z-wmuntPRodBg=zYxsr3zJ$AL@Ijzv!D#o-~qdB_E(C)RELo@HmWR zXi(xfllBX?4*1opZET%&hV={tR@$3I0=RkjhaK%?RG_~8@>|>p`&XD(Cl{aC1BicA z#}oC}Wyv=-oTHuDLVl+HW`x0h!fW3?XzXNrF18UX z@TpI|bKs4NTOKy@^yTQ-ld@=Ky#Tt^gOQ-YK;9N65Ar;W*g^Qyr$0me!>HDoeza}9 zeCxiBhF;p&P0r@OjOV&6sc%e)NoPXDyv-UP9ibE*?P5?r)||v-JNsyEo!fTv5Ki0~ zkVU$cL5SEvYqVK?`*KS@^Q4G@6Y;1*(BPYO5?9mr)mGQru|WP9;!n))->{ugSr`e) zOV*j28GH^Ge0Z3R??&;&ufoBcsjv2;@F@kk7&l#S?f9FQ z@VS>nd@li?d2vqKa?B0g5S!T2>u|w2eD5a#aS61iOj3dFNdfHT4o-*%5kGT>>j`xH z8{|5A8~N9JW4}LpZJNC&=~e7k;^0iTQNd=AYf{};9@fL&BFp@vOX+5))HdTy#mUx} z%i|%TdsI;cPWndi6(b`nFWt8HrR8;)YBhemXQFp_1BoqfXZW0^R?5YRr^sFmL{WaKaG%z;ZUJn zx*16rn&L;`%G^4p3kS8Mp$r>>w7cRAx< z9K0XD&3O>}6xBR?miNA+lc6r@@qM^xC!a8yoCp247nVj$7q?+1CwwST#O`6+%nd&7 z%wh(!zr!hnV#})b2$H{UgREql2{DSeZ!T>3K>ddAxNl)x_^STFGZv@ruMZ9Sz8L5z z@X*t;exI7+c5E-t)3`eDyqjkzP`&>_(3~?cxsgUBhBW^=ytnjTJ95 zUh+#$k)+2Jth^KJKZUQPErNSKC+l%rZg@p#7`|$;lQHyKZqJ4&7);&6PlGHPEZ{rT z91!|`6hafRBHC53=Gc}Eq_-H1;e)NL+jT`4H$z5^e8YmB zt8t5d%Y?`%IL_WE~ z&vRyTGboBQVcv|aUFkLKdxo_u$Hhg{So16i%ghJ@;}awrk1^G%mM0-Nh>(zQ(zVo7 zYuA@)lSW~k;KQ09r?dN>56NkQGCd9Z+m{*KjCC-GdE5Oq|TjIlB0OT=Q; zbw1yBudZP-LZ2Sv)A5IyxZu}(%uaUC)OkE(b&T!lGhr#;69f=1n4G|5R3-@FP_mY=?(D_zFU6@lXs(1aA>Eph@$k>=iM|U#j z)GmS}qEHJBW$Rv#FDFi>V_9>KEuMg9pb;j?!6eyKk7%KP4RjIm^EQAu2%U6{n^3ocqTVt(G)Y*&z{ZxGuMerOGK?@fNAlDGUp~! zy_7{>ur+YcUbKe0{s|hm74oiHm%&UOHw3#Z-ZSTU#V&gP!l@iejVC-bjx=2p`VAY$ zxPk3?apxo_BAuCDsypE?t}%1kY{5k&DnkPtY@I|iX-NNX=Fq*IfqV;P!;(p4#sm|e zoJ^XLBOS)iB$>hk&#caFlhlx&-5XkRHPSL`xbTcN-otq@jH%tYCErb&L{W7J3%?ylq?HZPzWzAX=s+`<1a_Tyh^c`VK|uk617U82 zk=GW2`Bg|PI;u2E*KWhC1=Fw!yUC;(3wiK71YOY@C(C>+-s)?XjUPbb!;6fYz8*sx zQ{MW^oRpC@C{>>yXU(E%2~+N#UdNBW?jk%Q5hGy)3@l62@4FccXi$o~+kWMjU55xt zNF_a48{2YCnK5kwHC@ef(e{yVJ~#HT%eN?%r+&_;1TIi;wP`pM9 zMi1@I0oh~D`UYXLbvn0iea6lWgSoV2DJwT0AuJ(T)^jGssy1Wvgvm4z96da-k|_)K z5)qk%nUyh?mgdC7XNncvhmruVn@5>GV==)A@vyBfYI-wQ!H!NV@#Wz^! z3Zp0ZPL}hfY{mZkx@0&-%@SBX?`IAkI!B5KTMSICu+o*WG^nT9t3HC}!b^o1D8xV^ z2L7us@Zpa6Uj_bu2G~cJukj|*mOkxD)4pp{ikio;>%?;nFlv#sCcb-(e|RS2ep$ou zlZRRGT?ejj+riOuPlyV+&;A!`M$XyB>C0ZT(?enJdH2UL4H(9JsCKtBP<8pX0=B+=-aZgYBmpA9xb790pGAL{Wet|*gx;9|_ z$>SW_w-HyPF!mjPA$`>%_T4+)ChIX^*i>c=X+-I&-Pp2o5tYnSIkaN|cU2y2+IN{t z=Z-MIO^00@7V|7hJV1Z5Wb!U0K_tCVbeX(BOg+wvhM^gk&t1nqEcN4WX^HK9k^!yS z_rYE?Ag2%A*F2Z<)|-2`p3|l8C&Gkgh;Bhh+{^?H?fR7mTD916K+Lnw?x#<2HM=%0 zup#o{H$g^AT8B{~wHr!Q&JZ#3IHmr=b&MUHMdOpIvHlyY<5e$1U5 zs9wf4>%u?%*Mgd&fil%g6$$(`Za(#*F(` z&zUD0Gv(29=dKYDTZ)Z)j&bqgd8Q7o&Xv0lh)hz6ua*w}Z=`Z{T@zjzv1|qE9_l4k75xIc=q;Hfp^rLKYxwa(Iwfi`>4Qu zfvKO?61X1{CUd-CQD>?MPc&ol!c81IwVy9Mj5u}mDlx(Jb zQ*+>0R_xrz;$=Tl!MrGq2F_t_zXn{{H5bpP`b_wF3nz{pXVJ(u+}wYFHR~^vDU4cj zL@-`2!|5)zEJB}UmWY&NNynTF*H%V$< z$$k?Qt|eJ9|DZ=K-LVJThGRH$`Z6bXEyXqPA}jWvBH^EiH&vot zOG!`|aT%`!(KZWn)_ck_&Ky6?_n&x(Z`l@NooX{{=@Kf5*0cMJRV*0Xg5U=iSh4OX zZASmhm5Z0ywR$|^H_x+nhM~`8wr?4|L)tlj%r0rNEU`RYyZwOdqv~_ z{NhejRl2hE@OjRjJI?3jta)(lqO54y`jW$W^X3f=22SJn@uO`1>1!hI@5MJRkvCUP zvw!OestlgZk;8It!4w?T@gyh9+)`pN7nVW{6k?zd1OMe15K^PC{1FVOQzE!~?Ie-5 z?u6dEN32#V#zHkd7s5HRMm|?8HHXV%QkQ2gBUo<&AJNKrftzv>^Nws1nIrBPL^Q?{#b;_Y@ zYHo?MogF4dW)!uzBQ^LbH_tz%T#H&fx_p#}Qk9-Kb%)=0$}_JBD%3BcdH=(IlzwXA zUjH-t)-R`V0L7q;vwTIW=u6|V=TTjx@mEo+y5Akc3tV#ri$iS>keP> z>4l4U2Am*PRUfrVk9zI(-VEeFwp=+$7SMo z_X_@^rSc6;$J+X1fh5F`MKRKQmb)6`J;s` zZPkYEtOw&je z4Xl_InmH7~&M1+~2Vc;2_|LSdUq-X0>hu^xU-8Sj>vx9O)M2Pp#`GRJfzP@%(cBjW zCe9T*GwPF?C`N&0>Quq>rarBj*Oz&rjYne-tS>(kjY~Qny@v5)y>QVOzUIUUF`;_& z8Y4>!bVZw;sfZXXsxfk4TO5^u57sql=axy5n9YXz1mSH~ieGy4!PQpT?5z3zho5*N zTEjqLphHFb(A++Sz@o!NH!DN$d1f~hirexqnQ_ckV^W@G|e9hdL-lHF` z_KJC*HRHzg<;u6~F*VQznkvh2gJQYZFus3t6w62}t9lIhsvnnD1k0Y7yOQ!YSNOdU1BDnU z#K3R4r0H6Fafp7inTvQJgom(0OmGpZB;`%&xM}-{hoNLf;wkMx5&- zy&ef6r$$H5los`?Q|upGp-3HS94pyrh%Ti~;kVEdrvqJ~f~!1m?yoTa0(8Ey%4NOQ73Rww2FrxJtp120ynqff`@m-t zDss)HXi>p%tcF-k7n7P&_AVMmNArU6j{vL|#xYFH&`>+(;2jyu3JsdcI?6l4a^8|T zB9p?P1XF)m%;ig`*t>Nl>qTW|TdWA5j+sdJ#x-*v76=}nKF#LCBA^f$i@I0EIL24t z{tb_*$jNnwS2|x~SEugFK*(v3YeI6w35{aWgi-Qa4dFsPV)k z>Tve>34F};1r9L>6Q7tcwjAk)q2j|O#J^hBL3UC6ni>^X zi6-j0Xol1rJ?M$EIKim|H%8(o)TxduMq=hAEoZ;-4?i>2Mp()k&9j{fT<;f&;7D1` zDVkALlO#S}1`&^i5fu|)VS*Gan7LJ_TG_G$-n=1TTjcQ}GsHpgum4VgMd^|Vmt5*= z7#-zzv@j1F7c3TLBL=hL;+JFaTCNJWtSKTukjgdlM1IGMpJk%HXrxbj%GyxG2I38A z?kvKmG9-t{Iu#r%{&3mF(9&A)uB_dxamv0fk}aNJKg9Cg*GLdeYK5|;36y9iVu`CM zY7xMh89EBX_5KY3Kw}CgW_d|T@5nH+#4!7wJYr^Sjj8%=!B*bCT=-FlfkF%vV&K0E z10Pa6|6TC^o1s;6=g?LX8>8bI1gy^vELU)1rOYdF~~)MRJ{!^S___E3=?|mE2N^y?xb=BU#xoi{VlTK1GTf z8z6*;+*hRA4#HfttD|DY@*jzMVa4b#>WkS|hTu&@n_*!k;kJwDQ1|P}Ozc`)(_m`k zOLkuH!Op=#m>nU`gpkfhMhH=q@3)MBw!Sr0Tr)Tt;wMh!io8{6Ac1p-y~MAnqWCTd zHiT$a>t+!{nuc`j>DRUbb55>fWq>Z`m3mR#E)Qj^c_{ZEgFJ+^LXzD-v`sV;FK9V? zCU`uI_KjrL-ff$R1MO>t~bs$li)z$nxy#9os zs7%V+WcADU!4rW=8WD|@re0Yq`HIY4EkjFObdB*#c!BtPi&MNjksiXgUk<{g&2)b3 zT`%7&$`6H6OA8b2p#*rS)_W{nKOILxxDQJvea7-r&uHDCW)4xOPJF|mGdp=^IgoR! z24f;{Kl0S!=H7RrA^f0f&4r8t6Fe_Alv^gIMX2bQ%tPN0GMg)G3WPnp!3*&(>8jYN zDIAe9{_>Zvs58jawdLEXbF!Y1n+iiB3L`EEE~28Y@FIRN72f;kKaB_@B*T=Vj&?X$ znbG~HMfCQ_3UUxBK6;+d(lIj^QeM`^d;TV0bIO_&Cp#*+r0~e+jWEEqG@2TjFq}Q) zgSG@|Q1aBNMN_7dzkEetRjy=@m}1^1Am$bs1O2ox*6lsXv+xS+_M9PFN^M?VTF?0( zgqhTOf3)Z*>nVTTN}p{?lteq>25E|a$$OE(t(CJc=v+V2;ilLUCNH!9EfvsY2?y|3AuTgSNl&QkVnM>3XQB{D1& ziG-keHBwuW59y7>48e2uP_O5ZLpA0NfqL;A-Lsz;fpJ_ob%Sy3+G6E-iRojeFl10uwEeHMam#TUOz47{B=X7B z5Z>A3hX5`_L#7;@y27+{?OL8m`{pytG=_2}X*@W$gA1?hS=GAxhdq=-PbEx@mP9#f z-oGoumab(|^czZwMa~uRC5cTn%yLrK)SsVJQOPxp#8}h3@;$qHvEP4kni+E)`Epo0 z8h_H5=}YDd75JL+j+xw)aMzc@%&FF*b@mH6pGtk%W*N%&?D~}ll-4ue(-B&VFGS8; zSzog5i)Kggpe5Rr2F*IK?c2E&ZQPgo)$E1Q43hWdzDVfxEQ-;na|3=_DCS1NT`6Oq z&W#iMxf*RpomQ=cAW)>PIUN#-vcM(I|4PKi?A8>3~j5);hBCvK4H=73jFb1{j`jeezcR54vsv>6{1k;02-Hc9?B z@H|tD%-0V%vS%L&>XJN^JU|AzMkGEy!tAM;^yt`vc%NIWT62f0J-)@wQlHa`22&YZ zsW@u}%Xb;GbTRK~-?}CT=WXMgX=e0nQl2Nr_Hgl`A-{ZA@&hok=7%s(TG6apJe#Bg z*Z8ty6O2;)c@ZHRr%Do;FE0-%a4Qb^$-)$So^b}hhXVIr;#ICZ6q75r`fmB!&=7<< z<1M!e%uQtt8kt$symx0tuUgLJ2w%xRBxA9AFNrE)do|ocmVh8{HA>&J=D28h#J?$j zQHWn{!UH5=!&dUrL2a<*8i3jwMs45!t1MMD>d2_|A>QRvJu) z#uYWeH}WxPf?&01UzE8kGI|ZHLw;G##P|?e)^glLvB05mUPVB`n))N0TA+%2(JdJ6p7l#h)75_p@@hN+PhcvIwT|AmD zYu2L7T`Sk-v~*m+(pldS)3-aisUd7wyC3VO6R9U=a!1y$Va|l91a+(<7PV0v+`0kX z<`d}GrY6^pt`i2{l!bE#U{xSVQ`Y>*!hF_P<{1TL{>k`hics-!vEdw9IuXmyzNUG# z7L;B*jG5n0qEqX-r1*KUb?YH24Ec#!gL<&)#3ZJT{+3S~yW#if4%hB^W7#;1F;K=< z6)%5Mv7%?z77eP-yXTy{C?=-HA_UpBRsuA{^Yrp1k}EVvKPiHPd*+jv+@DVy)TM&+ z8h)JdJ>A+i!#vTOee1Vl(r^T=XZE36dGYP}c|1`A`{N=$o7-2cCML~9WC(fA0clqW z?_wp9)m}V$A{sz*F%!Mdnj`ngG%m%p=fW%rlb?5QQ*fY+VQPjRRcbY&c#)lq|7Hq< zdbU72;5K`9?31a}QyFRH(ZZ600bw3RfFsM53}ub|0rV)od`eOFkUv}gQ5`xm#tK}D z;yeBQ91!x?`B*gp$k;d_M`_={p7YxVs_f%~h0_4e@{@jY>&ar@T!3009| zR<6^5s#@N>d>cV}x+PscX+zAlV=P^^lyi^XG2;8_w5VL1+I@!6qNpwhHm;HgJO{C; z*hs<~yYuv-C&|Sc@XJpVaZS0)`V}i!v+p{^+l*y++v*wtxuuxZRSpDIlh}GQc8=0{HzwH)(&E(pcr>(QLoP==6zjP9Cr_} zbH@eBw&+3`8w>Fr66Qh25PLgo@h8fjCfe9oSYvCEWgB5-WhIe(vc%&>t2CyhaXM#? zUL`6)0tO6{C~?glIJ18fYu9e&Zj>XlW=x~9RY7=!U=kA*dmF{RO&fCyD>0eLV;&?@ z|6=x5LQLmB+_UF~fw37SU5a3&c)CmRs8gGo^{P>;Wq0fZG_{D$t%^Hn!Y?C6WojkSue;uj&ZVY%gJRl{2ek zi!bM@zD>-^Kmce6YF{DdHQA3HAsfYvSj;7gFX+8~XO3}8Nli16*#>1^> zzI)j}bd5}LEa6JX^Sc}tXW(_^N)ys2P#(MdxEu`C5 zXK=4-!r-1HBvB<{o2ygKB9_w|a#P4tny~Tz#%UQX04;glinAWF_Myj3tnwDV^ z1_|7y4Sm@paBn;Kl$ssCq%tuac<`J&G`>b-WNB?LreS&3n4vXxwz9@#%$2!jZ6f|l zGN&33`kvXJdvITT^>*#LOvSd{BnqFgFq+aK(R$d}TgzI_UN_>`W@#yr70oqTplsOk zekz(vmnv=XC=$tvMN8Nqrd+i{+Q-V3YdLpc#h4%F(7S~jnQ1!m zoW1z?z1KR(8zvHB-8N4+bW<~XN=QV;Y#vQZ&jcG;`#O5IeD>);ir9p+ZNoA)?Y%61 zdR=Jf_>L0?o|3LvFGBd|pg{{O(b$-YMn+eBrY6n%6=(ezHmqF1`gJ>TYte@p-?SG~ zQfH?8G@TlTer(;ek#(Cq(Jj}TU%u`rW^BTw#DsF|?rSn+ofRzlCf2fsvur6%M3ZY_ zp3BT@o5~p2NnaIpg^mLqTT~|2>n69o-(p>&DnAKRVIW$ZjceA5f88lOB)G` z(TGKhCsRRNVSx7WCdEm7@Wjkhtr)?H|CFT-HZHO+Xn@hCPP;+0tEkN}5qK?^+*p>? zy3xYLkq3{jtb?jSCa2%&A~n6H9Iz~VcpJS7&RTilyUvUT-TJ5 zKh33r2xWGyUdGb3hp?(x4_EgRqLt6zcYO;N21<0nG-+eGoH>WC2hyisN6aPE^sOs5 z(YLV|Kd@ZWYAt>78?txAR4W4$m#R$v@duoO9?K*Wk|esYWMM#I z9P~1x*f4W2^~LAuc2J_s?fm2Laa;)lERhQRUy0A^Q}K0^IrDqoDp;46RvO;VA4)J0 z9}yDesYA5%h9b0BKjlm6SFg;39aqp7A%LFDk)Rtp=~kx_^G`oR@%bz)g&6p|Vn9oz zJ%2zp@pna2R=+iHs0d9U}ThQudTGNM9j)t3SP@dNg-7vI0jOe z?r&|x%8)Dd$Oio2~~^Zrz(crHxJ zowU>>flGV=j0`n|tmf&webZbJc;qwhn+5SrMk+~?*GNx@2faMRtpbyxp~-qTs}@!K zTgLS7hEtC@eAmC}2VtMzHz^-kc+CEt5C7R0<(X8;05AF~G3ODkPNcLc;xKL?Ol;N^ z$v+ku;BndmMFMb$$B1z0hkD62VK`&{z)dJP+oyu6)UzE1Jt9 zB~2C>)Iy0Hi!ax2m5;-%gOSGnA@{9=AEyMOMc!Jnw3grLn5B;-D;jJe=eOcafb z4f3F};4J+J%ue$zCW7qLFCC^N+f+PbLd2QdiDCn90iv z>zKAZo@GnNVf&FV={Zd({m5B^*UQjghpqTb#RV~D_?Nsc{;8OX^^|-{AGRandl^URm-yi*>r)BUo+7K&K-Qc>a%$R@ z&zw0Tb)+UGlOgysG00^+v!Ir`fhf_$oEKT4JTNM8b9C{sIK1A~|x ziZJMXS96{&I5uiA<4uz1b;Y#JK>Q>N-p_gQfAov8iXtT3pMs~46@}T+N%CjL@OCWS z`--g(qi9#kobN}btUY(fz+X_L9yBt|5{12WE9Qk?&W#pSW8TE596TB8AWp{ZJJ0h zjG_J7i4f|F_=?tM`@!=xu52tJ&?OZ9@X7QNE&H$iYeLiWPzE^J1wi=A-YQmG@qFH4m3W1+4cGWT~jZE`+Y-hhG&nbCHvWu>+ zNILV3gyNH6B+<1BmXEbx@S2kA=EFA&)RePYv`7r|X5pgETs=}LaSBS6t-4{OyqmRsaWef@+v*1{3 zOTET<>Mq!J*6-Z8qWLWcv%sOhM=|^|l0Xa}FN!dtz&+8X#Helf zd}J$0h*@Aly{{yviI4Q7AUp+sD>=rD3+%l*67K!<>R%;%_E~DX+7K7y#qHNt%$n3Z zOT+(>b`*lq&?I*pwS@Z3J4-)oSH@PJ&$C4HphW8WO&sNUOui~iTHgIgPlP$yB?m9> zFBF79O9TccdCseX_p|Hydw&YUBT*#9Rx#iHs^COnhSFmLIdW(}M=#vKph#)Db{HVq zmg1a0y$SCCvHFNlWc!A_eA1yaP6qL8U->h~uleFwtqWtm>?u(T4N)aaN{Pe!@x0(k zOtL*KdwogU`lUH{XczaR5=AHNEuqPe(ywPrSp!PIlB}ZrKG=tnbML2RJE*+;3o+@H z02gvwM@*Y#+d@mi)E`>0mc!Q`U|*{ZpAQ^B3EfC`tv?}J#uBt>*BXfg#OaeKF|X25 z%w9|J=FWMpJ@cV#y&e+%^ey{#Z06DZV63Xvrg!h&RFJ?l86Pu!eh*jSMOJ{u z!{>YdEQe0tr*4<0Vvo2i6|5phA57etL4gXxT6UfX_omsT!726&J)3#)`W=A-Q)YpuuQI9<#5^2@3 zD48j75^Yb-bPd%%|7Mus#)CI zGm8&;xEOX{adu2NWz40NxcC}?(r%%{-#}`u@Lz1OUr)q5_m()Dgw6DbO z%<7Uu?-=R_OXxaaA`T7baOcbze(l?iMJJyydA%?>%SUtSc05JJXE{1Z%rIRVvf1-A zb&KhV*8q4CjA4Y$ZKfFi!po%l`%jbi~xBa+CI&zkj_)I#jCJ=wGkqZ&8EzKl}$=4{Y5k z(nYFfKe05h$8q1s?7BHuGQ89573k%UKJ~_5a za&z6rwZ#(l@9fX%S?w9INc=*tjG+0KZP_^SG`?O>F?exZ%-tk9 ztVvy~2zK6og^^WHrfr&n-sLSEc%e^PjD&7={xB!nAI4$f3xyc?Kg2*Gv-5w5+`_60 zF;IwsLJSmQpb!Iv82I1AfD#!^TYMgs06|L8w<$xrh80=0<0u18?8L`sHc-oWT50z zlBWZ`HqgKG9ugzHrA-x~v2SQsw-+VY$)y_yFgW{ys#Tg3CXoU6?AlGRcMuhOt)_a7 z>hx$^lZBr9_^j=DN|!2!N8LuaOZtNhrQ*U;h=IQ_1`3&-{||!`9q>vLEt*r(wTR^V z2qYreND@8fNhtUy+6ec5O^T^K&bGz``ua)&lA<_U=h}e(i7NlZD{3NxUXiF{O>xQf zktIKRUyTGe@b&e>#>ov!<6L|FKhenl{3|L+Ive;V1Y2h}%<@F~`duB*5Ob*)&v_TC zOS#Gwur~kqE!pI_NS=Cmi}QFKBtiGzkz4IwY3V=nu7u4`P9!l={B#t5 z74bEUyt|H}BPL*8wlRxWY?sJ*I~g?W2l4NbHwhZaxo^tHO>c5eOv;g2Xw%qxU2h4X8?7L;&}0KgOk|2gTjg zlJwh*jSGJf;7T%c-2_hlIF!ZHXG$OfGnV!!M|z4Db^1QAs_GcpBb3KRtqukQ4IV`+u28J{2N|8zjzWq&fTGLF222MB0nwKq>-Tf zHY!vc-60{OFMI#SBP!PYGM!2L@5=`Dj#<;jv-13_-+1;PUyk*@$Fk|W36GZz`45+L z&dR3u%dV41P?`KCErjV)#&G&oRQ~IQzdpb~TJRHo{cb9c10;0KKPnmV9GtU^>-V#9 zs^;9LWen=moAHY_5)i2*6Z|)oj2M=EH;O@D4q>5$K$oCA|Kml?lS_Npdg^x8+Es-! zbLwc0J_-HH_B+Yv9FxBJnj67N2H^Z9(*GW_mu=xqQvU0I&0i|+o!!CC^A9w+Y9uZd zbEi#Y?m3^oB)IB$Kju&Vfg8Tr>+~-P=AQy8@zn{YPMk|{%D+msCb8<*$xPpI^`FA= z=GkRtZ9PHse~orPVH{GKGomMbx_6*o_m1@I{Vg{hglcF2CFo?pi!*H4wp}9di6$i^ zPM94fCr<|PF-I8r*?iJHy5b~(O|D(s#Hyu>CEwI!zMHgyGzo8ZWX(7}|7;-ZcRWJN z!2wf=Y@wUxBEdyeqNUNnPtp>M89WQ`Fp2b*erYa4+VpW(wa{@&)*jG#5 zHyz5?sjm?p_*~e?%2i8PHg`G`rZ2>$5>ZhA06+jqL_t(PK_9!KrK#Sm4@yK#Gdoji zHfTs!cN3{gg@Jo-YL#`B+-VmW-m@#CCoSMkR5~sWW)k_p5(7yMAravV8J&MR(+eN? zPhy~u+4+;$Pf1K9Ha1RdTh$WPOG5bS>u5H*O07on_27;*$LLJVU}b$G(dt zQ9`5U7K!2{?`Gsl-j^w%tkY7Z-i&nOL;W~)_7;)vQbg4(aVOuGw4^NflTtrCVUiQ$ zi4&L=heIVCwywmP{NU&lZO^FDld0(|rDEqzG@np;zvglCS6k0T)mJ_#=?bLzq6(>(Kkr>Rd#l=?(+*w|J3 zg3XJ@OVpdJTq+r93Ld1d@@`(}GSX7tn>7e7;*upKs7gYIDzK_alD6XF6LOgFWceMd z{LTYYE_BK~jO32wyJhXQB1#DZ1EDXYlZk>BZpqjbUD>lb&p{>+PHSx=c-77QCPg?goxTt5=x^?iR+ z1V&|kCx6g^OcDil1wI9(YE}9_h)|?RUlZh6nI{tJH@jpC97?EHCFX1VyLU1_Kb*U2 zS=-9kC&(V4gf%u$!ZjBNv!#+fB`U;^%V)0>C1au3^{Zr^Wi3fr7qLk><}c~8rzmS7 zLFQiWT#y8W@Asor*$dvux=JpvPh_OZz9#)m%$dL0y^v73G6$4BFCjtZR}QYT?yF=! zRK_Lmd+Ab__tTr)^zs%w3+~kh3>x(xmCU-W)4w5(YjYPR3vG zk=H3fl{OT3vxZydUoP@Bdt!p%FJ7X0{+^=Qb7U-%^7SX{ z&GhU&Q^I=}EDFr=%3iDNgV{Hgy-NC)SBaY;&nbIa-hDUw@%*1MuVu`YHLNTT1La)I z>tLnqt8!nN8`*oPO7Iir_mWH3o)McQW1k(>OEP07$#^SkBstH1pTE8Tz%TKSF_wH` z);6{TJ-x@>JGXgo{|=9yKf$TUD$qw}0+cRz6GznjA zOxq!SFc;C|x&5bj8!zGB->-coRJ^IV71ol+%19U>At@-=^b3X#=_0V&2>qa@NZmG) z$80`MuP(EB^-7N4^ycgN%jnjy1WA&!s%Gull4#q8QqCkW8SwI_@89{_uq5qRur8^&*YO9?qo>V?7~urfxj{a3Zt?8!O_W(u#ne1x3Ol& zL0-paP_02r%>1tqWz&|Gi%0P6*hWr=7Ui4ITjG0pKWin+{DY_As4N|5(Ru)1bgRa( z1>;$B!=FqYQ>rv-&B&fLBq`q!Dphgk;_<`S)&G{()=%)ZX~vhWtoZuN;UpLFz$)l2 z_kF@JDN>4FUrL0PR#nhX31s2yrBv+m9jz+ZYkKqe>;^VJF{Nj@6c()5OJHCW_NB|y zq1#x7^e)3~&mEF@bU&{mBCsh_n~~pqDqE3$C?7?lU+U-eLlopj6HpM9X5?UUg zF>`qDe4$fGk6`KiwRj8|L(R;`66(?u$Fjw^xN8r7@^0D2t(Z1(6s7D%`ctrECUIiJ z5^laTLnm00XP)!M*`q!Kdo|<9$t|3J;D>Rsa&#FwmVxyviaA9F4=$Zx)!Gd_^NYmB zxgwtpA3}!))$l#Hg_WlRDQTO)?mbt~l}Jhbz8HXE@Kv@QxU zVSaa6v2+!e?s}mzw4{EEp7a~olS)MlIKJ{nuEsjzoc@|~*PlwLO|g?M*M$k)YipR- zwD=$vO#F$W9Y@f=O{E-$Ha)_JUj-LhlBDm&tqZ&gh{3T!4L%$8C9P|S`rrSSBnezW zkDpgl$5qAEV_PJ7;3<3~V=*dm=-b4Z6$^gh+@87NJz??j8zOBp zpi0{gOr9_Xy%)#%b^QizJqtre`qr^WUq0>ANkWk7;JIWD_foAXp%cQ6Ly=6M--}cG z&Qh$n8E5t$CQ{duCf)l}-6WEYTMiQ?1WDZ%Js3Vr!jD?z2F8tl{fId~&f>^Je;lkF zX!P|&CUvOD70)%SKX8iIp~(~}5&bX=d&1nMdoV9*%biQ- z2nbE0RPDx$8aJF8E)E1eKh2`eeta|K3n4m$ds9gm*f~F;Q?C=MYe&U-_ac#6mXt43 zg|U;ziV4YjN_87XBa3i;nztU?GR|Dxy9eK}OiDFqF7tZ~Wt}WYj(*GDP0QJH4T)a(2i%_`(KXH_Lea8#1PZas9BP$710tc%fg@GyF{uaEb!HEg^YMG4bz z_U*lfj(rI__y2;g`?Qv1nh^Qwx+E0c!Vw`1Ep19uzqT#6ZaiS*lKr%F5o+Xpd9-UG zKkq)l^WYTRN|&PBm>+O{?#WRCFFeIR?c_^XTYao`=RztbAj}Pn$rEl6I)X-{9!J z9c!x zU*^tRhj}Sy9v|5!Nsu!rSFJUpMt((|a`~fbs$*X;_Uk#coAQh7xmMghdx*6gcM}vC zL$V~6t<_fM0oUN5Q=#D`s}&$i_8n+IgCYBrWQmR0My{Md&yt0MILbQt|RHNos7)~jk&5|?Bz-?D8#zHy0IJCveT?~x2{ zTTK$$rg8V;A=ax?)1?XKIw{;avW?ZdPvI9FDb6M)H0vgNW zkGd_0dVLAK`roi_L@T0v?y-IACQje-7Dhc8$1*kfX7aaWT-?B1i6HhmT8(=dcY2Qg ziBF2huyx~l4qkXD391t%@>h92AM+heJxZdNmkY}e!oU1WA=m#=G`8#p6m3UVKAh|; z@+nM*j;@{vv@$fzqgwVQ6Ul|82_PU0pN{-VVhRyriI7hbkZOd8S|XGY;h6{rl)Pnz zlCW3_t)?(Ail8z{7-S{?o{@>E+}G7Gf(mb=2qKiEq6$-*N3o;P!YFX*=;$ioXzG#J zg(AdLiRqk3mLX%QBkyXM zDq-}rwWJTJ@sjr`L-OyKNNNoO(KTh~2g-ww!mt0|F`$fTVKlZsk5--OQvUqwf4?`M z9Q~EAC+(q@9Fl{3wL>T10(;Is$3YT#brR=2pNkv05{G)9P+15srM$X-j4hAT>Dj3P=4p|< z2+*co?;g~xR*u9ws~9tLJJos)WpMY_sNdXW(Z*xcZ{3vFSGF*A>Q!$A7?Y0R6``&hgG9A%pJ6})yJBj_f}Jj3YSqbcw1oo3{y zA1KylAVYddR`BE}EL?hs^0ix|7krr6Lf{%W*Wt?{eX)-B(J(WSHuWWML2q0PV_3ZL z0#)j_!C5be$)A1Becf`59{M@WDi`6v#?_qnOQ2PY2Kelm&$3;Ih%$HMv!VSkiuGsn z_WQKy*#=8FWdrZ*=lkuC=r*7~rR;KJ*neMaA|9dS2{X6?b_nAPe`JvT#M-}AzyNjF;6t4i@A zW<~bvz9>;PbJ=Xy{_Z!2ozbhriWJ(XG~;nr>MJ56T#& zCrZLm-85c4@W-)cTiUj*N5qxIjQ-&SjfF8A(5*eD;Wt^lavz4pno_+CZ20jPcAdC^ zYrPiq@7V&EVh%auu1H!mQjMIhUKj|=6M*u z$PAgE{c*F%^(!(k(j`qa9nZtk=-j&xRV$Un|FkFT)@{Z++K|sj52Tc36yt~dAp1rS z1`DH7)ltQc1A9p-*PaG8Vf-|IDK}q+h?IF8J=%ESfA1h?B8tPqF}h8)_s7|RB|a7}*BxDli9vunoWVZEtT z!j!#p77$&$BF(E+AY5>->rjzy9h>1^vM9$ktS6vEJz5lxE5a?;TJ`aaPT1w+jXLnTYg6K>ei)O1V44Um1SBh_V1u33E;rz$O|;+Vqf8FSfp_CA$cb!0%#2He}df?3F@<=f6^cK%s{>$IShZh#*F-`50&jyEM2$^lake`TGBC}wnc#> zCFm-HzFAJy&Yv>qlU7(Jhls#rJvF;`Mg8gu!$mV`(YQCm`g9dZeKK?Aub@c9x)hfk zVZe~(RA@JlL49QpvdLio=2essytt-&aqRLNn)Pf)!j(<@KlZ)?KB}X8``NgALJ|_< z2}ytu+=4@~LUAj_O0gD7X`w|56l;M}+@*yU_u%gC1QO!z?zY+QnY-B#tn&7&yzf85 zkKN6^b7$tBnK^U(d^(*Wked(0xFOwPoEw4_Ykr1D^Nw(~tSrQm5U+ zhIVU%-01r_arOb6TfT>`^~|ws=49-CWQ&E!2T^93;1H9EZ3rRL^8AgvE$xOPH!j z*F+;Mq76-2Ta-7eyvR@0xL&?4q8F+XJ}cW+BQvC}qf70iGU@M&H&)iIY#LYjS@8y9 zXll$eq|GsFG4ZUp@Z$N3p;Z0&3m_ooRbT7n{CR&tH~+IuzCm8}Kl`qK{>2pexJZeq zYp0HwGI0moPmG)=}#FnZEV5)iEg%NA;>|}GPr|dUy%q{Q&9Hm#cZ8`NNz8sQ+v(Ii68J$i;(jp<~~cajs1#K>GCDfTL!o;n zjE9#gnzikT8(WXSuGxF&)QaYT@TDKgS;Q1KM!(jLaDL7xfiNsX6n~3>tPpwfj z)?V0vkf|Lcsi$4d#+bKiB^ui6BjVaV+LCx;#+Q@OxwaL`>KbFyg%GqDFo}e=H@O;j znmQe(nT5){MjAQ{>>SZ)U@z?6auKf0x}c+{G3I@C49!TOO`b4FS{ve?9b!DL(r9*YKQT9lFs>7;Z^`Vdk}C^X>JyaifD zpQCA9U3Blzj@J^ow#y}?g1FH$LHm(kV{jK`y9Eh%u`)UZiE$CQa_|ZUP2YfFz5Jv$ zYZ>O?;^f1We7@*M^~=t?8K%#zhYlTmY08v^(il2|2PZ>~(q0+O%}ltK$4#09Pg6>F zef4oXbUq%&Wx+S*Ji-d~F=7GDMj9wJxVGFQU#|0)^3JH*7vH8X4bin@I!-(&z`H%W zq6WwDoRVO3TX)P}xeBe_%}|&fgAt$4f^W;#Wc-SepqC6|z3bd>G^1n0Cumxtb?49V zQSX*g(=sw6vk!%#;KQ1b(F`;*EeBQ}u4vH27eA6YGqAAXGo=_$^A?|GtzfB{izJ;i zn3@}s7%D{I;|GY&bj9k~li^D(D$tQW3wn4$+~wV>HJXQ?!3~)oy0mM}doAlBT>0cLlmWj;pgoa(Q9fw?qMCgKVdS4c5fs-r4e)r8-hcTO=`|e z)PJQYXe*>+>4FbGTYx&9+Dhg{2|?7>>0Bo+5u`2Y*Af}}PWTct$Mz;pPQ*tGp1`U5 z=NSKfSE;o|PSkikp1|?S5&VSaP%&1RIj;wNXdW#0ut#qubo9S+2c4UGAS*forG$r! zctq3C3|1oSFil#EN;To^-3WC&>!4wW2;xZKHW{dN$M>*}K3#T_T&4}Q)h#(DO8E^v zFp1i|r4vTQtV)U+K$F3uvOziN19Z=m+3yu`<1V5gPz1JS2 zwU-Sg`sJlK87ChE!oK|^O#i5_bbhsN>V>HAAmkO%RFE3JwtYsTo?#tY5E#>JIUbK4 z%@M`nThp?jbE|M%&dEfd9vvaXb+Qfv@O2BWzvgZs8gLg22BA0&h5u|2>2I*Nvn! z4G*Jau&v36DXPI~SV~gLD9Kn{b+L?xiZw=0rIX>IYnafd9rAP?(5LSJ^yp6_ld5H* z-p-<*fGBd>m+Mrof%?rFm1|FU3RFH^DT%Rf)m$PnMSYo0H8|KgARwQ1NN*@IK_KwD zI139UTYEW~4qnhsLI|UKMT8&22k(=x5xQ%(t)*jz%#2JZ0>a??p#x*YD2q(n6mGR$ zkn|R2r@R`4J2ECl(?V148s(QtAk(9YJW~xtiQ(8XeF84z>2mxrVUmqzK5L2V&x|+kANuS%$=?E~EU=m#Kih6t*_z zuqC4-3JnaPt?3MVQ{_=CGCOMt$r%5q#e~4v*^VYrN=8T2cWu%U)eG+;pFU0UG7?_S zzNkY+M-)@9hBQ+$$5onH46oM!$3sd{yYIj^5Izj~DK|&U25!=G;zQTc9==WO5XU)I zC|*RA(o#2ub{-?yOxc7mn##!XV^JixBBR2|qJNg0Gbenrl!ZPf9KV8B#qoAOvH-?L zp0JY`9Z^Gub~G>B|16ws2!jPRSh&3>F*@R|oWz*Cx;Gt3mCTu3O%7cX131>S6}O?F zZ(>|^ z(QaDgW5^73VP$7u(T!V!HgIbIJo4XyiTMv38TLWO-2;L{B zlq44uPKM@2u&!RtaB|}yoMX28X40^fb$@(zVxy}k|}nh zvIsv9IroQP{j?}-cu^G4;aY53%c1;|9O_)(x_s~KtYkb((8Gt7qA!}e_`*%&C@7 zo08EH_Z_`FU~F=M>q~kwajBvd(-)#xj4z*;XyGOtr1c%TqZt_;QPkCpV5*jdHS@ z%79ag+Ana7rWt%1w8YMhne3lEE9_9m!>*!ZJwrVSPpQ^N#f|bG0_>WML}{p-f)z6- z;AvDgac4FX%Cso};=-cuRk4mM8r5$>KMI-z#YK@R&xDPeV?|TO_D-;KsKx}8xron9 zKx$bS=1d+*m=T9_t!k*3!NO4+anCPe)^u71aK8#49p`49uyED{d`T0>z1O#)|Hj$S zcC3fKgLBF@5P_0FHHtFUbW6KiT{A^A}p8h)%MVYU*QcI6UR|f?V9u^RUcIlsDeNh1b!a`UOiWS-&6lrYiTgNw7DFSJP5?0tUO1`ki;-D ziVE&W0EhCkvK*NC_QAL9h9a2~uIPvWtfEx)Mwlj!t{5mC&ITfWq$oTz)k(;x{#0J9 z^hts*>wY*eoYbLIiji5EgVJ0&)C+rC!L(4Lq$=4dv83rdRDbfDhb9kOs2jmXO&4zU zhvM65J)j|}pyf!2j)Jb4HLg4~MsRYDbO0$Ah5|Wh*^rrthkv`234*=62m(wHsyYl! z{o%4L7((f}I<+~a8ak+Mp(SD(NVde{3DLSB9K4A@R77JiXMC65jNi%FPT$VF72)SowzeiPSo2Qc_9| zudIw?l+oc^IRt{u7{lMIhc6DFqn||>iq$O9r`HRjOI1z4S0>9ua8h=~B?Tp}sR{8= zBhgY$Ws^84#oc2+V8Xg+OrJIeANqL0BIhCo&)mxcoa-;T!s=>(!+U(iYr466$8X}G#EnmRp^&@MB-D`rvRn0Q$1}HYD_uTgpH~c zq(vc`jHJ3!mZ7@L1)mB3ZF8~kvOX5i_!3_3F35Yd8KXBxNTw#DqJVeB>qvd@Z!%t% zOxh=yu%rx1EsVKXS@JXJ2u}O`3NT4mRUc$nxQ=vQpapX8S`}4;E^orHi51z^mS6%~x1Xr(g9#rw**_p-B#QM*YOwC*|paj}sM!TcDT=Ptr`ahdqIc>!iF zJBgv6%)rR{?l3P+z_dx9l8MoPsh$yZ3X@R4DOKr3ZysBV^J&ib;)9M{y3}M70lt19 zDWUP|Sj6AjhWgN9X#V8P7qHJ~=;WXT1zb7Tm5WSUk9*vJdosP!G*yt6hV;ZV*3p)Td}EWQ_?E#)?CGQE8 z&(HDkq^TJ1>k6avrG4r0HS>IFo@55b z#M6dIuMAtJCMaeQ4mFOmAmIrXPx}ak^+wTOZV+5t>~MC$hqyslD{;R9`V_h`)&>PD zu~@qBOWf9Mi3PNDaB*@(;L*8Q{Dh*MH=~ydSXTY0f~ zZ|8{{7q8M!=Q+|clJW4&R_qUsX7r{P5zB;Tr6l_~#toul|N84Nv-gmaZ#mi8A~Q9Y zEi>{KrCC9@Zz3W#j#7CZvOHiEjEGXXsE%EAvLBD{ZNY&%p-9h2!;^D6apUrRc((L} zjHcU-T zp+>3M`uPi}@iBmR%V!JQ95mH?+Aw) zc9dW`z_EHYnrxBqRJ~kz1A>?pmnvTtx(Y#PyL!|`$>ZzvHz=iJwmH=ElCbLQCDb+~ z(r%dVS!sBpU5UteWnhAEsOHra)f2B{I~{4G6O$23jl+uR8_AH_!jls7QZfOe&&p$P zrAdWjVi4vn+XG|zg?Nc{)UOp`i(QOe^ewpcJQnGxDL8j<2X;Kvf|rvW;U^7>g5F}J zCPku5zdCByss~$r1uh>sjf`|korPwNM6E0*70*NNA}S%Xq89~Ci-b{3Lz)%Fhdp3$ zgDXf#;`pCk!LoxVp|E1~979b;+hRXb-HJzF{=xf|-|gj_Z}>~p7g3_rEYPft6LxOh z1^?T@NJ&Y;E&p}ca5tTa@ zxNzhgis&qyO$YP0^(ZHLFK`X^e6u4W{tL+RjJ_LoPKNo?i8sze@{uPMkqP92x1XEaHq;2F`}X6=CaN920=) zL*B#EBiCST7>kJ7Wng6s4{tY| zS+NFZABP|!Gz7n_TY`Jp+>ftLo|YMEIXfZY`1ja#QhA zuOg*a|5gp4{98uTv_&)6+FBr;`ZdRz4N-b?D~?>ajbt)ZPp%!p zoaOsyRwhGENEr0ZtWc+c4;`L0aFyp-WP*seMnRVVE(Ibb)Sfl>az=5=O+1Y+fw8F> zbQp+a@1ohb8S?@+2~emR*rJYOb%Y;Zf}?jrke-&xKpxz8mxGzKQWJ%QQGQwhoND{R z+mj)TBOl_}m2hf<@{vo+10jTn=K1vGX&5q+6OqD*q{fyW^xvro^{fb7I(e1ar(A00 zUX>n*-m6L#1gaoV1%cm&!0Upv-+t!*bd3gsCZqquDU7i{0{-;~&U_``} z7oe3h46@LK2*#*{hpv^0KGw|q1bZxu5E~Q(Ti?N$+_g5DfikpgTpx=!&%sAmyikyu zO^K&5%`zwr=hJ#dX3V@y#%t6VjGML|Ge>=l<{>lixrmU&Fqqj{iLk3X3hlg|p>H`5 zy)S-&8FbF~^mavPJf)xv(<*2GuhI^J{3#Y@c)X`z1e#)Dn=Jq!6%qQ9VSoh%EUvx! zFrO)9h-qQIrz*nlrHBNgstFNNx{z=zq$x~&M(29J(=99*I}jUr&}WB5z@+6sG-8s? z;uE>-`vn6cV~EWX65SPaHxKS2`VAGcZ4-z3_-g79O#gN%?wvaf_4F8;;ke?X(WBvN zq=qYHjB-;#Nvvv6{MIsZLKpg(oLc)7ecKBY#5Wa=T4s*wI*FJ$bOe2+jPN8d5-o>} zMH@;^k$96lNHOFz0jcHJ1Gc;8GT=fOEEx`1L)QQXB!G8s-H5IYrjsEw#EfO1;dqq#n5sZ7Lf;nB z%unz@qA*}C&6OApsNxMp=w+IBNop}=oywnbwkM-TP8h7T8a53bgFeTM4~J38%(WYs zh=w#@8vH?P+DeAfWT^zjg2H}7(J=ACSDz2W^rgEnV#EWQE@sn*%NT>Fe#m5YE*LiQ zLwvVl9i63*!qzwkQAv9Ec)=Xhv@t@^{bGgyE~%hH#XE44_>Rh164H0E4wWIo71WMe z!YJ$WDEF_Bm{SRO+=t5bT@Fb0EwqV6WM0)wEYNk#EIgStlTPo)xrg=O=xhrseb%9* zx^j`}nKRPdJJ|ls2E6~_ZD>-%Zt$TB_yiVsx`n@ zBfDYt#-A|a!!vYLRUkelg=S}*pGsOmRe!oBRz=gfF zVUQb!@O(>5oZ5*da*5b+b}nX(`2f}?>Wr+X!>sbg*!-w;a$Y}6*#b>aJ?4O#IaP<6oUqh zMsmtBOkl7CBbwS(b0jk$Y`0!pi|SHfk#K5T7mOc)-Cj^FbKPfG}ExkBKL^ zH&mO2ot2SWEg}3X;{$079E-SK3@v!pZV3moqxfXhC^(uBU(s>fSuYwtZrXuHR-Gkb zL2-q8MGvDt9)py5OEGb9e`p!XVMWb%bt_$(i_*u^wKNSVD!!fk5f0Y!Mnuq4 zICdF~*3EpGN2MzaC#=ELQA1!#ty69pO%xf_V(W^Ps5iz-iUh_8;i%VtC_0BkW9j4} z*vh?8m>EM;xt9@h~vI1;`t)dEEqd`p>dO%_<6x3 zL>+TRLUN%b0K2|xJN(DOqf~wzD5U7Gc6$E}41gb($|1L1ST&aYn5>Eqykwuk^g^e{dNKmTln^Q7J z8|9=Zq!#kPbD(WKLo7!Gg&>~Jyb79`SvxwxwYt*gzBoGt!4Wh!(>J3Ji5a3|lPI}! zfxfV(U`dJ$N1?tI94xgF78(H^BTJN~M^mbs1x*7}c=7;~B1*BYqBs`;0YS*5q|DH~ z25e{!lv=0__Zl`d&nQJqSSXUSOJHH=%Jz7$7Nq0p6ONw;wuS+vyWZZQ-@jDExB{Pt zA)BUN`qgYhVVeRArBW=O4DUg;Ji{ug= zc-ULM{G8~8#A8x)Fp71n!OqG|IyiHv@kq?oqKSi$<_i-YM(9Z>gqyoPbm;J|D9*;S zXTiwGVVF)`L%2|qX-;iMPI3g|b7XwZQ8KM4$xA~7LqFH>aA9s35}ZZ32o8>ewX-u! z^~Fmn5FH$d7@Cf#Q6pwUpAMxDj{>Pt!N{R4m6L zOi5KIM}#9?+l+ojN}r^H>{NutrTqx1yJjsg?86FC43$7Vc zrB6)7OOrVZeI5yYTL;*bNBSzribqID6tW8B(Bs;yS=*iKl@O)FdRTB2j2)cVZuvs0 zXz0a{q}X7DFldD!&TU+3GSI{eI44EZ)RUTp!cq-b+Bl)6tI~%jkLw^@tOF0O1Hs5q zI}#ib4;x1pt~K#ah4ewAKZ}hk!w{aKY0g$m`f(*p)8ddsg4noP4S0JvRG8glB}O46 zJQjHjm|^GU0xj-kbz^(jS{e~N*$CyDE@mJDciu~+L%0#O7p58o2n~;cl_Py*7}P_Q zjO17(6tZ4*6C{KN(XWkWI9yw53Pw4~eSiUzcQ6>hI=t&^`2qmq7w6#lvmpA%RD@Rs(7A31q~aVQrwC&s=KBqB6=*)7=*8C0s|rq0|&p8!6L*nXMDtiSMYdMH00Y zVF?-ZSJHr!vnz_S6OqQy)gHbLVNAQe;3t7dVK#UsD}kfC7pj-9t&)7=kg!NHFf_Au zcS9Q2vclYsj`4B?am^ZWO{idymzIRcloGhR+aQjxPoc70ht``y^Q0?J!i<5_(0Ros z3~BSa$*G*UFMvL7*$nxsL)_=eJ!;AzCvutvhf||xLFU_3Uug=OO+TZAYz17LmAIt> zymIF2uJnI2%1tFp*H={QW6qjPP}i%dIIKA!Ow`p zN~w9L&QePox<%0p>M;@RW*^3IKdxc2n2~|ckif9?Wei7L-N~DQ0p7&wC`ThF+ya9_ z$+#EN#7zed&Yq}lsWjn~Q@iw(=TBC40R>=2aPz7|=0>a&IpR2uh-A(Kai9xvV|Gdm zwJeN|?OYwniP^Aob!5nYu9T7-1O?EFf%(hS^o-%;Mto!R<~?4J9gnBaqv@Aa3Nx!3 z#M{gfXJ7?4YZDZ3KRyqSLpGToQ_f{|Y7?IaJx6u-I;g?0_Yt9d2bzA?;F>U}mhg#~ zBQn?eM%CeDXGFL?N2z^H)VDKJzW878DcI@X6MFhD=(?)ODhT{01Srp}3O)UsPHu&KK9e;fi?B)D!|J%Lr<|BTMxuEDrYzOP6$l>o{OxrR~wreN^4z34_W!K(7l zKp^?XL5%u%HD;dhM*~XB|Bj+4Ovd)PBd{pY9rGvlhqYQdc6_%0kBnR5$941RkpFj# z;{R$Nc?|759vl3N@D&3s)G#f@`Hc&)Gujbbw=6}y>Pn*j-vgauteiO>yRJszvzfDC zPp#s~o!{f=18Z#CwFEV-|83*__dxFN7)ceg^LIeGs*nE^0#(e;e+oI}b4oGgpKGJ) z=_&~PPeLFsAsB~FTtVY;pQBIfx^HB3#EYvLR70yCT`8@6#ct_;5-R`Rm(sLwM0 zt&|`2FCVN-#|m9XEk@Cf9XP&m1(GS%_GmH)3w!phVs!p;=<8$P@Xugubr|RNtwCaH zAtQoy#LCe<|AmZ>0EQMmocINd?T+B|PwSCFKdtID8)4Ok!Emo)bpG;6CJ zC@(u(3U{r`d^x&rwhH?XTCIBI&p@C`v-4-5SM}^)4S_1n&Yy#D6|?i_;8*o@6$Gjv zPz8Z12vk9!3IhM-5U65y{>vxue|-2=%+8;i;J;r0`sc=5_4Gdgf#1qE@!F6oM^1X} z=D+j;$NbL^n-RW>3mCHYMU=XK6SV&DI{3B0{~34_KE)#G=|4YVZ+yf5uW))}5C6=? z%HXd2`%R+}gyTO_#Jc)NI#zaC87}|iI7BdnKT;~M*~;(m_BQ@l`)_aOzxR$v9IO5p zCI1nLv)>d_{`Wvjq`vr1$EAE$6@*9i{d;NMRq7=ef%jd1tq_A;0cjI2#8Ep9Er~ftN70M`yI}IviJ?$Nxs{H{TW!`kpiYOa_zk{`tblf|1V|Ax)Wk zBscsNJ{~&+w-Xt=_kXAqMPFgW!Ep#D$YRcJ!1$5VkibyZZz@6i7{2?X*9hc}`3 zN2?&x;Xd8I0K>+vM*(4=U<9~l0gS>{z9jA(Ux6={Zl@&q!weK+-yI9RV3K5g9QqJy+_ha#Ko14@i$?-m=heWaTrL*ss}53`aB}Nv%-MfOiP$u>VC&-p^Ir);{GSizuX>V)OLi8+ z0l&z^{#W(%wsy-hf^g{i6Zmu+i7w3=;9nQ&K%ou~FCSQ&E5lj`?O2Jqb1uLAFnimJ zmS4}$%|Y6K0PlePI}uiBfT3f@!lOE4tp5i^mJyA0S-}iNMfjEwYP+~Db3G8Ml9n&|3NzG_W(@B5dIGC zH5e*f8IJk%kLxgN&n@LTR4^nolLcopRQc~Iv5$^n*6NM;eYJnP#nPezq%h5ZNL!_A z;Q?P8JBip)@EZgRE{MgHq2ApYUi__upt9PZ`Yg=LMmoc5{~p;Sp^dQuNA>Wy!E=W zwgz(_J>L2q)}4JKX=r|{e&s$iv}B09eh9Ny>_i5`>#K)9(1k(5hKPo;Vl54`fD()ff%=+W`z*zi*T zv@23Z{2KgUZ(jwQS9*E#9CAksZ54{*@xxbB;UARF@at71_N%b_r~ZD+arI9P=ilFN zDWwsYj~~O?I}e#`(+rJTwL_PVjiD-IHC3CXu?3n~>q3_jmOCf+BSpgw z+GznebmkTe?P{aX;DPXUQ{~Q3!LI=44<0~)xi_qf9%0vQb$t2R`!Fm`#QvSTaEIBu zO&sc?@1TD0tZpDZlo9a+M~)oBlh`yOA4@cSrwh8btR?095F7q=G{DE0r{&t-ZMYZ| zjdZn>So?D!x_4=draZ_E^_X>}APxuiT}E|p4_x=(i?H-!wCp()t(?`d@0Z=om7#!Z zy*B98vyGI5QBX%gmyhEJBcR1Hhf$-BebAS%l~O~fUhOU4DWQ+CpYVJhlLiy#+UVJ* zH|o?dL0M5I&K&lKo<}3(-8qFv`6l>y!Ure_x`XX|_92{kQ+=6vTx6M7ugL0JhG)0V z;;{ck=GiDk(@uTSyK_TmF}Kj|lZTLI>GR59i!*Tf)E*qY9Ec*3p}c)hyw{-tvLiW`A9o=&M-EFSGAyH`b!8M;#(Wv) zkDq}C^O?k5IfUy8`KZ;P3;J~Q!0GM3;7)i7TqqnvQSr30Foq+-{p$EfLJi__b7AUa3e(Zh_iBvjSFJGrXulKql?co*Xim8P*^=n8kofGi@ z2QCJoP45AyVI)KH^Sd~7@DQFP7Nc(SX2@dR4)sb0L44p{>^^ju#A*RN8nwpYK3!l^ zdE!g*ap(LI?6@1v^{Ij4Lgp1=velB@cpTon54Wf_g_;f;H1CEUotiQy58w0AbsRi? znz?4=sAl7a9{u~kt~3IKtwMHEH@x?bCyFy-aD3N(Tn%JSD|=529MB)$ z_NK^*3xGd~4xc8TIQ7#BICSWR-fcXT6I+^z6F>ceOZUQ&talVYsTZK7qZYIooggjj zHa7fx3XkK8;NGk~M)c_j1Ljr{xlb+~4ZFyg^PkMWOi?RF4!nP;fmfPQG=qRdakOs{x+ z^$hkNJ5P;*8tS!p7w>g#2{Rq$cPYxiwe$WseIQJD(-Qr=w}LSVoXq&A*mvL{ z^C4wHqnZQW>C_W`b*eKbl@;@JHG)8MYBDC?<@cQnr|{t9S!TS~gm3#!=-;g+liPB5 z0$)@jauP!xV$c2q2u)zlC*PJBGN2pBQ8|JG^UnmF#p$Q&7}%=~;Uq)Yty4JnJP$qk z^paqc9`z7=k3L7I0UeqDr#Xo+E!^C{6&C^{k)b$^HQS5Pqbu>So+dR)aX7r~E-v1E zN<8O{0V9XO!=!R3ayjlFJA}ihxMpKZuwm_Hbm`Is;n&Z>z@rXIpPj_D5-&^|(hX@3 z&f~zDbBInUg^`6LdJZ0dx{jt2KFp2@#KFD0aW6UtZoZ9Sk)0{!x)C`<^&G9>qNmLq zN)K^j*AAqorep8AWhm~}1C9o^sLqgqsy!YbcoDmgoT7Fx5B4=1qgU@9aI-Rig4*7* zM~*_@#S@SH58{4GCTiAeh5iG2Fo7|n8k7~{?)hUlcJU4}m^016(Fc9|_k*3emPCxb zjZiDjio;3n#Y^{tVdUzI#+G?dXfWY0af7<91I+C-InT_RRFaA7=a1stSX^LW002M$ zNklBG5}A9{6bjcNwv1fy64qLk&~?EZszo?41_#3wbYRfe^)%Ky@*uw0A2 zcL>jm&7qNa8Fzwup?f1|z9Mlq6FCdG7Znt6m#RU}KwnCZs}Qh~mmn`MUqBhU`n=9x zhikSGMpDR=FrN`<(x6ElfFI^ z!ZJWkrChjdQ(a0RESPR#PNraj^4xslTjq7rVel4a17inrJ}>SSGHG)eblAQYai&fE zK^W&`$Rx@ohzY!c(@(U}zEe$htIns&h_lGdbL4tr{Nk)C?^unvEj#!ImaSWjJ5Qe? z*SZbUKlA-mYouZU$e=|$^PIHI_U&h3+qurK_hWF=%2A@X6#ljso zp=oT0ywpe%TAL7M))4KzEpc?o6nwSf7&J|dP@EHoy<7Gn#mF6A>W|3)-A7VR4iTCL zOdV`+VA(7j56ECPc_t8zxQ}&v&cU&MM|fDjoIoysgyqV+Iq1{I4cj;VfW@oUBZvpD znVvc#pI*R;$1!Npj^TEddGN~NTEGn6E3kC=dJv@m;?$8#aP#W`7pqs3h7{xJ z`5icQFN&K#7lqo!s9oO;dzY<2ig!CS)(OJ+FZiBkFQZuB2#SPo9NqH^b{)Nr5+dHx z{3IORaRlil_GsJO8IKMv!^GKJkfUWxxTL~=&n`SKsfM-=C zx_U243`~$uss8oj+i)%43hf)$dYMThVZ33=SS;Rt6UG*%D9TF2>0KKUC3hmjsg7L- zP9T|y1amX<;ZnOcyqs(*-nck520zdE1WWc^K>?EhDhg9@+W!Fdl8H;q*QT^R6IV~} z!xMD}bgJusgR5uZ>#gTuU??)PXW`;Le}pBOp;Nn>cy@9x5MD;izI;4Hlac=ifM5S4vBN?dE^Cn>a_QQyzy_2D-0Rpd{#Oc#X=rpjkl8I2Q2qqgn zG;1OjY&(qbv^?%_eWX9Xf}IDB!OF88HD3BSxqdn(F4+m0mIc=#iROd*a5%6C?{#d5 z%RkJ-{B@^@rwmY#nT)f)Y(=u68yb4*;k!X2ahVL7KADlYz?;~${TST4_CbxJ0DS+$ zk7(GdC*%Q_aNz6-T)6fa3KI(^QBASq`}yo^LubR5@_DkSDENmdM6n|@0`KHS-+r3pPsNGZ?|LCEG#~D3vMmmfj2q9 zOGnq@yE8c$)}=NsZu=G)=3dZ=y@(UH!;wd`#C%Od)NbU1$m4r)^5$j4W);GSIP%f8 zv)C76fC266kQh<{Pz}${oyO@KcbP1ci7!d`dHQ(Z+|S=(={gF7LXx5F-T?O5w=nvP z#mFkt0=E)E9$bh2!6&FdlY<_?S*IU7+$S}@SoK+yGLIBN-v1WH8c^-R41ub6|mE005+>!gUurqA!(il^z?=-j3ug;GaQSgjEnd70wpCEsA)))R1T z*B4zIIQ~~hq|9eh-Cr-%N@x^g$G2;t+hHPFnnmH{<1%z=TbE2oAx>}o2K!Fk#IfC5 zut+V zYS%>Wy>nb!!Ca?%@$=SA2uRa`Z-ZLUDM`cL4GXYl^;-B7|7U31!;49PHOY90k*iZ0 zkxb#j)yQJv`^K~di@@du)3Js9Ub}q*q4%yM%ceeLcXwf{|1n(k-;bT!H{fnm2|OG5 zqWJk)oO(uzo#wdPcO6AoCVG2@1(+!DB-N+yb7FqB#g4oZY z0IZbfP8pK2w9)3BcVM9_dx;SfemFUi*RX#54m9v`Mh@5{GC6Bw#UP712>oL7QkqqSo`{s_v!ri}M=&n_mYhZ&Z zN7J$P`%hq;d>_LT<59E2O#JXkH)s~8Qo6VwmI`6#@FJ_cYG_JFY|1ovYH1m_z~c4G z;YIEy@!=j4k%tfwnFXg>#;WSdZ*B-p9cN5g@;!PqaK^3uvv4ZX7#p^1Vh#!|6er!n zu%XkiW#c(`4c0_$zfR~ndJ25aWylS_h|#@fAe-6hiN?y?ReqOJf+(aLl0&N+559>j zkdiSGmrXlj)5NZP?Rab|Ei1oI^Dvnan!NidmQU^uMe1XW88#e6Etv>#N>@sLva#U3 zUd(i#M1+urtxNZy+559FXM88=fWEYK4(9A!hpX?lMH{=9nZSydmFMEjvF(VnX^-t| z7Qn?+8wJS$m^^eKwva%r`C$iWQsZXq(-Dj3e1%4i7Fa!IAamn1#OfcHz}ZL*g~?Ab zZp8;&izPr-M<3@n|{K^n(}A4xcF*oj^(-6csQxdA!dHh(s9@v zm&x$Eg$%!IjPdhUVuYlDD8$mf{qQV5o+~m3dsps)UBdxbzkC9Wxt{Lr{~n(&KPWl- z3$=f#wjo*!{Td5~`f)BZu==YpIQ}>SLt5Ig7X?bybkVxsWN0VFV{LE~Y+KovN#C<^ zMng_{TBSlMr5dGyTI$8v!-GwxQxD&7UW9tpv{952gpbEfKzI=kE=3;JZQTt;tzOu^ z@-vulnT1{X86S>bi;G>`qDMnVWuxkb==8xf=*2~2eV{G2t{D%t+(;o7i|X6#5P=uxOzrrVN{pF5j#}o0{4< zP5*;ik%m}u=qJ>-Arqb&g2|(X;pY=qF}{H|WF-Y?*6(A?{PY7$CCj0= z;xmL=^~B5pEs^_p4{{Y+Xz>12EFaUEW6#5u86V;3lL!oJ?Z}MqCYZ2rHHNly<-L3? zdao~iCE}IlMwZz8pLfySM)gKbJ08@zZV8>oEx{r}lw(^6tSOF!B4{*nFu2^pi4Crss}N<}XJr zQ%yWRu?Y`lhR9A!qNce3jlUR)sUt|x=SE@o&I4qwN&ILDd9bb|bP#)Ap{axSK3;$+ z<+$$Bwgs5JbS3T$?F>V%BVo>=RhEyKs>+tkx}~OqxMptN0yDl53!jj5z=-Q+LrFT_z3aeh3iQv7`tE(K4`@~ zU6zYOE562}pUT%DtE$O#p(QItNNhTawHz^i?lSn8YvbwZt+<|P#ULuhJOeaPm>Gvv z^LJv;xe!cUwgG)5?FP{Sg&^X-j7(&ySO=0y;>8&Ln}4a1W6oj{>Bm{681-&*xW^>m z^tT6aJGL)c*{LD@;SB`kG{Dqv7E)s#jBjXywY@qSp6qM5lVXOci$0?^=q~2Z`56fx zbVuyI)UB zF=NR($YXDk;Qx+V>t%Siu_MY#sLD|l!d+IHkK;dmg+PT5zW!kbvVtyS_TqI=v=|TP z>?k}q@eG6K&cn!RJclPQ#KB7)(Mvs;!X8}={;VrH#s}hDgbO-0sfovX7h&7+Onm&! za+v2wVAaa4I6x-r{SLJ`;neU@jbvcsg#lx{knrFP0v7q>bt6Xx94Jl0hIK!}u+w;S zwZ4lLhlD0fHE4eGcVIcPvR;?`BmuZX+yR>tkTw-th6X{#CFj%F5v0zJtW*h>E(V_Aru{ zqWBHbyM(mTwZj03(GiSS#P!=K%g)Eb$-{^*c&JkX6rElG*Z2@UXjfn%s-Csf5pv@szWH_?imB=a4{FoSW3hH*2de3*wkIMI9uVSp1@0mO z)U~ul!?tad*R=GYXJP=~CT?t96g^m(QIkZ%xG+5gcMHm(e_}n}zxtC>8bouO9Qukp zqxs9*n4PlR48+{IO_RYja3-T8imp{H^zGdN^Pi<4mjEv=)<(DP{Uk;Q#fi9^Swsy_ zYl+bj^>wVg(a6IMCn(iR4+}+pLOdc*ZNU3CHgg=DN1AhJWNFa`J`W`&C1}#MFFKRa z5yiPpN9f%C5np}O4>~#~Xhk!XL7f`Hq_Uke>jj6#BEOiXM(+wnM-(lze76f~9XW)! zj65_n5zylrp>&Y)8|n9p50S^m0&UtfCB#^0u4SfUjN+QjBt}Qfudaz1%^PVrq02G! z8Hwvxu3{z`@3`bdgoG!UOt&bKSe6C#FTdzY~Sns_;a|E(7Bw|fWP0+qw z6J^)xx-fIBK`oRRlZt@iH;XuMg!zS3-VnY?m^}z{3K<<(_SU z%Z<+vpOS*`=nQmV4RiN8uy-L-GKehjd296P@h+T^YRs^Ra=J{jfo0*|myLJ^%HR#?8 z9$T*>;z1@xcl06iwGUr>(1)5WOLXkoA3eI%g{5vT-sx5Ydv-3uts^U8u3r$L)|XI!v43QiLgn)u!}ZjSEC7 z%JB%-5`lXJgfzK`OUMMddv}l+9Z}87)B;9oX~dD@IWC?`MVPkG07xRrbjTnGf~|eu zJ`$rNs=2lth#n^Qv1#Eq2nr0NP$wSwx=zq8$i)*nrpw3}`H|5PMa|F_O`A2xf!LS* zWJIq57mEolBJSWQMRjQd73QVj`W-nsENm??I^wdClOG0luZF{9V~%UoTW!oZk@q5OI9LD!$8`{MwWfBV$}dtxJL1p)JqHqtIwH?>P$X8@WL)cf;q47}P?;2tgalVBdELI=A&AVP73yW?PU=0cpg; zP~xrv9N)=$r93xNk`Nsq!@cDw;Sd!xg@&XcEgm7ait+BW4^h*JrtbDV(QNNYVh_2n zJVZ5~V_n;LLW4}XPjx*cMrA@#Q<%A_!=i>gTxkaWAgdvqs_EbYO(l!e>}ejq9i?Qz zi|LngKP(FUxkgmGO3HIqqDDMc%y)ma(0@m(4A<8EKrNCTW=(WQ@^ya{7MdW7$#wN; zh9+>JC~`7Sm8b}DFmVqFGrAW=jhZZV?PeG~<`cAb*TO>Le|f0^&hOjEInYLKavI{} z!ePTRNZ|U&%eRp$H2k-Y;z_O?Sv2KLh>AdumK`yne<%eT2N6JqCZ0^XI;}&j9UDUD z=q_q;=EB3bA%?#94m9(lsI`fLqy2Si+wRbBErXi>5L|s=k9@c0=-sy+tceb~4H|(9 zm%e_npI!{R>eoLAfhuO_4+6hY|4*^2Rc~B4<&Rqr1F?1Sm)LrG2{fifuld`H6sH7L?d4i*fCa>JIXnPJl073dfE5Xa7)LqO0oOdok1{k~j+3GcUf zSwdcUeBAWf1{x9~5gWgZOpb!ugEu|EG&M;anxSFiW;BN&yTg;dZ7Ver zVs#OI_7{9Ue*;yrP0_ST8#tOPuwlU_6bovgyvTWAn_JtWYrj6Ewe@JXnh#@V2MIw5 z)TF_8dr`amAzl!6y_%GSN`=ITLJ%FaT`s>sgdm6(w!rrgHp(@;eBtA41$EX_qn&J9 zBA>dIrP}3BR(uIHI#uN|N+K(hGcqAfB)q6ZXH`8|=#|@%^AHf`EJZ?EU8%4tM?pG3 zgIj|3(vB`ZXzFP$*(7Uf5#}8YIFGsrCnBz4qhdz*yG398Of#>m=Z@maohP`mcO|wS zrvJ(2+3=vrmZ}KmQbrZL#Fv)SJL+;ux@gv@kYG?=Qw-#_BCb(VTCVCB%uN~LN|9-K zO<_At5f~ABNqP*{OdE^yDJE!8uO9k$?TV9YX|~38SxY)FR3-z`!=)tz(~F~t(*PYx z@s))PEDu60692CjX_$iJkqYav2~86Hs!~EmMInM(@R|srs-TT?<)RR3O3{t9e$`=F z!x?@pXgJ-7fTFQqeMwAnI9pi`2gxs|z8Z>T#)}1x*^Tu^NKntNo z(~D&rXy$P15>8&YhVa||7<7cDQft=XT|050ix$LxHIAD^jFAoMw`dM3Yf;8Er=isb zrZjofQpBK)NkX-0V)V8mm_)JMRE0|ndRpaco-h|M)TRx0QEC)cel-r4)431p*TaBr z-EeHx67DlGHv$|S3;&5xi6V$^VQel4msg809w{ZWDSD}Zx;nM4Wn!Iiz4DotqM?Z)WEJKR+LimvG|#Qfu1*?he!{R4y_D zbZP8_fODsC{E8Eb+*_buCrf{dF{o+0E#5_9Ms{EtmIK5^T79M$uI*nVPb&uXCO$flYJ;BsgNXr&7 z;t=jS75gH!SE>1mpQ0Zzhw8*tm5Z2G4dKUCdH=J57F(3SC>Ssu9r{b@R6HiO6zzDR zQId;QUw(nZQN?K0x)D0{eTOE4t8t9l(qAjuk}V(oLn;ki&ahdM+@jL(N_owr<45?Z z@w>Qm@))k%dVn+A=VI@Prub>qJZgUmU|`{lkKXS>T(<|ye!7C$BmAIkXOA}T^{0kd z2QscTH7hsC&+FI5^xtw%IPe!GhvVMGYjAAd208IT$X4j1zMC}y@9#%UX5(@{kP_+C z5i>!(1xfERJUsmqc3lWTmwu!0-VjeDtn!x@pqz`Km^e^^KkH|Qha*kjjq61X`oud_ zDiePc6aR3n5NA>ZNkLs>?k79SY7}T#vo`dc9mR%xy@+ch@JqO8xE(1?DPjD^F@3dA`^5f`*+J6oJ1XV0N_@z}JheW3N9BoZk5Tyqy5{g?+_#17Q-D?l&$q#*>iXXY z0TrJA`+EFu?uiHO%t=$Q?@}TLj+%sJt2ba6?M~$+7>sCJYGHZQz2{CCHxhNctWeAc)|?A;)6>dDIv4rQf#DeT=tvA5 zG!Vl_j70C2Ar)OQAd4@t%H`dy{kyf#w+=xpwyn4`-PG0y&zdc1QZ^p{dG;ARTvLmy zG-ENdwL<}SX`*>t%zji)YHJ4sgg3;VpEuHfL1-YT`o4A+Uw=arwjdYSkrhs~U)2Y5 zSG0Dq;jYd$oX;@jFHSp)$cs@ZE22igKM0NU^{7a?`kr#zaS1M_2lIkkQE`(iCC+))UCg zr7GXfop{^hdct-bOf+d~gc;juY9Gq!IInT=g{vbq7!I{Cgx6g>H;;C2h1e6MxHi9K zyrQj&BqovM)7x-T?}BlY=i}A?j6wVQK`?Tnva~bDiM=cE;*>8D)P4Zoe0LreeK-TP zQd8)Ff1R@~1((7+YFW9x$)#me4-dF-HtyR035;j^&pb5@&etN5$-2~BNZ)k-RCb{H zCp(iy?N{~Q-io21a7`se^?tG&J^IQty#3llbZ=Udn+_&TlJX*E1-D(}>g`k=3nyO# zwo!OHo1CwlHDq1J4_hwK0oegQ)N0vhr{V0jm8R>%91-6v!`bT@sMo{>U(KJ1_kT^n zLt`dj-X~w-jb{hZ{4yRfM>pc>iF1(S*pj|;v}0c~AC2i~AGzleO}DsUsAyl9Rc2+x z;@9O|NGM5%LkAAv;x#Qi9ZVW1F)poR4Qg&{(4Q(0gT|ZQiKF|qM;x!Mv2p{Xq6YC% zuU9V^)6ZbhvXyAjISl^6wGnQNz$c%q{=lc3Hr0`nZcdz8hTs6`GrgsF@osd0qj*;bM<9h+AkL12@XSTK7Ah7amb$9!tkxC&HTIiR_l2MpJD zU?(+cBIygRA%X-4rDZg+Q_kG@BXBDr=}1O?HG!Wuh}PNzEgG3)&87qND=>{9>&jky zwLXyqCn2!W@{P)Tx84&f3eH98F^ISp55G>6@y=^6b5nz)9O9WKIfigbSAeo8_%V}-a8ZnAAJ-Pt@JPqoYXl{O9hP^fm$CfT6X~Y>E+q{}^SmJqsr@Eim$#8JPXyCwT4cd3a%DD}*!{i;)j? zhdL)7^Io2fL-b?z4QmFc_#;@peizOi+k+o}`h~uq;d~y%7EeX07-Ko#Gv)NDYtz0i zu3wEto`oB{9gWzrVkfopX56@=wzrf%c|AHKFFSz*MrCBTb;9}W%Sl|5h4fRGU|+)* zjhh4`mF9O5r{i($S`todn2Yzm-2$6B?a{A4tv7NLp`|5FlR8#79+L)l3S?!eG1#y= z7IhjnhF8vEd`xrgn9I@lX2HjZ$;_nDZ?*nb_FI1bYY0?(ME95om%+jf9O`e_`wpu(5|!8CfgIq7NtT&9@YaJPaiAjOrFF|&yU zXA$W|1slk%sg%3h)y>;NTMk5*AD+Q@`fs%2;{EF7csfrS@ybKvQLDroQj?B zzI>b@!%?Oo8%w@ijwUm@)A6wMj%`%7X(S^_%(596ksE=xUVl;9K~i=r`64PJD~)19 zE;4g6E#?@?#g4U-_#)!(rDT3ls~j<8!XUi({&bw-OF!5mA7`V_!y$Mm0_n(cZ1!9% zI$w-AiEm(WcpQ4XI1}NXG%-umandThZI@T6gA-6`QBgJAxEoklf|BeT;-!wec16U|(ZLhp zfsXim=DSE};fKo?FW_=g8U?_O*na*YJU(q4Cd~X4Lmxf{ZyPOAGU+cxVO$7tMoy^3 z>_he2Nth%Qmy327@U+CVODOtep)x1Q#i!^w>KYckHyz;}nqkr0S;$O00J|bi_{Yyf z$33zq(IUo99a>25pg92&TYibxD6g3-W?NXe1=B{9z>9jCz6gI zMQTVNjJ6ftNH?c4;$K9Sh3Jt>U?X@L*W<(YCSs4DJz|faB5M}S-@f?ZH*)GUjc(F>DBGAD@P2Mh`@IXbAMFr*JCP z1~a=maM3~YLkcq09=n@6#BWyI7Txs0D=4OrJ9$hHg*Y<%R0B~*3=2zjaB}oQeG)w^ zdgE=x@fo}rbDj)b>GT=fh@I!V(R8Ss&qC$BMZ_tj7W4V2TzuTrFii|~DJL;)>{v8w z)esjWcH?5P2PQp2LI~QsKRdcL-d^%4M#i3|xn>y-?KwqrqmdZar2)1d`hgC)&*S2u z7N{R&g?)PuAh_-0@Cm97oAV#zxsk`wxpQO2`iP}3Q!aWw%pFf%3ZG?@Kxg2+rswgF zFK6KT$(FEFrD5m6NHiPyDjHCWeV!~vMf_jJ>3-xRJ#gyvg}k=MP}AR+=DvrK6xb6( z?W<{>D+Xra-Vp8RdiC}`HR|~K!ra*vE*|zsIC%+AbZV!V%ZP=)VB#wm_WL67-E--? zSs0!dfw$>6Y~*fqsdB%Xem2k~vY1R%TpQh%wA4^19o<6GgKL;E|5ffPmvFPTqF%m_ zTGaKyyq&u->E-D($Bf6B%gIR3&BcN*cVOD%!%1lIDqekT3^sP>MpE=4oQ#P>dCm69 zy{V^}ZxOG%(k!19eP%qS5A2DI+4Dh>T=9D`<9*X*%(GZIc^=vNBG9^tCn66XLTPY) z3>y6~EXot;z|Hr2WuG{La#3%A3YHFD@bz%SmUS~QsjL-pPoKe6`q8E4FT=0wk0p1z z%Xt6XngV(aMyCx&v2^N_h~3v3mU%Ha5OI-$f2g9Rq9lZ3&M5{yyIwTATk`cw7<8-! z8q~DreR2?9jk?3t)dsP}T+mi1$GcM)>alkO=Daos!Qa1+x(*ep>suRt(7#jAy_Oh@ z@NOO8>#8Dy7Z>!@%vigIU~r$BNKK08)`>Su>9Y5*>ht%o%|L&%zE5M!pqjY6*cEQ}R?2-VgjcuF z0N6TMqt)n1c&LCI5%14Xw4~l02cc;L3f>jZgSgMNHV&xCIYnb`jozbXaFI`cn@<+P z!^ew^g03hLf{?R2+^J19C1LjKhjJeqYA$@ZkhfDT5In;=z?zl{yCT|QOt0~HI`Lzy z_~lnXH4&XQK@Ld zvz8Z`FDVpK!&QIqGZD_lBgD>#mtSfNz3qbRBzGTZhhF7LM3ZHWev0&yg`Wcy_#mMK-B)lH# zPkIUO(M)sBjP>+qb3vbRFTyV*2+vF(iw{0ufsf8@;s&b!&5`rE06?by3Ixn% zGW}QdY?XZ>nqom;M4z*7hatltWLo~Aaf+=J1!ZcUVAq@jf78o~8j z(hRC0X`>sVRec`>(bTV24Ga1%QAKU0MdS8^FnPjoI!vlb;aLQ)fQAUAKZV%q4s6&4 z!Oqso{h;F_t46)nc#%&1bt-%*DtoG;V}HxeE#X3Y>ul04tEge>((fs}Ft&$c&u(Nq zqdYF+!yC1xZ^%spq)qH*EzUYJsSlfQn;v32(qfhzq~-+L4XPoMt7RS~W&c zO&=6xXL85dfI4j+#@L~4NW7p!7+K!xk)pa;?HVwM`-*IGBL}y_l`B_BIocboyotTh z4vm|(gp)%1Oj9TdRW>z((X6Hi@;D&{g)~H?lCAY}pL;>yjO-ybyW0 zrLgu0!=sP%fgjD#8aLv-=}i;0dekuGWb@wBkxZinnl*2TnqiI6I@|{?0gcdveagNVr;dOdV#(TI#m8A>2L zD~}L7GT{{rXdNV^bCht=(4<}CTj-K2JEh@dP5%VWYF@R1&@8+TCvzT|s88l1bDGXI) zO`+!EIggBC;Y}OBq9h+$_of&&xC=yZ*%As~t$Gf_q$dZ#mOHuS^l8z%`JqYuAh`I2 zqbY@kob-H}2dd#+uO+5Uc^>u2QgnOb_{m18_o|DYom#_*c-Zmzbm#pyctB?*#*ffY z7BLvCXGnecy4j(Ic=u47;o=*LmdzSKMd84gzCHBTZR()Vgxs6iRYjH58rLJT%6{U);kQrWOOs5 zFIuRl4e~f2*?NbQHv9JHwi@jJ)rY^w#wJW(0~&Nehn5X#Qe3%V$G0zudP3Xwp-EW{ zoTAB-`_O5aK6WU&^&QB~w@}58)uBcxzYjw9-hI%qTSxTh(HCvV>}amBMy=-E(Wh5m zbnQ13?VHzwIp5o!e14nrovUng@c9aF*8?@_J5$c>&;~8LpjYp{=+%D!x-_rD4H*g? z6^m*E=W%Dhy6D6W9&6qU$9Anoo?mCY@Zxi5=3|FF+YiuJbO7()E@&C%Pf0-tD|}zJ z?13gVxkmA7h&Ijr6-y2q-aoyEjzHs@{@frE)*)@_)AulX_8W-KUFp+8RbXYil^0cL zm2BJsxT)2S1U)q2Wq-78bh=2D^UD3J&KYLO$?(Bn(%-6eD zAM_qD2+f<+Qr__v_BEKdAG-ADM~zQk)b(>QS-p7IMW6l;p)1Su=*y5Jy?Y~o!p@yG zqARhw*H2;gD%sfX6}21rRlGT+?0EwZdGue3z$rSzE;v|*$0=uI~nEu-^7zmJe18QMYU0F=wiWYs$cACR&R*kg~MC*Q`O4d zcF2mjc>CS#8VVb+r#4U%@dHhmZBdk2fciZ~;;FF@Q|D?jGrO(cKRO`>AX>fKe*RH? zzxzAKsNi)kjfpMD-^WGx&)vH0{moLQ4&2tuJJlgF{nq*0D);CNhDsseD9+Di5NG-)k}%2Dg|WZb&q^)HzuQ0A`n@0^g`Imr>-M}-*ts1Oc}61e zKaD^cX@4)p#nCxi2akXd1bN)<8}mO6z=J+G`fz2Xrjh)?0Zz6z`-VN}LzDfN2>e?J z{B>c6J^u|&z`r#n(XP-oRHj=s8kOhe=YKx}QrP)x*GLLGe+@rbS|T73kO)WwBmxqF z2ONRFMc8@3F_7K=??pfgJAdukRP%cMYZb}T5&?;TL_i`S5s(N-1pb#1P&00f2$@7b zc@ZXz=D_#h=R+DYGPf(#%=e0snIPDpbANTF$9t(m^qWL#B)nmt8J0p2E|`%#NsNI+ zb9A)-4L=_CnQZ5ZnX|~Jumf`Ctsy~y7z=qR*r!SsL*}JVt-wSiHTx{;7fETi;=JjM z{3{Xo=Ma!=Z1;%u<)f?d%bs&&wIU13J(m5uvKJ*sqG2YQTu7z00unXdLR3@$HXz1q8=`iH;0t42oD? z^?pxHGV^uPK!3Al4;kbd;ZJq@HySLuehJ?!T@RN!;cz4i%%4rhf;fEk^^b52ZbX)? zKSJftwj#?(1SA3y0g1r9An)>Ol3qKQ9^v)>Aw&l%5dTI5#*`K>}Pkg>FTZR zRW~j{Ddmsz{$7rZOZ%~5+fGu({$8$o|E(l11?x8NK~mu@6T&@KWh~CZ=`)eI zUi4>iy~hS+c8P#QKq4R!_)7?gV7i5wNjS7+FSHEZ(6D}OWXB%Cp~zTepHw>Bbj-#R2_Wa0{gtDa{-atA8|PHfqX^vqnOUO0wL>o?+j^i|T#vr$sE z$DKLJ0OeZP+S*iU!~W7mkcA}ze-Z&{#&(aunKKZajkP6mlCB~u_6o|)7!QUTmKrWM zV$kHKC*abhMC6qj84JW64eNxMv_Se2MnArYq>NlfK(|6bNEkdEZ^WBOj*UTVTrvaY zIU&4BLk8s%uP#$cWAycy*lRFzaEFhILBZ<PwAiJ0%J!7b2sOl3M_4Cl54eR9A`R zVkj-d71r+==!^985y-Kvg+?_i;xI6lOL}rVPF_x8+>?fQ@r6fG(>fF8j4WT(4C_4~ zeGwU%*)X%TK_KHfcvS?DD`AY13l}dVzr+B0M-POA1;dJJZY^U3*b2O^$0O=|9AlO^ zAgm!{_Aq8m^;D9b%9rgW#OKB#>RcqORl)G}5>&`#xO(;+Vi_#b#*LAV>(#7^^ldC- zf6kppT229Moje&Mqc-e$M{5|1z?MNhi&^LCD;JPaW`W>(4H?^qJ7T;BmoFv5&EFk~ zr%xb-fmK}tY9Tztr%LlwUYLrr=PolwOF7&apCya|*Mt^N#TYOamX;N}aH97{#7CdS z)szgF+qB$DG?MJ275y;iY>k2Z6AQAANvnuXPBbRi+WPx z&LSp016o^NuO@Y1T>*M=UMgZ@t`Jwi+NB2Sh6etv+N#RF%1?=aL_i`S5%_Hc#Ll`w zSH{>>dd|HXXq>#!wnH~$m6O&vHxc{RZ$b_Ov4V44``!;B{pc!0CKbchim|rzjI-9F z9xj}SLS|M0=a+g2FiS>6I~wEHS8E{C0~1N0)!la6t+7`Mer zt3}MdO-Qt|W^h?EH0t^gLR?fhvUxRt=4TDBH?%uj$F%vlVvI6JvqZWAP~7%V`zHD0DRSx7;h;pEi4_;wq17w+Ut;= z{v+b9Btd;43C+5XM3}D@B@ASHnRB2oB`a6<`Fa6O^;nO-JO>#?jDh86%lX-X+9ZF@ z%oTw_tG6SMB?A8d0#ewyN07}Kb^9t+zmuOig_N{R7&S)N`!&SasWUL7ffp_vU4dz{ zm*Cp9BJPqDp_IWz8$bFwK7G6izF9CE%hnxGA}?#qN?{+?3gcgS6aB&*uy@5gyuWxe z1O4ey$RLQd>h{FUIj=CVq82+oorh0XZNzn9XUhPG-j3$DR$|3qVz&!BW!aY)rTHD~ zKOMsmp$x&NHb+R^{&;KdB={7^;Deddk!|jb+$(2cGxQxSf3dG=k&m}_7-6Rog(l4wL-dpe)+|sw<-STUpc-PlO`M|CV5Ik@VX4ZHhb^R_$&FSJ32krOd>+{3WXy@U_nnMo75M3gbgvX(E= z(Dq&M%4@H~l3|rIDIC7>{CHeX%VQA7Jh(7$>D)yN5Nf!9xih9Ci$ZEfN-7GnxI<>| zikIJ+gCXtfvmbjg`>okHl9)w$X4)HT*=C=Ccy01CG+{8|tzs})V`&yvEqn`$)}KH= zcj?S2VtLkWjOSmSi4HZLkj@>y8L!Vl>I-LOk0z8(%D0jL~l{ zfV-z28{U5%pYJ+`Y}TV=5Z2(1WAOg#<6xh14DZf-3r7<&X%lVEps(g=-{UdXI})bw zsP}mD%Ip#WiGV~vBJigW5CJ}|UHs9iQ%f8 zk8Q;%ZkD-HOXE?y8QQfBL)`H#IDIvro0#D!y_kvcnp*5$8HKhSihaEdlBF;Jh zY6i%y+j$_&F6_dII0L#48iA_^)*}953Y<9oSh_brk8aIy{p4mu9Xkwlhy@bMT+pRY zYs4Sigkwje;HS%iT|iSbV=!-XnuZ&=4sfs26%4VB>*tQ*P(&g^7-ZLvan_EUIe;yz zFL6uJ2F>hmiL)lkS~#Oor-u|PkI4O7aJ|G8U2E9lT$~-Wq}XQFP-!d}gxG+8N}Sqi>JeICjgs8{&#BuDPVS#2OcH^A6oH$!*Z-nyuPJ`nz7;$6?8I|@!f|v{BvsGXaP+`- z1U)EL~&vSmahB} zRt+D=%603o{=1LS+FwoHd_6TTx4toq*t2*p)|^ViWAA^1jhi>(vzg;?_4p5XbLm08 z^bE+)yN;;1VvL@(ltAVmv;Y7=07*naRIxg`RcSMzu|wad-p2I44dCbB4U4~>g$Dk1 zild>TzE3=cRWZPG@BPT#ryW?aa1u)5j^Gka=~9j!!0D(oOqstN2X^no>=(P@MD%4` z$>7crwL9sV#pp6}3RbUQgU=@qL{iiq9E{7m=?19LYzRJo=LPtCG{=kuUoskdQyl+# zK7QSI1&>pB+_CQvzL-812bavj_G8gFvVSd>?n%XjcNbvG#?|=z-O;$hJgZlpV>khG zWMvnicKZ?ddDSYc{Q7NJr$u1n*%YX#!OEkyB-`kZ#XqgVwr#&)pnoye9*#m0qmys? zVJ`MwtARO-S7FPhO_(*Z88&_OGdAwJ%#bwZ;@!^J1=Q$7ti!DDccb_CY1qR1;HSl} zKz(&TK3lLDxol(Ghi~I#juYPhb_3RJ*n)9gYUARi1e8(`WQ=*_6lO!OvOxN=U-03E zV`wvaF81u$kL4dvMc&S@uw;7#;;%$w_dx@uE?ACjJGW!*=q5JJBG;KcTwC@L+5t{?>`j~zi)i5U#}MJP8~ z!p|odE>8CFpoKs|S|QBMH8AG}niT~NJ?G=pODA!XelO_bq>OW{c7|f985^T*(+(Vajwl5mo4mU9kFNAa(r)}gW$jrygm1A)bRF1%&M6% zT2akWnvAupR&%Sw04sZETsycA$7lkVnQe<1FAssIBh9cJ9Wi{=ci}e6Ii__0^p0ihGQu<9*;(wE1S?{_|xduz9ILdSZ~J>`1qY#C~?X2uB2oGb;%+_6TF^JjYo*5BTG7>dB4us5|N9vYe_h~ zIRPWznTghQy%l`AJ~jmpt?Q06@u$%#B-muaMq%dS?)C6$))ONJ^?~@X zItwx{V&~4wXy1P@f;>Ip?dgit?0hclEn)9f8=X2d!1W6x0WfghijKs!qL0W1CbShUkSy&?7*&pqDbwK(BZjfbjMovAi$0IRpV7 z_GDu#r?mh#OwH|JX+g^fYLs-8RtnP7aGmi-J!=R(5ZUI8#faRq4cQg}=+vbX6h0)q zIjn8fNV=W{A6s+eq!+?JoVEsHAFnd8&61SUICv@#ojK>1W?WbNcmx}qOcH^A0|9yK z-6QHcQY_YRCnJjejVIgH+lw!h3w+jfIJ@ghe7^AxC5D`KY!u;7cWZ7cuEs&4xfFIcfH zQ(bqU=I%~z%6ZKH=yRl}<-#*02(EfPbh$d{%gW%}YZMlE*1^_|YpB_H4|bYaZK2crnR;ML= zowP_hmj?T~mWpk#sUAzz@6?*YmKSa&9By_Mm~l*^Zo7&$g|AaBkIG#y+7MHi zv*vHQvOFXg*rNlTII9vhUg6C=5kUvi$|S6gvoq4*>`>qI@~`;8zhQHz*6oCj&Z22- z+MB{-Wzsmfz}(uFV>2PEFy_!OEh$|`AE*MX`gIk&==P;EYT)1=iY_6p2x`&=i@&kQ z+BIwO!w0KSU_rm2Cap2$wP~p9dgFemY(suZ1SA3y0g1rY+iMK%CmK66Y;B_gDuaIKUQWW|TCTRAv@5CpTB7LXDY*8)MW6=`EqZdJ5at#GyF1 z9ATaMBh*dLjn(zovN8#!^p_24+#0%U`q^@ht4i#62K|Bcock}I*pBnXG(m6H0bwm0 z72>0qQj|Ik{XXBTNd3*k~bkbK=50gy+sCMxz+rp!Cj|i*2W4k)>@#0fX-& zuGtMj-+T{Ar6%Lbx3dwQ>w-n!{fdUJ7AU^B8;?`FV`XiI(?^f8uMU_v<3qgkh7QsD ze#N-Q7b14ZAUN)p5jcsRv1)ZIXKs8~6f8HsDwB$>tvl-Y z<>B~+WIWQgwz5%W$d1R(jmhvBC#W?mL_n1}YSalr{FYRt<^l|4&t$+MI;e`C+tFkp zh|ZqrNmp2JGo_x47&@k=UFRfbvK$q{7ey@83#2A1E(~+O`3Cjug#cr~(LI|GtMWtQ z`J*_M=>Up>9uq#kWfkCfvz)OY}%4iGV~vA|Mg?n-CBa zipCywIt@l}Q2|P5vZbZPhE{9Acf1ij1`k7VVHq^SOifdc14l_B(4jxVe6-N1t>{at z;hbbo6SyE4NpN7U2|$go0&a$K4iju;oEkcM8DPd(G#-t5pj$&~bIJ_xY1tRv$}AF! zdaVp(TcbCwg_dn=AuQQD4jE0>H~I*Z^hj%E4nyrgZZev&UekOf;_1}v_$Y$7J1W9E zh{;Z^F;`5_`V0%DpRHaY-mwto-&uCBcHoT4JVtH;YMgw~b=b4qqZ3B(rlg_ZWfs&3 z57nS01^aGkYp0mQi~N>e&8f*T!i>jsR7IPrb67yzE#v_CJqAVd2OBU}!NcRb-SHlh@UO{qPBsQ#dL2m3`tlY2@1(xAB zdCnhezJ3RvZ$E%X`uBuwek|fhVQkMAW9?S`5j=MpW=?(+LwnajK|wl}eY*^y{oh5O zXIh|6fFtHkc?D(T`@`9ofaO2`f)u0E&1z$19JY95NPDcG^CMn(1L)Nx5DACZVrxV^ zhJElM9URkXXUmtC@m4A61_(k35COu323+Jah?f&z@|M(6l%}U(-`0(|sx83AUsoVH zArFW4pG0`>R=l@x2acV23~if)Aa?(87%d#AMG~3}S|;Blb?}9&)On-L$|Hl27}Jkp zE{Pn5K0F$I26e>`FMo*1Z(5*py#VAB&u_jzjpvuPLGx~d@Wr^#G0nUbeL95V^sXPV zH9?10CO3d4b)TZGsjOFg3XN4|HRc~M#ulF zBx#s|V`GM+Yb!roICho}qgpcT*`qAw5XQf@0b`$g8J!xtRvV2xln6)!BmxqF`+*etTrPHC}p8ni+fpx{wi){KmByot zCD9)jHHqKMEbU;+j+w?)k%Mz%Rr8`h zDh&lWnyZUr)~M8ZYi07gMBpDlKngqe2(sG32F<&7M~GcHzW-toiph6htM?O_JaGhU z?9_PSKaXI>;uZL6@dYxsc%t*e{cv#O9vnDtk16lIi8p6{g73e)0!>*Vv^D!+#xsw@ z!O0o37S6!5w-#Z^*T-lYrbhjq&tU2cok>w`hRL&L!SLox{P6V`u%*9-i+dPqkuq5; zXijcPbq4$gAC##u@2fTVBEp)cS!Njh%13yzqd$zaEq3*&!2qGZec7!XUEuEKr)W#W z?vt;(3+bHA&|uUH=y`e;)_wN{2>`57zj-G#w?2Z?J2&C6*^}@ZweKIVUxlc{b|@qb zX7?#Cp>x9;I3DEycfN?LdaAaCtD8INsH@IYjljk`2o2f<;phE(aJWt%^cgh-@4i}$ z`JaA|r4cmmqef*2wMT=R1;SkCg;}pB;G>^5U{TaAvb9%lpq1jl~ z3}FsOCz=`xUTT`;xwv`2-rS^N5fhh{jVs*f%xU26QO z$JcCqb8uzvvUV~tCia9APi$*qXJXs7ZQI5~6Wg|J@7UR~^JVTi=ic9``u^Fqs#dMF z_KWVf`*|9*$vojG)F%M#28AKcjsiLJnT zIf#kRE6)Ui40p&b)HIrx?Z-&G^<1_qNk}Y1rC+P1WjN?*i_m%zD{YhAa1wW=$X8j3 zIJG`mu{!(6JzTz8&L0m;^B-X9>$^pS6vRQ!4&at0A7~n*lj(OUENFcg=AxG7=bLmS z#(0w-mln|lr7sC-EU=l|d#n1hzocWWb`^YoB@wkAL`~Qn++OJdj2M&6`ky4>h`SRG zmMGWZZ^|wtFp8{lnugX5T)GswGq_Rz+uLyo^Hqf|#9XfiX&%$>N{}vx-Mc<<0g30^ z0Q;g?+cP1eMKig@gO;pjc1;d_iRY1gG7)>9#*y9}25)mT0do-HBft{ur74dmsIqgZ&rFdUg5tMLvig zE4BZ4$A7*@@b}MpfvYIf{D-;yKW_HbT3^pq?*YgHJg45E`kgvZ?|qzb*i@xo)Vua(3{;8SJv6_yNliGy)uMbPSG3pox5tYfz2FG$|(PfWEr64>{0&9;hYd zpcJF4@vjQ`tbIr^aqA1b0LLd*oKF81i{k-P0~DuVDcMo%!)y>V@9Bk~KE2ca ziHoL6>^B?So()tIGq@YsA0j+WieOPeut3p8y~W}#LXBeoeB3`r5v6==aI{M2*Y%@P zL3_kHx|=31xiyMJ`+KmKTlV?#D=658 zsn&ea*tO5?5Y{m2&HqDDhT>GJr>7mRb1>P@_EIIsUxv%(!?dUWnOV@BXyaQ{D_s~# zq2iXW?v)hcl2FW8_1azqt*AZmvKm^h`G27apSvs|8f0l(jJ*>!<*Rn}_;N_W;cntU zEmn$*3S@^s%DW*!n{& zNn0fxFnbLPA4xGjp*Se7nXf`mO*J`?c1~r-O%$O{nqAlJfqqu^V~{+s z?vKQN4_}lov%#m#rJVm;jsBImE0FK}I%rNXtRMF9d0;w%swa$=nr(<)>WhIbHQ;M0 ztnU|(Sm zKR4UHnW;Xa!J04ub4>VP?Lvqx%Lldh`azVQmbt;y?31d@S4kp>f>pfiZaCSy5Sj)# zeV~mD@K9>+mmzpmHXk7jeo5`m@7e_;FP8F*^m z>mb;jIsy+Io=jP;Ik-n^jZ_e~=Yk|{SzACl{WdAYBLs%K1t{9>QTWaxdVKX_dY6#d z>&_I)Wng>0(K+^3qU-2y4E9m{81rkffs#sn1kYEY?Ok+Gk>m7XMQ|S%@+x+ue&2S; z6c-B`T!h;#>WE&{;~j4H1Sgn$Mj9bCcYS&xI#>VEJ28QlCjng$d{*{&pYRkK86yk` zxj}k7v9M*!?8PLY>q#raMsviSep^vtD6!H?|0qvhy}^qFei#%(-S*8odL6MD>ZcaJmP9&5;b(a1H*SGy&&DDDN&Y7V>tFOt0xGcOsw1`-JUVi8|=%qH;GGyb=!$1*7@7Uw8 za6^cPt~w!0hjc`8IBW&b>ccIbiGzph+nsyTo;V)GY<8&U8P|o(6iee}s=f1iuO@|= zY^jAlm~=$um!PY*T$Yd2N5&_0)+3d|{4(8SgpX!b1SA^k-8}H=%@pg*Yz=}5SUV4o zO$=`CTl~71L73v@Kndx5#VSRU+D!Z4&~~fjllklkaoc|Ss5^

1Z1Az^4|-uz{0z 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 z�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 AWdHyG literal 0 HcmV?d00001 diff --git a/docs/assets/themes/zeppelin/img/docs-img/ignite-scala-example.png b/docs/assets/themes/zeppelin/img/docs-img/ignite-scala-example.png new file mode 100644 index 0000000000000000000000000000000000000000..f2410a45ae1d4c82f4c94185e4b19d8fa4fb1b70 GIT binary patch literal 198682 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

  • #fvEJiVPz@R(@Iw1-lce@{9b1mJx#ktXVzD$t$Fxs%8b=GTz(=_%S5j-sGprL1{H3+q|@K1<7a5KcdImmz+1yH9rFdnrjy`FJY+SLHDW105R>bUf3jaM7et>zJ$-P_m8EJ;mv~Rt+(dLv zP3B*L4m){6hQM--=KpPqg<}tV8X~Az^kDS=}BUqFS$`1phW7!zUs9 zH}}44^#wpxi;x`*=SQnITchayMJc2o2a{^f%_n$46Ccs*O=}47cJ3&zX z8wRnJB_IF%%PHk1^dm@bwwxDTs%^R)%COdIi8#wEK4SU`r7rOyjf7OJ_>nQ8{2y5m z#gH;&XFJ-d+rk^u5Il!77#Y)wYW3w=$dl##Bl>S)XL&}%G*`RJODmdd9Gx$h86%`m zi~bIWZyn)d-|bg%EKGAqkMornT?7=IV3&rkG{%NrG> z2zFion|pRuNSp3X?^Z;4#~%;fYCL3YPyM$}z1@=32r6DK@%*==~c@mBD@ zHQ*dbXkhY17{FtzdQmLzj>3thH6#p87h9<@=~7hY1R_~;z}q}8XaI^T!$h65b-mX_ zOnGFv;iO)42?&l77MezL_e-afchisEA+4L1-X=$)0#7K4t>Gjxe-_lL1Iwo&O4r~9 z{d5sYZ_}0=Cku!-iHN+B(qW9Yj1xj#?fR6kK8QR_bbs$K8;%qSclTcy%UrI~qqYzI zo?QX(pA|qe4$IV?o*bPTtN3YcYsJeB&(2Sy;8syP)Hpn(ap<3Q{~^!mM0IL&h#usV zkC>`KEHysfTipX9COaZzPUp{=B#QU^z)r~F=JiIf@sbBI+ z-V^C0OsPf(;c8DB9)8pbofod9JkAejL{M}c0%3{Uw{z9B*e#`{C zvf}Nmo6GA7yoGvjdoZh88bOyYPY(7wy&z-++}$P%qHtZGlD&t3B}A|+fr8cg9hX!R zgkH%P=&T(2b#U|`w2H4F{WsU)et&2se^VzxGA7-l!?KY7i-IZ-g+0j z%1;v@W5H{Kv2^{zrSaZ&4YXB@oxM+S+GS?fzM2u%0{u%TYhHR$>n5p-sTz!;f3j&_x}!a!VPoq*t|ukPZP-noq2JnPzJxF(w{ z=p(LcCnAk)FlYB627K$H0?H)QILc-=v>J~-^`>F|99cS4RH5{iTA)>Ge$qJ4>k(Z) z0YdO6`kQ>z(6R6H@hS2tG>>!GYui8{YKjf+lI~`0>Fc5~mM}NywEZ(XVUqF89xYdZ z%HinHJ-~R&M+C`EGy&hCmTs6wNu@LrP~a zg6MEl=h@QExyBf+NuFfy`x23iet5DsN} z&%i?jST@xj2^Eidm&PL)ThRjWiKc6essp2NFSXhQb-uG1U%#6WH8?Tb4;ptf+|!YB|88*f<{EeG|9sX@FKl-n2o^l$KLXo z9Y5XsRso+3i-#{s7N2Se zJ!Y%4)BUWfEQ0?_je(a1xR@(htsI->GK=76SHl# z-OV>O^ag!8&$$ZSYc~`S<#HigJyC&r%4uw#h|xu8auVX-Ta|#81QE6=ccJ#|9JsQM z$4g=nf~8q#g}LAE7&Rd>W~6E1Bw@jcPKw}Dm{GhB z#EzIK#6a1|po85!E^+4ie(Jgf_cL%p$`xe39v~7Z&9D-~dN$ z4tg*NNIv}+Z4pYHTAIXlh+AT4nN-;TC{RKaIt*IoYj@Hy)EORQWBf{BD7Dab9Q?R$kwrt;c8`t z-n=H#P7F5aF_BR`_C;_$UnWj%j`Zpbe1WJBF=Gs{f+8xP!ZOP}|}<#BcH03xl?ioNsb z)SI25)ru$VQFTvwp9swEdq|%gEgeuT_6vzyIQGpglbL5#lCXW4skrDUpR!6Eq#g4; z=Bn0viJF~Uc>k@?NZgcmvB3=DHP~oltN?pOX1b7&3DV!-cUtooIVV>|?@vF=Ju=K= z?k5#|I#e-6=G<1uHeT~bXdncTUQFcQm_mAn-#}-?%x*~n8m7bmE_-Ovt(3f`V9)?r zT`|!|EN;^QGxA7zVi1f*>Pva>sv~v+ClbskPb`P%oTv=U-nS-;MU)+}Z|&rm3ZJ8+-kR2D+w%P`qwxVHyQ2F5ZXG^(g|o{*Um zbBQRQSq_;+`QtO(MJcy#>@wp}jXl)SB~Xj_MZ*~5L1HJ%JSv*enLODS56KdKow0Bm z@u2W|!W^=sNt32`b81cl3zFVP6mc}ad$wbrH>JNq40g2!j?N=G80IBqfl@=aa)Km3 zc7mr-5!8>7+izOs-*#B{TPn|S5wGl~BWx*=*T5nz0MJ=n;kP0V(zDE|=jPMRGt}fE zS^lNnvj+qgcF%*bKf7?NmiPwQNC7%|T z7`!*x(<;UVMHN6yAE#6!!i!4r5=d!i{%Cl*Nwy`4*cJm-qhT0=6W;g8v zl_Hv>re6vBC=U^Au8)BBbj6OS;adBZ*d5qhUH58DFc5yv;kqAW#3-SFG*YP~Z>??S z!lH7ROE^>t3z+eaqua{xQq5Q~7l=+pR=Ptzva$DYNMA}gTNYC2Hi(a~Ro4lY6d=eA zJRo|f7P=B#kC0qiL0?<~MI!Sig4ICADKB=^R@Mc>!6ALWZ-5jEs<%LPAE~AkhpIOa zmIDLBRf`eJf2O)Nxc(avzd8#+DWsLjGUCr<=_(=$h-A* zKTbJol^26jJXD&TV1`(aXem`MAMF@-n8$vO;$3}Wc&?VfqC9a6tPpnaQ5ABb%-{Z8 zotve2t!68JjW(9f;!;lyTR^!j2lQO!R}FfHXjGbe%ISJyQ?bumT215qq2b)Q5;oS# zZt%OLQc+~b4&d)Oz*|{{JU4H%LMb8I0Dm&H}8N>)(tG4%D8O(nx z(8FN?)aS)Fxr1;-6;^2xRdGltF z46{_vr^tA-tOP=HdwyO}K+4kUw3M4ufa^Uo%%hy9^a}(AhdeSN;>-n=f_oZwtL`L> zJ49|XYVtn4R-e(6V@0Uxkg~3qSUD*$KT+7jW`8|@4_uAAD*e7Og00<5AJ+uny(@EQo&Oc3uP2OHYg>W(azkJ4GG(0*wxV+rFN4227J!%dKcUt)n#rT4TF*W1eyR*QbmB=CMu=MQ~yz3EsAVwsijsh zY=)_|@hs@3B-TGXKjt6u0g5vJ`V<=GJ1)e7Da@2dy*(huXl$E&YFt>Qi`#HtD*vZ6yp`7mr-VCUI0=Po=N?Mpg!iQdw%}IM1_oxFj-mAm$A7t@ z7{4m-_e0IQ{^YG{94;3`J18j(+n(mZD(k$o!hCCS9Y!}U52|L8{~<-_qDj|o1{y?L zZ)PeT{1+)+Hu^k8AvyBHB>XcMt*B`I4Z5tn%1G1D2IZ|c#k_QW6imA-Rxoc4YEin9 z0l&un<$?PknQ9$7{F}T5i1AcML2(^yGdFZ^mVpg@r>)=18y{KU>lQL)BU_o@;c zWs~MT5oJv3r^%rm2y|0DmHt|d`PT$v-z-_0LGAv+QHA3PDVYO~n$eWk#^O++FJN_X=}go_HGTI^-Zsg;+M<#n)Q;?mg61qLEZRT$b-XLp0qd{R;n z3rsd*(Ai4(OrpZ&mzW19DmHc*+$lxXeSqVvq#Z+Ko`JZv8$*CgHR?G{|COIIW3 z!BlhO;mMYhTzM5zV8VL50V2s1qrPwO>E(aqYm8%a^w#tT#!(Q5Y&{>dU zh(Y^2HG{x8%ddiTyDII+UT~4EtmBg@2Um6)I1xrz!ysaI@MK4ZoWKl3F-~G-P=&-A zN5*Na97-#(0%~+cKXfPZ|EfpVJ0h;W(9Sknhu?P!y}Iad>+%}$#`^O>{FW=78A(VN z@}sq?HPQq#*J$)p_@ZDub%~1wOn>6)B%#Tt{bhN*@8fArd;>}kv7xWgQX|&m2z2SG z49>S^-dCc+kW`InzA}G$x8+eKg!6m~HfQmMK52>hRe@+AM2-l_-gcdXljm!Jam~XT zn(s}Jlul-3R03n*LW}xz12b{+tbcvFyiXRlXGuO4VQk>{M>$4xKyV;E=<(OG`xrhK zFZLn}{(y|0jz*t7DI%T+qYz{U@!bB!kqM>4Nxud8#Dsx-4=ZweQYrG$e$k7j=H}+! zW(iXkS8Pc84C^Mq5R@iFHofKaw~&quVw)H`8vwx+uRU_x6_cDsyoBu>5ki8R@!2-; zKFGkH-WsTFKT*BO^$(>5M9m!PP`lEq=@4|hE}5chdATsE7DRA@LDX~N1DAt}2lRWR zD=~t+f4(dNYvqPO0FB?tEym>0X)uc!UZ0{=SjMGvBQ`J67OC7YOm#=wMUc77nCg-r zYRB~ygVhS{C}}2sFJJCbFCoF=E9e)^QtkZ*-fT?=l?xt>vt3QNW_$wqHEb0;HWf=q zwYQ1Mw0C}o`ALy1X`z4q!IX$2r8486<5DbN4ZNNgQfvC~&0>eN%xEEP3pO!F*oSyXT5glvOFztHG7M@rzK^7?fb` z2c+I+Q(-5nuAjiI*3OMYm)j#`I#I2^tqoebC1+rrM3>yK)g0goTc2h`-yR6YN|O~i ziLf<_Oi8bQu3r5ohAkSrfYdlfFk2o*NYrice#`7uv5Jmz;(l-40(wLfLqnj2-f)xF z`o2xtDpnnZU@l%v_SWZ;w=%$CAhdtA8l#@h=A^T8P-utUQ`3S4zpnfc_m~nXeVV-V z{snWmqMJI{${B7r2G`#-1{t)-S-;u?XTx>5FA7rsr;KQ}$rrAY!v~L4Q)E=GS~%B^ zI!_`5$=>yMif+}=8PrGK41v`~6z^-8je1loFaL;oH{3yM$u^(e_u%iT?#_!7JPIS@guid#v4p}`fXgMg5q!lgw zPh%%Y0TlM8H?7TN%pj!+F~PZB3>k`C8qH476b}P&Q)n9oAz=MV5>?CXb{^rG8P%C4 z>Nt4jF|>jnZT>cnmO6_X=wVpAUY*f%2IrH=j5tB&jzxN7Me>vG?Y1}Y2O-e@;UpEx zWavDCCfEyC6(PCO2!RDrLA64RVQ7Y-M$JSO;ZdyFwu;030t4EsEK6g>!ANcP?h_05~lB5YW#bxS;V%)>uJB#$*r}XOa z9ufU@gN6_mY3g%GGfmJIGQV7}ko0eN^UZgn?!GWL*=AmhYLs!34Tzv|nc+)3S<}`h zKpJ923Z(er!SX>_k+rL{wL&9+m4N>r0Cqr$zZ6PifvX(~s{OF%%5D?}t0OAx4P3@a zxStFKwYb=G*ndV5qXv1x!O9Bz_nyMqyr&2Wi9(H4U-8}(l*VHw>8{&~qnJOAYm}i@ zM^4^?tcnT+o9EDRZV8bMNV-m)3Q`$1tl9~8OKo)Q`!!@45?V_E>cb{4Re_6VPtbTJ zje)&e^4Y6M!zAYkYK1I9AO{mWdn9^qz=pNWarbcw+6<)?E6SKfLYR&sNSI zX>D&QHd1j_@SiMn#fG7`r%2uiEAZ&<9o)Qp1Ch+#+IP$zBS-gulbIq;?cRb{8g)p_ z&xaE=<_gk$Q9%_^s~5-MO6aY;Y#m|(d~xs;^AtvOr-4uk1{8WT->jo2aTs*8N#FVn zg`?F{T)OMeP*8^QDB5HE*p8S!*bE0468@$`I|vjs(ayCOlxvn@^@dy|`9G%j#t_AI zR4&GM#;VEDThDI+4p^oZj{>Ag-$9qsxIz}0QH@hm`q+MH5!`r4R_ zu?C9D`Y>)#bi@xp1y(?MCiXmtzW_S4?~RMgE@FptCSvbAgv-#`s1Co2wI@Qb?bo(xn#-%Vc>43rAw`0w74~FMjH{9XVFYlb=0Nd%d#yx zI@my^A_c3~Y(Ra&9aLz0!pez!_|_Kuy!Ka=zrKqMsg9^D;T~1dWj@L!Y}_t{i8S~B zbkfYeU6`+RANne8%!90Ee#Z!m{N`u$W4N~{2tnlaQ&6R0Q7{Qt7A?h(Ub3*S2xHh3 z;^5xn7(Hqf!*5$dwq_evuP;T^%O{*WJ{#9bacUU; zwsAAk0=%K$aU9xOso)5$e%0IqqE<_GrF3wG{>vcLmj{twV?#0+R;(A&W0 zQexi)BFhl>o~TMCZ5ZrRD0Xf?PMSFgmWIvIrHcWU|FR6D1~{XPa^{5D<1uwWXRKSY z09D`ihYV?NXA1dl_M5R~JyS4B(@<2H#o{oc9H?!<%%yU1GJ~#C8Gc*6n%?mk=D*88-Pjy09aM2_?E?5}R3bhp z4!I4X;+i(5*t}^AiaQ!ZyZKOb>DmRCZ?47Nr^e8g&V_NyL8N(gbVd|H--S^;-EU&) zy6w2Ud=#2LTh6>7KR9SH%uKrz`kU#YH1h#=?Wf`9)-$vjxd3!>vym1HQ*rj}9?~i* z+%!_kDw~nMdolvyJQnRCy=Ch0z-Kq!koyLOxkRSgFA z?}^?MI$`7C)(sQiHL&Q=T~VN8FkHgGdhru9)k;$sB|XD8TOSi?+5lNy}@Z0($3X<`ib zR;^(|1*M1<0#i#@IN2F8tby7)ONKUaXa;*LlebpV4+lfrstw#7Rgs-ngJxaEvPzg6 z7ppw1?QCIWsQcEMrKD{EJ2NKDXOOor7@@vwRGN4U*8H&O`X{<704=Rp=Ap@ z3NcdXIdLXE3oW3pCWmKtu0nwfs%;yFgNz;qZMwCb+ct+Bt&PolOv1#kTf@{y7e11yD{ znjUPe?P1rV72K^=Xa%T%rjZp~xu#SpM0H{)jDQ}zl3IGpEbZXY%@cMe3@_4h#;&&i0%~vUV92SlHXb+0~YoT#0Zg zrKkgIJ$jxLRA6dh2~%@hSR2t=u4fB38%1V}7|~1A3U+oj+%r0mRn>qq*M$W=c(N1< zt*q(Mr3J`{*XnADO^ImP%#8|R1(dYR#Qn2zaD#)M3<`?Np>N`drjF)Z6ZC?pXu{UX z9d;IGqG${#l0mfRT-S=$gt7sea38g4-vZ_u^eox5#Pk`HNLvhHXk>_P9oj-yftE#D zdaZ5j*bf`nlW`d8t3g&y1&*9obFS}>Z9O1cS%4~f{_O1BIoFahNN;qxJA97~i)eOHAv~>mvtULt~buHThlnPIXgDSTt$El&{3kum6SB#q|^5)5LFR8+< zZBrVqilD4*!anjD4Xx3{)D$`&)UnkyFs4^p1?t+QnH)!LJ!{ySnuyD)Yw7d(IOo>3 zTr&nNQENHP<_}zaMvBB!y z84d5Ka26HhLEX?5J-W1^$5WB?wh4KNJ?V%tY&_Zk>G7~?HxS*J17>MyA}&>{XK9P3 z_SVo+AvA!xHq6af^hHUX>%ffjM~}9dBXgqkQBWr2cXoV6OLS=Gj%w0Yft)%V$al?* zRAJ-ZleAh6S-FJ_@gwhQ-Ugne#nl2e789Dm@phwU(U9w~Eu78NSsuF*+D057yC$^$ z+riw>fQCyM7%-R3*3y!FcR@1?Rnqk$sOym)IoL9yzy$W}gN_!9XEZ#vG}odP*PyXB zw+`GWmmXKoB*a~5-;7e6hD=vAqw=dPCFMozAdV&3oMYQ_Daie?T@ zNGqx&zaEKhtt~0QD`UuaKcElyj-i1TBVyD^GhJy2E@!B@8TpnK>0&e3vXDRlODOA` z(ir1NSwce%>hG-|WhyVCzI1Fy?|U)Jt*g6X(0~pwH8$k+G^iT98(YyZ$gxm~K53Jz zyb}3)6X+Q^P#G|zIYJZTr%pi+(q3Z|bMh4ng2OArt=kypF!zK46%KtHd(N35J<_E0 zmM&;wV+1wwLbv8F%n>SwJolD8=ijw;J2=vSD?{F3YHkm6-p`Pw+@0OX8|l@m5-N~R zy1>b?Ip<`<2$mdY1JYdwJ8PJjkoGX-(b|gndX$OG$Zyoy zw-)>zdlpS7tEz*kSrhh$e6M*sxKc?-&&r3gjy~)h-O$m)jm24n=rC|J#xcLdkbKnG z#16&Z{$YDHndM zrA0hPM5+{8x3s6?U&HFrdT83*ng$4I^qn{heYj7R>vG}iBPy!Z5uRPX#^9bU$g7m# z(uzh@hR?PVk9Rj3hqyz=CqDhKeGKba=o-g$54#2W`od&B?FZ zw01yIUOwd1_2J~~3J2>ZR4!>yBrS7m(E<+o%Hlk}POV!q)g&K6%8(9Cn?kcH1ec!_ zQs!xf?t@2TbPxN6y(mlBU7u@B9$H-Y=JXs3soW+7KSG&dPmJ!Ng#jb!hg{@WlWl0$>dD?wk~+(_Y}$=-(vGriH7|z`pM7UHaXrG zUR$oCwMSD{EIG$`+y$7_zjK3M>9d#qR~{@&3dQOr%aFnfOH#B*PX2ijx;1zB`+a4o z#+5B|@VeTAicTWKOO&x`^&&VLew-+Nc*Bf)*RkSp5w@;kD9MKh{{x?2pIeN>Pu0-E z4Y>3;oz?1AqL;|+@umISMj$)>70w+yfzbSV%v-sQOubPY{I_-CFa1zydJqmDJ%!hy zmH2u4W;hwpaPlu|HN{Ern!g*J=lp`Mj?BjYH?=2+=iq#p8JgLbd1L?V_=@^GCJ--2u~JhgFwZ40ObgqO%_q(I-&h;}>gh=he~vRJ zPT-9|2P?f+LtkV={6wp-D8%0R)A6W;3OhY~p1p@+=7gc2IQy@Cotg3k%hp|B0fM_SAp0&)Li9b=+m${R!_<NKG7`@cyy?#QS=Nm%NFKWEH(CI5u^Ip2qJ9_J5*J|9|_< zvfN~ZM&`hQRyl2z{|4Ig=VqXyD2+HCDRA^?O;6`XTpNGxHh=1@I(p$M8C$Q)c>I57 ztD`~_9~+6BqI$8lTKglwlmDvzRF)8+J0hClW*TsHb78pMzv`F%_wHMi5s%1(Qd-H~ z33~hA(EmCVq$VONF&o-e4)k{X`xNs3hNu71hd+)$9rFjpQ7d{{^mqT~TRq_jMCtXq zI+Bp~PxYv(C>^iDQ(@!Mj5(N}u_Aox2LFWbzbHHZghBjri!USaWdy#Az?TvDG6G*l z;L8Yn8G$b&@MQ%4`$phX%FY*i&wt-sed*Dc5%@9!Uq;}|2z(iVFC*|}1ip;Gml60f z0{?^&_@eB5W)SNMzLk-Y^}DKVpE>=bhcaTr5GShE^cPxPRRMxuhqDawU%2?Am((FG zAp$Acf2}_sz2#s0QdGzwDJ~R|vGFKnQs9^N7e|04qBApcBo%4?;w>64E6vG5PNAeC zU3oq$4Mir4OPn?y|Hobhhzt%wR;i>Kln6&4Co_Y9WdGP*KXr9=aX!+sOFnh@?f0TR zo|&ElQFviSX8zmn|0~|ql_BI+@LLeq|8t)hW|*6mj?6rks{No``uq1P%1%aPe8xxV zTy=RaGMIGD;Ad9yszL>eNk}RvvZ5Eut!HF1+4=pOeeONOec!L1^|@33%(04sRD^^l z{HfosEGa;0aym*%S>E{1++2JPVFJ=K2o3NjuV8h}^G6>epVg2=SBR=?ma=SlT6!u9 z_`8j*o@J!dl9Q2@-B8+@3B8qs2S`s#M{c30emxt%6IIU?jkl<}p{O#Rq!&Vz5ZWO< zi)DQ!XR_#_09CAP*?4X}E0twsWTLG4_f_O-nTIPnr-Bvqs#(Xnj)~6ix5m$+epi$g za$h7Pzoel;<@+c8552E0FG5Tt!6y@$7~L>nb%d;lkB%VkNn(Y%#!>v=d8oRYa%7~W zA}^n%+&{B6OLE>Ii~yYna0y4uUy}ST*oDE!CHTR_+y_$5E~zB^@Jrz%gFolzx}bB{G;FTc`}Ht zc<1h2-1cEf?SQb4gHnIwcj{QyJ3b{K)A9#12DzhJ<#A_G+bwMpTI^ zEwV}+-&Yad;$uyOwOHRU$)X|xjr;w>b4v>{5EUMRgw)KB@_!*K;AN&|vEt;1SN^rn zRSankjZBhMNBwKJ_)}MXQFcBvOl1YpSiWxkTcq31ochT_!H@3a?DMow9{=nCf-GLS zOOVC)_IM?M*L-~9K6}}x56U3w*--?<#C-Y`@sV0Yym-la{|(Ie@0|Tt4%cykU)#MJ z^H^ytFynulq5hTU|EFD3pMbS2x0+r2kLPRnpIwZt+r!0OE8{vlcqLF=t?qMujgNkb zz?g*3oziejNJMx7+2)svKUWcCb@dOc5&EZ=SPdD-4dgeJ&HfWVhWuCCuwwD8zk8~* zFcZs{uSHV&b9gPi^HzXtys$by1J8VXS!wRCwP%lf5S^Lx*DgjeuHU_Ztjhm8SE(t8 z!scJT!_2u0F@M2AoC?bOWFKkza*@hGM-iCreoSS!_c+;IK&p$;>D%)_+jpkm^))EHXXW2BS#Iq7EVRKpEBL6-!47y{f=jnhlggHMfL0n#ga{Q5w7reQHTlcU3VSkEF%?a3wwQHXs^z<4` z_i|Ue|WFI z{F(3_r@CD4l}0CA`aR+P9q?&y!X>r%cgN6*V9 zu=lp*^RQ~wdIBf^@f0bkTr6L@94Vh(dVjp=Gv5@aJ%jhXs~_--&s^{q5B&>rpXw0u z=sYg^_@i3Y7L%t;f}IG({Ufb7GlF%yPp~AX6(?y5@nNJ9^5iwal$7v-RlAaETu8i! zLQB3DFNyem>uDs6ZQamk*dUmweLSf(HT)^gT=a#IWia~=91e}#Kx8QxAockTgyfmx zyO|?kz$&msDM9${_(fF7>!b5mL(#6Oi5SD?w*vfwqAx2J~iDu>>N!k+D!0*mQB-H9*bT{kYJ$>Tq2RL)dmsmbF z=rw#WR9FhKoPu18|0ToU2Vxr+zze4*eTOsqel?W%3@qTc^JW|RcPM5ANqR|Ut{Zen9iQa za-Je_QLfamrF}$Y>D)SuZ*t z1yX_@;4D$*Sv(YjzWEWYE!A0AApl2?UnZWCJUR`YjDfAqARwmFZ~G79O_2)5lDN1K zOg4uI;CaRM#D?*OcR)GDvh=O9nF8*fK7hLcG0=5vgDDe7ivbwlf4;`|71^;kw2vss zCDQ0IY$AHKu|`F1B2FJagVahzwC^(*J=`rhWo5W^`XKJVPKQ;qKA1Yp90Hb%O^JAb z!`}DdF?2F|x3J^BYryEuu5vM4zWXU<>4 zE22u5>UfC1`{*BnnO;9}8qWg*k;{UVqLR|}%9RLvaSfNR2NUyW7Ft+o5fwWIcg|jb zA#p@Rzp22I$DgtgB@xN|827chNmC3NHU#FZjCTFPc{ulD8EF-)4d@ufnTQ3q} z;@Aa~C-h~R|93|v?<%o-!xALwjKqmeBgA+vf*K(TDflJV=_BRERlJCtRpM z!P_?$-A7JGI|n_ahQ7r8$ZFWR+JJ?h#WYHg7YX0jFA-B)fy6ljz^d^Ol&9dtabha5 z+`6oh55pCSb7Vkm=}R^ajh;-y`0`0d%k?mKHr4;`t+uyLsj~0uoEm)T0Xq z^ldK&mJA}_IdjV&>Zb0PKCKHh>r9Xz`4kr}-GE&W?*I0-{IOa*zIp;Tp2nijgxToq zVg&z-I}w`af-zrr!>DQ9#MKg2n{>jFqrJuD{dfN|5`iznk)8g4rJI{VnP~O)9h;-z z+6lx_SXpuO1jk7R7ydRAFM?iRWV?}Adf=D{@C1Q3H{!Q@b%b9KVDGKx@R+y}Bh_DG z+Tl0|CUhVshyc@;Y{c-kHpB!XV6J>IDr*c;mi`9Ey$_(;z8}8nPaw&ub1?XuddSoy zWA?b!=-kdmJaAF>cVX3*6R@4tMO@}p-MS05?di{AJHYWD2I0oTWDM?N@@|kn^G?9h z?LmIYy!H()-wQ{l;nUI4nLwg~BAhvR03lQ^Mojr0?iT92OFe?_pTpG$!O*qxz}H_7 zfg-^jQ&>W|GAjgUZboA8#Bb5gnRUBAXlXRqmGN2Q11=+4;7Hm!7?p2=kW#6RR?Teq z?5_}3qDy?V&e(jY1rE)c^;RjC({sU!ZHI8`(9bCUyr%rYuSz}&tMYO6%qct$OCfGf zPkcY62NL`!I2*NvtAz$q;=)lXZ3;c9IK-A{qljS7VZ~aQK64z)flHw>CklJ^ouqu^ zj2SaV5xB7yQIRn$_b-bV7mp%auRXpS-#&SVDo= zY1B?^9^}mah`^9Va#=lI-MfSI3BHcQPyMzt#JjY<%hAcdjb+z>3t@97Sg6 zSj4(#=1S_RRaY3TtS6p3wnA9Ku%08ajPpQjEF?l3wwMP$H_;V zbsdJ0eOsYP_iwP%ts8Lz*Aj?Wa=PT2BHTPF;h8z~Ky$hBu?ukR#8Etn7GUDc8I*Zc zkeePuqb3pRLayOKA~1IHR5+S&0esL(hzoe`%r(@gny?Ia@3;J?AmufV9lgZ;VTS%g zhQi50_k%0{+Q(1v?Z0+6UR4_N3hOp{!?;Cnw0E;6z5`wCbR{PyCLt+F@;^Bx6XiKE zw4^SFP}c!wHA(pCr(Fc{6XL~{{S*`zBeqHr_pY8tEgWr&5nGD%$Hy?^>uGqMB1GvB$VUMn2$@1S28F>U#zL|m*e|y2&?5S9?@>f*Z zw1q~(eJtDVBeu@{p+EdWi-BaylvzhqT9 z3Kugcfim^BFh1_!(-7aCYY$%wD_> zvf5HOym2-HvT9M2`5X(UjmAlzD3nD$fKN;g0*|c0wj&{E)3F6E9{v@3?k1D|reN`m zCGaaUMCZ0{5abpS9Xu1u=KhKVwU#icy@z${&J*}7hgRPmsI%{YZah!Anif9-_WkzD zI^=445PY;X)TD`T&&|E#hdD^9Gl!#TEfy?Wg9Iu$CF!s6-NXqjHCu+9*r#|Im52!c z>)1oZ%d`IgIGO5ku0CQW;X~F?@mjHL9*Q)q;Ylo`QUX=h z$~9VpgG-j;*o$g(?9v*_M8>Wr7C~(>K}Gi*hpKK38P*mQ^1R*4R^e`*C0d#$V%^g1 zDB|AwSbO7l40AUB1});xm=Wwt$n#W*yCIzufqQqKy%i9OGGAlGrlYX#)Q`Y{#P{Jo zc(Q91j-T>@_o>5}Fz#DgfWwKFD8!S~OKHj82q_ZOOH{zJYLtjsphd9A^GIp{Jd>u9 zUdxiJn^&KMl2Qe>&s&ekHwo}PcaoKoBt-bemCFbVdxgDoXECHM0bcWFVfuGoNGz?V zzK7!_1B=PqA`9947J6Y)%%ef(GxaxZV2`U5ULCfK5jJu1oU zWQhrp60;3kPdVkY+OI)a=8A9!uug8Sit`1zZOShn$RDEPq2)_DKWM~5+PB*wK&j_m45@~+BvFpNJ`1=sN@ybJ- z*yx3=2ae+Gnb#;H@S>q6aQfsq6f`~tjRME%Y1nhSfI_|})ERnG&eG?9Xbh(cPgBCM zkv$+=T|v}w(n~5?#kBO!9ybaB^vdJ}dgE4fAv87hDHulJ=Hu6IZ&RNB0#m+Uhaxo# zIN7ih;(9=YAeN#uL7Ld2;~=Qi#v!$+1}TA8uD z$)cF(@3q-4vGUiGM3+~?v3=W-Nu|;M{3;x}6++w@dmPxZhDNV?R`%+Ovas{G`8pO- z%Iae57a4itM-ay>@aASb&C@0gX@WQ!T*`&PFrq?V6<>iKou!dhS}9g^V*M`S;0pnU z_3cGW9b!olBcv+D9|zAQv%LKetlX%CDI>b#(#nzOKI1CE9!Eft^Qu8XbpPr(_-5K1 z3b>;1BjPbhWn<%}zaf)YPS+2w!`YxrK0C3?l;m;Y_z~#$8;cRGj8T$Az}7pl_-_6j zRwfgOl^t0nRk5NI|71VB6SVOCOb_wc{h2@YwYk``;5%$M7fMo4h6DTeqKqLkmv+rZ zV74@xHBltb+<>f#dOW?p1G5hX!osNuBA-4%L?W^Is0b{hQE10ChM4jF{nwEMs?PYG z{E(Jag4C!-m_BhDUS_Ky_}&S4Q<01aeu$e-gT&n|NxFgK{vl#sSjX_oKWtk;4N>bG zzT-9lAa1~$)K3K)1mrRXtsp1eVistkfiKPG%P2l;ZfxP9IS@hN$4F}Pnh{ic<5llLzr4qzoyquVLvve>C;M%Kef&T6z5+hVD{KFWySuw1!QI^oTSW^63Y4}`oZ{}37He^LcLF5DNFa(O zA@1&;%uHtf&pW{u=(n`n-Tn6abNg$UOkO?r-s9&y*|Y~5YSS4Ror8O&8pMesRv$H4 zaZxgsEt-Q^sXiRlQ*nmi@D(}n*znC5tlj$%+6oz1H-9%09^c2>nG5NtjmHm@zs9V2 zJ5a{`AGBvF4qPrm&yFV8zi|N`6%%~D;u&UtN5I&~EY#%O!@0{z@>hM=4+UOB==}I% zL?7OY9fx+~=+TW>vF-%!N8ChI%mbXbbWOfysxy)hc>V&azF-hEavULf}(m=7!lJg@yZEArSwAR-YCz^psUJp;^y$MmUtf zJLmB8Rv&2T=n*Vf8IL3G!9U~yd;`fh=_O0NdmQV2xr#aujkYm1hJK4{am@vX~nF z@Fqf|3TOajym_M(a!1VW=SksO-{w_e>~YoSAr`4w#5O~h(W1T{!#Xgd+8Ne3lH-6`6D&G3RT4~r<74& za329>7TCZ2I|7C^Uc9>K5!5Z+Fni&T@TiGpy30<)XQfgZNrLV0?ooC^qOSV%c_8?Aq0bVNxaJL>|VYkPJ9?mO;@_2{DYw z6wetzuhN?YQbC(u!;ngbEGd7*`la;74;(iiKaOgK6TeJE3itB3#VgUEbp$%D12Jrn zC6on^)A1uji!XoKGYtKHH9qY~pe^letU7%SgN&7kr{INsizdD7SDzEM3lV9t z7~1P2G*sv!D#8aPqCNyr)Woxg31~j3H@uvUxKxQXMWDwR=66>)cBhBYfkvMX0;`R& zfA%;SC{$2^oQsgKc(l@xz^d&~;(1I*{N1LInwvsXDW9I9ay&~cMGr;>jDIH@85taa z3ezE2K7IU4FLl7_Z74Mxh#fzC1;v!pcoeLTx`Jrjjg?~2Z!_R!_S_HOkU;~*2;a`# zfd1Z!NFO@`aWRnyq~Lez-wF+?CP+-agZRREXlM2&bwxP3^D5epUWzFLy>PQE8h6O8 z)J=}J3T$z-;yFm zDOK_L^u_q9oif}X#KDLFvCe%*q51hIkiOWvj8fJ~t?~83CHSnZ8ZuITKxT0sX)YsZ zn!qO%pdwY~vp8bv&%2R6X*s^yK(8j-St_fDurDYWxdbh35bC{HpWx5j^x~*BiNKFLUW-WlwP@x(c&4EC1PVk7OTXR5S8u;M^I5dln)fzMh=9QTe-fbSE^MjKGSigAo^8jZNnT=LkjlbH{{~ zN|GW4tPmy9wDF=7WFcJ2nToY?7gW7xW6gImDt^`Yl1hfQ5``~4jZrc5)b^YNx9ZE- zd-o!w1HQq^-D^<%bs*-g9sxT>9;Kzp@Tc=))XJ0S?WzJ%%r`i9I~aCa&G6Nv@$lL4 z8>TK9jqOYGU}@)pPpE8$ZG6S(GVb~!OR*IW{4g0h&%aK*ElL7ptKnnR~d7 z*fYBp!csLG5B#?C?J9BXWHg46PM>)jHqNk&5o$GpD9&Dn&zchxgHeXW!a`g>6pj)X zM!Q%?BhHOLRAes34jjtVGy{wu^Bq1PU5=x>mcogE*~wuiu<6WWOj-CdL6$2~MbTAX znSjl2m{Z^hn2C z{S6oIDq{1|0Yr?ZVY1*ylr)<{nf(x%@sAM_?twOKJdhWDn9hU?n7DEeT2P^X-yvoF zkg~ZeW-eTaW|Bm#TDl!6d09AhA_3-~cBGd+52cJ`K8Z{~=*b|aSnkJ1%~c@FR^Xm# zfFeNYJjV*;lZusOg#;vZZ9a$& zvBgO8v%~(-OeDnB;e2WpCiRy=Lg!aNNG!hnY5>HwjOdS;i&&8HAN9W+M8O1@w${;pF6iVKq6} zbmSEU&hI`0jb)O<L9R z)4cDo#MBCVPsd=@`Wa9mFBIk8rGia9{puEsKBZ#cg=BoaX)gvi*P=o64AnHu!j9g; z-@f02QEiMHkCurMRYL=7$`6<^+#83LmLoMI5yh#;AyqMinnVFL4dsYPN<=?qSY%gQ zWAT`gII&?CVv;IQofn8Ci8mb}-$Fm<4g#YS5Patr3Jv>V`^wo{Bkv94nJV!j-OCF>mZixUJXJ;Lz&oA2YeqxYTKW6q^hV)OolIYC3kBH z49z=W=G-L^$6rH4mCb8!`#*n_P?~=}djTR2Y(vlCpCBVW2$c+#C@P8MvnqhMtI#1Q z@ZC3uiDNhXwypvTZWUt@okm8QG-}98joS@CANO;NpuIAxgmVQTO@Ti*&ZHvRd@>nd zM2yDB@$0a5&q)Go>)}Xt`_1Q2`w4-U z-*}+X7&_*2)$#M$C9qLULs&o@B*n2f7?J{)9-Sx)YLWFY22b;(up!Qkt;ayjo<)Q5 z-c`sL2)ja~FDko)85E5eo}E7a3M2Y;z(=3iAtzdj2fxP3`E$^XebD}B5@vqaA9pXv zkic5RziPbsPXF|EwTSDojti)}BXDr*4D7oW#!aNg(7Gx^qq;=WrN@txj0S|+Hps2@9PYxmzxX5!M zDO|HbssKZxeY={dFx9F7)m%!IRdvuc(1x?6KGco9@x!9Ea`brNcp-fIq5!P%cQQP# zWM!r2DO$2R)bn{P^&I%;3MAyEK}7ATR;r1%&7I{;L&nf`W(heZhlC(zg6HOis8LW< z60#cjjQm$cg~lUkRwaUpmotn>SL>z&uxi;PhGpfaH`3?1g3|a65uo`&nHK(wq1K>< zZruc0umF}ZeQ|CL6*_tbRb*5unRdhbC~|>{BudcNYy&M7Rdnq?4%0sGgNCvy*fJvE z>8uMgmzL<;hst%G3^sN|9_MpPnf8-g!6N3YcxapJLBP(;c$kcwbP?y~#SlgjNbS-_X+_(WFJ6Pb#&goda`JjB=enrpzg#NAw zxw-}O*KS3*RE3P5G?dd=N$$xK@MdbL;CE{80bL5ZHvRgdU2}6dH0gsKtGcl^uAIku!@<~qDBGS`yJ7|04I0l7_KXm{X&hn*l^mYVcKlg}u;5fW_!^%= zUMH!fCim$J$7&n7(nGWk9W3f_aODIXy&6ivs4QQfilnuw;4$aMma*}KvYiv$JzSt} z=zyUE1~Nh^T!HR5-dFAU+LP8&87G>xo0lV1&KggA%8}cDKElSk713sWY76S=Qm8TEodf3X!L zbp@QmCa~lh&3+b+Ozty5Nzzv93r~7H#dTsDKQczmn5sboPLZh@YFx0wzIi!EyxxoA zV5z7CNmUwX-pZEVm0ZL`2SQbk&rL^yaJ&*Xt*~E(eZ;&I&W*5%1!pQ(C7lQK{y@t_ z2TB^|Xl<`euiA5-#;CR;uRx$~`H(R+R=@*O=Kg{W4fAfB04!YD)kNIyQ;6fTUD_FjA_^lBOxrDypjBids#`laoy$Q zCm~Z&8|HjRBU3xL(4ioqu~Dve{(i~?FrZ+7?vf1KXE1zQgL;89`> za;m5#3G+;nsA~xGD$tqalWU2cI<#YgQuaRbuP~M+(%ye11#Hd z2QyagKzA2m0~%0KC?|6K5SZw@VcaKOVBB*Iyfg~1e#t(Jp1T&qyIQ}zf8x#ExTnww z-;Hie$F0kV#NMD<%-((xmru?|#O3XXFRq3z@!hO!y)fpRAJNn!AJ4LjxyFppvAGkk zB|~bl1m?O-8zzMTdezPpTt?yg)9t&O-=7>UkFN<$*CUW(Hrv3mO%e7g7` zdbN1zshVK6~UdT*0I%6a}wv3HPN+>6E^eHo~jK~w3VETf!Olzq|N}Uee+;y1_ zos4HOp`2qi)RZ=$Eu-jWRPJ2c_aIO8B+p}dtQz$PzJoU9j}n=pNU9;1nF4E(al$hR z0wVA=CCV&e2BU+rQNu9otJ$Qo_-d)VdxY5Frio7t}`86Ge4(c zUJbF-6`dTK(3qj)<8QrTrBB{Lc`w(QbSRI>J2Xi{#ma1?rIy3BdoLKP7ooVS79xts z?n64t4g7AyN5I?3NdDLY4^!a&dol94hFzTP<-ZF2vF^EHs7O99jFgAIP}U_7EuFGv z-8+N9aXuI6tB?n&;It5&S=^HvkqAdCMHI#FGMtp@COzE6Cg}R&~>CX2S zoMOUIrW}`1XKLKx0w+{{xo0Hxd6YX%U`@V}6CaKYHan3rI;zUO=VE6BO;Z=lApmL% zrfye>bf`1;gPy7)+V=Pe?cDY07;50NXhT;=2kP7h3es0=L1=V9HCKM$^!OT>HfzDB z5hM9&6eP+d{9iQQvHkzKE9a+1z&9ujE*`C5YyAM3`9-kk+!ABP&>Ou~l$DgOy#(@VG@xC=QRUH=L5 zk7wb)zAdm&H$W>JBkVbN5UGY0I2#g&_U%i_U}VS$yTd3?Aog5{!^Fiqpm{qD8+Yu3 zYODf|osWW9izKL-_k?F9bC>Cz9MHxF4OFt4Q^?h^yM^#HLOPz9dFxt6_UPSKhtE-r z*4>?vUsg<}-nb0!?wF13fqFP_YAGmMJPjgXrc;bb@rO1b4#I zFk>v0atZ|Y$B`c|WmgS}O5<`V4Xv*5a(%B0xorXc}<_Xkln8H|8goY1x@o2aF^`H#@{ZXgH8r+#cE>NG*5`5 zo}#+u1v?Vno(krJYlvhzk!Ra>hzt)!ekm1Bj?9qX@ZF|htlobFO<0f7q*Z$;9GZd6 z+qKcwnOoAL4ctldgGX<`NR)@wmC#Axo!8j8$n$mG_U40n$%#;zw;*uC}}=qahffeP#C!-tTq z9fwOXDd^g7)?BI$%iRd z)%1Ybq8$}ziG+JbzK&ioG(oEsRb}JaxvS6^(vOA)b9z~8=6~%Pd>&nd66+>fHED`? zqWs;yv=5K3#UUUn52NHfLkZd%Mc8-vEP6TuPMw%a*R&J-jy{8Ce=|t)(rKIkg+O}0 zD8a?T7<;Z>Wb`nYX_$eKF%MW6lCorm#;2g|>|ZgemowB1+#nSl#@?ekxW}4_;&P#~ zM2Z?w4QEZT$=KnB!c>?|RWj$~%xtDhU4^@u7Miy0M&6|e|Ksbh-cJYT_kK^|Zvr<1 zDfX}1fh5~loDWQf)j+|FG=ZscJuY0j0`=;6m^e0tXSbeMdSoB$%?2QnDOnzU2f~oN zNlalNA@370@>NTrBsa{s|EmfTaq;wRMqfI@f{J2OFJ&xQu^H1xw?k<`E$h1m!-&G_ z3Zt^8(%iB4=Q+?&(8a_ty|85KbQsH)Ah)W5{EKf$K_(`zd2=X|_dL1(0Jq(p(2Wr& zV;Yfh=Z@e|g&vNac>uGP-rSdBq{RE;^oeww+v9^4Bj&+QyB-x)RdW7FEtvd~f|A=> z!^i->zUQDzer%#=0t4|QWZMnGj?LdfRg{lyD>fkHVLHC(tV<`uC7igd4NqM?H1E+8 zox1Aa!oE$Ab#lO&xI&Dc_9+q`G1Z535!KKLeNG?Y9Te!@OiRCm8$lN6*46{I?HN5i zy#UL$>7lo?0VC5)u`@!z?K&sLpXb#n%w_?u$MTE1qAR}81WfDCM z?Q4mxt7kxC!YCSDwP@Aeo6Z|5lfvHOghroN?bji3apodHs+4ebu#~T~^Lo3V&1>#6Z))ocyr{cW(Hi zj_GRE3Aa#MW`maYCb(WxfIB|7kZ~&>p~Y6%)ZU)yBH@Us*2gzp&E-o#k?Bk$C(M?A zex_H3oM*-u`FVFl?-_>}UZ;On1Wv|Q!@|yse8CHnf~T1J)i`)fK7b!SYAQeP%^!kO zp@uT3QDzEjq891~l$q^y8Tl_n+g@($_*l%yWm6h{W!Ssr5UfS4bG)C0uJz?~0&yR( z3mqxmIQYS%%|PflF=b0|7Lc!K8d)GA;2CP9&t+ykoru(y>`W}N+cyyVHL`L25^Lu^ z|46=v1#fb7aRz)YT*H7K-QZwG1&Yd~gpSj@KIdVn)DtZogouL#=eJG5k<`{WxM2$P zsjR(g1fM^OJav1tY}0{}*TX2OSA@N{7S5hLfdg^5j1Xkt>oyc`ikgg;`QgUp$N2TY zGfZ4Hp7jUCaFt$U8lMIuW@6N_K1qpuLQE%7J$b;3VZe-%FUO3b&LpVC^w>+);OOjv zK_B!`A$VFZp{zeQtI zh7R5OU~E4<99s1QRL75z8@FEW4zO0N!rE!%9oq!YLT_Quk$Oa)--R6Yv2b(s!0Dqt*d@)ueL-e6ok^=p3)P8H@S$9YxN#Pq zf149FCqmfNOj90WMu$UQS$-j~nMML-V7)aC4w8 zq-}&M)*xRrGiExh0eW_C3u8SR!3~uNVoi>{#sIiG*~$$k!3kDV`+WUyUj**ogjM zm%~E-zqy$qy%bhx)5-#=aSu@_vd5HJQ(&#H25o&^I5^uwPgC$|bEp|nIN73rAuz9Y z?NFJOgARi~f+ZsvQYyPj`u1q<=>iQhg(lvf>|&Dw6&7PnnfNIzwag%99)D1d2xf+6 z_}iFo(2K>Aw#~hvTAPI`?N*pHWi+jMJviFCpkx2GsLYHr%+uv^2+-4Oy`tYdnZu8jqnG<9t>IQaOQrurx^Dd2Nj z!QR>$E}q^HQ$Xt5dqcavgz0ac(30m{S=+$GP>0?UeK@XoPFSg-NMJkz;-2Utn+IWOt(95@=22RC7K${77RHDgUp0@8Cz z<(_B{kEX1RaYp)+NF>v!F){UmhlerJVq=lOusIBxVa&KuFw;>%Ny;-kewKu41rv<; zay;D3P0+TJHwsv+nNhEek>5;4Yo?eesjBn6tzd3y@cenG9@2CAl=G67Sp<*HpJH&2 zw)A?_463h&vbHG;51Y|bNzc8W723CHirn;gWaZOnu<>MiL~9sR87PwIV)*ypqNN$v zp_2`IbZ!szsw^a>F$Z7Wglo+WrlgyblL?&wN-*U*cXV%#-d(&|{QnqnY1u5QcS5r! zR`O_+l%7Qu6K6DYwxTdrLbKNHtl3C_Cd1AX#|(g*qZ4dQHKC@fL$7){%GjO9!Oaso zjP%7nWmAaMG}ia@z~{sIGZLai@0uf18%yMcmS(nYaI~?a_r?g;7PeeduZvzq80l)F zfLzkp+5tAUW=s)OMnN8bcWTXs7oS3h{Kkqj%ulDW(0m}qecA_h_GUD6G~vx+_q@bs zC@5z{$F(^;TDF3dZaF=EaVQt5z_WQ%v~Amz4uE`=so3MIugAcfhO2`mQ{5y?nWG`< z+O8Qa7?ssvouHGc3iIM?@G0lCXN#sZ{#{{VV*&>|Ln>9Ou;Bi8aB_f#o-y~VIa0{e z1clPm(~Wb+y-tR%t!{%>&1~s)Wy&h=En=%zZMUJAGOjNy=*2cS;_*$~n8cim#ne7s?Os_Phs7>4<>y!fc#OH@9h8wb0azi9GIqL1V=|>xyMn6VipvX!OF=Q zM&zR%JGQ6skcaq`EP5x6;nmC)>MZaO*H&`fc)-imUM^5f?AyzWr5{H=hLUq@^zGV) z4HJyyd&ZVI^REvr=6j21Bv;lc!M%wS9GkU<20eM@D(;v#X*4`to#Eig!&6Fx#9YZ!sv4?|&DQq1a zVPa_t2YY&8)ilWm%1~0S0e3e$@-j1YZrcI{soY1TnVy9UJjlDdbZ-ZRtS4;4n@V|N zfR>$m!rfefysefpVKREPa)!A*qmiw9z*e^&PoJf+Fjo(5o?c9^Gl3oXl{)2%Aw5;j zuC8d(p$iNfauD_?5e@2w@L~b6fu=ID(-M)Ir-CVSenj8)w(_PfI=UKE*ed7%s$t_D zd%1#Wq?C$KrpxA6%HZPS#xzfD=&&ZJmf=moxu!r_;b~_|PpF@bn_ZO*LC)Hl>aT`60~YB(|aFa=J=s&b{l zgehiTF4iw2wlCI!VANaK*ujx&PeDbOYfY7MqKd6->!6{-Iiw>>hZnp?x!!xe2hc49I7Q#@q4sj7h$nsdK4YwM2Olq6WU z9gXoL8A-4(ff?7Rp@kL9%uM9#SaA7j8*r^yHtG%*)FX`b=^fV8X2T2{m~xM)F`d=H z$sOKpyjYygXouJk<5@S_#MuefM0}SwPSI6HZb30j?A_>?q3@r2R##066?yqkFma$E zAjlC$3agTE{9+1v59r5iiFd15GNy+;jeEupjuq(fw^8WV${J=)G>lm@(qPs@u6x*X z-PC0Tu}M!QEcsp^F;%D^(+HI`P0+rhGm;-gAcgYU*3BKZft>K_q%v7WVID2=d5!wR!I$GqZg8m>RWW5?{(ShgT=VWWtpDNO7wh7)FK4n;z=#IW3)!kmGHJlV(izTFzIBbP z;A*9TC(*1a)-mCpbAeZ@KCocn{QYp&$0+K;t3?NNCq43#Q_=Kq6ELbzYd)7Hnz!#x zhcs)7;u2Y-qDel=bUnVeg@rwvHn7o>jxp?Qoyjj-(}_}r$CR5T)xy4Zhl#N%+V<_n zxzvTZodf4Z3$40zg`;6Tvda`PXv|b}qa5qhp*@xM3KZ69$z^6MGjkXy72(Fc2W)I( ziYD#*Vd5v<<#JF_MGwu~%@I#NT-`wa?e5Jq|8~%;Nkw#QDkQ4>ySE2r5~FbBR}Qw% zQ%hfw_l-{?MEdzb(Y6P?U4_^=bw5U=Eu1{4+ZobOwSuv!HQbm1(~P_^F;|39lc%6Z zQ}T84O(6%si0iVbppg924%XBolvtqeVy%V5glDMJutXDg`$nC~M2}9E0;n3p86rPL2OSGLW_SJWsotMRu{ z=`Lq}UW`J9`1ECuuqy!Axpoe`ET0>8|E}lwFS?JcA`;(DI)lmU)}gumf6;?~c+?LR z_&|aG?2TDc z6Qf-p%$q(zp2GMqx!?bRizeK^jt6OF@VkB;&b=03;aJbVa>^cRD!xTu={ZXG?kZ%^y7d4;|i6&(_X$Z1f`3jxk7}&2EbC=aT+`1n} z2!#&l+1cZ*X!Dhb<}m9P^_8N1t*S5~vt<=>wtVOX_R z{MX;}@9)Bf0z%g{wgP^ANCZ%-H*PKFvo^f(kYaWyY3wBS`q}>-pT)vEzCrUhpIls9 z!tO)mZ+dvfP3(V?j=P%yV?kCZ2#FIlX8z&|Eu=+`#)WINgk3C;*k*l3<;@O z?B?~yDDwVydjBJ(4Pw;4xnbWpUDi;Cg5n}}M0@*rrR<_56yd*m6?SU;yN*0>TzQ-;}ZyA7>AUMLUtQ_ziUYw>e)J%#pUeQ z^)70Nm@d;e8f8lZi*oU^0|=^jhcm|(!V!i zV*L(a{^Gp?Y6^?L8gQ2_rN<2a0wV~B=68=6NJM!*wR;sl{d_nk&su<3b{7+RQwJW~ zfia(aj?X8}#?9Dbo+`%O!`m_Di{bce`1iPYpQ!48@ZJAYhfAt5u!dk}BSw$p|BDe7 z`}+bV?fP+ST5^Mpd*2>GHxA(7%`n6h_4=!iKPBMVS6IC1II7sLTNtvsG;H3v9chgn ztKYuB^KYaL#K?(^dgndfJSp_zN+Q^YJpZ~H8&@tsU{WKl)0@Y>`FkF_wk2fczWMd< z{w|7tgn29WBZJ*V>kA%Z?zHjv^2<>eHSt$u7ru)k@48ee&h0;h`w!pm8EXokVCIB* zh-9a&H-{)M2#Z%PB@)K_4{>D?!5bg`p>zJx)lcu*gl~V`gwv-F;q>JPG&26t8UMn+ zvwP-^BWv-+$T1i_Y6^Zm9P_(3ljO!?^Rzuk&wqRFWH~8VGjkQlurXT=F*OD1G=V7SBEZhxlv*K_FuyqEPvl z=|80H$<3Iv`e&Rva+qMAkK{N~@AGm6Nnw~Zek{gMo`rk?h~oLE;67S0bppnIH4ft@ z{D^|eRQ$5$1iRP0VE!+Te7}El!Zu*-#fbMhxU?t@v8fsFb?m?6poa2T%w{L9%|ETi z#@#{0#o}GXh1mA(2(0{R9e&zy41^f^uN;-hact?l1wmT`VBsx zG6MnWZ_9~yo%7+lcThl}d+5Y^!Lj_jd7?nw}ZD4;+SC-;2=h_7Us} zy!B#aCqy9VUL?wE71++w0EKCJ>`KXN-n)&gT5Y!KYecrGFUdl%Ul0=VE7+P;4|>{f zR2mY{&y83i-CCRA_Qhn3oW7K8R6DQ@bOx>jsj%Z$0YV~@1PEFrRPHfY7^s zNGlex4I^8EDl{M}*cT5TC&Q2}W3`_5T`o)}!hO(v6jVrHWWrX!>=;*=9s^(hAY8tD zA1!+HLw!~xBC=)Z*`e9rwbRRue}G$l;gG7EvVE`si^U z_2Ut-93r145erBM_HIqlvs*Xh-?ipM@Da4t<7ExnxB0=f-kS+@~YYKrWz zYiR%NI?NbFprUMRm2GL^<#T&Dcc7dH?}{Ozy0$cL^0pBbQ-cv`e4iIg&5MSHQSRn zw(hO25u=beQvuqhmDpk>Ka2J^Avopx^QB#tMfII%g5AcC95$H9mb09Km zh9z@HAtP`XZs!}Kot-8gJW58B=AGe1{HYhM8LCS&;eW>u(N7cQcoX`>UaF-S-Wy|xDtSmHeT|Nx;$CIQIw)?d}+QSf3Yc)lORxL>*VPA;hd-NErTXsP~YzQ){ zwb%w#hfOpRP$41s8tGWUw&{7Kg+77p?%q6xa9UpN+3xzq5LIO0wvR6|%2YWAjjh9l zeIFHa2f+b15tXk%j13q3x@0Ca+fBp<0=V|-$acE~))R2Ivg5+w9}>a#(aJC;K8rH@ z^j8!n!{^pr#HJK-uj?TyG==YKhP=376w7pB!FIC3D9Lz&>$gIM{_Zg0^@NccdJIz* z?T2Uk9%$oXDgREsk3vG>>*tRLPeu6j)4rsW7_s4jq;Wj40f=9sT7ztAM)hnT>mL{c zLt8s`VMxE{Db5o;m_im6JN6d_^+fiMF+@fj%DQcmC(ZOtD zG^sH%l}ms|aYZ_O?>>gM8QXiy_lp?M!hCU8Sa()-YzeN2+Ok{%I;x;3?I8jm5Y(6W z4#IQ3Il@n^!^Ru=*s}E(jQO}XoC&I@p&~&}W;vua>G1PsGZjTcwpOmjy{I&_9MGNZ zkGURSZd3A`Fh9=qEj)OZgLVYg-MVlZ+&^B4Wplnp_m=K3)M5)<9-kO}55ZwEsFJC` z*ic{oU1{cH+`1FMmd!P6F=~KlJ}b1$QIQsc+FuEZljUEoFzGIpG6@A*(CHgTMgz-}6C4t{sLCZBAT@Dn#G&qf;UUGBte|s@D_$ zrj|G>nYim04IR>3hqMtDWa8L{op2aB2!y|SJ{s^Wg4cVH3{x8i;$0Bgy`mU}Rm3!l z3&p+1=`djXZ7rdv{98jzRQEe*+HVZLn=l&f*-kQt5xqLXDQL^vvNs?;CKW2WhEOM7 zPDsFQJW0$Zwv#?AZCo($<4y>@`T(s5_JbkUh_o&rbEYqVLd((Ev}`)t(6?b5<_4TQ zpAKg?BP2%$qEf{eW(JM&BQH4;H+{n?f34W|T}}RU)dgw9-?>8+`h4hH*g}-$3;!}l z3}|kL(%ck0O)iI}x&Au~s~?43$JGZZl$|d+o61l^*Z?u{pu+t9V|DTM(+ za%F6>pPQWvb++IYKwBT)^F`>R1Q-%yL;DXj84?~`RF#ha-Xnq0F)e))=#V$1`ftXq z+CJF5X&(A?A}BXOjmtCcVCM}Pe%-qnL;AFX7V*ViPUUO!BdaY#(2W~-l3fjRTT5`u zP-f(yf&ivT(ZPs_%_gjZrF<_{79vOKA&lXqUzV97m)oBo9m3)F2 zeNP2t->?Lg$3Y#R4nnBv|z^8&YgPnhgt<8EzJ6$2?225J!HsENrRMR zkG^*oY2|8!$IyeQx)?d-QdE#<2a=yDv%S6{<#1;5L)`KWhJ^CS{P`XvNC86pZ{uFr zQ{qBtvfVaYSWC(&|L;(~mBZRjfPkPR<~0NF-ob;Yc(!~t;l3sgP*o8E{HSL}$CD?R zvK>5S939g^cYP2Ym%-N2ght@{t|=)(6)_SE$?N??;<;|ExmFaA8WV!Mf%lP8EQJkQ zI1BfA=Ma}6)c1y57B*;-zY6O`Qh~@I>KV_{2sWqBdpGiwgva;b8xY2M0HH@Taq~nt zT2h`zat_6s=ER9@>@1uX6GptvaA=v?6O8_q9{=Y3YbopR_y!=GvQyv480rLkjlX;n zk5rpr=emXH+RTk`9q-z~Z(ixu@4wf2`mZ&1xDl`JT8i*8OSJX0L`A}F%-ZCG9$ma} z^rtzvKxGrz_i-U!ggzY!?Di({+45S6llSPx6&TXkv3qXp1dws9+;|J>Mp7I;dL7+A z>5a>)m*S^`XQ+r(;>_i%@a#?jRThF73)j#Su8agK-C?ON=-bWi6%~X}1TfNImkeF? za!y(*dJOp+Tx_UNRHb6u-mPTVd5DW3%6Fy$dUf!^&AmV1$IVyeI4!5I-b33#gYoSA zLL9xFg!8Y_WYS9f=3f06YFhZAht>JE|jD07mP_(f_Xuug9yzm%(hxL*JeL+@?^-F)C zCz~Lcb%jv1@`6rbELJUCL?=QT!tRF>Fg6n%`nE;bmU)=B^E~nki*V}rSv2Q5ua5J_ z@w1m9)oYKY&VqA5f}qnUaq>A)q#JdVMgn*osM*b%Fy9zXuD9NCJ*Ubt}twYuKKHBrZjwc~N_K{nS+AyVqC(8@&# zS8iou?y~P;sHO}}ZNbn10E}ov7nVIJoLYO**&#xYZf!Y# zd04q%2`&=vLa{QLo^W$~@o8Heoii5)ucwd(nK*wZ3GEyT@cp#Kh!ieM^cJl(N zi2~lv)0)?RdxYM(0%hBl=-??}^w6M6jKsXfJ0R9Kq|sCbJA&h7M_nY3NhF}FH$>^z zvBp0QUMdw>GGi*P1?3<=ITRNz=A!>6?Qr|I_1JnV1v=tqICDM@T?e#BS;PTMp7Rr8 zpJgEU;%O8(^+X3-Ev5s$TFZpGBdFspv>LYreVP#0gjiA9TB=;*shB%*60RiXQGxbD zz>^vbCK&7O<9l&FrU)H~NKObUI%Dc_Y3pPh@lAx1r~**m@AmFFO!B4;&y0cNs37 zy#kjGy`fzchQ+f;A7Z6kJ9`v5ZXMxZ(tvH-uM+s#0Yw#x=+vbtlxxzkeDOSlW-)y- z`!R}?T4MNM8-BM4XQIoYRve7;L0ah3v<%;U`vVn~$H<8bfKOBsK_!*2dE+|VqGKsM zID`tuQ+N~0BYN*bY(GbA7->8%_(q~jFFFREUcl&Y78A>Ypp=)+K*78ZTDZQe?yFIY}C>g9ENO{eESdqA+MmaCLb3s`l0inK`0E^ zg_Y}lplT>0*yS0xb{+(^93L!Pwicx_LsaIc5%abs%ta3nDQ4Fw4gpo&`k@Iy zWrZT&7kp33Jk%$rcVg3T$MBeY!Jo=Wa-JeOv~gv0em3T=yF@6d6r82pvv$+Q-rugF z&ya2q5wq^}ue;&cyDy?nEx=))c)6i|#y1WfI=81G^7h_%*EdyJ;aEE72c*_(AnERP zl!W@M7UWblHd*~O%WA);dh)68L!v}Yet3gaWM?*PS_RDu+x}QQr z5!NnWgs5C9tnue@*)Jbm`m{xk|5i+z_Z#wvy>s*QX^2{U1lQWTn6~&AR1rTY^uit_ zRkk32t@&GzS&|WouV!sPQG*hm1>HckW?N`v?!)-mTTob7fKZ#v+s-+S_Qa#_96lU9-;l<-g4O!bAB(@Z{0_Jl8T_(iSw0{8PhMlX z-6Nd5R)!7^Qmi1<$c>nCO>mdvXVg zR=wf%yT*yF((K3f@|JbD>2r%vR}{+rF$9#Tz1FZUGuT!Xe6`^)sRIHWDnvy1|8XttD#XS%1ObwyV2;~ zzbEy5>ZuEa-MR%8vkuUy3Bb%Xdytcr z2)`R4(6J#Vo|Uj(-hcd_vGbnn<~?tuphDvJz`_GJC}g~8z21gb*M9Vlh9Dr@8tb<# zplAO&W?U|jr*2T!{)avtN34Iy$XR+m^61sPo^l9tW_|?*LkloePyydkIwPj*{?;SiWK{s-8q4M?ss$uaJlEextg)k_f+5uyk&P7EQe9 zIaEX)Ydh4qHiV%pcuOdF#H>k?D7j(Ix|L8&ID^@{f{^hnAGe|-FnYmQ=w+8u2|Iyr zzU_^=>MA(38HN>KyWr#=KUBtD$L4)hBI*=5YZ8c*oH2fE4=NC<(5IU}Ip`o()1aF> zZ!rNDt5HXU`?&-ZOu2mxwFEu2a&C@^quO9Y#*4fdrWc<56(;>gV#(|wWcJF4XYRd} z&JbZO%AZ@K0g7dH1hsV}Fy_~Yiu{%8%=5u_D=V*t0s+Umebj?Mk7iJ+)gp-D43wPUuSGbcVN0icgQu0z z1aAvO6BA>ce5iyS`!~WUpf@fnGx&XmlD7faBt|9C8(Isogw{SxVE>4*rpflLECeAT%dvaVgm z$&f6x)+c z6+%=*$~{ChTDHd3#MG6G(BG{DqsDANX692Wy2s%-U@5&|ia0-i8y@9NhcoxDSkVOE zuUL&D-<`-;&BU$^n-Q5Rq7ufpNBsZ*KmbWZK~&AO!Uiq$95N0KjM|!;5oJ8>9u{vu zhGsoy;>#ZN*h>^JcI*taR*A*YoAhXFT4VC$Pmyr;2^heXkKzOhhsVS^b(XC z%*NyiQwi9+54{&Jg^h+f^lRer)5TDD4w{Y5ZWZubbO7Nw^We;O_=;M#OhsIcH2>rD z4!@s+hDerZN5%i#s*A{-GJuMk51iU|Kvgmg%0d_H-L(vrey4CbiM0fz@N3&ePH(BW z0cwnXaVx(Xblx@8l%d(WEZ8cIFWDRaisRP{F^^uP7{D*6h_*=Hj>Qp>P;K z7d>qAaBss=W(`b0FYm?(?W>o0*C#3N+_(UV$LCl*XB?7G>_8|%FzsF2V(PfgI9b^r z^9Ojs$lMqjjQWme`efFx3RtqZ8#D=88+YG_&Z#pHtCMKL+O)Jo|CUya`dMJ_o_R1r z8ovE(CT=_%j~3*aO1e&%yK)(#&uoG+4eEpI4#RrDG%Ov_k^GSn`I491__c?X!Dst6 zn6&sB>t^*p=-ESvW2&b_yO4^ZJr(-($PCzzLlLofXqpe7G)w%tZxs}yZsXMb43y=i z;@qJ?j99S`Lp=$COnzCL`xqq(mKgK>0t~i%jEU=mk(v;Tt9uT?X6QPZ=r#n}%2n8Wyipzsf4{WzAo2}*VE3{K$i7pLH8=RBv=oY#U9oEQ4CLON zgKg2N(CE|&Uw;W4{N(`a33&|pk7JKvm_U&8lh+b4d;WN6X>$IHAK~YlkI{Y9B6KuL z!K#hd@Nn`pbT$+2_WDplyTMb?IVb}n*7eB;7e{qz6`J-QN9?BVII?jw0jtX}Xxtp! zPhSs@!JnZ^6GzUg5yGz@Mo^75R`l$Ggi|zZu1DjuP6JR?RDu>C&BW~9TG&R%j|wVL zuI7UIi>|Fon1!_a74VNBuiv%|O%0RqaCA6iLZR*37TN0${QR>N)#MY#o^*mP z9R|POCNsL6iZ3Q}ZlR9}b5=nXa~9!ssyM#)GMbH8ikSo55n{6*JI)_OXRCI&ma2#y zhnK*Np~D6VGd~h;;kS@XOkX?&TFGV1g7HP>S3`N9Y)F-wQGf15AW#?iyi`#h1x587q9Mi^)gWu!9=%!eUN|7~|EnkepQ+uGrs8TH><^PYp zuKYbBdmdnzO!n;k$*b#qS7CA?2~l0q+}#B_%I`My1zY8Lo;7xD{F$hr20Qb`!MTXc zx4@Q-KSDM4D#lH(C7>u6+pa`l;`066Z>r)lggWFg>o0*8gTKev);d`H#W#pyO=sYS z%P4XkjF#L8k8jSy-6!K=(doAVf=UFg-3HtCztG< zxh08Mf47<5u}&ZM)^BqwANE^+@F@$gR?sbr!KtIi@$^Y9y0>kEoQz1=x!b~=QH#8^ z5>yn|gJkc2FeJpRZ#$n;I9i4-9SiJ3Xf zT-3nN*Im4ilM{-`9{hW6@_k=gTSuc$XBh0X>5kAyu46q)ITf&kp(Xq}b)wKRX05># zn8=rki_-I=?lPN^fM%VB6XunV%qlIkZehsXl8fA&L~d5f`8rM5dzkWdF-r5O0La=b zRBKC0OTW(Q2#U9s2B(2m!)7pbV1|W7simbAP-f~{ry+X?8Coc>5;9@u+l=r&Dyf86 zh-9kXT!*ii#ph5!X^|vcTR0<#UbVh?1wvEO;XYsp%#BRo+p;6(FjJ;i$;?*JJ;<3G zqdNKq_A~t%eEuYEKYb-uw8F(CIM0$~!RC{I=n9zV7UAH|gGh)E#y-OGWDE`9<=qOy z`n19D-hEJ+n?i9Tg)21Z_1s3mPfwma1LaUslgGU)$C0Gn8pD0nQIuH;RSJTsD^HZRScepy56Mmx#DdLF}(`#Vv<^}D%7{n#85d`56-MY7cIiZH_S%=i4jis;{6kt-! zVl-{`DjIpUga-I>mVm;%G(tccj-XV-;vqk!7~D`~U*}e-8}b)Ge+u+bi|*pCyVsJalHwzQO2lWet^A}@Qrlvxd)rR zOSnHtMR^Pv+?MA^3L-jnGOALL5J^IsicJ{#X_1g*R6AG%~W*CIQ*xrG@SkQE5$ zDTZXV25z4@iOfnP^lI&i>f&r@Fm-Lr3_(#z9;#|22^%8JFC&kUa6xl6jDoxjl*t*w z-%|tiWm$A6b0NdyQ6Z9r0olMC2A^H3hK)De(cZlkp(avHX-l)nwHRepWJs=jh0`aQ z5%uqgu8fXHUAc((h&b%r5r~+yFx(8uL`gCQsJA=x$kLscl0pki8mTX%AnVx%)>>4L z8Hoh6$@k7_ZarA zM=}yFk0QcVJeiqu(pN!?K7-J&i+$rW{P{l`&drIBAB2p1`|#tGiMSe(&OIZ|l)kK3 zmKA2xktX+ZUAYK4?K`2F8(Fg{H>4%GM%6`hOpTEr@f0V|KS#Ho1DH{iU}143ton?G zEwd*61E-*mj}2iD_VDy@hlhs;A+EMCG0}hy;UvMKDNr(Tho@RTvl=`bRA9!oF6ih< z)@zq`bl|&-AEJ(XRghhR^CgT*8rjO^B(Y?que2l|xs?)RrI%;JlpMVFr}?=eLKQ%^ zbRQE2LUM|kIj!aXCS;K3)6}3*2@2QcTG!OtqpfR4$n(s|a}J8iOHf+Db1O>5xl^Yh z;noVh{Y??}Gz>9uH?ceLG7=*nA|fRN86_of@o<3}*Df`&khX0lWo9;DqQoH8m+0oLE1r)J`ODa)Iee{ZsUJ_`0Uh)%%$(=P$H3U22UMxA zvP#)(hE7G3#1KGO(v7k~mS?q;u$tncx9fAtd8#|1qldQ`o~yulEGQ`u>#q8e2xdYr zLbqcNv?k0ix0En!>VO8VC`nn!AQaC-aYi&UDR9iK&BXdd+t3(}o}S`;BFH{VV^gSW z>XKha7n+1;S@8Vp5njkDcGM9b>DRd{RMd1Zg!<8jgo?F<>j+w-vMLveBI;5)?t~gdxg6 zT7he5rpI8P4$SzTj;aE6j|Odz#y!txvA4B_bcqN`1||)`7a1d-7b#>GR-m5q@7V8i z>RdT=9yuNDnWc`as7Fg5H_nR)sYxY-el>3XU)?wZt;t-4o_=BnH6tYk(uD2^Zicnp zNa)aU=0p<#Ac^ewDCq0)O z?cZK(3`_F|q6nUU4q7SvIqj6j$5qhKhJk?|R0y%O;@s-%s#CWXGC(0hUi>Xwco2_v zpACS8();d)&n3)3lP)A;LPB2$e%;z~AId;Rv4{}DOlWXj)Ra`9Z)D1K72u^ZC@U{z zW+V$Y0#74Z-Uxj=x$sNMD2uwFPcsk5>$u^^FS|m9#T^~mw}i71kprB6saM&EiD$;x zo$IbEjdF4*RnwMfdM4pcCExzfJ8oS|rfB#LCF#9@u${N@!r(n)6Q?Tgp9pqP5iXpB#syxAx>M+(+rjt~P z3c}30@H!Sm#dK%AdmEM_n04rb>EE`*og-^8>6dAEp33!p$Ead3LRHU1?C1zT7VOO6 z@Emxw_TwG}&t5d4zZ8;$4c5x&Q!c8CuOcBuJA#T*R>KN?Itm;)41F-doJR*%XlkKY z^a>{f@4(7`B(vJ@*c74y#OKPQYY%VAx^iTtzvB6ohAe}G#@ZUtVldUxf-r4n%Kok) z$fUn_$g-ZJuPwfqJp;{p&Vz@UETZGI@G_8TNe4|_S+WKp2A?%VedrM!UosgH3f(d5 zyUvaG!NfcjTy*eDI4C;O$TEgp`~lp(&PY4q1Gis>;v3fOh}iwBnvpJH)KZw%)RDPX zUK)3A-G@mIqd6z;!Dhfv@y{zWgE94&Js3Q7Hk#WtMqKH1R9912^Iu`qQ>j%ob`PrM zK`iHMZYlnpish}0gRHU<{M}R`RBMUm}6gb5hxOn<5bkcWY-{}NK90t%B z%f$2Rw~$?W8W)3-(R-R4DketA3ps*9IT3NI!!Ww{Fe;~71Qtc&w&Mi!@8UtY zW)@;utB{?Ogy7&%7|J_h>XKDrCod=TFp^h3!7pRGBlSrE4z0V7khoOD-4CMTv4NkD z9b`08(ZX2|Cyp(GhGz$~^tFPGXg}I?F~j8}$B?4O=(Uy{;Q~o8rQ!@axejF}9>nN2 ztj!%p;ZGzQV=ilB)ZU5L6ye2#7tn7u81p){$LO&?A~dfIri7GT5caARUre3>k8R&!^~pP!G_D1O4r`L~Um@saEG*;;p=;NS(Lp-Gjajayd!eOI zsB{tH5<`%ZqYD!q3Dhvs78eW_9#Dk9YOarad_i0ysB_UMU@?@3jlIJjlWV59vg;ZD>gyixj*!% zqpGQ(qF$xp_QNRHQ_ky~nxl=cHo{b0Fy*U`tVu{_Jp`lUj22QC2{8__!6@A8`$mJr z5u{7Q$W9JNk%9}R&TEf=RX-4h8ivoUwGkKl1lNhrKfP!b@>Uh7FMP%JVU0CYt|hTdpRTN72z5Tm}e6UFD3P6Ki0EOMwf=E6!nf2&y;R?xM)H%CkiJH z2VsQ05?r>}{p+ioGqt_pis1|YfqOO#7mqNXqd;ZYH|zI8P! zEk1#%V2_p%LX@11Yq!JUqbtSwCkyy#7^2R$8@}yt$8(&aOf}-ezppD7_5kdduI?7REE{7HbecBpM{v1a9mMUmW|M7p-^_VhNg8h zcp2}&>}7kfdP)ye=NH1tQJH5$$ixb(Mdy&+>}ut;;HziG*B+QSr60-(2bIy#VvUbE z7H?m`8im==mSN3?o)2W1&2ad10Y<6Z!Hn-efz;|_(ALp~F`>#bj7SRWp`@iH)`haN zB0LEW!?PG?hSVxxWogUrWTxzG{ivpivf?;Ae0>S1drZoE`TSgBl*pSh#k=$nFkE zW*v`;LW7LG6)+daU#Mfj=I@~1XjuPx78RglP={O3&%;1k14{z-!~47D;*ZqwxqrJ3 z;{C(D-8AG`6Ju;dr!A z_r&Zlyh?L|C81+_)Q?y1KEiFeXsq6I5z3vrv-4pU?Vbwp6N}|+V@6-_0ZLg@6B$Z) zti4bhMCVwx4he~oco-eW?b*3?1fj*Ho6uaBfs;+H9An+Zb(`zMzVB$IB`$A^iKu-sedvD@KbA3EIx`_JIljmPT z49%;nD8?%`(MdOOf+2&L!gz6c3-xOzKDf>7g46r=L*4ju*wV3<3tNXxhi{{&yAI0O`OR408BTHx{B$3U zRu+V^}N7lJLnFGvH=%08`K2!>}IBQ1CJpeaB6QtN9*GzkCNnnejHOB*gy2 zbF{PI86)g%>Ld%)KDomH<=b6OxlR!;A#2qca~5^Lgb5SyBqkl6#;T~yi=ZtWfPOzM zL~CmX^SnJ!erOqXT(Ur0a}^Xz=)v4f1INzY#2xbjY+tesX|iKcuiy{InhfsuJ(&D? zD`w>iVB>1Ql7=dxFE|lATcR57BUxR-@wIWg-U&Z^+nr8K66<{$9F~li=P+;MbIe*Z zizo>d2BpezcK>g)#1`c#}aaTQwj-O$NR4@OQdkYH5V%*h$LjNX)Gv6#@-AA`Eu;K7wsh^;U{ z3o4O9Wgm3&Ge9ZpaBg0>2dB<$7zt_gG8vW1D5z&7&=H!%KiAfjBELozKAyq?7Nd$8 z0S_NfR2F7I!^i{1^yq~l!OVcOhc#{<+lB)tFCn!|7Ok0jv@(&#iGxQO%IS|jbb|El z92h+{MBw40sMBwSw#42$I5|RFfrXk>`cFe&;_1_9SbF)hrl~pNo?OC_BWGaXHvp4a z?60J%4=)y-1|B=YrUwt$@xlTF2em;#+&u)|O+nA$<6x*If}5`=vGJ@tc=ZtHZajpx zy)QEneo#rhhW*Exsd*R-eaGf7(U2kLeg_U5JBb&s3Ne(m7XH>$Vm#1NjNsH)GMdcj zt_O>clb#&GnqAkSOvM!!91LXxOE_2>G0HB0#p+p{tA-Z-oO@GSXx7AH;W+37xUU?mfoP0Bc4g&42<#0tdHl#f5A43A?a?zpp7uGcusd zxzmZ%vbTZ~3;S){y^tMp4f_tBW$ld}di8A0sH_kf)F8CX zsOcuf|JKuB3%PL_4-?Aa;p+!`Q$yUna2N?C#`yG;wlFofhb2QOcP?MTgUB>E_MC{Z zeHt=9l9IJZeDMTViJi9g@PQ!}>Zv1pap>@A#1=ARGif9oP1r<1PLqy)4)*LmLSsD@ zo~=4SE^TFZM}1oX_j;n&;+ zav6_tg1GVyg9pLUOds~HuAE;Fgx@}eBganTakwP9^y)|@Cc=@!tj}vU94%cbcx{QX z_iF*g;%7K^>O32Ogu&Xo1>qQUGR!QXuPw_=Oe*xb$6K`XL1n}h>^XFj#k6s7@U&&k zf-<`G8w@WebFPCaUL{7O!>6NA5fg;-4>Qqw&|ns~8=~8QKB!B)gJYMX(0RZpX1%1T z6r~Y(`7*+yBBAWm6Ei3Gg%TCMj5?dGC=}z!?!5@lEQ7mWE3|3lhWMZZ*mm#&UgcE5 z$Go(3^KvbL(+H_<+ zWO+7<!>_$B%1cGC=bqP86S6evtbOoDN7ij+KMuq`);&E9OJ@C1 zE4UFNqFxchbvVbGq*&-Uw}zcE+Y`eao!j?>UKI_fs1i0t=mi%?2k|~}p!~CD07B4y zTC4%hj=6)wM*>kmW6#&ehl#~Zs2X~(*0LdPDyOVV82D2hW@Cl6eFvkpsV2-leW+J$ zaqHN2>}RGag-)dp_lO|w6GHA|-}y6W)_XLJ-zDq0=gf@t*~RoELbK{IdPHwXE9o&> zY{EL*9M;Cz!rfHk^{m%XkLQW?xS{wxWi~T#aB_mZot^l3Y^^L<2yFsq6L}oiy$=sU z@-TYxOn95Bql#JSDpd#8>M>d%9x`xs*T#+0$5E)$0`9t%sMcwX_8wYDOASZR{YrGB z-ce*U+{)Pm_s$(cRE;x+f7%f$jJm5;$Kt?+AS4oY>)roreBRv|+RS>_B(e_Tb}WXB z9!lA&3L7Uk)<1b6`1To`J%1VD3>f*jTQTq^g1Lt$WlI&(S;ytx!WaH5@V{|lFOE|N z$Cc?Y>*UNc!&2zb%ZSXCLaSE(;>?Zs_G^pq=;;MKjg&@fGSqu{o3W9}6}-$;WL8rP zxpJ=PXe$S4V>_4|YNM*O1m*J9@Nw4{2TI~1@8QzD5ZWkhp-&r0U6XZvWzp0#Cz#0) z!LKy~nchaYeTe7d{0(MyxhGn9Fi&2OxR@7s87_w&U7Q=6GVsXerQpVu8w}j4!`I86 zfxIlJ8F_N=NV3g(Av6taS*xN68w)kuzkG%^U=TDd+*yy;4jL6<*tcgtb>TA@I8)af zYOs!`0?sbxY(mwr_e9M2*T^cvl5$Ccj$(R=Dth#9#|C{bar#;~T)T{6vma*fyxgHe zo2N31O%IqEPE)iZOjU58fUH;d@i2!qyv>}sKWp)jYk%|cQ^Y0LVA!{F(4K+kDrRT$ z>(t=m(eOKh&1&1s4`pFTvGaHkBy@UU>hyuERn~@=mp1Fa_Tl2qyC{`bMVmGq;BF(2 z!`rvu%;me{W+lzNZSd^eW^6rt5ijCOF#NNTXl<{82WJDYjqklAa%A|h;b`q)!{_Do z4sXHPTUi*ufJtX>J)Xe=*3jxOvt-;DXrm3yMoGIiZN<5p4;TRNgAx7OLX9;$RTY^C zJReRQ(Vtm$1;}Zb!i~+4jvqXX+xH%$NX8zY4R43kkQ=!4q5%Cyd`V}e8eV?Bl*2BF zymbVpF5hNDq6+v@@0DZ~z=^fmigZm%vU6B3+Zrv~cp~NAA?n9-h)OGkSMyd35-|W5 z9fOBYqu}4G6YoV17Ir$gb?PwEm0DtGKh}ZjXu^(}*&04iy`~{7P4xd%mx>qdH-Eja zW=A5okobt-4o2`qG}6>nR3OKQ$bZJD!H!)4kk+R1MhdpA55SPk7t!6SNpSsVJjKVm zWU<<@CD?I65=*xJ#KPRaHY1mRo`^%H{jvM&c7N?cAAkG*>lsMDI~SAI8qyj2@*jWB z^;5^<%=270*io3vw86r~gTZEZe>$>moWb~`(byXB6aLK1{?m*77k{86<`6#rF&+EP z{P3&VqQ8Gi%CURpPuP1a2TsOxq?+}^)Ztwj82S6Z=|A;~kN2;}k_UCzwfYAdK>uz} zQG&G_x53E11(Z^5(NVjF@!JB?O8>(a@Wz%eaN^bHERgsAH+ZmG9HLWFC}{?FjWTRs zz7!pooWiGG#{UNQ_V0QN<@j;TX!w7>0e$~8u<`Hu4F7%iB{WybWkU%Wc>#6v#=ZIf z$k}1XkC3|vx)qH4dMWs|?Ti*~R{xS`_}{lZ{=J?!A@nJv44q-B#c;r192qa4BazU` z=Ik=}aeSPC_su|gb|_xP$iu&-&HFy`x4mDOn}e+EY(j6@8A?KnSwq7=sbOsR>I!B$ zp2Qcyi|wkF8WPQa+dcg^T}Wu%{pe*G{8~DS8=3rb&(3aNh1p0=%V+(N2vX`s#QJMB zw7&o6zVtun%JqnT9t=fe8`guq1K0n5{v>q>V^_C(tY)9^2E!q)H^G=lbKYb(rG1srfi~EnDZto>V zDE-IW_J8?}{uekq|K%(E@$o;-z{eT*I0GMN;NuK@oPm!s@Not{&cJ`^47|_Td1p!B zf9V{3eC&@i@Not{&cMeR_&5U}XW-)ue4K%gGw^W+{y&<5f7ID2V$bb@;Du3l#CHZV| zO|BWCWqi{p7Qfff8k=B6c3Jtbc@(k3RYhe@(`Eiw{uSn+hAlU1*m>h!Oa0bk{jc25 zzw#wDm8I-hm&;a*Z+Gzd^DEV{EpRz&;y!eguv1ljaf!G)$%p>V|Jmo*m8FjJ@t4=H zrX1N>c|4ErI&*Bp%)L`B>>ZxjkK^y10b%``_{aXrmCK6QjykXCo$^lDAAfZI|H}7% z{9T?8VGaNCA!NJg+-ww-Hgvf9-MmtliFgKU*!fS;H~-|QCk(Kx?Cp+IfBbC)go+lh z)$%`kSATpDANo@g0AJoZ~XpqB2hUixEBAb_nzmmxMVBS3%3I z9SnpvNADfQSTSu8VwK7JK*sNe!S=XuDdf5#q1tS$ro6=5@AtvX*B9Dk>wbHPG7_<7$qs1vwt$XA9s*V`!n!THaQ13E99`VmvEoCD z7Rzz{_)#Pk8N$M(>Dk`?mS4ZFug*jO*<>XxUD=7Nsd}@PUDXy~;g&$Wy!`+sWEj^a z5#{CmbFrA6&4Srp+N@$fD!)AWM%>v{b3^_%_|be>(wqS;l-(Y$e9YLP>3 zo{BnoGN8YI#xtX?;g`9qahaXO&YZf)<`AZ^Hu*4oa#d~|HqID_O>CcR*{l-`8|ORa z@qVmcy%tw)-Ne&0z?-ePrK@wXZQ%lJ*u4i=ZvHbw^L(-W_&X>*x=a--4`33b$p$ zN^IYCkZsxHNo48-U6rQ2^7=yJ7xh#kDe;MrW|zHpktx6Z>8QIWF>lr~93&xOVYNJo zTdm&y@q1rqras1oeP_{}d{F=D6c@%lz{IIb*mgM(x$^e#w*Kv&s>G#Z8}P%-0A!b2 zp*cG!{wI&j=!ax}UxeeAt{^s(d_BURe^(PiK4g7GK3j(uv!j&qJ7w6Ld8onlL+h|; z%{H82H^LfIZ#e3*VDke;{QVU;5UB%Sw!i+@h6v}ktiyNMeul+PH z;wYAGJ_7gl9mH*e-+L8u+8v(v9k!jjg!^~W;N7XYxU1r?K2IX=4QrQU*Pg?;6PyTB zdlzWG&3OFwhv{Txq{O3ETAjRC?>Ur>pAWxv6!YgSr=4*gGMXl^GygETRGJcp<695I zpoI^V{`f195qb#==g!6MBd3s~z%H5A4W06Cu9}MzkCf2L-{kGP|3_cf7KCE*k3VDg z(Ga+J`jUc!dPkIn72i*xemenUcOTZ>zG;O0p*ItAIshxTkhiD1>z~+rl{mY63RWLF zjyt!L;MTr5yDI*Alhzd{Vl!>E?fXvPF-g$v$Va8x*lqQ9_rngoDRBuTmi=S>Sd|}# zwbN%~EA88d&tJi_tv~5Mes{IM^hVU3eK>J52j1?MyiO$!>|BQ|2?JQ^|DHhh!@sBu zhgU3Q8}uExnIJ+lZzquY^51LJ#j**{<2@tndFwL?9ZQ^k_jUVCpcOd(9j~^2m6AT3G728ZVQh{fV{dUxkW@sicf{6 zi4~12OSV;Q+PHc6W#(eE>d~X2KYCRea>z2TK=LnPkJX8)Snyi{C1nzV{$>^m;;&)M z)ZOSk_FD|;-4-UsM$lqg$ns)FK}7k8ib_DOlrsCsS0OGXAJ(4ku(s4C$H1E_Wh6%< z>cxFrxc&$}UAyAO#z}ZwW{n@e83P~k9~c_wKwe&oO!KLTU=R9I767U!E0cVWBhoc=^a5otoBAnZI6gjn4u(c50 zt0i-L79>crC?lShT4d)IL0(NCRwRcza^yTd;rzBD#}BEuP*Pfm>>?6ik<>3EuLKI@ z2Pvx{XFvtHfZ{TtM&1T_5=~mV_@VgPDKa+qfVC!x8RH*eEg8#ATwB7%)CRH{H}EJ= z9bt#JBT~u<)2EJykDCRwY3K=aTV9Y#0<3t*Dr-ZLRz>ikO*m2HfM3Q9goCXOtSwBS zL9#$Kwit?C!JGdHNih=#QL7w~xnMu)zPt9iQZNaH)Sck0CSgv6rDr;q+p{B(B zRF6b*uOz0ILQ9tfZ{p`K#hR5n;nw#Xd_B4^EJ)-jOCq=r8728y$gL%x3|lel>%L{M zlGHSoydRkbMUazKg1nqG2^jBV(e?<;SiKb8TX~VllWS33f+)7kO-{>(yox%>K(n!K zghXWt4$WBxy&m15`DS~QWR>ee zgQke*QBhGDnPDgK)xxv*^t&I(yVL^4#)dpIYMhH2#Pc50NNy+3&&jdnsu0nQXM5b( z#572f|E9Vy1(zbcBV+kat0m?SkbI{^UBs zGG+0_m>!6@vKdbbG|=3I?NfPXQ(~i$NJ3UAIYsi-kbtn@F=j4^LeE}~zq;|_+$2QD zCZW1c8mc6Gy|rsH0xp)|tDh#LBO4kR=^8+jy?!gmp%oDw&nR#m6iMDEUYnX?M1+MQ znVB>>6;0$vAIJR~H#jR4At|R4S~OV1OITNmsL(L-hDk%GsfGWq?xNv8!aXkE{S;sP zG8cooHHSXWs~}JF$iF0z{MC@RN<~Et=8oipdT<%F_Wp1((R_WSY@W+Vwu&#~v#6;m z3mm7YDa%1fC<*S!&!nRGK^DLGdX?mnDlgANdTt36C1}iK6tlfFuSv&0hHdqEtSL`a z_#iKF8%kNin( zeBGd`sK|AwLvk$7u&^Ix6rilG2R9E3+_{(v2RB!k7&JUzorpYn;o(R~%YlR(yU>v= zP#9_P(QM(H1$EBZZ*0={-G=!6isD@Ak$Tv<`oc_?gt|?iW`;aEDjc~a;g*$E6w9OX z^xIgrHy#VtEJ8`p;l56vXpI)FI|Uq+h%N`o&-f2+j8QA zN!c11hSa=L=xCF}OvE<-q`4z^0)`KL{CQzphRKUh16-v7BV7p{3Qhf-zK07rT zY3W%gDrLrpx>r(Gf#jVe4Xr5Pehf#A40%r8L)a)HVu8$aD9=qnOi}?fb!cE$m7<`$ zntMi;_Et5D3QMW~b>Zx4!?xF{P&aUa6!spm@HyNLf7!9S=XIObS3_ZI0LhxIQNd6wfAiBWOs6^c=NqgnUjD^tZ z+8tsJ?#8bckvutq^17f>M473K+v|S7#j@sDGJP~$o$M$-G)bmSf>pM&&Pt3yMqxd) zG=#Mmh6oAKVPc&raMLL?MrkuhBpel+fbtr0IZ+-7pG}U9psde_Hurek^)*;Ls*QS>lnoKoDJhhDihPEL$LHbDOKHsf z`CG)@+=`b42Jm$;`ybuo`<$KM&d7&9^?N>9ko5{111_-Vx*3k{--G7e`ooi-JwZeC zQIak;1h_+)|F0`fz~-&Hkex1pq=XkRYW5`-Px8n4qkGAlk&W*+ZiWz}C{0hmu>+eC zMMq%6vK3@Aw?zLw)>uqpwNXFJfrqgQLNBpL`EzTmpVjkslk(!!0rq7dh{5f=Uf*#| zX*`yFPeLzdJVGBofu8#atog+c`!}sdo@r~$b+v7b9@Qh{5~J`(f+#S{kWg(w#^E?z zx>Jd7c20o3-W#_#mHanzm+v88PYIznI+(t2DNLmkv25{Lq>&Izs@4RPXMP1`4H3?q zUxnMJlaW<#hD9qD!BR2<8|SUSv;1;yS_4d)J{3+R*nD*E278%1(HVS3?tm6hFHga~ z9Xk=5UVg@^xeG_<)nOR#y9*<5>!=_6KNX?Rmk5LUmi<~iQ zJm)rGC!~z@5fvN@hhE=e(YSUHn1*%LX=pT_wwUBhNaV`kMbRCU7iwWp-_Mb}dkK=5 zIT_N=9#_s?g{yBTSkiDRh`E8)%MT-o#AGUZ4wyA}D&-3KlE_)|G=yY;Z90mX-2rp< z{wKFVZVZk*lf&0@XG2Y*8rQaNz=10vfNCw2jap*O{BZ~i+>EtH?vu1q2Kv_im@#z> z5>Bnd+B0E|BX$*JIgDOaeaSG5W+u4J8Q?Sg~w5f+Ld9^~+iKx|bK8Us;FE z`yP=BP6{mteUC5r-tSG;T7*43k3&zQpe1_~`^bav>A1njjeCaWvp1rUq2+Ym=e%_* z;9;aoJEDo#IGd_EYT zZwf(4pXRuCd_9ib;@nmhLbcUsOzC2Uqucf&B(j6G^A`WBG-AL?)7l)K=zV$GW{p zEGpu8J%Dsqcl7Vp0WtTFV&$$2WDqA4x4td2hI7fEVgUm!4U+sd{Wf`5Uf#rt^*d-d z$Uxh#Rj6Q5T%|NYq<)!sbQap(Nx4$%yx(2r8&7Qoxio z>!I?J8RSEE=xor?b?kx}BdnlUQHJ0v=TO#58|O(PsMx6kiJr5tcI{F;W)MxXRs&Ng zdvq!u(h0qQv^s4RCES5q+dk;%W{4~Mmf+|^GQ11?6$8IQ7xNONO8R5Xr~xE(ZknHZ zJh-|K>kr(bQBlG+!p*Unfj7k8!Rj@;sGrChFF_u&C9}!OE|2rOH{(okI^ye$v2Fv6 zTX=Q8UwA2rHC}vL5rTl;3yG}B`Y@}rI5TOG{VQv-io}y<8bTv zGrIXYH7youtMYJo$x2>3gR%K4v>h-3Byal?SOoN+i16NW#gQSPI%)+J6BI?Id=(n1HsRJExV(Shh zX4m7~p}ny2?~mSUHQ2gnKDqozs7x96vlE z-B`2rDuX_<S#2Q?`^}nowR#6lm3IIz*A8biJ_12JUkV)AaHdok?isc7{(E`u68qJ!0U%$HEE$!4&j z7O!qxN8zLncoSy&qvff^gM-_#?Zg8}YSjVCZrHf$2Rz%m78`lZG=zEh9M6j+Z?8hr*n!?AMicTl5eub^s&S<^;APM%7ns^ND_Q}1IQ9k)@_HenMX zOJ3?V$R}BqEF`fl3s=Id-M84fBLHpeY*CP!i}O2Ip`Ik8+qdmxDs>91 z8JVjqk3+S*9_Fmw4G)!UakTRG#RIsKtBXa;mcX{~B{rN2rUjgd^Wk+^vSl&klR^d^S)E~P!e~1qTK2+wnwoGC-ZP>rDWik0r+iD&LJ_jcxG}|}9?8j} zDAjL|HQRT=KI0)`NUG}Fe-egw^hQB;ZsX@hyPF|vh;AXiDBE7acz7;$0bGwPsdJpj#=OUWzInPh@`D9p^jqi3mb?ePr` zY#4*s%NLQHORdMjUwu6k6sz#+*tS@$P4)X%fUDooF%??y(kyk*UW`!pAqOz zGPUfmeb{(B5??P{gXQzThbSipB}JiFy8R4>OYGyXUa$^eL9FUyUx_G-QQ3GGYFOf9XDG zX(%8$>K4{*I*G2|EWqZ?i=bXz%&3bZZ0%fO#SD#;rw3eIoS`gJO^0^{O04=LVEbk| z$%;s(5nd;f=b15Tx;^o~5jWQ3&?6C+Y}kUIzZ!(Hyc|YqZ({S=V9Z|^fPH&+U{p^} z$ki6JmMjlGLuO#Zl+lQLcozvNQCPGn5Y5NTqT|~dC%5gwbGDqF^ED%s6DEimp2v^> z3b&#%$P#V|du|=CENMrvnxM06+jqL_t*U z>S%1fJ&IEw;%QVG9i*S=2!9Jp8vpS(H)Geq7>t{>93$JRVcV)bG&??Qh$@qjC+S5) z-;=D}`smi9Ba-gk#>#_N@Y&4u*t>H%tGz-(rVJL4->bWu4qiM>$HTx? z2&=Osqxu$%8|;sg^h8`ex(QWAy|9ye?B~9gSi9;N^2&w#X?PX|W;m6L7$mrL5!I+PV=vz4RIVC2??c3C0qV zGi$6buAF^{jEIxibMZ00A>3|g7cK1Ay#p~XPGizH*W5UJJd<>o^|x5;ko=fwp=Aw(i-9O7Gr0XEnGJxPdY#8?zTJfv;sgcAvh^Xt)tv zOif{FX$eoyW-!;+K9My{kQwH@+70d`D6v+6RMp^PxtloSBJ;yJ> zmhB6nQm%sf(gHd>D2X1sO%ykry{$eM#o=d>A zHJh+#)&x{#rZ?6|us)CbsA<$Qi~8{NLs&H*id9P&Vps=TX7p3Bc=jGx^!^r$fB6(q z7uNHfzL9@Tzx%#_&0O2!r^%n8;Pvm++Otn3aBl$k0v zaHq^PC1ERS@<^=x5-#0GVA;A=Xh%|V3d^@-raaW?H01F7u38-cyHA*v+q@pFWQ$S4 z2)VhP3rTE^U~cb8f^#S6sfe(C!79`^4doha#DEqu)UlK(^$O5){k6;tzPtt}f~B!^ z<5o=KUM|aJ?InXDYXYuf^umqUxpz0dAJLYXuUf?MK$!cF!R`&;kRbdCLSH=Pe!qZr zx^hm>yL-&ziWB!6E zFjFpoaf|L~W~PMe+cx1~geGP%XxvKc1p)#t;_#kT_?!mt1fJosG&YxRI7bJr7$J}1 z&}HH@Y?#|0w*w=n<};8POS!@?sAHHXj}B&o1{c=<*K%06hu@y-hWq;SzwLZ`;OEcX zkylaDMe2PJIQcnW?a`b0fk;6%HP>GhJN8 zh@@={@MRcu!=|m9@OfudB;-}VYt&De*iIhP#}6Pk+j(YEXoV7r7!_KBDT~(O=TR02 z3=BlfB&U$AxiS{O@fp}0be1o2-Y{PaTf z95D+H{YJvyRu<=XO~)9nr?9T$#!tZV&9`VP%Aq1T1nZWbNB>Db!dSPwaSi``T?%85 zW7X~;jGVg)>sK;B#|)fcp}z>cje4DSSh!>vzUsyD0!ShRghEF|MC{0QAV;K^=3QPER zjKAI4Q6jXdrH>`_xp6vm>_7uwN9^?rFc1YsGNc>5{rZYxXm{#`zMqhRSWOQK%F)QH zWd?*snJiP3l7xf^Lsm^2%{sJ&k&Y4CwQGk~E!>FVlcvC*h)PD-4xc%Ue3|y>;3Q-v zem`WSMMw=!hJ=D1tn>FRYD!xYWjV>=-jY`T$1wx)`^UIKz|K@;~6=#r9Sd%QU&h)seQN^^mltdMZ_zONBZZtsw zIW-lgUYQN9u}8m-qo7OXWKBgS6c!gCr>Kzdk`OFgFdqp@CS-s&Mq$K#!gexo=Vlm^ zvchm9I02IKTJZMqg@LXqI&dzUIp|WrYZ2Gz14F%r_q@e?G7^xMl_$JQfmxHL=t@1L zHS95dR2M1(A?44sX&x00=Tc5umQlE-tso1hX8vUGc7&UI2Xt)b2SYN~o4NHs8w=v> zcO1fvm$7KwrwyN#gVz@#I1-KNnR-QSIJRv86*BVRypzsrK=?zYu}1_IR2~< zEj=CI`iQhS4|MJ3z?>O9 zh>HGyqQZQ64K8 z_`*?x*=|CG6m^|2ZbWA>{79B?!}!!Vlt~((b5|E0vpQ5$Z^%$iR47}*&zbT;LY=T$ zOXRZtP)VshT3c&j<($J9Nw#uDHqgk=%_3y65*rrI!^;$TcoDXy$&8A>lMS3)z0k2k z2iTeDAt@pnCYGPWR9%6NxCk}WlS(pj$Vtj4%;n94rY9u8(B2ol{B#(+W77b_@?@A< z$gI?cx4)NoPYDLUA~9mc^|}~6@)H;^_@TvsV?rwHgeqvHCSAe2*{e{^K#esGL_=dM zcyS+kcnIgvg&9n3uDJy~-CYS^wW9oQO(>EY;vYVOX3rt8HDJ(1keQNiL&hnC8uzb+ zoI1YSFdgL&HsiC;hGXxQr{YFA#f3EpyLJ$Z*Pnr|eJ2>GzghD)Px$Uvf)10TY>?vo zH=OobWKyPhwQ56{vMi(Fv=ivSC}`?YW_nU)x{A+-lL_HhGG>@Nb2?(K1W;yvgQFK; zHONdBElP=HW;HXNl2EE6(xS)@eLHwkXIArkaCr&!a;Ls^axjKxn@(ug!WSk=`FNQx z!pH&b35Aj*>`ht>(UhnbQD)Kze``d)2#3wEQQ~^F`f}O?v>hrK7_E^vfs;A!jYEyP zppNh`2TL#NOM9pg@~MzpiY!6^D@v87t>=KjvD(%f%E1M&tpa z{1vaimkS~M1~hd_;WTnA+Bq6PNmG~S|0Rk=vXE7vT_#+eS?W58x7WYH1`xja?a?ID z-hS`TUpMGSX_=%$znJ zkB=|G@Grl^nP9>w1^vkV(_ms$FvBYcQF=TItec^0XDjMDW{U*ZzqW8R&_nCa zZCLxn`a79?Jk2P>@cx}xMuJSxtyN=2NQvbRbu8s5DXPMgv)dU+xlKr@ zFLkLTTn3FqY|t?T#(SWPhZ!rRC z8EG(jMy{C;m#QoHeAuU0f9wkDyk*dR_!r0vJ&wai4kA|H1ud-=QN^T1hwH zwj}lAD>3}knrH?=_Xv)dGGU)mwIT*v8U6L%ZkAV3#Hl4X?bM0tQxuAFvx2|A@Ud{`LRZy9%(VvNrtE-Kn5}h!|Llh27n~ zx^~B^yXvZIt!sC8D=K1l7osR4iUJ}?N=bJN%*_AZ89-EAb$9)@IL`wNckVs+obU7( z?!;c0ShlVk6$h;=)RtG-#NN{yo;2a2NXz4U*VWzLB~<{!&{_()bpDv__K z3FnuJbcabvNub|qFs(w%@Gx0I-*;P{oRzS7-$|O}>F1r2Osxlf;Zx(N%?-t!Lrbv# z*bOM?>Tn{_#a`Frh^G5RRCpLNsBx7@>4{%p1(_)j12mu$`g@%ME-aY?akOGYU-2IxUn-rp8?%*>Ck-msdYpn zOLa(Cj+6u&|WXX-E&qc}{a=NMIsS z@mAoW>fCND{pAqd#^mq$=x@qCmF<$Alfyp9iIy{CaA*WwHSb~h#)HUK(cpx|c4huT z+ZHClEhe4Log239!}K=lIJoW{#|<6YBySM&CJJXaEy9)1^62AakF4kZ2nr0uhQ&1N zzhVp$Epikf!XuO6<(J4!cQO()6kyD)!W|wS?>n!++C4tVXW(>$Z#&@8k?pt}k_NGe zKDXSUYfxDb#|bYy@GdQo8?eY|k4w^N_yBsY!^5i>DtkM;GfSC}V{FMmrG? zzUG|V4bWrAEV{UE#}A`g%QV&!w!N%R3itCTzd*|`pFiaFma6MOEhQ7dtk3O}>u~B0 z0GL2$zuSikuaFezmXeth$G94yazJEYD9jrS$NocyV3*;KT~|V2>qzhr8yieqxDMO5 zF2~@$bs#(~%}vI!b+d4mgn=JT!kk45a~@@^zzT`zGO5N*yMBBCobN;+JH`i>u7{#L ztx({hSU%1;r*SS5#<>y?juDB^@zUoumTfyk)4wjtTHD}`=ViwA8LV!R#pJ;v@7!vr2V&*s{l@MVql>%W8bvxd~K=!j;GI zEoe`L_7k%`1TC*bnEyF9a2l5-bqx(Ng4N{ti zsK^L(o-m*D#IJbcafGhV39#V?&$3)|EZ(pgYnRPM2l{XeDgNbE%%^qsb?V0loUqmi zC{>Ddvs6^3t0p&==8OkT^l^nBU4J8dF2E;K4YjQFkj-+xogamss}4~P<2?ex;JR`V z&W9#L-^2>$X`$GEl@|KMSGaKT1uSeGAmYKgb(y#nLCUqusec=|AK1$NnnA@G zWBn)}O)4kfJiLdnfIC>ah6ndt35+;r8f8DiiE~eQ@JU8^Y=Z1SE8!X}Q($vER6||&T-0((H>8gOLb!)&vKb10(*HwXSl}yEuNLX(vp^JN$ zW7digj2krqO0*QFb3;?Bh5@XstK(O?EpJ>ipL2w@OkT1%nC&l&b%~g=;W!o-%*A5P z(fRB@n);R;J7EZ?m44~M6^O|aw$$<@m1fBH8O0G@h5874gA6LWp+6O@kLjEbsgKF}j!-p_;CH`(vi)R7h+1D_|MxUl0_T&HK0imnt-uJ6SSt>&2eZ8I#P z^*mHia9?KD~mfmMKR?Q+bT}z8dy!c71v!7RY+$gW#~2So-S{yo^ic9FdLiBn|wqnl7pf1~80b7h8LK4omDgO z_;EDqH)%*;V-fT}dhnlac`Up*g>y`wSw zhfy#rK-h>4e}I)6?xI!ub}-Xdp;@gmZ1mIUU$_pJ-F#7@awD{8ToL|HBT&C(1KGx> zNMc-UA74C*V;3Jlvr;3}u2>$Tz^mKp2X(e2XN-R8{=*&At53h4SN27Zmk?q`d7taKX4jpCf}g0jV_*h2cRZptWP(-@TX5ufV4sT!J=3BYG~kgZj0l2Ivy2@5 z$keVPg0IqT=d=%MH*O0P#VmZ&zAKz6>)`ah4YU?sL||MRnzZRmD}xfYu3Qe66Q}Vi zPJ~8H>(B}!f-kLZRT$f4MoULw^1kefbq9{1ZqMN;r}J?=f+#f>=MNpk&43itp@pTI zg&{o7IpfyzX!;ftT}R&B!@xAua(iVsg3Lv3PiBlwqYfEEBu9c{+LKJhFAmqOy${+dLT!n>Zq$?D3)895iiD4S#uH=h~Gxsc6#L8z8Z{fkidtz!ZqW2qh%C5%3$0ePvR2T6 zdDYseNUKABW+aZE*@xS7uWQ!27Bc7uxL2hNQHPNFJW?8Bx|H>ikj`}f9k zYU{Rd--F<61I(KKJ#h9z^<%sAUp^2!$$es$j$*-q&&+^IeDSSEp`0)F--+4(DNM7C{i`H($F-HM&Xy znue5j{9|n1brL2GTcN6nF05>8ql}>n-F+YNaO#YB6nY9UBS=}074$IF zX*Dh*jX~A6W6-&#DUPopQsK2bFmFB*QZ?!mDeFL+>TOiQgEt;SAhR81Gh z4(!5F*JHThAweH1AyR_xVAr9G(5l=KA}G$ z%Q%H{ly#i17bG@KF}P=4c(`oCuA?V$_10rl=epI{@f(i4da^dGSFZsr`j#>=rY6vB zDN&3DPBmqR2va*-yu7dn2QLPrPSe&fV%%O$TDmoPX!U=7f#aI)JPOrNua+8|7tFyH zB1n3^NI?@?>RQwKWnW1jE}K?hFXwCT@N~wa()!P-^U=A(*yM7OYuzwdXqPYu3mR3* zL)7`p2XO9I1nM?u!uB@6U3viA4NT%el~xA}T06g~hw!W5&DcDf|_>v@VIjVr%s+kaF!Wn%=r=aR^_3~L&%oR&QPyV6OC;MepJ2@s+sFS zlW|B#wylTj%_rQGG)K?63fM?@oOrz|XiisR4fV?0yEK83lnA3dte!l1fkt0jwC~&) z_Ybbc*#~K8MsEjgO-+{F2@VxBad_uexSl+Zm)VA>V`quvs7O?7OnK7f`0JLO036%r4Bs3RwBTfW z`P@l_#U|o)fCnyKxrTJpI&_O_iERHDj~k?j?zWD0So`{psCc2+VEAwGpuNl`LTE|pVxjt^h_4|)tNN<*oRe|jrw;)2< z3ay$}qz2gzdO=4qj|z*t2dH4CuRa;x;;tpH0uA76|n^10QiY4CvAx z4TN#+=!m*pTdP=`P$^Rp*^G(W$9T5q`E{}I=kH)fwB5AC7nnC|DNL$yJ+3St|FT9b z_RG-Lj>@Ow*x_;?mFu-bS(R+mYUKp?&5N;iuM2K@2BSv1Vdz@FB9E8KFjb3zJ6$HH ze&3UOFe;`Ze2{He7vETDB07xV6?D&U)2=hr4gUH2%m zbSh%XBzpGz29QdzA{Kr87(f9MQc|TK{G_HyW8>qcIXOA>Hu@W-ygVtjzfw_lhBV}* zxAfOJW2CdTo~072Sdx%=BR}WeYy4WAlPOJOy~H1UQ|#G~e3azB^M-=E#IpP{MM8<> zNt{>GeJrm?B&CM&lPN#<^X~g(Mt|B3`O-XD-9^%vuwdzxL%&Ezj$I>7W#HA9q?Zql zNWUBOy)@-BA7W6YG%X|RotC17L7JML`9ThOIih#2<*=R8OStcyn`Hk;ShtevAe)kTkrM>*=0UY7rVD9FHL%M!DQ*&jTfaQ-2L{xkA9L! zb90Ml_~DIyw~tD1-}93Oy|^nKJ!X{j;Pn?pH;Jge{d6x8OY=CNm6WK_eCIMbYu@?4 z@E=+!r5VNKA$dm#g?Dj&%oj;T?B}0KpL<_P`Q)*$e_qO?Y(K2e`}1Q;09qZwH~2t{sJ0zw-BHdr|{|eQDQF`;Un0Bbl~{q(&Ul`!$+SKOGBSulU{Z6kiL5PTsnK$Na>bi zp6{;D?>(E#wx*T+lj&n~rfhvIHWdnO{eE`Y+38YpNEW^0;Hdu6Nk^X){r~m@+yDKC zWnT*I|L$0jQntD8UwfNT(Wj4%|Dqdy^Mgd1lAJDd=c1IA_)0o+;&ADSd!a?wKK7x+ z_GcfZ2aoKLoU}xaNiXUAabu+$PI!MHx03Ru1zD*2+a%88z9aRs=CZdBz5OKQ7xU(g zG=cm5;%6HL;h&--QQ-%=9py7XQeTHIB#gEByQS19KLP<9hLTNV4DCl4-M7m1zgtoN z9p#axz?GUT|7?8>9y5fT7>rl=f|L;Lk2_wm=-9O-@m+U(zzUFky~NFe@|JG|rc(Y7JAydQk~$1g~8qKGJZ z6fYvv7|vvb)*bt!VJ(wCo^fdo1rm_Li&h6o`C6#Q_|wl%5`_3%!r@bo=+3PG+p6u* zvui!Zf_~hZ{`q;A-uYD|z+k<*H||2;&XMt_g7ehpCMlum%Ku z3p_(UH?0?KQsS~7=L<|WT0J}dNN4vKazLStNTP6yaW^b z<`~kSu9tto-du3oOQ7qb3IPrTH`K!Pk38(q8JYfqVq)vlN1`bS`|5umhSmJBBH;=W!k41NA=h4%|CY7`5G$CuP=0>pr{f}r8NEj zB%sX2zBGM32`DHrfc!W7n7`heOLP935>OPZ6)@1wkx6U1^iOs z&>}F{3y7B4xw$MGQN0N9tj4zfD&_n;G(=Gu1b2@2YDxFX9D>UT))7U@N0oF1%F2I( zHM6M9r5{QqP%42^3H&({_)8Bv354W3d(8txJ4J&IebB6`)%(-&@2X|WtGn2HDj5@| zcEkVekV&}4)MVn=>uFO1@pi$u=DZW3CM_|#LnRqJt^2vXxcDTA%+f>A)zRX2)$i~A z5CJ5Jx2^RexAC@|U{2Ql;kQJFOg=3rUXjRLOTg^W=C6e^Z5+McI0y*{MbiQ4tY6lJq|+M=IucU{t{EL zuRC5OX`@5aT17GuXGW3D`x>H?i3HA_q$atVnzZW%qr6ZYJ$?ys=?ZAtjr>72^0zd8b{2QA;JO(8h zAw(NHgtj9|q^l>7(vsxmkaH&=dK@1`2#qDy{P$l>4)KE9!)JteRU!nk0xCA_geG=I z2=+XKb8au8WBv{L(%)N$b&m_VhofiiLs8EXeZTFC@Y^SG<ff5~5eY2woAzjHFX#LCGwUhMj>N8Qd(n8{BvdmcAI%?5BHScH{UiTqI5g{o_O&et zfxivU;-wIgvAkl7?=Yl8Z6ahIfZK~Co_bOtwrz{KLtDV#{S?lU;ai0<1F3lq_<2Ep z#QWZX%h`KGJ(D0gRRt4fPKULg90~9b7xldi(xYAwsqiA=vPj_EwmX{CAYvHj$1Ki| zdYm7>N+J~SDVKxr@J&VY_TQpo6D#_zXW+!)gLp_>>y{n*qkZG@M9qtb>;8j;k0nev zW7u@-^ux5CjywXErcw!%N}yB%|1Jsq>GPV5v6eE*l5BuU@Bx(YCp%NXTqkD&HF|}-F-3V7d=Rks z)5!}XQZ<1ip?lxPmq=y2A}MJZ#2zPeIC*-CCowgBydnaBM2U&o#C&Ri z<+lr*8swG`Zd8cJ`sHU4n^0H_DHo6om{zQg>LicFoL|zH`TgcnN_RnGav)3Ryn;Ko> z@XHeWR7!FZGRU*SV$0e>xGu^h`!)GUgp?X_8`lG4WPC9xX~p{^vHTMgxdAVbBl8v) zl>I(VH!=|Hw@^X{VE1B}i5(0^Y#Ks{I5I^ux zpF%DplIRH#k3uY$>@(q6v)M<5F_@99h#G_zsO^8Q{d{M8j!Bv*U7cLV0GxP{y|_b{LG z*R*m(p3ff4BFBJvt;Xoxrw@8|X@r+g9w32yLtl~vSqLd3EtT9q@}4VyUQBK<@`Dw$ zt6XN;+`j{|J2>qJu>D3bY7zM3!0O33 zaQ`*xx9f^Ny}F}@jSku7eHf^&jA~9D(6@Ilw6re=@5hgkn5PKqYK_sSZ*M~QSBBri z=ZGVmvN=hJ`}FBcqS$7L@Oy+P5{iCl5|Jb_G3jl&1wU~iWszt%lN?k+N)7kItfBJ} zO>V3jRqdfd1%+T+d425yPTzbcyGQtyN2_9vU|x|W&UHDtCAS0TLD@RRc`rGc^P{Y> zIIr{Fh4K`5p`>KCuqWiYg+>O>os5)ctDug`)g56@Xx;OtqGZ<;)C@?V*n@KHi3X1Nt8l_2 zh^`_!7&T)a+ErKJrYQ}&3c6_8rfmUdj1M zYBfZJ=Q(u$=^*+wDEmPp_D~`L*zx_uL?>T`P}znZha&Cq z1JoQf5gn=+AS1>X>$e@l;F${$bAAW5AHRc4-dL@E56qs_`vWakW?~@LuXDxl`Ey|= zqDKAVSvWKrjO4q=aPQG0Xtlu2C zU5?ScY9R3?`5o5n#j9kJpp~tIpJ(>M{uL)k*!cs>t7qfvy0xf1ZVoh~Zez8}Gw7xI z;5xaECNA8M4waL!aoGtd7-!Iu@C3alEybu#RdHv5mNmkPNm_$aOV7C>E|9H2(57dg4+n?J zC{u6_kt*omn|8g>tzCJjlSJ0V<0;U~6uZ_ero|@|8f6>d$Db#_PAwHK>(?PpTL;(A zUq$sUW6@YW3iqEqL6m|etklWSu2maz#&m`Yxeh|KJ78H|d7M{zVla-mT*1?4A{-(& zmVs3bbZuIL*0AGPyYVzqxxsJJcRWV-X+f6fg2MieKY7`-c4?_W-`D~*YSo3go&q@% z++jcH2Xw4!fb+(=i1KpAWi2CQR~m)kooZw5SzY+PzKhrR2~Jh`QmGCM3=D);`GOKi z@$kY1Tn|u1l=m&9s8+zT)r(=Jn}Gu>R^p~_2(lH`F?hl>n518T^CfTcPgudpBoR-u z>SE{8ez?A44G!IV2@Qktm_C0t94tSyxZF8=1Ubgdp%r)l4^%r~xKkLe#@2;H-d$|i zd>UD_L^bR<8e<2Lx69iV`|gwJJnA{FxrJcxdS?u=jmO6IE8t6F*`Tl_^wrSf!S5j! zE!d5abdn$%)?>LR!RT{Wg?tgN99%_$)fW&+G|_(0PZ-uz9orU@v0kkOeyu4tTZ+tOLO#_9q z7_{`wQHei*DU6Jazp$-&Sn)W6mAj53CQXd0tp{M*h|ajXeGVSwl))SCyNJrEgwp z7xAbSc0_4XPy@VNI3ojO#7f0!Q*Zk&zDKTO5+ z>C-Uz$JumSdkGbTO8AL~kcoX8An1O$Ok4Q;#2Re6oQe4)75r&P3%q!yjTUvXaCpyo z*>>jPxvdCOtqt{vqgb}_KE^Frhq*rtM9iz8619!_`RVX`6)e}5Q)?d;7mn0iDKhDn zprWip%{w)8Tx7-EzPIc(4qePectg!~@sul9%ND=%!RN$h*YWE%cYHT@I}RP(hvDt( z;Q94qaP^X4E6Ky=4yYvCNWV_cz-^b)Fl;ao+ZOh~^`q1niW9JW;R0B;9D^ey=UO&n z0NH$V@roNC@-+y?A+nFZ1U)Mt&U{T4@RO)HU?xWOtVK(Qm~8PWxN!Lbv}$~dABT2A zMnWcDdXhx->MN|=xepy360y_u8m&1|xOx3DI!yQlBf3_?eYXe5qu;!eR2k|7O_5OT zOjqy{lY&}Vd^cqVvK}l)w|-M_hXi8Wx?mF-(j^Z4acKVnlF)9)O;2AuXWyvb$q^6k zK0$|e)#&z?i2WPqAb=!x>o;ygd%Zkvn9~p&<`3ud;pj7YF~&K?(Us;2S;w^zbm!~lZ@D(#!C~Ali=I?`x2UcOZ9R)?KIS?b-*5%!x+@LL5c2dqLfG+SULq$rcUQrpN^^1rsEjLc1g*mWl!{T zG{bqaU5^+s0QbWZAtpe8vF01>UAqFcc|faeu1U6cDU8k3ac<9gXx8b09(3hO&Ls7- zkZ83fErR^>7yOPVdEa#^d8RF0g@)XPKYS2_hi6ye)+<9SB-wD^*0ssvO@hwgCnWRh z0^>M8q?fA&?JRY;pFe_K_p`8K=U()yD#oURSK#ybBBo6FL00E!)23qnf=vjG&%o?;WqxC^9Q&qk4ytV*y$96$%Y&>-B>q1vK6?+!VhPvZe?Aba84_x=b z?ePn^u9=P>3fp?>G&o=OhO(*x^3nsbaQ7t)o-zt$$zon;I}ju;rz&wp?1rzXrLW|A-%rC-fKLBc4>lW-z)gxhaY9_KYjXC z%=mdD56J28K646jnzgZQ=S&3M3P4{9ECp6(JJ{J(g1xOZ%#Ae}5v>XxT`g+xbfB)GLM^cr53UEG z->|``Vy?wNR243IK>a=gAq~EU$6*0*zMG8UBf2Bx?l~9_7)93}6TVjk>fA7vl!SFc zN0~v)f)b2qFwzWVXlNUu42#a`)1iIV>UO#|IKdeH& z8u@(aM&;P7EgUP=fMd=6j4838J5~gIg39CDK0{%otp#;0b+SnFfXTX!{*e}kDwcE| zv?RlFE?qp*QET}3=+(Fi%Gy>Ue0C55y&_;oewDIxv$1pR0V|aR1jJ^-$h<11ESQXH z4o;Z2WG1w^!3v^l-|4;cFl*H@p3iNdtriV6s=i$}&ccohURXYREo{v#*&oZI->9iL zdeRvV3hub*=7ab*uMzjc9Wy3RrS&HlMul+!ET;Yf55xdk0V`Lug)WcJJfk8vfo%6jgD`6PNRaTER-p(iSbGLz*POx8)orkM z@j?V=$hUt&ptdsQ@>@MkMKOwom77ZDFL-iv6z8bqDvCAIGquMsV(!~D zY|cZ-F!XFvop}DL=r(W)@?Kp=zkWmEdesjkRg`y(V!stQrcKLMNUl%DbulT{dNqn&cePOZnUr|;mqDGc#>5CgQ$E-V(gF-;n950Zib6bK8AeP z6`ARRTk3B~saSzZ{K&R3Fh=KTKcS+v70Os^vmXcGssBr~{(dCNn`v`SA#A%)Jp*er zY}*QD%iCep(2i_Z@Bk2nxMW`}ojDmt+(UV2WIxa{Mn%?HnBOW@stB8kGRF z$Y?PTRmzbA=C&d#GZsbFqBd%ipdVxe?s4( zlW->>hJBRnFSBe?@l$ZOfY76@Eydc!JE7Ke4i?jDp_G|`nD7uhzPcY%eqP04u0^m6 zHCbB=^%mN?BCQUldin%9NXPC~3!&*a22HJ~SjrPzn*W+4$%;a}rad}0D@O~rB|0>+ z=KsR3#scwM2W81<1`8DV@?FlP0f+lE?MV<8*+F$7V6)IRjH7_0d&AMUam`=1} z*+bVL0&zU}DG_8uMVZgg)LAhdEs31VZScv+B=0T{ijp{r4lHWz`slaZ)e3n zv0^e~xFi!7uG~QRvbIpp&qIY~V{!1<8T4?_z%N@*BZKiHnLNm->6XE_<7s(N^y3Cx z6WWz)V(k2t*uCcyxgzjS%`emQdCqS5)fm9xEZ~7bU!ZNN+Fq{3>`yN4pWFqP*Qwl)3KF74imp3CQq$DsW?qSL07T|d;ZB-KSwj=Lx+>5ztAKKL z9kFW1F1Q{$jFH_NLy_&OD3Lp$W$|+kwSz+Ga~MP89~e*FJ-70VeUZl%i1Cba^b8R! zID9YVlf^h66)h9=9`hZ_Y6dcZ7|_(NhR#FgVCT-=w7zXXJ!?J2;$%_tD4^?^Lc$ma zvRw0rn-0c%ybidHjSu~iBPH?@^VK97r!+Sf$Im@L)uuKwjjn>Gyo>@06B*!PVrz~F z?;A4fN^BT?_VYAhWyD}%Zq)U)g?3kj9ygq-ba%35`6e&ih<%4#uyw(YXx`cq31VyP z*tG{|FP+7eWo^bSq!Zamm2P6je7_R%xyjZssf@ai(gVJ=vSA{o`+G5GSFht0^N^6v1}(=DCBj@ zOL~RKFlBUT+yL!IjAO||5S1+0b66d=M?QfEerscxo281zgC}6zm@#NjwSw$9V{02! zXw?Io*#^gs@4=*@4QT=7rkbb*vM?Mf0<`tCn13GIHXRZrb8ei4n5Tk`GGhvOoR%RX z$};3H5mBF#{Q{A~qKVi)@^ZLI)3Bm!oUvwn3+$S;6M@kmZnP!&*$AgKbjx@~GFu4hfNwXgFvZ zbl+UW(^M@~H4`?AB_$F3y{_ZF|Lc;zEV?Epij@+TB*KWwXMg1ghbTb>sWESm^5!WH z9&tsE0{a-P3xYL5BGshrmx1AI9BmCFCkIms!6%WtIbkwlcM=r;@wy~b9d}`W; z&>&)&;5wR;nu-87R~&pC1#M+1YeC!6|Qswhl zQALY=5a(yYtZr}YKXDpET4`eQ#&xo}NtlepJcNlk&k0G&P5RMaC*w)F4Oacoh4Tij z$BG&-s8khQ=|Z}5=YAYM^egIGt0OG%8T|bV+xj`)WGKSKL={0fbdl^|180wW!Kh|= zlziMRR=D5wQH-Fcw{XWNST>K9l!cwzh5Y0q9{*I##cRF6&Jpy;%$YNY1YzNt_ zD7>{Wm2|D}yVAd<5-62GsRaI=68OMF`j1vqT~i6?4{yfHd#+H{alo?aZJ@|lnpN|D zL1ex@1FLhR-EGa718nO+3|Ka^Ga@qn6e^3P#E4Sum|0Nf) zR%q3wE4CkaiLSjG$@E|i2MveIu$dS%>>6w<*uyj{PPTCCi|I18K|F!8$~sBTvd^;+2=U+~t@F+=BuDOf&dC^Qr;F>(GJG^k?ELxKu6E*?iM|8$J# z)0P_?P^)SR--EwkeC#mH8{HT5tU*TjP0U<+1gq>Cp}DmhOulK22|b@<_T&*T*Jd0- z^0yN59a0x76b6a7}AMDA)m5)B?N#Nhse zppvJ7-lM0ZvVjKFdDs$?2Hl19dFT?hH|3f%MEI1Y_^$s6RA?~>KacDT9ZGY<%2kk7 zpN@KqT0ts`$BC`K;<7J!ku#HEU9Uf?*;K*A$zAaC@&&kmN{v7e)fj(J6WR>OSLV)N zOC~SHOr`@EWa#V`K#p&aN7VtI=u@XJkODe0xl<=K$sE!*O-SA`JZQ zFeKRqm@s!X46<)y>Dr?RiHJtbgaO=yFF=Prz46mLx@F#@HIxU9Tn0I77#ZNn@g3;@ z@FdiA%3;Cs9#i3P z7{@Xt?iD7_TLK%3LFgk?pcf@|y4x zvGS*$a6hsdCmzK?OPYd)eQ9YkeYYP9IjI_0Va&qq!pFC%SQ*}41YTV{h%ILbK){1X zy1G4nS=t!YG_5c+zzu|uY4IjB3P&6)^L%bGB?u8RD$ z1gL0JUYy7D_#P<_=qkEuXw>mLggu*&Q3D4uPD70LBWGYxn_k%3u-7~9kf!^=%&sfy zR*@l&;pF@Mz9%a4iXj54ZrV=0W1V4`+kFh6iVRXw%@06qPA4zUBwoIK% zH(*`l^6*-#`5?Bukkom&dVtB3pJMQs*%;U?6RyYaBCA3&rjPoTR*>pgzLajW<3@1K zn+~@bNps+Fb_IUD`3>Xt7Q<9tnWEc;4~p7V@Wb%_ zSp36KoG>9bmQ_cLZBrc=F2&%)vWa-4l?~grqtK~wIcVhf!N^uGFq3nxrj9Ba_8N;( zbThST+5{m}mf*Wb$564&5Y(4EgkNrD?AbF3PY%z;@|nA^WzP(3+1%lscS~s1RpT5d zFR}vXXag=g)#x^P3=78%f=%^msA5IybwSOwv?X}_a4E)5kHyL*eWAs(xR$mUo*s)a zamEO&SkfC@u4PFey)7o0civn2PpJe-B~U7Xf4T$|5>ir&uL<({aIw!9apR<;!wI$6 z&ge60d(&kR&V`v_?wCHD;PoLxZ>1_KDuPqXvk|rp!%!;oc@YgQ!V4)Fc|wnm`MZGV89u z{L&I=t4~()V3ui#?uO=4nspdZun?*;YlbX zlRos^uxn`u`EkLe)hUbCmOMo@=n#cWsEULZhvcMm=olMv16jE2NC{`1Kr50MIywe) zKVe%iPAKk80uPu zQuz*JZu)6mpo@?KweTX!RgLi-g-Or==g}gi`aTB>5x3sNCsLEI217jq){oW+J}V$! z36?a$f}_GkQ%Jelsf>-tf|i~k>nPM)&?3`1Myr#qwx9tg!X7O%Z{q0ENZD9gmMPdQ zvfLR&pi9e!rlubBxH%Mj?G-5`0U%F>zCd~0B&xC>B(p4v!aZEEbLld&Zpt8_?l6q* zRv)^0JoHfr0^*g3RxLGJT7-Iu=oTlqGlF$Vh>wSq!Tl!sf@O;ucUp}U*f-woT5N-a zc!ESo={7>km!_bd&&TVi7+RZ@U}nlqBhd)5d0>xCNTO`CP|l(Z`==lUD%*225SNt7 z1E?0=*z{P29QFsnN}?j;`%uy3#+Vk9^rQsjDNwEk3>s${RoDlz*+&EvJ{`(Xy#Pa9 zOt(-mt&7Fs&4s!|N4}O>4$79XpgWla8I0u;+C%7<0)m&Ojvhow+o4+F2duI+$>smBcWwnhVG?uE2c1xq9P(Vu1$!lXMm9Bo_G-! zN2@~|R$|P6}C3GQD5#&S*D^>1PBq-1w zFpj_xIxwaSqk!-VzmaWG7VmzLAd4t#=@~?EccR5#g!ZO+@D_!{6-$UTf9Es-K4<+{YaO(X5ZpEx3dkWACQv$O?M`pMY3`r4S5Z z8x>c_Rzfo;5MDm7_^uSJTYUuc_8mY&YsQgMroNX~VBskVHm#XWG`SDUQFtX?K*Y=u zGxp1r{Z@iC-*&^Bz6&v{Wd+VXxF@^J^z9H8T z_6uby4hj~)OhF#nCCGwG2@(5{prDeCG0qLDT)zl?ig?a3n)=3|BLwGIC4SEtm+Mhx zW+pAjv^eWBzEGGCC3&*-NX%=x>bdZI_yCD?dyTwv3O7`n;m|_iz+IY3B~U7XQVIMs zB_McCB=BsZqAvHOD6GYwe%J|ocpiZ{W$DxWP2oHKZ-0HSo`CBuPj31cH#B?_oGP0B z-`-vNqQ6=KQk-|$2Mvd|Xyst>R~P1Q`F^n|1?P^PM;rs4b440NXKI6%%}Qk@G}hBw zm+`>&6-`Mh(AKd)=iVKmFC5bHQ*q<+X&6-Ph;J&$`HTLRjr%7T>P?^*u6U)PN1v9^ z`J3&2#k2(9J$V#xjDW{cG8?UT)KE3A+c1x@PJglL3^~TQC_Af`zkLi&9qbkr4lHWz*m;Q|Lw3N zrFK^c_I<}a;44?IF#CLJaFb|pQPVY|w*POoLKhaY^zT=bfDi{Gr3+(`VeG5DsWjvN zj06N1KU$vtYf0d3`Ol3b9-NBI{9oAM0)LVK4DcW9Dqkq6(%VZVP%42^34A>XeC)7O zlCQ)cDgd%TO}~WzD_iJ<^@lS09S4eGDzd;dv+{}(F#AKktF z=MFkTUoP}#{vG{Vk?US*DwRN~1WF}PDuKVJ1WIS0ewkX76ALf9iNRlWp?r_95{Lf)(+K) z@b;+}zV|)hUN124HcQKvoH%lrVyO(kfI;}OAoBO_|BC-+Gf4Z1rw{bYmm|N*SA5Y| z$T~eSoPO;W;rZB~AP8k(QKkgTA%lM1&+f(fyHBBJQUPWKd^(u~WbnFA5>rAZ2L*;f z!_XMIgpLircN(YfB%%f(bU!AJH$=lavi~^3lX75XXZ=CYurwzUH*R~t#LAWd&L8F? zN{_;YbLZh55Q#EYHqewqg?$AH{r)WTGGgI&^#X2tK1D831kH^JT=IT)d71FIb_}O) z`asFh3S|xCeK|WN8c!a1z&9WmAt519HMD>pfg+M3pW*PCd$6lfg&-X7XD0tYgZH?& z9*1`*k?pJn*}QvWUUn>Q-S(zztz_`*ALNps0=M(0amOnN>ZUd@{uo5t2M_-73uz&D zuygNz-1qW>#{)0u+7RjObKWmb!=-b_aq-qO=$n<70Ve#>(&Qw(z}|z$;TxJssAclb z2#5n;lIS9slf(I_2x06?9{#d>^HXAQ+Qpe1Z$K@^I%=%vTdGAIXALjjQE|D7c8yK@nTF9>s4B^Z7T0i=Xt<%x1+loSG& zn2?gg2=VTG8d=I_uqylM*r}A*0PG^{`5mvvP%(3Wg}xk|ql8!ep-bsePvLs-1mYA8 zQK78iXZ5|zq!1k6a~My8-=KUIJFfqq=o255u&}Mk3HZg&evsLhUEsLR6~+vCfg$TzG+pr5ZZR{o623QE8%!uu=9xX0e+_~{mSdvEEdFOYyV zFAcZvI^%ib?;p@gDjF~=Yf^+#_64t(p+V{Em=X=|t*4?mISwaRZ$Zo#W%S2y&Uzh) zJBN>g@x=eAB+XC8#<_&S4$qKH2q}qj&Z7@1!6w#H)57aZuJH6FzHvbc@;HaZYj-0c z>@|XeLy$s5Dj}(98p1?dm$7XhPl`n9Q&Y*nk==(2xJ%xP&v*7F&0!!<%1Qz&`NmYW&E7#&lYEfliWI;4ZaRk=PABP*yc@q4; zCJ~&s{fZ?AZ$jUk6bYnQ_>$zgbu(@R$ocPt=QKz_Yi20Hp*26i`Krfn&aYBY7MzzX zM}&F>)T(a7jrW(x@$*X=`S=FDpR@|$Vr`fk=zVtIQy}TG28q>9?RQ2@dWjR!Ckml} zTWi+hAt@^U-$|Mg1earL@hbUkKLeF5dsa-wjx!!GC0ePjMzQaHM*$Uy2&<`{1sAT5 zg?Pg1L>w(cIQSD=W?ysDv04HwU`;3C5V#AVUNKh;ThsqUYWZ0ka&==j3 z=yw^jf7yj(qP?aOO)^V>w`F?awj8_Mqd%FKpd{DV750>$nx#IO)n9VM+nw;A_Ihe+ z?z&+6;qyonsiGb^2gdiV376A1NIaN|duLpbX4MPhnj6DAQU}9Ew3KQ4uOC>8v?{&P zv#tg9|2!W4dR?%5MyHRKDk=O4wvf=#Csd49eTQH~-{ugKTb5X&*111cz#f^tS$PIfzYe4{pPG5rV^);||(HbObT3|$5xg{b$I~iV&?&6Mz z8B`V>Eu7^H~f2aBmz=ms0Vo+wjnqn7xlZ3!=O6agzQbj+1)E}`I0Ysj-QPI zE$xvO{Q_&337bU?^cz15U7f5x)a>)kxhau2x@{M3KMRJsu?@zPkHg#bGOBdwg1VKA z;pwsiiVgasPI*OKIkXW6&OCypQ%}s8M6z0iB)Dw82<>uW96fRt6&epgD~m9MYBj@< z4z-EEl!0UW55m0B05q|GR~snFOF>XbBsz`gg5Hj0iu$4`BNBVouE)KAH_)}HiV5Q< zp?3Rkk@M6W!3uAu*j)0SIJEABNuviAJ^Re!xoA0RA-ZTk zfk$R_>{~G&1`53}wfh8Idinx6w;rMmIfJb96>xLkPL%077L~Q*ad`7;oV)i5wY!YP zJ`&&ffd{XUp#k zlV(hWhnWYyA83rUohxMNxhpD24e`actp^Yq8H#ju3o?>GG;xmB{c@II!4fpkmL{H%;8Vd>u;W-e^)?7sq!k$B7#+Vdc>Y zb7%C2zBmylulu1iFCC{3or6=CA5m8;0{XSOqg^daNDE?#!*m^eNB4!D!N*BfMAViV znl(ntrj0AQjYxu??)rH@qSK4e;D?Er@O@)Qi_&m>-#VQ0W!<_q`0mHqXw|MO)R`ta zAiXN7@@;hl>`ldit?O`=W)O8l8%$fW94=IpKD%}hoA#fFSi1(M&YA=-8wX-B4Z`DF zr+E$4m$D*7BG-wfTaO}3Vu}${CZU<9C5ky`cCB5Cy8(&NcWQu{(?+2n>^=p~d$6x% z01I{bo zzITex`Zwe-9e&LQgE3)nJ#1O98fBgXFn>aux9dw$Y8W;XWcoqa8(26urvT9pH+P?b zib)~Pow@*CWJ zneS*?L7Sj^zu>%Y7{XHx(A=gFeknE>*QYj)ZrcWtS6{R#7hbYsU*p!Dhe*qd#)WH< z#8jJu9?hL_YW*7A&v3_)&7+}LzAu#Jr{LJ$tvGQv1Zp~tn7e!yVt>1ceAOcO-8zFb zi}qMNxi>OsEx!5aHk_(Ah160N)v7mysY??K{`7S-%Obg7nKlf*l`u#4W9@} z=o##~T!@W3mZJulR9PWZ!@aY6u`fi;O`lO{=52?O<5$AoZYRDd$BlaLNk|It^6?!6MyH{DcLz8a zo5R&Y6ERO|t&P(}+=J726fVJ-6>HH-FA{6lZh>D!4!-C%62rPU;qb3l5&rZU%xY9e z%F73E?KTwyTe-d0gz!b26OC;?tKr>qHOBnlA^Tm*`@4H~2lk%5k6bdgW2VeT3lC$Y zhTp=nWjpakVu%sb=5a5wLDzvJ@Z@0xx891m1>_`!VZ(AC1g5FuhY{1zwV4w{gf}?5 zeO;j&6AoStVL@>4j|sku|kM7~&Jzq$T?;*oNA2n-M$EzC$a5>rvYdAKobt^G6l{!?KABUe;{fxHb=E8~V zO@6#THk^;g_@SK;%{SR+W2h{Eq10qSQiTnIa96z<-*i<0qh5?FX!w{slHH-i$)iY8XNY z7g>>J;3&`2Fe}9AQx{R~%dwcw@gXWn!^vG+arRy~G%Xx4bm#=s_cV}SQ|VP&R)EVV z_v65Y2h_z`W8kP!XlNtBwF{T17%#-ZU$3Lnuvr-OeWNP*^-5KJ*2k(x-Dh1|^-0OW zSFv>6UbN^j5yP9;z>UW*QA+ce|Fx}HfBZha9?~6oi77CoM(N7=eRv#0WSrbk?7sXQ zww4^>9JzX$#;~(^H^Dz@iHP${=Bz-mM?Y*@I}QPd7U9sNG@3Hgv1j8;NFhEiS~_Vly>b!M|k2z+)OdBtfsuzU%EOFS{Tw*wAsyalO>9)9TgHPo{nQ}ZaNqa-&D zH*Q`-3|-2uoIHf{SFR(UI1Fdk&&BmjTWs031VQIk;Og`2D*KZjaTAMXuR{C&)3J5k zd^GehN63SNm^b@8zTu?n(9jXVuOf-N5rY++=+(X%j;&i(pjBO>i&I1OJoo|bM%&`2 zUJY^P!ewOSq+;8Oh0tg=5^E-O#?Don5S3Ad28+VTp4l^TEmRZJ7cYP$Ef6uu$#@xj z8%a6xz9#rSL<-I3fv47E!?P!Lu9rMPf-Beq^mL*G6f@alOu!S~E? zdMlC5^SOCMKf=ZH!LYM_U(gYVpsY#3YJ3Nxz7NH$HG2`4P3^U`06#CAiDzonF?Z2O zXeT^DSahL`W`)E~5i${06iou*2GLDx6_MpvZuuE8sfBQ@+Y()>7vfGxOvPz3fq31K zC@kEt0d+M3vGM4AE<=RRAVx-6C38nfRxqYdT?2{pmt?Z~Q;VretdbIJ+d^Tl$zbf> zxd|PZcDsPCZ-z#eP?7PpW^l8jWrSE${z12pMVu+2#5}l%Om3n#b}Yc@7=3Knxf<~| z*J1C~WCFzIVBgl2xSQ#OA3D`U(DPW>Ra3(+8}=fP9eeF}1<|p2bbI+&&`AxyM^pR( z96WfC?_9`^KR||X(T7FV3|;yT#RVCgERBWt`#_THxH8+E`VlHI6`BR zWLM^Mj#VzoM5~Xub&yQeCM;id5J~xBSXOU?@7mUb@7;%QwR%~hCoyZ)IrLt#1KsS> zuxQnB*>6%}7!`}(J+0!*V9X)7tdd)2%wF^pbOoR!((mZ}ttfUIieGlF!#CVGON#TM zN&sOQ1P@mnYr1b0<#RmVe2f>FLLViF35iBrOc6rw?8JWGGA!P_0oHj}u>V2;MCuY; z**OmKC?%_kiMr`k=HS2`3dw}uoXS)reN9f-H_XIX!WGqO2x1*N(;uk zx$Dt-&|*yNYKg5YS0j@+WBXUkLx4sztl7E^#vnzj2{v!tgc04F@V8>zzOWlRt|p=Xn2AWd zc?iLg!MJ_9VCL(079axBBPLpQ6*Z?cWJHY%TcqZfxA|i_x=IVhzuC zG}A>EEptoO?0`wLVQ6n(hHDf8gCCv4llT+_J-mz~M~>rl(mSiKG3Rg%4=ucS9a(k% z>0*B8!Cge9q~OAleN@C=lUdIT;;E#Yy#UpkcSC*COhgm=Z2RmP$hP=~e8zMHT-btL zC!WzVdWrX-hV%P>Mj_MGr-TK{`0WoHOG$i<2n`4P@V#8n5q>XD3dioHr_pxAYV2Au z4W1SnD9Mh5&w{0>-fJqR_p6C@Yqld%_82&~7*0@8q{S)NzG6PmU>Md-`WAcEY(Xq7 z;tx)(;+mO>`71VJ;p9FrQRlI1XYn#Q9Z#>HA)xPRD#C>I_2ZK2dlWydyNC{Be6WFY zw4R*_e2=cdf!nEAzJ3!Ls0L%U&k^Eyy}*O3k+OBCxF{2kpFAV3828pAn{d##2t$Sq zM9}%Yh^4#e`Rk7n8JC5drw`-!m3v6eFGU#7Z_&KZCj}j$XR4Y;w5kW<%;hJtj@~?X z8YLo4Bm|tq%I(MT?N9<;*S177`6_`b(h_3H32V;>Mc1w+ns;b~7h$0v{8Ijv{Nt*h zW+Sq!A?C~-i$sD>7jWCYMWOaZX*2BHy&WUJ`dC<~s4V#W7A!m(fzgXLV)>j2aHjiX zcI-o}n!f>VZF-@NT@Lo|4MOyzYw&*-j>w<@96ERuzRw~ms(9~RQk)Cl^Vf)Bn21Y9 z_v1L%wfr(A#D`pj&$dHo+Pg0_s2qz54aDk2%i;aq1S}oj4ZD37;_g!lE60vOrJ4>7 z?>$HiLm(*i-CU^LkVA`a$sZJA=$GAa@OmJ32`NG;tlxZ*jX3`s6fTaF9~btCGP-H+ z#OhNK=-Iz3=@SgGrWtzm>HtZqFJ5PsE6YSBxOQqg_RuAN(8w`}y0i~*+^5fPo`(ak zL{ySZflclUynI#Fnj*oyBP+1r!xR|$l zdF6ZgGoSx*%T93M1K76u5#P70kJMWcFnE>43Bt`;+Jt8RQE2V032WzUIMEfLPyL-Z zc>FR{oZ?_xqZ4Xd^GUIEowMY3??sXogwzsyEd06!%uRs)ooZp{*_DlAE5Cjgg)>7cpd%%Ptq;0V?R3niUe>3D+j0dwXAB0jYQxoLu{*2j#0eDo`bJ-+30^^{#{!PldwPQiWB z60~dLhDX`YxFCv<7#D&BNe#^YstE+;0dX9W6PgGIcWU?+_JVoNZS1*11|l?!+KeXz z_S}aU-8|$bt0G6X)4%TvDlK@8C$SnBwPGS%oz!TN(gU$f=?knz_ddB6SXpqG(<8K*fP2!$|zKt)6bn)wD@v(H!R(? z6e9yY(Qo`znCq2sEz^3thKPjCR!XpA2Gt3`s}zx`r6Ra0H;l;OJIGDU$NKq;5FMF@ zCiQY5E!2Q=^)8q;aT;ptrola%LYj`44BL2IebN+hcS6zji=XIA{q`3A#RnyH@7oKD zSO1LRPi~;^h;eY>0J!L%i2?K1pt`dG0-2#Qf?%c`fhjLlRg7^(z@ zdHK+%hOlG98<;wF7-}`^f{7y?kwif`H8&AQR?kA_n^-8(RZtkE@@}%mayn+wTKh09 z7dW&WWodE9)o>+{aT>xy^U;4}Z_q23|HA44Ok1-Mv4d`6;i_IRmT4Mghd+3sH^8Gf zd_8C>8oE0{Y+;N94P#mr+mhM1f;UYxapAchrf+P9$7ff;y;VQ_(AW!ar0!fFby1X) zM5~jf95boBW@&K(p5{1V?c^S?;0;(9vr|ZhvauHy`piOIlM?um;Yl@YPAjV;Oc$&~ zw>29;{`|cnQr3r=NC4A)@9^(@A#ky_6WR=%fPy1S(Rt1|?4Nm$0LglAW?ZI@$REV0 zmX(rxTIo6u#HiWd!zk?v^l$qkBbA`p`Fb!S5c0c{gF6wb=rwT|T&%dN3;!(nT=#yO zKMI|jxuEQV4qj#%V%CJ^(2N)a_hlPUn`{32MFSRe4HAG~Kev>MHQ?QA2&^Cfj5Zy< zhcqx62`{LG(ini{KeR(hY%r|Zj+oP;{m}V1{B>*WPwj-~E52eA1;|RvgTAYIrRF4L zP~*|4*HG@6Hasr;12>CA=rMW<27K8F;f2q!A-)(BI2R=WF(~da2OYiS<4Jb1>_r4~ z6@n!bT(HWbYKqYlW(QcV(G9B5R$wO z|JIwHBj=&#&=ccZ7Gb|`4RmN_0bl@#;q!kTUm4OzbI+roA2m}u;&Uo*3!kL+X)!3wkZNn zEG2hMPk`IVZQQjc~N%}V&=~MwkO9)1}wC- zAPoD)gZkp4&qn+>{60NbM!?RVBjdw|%8CN7Jfc#3A-tW0ks}{H0YPPGH)#>NcWwxO zwJX1S!4C>arau?qFtW3A|-U}AvLF_fmU)vWZdcw~IjAyjLm@(tf zv9%-j-^M6OeU3PBHB9bQm$MrbTn@s|pNiUg#1{OrBi=;U!0=vaSoX4lw|K7^j%O3h zShg0OuN}kmHB%9pxeRl<4dS{Mit}1iFtbI)KuLxQEjY`T%|Jto5?EU0KvSdvZ5MaO z|8fsTjR_J-lp1@U^m|0P}u7WZwvI?R(W9 zUB>J|BR3NySy>^D6^jds;NaZ>gXWVCREW3A=iXYy<$vZ-#d!HM*H(FrM508iYY7*c z0-X8nGE$4x=u$$|Y^gQOh_((6XgB&Alii|w&`9K6TZB13Q|fQs>a8n4a!d$)@w2L| zUpOdIH-?y|`{;CTsx1Ct(RBCXLm-o;DYAzi2dD2=g`g$xS2_5^Y^QhYV&e zrA;Ybo;`!JzoiikTm@R9eE3(2*ARlfq(lVQ&}2Q-8kW&Qp`=2jc`X;T=rjsGtJdPo z$)o7b%}6L^WD{9*-H3&t*T|>f7l}U>5+ph;HC8l>2uxjll{Ceb9bZ#o&d`b(_ z5EvLiO{2U&+FBaOeEk9m<+7QC3khTQ3H(mxuQ-_&tRpB;(xKnAE~J?eh#*j%P|7$V zii)Ms)f52V z@*J<|nkOm`_)PLUhqKqhp`jFSOSZQG$ki-rtjm$TTyCMczsi)<5aV|mzr>_*%&5V{L=~OB z8-|r@=mtT}&ZutAM820mTgQ;hJLi#sDFp}<3PdELt)Jj3Xe;bD?}8YQX-){R9&=h-3IO3d&`m&2&ai@xuERvmS%c-hR|=+7PA&D z!}dMnl8D%XK*jZZ8Qe=Y>?LFygM5}b9I$E@J6mI473de#A!5|N@k5jwZVEy#5 zNXip)btMrvR8OFhSC*DRw!ig@$(_(qo6nvnFX>Ht4b{`#6>8~Oh73gYC(1awmkBuB}ECQ zUhUv%6ojAVu7i_zbGVyQLoWEBQ$m##XX4P$7m;3CzBb94rme5}oaiy^=DM&;bl@03UyJ%r% zA_Dxl7L}hXzvBH@sW72waxLXPWU4MkkytpHBT-lrxPYjZFZSXRDNIN=8C6TU=4TYj z08n*wvJg+<^j%Sh5tUYczOTv;2{?CR{;4y-nUWj}cOT@-lxkuMw)u!pk$13E)^_=2 zjHyT|oe2ucv|+~NAjRBo3NvCkZAxYP(v^#c zaXwoKf*vX2&P5cJI>N~;jBy+OJfcNKm;v5o##L0ucM%LZIfI_OlnK(p4-zKTDWzMv zv7VeTrTm^(B;Q-|ataZflqb7hT=`z8&PbuYtcYz5^U6)FkDur<@*T2n?^S6%dV=?a^kK_2Mc@4~v@ zdISZ(1DoNf>W9_4kD`b|v$LxmUE1bi{nkVHb>}qL8Vd7Qps*Bb0+CsimAPj+d7}Hc z=~%s^?A&ySRE3fEaVg?t&QIff=Xmv}H6nmQuap`KU9VQOAfLvpVfDH8 zO~!-xss(=?b3KGVd;IpfmvQV#sNm8vGmOsqGGw3g^Rw|Ly&~3ESZ6-&kL(E7 z!qT#0mH7E%Q zNIubqSQewBiJEQuV`)zp_@4Bajj;U8Y-Gp3k#$4LIUy7!RU!V3`-GA%JZo6l~LMk_f#1vv-E#(fB6@D4V&jr#QUKqt33mSv@(E4HRPY(1D2X7=Q!xg|3QBB7H9m98?#} z=a0uJLn%_#>tJaQYD2OUAy$2VfY$8X0o!IS#Xx^gXiy4QVIZQgH>HO?#*mKFFzez4 zbgpTMM!kDs{}3Mx2=Rah1q3yv7@88@Xga)$5u-=rO?)l}Pg;!HHFZ(j^cVE&L(M)J z8h!e~rY0$&!>|cBGkPTky*$j=BsB~fKR`A>g3C@~jnWm9zS*B29JZpO4%XX*QD zfDtr(tkT8c}#?ah88v_P}Q5#9i zhPE#EO^QFl=0X}Paga&MH03m-mQIP9)m77fMADd97|_(7yuLZKtu-;R?@(q>vcuqU zvoL64Z_Hab7gHX(adFVVkK^Z~CijTwd*?A|*dFY9as{=>NI2B$f^R$?(r33XEVv2R z`?@b$_U(ZyQ^w=Rdo>^~)Py>Nd5vtlV!+onSTw31EG=|k;N1g5YYT!XC%W*^rOf_8 z=3dL87W(#Ri)HJk;l7z3igg=c(ewc@=7@as%Ov>RGs5ws+vzUk3~!HIES=tmu4c@f zCE`76n4)=2b?jO&0$1!TVM#ibl~Q>AaTuOYUx+EwpYT~1phchg_@SY|M{tq~jh8be zLN{z`wnwYxzuce2;Q4Hx5 z4r?=JPti7qx-=add{)v*$Tmt7U{&J_IMkp!m-l(blFr}|<24sX#&c*oG(#P?+9;@FgDp$@ zc?%k9 z%7}h^0V5}BVAg^$aQSKkIt0$ZlxZ`loh^f9y?&TJpa}(LZAcSdVeynP=re96zIXcu z=E~#Hr(ZY>wInd36--GfAA6@yLy%MlBF4a&GM>uB)EUD%*T<3}eQ?-a11To-X>a33 z*8ykDnLQK%HO!H3R2^bI^yaj<{yKRHCQrT%r2{eNhMPLodJ$C({vYo2$*`q(*lE7#!PV92#hlZqx0eZf1{Q^L-z z`>}rRU>TDn(y+z&{$FF^%>KCM!8jpZ15BAemdp=@1U?vnSx_b8CRjm5hL+5*sEl#F zhoPFYBVCdwqn3rRJ{Mrm=AAHa+8dVT0!r|W!x%7XKQ=LDp`~NhjFt)+6BT9FEv!it zuA#>ExG$1rLw4o~3?31UsnaIGUX9O85P$?Skl7cL;T4ks`L?YC*6-hjc8ylST-Gk* zT88mi&Rv2bPftRFv2ddp2dTt;p~3}9i5#qklCae)!@9mJR*V^ltJJ18>pLAk)HM@Y zz{Asfk!Ic)b#3JNqs!Rov_Mm_MJ7lnB0d*Qei!KC(yl4iteQjjWqnlZI1=N#)RLVO z`{X42a?P>S+g0}cQ!fIuTQTy5b3~+58I>My3&+l=9$m3y{BT_5nx9bQjv2GsVE2X? zDhve0Bb5piu2tBl%Jo!SZ(>^$)h%~p_lbL$-@BRYaDLiL_)J-cLdK}2B&(tJchz9& z;Dz2_J7VjcpKy%+vHD&eFl7kc5lIi_yeLc=N>|@W6Vb5|t;@aIV;Nob9}0V>jyGKf zhoEz}A-Fqs4hDx_VhnCRdQD$}=FTQ?{GtwKO&)=}E(WOAV+#5=wX5jb+xHqhMxagf ze9qmWa9|cun?^rk^za`MGQ|fY##3PsnuKm+sEDjv0G)Z0(67Hgv?$mbay$u7L>QxT zig5%B<3U*Swe8`+-&Tz7!&q5QjG$X+vo`H9$%o^%%{q8eNaU4B&!9!Dd?6Ix)phil zt<)TSzjeicMQ5>KRv+1x-HcX?=}V?!_#-Fi6bgcWI;cOTl7Y&l_-7bHOX>I-lgUTf zuwHHvK^Jkt_YJ15s44sY;frzY7O1aw2qSt8gbn!zJy90YsnmG3*9VtgXR{BbP_u3f zYnj0L;niH%M@+=cx%1I?=zXraT4?z71T`P(q?$r*Tg zH)4$GkoS0jx3vqrn;J(o=~q#tRF0P^$?Fu38QRrF|Bhx@KB6D3Y*ZLqevPjfBYi2% zk2)S&=DDUwm1tU^VyLQ;oKq9;*C0qJ#cGQOGKQr4VJwWf%gG6kdkTwq?kALb5q z^sFb6KY!UGC9IicRF+uM)5jW1#`J}!qXBf?EUDP4 zf>{u$!n<`tEL}Vt;a={@)pLe2=MnuWD0m7={=dG6(z3EYu9u6vV3{yrfW5kU`AYuT zZI>bL6}8G_?$x4wvGgXhO!$mONk$Iz=z^rFUd~u@!_TL1vUAo<6m*z{+24AWw;(}$ za3~6NjNoebp?SJ;C(7_D_$7V5OW^EP3lS`$?Gcg8X(eYde_2K5}M2;~JDq5z{=7yH?CJma@ zGV9VmB_%Eluj5jou4xH(cL(TbDziW72#rW(ovzTYP!&>Z8y69UbXuRPxw}BMgz2mU zL#bh*zz}^LJ8wE;&-(7vj7nijX;?&SS|T+$7G!XgIb5<+ViA*+$@m`^YFo8sBq^e4 zJ%|=4sfH2Ug^iw@YHD;4UeTvt$Ap2JE=+UDeX%er4X>h;87$`kEeaDtk8kb&+w zR9)J+c)-R~4^hF-kXdE|54y}1&|lNo#1JBBF&W5hJIaC;I zoS4d(1T$l5tjZ7`Bs{}H7+6+=tD~7Li&oZ~*GR}xft#D7?0ZpmDuTnJnK{S~Tjxzc z-QjdA@zO+aP&m{~ZDFIwg;$HT)lfxVY7~NAB|xO5i)yabVXQ4ha$-7+Xp)yR#nh@& z3z3)d0xK8pK${=uqm8$f?EVBTa#Tbpwel{oG$y^MEeQ_{L|jS+RJ2XtRig&A7|JNl zeS<&-she2n;^@jHaO%7k-?uYCQFbz8SrWO}8^PJho{v8pIYkl~O)5`!AqYP@ItB&G zx^S)LD6^pCQ!ou-on_3*H4UrLG5-H{4Vb&gGoko$s&AF!xp+^i~~bsVD8MiD1wP7 z{AzL2PN(Z(SWG%J4Nb_(Pc7*wXaEh$({w z8gV>Q89Qgf;5L%P?y2G+;*;LOW}LL1mC@65W>=b7evo9Xl(|8>YPv3J6A4 zu?SZ7c5tw$r zr5a{*t;_`Ph*l`g2*K0*H#mukbMja ze9h^__&0ZF6h^(kFGu&`bf6LT?WEk_0%Gmnj6urGYeZr^}%Bi z1BHjpMB_RZ6b7igOL&d&=oBdH=)m2xI*Q2!485;-Ua1A2DIv%Wo^jVei8P zbQ`e{ott~o)mIq>SqTW?I#oi3+S#Kzw5if4rn19OUk4>QnY2Qvz=T?Eaw&)idBOdo z3|7t_6s#n8Oc$N`d#*8|!vYL#?!rj!;f&T=Y73%TzZ2>b5`Z3th}BX42StYwS?8ib)e zI?)YQ6|rHjkVLDC3V9q)@*moQ%L5fRApy^kQ7B=yKX*9NO;oTmr^Rz_r_d$afsh79 zdaO}!j}4?ntN{ALp2_TjT;g~ykq8Y>gp!svT->V@?t(Ldb%wI<*@Y^w=el4?9;vD# z>_}gKqolMtYN7V3=r)p1*2ts69DLgz~QO3-o2IjilkLaGp zy;X($TzYaUts7P{{-Gp4OXjIkq|SSEb7Qu<67qVJaQ3MRMl2qQ7G8Q-J8?FGa>+lD z-z=q4u=DU~RDL(0(jkw0Ob)YZ(uyW@n0!!FNFcH$+Hhxpe-#h6$B0bSI38OF=#b zSX)}q?9JZsk(I9%J{NGW4+@P$sgfq_ow(;}WYhXfw^ojw!aTYL)1YR_y;)di5}5EN zIx!Pwb`Gd!N4NJ6D-*uct0XBU4<^QR-R7PwT$i1dEwfJPRgT}J1t^4`6PZ*ld)2ND zeGM@(Q!}B(`H-1KK2Wz9X~pVlOOu|!E6N-F!>?ir z;At5dP}LB4sCVMc-yrO~>s#WTD_HBBjoFiac+YQD*x)0dUB<3G2T`W~1?DXNQD*9X zcjaIA>EV{u*cY7*SG|0MrARSo@?tcy`*kVjCD&E!0X$wXy+x@NdEB-iE*C^8ctuj2BUgk zV)Ae@jeoon`4wd;*uQcO?AuI3i~3bFH-EP3zv{Z12e)G9@vCUuV>HJ0Z1X3pEx>QP zcjJ<;A2VQ0K<_qn|71OX?6PgE7Qmd@^SU;2_+uCTLuW@l{S^z>orYcOVVE_r?OUel zk2EipFeA;OZTR)hD}2#&0*1DB|J}+PEFL($<(WvsIOh z>E{yRw}tcYSknZf$Bcn#rOaia*H7Z0zX&rXF@Ca2j^=Y)_!s9%b8+sFFdt2@ba`L8 z82yX$f9L1tdw1bTPy~96or>Ca@7A!i*S^@e^$rHi{RvLA(EWWyf~T~IZ9fu+2~)?y zv)bqF%~ka$<*6?=@Aw%_M@~ii+D=uS@*g>t8UGSnm}#y05B=~>i>d|3|47IF@kR@n zjdvdo29(O?jwdZAGPmXOeh9Hi74b=brfV5N&#`I4R@7m(wk{1l{!A5$YyMpdNZ)XM z^??#CH6?L=P-wNsmW-I)k2F=~MlOZ|9F(z$li42)xN=s!bOGK=AXg6;c8gQZuhbjr#wV zlAA$m4KwCgI=aEQJO<={OW*$fen=UhTR=B9EvS~e<@}j8Q)6B+Zb=U=&T@_OpQ%H3 z4P8ZwsgY7v*Q9p!!x8?cYyHbF6c^<&r@n~(z1knm!_RAs+NsxJDAurqldYhw`X`DM zMa)VjqEGlA2CMuhx>wN#ElHVlU(hFQ|I`qmMl3$^6(l+~u%o8*?y&)C3jq ze|0HiVv<;9<|~7fi!-$U-i_rWN|sQgsHXA{H~LX8{+a`V3!IQ-(j|e-z-zCMb z3JNGFprC+)0tyN!D4?K#f&vN(C@7$yz`sv{PYFB!?W(?ipK^*C6ckWUKtTZo1r!ue zP(VQe1qBooP*C9iBnAHW+uTdC5EPaS2L_;NGn3jsSxR%_aqD3qk=$+2(3^q!%qk^i z(t-Pzu0z$f4(ivk`^!vk|KxqWYpW1}4;~XNQ;g~j>ciGp2!I5lUfx3}UF96T8o_uX^%-sjJqfAh@r>eXGVtKO@)rHCMG)z3TQAjstG7@j+DfxzmG7XKkP<5z-S7Z^KqRBj*Bh7r$pj_-JcnZ z9_@kR`@xb2&mP_3?v1p{&DghY zUh1dSUkirf@Fe>|zOIphA8z`kyk~%24a?FNGDf!}tN@-MfNt_>EQl>56oA1#@1(o* zp#>!M6mk%q1kSTeX)Mrm*=rnyCCS@aO2PLFgtswQPyiNBfw#N&A1r zbSpA}bXem(5pX2B<)80$07rnvE+c=qQqO2Xr{X{E3rGs1nSBx{($zu%ZerKoe$PHx zxsd2)JGG{mLkPN5iRBfeISVs$sdTuUIdv=-C;FW62gVDHNp;#qxY|&3^Zfv02WO)0 z=xtC2mxypRZ178$#h*&z1VA<^4Hs12j0t!x@(}YPnv#kT`h6HjR`vrV`u>w}<5&KM z+Q{MX{x0Y1h{3w~W5xPW7FnW2kS4>Cq(W5R=`pwc@tw_Do6Cnpg^-B61JPYox<8UR z_;g(md(5}hDCahatZqj%T(L?CEx4>~!RrM_B^nZCKLegoa!;P?%a_RK$A|r`6N?Hm zVf}bxbXgp3$U7|0uzXbR^Wu4nhf_t4n$f<2$JO{D1~&lh18Qr;@Kwb6av}vVe1P`{ zh#`dw=dP35RW>`AT51rsyA~6ni4eHzo6l16jO|RVDmqswnA&#t$;$aK^oZ`Q<#U>J zuaVFlVQc6{3W&w#NC5ulXPR-p=u)A|VDanE55ENABe71zeQm+b?ulYy!x7qUpCUfB z{GySK91Lo2woh;9^f{)oUGtDe#18DU;SJDGc&&B$>C8Z}eYtF<2iG%G>&6G@c~^Go2HcJ zA5rTgju9(wFvl#@ijE|D9lYFrYoMC?ivIeB)3O1l3^!4vl+~{c1QM=Di-j`L1+-b4 zk7=;#jNyJ%G@GN_UV3EZCpf;P(i7Yx>arX>gxiS)sI(x+&B6@++!*?D| zGGEZ-sk-w@@p+15V})unyx1`gJJ&$(&S(p$1`zv)kN+pJpWqJS9hApt=|2j<=V(qQh)gu==4FMUcS|USG3>%j9X30cpwc zm}P3^5I(PWsh#$uWw=9IXRU*ftmHGCy`zvdN`QWJ^qp7)wrr;qhiVAagu}q-{x%U| zo07qI(0*0kK)qmFGv$!~0KuZyq=Y7bN;VAprdpZ{%u1!e7H9t2nuopMVD-A$epv{I zk2@=`7exh5Ory91p4F_nJMs>~JXZr>Avig+zZ_uNK+Hi@q>jboJPSpi^7GPg>&&L- z`1|5i$1VL=^8xaJ4G?K8%67CR{z>{Q3NT#3Ve=a*e0?G+&PMEu@=OG6pvP3TatyD-b`V#!W3$C4dWwyDN8sJtx0lf zHK<}_tZkqy8KUxf&HMa%!sfXLon5(x_dg-bo4(QpGnVU!Y~)t8aqAAzmtp|0==QgH0Gz>vpLu zi=aHX^92tU0R_~Sg&YqWRFq~G&u!sS70Y5FPi-yGlr7jN!@&BUrs0fo%UJ@^r36L(ZjE?{5tKn*yqbEIWd7i&BBVBB^)c6=ECK=k9 z^I!-od!(E$nD9$vpDLNPH9$KdXcnfQS@n(D%5&*Bt?rksR2vo*(;8+n-Qr)AO_3tZz=#(S4q8LQA8Kfs}P_ zz?KQG9YybdA?v>a-#141m%+Xmwj-C5KnQC$!}=?kj;r>7A-&mkuoi*0*M*_C?L5V?PE(;esF|ZGPADmB0iXp@RinNIQJTY1IHX z{0B~CWZtMWdOROC`X8yXo2&3M(>2TKg()m=x0Q=kbSC?vG4M@J zz@Vlpv{Y;_t4QLmv0(?d>6`(uXxIJGg{Qu&_F3)i#xixD=#vLB`^L_T($bqIO1JJZ zayuPbI9#7<5FQmzhd1=g*dQ#NU$iqkiZVId0%ZuBVNPClRZNT+#FtRY);CxL*q{U; zHAX>4Uzcci@5lm{r#NL)X+qD>cBDPNg+wiDNHAbQ+0Ta}u{O|dzO2Cz5bZmvs-oH- zG_E$*rG^<8N+mE1$*Y4hN;^3@)v$7E-;g3{+^)yALfIZAQ#`i!^5Gf{jgaB4U{Yc^ z&nb@^0zULt?sdSscrvD*&-w46)-Nk9cEdA=_0tVayaUPW4^5t4nx|jI8y*FxBJM%j znarEED#-F$KRy)m)J0ppxUx!6T*7Xym#4%&H5)7~spuLe&f0U4Ln(;QB#)N)0 z?rL*AjrdVj@37MhvM{L(MB_wpzOaR~JTqg^ijUa8KLfW)W^uKODrNsovX}Z<3;;K% zjn0miHwS(+No;ujgR`c#sW0V^_ox!tL%4d=WoiD8PWC(Eui*v5J*M3pb0<~9kC#aD z6|G^Qw;L+iaq-THJ(l?t1TS!!LKXFBa3-9$L4_vq@0Ufs?Ku% zFV)0a0#?m-Z?K8sHlx9gfT?_-IE|GyWy`|@n6~dc{+{-g@p)&&oMNS?o&{Y>PwANk z4(kR!&yrTp)Dl_@7c!#BBC|wAa$g*HbYdfsbF|(@p_adxkDIf#7NL=LfTJZBtE*ke z+v_U3tpxrD183}+U!9wc9L+45%6LECLh_TMk~*looSJ|jV`^y>i4w}xV$mA4t@$0C zYR_cF(w&9Pl=!A0$JhiM#>+a*1u#2@C@$VMHO1+l-zhj}QHNS;y?HyYGvZ_&o-CWJ zsP=hUTBTfy|DYU0abw2chttiyr9IcO9xuvTDzHljJ&K41R>4tfbYvM$y8${)lfNgS zv^pgJX=vV{vJx7}*m|Z14+*cyUtEg_J}GM2`~sFI-9mUcj}LFLI)F?&Vy=;K<76vf zXuQKPR|^_Fwg~4-2eAMnqk&-+1i7__`$`%qXFH;+JW~fTjQ4Z_lUQph4Tfdkd|?~I ze4_@Z6UMBX{Zy<_o=Xs4O;j(g!7+cFKUg(Otn6uHX#Y`D$j<30M#K2`#;7_4dzPrKG9m=q)X~_;o!fWBZvIqP z4p;<@7_oV-K!xTXuTjxT5br zBYpQ_qzs8%qw&H^@WxqPmkcxyliQ7zi2XcX9d*sWM@+WJ?*c~8Rd1Mm+q{g4WAx<2 z7Tl;1{##Z5$gupLp{WgpSOaB}0!o$DFVLa$lpS;N3mzJpiEl~YumT%cg8y`(6 z`^79DFRro-p3?opJpVIn&%4b>U|U{#^Dx>eq992gxgnCr%KosC!Y$pQ3(FM;!={n- z2*;4ofJC=ZnGvSu3SY0{v74k^HvsNEDa=o$^*g3184JZ{+r|zO6P7pfLJnpy6rX-Y zvQK$zxpgwp&^6pC#bGkxu;N9boNE;!a|`c3$$-vNGGSx729pCQ$_{W_MtPF#l$zSh zy^`m%mqyBF%f@HCGqPC+Ia^Fu?1`u!dSSs3wsjmcn8QN*g3O#~v9I|gN>q385nqnn zz1Y20pP9U%epX*z04eG@QES7}&UMSU12bLe&epu(SdD*ED0A|(%q3IqJY;bBooCFA zph8LvvG2B^u_oV4fox})6&*wmifJ9<|`KzQPc}5r?QoXw3TIit=kv%q`4F#--CJqB&ITm!bxinmFN{S zHALh)q-?8*rAU@aVslzA2BgK4A)mOxRz67m&1P?qP;Vp%uhiNP>C95dJ`t}efu^5w z{G3$m%2Rg4x37LnjFgUeDZa_{oYM0+Gppap^?0^6t->Vw5=0z}NZD0a9*OpyZl`v9 z6G~+`c~!oGrmlXuyS%)g1c)fZGUL`T6;t(#Z=% zc|E^oKPYBkg+-!3{E?|<+(GGfdE?e~Pa{1K}V+O8R8-gRrgHCfdiTk$!~ zce~TN8CfrdWYMib4ofpIn7uOj4<`TfRz`_XihQ}aI2H%1byhah5iX7JL z{08Ui6AzEEPx6o^1P-CUG4e}o=~89{l=517&Wvm~6oCY~Bx6CHg!uYXIfNSeC8}_g ztM5I;o`GO+5LdI_2zf{@HL%ne#(3okV&LWRWshz9>qgw9NyAwOYHga|27rr{(s%Z! z+!vg2#7H5zo8D-CJ4N-3$o<8);?C<&v30+m9{jY6K6I}=0r0upU~svxXd(k=@FnFV zZP__heSyE#+~$FhA{v8%bxS}XtLh;RZ2%4ckF--mk}6HsOxY}<^iNtE1w}wjc;NA` z)>sp>_4|cCnU}5a_iJ7g_bujU-#Qx0dzL@zo#GZ0n2=;-2hy6gY2W-ymfQG(S&`0v{O^`EZ1eJ!4L*|yaWG! z0uLdd4<_6D0rN)(^fogJqdze&uGOf@P{mP8Mpux_%oM;2!I@6;D`Lyf7Wx)R=?3+M#VP#@Z~nN4(bw10$nx z-in%gG~WF!jhY`mdtxP4PH3+$TUYiE7Er``Mfpyl{qpyj$wM?AXn8S8+|e7iXfo{# z(Q!ptBfvOKEmgpVOffM8DccVwljl?OnlH={GMrU)-nN=vMtBt2=c;s0@M!Z0MP>8e zu<4JjS4YTnWEmEZ69Y###!$dqa8P>}h}M8+PuB5q8+`=4c4rWU#qc8;mq-poC|uYR z=V)@r^8R_rd++@F@qGwzcH@AFn{1A44!umrCwu2)22mA^5c*1Big zYSPr4l(ZA~CSFrJe=pC!dwKp7+bzgD>@sdUv_<_jl)9Cmdh`MDUdRV=rO@xF5!CVJ^4_5D)&!8Wg(4&pXpof`94u zWX{c*OL;B=Z)*(__y(T!0y5SWr@<%A*HpyLvNH$1fZ$mEvu=GTrk<1J?C6^gE_RP2 zFXm*jMP`&EQz76irqm4P=_m8&{cr?+$Q#Z}v|FTWurE|;#o#&cRCT+eQ8e5S-Rdq! zpyP9sF?AiQ+@Fmj(6U%`*C@_q^Tpiqqh*>-Quu(1_4N=8mq>8xy8E*du)Y&MLKC0K zxM2w;HsT)}A@^yfM?5NYB4=7b79cGzHMEwi6?9fox!`pzbzqvcO_fy*Of%{zdF)XT z`8~3m5b%Xzzde}?G+7DKr3YW!UIP!`a47b&Y?;rzKdP(~hP^HJXu`s)K77=iSCW0>xzxASo*8NmnPqNEA1_D54(9W5^^b#&gLFjxX%yXS8^W2YtKn|5o{ z_jeS@9%K|9#C1(}eJKuu6QhUie|m)$21&ekgfRyFLK6AlsoGwRzsWjBliyy56G$=z zi)03TPy&9|R)UmW0Y7=Ct?XQ3s>bwysdc#b-EVwaOT@_Gj1L|}ad#fX+93$*-3sv= ziqwDc7mxhD^*|Hfv`EUeT|V?Dk&OD860rzJvowu8N=Vk;88vT} zk2-X1&LNXRm+8Cc)KE( zdgGqERFnyIH` zl3~m9W=M;rB+Kg%|Lv^O5Mce~066F2DpjFnGvu^aR|)592rldYziY3DnaqBgksrJr z4myCC$lVso3@Uj$qK`_|yx2$q&Hh{r-h26*@YcGqg||K5i_a^nzEFR$40+opt|k_KC=xp5Jhy(-28C-pl$<3=C2DP@t(! zZnrr>*PjZ$`(qQ_KxG7$!-j-vB>x0vhdN;{LBD&Mxrm-7fsZPV0k`I=m!+n{3$$b*L zAst(Qs1{2q=#UZ;gf_xz+7r#kcyQtlp~RSk8-c=rprVa45&!d_#5JR}22G2bfAC|r ztIXH?JC(kC^ecl`1{#cYpTl=F7$TfyUy-;H@q`}Abc?T}DD?38eEI6WhfML>f_X{# z8+)_LVcD|q++a@hwDTuLFa*x9r&tq{|SRI$@>jG5&3ggw@h5i{3Hm zozgEzT)yv=B9C53{tT5FJOD;ut#E{iZfJZ_P83qhCD`pt;C@j5#chl?Lvbrcq(xTg z=K8OU2_J!GSp{j3bUgp%5|Z7fVr$yOJgj8BCdPb#8)3l3;-X+XT?MXiMiSDVz()IYa-yR!XuA?&tlZ4_{&_v^92mHbE0Y29z*!O zHDOR1WN-2`JT5lxV>?IV|@|4ZA{X1nZGWaa9NZ<yNNggtNyY?)oS&6O#slG~)j9U$% zn{_*rkaj{c5V*6xUe08ktEVoecG#g&G68JWg5<6%k}TB+9OY*;MM_!ZoQ~=sFkS<< zY{yC(E(G!_5!ii# z_|tfIPO9Ta;6C~I6(~~<8t3_U+A15(G&`~F-_3-%*i{M39SAV^U8uL{Dz-S@s*Ayg zb$?R;{xJK(*8?TnsQ`&3(U&3PROgVh`3NoLNOX%MORi!#m#z-U3;`1!80#xvOH zC>WK)QhItzGb9md_Z8@7a9GFK={a+@^h@k27^~|m4)IZBY}b;%!n$^JsxfZ~y(@wD zeb1?r`PT201%ovkZV{=-@sUlDrN`dlhnIeh8e18*qa*1In`J!snuAzwgZ^p2ehDU6 zu0^Fn-_UtiUpf6dQs&QP5!jJ@)zMAOleG>Aeplil-00(zu&MQ^0f_c^Z@P5xO=<8t z4vLdM;SCvVSIN6=>JQs^W107`bgQu$u%|TA{DGm5>6Hx##kG8Urp%_89 zDSSp2^?l>#DxMMmXtPYoIe2dj*PNfN6z8c8rH1_u)pyASBPLqu)TnRXXt5g^MJvXo zqDPRRUm$?uwS`U)wldSd^e|5Ce%xs{0@zO=1fU4boh|{4mqFwF z=+lx4Z-hVPiS}c>yP=>k)d;T{EjURS&%9o~>#g*jjO;5It#74FPYq4U2Xb96eHr-n zCzSC+BH{a&0?3cun>4$6D^tK z^RMPU4_L4W3e5VJo?iCzc_D=-mAc26`45bcIW7Wte;$h~MP;8?y!N60aGWp{V@F78 zw+X9w4x&|T?!)49^;Q{4%B|tUgO>Z_qlW$d_st2sYP}ntDnc_c+kSfnoogl=yDPUw zla#GrBdoBu4uZt@h&Z4^r(%**F{-zl6MFZfD(gcQ{>nvFUEvc@yX5&Th)qo)S!3j=8gc|NuEW39MTfUyXnRLwq{JN^ z;jM0~oCq9$akG0OD#yG)$|d5mDNy3gg@i3%U|vBgJ*-AH^H$3H_M2^OwxUZOoQQcE z+6>>3f;I&HK&ES-;1J0gV>~6eoPMS$pCOITisdZN5_V6IJw7c}avuJmXWk@t6C5Pw+0tfcaiy85pWIkpT-d1kDVmWd z`I!p>W!))B1+ge;A>N!-+^Dr#xCl%$LdIqLx$KNx8ctEnzz3^8vE)r<H6I<)hd*zm;4Hf^ade zQVo8sYd&gFW>G)e(j#;ycATko&j^id7+&nih@_ZYs{iJz4}arQqkkq{UBbp`!U6wE zt5kqy2(Ozw&_{_*o}!RMkQ_Z48AFw+MIVQ)?&_m}nd(|vd@AZ<1|MV2Veqs@^L@XV zth!*@V|YAef?En9-mUG<(Co+!N=xQ3xrf^ zo5uJi=AT|ltJTSaf!kj9dAcg$Jf3yLuZwP%!`6C$J&of&yAD#9JJ&ItCoq8MVNMGh zj@$b!>%$IZ4nQN65Z}1=pp%)^rexC28>8Fye#Y0GSVrS4hcN{VH8^T$2If3eO$ACO zJ+L-m7FOR0di~jm7?BEWZeDw>>%{5B)PgrzpgXyvRZB^3%b>4fSMx2(dh`!7Zf`ty zc3*jID=hpCsGSXxxw{^1sAciuqFe$MRgBd}prgiQ887NmD7K)m-YI>g(Ani8Q?rAl zZITsKrtH^)eook5x0pR_|L)X`duOWq2wE^2G?zkM(N>yg7>u+Q8noYzb+>xdXqcZ1 zopD4@{&J7Jr%Sw+V#Uk+mpjG>tI2?6(V)$@E`oByF9>`k#^mS1C?FJH3pWyr`VnzZ zE^*_*x+t>e_B15_wdx06w7qPH9!&s@&FZi4Ke0O*o>9?V0R#ZZTMMO!OtQz={yHt4 z={Z@V{)38Sy&Y(ULYPdLWA&&e(BVkX5B8kW0i?6DGZVdfCB;eTC%tJWhN@l0B8ELI93*kad0BCu72iYP1TEywMea`nl1WSF_&{e*n$C$+@_FNCZ6!4=xIY(f z&Jz_ngPjjcIhBPr{>qRKtrPmUd6KbO6=o24KXkpgfXcW67&k(s<+xAKDcD~EG^OP! zFb)PC>WNl2@c-|cN$uH{+i;_DWjg=4GtK^=Wb}W2woevTFxnS*)}O%Ia{JE_|1Pq8 zEV+PpHSkj+PiCuk{G<7j`GZ4yUc!y!7Gq(t5~uR$ag)4B+a3AGJg&v^Uj(djW6lP@ zD`8R=IE#NGIVHyHg7NE0dy#&yDQ@TZRpV{Q{&V=3B3NCtTJ-Db)rT{8#-f;O^4O`w zi>Wm#@2fj$lZ+;1R2SSc&l}z~UgHk}#!3YA+Wf2ul#^#Oq?sRpny9=+H^&>-&Af?r zE`pUy(l1NyIB_1^p`c{rUNNYMS-*i*>$~l)U3wOe8hBig8wpc2a#6AXM%G=g7yh~g zDhTcnN`Ip7FWBb;3;U)+GKDXdR;z74d7TX#?=+>ooc4)3sGNCubH2R1#&;dcRjhyh z=)OP+k*H=67!P~AQ#lb#M&<@0jQQ+n-pyjWJ4vuE_}wr9zEk0hq0Q}|_ZFu&k>oev zwTTatTH1}Zn6p-q%6xCU!+Cpo5Qi_3Owl^IiRUsm|Iai2?-ExxA$ZEpSd1bK#kmrA z#0XQ7#T@{RmIxLBDL_~w7-`kfVU%$ZFioGk{i(1=A4>?-$Si=&Ot(En;v*%cgG}zJ zjnP!?10LIbgK34R{t(lGTfY8)qe4b*koT!1W+&|K?4VkbAs~#r`yPsQ-}E0RmjX`_ zJISysD0=$H+w6G-sMbJGi%93YSX>fvRZMtM&>vN-(7bE4^=(dmx?8GmuO~VsWah?E zCm8CCI?-6U`N?Lfhp3aSpO3sMqU`<>qyO#3E`-E37C-YBX?tHyCeU*fGfym!W_Y6ySmiJ;B{7pOs)5$Jz;zW?WL34y1W z6e{Fm(q<-6sujl=+655K+Jy;=Td~d5(HXj&Nw9AuQWNz?aNp}0c;NvHs~IHZ<-h!z z=NuWO1sa!Iv+Mk-;;z}StIl6&L_h7QXFuGttl>Nbh&yni8N2oE5Q8zxKtx>EDOEB7 z`_ym!b zMhyM29HdrrjxSkaz}nq>L&j^DO$y_U`=9O=H5a!sAkvnC6G7W?Dn+D=8Bh$ zsyt_wILk#{VRYsEs>O+7=fig?z!H3MgWR7JR-SvJ6TaR75|DaKTczKAJxHu|2^=#IMNi3@~^#A_1e;t$ZOBOSd_mqsZAtU00UK|ASd&Pzo40L6bcX? zP2+GLM;a`kOJ)dQvF(%#0ggdNf>OO64(oV1tk5hGZlOv1WG8vTifi`uPW_ZcMJQ5% zillytvWMW&=CqmL3hLX?tfZ{WNAY74H@maaKXb^2Yo3Ia6*siW8tX{GR~wIw{^vL+ zrMX{;muoq0YbhL!T03~b%0c~d;Z?@tN5K4^QjlM>5SE}KMN_CD|4&=o$Zl*wV`56O zm|ZzTniKacV2)EupMLrT!z?8xq6$Cu0~fBg5*L>mIlrU~_cQsh@eK*F_6f0suPHeI zMlbxW3tSQiP)*4M7)E0xQXvKnOzYQw9!9U5Ub7IP?-Y_F%lWfp8TXwaq^$`z$h)xS z2jYmdf=H`2D2~*ac0C47t8`fDH^op5EBa@eQXs&Qi{WCRpge!7j8>cu3Rw*jd0>Yg zCZB~KGfB;JX@DpdOAxnh#@QsfBzLhX#}9RIot7_r?nS!AE7W+aKq<}*9!vE{5<>eu z4x%DloYXeGfU)pEjRVfiBogH=9wII$1}3j%$vih1dpl%Aj-q>7d0f0sfVdCD6G~k^ z88_TAWuv`HsDWe+4zJ{LMY%a zChRrwuUdc4H`{B%zj}{=(TtwK#uHT8_^><>JP<=x6_&de_Nc>T$ND#`=@rjM?U0mL z5E}}QTbGj)UX6lD`Z!(Di4Q@7{rE#S-Y;b;0JD%+3KbHiXT;aB?rvmiGQC0^&MQuB zKCFjCVZQ+vk7MLl1;D_L{2TjnW5h)CZ70=fZLRzLSUR^PI8l9SK4phO39G|TJDZGqW6&~yx;R5j@xA>}o zgnclvRm8Po!F|v7^5NW!zzi(a`J5to1bisf%F2a4eg+KR0I<1GWNHO9gPR8_*t;tV znHV^;^iOoem<^_B798}bXa}*rui$Zs?%<7FLhj4f_AdtDGfvhl&bk;+pi+ZEHuw-` zyl|akt)O|+H_pAyzoV-FCpcZ_+SyJxV-dt+# zD3{+x)Uv=UMMkhOtcNp!MOMz6rx1zrgM~)M4Hr%dYszmW{T?h4_baG^+cV5$9To{W zFgqK?z%o#d4w&Od;*CkB$zY4aA6UU#q>Z6rX>ibhIWaAj`^i29zT})rQcZ*-3zcTK z(xSk|4m^w$O9dLuhlqoUyA{z91Radu7YIR{4ZfgGURGXaSQq*6Ua2rme7_uBKrtwz z>0#Nxvd}X;v056CH$u4C+k0_)OHykb)FbcW7J;~$$?IqKcd#MbQ~TD15stNkJQ})P z5~=SF$#5iFP&g#Q>_`nZjbi2kri`|o%k4=bd=^vF8=uO96DF7(igjg9lI*cjc5K@- zKrhiRLnW%H=vN|%`h5>GU)nmf9W=IV9rT6>FFk*OtePvbi1=>c*D|_B;)32!&Jq?J z!w)|bOByrrsMMw6x#}lEODCj=msgHRFFaKL0lj{P=PZ;4hp%o9*@TmBfE=4nC=vy1?Z0 zz?zNoczTL1xH^_vi`U=Ng_4(!MHIMzBE-ziF;|+qz|}_`Rza%jQ$HabI*m0QWXU9rl|g7ZaHYy439Ad2b%8q}A5 zRK-wD5g82wc!CO0h0UCv7CzaGWT|^OI7;8ly$NnDgmaB207N32m)%k{t>s?b28|Sm zxxWu$j|D4gL~5hyeCaj3aB&Ojx4VMMe_Y;DZyH(_dMMc|?+Aay~WfHTO zgcYkqD#>GX_^3Q5@yk;Z1l)&Nvm`V%IvD+Z;id3{A>gudXfsxp@9Mb<>!H;;we~Pc zy~FW2_(kDkUX>#)D~hVup@C7!5kL*g^Zq0BY&cT)80{!nV%%Ppob@vc-K65snFU2{4JEFkb+_Hr)(Bn$Ne2s^y~`z4^Hf| zj0%YV)jfkz+2j5Tp5V&!p``s~i}7PjUF3gZ5ajx?kJhaJ-&1V7gQeg3Au&~9Dt-F+ NNCD-=ssILo{|C7=K0N>c literal 0 HcmV?d00001 diff --git a/docs/assets/themes/zeppelin/img/docs-img/ignite-sql-example.png b/docs/assets/themes/zeppelin/img/docs-img/ignite-sql-example.png new file mode 100644 index 0000000000000000000000000000000000000000..eb0506704719bb0329a4e7da0e465d15905c12e3 GIT binary patch literal 51647 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 X%V?91?kK@`z&|N5IngpCurrently, Zeppelin provides ignite only in Zeppelin source release. So, if you download Zeppelin binary release( `zeppelin-0.5.0-incubating-bin-spark-xxx-hadoop-xx` ), you can not use ignite interpreter on Zeppelin. We are planning to include ignite in a future binary release. + + 2. Examples are shipped as a separate Maven project, so to start running you simply need to import provided /apache-ignite-fabric-1.2.0-incubating-bin/pom.xml file into your favourite IDE, such as Eclipse. + + * In case of Eclipse, Eclipse -> File -> Import -> Existing Maven Projects + * Set examples directory path to Eclipse and select the pom.xml. + * Then start `org.apache.ignite.examples.ExampleNodeStartup` (or whatever you want) to run at least one or more ignite node. When you run example code, you may notice that the number of node is increase one by one. + + > **Tip. If you want to run Ignite examples on the cli not IDE, you can export executable Jar file from IDE. Then run it by using below command.** + + ``` + $ nohup java -jar + ``` + +### Configuring Ignite Interpreter +At the "Interpreters" menu, you may edit Ignite interpreter or create new one. Zeppelin provides these properties for Ignite. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Property NamevalueDescription
    ignite.addresses127.0.0.1:47500..47509Coma separated list of Ignite cluster hosts. See [Ignite Cluster Configuration](https://apacheignite.readme.io/v1.2/docs/cluster-config) section for more details.
    ignite.clientModetrueYou can connect to the Ignite cluster as client or server node. See [Ignite Clients vs. Servers](https://apacheignite.readme.io/v1.2/docs/clients-vs-servers) section for details. Use true or false values in order to connect in client or server mode respectively.
    ignite.config.urlConfiguration URL. Overrides all other settings.
    ignite.jdbc.urljdbc:ignite:cfg://default-ignite-jdbc.xmlIgnite JDBC connection URL.
    ignite.peerClassLoadingEnabledtrueEnables peer-class-loading. See [Zero Deployment](https://apacheignite.readme.io/v1.2/docs/zero-deployment) section for details. Use true or false values in order to enable or disable P2P class loading respectively.
    + +![Configuration of Ignite Interpreter](/assets/themes/zeppelin/img/docs-img/ignite-interpreter-setting.png) + +### Interpreter Binding for Zeppelin Notebook +After configuring Ignite interpreter, create your own notebook. Then you can bind interpreters like below image. + +![Binding Interpreters](/assets/themes/zeppelin/img/docs-img/ignite-interpreter-binding.png) + +For more interpreter binding information see [here](http://zeppelin.incubator.apache.org/docs/manual/interpreters.html). + +### How to use Ignite SQL interpreter +In order to execute SQL query, use ` %ignite.ignitesql ` prefix.
    +Supposing you are running `org.apache.ignite.examples.streaming.wordcount.StreamWords`, then you can use "words" cache( Of course you have to specify this cache name to the Ignite interpreter setting section `ignite.jdbc.url` of Zeppelin ). +For example, you can select top 10 words in the words cache using the following query + + ``` + %ignite.ignitesql + select _val, count(_val) as cnt from String group by _val order by cnt desc limit 10 + ``` + + ![IgniteSql on Zeppelin](/assets/themes/zeppelin/img/docs-img/ignite-sql-example.png) + +As long as your Ignite version and Zeppelin Ignite version is same, you can also use scala code. Please check the Zeppelin Ignite version before you download your own Ignite. + + ``` + %ignite + import org.apache.ignite._ + import org.apache.ignite.cache.affinity._ + import org.apache.ignite.cache.query._ + import org.apache.ignite.configuration._ + + import scala.collection.JavaConversions._ + + val cache: IgniteCache[AffinityUuid, String] = ignite.cache("words") + + val qry = new SqlFieldsQuery("select avg(cnt), min(cnt), max(cnt) from (select count(_val) as cnt from String group by _val)", true) + + val res = cache.query(qry).getAll() + + collectionAsScalaIterable(res).foreach(println _) + ``` + + ![Using Scala Code](/assets/themes/zeppelin/img/docs-img/ignite-scala-example.png) + +Apache Ignite also provides a guide docs for Zeppelin ["Ignite with Apache Zeppelin"](https://apacheignite.readme.io/docs/data-analysis-with-apache-zeppelin) + + From 27b7ad52b6bf8f18643e8b58d16fcab3d709eb1c Mon Sep 17 00:00:00 2001 From: eranwitkon Date: Wed, 4 Nov 2015 15:09:06 +0200 Subject: [PATCH 006/491] [Zeppelin-354] - List notebooks REST API replacing PR #367 This is the implementation, test and documentation of List notebooks REST API. The documentation include sample JSON with different looknfeel option and coron options. This is ready for review. Author: eranwitkon Closes #369 from eranwitkon/354 and squashes the following commits: 5472620 [eranwitkon] update getNotebook list documentation b2dad81 [eranwitkon] revert to original implementation as getNotebookList does not need the exclusionStrategy anymore 0eff22e [eranwitkon] update getList test c2f1c5f [eranwitkon] update getNotebookList to use NotebookServer.generateNotebookInfo function d0b6744 [eranwitkon] refactor broadcastNoteList to use a new public generateNotebookList function which will be used in both socket implementation and REST implementation. 1e3d98c [eranwitkon] List Notebook REST API implementation, Test & documentation ee53446 [eranwitkon] List Notebook REST API implementation, Test & documentation --- .../rest-json-notebook-list-response.json | 1 + docs/docs/rest-api/rest-notebook.md | 34 ++++++++++++++++++- .../apache/zeppelin/rest/NotebookRestApi.java | 4 ++- .../zeppelin/socket/NotebookServer.java | 18 ++++++---- .../zeppelin/rest/ZeppelinRestApiTest.java | 18 ++++++++++ 5 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 docs/docs/rest-api/rest-json/rest-json-notebook-list-response.json diff --git a/docs/docs/rest-api/rest-json/rest-json-notebook-list-response.json b/docs/docs/rest-api/rest-json/rest-json-notebook-list-response.json new file mode 100644 index 00000000000..ba424a90232 --- /dev/null +++ b/docs/docs/rest-api/rest-json/rest-json-notebook-list-response.json @@ -0,0 +1 @@ +{"status":"OK","message":"","body":[{"name":"Homepage","id":"2AV4WUEMK"},{"name":"Zeppelin Tutorial","id":"2A94M5J1Z"}]} \ No newline at end of file diff --git a/docs/docs/rest-api/rest-notebook.md b/docs/docs/rest-api/rest-notebook.md index 1c367ce9f6e..f50668bc2b2 100644 --- a/docs/docs/rest-api/rest-notebook.md +++ b/docs/docs/rest-api/rest-notebook.md @@ -20,8 +20,40 @@ group: rest-api
    ### Notebook REST API list - Notebooks can be created, deleted or cloned using the following REST API + Notebooks REST API supports the following operations: List, Create, Delete & Clone as detailed in the following table + + + + + + + + + + + + + + + + + + + + + + + + + + +
    List notebooks
    DescriptionThis ```GET``` method list the available notebooks on your server. + Notebook JSON contains the ```name``` and ```id``` of all notebooks. +
    URL```http://[zeppelin-server]:[zeppelin-port]/api/notebook```
    Success code200
    Fail code 500
    sample JSON response [List response sample](rest-json/rest-json-notebook-list-response.json)
    + +
    + diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java index aabc8c686ef..2b986337310 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.util.LinkedList; import java.util.List; +import java.util.Map; import javax.ws.rs.*; import javax.ws.rs.core.Response; @@ -117,7 +118,8 @@ public Response bind(@PathParam("noteId") String noteId) { @GET @Path("/") public Response getNotebookList() throws IOException { - return new JsonResponse(Status.OK, "", notebook.getAllNotes() ).build(); + List> notesInfo = notebookServer.generateNotebooksInfo(); + return new JsonResponse(Status.OK, "", notesInfo ).build(); } /** diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java index c6aa846d13e..421e9a20113 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java @@ -273,17 +273,13 @@ private void broadcastAll(Message m) { } } - public void broadcastNote(Note note) { - broadcast(note.id(), new Message(OP.NOTE).put("note", note)); - } - - public void broadcastNoteList() { + public List> generateNotebooksInfo (){ Notebook notebook = notebook(); ZeppelinConfiguration conf = notebook.getConf(); String homescreenNotebookId = conf.getString(ConfVars.ZEPPELIN_NOTEBOOK_HOMESCREEN); boolean hideHomeScreenNotebookFromList = conf - .getBoolean(ConfVars.ZEPPELIN_NOTEBOOK_HOMESCREEN_HIDE); + .getBoolean(ConfVars.ZEPPELIN_NOTEBOOK_HOMESCREEN_HIDE); List notes = notebook.getAllNotes(); List> notesInfo = new LinkedList<>(); @@ -299,6 +295,16 @@ public void broadcastNoteList() { notesInfo.add(info); } + return notesInfo; + } + + public void broadcastNote(Note note) { + broadcast(note.id(), new Message(OP.NOTE).put("note", note)); + } + + public void broadcastNoteList() { + + List> notesInfo = generateNotebooksInfo(); broadcastAll(new Message(OP.NOTES_INFO).put("notes", notesInfo)); } diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java index bffc8886dce..8c8ff07af24 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java @@ -145,6 +145,8 @@ public void testInterpreterAutoBinding() throws IOException { assertTrue(0 < body.size()); get.releaseConnection(); + //cleanup + ZeppelinServer.notebook.removeNote(note.getId()); } @Test @@ -179,6 +181,8 @@ public void testInterpreterRestart() throws IOException, InterruptedException { Thread.sleep(100); } assertEquals("

    markdown restarted

    \n", p.getResult().message()); + //cleanup + ZeppelinServer.notebook.removeNote(note.getId()); } @Test @@ -236,6 +240,7 @@ public void testDeleteNoteBadId() throws IOException { testDeleteNotebook("bad_ID"); } + private void testDeleteNotebook(String notebookId) throws IOException { DeleteMethod delete = httpDelete(("/notebook/" + notebookId)); @@ -282,5 +287,18 @@ public void testCloneNotebook() throws IOException, CloneNotSupportedException, ZeppelinServer.notebook.removeNote(newNote.getId()); post.releaseConnection(); } + + @Test + public void testListNotebooks() throws IOException { + LOG.info("testListNotebooks"); + GetMethod get = httpGet("/notebook/ "); + assertThat("List notebooks method", get, isAllowed()); + Map resp = gson.fromJson(get.getResponseBodyAsString(), new TypeToken>() { + }.getType()); + List> body = (List>) resp.get("body"); + assertEquals("List notebooks are equal", ZeppelinServer.notebook.getAllNotes().size(), body.size()); + get.releaseConnection(); + } + } From 618bcd8785cdde83d5212569be6e54aabb2d6f14 Mon Sep 17 00:00:00 2001 From: Prabhjyot Singh Date: Tue, 3 Nov 2015 14:31:39 +0530 Subject: [PATCH 007/491] ZEPPELIN-372 : Exporting a notebook Exporting a notebook in a JSON format, which can later be used/imported in a different environment. screen shot 2015-10-29 at 12 29 41 pm Author: Prabhjyot Singh Closes #376 from prabhjyotsingh/ZEPPELIN-372 and squashes the following commits: 462e733 [Prabhjyot Singh] ZEPPELIN-372 : Exporting a notebook in a JSON format, which can later be used/imported in a different environment. --- zeppelin-web/src/app/notebook/notebook.controller.js | 10 ++++++++++ zeppelin-web/src/app/notebook/notebook.html | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index ed1d69be3eb..d8ee83f0399 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -79,6 +79,16 @@ angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $ro } }; + //Export notebook + $scope.exportNotebook = function() { + var jsonContent = 'data:text/json;charset=utf-8,' + JSON.stringify($scope.note); + var encodedUri = encodeURI(jsonContent); + var link = document.createElement('a'); + link.setAttribute('href', encodedUri); + link.setAttribute('download', $scope.note.name + '.json'); + link.click(); + }; + //Clone note $scope.cloneNote = function(noteId) { var result = confirm('Do you want to clone this notebook?'); diff --git a/zeppelin-web/src/app/notebook/notebook.html b/zeppelin-web/src/app/notebook/notebook.html index edab9b0ab92..78982495f92 100644 --- a/zeppelin-web/src/app/notebook/notebook.html +++ b/zeppelin-web/src/app/notebook/notebook.html @@ -53,6 +53,13 @@

    > + From e45cf399596be7e30d8bb42a45e700c6898a3f1b Mon Sep 17 00:00:00 2001 From: Luciano Resende Date: Thu, 5 Nov 2015 16:52:58 -0300 Subject: [PATCH 008/491] Correct contact e-mail in documentation config.yml Author: Luciano Resende Closes #393 from lresende/website and squashes the following commits: c167239 [Luciano Resende] Correct contact e-mail in documentation config.yml --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index de3d99a4a48..ee0e727a4b2 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -14,7 +14,7 @@ title : Apache Zeppelin (incubating) tagline: Simplify bigdata analytics author : name : The Apache Software Foundation - email : contacts@nflabs.com + email : dev@zeppelin.incubator.apache.org github : apache twitter : ASF feedburner : feedname From fd2a28853ec83da975fdffba6f2a5ca198126d4d Mon Sep 17 00:00:00 2001 From: Patrick Ethier Date: Wed, 4 Nov 2015 20:15:33 +0100 Subject: [PATCH 009/491] ZEPPELIN-365: Add credentials for dependency loader Allow to authenticate to Artifactory or any other private maven repository using user/pass via the dependency loader Author: Patrick Ethier Author: Patrick Ethier Author: nuttybrewer Closes #377 from nuttybrewer/master and squashes the following commits: 9745f24 [Patrick Ethier] Update Repository.java 8599240 [Patrick Ethier] Update Repository.java 70de3ec [Patrick Ethier] Update Repository.java 3e395bf [Patrick Ethier] Move to fluent API 6c858e8 [Patrick Ethier] Merge branch 'master' of github.com:apache/incubator-zeppelin 3dcfc1f [Patrick Ethier] Update Repository.java 361291a [Patrick Ethier] Update Repository.java 656266a [Patrick Ethier] Update Repository.java 1169f80 [Patrick Ethier] Update spark.md 5b8f357 [Patrick Ethier] Update Repository.java 10c342b [Patrick Ethier] Update DependencyContext.java 57ab930 [Patrick Ethier] Update Repository.java 2b98165 [Patrick Ethier] Update DependencyContext.java b93057d [nuttybrewer] remove return statement for coding style 0c9395c [Patrick Ethier] Merge branch 'master' of github.com:nuttybrewer/incubator-zeppelin e7ece92 [Patrick Ethier] Added addCredential() function to allow for authenticated repositories via dependency loader 0936e89 [Patrick Ethier] Added documentation for new addCredential() function --- docs/docs/interpreter/spark.md | 3 ++ .../zeppelin/spark/dep/DependencyContext.java | 7 +++++ .../apache/zeppelin/spark/dep/Repository.java | 28 ++++++++++++++++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/docs/docs/interpreter/spark.md b/docs/docs/interpreter/spark.md index 871231cada9..06aee94495f 100644 --- a/docs/docs/interpreter/spark.md +++ b/docs/docs/interpreter/spark.md @@ -77,6 +77,9 @@ z.addRepo("RepoName").url("RepoURL") // add maven snapshot repository z.addRepo("RepoName").url("RepoURL").snapshot() +// add credentials for private maven repository +z.addRepo("RepoName").url("RepoURL).username("username").password("password") + // add artifact from filesystem z.load("/path/to.jar") diff --git a/spark/src/main/java/org/apache/zeppelin/spark/dep/DependencyContext.java b/spark/src/main/java/org/apache/zeppelin/spark/dep/DependencyContext.java index 0f465f1c200..834e5186f9c 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/dep/DependencyContext.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/dep/DependencyContext.java @@ -21,6 +21,8 @@ import java.net.MalformedURLException; import java.util.LinkedList; import java.util.List; +import java.util.Map; +import java.util.HashMap; import org.sonatype.aether.RepositorySystem; import org.sonatype.aether.RepositorySystemSession; @@ -28,6 +30,7 @@ import org.sonatype.aether.collection.CollectRequest; import org.sonatype.aether.graph.DependencyFilter; import org.sonatype.aether.repository.RemoteRepository; +import org.sonatype.aether.repository.Authentication; import org.sonatype.aether.resolution.ArtifactResolutionException; import org.sonatype.aether.resolution.ArtifactResult; import org.sonatype.aether.resolution.DependencyRequest; @@ -153,6 +156,10 @@ private List fetchArtifactWithDep(Dependency dep) for (Repository repo : repositories) { RemoteRepository rr = new RemoteRepository(repo.getName(), "default", repo.getUrl()); rr.setPolicy(repo.isSnapshot(), null); + Authentication auth = repo.getAuthentication(); + if (auth != null) { + rr.setAuthentication(auth); + } collectRequest.addRepository(rr); } diff --git a/spark/src/main/java/org/apache/zeppelin/spark/dep/Repository.java b/spark/src/main/java/org/apache/zeppelin/spark/dep/Repository.java index 49c6c9b164d..aee56b569d7 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/dep/Repository.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/dep/Repository.java @@ -16,7 +16,7 @@ */ package org.apache.zeppelin.spark.dep; - +import org.sonatype.aether.repository.Authentication; /** * * @@ -25,6 +25,8 @@ public class Repository { private boolean snapshot = false; private String name; private String url; + private String username = null; + private String password = null; public Repository(String name){ this.name = name; @@ -51,4 +53,28 @@ public String getName() { public String getUrl() { return url; } + + public Repository username(String username) { + this.username = username; + return this; + } + + public Repository password(String password) { + this.password = password; + return this; + } + + public Repository credentials(String username, String password) { + this.username = username; + this.password = password; + return this; + } + + protected Authentication getAuthentication() { + Authentication auth = null; + if (this.username != null && this.password != null) { + auth = new Authentication(this.username, this.password); + } + return auth; + } } From ae08e713e43ce9ebfb11f0f9cf7a7ea42885d677 Mon Sep 17 00:00:00 2001 From: Khalid Huseynov Date: Wed, 28 Oct 2015 20:40:16 +0900 Subject: [PATCH 010/491] ZEPPELIN-367 Sync with secondary storage when listing notebooks This PR resolves https://issues.apache.org/jira/browse/ZEPPELIN-367 by synchronizing with secondary storage when reloading all notebooks into memory. Currently, existing `ZEPPELIN_NOTEBOOK_RELOAD_FROM_STORAGE` from https://github.com/apache/incubator-zeppelin/pull/331 is used as a flag since these functionalities are correlated, however it can be separated into distinct flag as well. Author: Khalid Huseynov Closes #375 from khalidhuseynov/sync-on-list and squashes the following commits: e2cf5d9 [Khalid Huseynov] minor fix 878a23e [Khalid Huseynov] initial working commit --- .../notebook/repo/NotebookRepoSync.java | 6 ++++ .../notebook/repo/NotebookRepoSyncTest.java | 35 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoSync.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoSync.java index 288cff97671..49f40fcdd70 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoSync.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoSync.java @@ -42,12 +42,15 @@ public class NotebookRepoSync implements NotebookRepo{ private static final int maxRepoNum = 2; private static final String pushKey = "pushNoteIDs"; private static final String pullKey = "pullNoteIDs"; + private static ZeppelinConfiguration config; /** * @param (conf) * @throws - Exception */ public NotebookRepoSync(ZeppelinConfiguration conf) throws Exception { + + config = conf; String allStorageClassNames = conf.getString(ConfVars.ZEPPELIN_NOTEBOOK_STORAGE).trim(); if (allStorageClassNames.isEmpty()) { @@ -72,6 +75,9 @@ public NotebookRepoSync(ZeppelinConfiguration conf) throws Exception { /* by default lists from first repository */ public List list() throws IOException { + if (config.getBoolean(ConfVars.ZEPPELIN_NOTEBOOK_RELOAD_FROM_STORAGE) && getRepoCount() > 1) { + sync(0, 1); + } return getRepo(0).list(); } diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java index 981ed6e2451..bfc6561d571 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java @@ -25,6 +25,7 @@ import java.io.File; import java.io.IOException; +import org.apache.commons.io.FileUtils; import org.apache.zeppelin.conf.ZeppelinConfiguration; import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars; import org.apache.zeppelin.interpreter.InterpreterFactory; @@ -180,6 +181,40 @@ public void testSyncUpdateMain() throws IOException { notebookRepoSync.list(1).get(0).getId()).getLastParagraph().getId()); } + @Test + public void testSyncOnList() throws IOException { + + /* check that both storage repos are empty */ + assertTrue(notebookRepoSync.getRepoCount() > 1); + assertEquals(0, notebookRepoSync.list(0).size()); + assertEquals(0, notebookRepoSync.list(1).size()); + + File srcDir = new File("src/test/resources/2A94M5J1Z"); + File destDir = new File(secNotebookDir + "/2A94M5J1Z"); + + /* copy manually new notebook into secondary storage repo and check repos */ + try { + FileUtils.copyDirectory(srcDir, destDir); + } catch (IOException e) { + e.printStackTrace(); + } + assertEquals(0, notebookRepoSync.list(0).size()); + assertEquals(1, notebookRepoSync.list(1).size()); + + /* Although new notebook is added to secondary storage it's not displayed + * on list() with ZEPPELIN_NOTEBOOK_RELOAD_FROM_STORAGE set to false + */ + System.setProperty(ConfVars.ZEPPELIN_NOTEBOOK_RELOAD_FROM_STORAGE.getVarName(), "false"); + assertEquals(0, notebookRepoSync.list().size()); + + /* notebook is synced after ZEPPELIN_NOTEBOOK_RELOAD_FROM_STORAGE variable is set to true */ + System.setProperty(ConfVars.ZEPPELIN_NOTEBOOK_RELOAD_FROM_STORAGE.getVarName(), "true"); + assertEquals(1, notebookRepoSync.list().size()); + + assertEquals(1, notebookRepoSync.list(0).size()); + assertEquals(1, notebookRepoSync.list(1).size()); + } + private void delete(File file){ if(file.isFile()) file.delete(); else if(file.isDirectory()){ From cd0010d69be4e58ca5c92d984e61729ebde63174 Mon Sep 17 00:00:00 2001 From: Tomas Date: Thu, 5 Nov 2015 12:56:32 +0100 Subject: [PATCH 011/491] added hint to errror message %dep interpreter gives meaningless(for newbies) error message if it is not executed as the first snippet. Whit this hint it should be clear what to do to get rid of the problem Author: Tomas Closes #383 from xhudik/patch-4 and squashes the following commits: 8ce0f8f [Tomas] paragraph instead of cell aa16656 [Tomas] added Interpreter restart option 674cb66 [Tomas] cell instead of snippet 9c3af9f [Tomas] formatting c8c5649 [Tomas] added hint to errror message --- .../main/java/org/apache/zeppelin/spark/DepInterpreter.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spark/src/main/java/org/apache/zeppelin/spark/DepInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/DepInterpreter.java index c4614bf6803..67eadadb8d5 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/DepInterpreter.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/DepInterpreter.java @@ -183,7 +183,9 @@ public InterpreterResult interpret(String st, InterpreterContext context) { if (sparkInterpreter != null && sparkInterpreter.isSparkContextInitialized()) { return new InterpreterResult(Code.ERROR, - "Must be used before SparkInterpreter (%spark) initialized"); + "Must be used before SparkInterpreter (%spark) initialized\n" + + "Hint: put this paragraph before any Spark code and " + + "restart Zeppelin/Interpreter" ); } scala.tools.nsc.interpreter.Results.Result ret = intp.interpret(st); From 8b7556df11c732029d694bbd492b0d30865d3b0c Mon Sep 17 00:00:00 2001 From: DuyHai DOAN Date: Mon, 2 Nov 2015 12:57:29 +0100 Subject: [PATCH 012/491] =?UTF-8?q?[ZEPPELIN-382]=20Add=20Documentation=20?= =?UTF-8?q?for=20Cassandra=20interpreter=20in=20the=20doc=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Linked **[JIRA]** [JIRA]: https://issues.apache.org/jira/browse/ZEPPELIN-382?jql=project%20%3D%20ZEPPELIN Author: DuyHai DOAN Closes #384 from doanduyhai/CassandraInterpreterDocumentation and squashes the following commits: b0bf36a [DuyHai DOAN] [ZEPPELIN-382] Add Documentation for Cassandra interpreter in the doc pages --- .../img/docs-img/cassandra-DescribeSchema.png | Bin 0 -> 33600 bytes .../docs-img/cassandra-InteractiveHelp.png | Bin 0 -> 84626 bytes .../docs-img/cassandra-InterpreterBinding.png | Bin 0 -> 16963 bytes ...cassandra-InterpreterInstanceSelection.png | Bin 0 -> 24970 bytes .../docs-img/cassandra-InterpreterName.png | Bin 0 -> 26762 bytes .../cassandra-InterpreterSelection.png | Bin 0 -> 36754 bytes .../cassandra-NewInterpreterInList.png | Bin 0 -> 6518 bytes .../cassandra-NewInterpreterInstance.png | Bin 0 -> 23552 bytes docs/docs/index.md | 5 +- docs/docs/interpreter/cassandra.md | 807 ++++++++++++++++++ 10 files changed, 810 insertions(+), 2 deletions(-) create mode 100644 docs/assets/themes/zeppelin/img/docs-img/cassandra-DescribeSchema.png create mode 100644 docs/assets/themes/zeppelin/img/docs-img/cassandra-InteractiveHelp.png create mode 100644 docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterBinding.png create mode 100644 docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterInstanceSelection.png create mode 100644 docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterName.png create mode 100644 docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterSelection.png create mode 100644 docs/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInList.png create mode 100644 docs/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInstance.png create mode 100644 docs/docs/interpreter/cassandra.md diff --git a/docs/assets/themes/zeppelin/img/docs-img/cassandra-DescribeSchema.png b/docs/assets/themes/zeppelin/img/docs-img/cassandra-DescribeSchema.png new file mode 100644 index 0000000000000000000000000000000000000000..940ec2fd0fdfc89b778a080d101a8214d70ae38d GIT binary patch literal 33600 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 z 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

    N(qiM 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�K{e(1uVt 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±@^o-Yy5P}6OrcaPe$op$ISQVBf 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 literal 0 HcmV?d00001 diff --git a/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterBinding.png b/docs/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterBinding.png new file mode 100644 index 0000000000000000000000000000000000000000..aae9a22d544eb1faf27d00da66f2ceb21af5fa71 GIT binary patch literal 16963 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�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 literal 0 HcmV?d00001 diff --git a/docs/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInstance.png b/docs/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInstance.png new file mode 100644 index 0000000000000000000000000000000000000000..36f6c3e104512b55a2a709aee97e1c31868c4d17 GIT binary patch literal 23552 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 literal 0 HcmV?d00001 diff --git a/docs/docs/index.md b/docs/docs/index.md index 6a0d341729e..11c35da4e74 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -19,16 +19,17 @@ group: nav-right **[Interpreters in zeppelin](manual/interpreters.html)** +* [cassandra](./interpreter/cassandra.html) * [flink](./interpreter/flink.html) +* [geode](./interpreter/geode.html) * [hive](../docs/pleasecontribute.html) * [ignite](./interpreter/ignite.html) * [lens](./interpreter/lens.html) * [md](../docs/pleasecontribute.html) +* [postgresql, hawq](./interpreter/postgresql.html) * [sh](../docs/pleasecontribute.html) * [spark](./interpreter/spark.html) * [tajo](../docs/pleasecontribute.html) -* [postgresql, hawq](./interpreter/postgresql.html) -* [geode](./interpreter/geode.html) ### Display System diff --git a/docs/docs/interpreter/cassandra.md b/docs/docs/interpreter/cassandra.md new file mode 100644 index 00000000000..b53295c1468 --- /dev/null +++ b/docs/docs/interpreter/cassandra.md @@ -0,0 +1,807 @@ +--- +layout: page +title: "Cassandra Interpreter" +description: "Cassandra Interpreter" +group: manual +--- +{% include JB/setup %} + +


    +## 1. Cassandra CQL Interpreter for Apache Zeppelin + +
    +

    + + + + + + + + + + +
    NameClassDescription
    %cassandraCassandraInterpreterProvides interpreter for Apache Cassandra CQL query language
    + +
    + +## 2. Enabling Cassandra Interpreter + + In a notebook, to enable the **Cassandra** interpreter, click on the **Gear** icon and select **Cassandra** + +
    + ![Interpreter Binding](/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterBinding.png) + + ![Interpreter Selection](/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterSelection.png) +
    + +
    + +## 3. Using the Cassandra Interpreter + + In a paragraph, use **_%cassandra_** to select the **Cassandra** interpreter and then input all commands. + + To access the interactive help, type **HELP;** + +
    + ![Interactive Help](/assets/themes/zeppelin/img/docs-img/cassandra-InteractiveHelp.png) +
    + +
    + +## 4. Interpreter Commands + + The **Cassandra** interpreter accepts the following commands + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Command TypeCommand NameDescription
    Help commandHELPDisplay the interactive help menu
    Schema commandsDESCRIBE KEYSPACE, DESCRIBE CLUSTER, DESCRIBE TABLES ...Custom commands to describe the Cassandra schema
    Option commands@consistency, @retryPolicy, @fetchSize ...Inject runtime options to all statements in the paragraph
    Prepared statement commands@prepare, @bind, @remove_preparedLet you register a prepared command and re-use it later by injecting bound values
    Native CQL statementsAll CQL-compatible statements (SELECT, INSERT, CREATE ...)All CQL statements are executed directly against the Cassandra server
    +
    + +
    +## 5. CQL statements + +This interpreter is compatible with any CQL statement supported by Cassandra. Ex: + +```sql + + INSERT INTO users(login,name) VALUES('jdoe','John DOE'); + SELECT * FROM users WHERE login='jdoe'; +``` + +Each statement should be separated by a semi-colon ( **;** ) except the special commands below: + +1. @prepare +2. @bind +3. @remove_prepare +4. @consistency +5. @serialConsistency +6. @timestamp +7. @retryPolicy +8. @fetchSize + +Multi-line statements as well as multiple statements on the same line are also supported as long as they are +separated by a semi-colon. Ex: + +```sql + + USE spark_demo; + + SELECT * FROM albums_by_country LIMIT 1; SELECT * FROM countries LIMIT 1; + + SELECT * + FROM artists + WHERE login='jlennon'; +``` + +Batch statements are supported and can span multiple lines, as well as DDL(CREATE/ALTER/DROP) statements: + +```sql + + BEGIN BATCH + INSERT INTO users(login,name) VALUES('jdoe','John DOE'); + INSERT INTO users_preferences(login,account_type) VALUES('jdoe','BASIC'); + APPLY BATCH; + + CREATE TABLE IF NOT EXISTS test( + key int PRIMARY KEY, + value text + ); +``` + +CQL statements are case-insensitive (except for column names and values). +This means that the following statements are equivalent and valid: + +```sql + + INSERT INTO users(login,name) VALUES('jdoe','John DOE'); + Insert into users(login,name) vAlues('hsue','Helen SUE'); +``` + +The complete list of all CQL statements and versions can be found below: +
    + + + + + + + + + + + + + + + + + +
    Cassandra VersionDocumentation Link
    2.2 + + http://docs.datastax.com/en/cql/3.3/cql/cqlIntro.html + +
    2.1 & 2.0 + + http://docs.datastax.com/en/cql/3.1/cql/cql_intro_c.html + +
    1.2 + + http://docs.datastax.com/en/cql/3.0/cql/aboutCQL.html + +
    +
    + +
    + +## 6. Comments in statements + +It is possible to add comments between statements. Single line comments start with the hash sign (#). Multi-line comments are enclosed between /** and **/. Ex: + +```sql + + #First comment + INSERT INTO users(login,name) VALUES('jdoe','John DOE'); + + /** + Multi line + comments + **/ + Insert into users(login,name) vAlues('hsue','Helen SUE'); +``` + +
    + +## 7. Syntax Validation + +The interpreters is shipped with a built-in syntax validator. This validator only checks for basic syntax errors. +All CQL-related syntax validation is delegated directly to **Cassandra** + +Most of the time, syntax errors are due to **missing semi-colons** between statements or **typo errors**. + +
    + +## 8. Schema commands + +To make schema discovery easier and more interactive, the following commands are supported: +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CommandDescription
    DESCRIBE CLUSTER;Show the current cluster name and its partitioner
    DESCRIBE KEYSPACES;List all existing keyspaces in the cluster and their configuration (replication factor, durable write ...)
    DESCRIBE TABLES;List all existing keyspaces in the cluster and for each, all the tables name
    DESCRIBE TYPES;List all existing user defined types in the current (logged) keyspace
    DESCRIBE FUNCTIONS <keyspace_name>;List all existing user defined functions in the given keyspace
    DESCRIBE AGGREGATES <keyspace_name>;List all existing user defined aggregates in the given keyspace
    DESCRIBE KEYSPACE <keyspace_name>;Describe the given keyspace configuration and all its table details (name, columns, ...)
    DESCRIBE TABLE (<keyspace_name>).<table_name>; + Describe the given table. If the keyspace is not provided, the current logged in keyspace is used. + If there is no logged in keyspace, the default system keyspace is used. + If no table is found, an error message is raised +
    DESCRIBE TYPE (<keyspace_name>).<type_name>; + Describe the given type(UDT). If the keyspace is not provided, the current logged in keyspace is used. + If there is no logged in keyspace, the default system keyspace is used. + If no type is found, an error message is raised +
    DESCRIBE FUNCTION (<keyspace_name>).<function_name>;Describe the given user defined function. The keyspace is optional
    DESCRIBE AGGREGATE (<keyspace_name>).<aggregate_name>;Describe the given user defined aggregate. The keyspace is optional
    +
    + +The schema objects (cluster, keyspace, table, type, function and aggregate) are displayed in a tabular format. +There is a drop-down menu on the top left corner to expand objects details. On the top right menu is shown the Icon legend. + +
    +
    + ![Describe Schema](/assets/themes/zeppelin/img/docs-img/cassandra-DescribeSchema.png) +
    + +
    + +## 9. Runtime Parameters + +Sometimes you want to be able to pass runtime query parameters to your statements. +Those parameters are not part of the CQL specs and are specific to the interpreter. +Below is the list of all parameters: + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterSyntaxDescription
    Consistency Level@consistency=valueApply the given consistency level to all queries in the paragraph
    Serial Consistency Level@serialConsistency=valueApply the given serial consistency level to all queries in the paragraph
    Timestamp@timestamp=long value + Apply the given timestamp to all queries in the paragraph. + Please note that timestamp value passed directly in CQL statement will override this value +
    Retry Policy@retryPolicy=valueApply the given retry policy to all queries in the paragraph
    Fetch Size@fetchSize=integer valueApply the given fetch size to all queries in the paragraph
    +
    + + Some parameters only accept restricted values: + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    ParameterPossible Values
    Consistency LevelALL, ANY, ONE, TWO, THREE, QUORUM, LOCAL_ONE, LOCAL_QUORUM, EACH_QUORUM
    Serial Consistency LevelSERIAL, LOCAL_SERIAL
    TimestampAny long value
    Retry PolicyDEFAULT, DOWNGRADING_CONSISTENCY, FALLTHROUGH, LOGGING_DEFAULT, LOGGING_DOWNGRADING, LOGGING_FALLTHROUGH
    Fetch SizeAny integer value
    +
    + +>Please note that you should **not** add semi-colon ( **;** ) at the end of each parameter statement + +Some examples: + +```sql + + CREATE TABLE IF NOT EXISTS spark_demo.ts( + key int PRIMARY KEY, + value text + ); + TRUNCATE spark_demo.ts; + + # Timestamp in the past + @timestamp=10 + + # Force timestamp directly in the first insert + INSERT INTO spark_demo.ts(key,value) VALUES(1,'first insert') USING TIMESTAMP 100; + + # Select some data to make the clock turn + SELECT * FROM spark_demo.albums LIMIT 100; + + # Now insert using the timestamp parameter set at the beginning(10) + INSERT INTO spark_demo.ts(key,value) VALUES(1,'second insert'); + + # Check for the result. You should see 'first insert' + SELECT value FROM spark_demo.ts WHERE key=1; +``` + +Some remarks about query parameters: + +> 1. **many** query parameters can be set in the same paragraph +> 2. if the **same** query parameter is set many time with different values, the interpreter only take into account the first value +> 3. each query parameter applies to **all CQL statements** in the same paragraph, unless you override the option using plain CQL text (like forcing timestamp with the USING clause) +> 4. the order of each query parameter with regard to CQL statement does not matter + +
    + +## 10. Support for Prepared Statements + +For performance reason, it is better to prepare statements before-hand and reuse them later by providing bound values. +This interpreter provides 3 commands to handle prepared and bound statements: + +1. **@prepare** +2. **@bind** +3. **@remove_prepared** + +Example: + +``` + + @prepare[statement_name]=... + + @bind[statement_name]=’text’, 1223, ’2015-07-30 12:00:01’, null, true, [‘list_item1’, ’list_item2’] + + @bind[statement_name_with_no_bound_value] + + @remove_prepare[statement_name] +``` + +
    +#### a. @prepare +
    +You can use the syntax _"@prepare[statement_name]=SELECT ..."_ to create a prepared statement. +The _statement_name_ is **mandatory** because the interpreter prepares the given statement with the Java driver and +saves the generated prepared statement in an **internal hash map**, using the provided _statement_name_ as search key. + +> Please note that this internal prepared statement map is shared with **all notebooks** and **all paragraphs** because +there is only one instance of the interpreter for Cassandra + +> If the interpreter encounters **many** @prepare for the **same _statement_name_ (key)**, only the **first** statement will be taken into account. + +Example: + +``` + + @prepare[select]=SELECT * FROM spark_demo.albums LIMIT ? + + @prepare[select]=SELECT * FROM spark_demo.artists LIMIT ? +``` + +For the above example, the prepared statement is _SELECT * FROM spark_demo.albums LIMIT ?_. +_SELECT * FROM spark_demo.artists LIMIT ?_ is ignored because an entry already exists in the prepared statements map with the key select. + +In the context of **Zeppelin**, a notebook can be scheduled to be executed at regular interval, +thus it is necessary to **avoid re-preparing many time the same statement (considered an anti-pattern)**. +
    +
    +#### b. @bind +
    +Once the statement is prepared (possibly in a separated notebook/paragraph). You can bind values to it: + +``` + @bind[select_first]=10 +``` + +Bound values are not mandatory for the **@bind** statement. However if you provide bound values, they need to comply to some syntax: + +* String values should be enclosed between simple quotes ( ‘ ) +* Date values should be enclosed between simple quotes ( ‘ ) and respect the formats: + 1. yyyy-MM-dd HH:MM:ss + 2. yyyy-MM-dd HH:MM:ss.SSS +* **null** is parsed as-is +* **boolean** (true|false) are parsed as-is +* collection values must follow the **[standard CQL syntax]**: + * list: [‘list_item1’, ’list_item2’, ...] + * set: {‘set_item1’, ‘set_item2’, …} + * map: {‘key1’: ‘val1’, ‘key2’: ‘val2’, …} +* **tuple** values should be enclosed between parenthesis (see **[Tuple CQL syntax]**): (‘text’, 123, true) +* **udt** values should be enclosed between brackets (see **[UDT CQL syntax]**): {stree_name: ‘Beverly Hills’, number: 104, zip_code: 90020, state: ‘California’, …} + +> It is possible to use the @bind statement inside a batch: +> +> ```sql +> +> BEGIN BATCH +> @bind[insert_user]='jdoe','John DOE' +> UPDATE users SET age = 27 WHERE login='hsue'; +> APPLY BATCH; +> ``` + +
    +#### c. @remove_prepare +
    +To avoid for a prepared statement to stay forever in the prepared statement map, you can use the +**@remove_prepare[statement_name]** syntax to remove it. +Removing a non-existing prepared statement yields no error. + +
    + +## 11. Using Dynamic Forms + +Instead of hard-coding your CQL queries, it is possible to use the mustache syntax ( **\{\{ \}\}** ) to inject simple value or multiple choices forms. + +The syntax for simple parameter is: **\{\{input_Label=default value\}\}**. The default value is mandatory because the first time the paragraph is executed, +we launch the CQL query before rendering the form so at least one value should be provided. + +The syntax for multiple choices parameter is: **\{\{input_Label=value1 | value2 | … | valueN \}\}**. By default the first choice is used for CQL query +the first time the paragraph is executed. + +Example: + +{% raw %} + #Secondary index on performer style + SELECT name, country, performer + FROM spark_demo.performers + WHERE name='{{performer=Sheryl Crow|Doof|Fanfarlo|Los Paranoia}}' + AND styles CONTAINS '{{style=Rock}}'; +{% endraw %} + + +In the above example, the first CQL query will be executed for _performer='Sheryl Crow' AND style='Rock'_. +For subsequent queries, you can change the value directly using the form. + +> Please note that we enclosed the **\{\{ \}\}** block between simple quotes ( **'** ) because Cassandra expects a String here. +> We could have also use the **\{\{style='Rock'\}\}** syntax but this time, the value displayed on the form is **_'Rock'_** and not **_Rock_**. + +It is also possible to use dynamic forms for **prepared statements**: + +{% raw %} + + @bind[select]=='{{performer=Sheryl Crow|Doof|Fanfarlo|Los Paranoia}}', '{{style=Rock}}' + +{% endraw %} + +
    + +## 12. Execution parallelism and shared states + +It is possible to execute many paragraphs in parallel. However, at the back-end side, we’re still using synchronous queries. +_Asynchronous execution_ is only possible when it is possible to return a `Future` value in the `InterpreterResult`. +It may be an interesting proposal for the **Zeppelin** project. + +Another caveat is that the same `com.datastax.driver.core.Session` object is used for **all** notebooks and paragraphs. +Consequently, if you use the **USE _keyspace name_;** statement to log into a keyspace, it will change the keyspace for +**all current users** of the **Cassandra** interpreter because we only create 1 `com.datastax.driver.core.Session` object +per instance of **Cassandra** interpreter. + +The same remark does apply to the **prepared statement hash map**, it is shared by **all users** using the same instance of **Cassandra** interpreter. + +Until **Zeppelin** offers a real multi-users separation, there is a work-around to segregate user environment and states: +_create different **Cassandra** interpreter instances_ + +For this, first go to the **Interpreter** menu and click on the **Create** button +
    +
    +
    + ![Create Interpreter](/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInstance.png) +
    + +In the interpreter creation form, put **cass-instance2** as **Name** and select the **cassandra** +in the interpreter drop-down list +
    +
    +
    + ![Interpreter Name](/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterName.png) +
    + + Click on **Save** to create the new interpreter instance. Now you should be able to see it in the interpreter list. + +
    +
    +
    + ![Interpreter In List](/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInList.png) +
    + +Go back to your notebook and click on the **Gear** icon to configure interpreter bindings. +You should be able to see and select the **cass-instance2** interpreter instance in the available +interpreter list instead of the standard **cassandra** instance. + +
    +
    +
    + ![Interpreter Instance Selection](/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterInstanceSelection.png) +
    + +
    + +## 13. Interpreter Configuration + +To configure the **Cassandra** interpreter, go to the **Interpreter** menu and scroll down to change the parameters. +The **Cassandra** interpreter is using the official **[Cassandra Java Driver]** and most of the parameters are used +to configure the Java driver + +Below are the configuration parameters and their default value. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Property NameDescriptionDefault Value
    cassandra.clusterName of the Cassandra cluster to connect toTest Cluster
    cassandra.compression.protocolOn wire compression. Possible values are: NONE, SNAPPY, LZ4NONE
    cassandra.credentials.usernameIf security is enable, provide the loginnone
    cassandra.credentials.passwordIf security is enable, provide the passwordnone
    cassandra.hosts + Comma separated Cassandra hosts (DNS name or IP address). +
    + Ex: '192.168.0.12,node2,node3' +
    localhost
    cassandra.interpreter.parallelismNumber of concurrent paragraphs(queries block) that can be executed10
    cassandra.keyspace + Default keyspace to connect to. + + It is strongly recommended to let the default value + and prefix the table name with the actual keyspace + in all of your queries + + system
    cassandra.load.balancing.policy + Load balancing policy. Default = new TokenAwarePolicy(new DCAwareRoundRobinPolicy()) + To Specify your own policy, provide the fully qualify class name (FQCN) of your policy. + At runtime the interpreter will instantiate the policy using + Class.forName(FQCN) + DEFAULT
    cassandra.max.schema.agreement.wait.secondCassandra max schema agreement wait in second10
    cassandra.pooling.core.connection.per.host.localProtocol V2 and below default = 2. Protocol V3 and above default = 12
    cassandra.pooling.core.connection.per.host.remoteProtocol V2 and below default = 1. Protocol V3 and above default = 11
    cassandra.pooling.heartbeat.interval.secondsCassandra pool heartbeat interval in secs30
    cassandra.pooling.idle.timeout.secondsCassandra idle time out in seconds120
    cassandra.pooling.max.connection.per.host.localProtocol V2 and below default = 8. Protocol V3 and above default = 18
    cassandra.pooling.max.connection.per.host.remoteProtocol V2 and below default = 2. Protocol V3 and above default = 12
    cassandra.pooling.max.request.per.connection.localProtocol V2 and below default = 128. Protocol V3 and above default = 1024128
    cassandra.pooling.max.request.per.connection.remoteProtocol V2 and below default = 128. Protocol V3 and above default = 256128
    cassandra.pooling.new.connection.threshold.localProtocol V2 and below default = 100. Protocol V3 and above default = 800100
    cassandra.pooling.new.connection.threshold.remoteProtocol V2 and below default = 100. Protocol V3 and above default = 200100
    cassandra.pooling.pool.timeout.millisecsCassandra pool time out in millisecs5000
    cassandra.protocol.versionCassandra binary protocol version3
    cassandra.query.default.consistency + Cassandra query default consistency level +
    + Available values: ONE, TWO, THREE, QUORUM, LOCAL_ONE, LOCAL_QUORUM, EACH_QUORUM, ALL +
    ONE
    cassandra.query.default.fetchSizeCassandra query default fetch size5000
    cassandra.query.default.serial.consistency + Cassandra query default serial consistency level +
    + Available values: SERIAL, LOCAL_SERIAL +
    SERIAL
    cassandra.reconnection.policy + Cassandra Reconnection Policy. + Default = new ExponentialReconnectionPolicy(1000, 10 * 60 * 1000) + To Specify your own policy, provide the fully qualify class name (FQCN) of your policy. + At runtime the interpreter will instantiate the policy using + Class.forName(FQCN) + DEFAULT
    cassandra.retry.policy + Cassandra Retry Policy. + Default = DefaultRetryPolicy.INSTANCE + To Specify your own policy, provide the fully qualify class name (FQCN) of your policy. + At runtime the interpreter will instantiate the policy using + Class.forName(FQCN) + DEFAULT
    cassandra.socket.connection.timeout.millisecsCassandra socket default connection timeout in millisecs500
    cassandra.socket.read.timeout.millisecsCassandra socket read timeout in millisecs12000
    cassandra.socket.tcp.no_delayCassandra socket TCP no delaytrue
    cassandra.speculative.execution.policy + Cassandra Speculative Execution Policy. + Default = NoSpeculativeExecutionPolicy.INSTANCE + To Specify your own policy, provide the fully qualify class name (FQCN) of your policy. + At runtime the interpreter will instantiate the policy using + Class.forName(FQCN) + DEFAULT
    + +
    + +## 14. Bugs & Contacts + + If you encounter a bug for this interpreter, please create a **[JIRA]** ticket and ping me on Twitter + at **[@doanduyhai]** + + +[Cassandra Java Driver]: https://github.com/datastax/java-driver +[standard CQL syntax]: http://docs.datastax.com/en/cql/3.1/cql/cql_using/use_collections_c.html +[Tuple CQL syntax]: http://docs.datastax.com/en/cql/3.1/cql/cql_reference/tupleType.html +[UDT CQL syntax]: http://docs.datastax.com/en/cql/3.1/cql/cql_using/cqlUseUDT.html +[JIRA]: https://issues.apache.org/jira/browse/ZEPPELIN-382?jql=project%20%3D%20ZEPPELIN +[@doanduyhai]: https://twitter.com/doanduyhai From 785ee3c8b46225da75698458acc5b730e8ead542 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Sun, 8 Nov 2015 10:03:34 +0900 Subject: [PATCH 013/491] ZEPPELIN-404 Certain project dependencies are pulled from 3rd parties repos instead of ASF or public Maven https://issues.apache.org/jira/browse/ZEPPELIN-404 This PR removes / move 3rd party repository into profile. cloudera repo is disabled by default and can be activated by -Pvendor-repo Author: Lee moon soo Closes #404 from Leemoonsoo/ZEPPELIN-404 and squashes the following commits: fe403a9 [Lee moon soo] Fix typo. vender-repo -> vendor-repo 5b55ac0 [Lee moon soo] move cloudera repository into profile --- lens/pom.xml | 86 +++++--------------------------------- spark-dependencies/pom.xml | 17 ++++---- spark/pom.xml | 19 +++++---- 3 files changed, 33 insertions(+), 89 deletions(-) diff --git a/lens/pom.xml b/lens/pom.xml index 12f92a96ca5..bb45ac2f938 100644 --- a/lens/pom.xml +++ b/lens/pom.xml @@ -225,80 +225,16 @@ - - - inmobi.repo - https://github.com/InMobi/mvn-repo/raw/master/releases - - false - - - - inmobi.snapshots - https://github.com/InMobi/mvn-repo/raw/master/snapshots - - false - - - true - - - - central - http://repo1.maven.org/maven2 - - false - - - - cloudera - https://repository.cloudera.com/artifactory/cloudera-repos - - true - never - - - false - never - - - - Codehaus repository - http://repository.codehaus.org/ - - false - - - - apache.snapshots.repo - https://repository.apache.org/content/groups/snapshots - Apache Snapshots Repository - - false - - - true - - - - default - https://repository.apache.org/content/groups/public/ - - - projectlombok.org - http://projectlombok.org/mavenrepo - - false - - - - - ext-release-local - http://repo.springsource.org/simple/ext-release-local/ - - false - - - + + + vendor-repo + + + cloudera + https://repository.cloudera.com/artifactory/cloudera-repos/ + + + + diff --git a/spark-dependencies/pom.xml b/spark-dependencies/pom.xml index 8a147578b9d..cf4dfa409ac 100644 --- a/spark-dependencies/pom.xml +++ b/spark-dependencies/pom.xml @@ -54,13 +54,6 @@ 0.8.2.1 - - - cloudera - https://repository.cloudera.com/artifactory/cloudera-repos/ - - - @@ -349,6 +342,16 @@ + + vendor-repo + + + cloudera + https://repository.cloudera.com/artifactory/cloudera-repos/ + + + + spark-1.1 diff --git a/spark/pom.xml b/spark/pom.xml index 6b1768816a9..bca93eca09c 100644 --- a/spark/pom.xml +++ b/spark/pom.xml @@ -43,13 +43,6 @@ 0.8.2.1 - - - cloudera - https://repository.cloudera.com/artifactory/cloudera-repos/ - - - org.slf4j @@ -301,6 +294,18 @@ + + + vendor-repo + + + cloudera + https://repository.cloudera.com/artifactory/cloudera-repos/ + + + + + From d5e8b2201815ddfd3d972f7da4b6e6fbd6ea3816 Mon Sep 17 00:00:00 2001 From: Jeff Steinmetz Date: Sat, 7 Nov 2015 21:24:53 -0800 Subject: [PATCH 014/491] expanded build instructions to describe pyspark, and maven + node.js requirements Author: Jeff Steinmetz Closes #405 from jeffsteinmetz/branch-0.5.5 and squashes the following commits: d59230d [Jeff Steinmetz] use maven 3.3 link in setup example. old links outdated 68cb04b [Jeff Steinmetz] maven install via apt-get clobbers the openjdk-7 install, and installs java6. It also installs an older maven version. Update ubuntu install example. e457745 [Jeff Steinmetz] expanded build instructions to include pyspark, and clarified maven and node.js requirements 27e7930 [Jeff Steinmetz] expanded build instructions to include pyspark, and clarified maven and node.js requirements 1015f86 [Jeff Steinmetz] expanded build instructions to include pyspark, and clarified maven and node.js requirements 9617c01 [Jeff Steinmetz] expanded build instructions to include pyspark, and clarified maven and node.js requirements (cherry picked from commit 197e339d204f77a72a67f8f6033f103d95db338f) Signed-off-by: Lee moon soo --- README.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b2beaa4c090..ff58299733d 100644 --- a/README.md +++ b/README.md @@ -27,75 +27,112 @@ To know more about Zeppelin, visit our web site [http://zeppelin.incubator.apach ### Before Build If you don't have requirements prepared, install it. (The installation method may vary according to your environment, example is for Ubuntu.) + ``` sudo apt-get update -sudo apt-get install openjdk-7-jdk sudo apt-get install git -sudo apt-get install maven +sudo apt-get install openjdk-7-jdk sudo apt-get install npm sudo apt-get install libfontconfig + +# install maven +wget http://www.eu.apache.org/dist/maven/maven-3/3.3.3/binaries/apache-maven-3.3.3-bin.tar.gz +sudo tar -zxf apache-maven-3.3.3-bin.tar.gz -C /usr/local/ +sudo ln -s /usr/local/apache-maven-3.3.3/bin/mvn /usr/local/bin/mvn ``` +_Notes:_ + - Ensure node is installed by running `node --version` + - Ensure maven is running version 3.1.x or higher with `mvn -version` + ### Build -If you want to build Zeppelin from the source, please first clone this repository. And then: +If you want to build Zeppelin from the source, please first clone this repository, then: + ``` mvn clean package -DskipTests ``` -Build with specific Spark version +To build with a specific Spark version, Hadoop version or specific features, define one or more of the `spark`, `pyspark`, `hadoop` and `yarn` profiles, such as: + +``` +-Pspark-1.5 [Version to run in local spark mode] +-Ppyspark [optional: enable PYTHON support in spark via the %pyspark interpreter] +-Pyarn [optional: enable YARN support] +-Dhadoop.version=2.2.0 [hadoop distribution] +-Phadoop-2.2 [hadoop version] +``` + +Currently, final/full distributions run with: + +``` +mvn clean package -Pspark-1.5 -Phadoop-2.4 -Pyarn -Ppyspark +``` Spark 1.5.x + ``` mvn clean package -Pspark-1.5 -Dhadoop.version=2.2.0 -Phadoop-2.2 -DskipTests ``` Spark 1.4.x + ``` mvn clean package -Pspark-1.4 -Dhadoop.version=2.2.0 -Phadoop-2.2 -DskipTests ``` Spark 1.3.x + ``` mvn clean package -Pspark-1.3 -Dhadoop.version=2.2.0 -Phadoop-2.2 -DskipTests ``` Spark 1.2.x + ``` mvn clean package -Pspark-1.2 -Dhadoop.version=2.2.0 -Phadoop-2.2 -DskipTests ``` Spark 1.1.x + ``` mvn clean package -Pspark-1.1 -Dhadoop.version=2.2.0 -Phadoop-2.2 -DskipTests ``` CDH 5.X + ``` mvn clean package -Pspark-1.2 -Dhadoop.version=2.5.0-cdh5.3.0 -Phadoop-2.4 -DskipTests ``` Yarn (Hadoop 2.7.x) + ``` mvn clean package -Pspark-1.4 -Dspark.version=1.4.1 -Dhadoop.version=2.7.0 -Phadoop-2.6 -Pyarn -DskipTests ``` Yarn (Hadoop 2.6.x) + ``` mvn clean package -Pspark-1.1 -Dhadoop.version=2.6.0 -Phadoop-2.6 -Pyarn -DskipTests ``` Yarn (Hadoop 2.4.x) + ``` mvn clean package -Pspark-1.1 -Dhadoop.version=2.4.0 -Phadoop-2.4 -Pyarn -DskipTests ``` Yarn (Hadoop 2.3.x) + ``` mvn clean package -Pspark-1.1 -Dhadoop.version=2.3.0 -Phadoop-2.3 -Pyarn -DskipTests ``` Yarn (Hadoop 2.2.x) + ``` mvn clean package -Pspark-1.1 -Dhadoop.version=2.2.0 -Phadoop-2.2 -Pyarn -DskipTests ``` Ignite (1.1.0-incubating and later) + ``` mvn clean package -Dignite.version=1.1.0-incubating -DskipTests ``` ### Configure If you wish to configure Zeppelin option (like port number), configure the following files: + ``` ./conf/zeppelin-env.sh ./conf/zeppelin-site.xml @@ -140,9 +177,15 @@ Yarn For configuration details check __./conf__ subdirectory. ### Package -To package final distribution do: +To package the final distribution including the compressed archive, run: + + mvn clean package -Pbuild-distr + +To build a distribution with specific profiles, run: + + mvn clean package -Pbuild-distr -Pspark-1.5 -Phadoop-2.4 -Pyarn -Ppyspark - mvn clean package -P build-distr +The profiles `-Pspark-1.5 -Phadoop-2.4 -Pyarn -Ppyspark` can be adjusted if you wish to build to a specific spark versions, or omit support such as `yarn`. The archive is generated under _zeppelin-distribution/target_ directory From d9ddceb3a697f6eb255dbdaef1de146d5ad99178 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Sat, 7 Nov 2015 21:22:07 +0900 Subject: [PATCH 015/491] ZEPPELIN-402 Adjust editor height with consideration of line wrap This PR addresses https://issues.apache.org/jira/browse/ZEPPELIN-402 Now it adjust height correctly with line wrap * When notebook is loaded * When editor change it's contents * When browser window resizes Author: Lee moon soo Closes #399 from Leemoonsoo/ZEPPELIN-402 and squashes the following commits: 4e5e868 [Lee moon soo] Take care linewrap when loading notebook and resizing window --- .../paragraph/paragraph.controller.js | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index 52fe339a343..63c30c49756 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -449,12 +449,15 @@ angular.module('zeppelinWebApp') $scope.editor.setShowFoldWidgets(false); $scope.editor.setHighlightActiveLine(false); $scope.editor.setHighlightGutterLine(false); + $scope.editor.getSession().setUseWrapMode(true); $scope.editor.setTheme('ace/theme/chrome'); $scope.editor.focus(); - var height = $scope.editor.getSession().getScreenLength() * $scope.editor.renderer.lineHeight + $scope.editor.renderer.scrollBar.getWidth(); - setEditorHeight(_editor.container.id, height); - $scope.editor.getSession().setUseWrapMode(true); + autoAdjustEditorHeight(_editor.container.id); + $(window).resize(function(){ + autoAdjustEditorHeight(_editor.container.id); + }); + if (navigator.appVersion.indexOf('Mac') !== -1 ) { $scope.editor.setKeyboardHandler('ace/keyboard/emacs'); } else if (navigator.appVersion.indexOf('Win') !== -1 || @@ -542,11 +545,8 @@ angular.module('zeppelinWebApp') $scope.handleFocus(false); }); - $scope.editor.getSession().on('change', function(e, editSession) { - height = editSession.getScreenLength() * $scope.editor.renderer.lineHeight + $scope.editor.renderer.scrollBar.getWidth(); - setEditorHeight(_editor.container.id, height); - $scope.editor.resize(); + autoAdjustEditorHeight(_editor.container.id); }); $scope.setParagraphMode($scope.editor.getSession(), $scope.editor.getSession().getValue()); @@ -607,8 +607,12 @@ angular.module('zeppelinWebApp') } }; - var setEditorHeight = function(id, height) { + var autoAdjustEditorHeight = function(id) { + var editor = $scope.editor; + var height = editor.getSession().getScreenLength() * editor.renderer.lineHeight + editor.renderer.scrollBar.getWidth(); + $('#' + id).height(height.toString() + 'px'); + editor.resize(); }; $scope.getEditorValue = function() { From 81f02485b31c25876a93a52a00b698ca60c9f8b9 Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 5 Nov 2015 11:19:39 +0100 Subject: [PATCH 016/491] add docs for notebook storage in S3 Author: Victor Closes #392 from vgmartinez/docs_storage and squashes the following commits: 985c4e2 [Victor] add docs for notebook storage in S3 --- docs/docs/index.md | 3 ++ docs/docs/storage/storage.md | 68 ++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 docs/docs/storage/storage.md diff --git a/docs/docs/index.md b/docs/docs/index.md index 11c35da4e74..4eb9d954289 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -31,6 +31,9 @@ group: nav-right * [spark](./interpreter/spark.html) * [tajo](../docs/pleasecontribute.html) +### Storage +* [S3 Storage](./storage/storage.html) + ### Display System * [text](./displaysystem/display.html) diff --git a/docs/docs/storage/storage.md b/docs/docs/storage/storage.md new file mode 100644 index 00000000000..c4855d26b71 --- /dev/null +++ b/docs/docs/storage/storage.md @@ -0,0 +1,68 @@ +--- +layout: page +title: "Storage" +description: "Notebook Storage option for Zeppelin" +group: storage +--- + +### Notebook Storage + +In Zeppelin there are two option for storage Notebook, by default the notebook is storage in the notebook folder in your local File System and the second option is S3. + +
    +#### Notebook Storage in S3 + +For notebook storage in S3 you need the AWS credentials, for this there are three options, the enviroment variable ```AWS_ACCESS_KEY_ID``` and ```AWS_ACCESS_SECRET_KEY```, credentials file in the folder .aws in you home and IAM role for your instance. For complete the need steps is necessary: + +
    +you need the following folder structure on S3 + +``` +bucket_name/ + username/ + notebook/ + +``` + +set the enviroment variable in the file **zeppelin-env.sh**: + +``` +export ZEPPELIN_NOTEBOOK_S3_BUCKET = bucket_name +export ZEPPELIN_NOTEBOOK_S3_USER = username +``` + +in the file **zeppelin-site.xml** uncommet and complete the next property: + +``` + + + zeppelin.notebook.s3.user + username + user name for s3 folder structure + + + zeppelin.notebook.s3.bucket + bucket_name + bucket name for notebook storage + +``` + +uncomment the next property for use S3NotebookRepo class: + +``` + + zeppelin.notebook.storage + org.apache.zeppelin.notebook.repo.S3NotebookRepo + notebook persistence layer implementation + +``` + +comment the next property: + +``` + + zeppelin.notebook.storage + org.apache.zeppelin.notebook.repo.VFSNotebookRepo + notebook persistence layer implementation + +``` From f3de6cd7e16f190b3a75c4dd61ee9fc1c8c2dcb8 Mon Sep 17 00:00:00 2001 From: DuyHai DOAN Date: Fri, 6 Nov 2015 09:29:46 +0100 Subject: [PATCH 017/491] [ZEPPELIN-394] Update cassandra-spark profiles to latest connector versions Below is the version matrix. Updates are in bold
    Maven profile Spark Cassandra connector version
    cassandra-spark-1.1 1.1.1
    cassandra-spark-1.2 1.2.1
    cassandra-spark-1.3 1.3.1
    cassandra-spark-1.4 1.4.0
    cassandra-spark-1.5 1.5.0-M2
    Author: DuyHai DOAN Closes #395 from doanduyhai/SparkCassandraDependenciesUpdate and squashes the following commits: 8b14bea [DuyHai DOAN] Add description for Spark-Cassandra profiles in README 41992b3 [DuyHai DOAN] Update cassandra-spark profiles to latest Spark-Cassandra connector versions --- README.md | 27 ++++++++++++++++++++ spark-dependencies/pom.xml | 51 +++++++++++++++++++++++++++++++++++--- 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ff58299733d..39cb6f015db 100644 --- a/README.md +++ b/README.md @@ -130,6 +130,33 @@ Ignite (1.1.0-incubating and later) mvn clean package -Dignite.version=1.1.0-incubating -DskipTests ``` +Spark-Cassandra integration (Spark 1.1.x) +``` +mvn clean package -Pcassandra-spark-1.1 -Dhadoop.version=2.6.0 -Phadoop-2.6 -DskipTests +``` + +Spark-Cassandra integration (Spark 1.2.x) +``` +mvn clean package -Pcassandra-spark-1.2 -Dhadoop.version=2.6.0 -Phadoop-2.6 -DskipTests +``` + +Spark-Cassandra integration (Spark 1.3.x) +``` +mvn clean package -Pcassandra-spark-1.3 -Dhadoop.version=2.6.0 -Phadoop-2.6 -DskipTests +``` + +Spark-Cassandra integration (Spark 1.4.x) +``` +mvn clean package -Pcassandra-spark-1.4 -Dhadoop.version=2.6.0 -Phadoop-2.6 -DskipTests +``` + +Spark-Cassandra integration (Spark 1.5.x) +``` +mvn clean package -Pcassandra-spark-1.5 -Dhadoop.version=2.6.0 -Phadoop-2.6 -DskipTests +``` + + + ### Configure If you wish to configure Zeppelin option (like port number), configure the following files: diff --git a/spark-dependencies/pom.xml b/spark-dependencies/pom.xml index cf4dfa409ac..8294311544d 100644 --- a/spark-dependencies/pom.xml +++ b/spark-dependencies/pom.xml @@ -435,9 +435,7 @@ com.datastax.spark spark-cassandra-connector_${scala.binary.version} - - 1.3.0-SNAPSHOT + 1.3.1 org.joda @@ -458,6 +456,27 @@
    + + cassandra-spark-1.4 + + 1.4.1 + + + + + com.datastax.spark + spark-cassandra-connector_${scala.binary.version} + 1.4.0 + + + org.joda + joda-convert + + + + + + spark-1.5 @@ -470,7 +489,31 @@ - + + + cassandra-spark-1.5 + + 1.5.1 + com.typesafe.akka + 2.3.11 + 2.5.0 + + + + + com.datastax.spark + spark-cassandra-connector_${scala.binary.version} + 1.5.0-M2 + + + org.joda + joda-convert + + + + + + hadoop-0.23
    Date: Mon, 9 Nov 2015 20:00:51 +0900 Subject: [PATCH 021/491] =?UTF-8?q?[ZEPPELIN-309]=20Redirect=20to=20create?= =?UTF-8?q?d/cloned=20notebook=20page=20on=20notebook=20c=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …reation/clone This PR enables redirecting to new/cloned notebook pages when create/clone notebook event occurs. Author: Mina Lee Closes #309 from minahlee/ZEPPELIN-309 and squashes the following commits: 8611343 [Mina Lee] Update selenium test for opening new created notebook and fix indentation b307483 [Mina Lee] [ZEPPELIN-309] Redirect to created/cloned notebook page on notebook creation/clone --- .../zeppelin/socket/NotebookServer.java | 2 + .../java/org/apache/zeppelin/ZeppelinIT.java | 39 ++++++------------- .../noteName-create/notename.controller.js | 8 ++++ 3 files changed, 21 insertions(+), 28 deletions(-) diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java index 644639f3489..a7a0f4d28e0 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java @@ -397,6 +397,7 @@ private void createNote(WebSocket conn, Notebook notebook, Message message) thro } note.persist(); + addConnectionToNote(note.id(), (NotebookSocket) conn); broadcastNote(note); broadcastNoteList(); } @@ -440,6 +441,7 @@ private void cloneNote(NotebookSocket conn, Notebook notebook, Message fromMessa String noteId = getOpenNoteId(conn); String name = (String) fromMessage.get("name"); Note newNote = notebook.cloneNote(noteId, name); + addConnectionToNote(newNote.id(), (NotebookSocket) conn); broadcastNote(newNote); broadcastNoteList(); } diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinIT.java b/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinIT.java index 215d3de4ef4..dc188f8f96f 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinIT.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinIT.java @@ -165,17 +165,15 @@ public Boolean apply(WebDriver d) { } } - @Test + @Test public void testAngularDisplay() throws InterruptedException{ if (!endToEndTestEnabled()) { return; } + createNewNote(); - String noteName = createNewNoteAndGetName(); - driver.findElement(By.partialLinkText(noteName)).click(); - - // wait for first paragraph's " READY " status text - waitForParagraph(1, "READY"); + // wait for first paragraph's " READY " status text + waitForParagraph(1, "READY"); /* * print angular template @@ -293,7 +291,7 @@ public void testAngularDisplay() throws InterruptedException{ System.out.println("testCreateNotebook Test executed"); } - private String createNewNoteAndGetName() { + private void createNewNote() { List notebookLinks = driver.findElements(By .xpath("//div[contains(@class, \"col-md-4\")]/div/ul/li")); List notebookTitles = new LinkedList(); @@ -301,32 +299,17 @@ private String createNewNoteAndGetName() { notebookTitles.add(el.getText()); } - WebElement createNoteLink = driver.findElement(By.xpath("//div[contains(@class, \"col-md-4\")]/div/h5/a")); - createNoteLink.click(); + WebElement createNoteLink = driver.findElement(By.xpath("//div[contains(@class, \"col-md-4\")]/div/h5/a")); + createNoteLink.click(); - WebDriverWait block = new WebDriverWait(driver, 10); - WebElement modal = block.until(ExpectedConditions.visibilityOfElementLocated(By.id("noteNameModal"))); - WebElement createNoteButton = modal.findElement(By.id("createNoteButton")); - createNoteButton.click(); + WebDriverWait block = new WebDriverWait(driver, 10); + WebElement modal = block.until(ExpectedConditions.visibilityOfElementLocated(By.id("noteNameModal"))); + WebElement createNoteButton = modal.findElement(By.id("createNoteButton")); + createNoteButton.click(); try { Thread.sleep(500); // wait for notebook list updated } catch (InterruptedException e) { } - - List notebookLinksAfterCreate = driver.findElements(By - .xpath("//div[contains(@class, \"col-md-4\")]/div/ul/li")); - - Iterator it = notebookLinksAfterCreate.iterator(); - while (it.hasNext()) { - WebElement newEl = it.next(); - if (notebookTitles.contains(newEl.getText())) { - - it.remove(); - } - } - - assertEquals(1, notebookLinksAfterCreate.size()); - return notebookLinksAfterCreate.get(0).getText(); } } diff --git a/zeppelin-web/src/components/noteName-create/notename.controller.js b/zeppelin-web/src/components/noteName-create/notename.controller.js index 342cad7eb7a..a81ffbad6d3 100644 --- a/zeppelin-web/src/components/noteName-create/notename.controller.js +++ b/zeppelin-web/src/components/noteName-create/notename.controller.js @@ -26,6 +26,14 @@ angular.module('zeppelinWebApp').controller('NotenameCtrl', function($scope, $ro vm.websocketMsgSrv.cloneNotebook(noteId, $scope.note.notename); } }; + + $scope.$on('setNoteContent', function(event, note) { + if(note !== undefined) { + window.location = '#/notebook/' + note.id; + console.log(note); + } + }); + vm.preVisible = function(clone){ var generatedName = vm.generateName(); $scope.note.notename = 'Note ' + generatedName; From 025ba74f33386df99579645a666df15685c0e879 Mon Sep 17 00:00:00 2001 From: Rick Moritz Date: Mon, 21 Sep 2015 19:10:37 +0200 Subject: [PATCH 022/491] ZEPPELIN-315 Fix time-dependant scheduling test test-schedule can fail when it starts late in a second, as the result will then return the next second due to in-system delays (particularly cron not reacting in time to config.put(cron, null)). Adding an additional waiting second before measuring dateFinished allows us to take a value that is independent of a possible lagging execution, waiting another second makes sure that the process has properly stopped. Alternatively, we can test the time and make sure to not write to cron when just before the full second - that would be quicker (less waiting) but slightly more hacky. Please review. Author: Rick Moritz Closes #315 from RPCMoritz/patch-1 and squashes the following commits: 42ed8e1 [Rick Moritz] Fix time-dependant scheduling test --- .../java/org/apache/zeppelin/notebook/NotebookTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java index dad7384ddc8..31f18cf3929 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java @@ -208,13 +208,14 @@ public void testSchedule() throws InterruptedException, IOException{ note.setConfig(config); notebook.refreshCron(note.id()); Thread.sleep(1*1000); - dateFinished = p.getDateFinished(); - assertNotNull(dateFinished); - + // remove cron scheduler. config.put("cron", null); note.setConfig(config); notebook.refreshCron(note.id()); + Thread.sleep(1000); + dateFinished = p.getDateFinished(); + assertNotNull(dateFinished); Thread.sleep(1*1000); assertEquals(dateFinished, p.getDateFinished()); } From 082eae16d620639c06016f38e52a5a398829c66f Mon Sep 17 00:00:00 2001 From: Paul Curtis Date: Tue, 10 Nov 2015 23:33:36 +0000 Subject: [PATCH 023/491] Corrected and updated the MapR Distribution profiles Completed the necessary Spark dependency profiles for the MapR distribution. Also added commented out MapR artifact IDs for the Hive interpreter. Author: Paul Curtis Closes #391 from pfcurtis/master and squashes the following commits: 46c9ce7 [Paul Curtis] Commented out the MapR repository a95ab43 [Paul Curtis] Moved the MapR repository section to the individual profiles. 9e37ce4 [Paul Curtis] Added information on the MapR profiles 7ed07a0 [Paul Curtis] Corrected and updated the MapR Distribution profiles --- README.md | 20 ++++++++ hive/pom.xml | 13 ++++- spark-dependencies/pom.xml | 100 +++++++++++++++++++++++++++++++++++-- 3 files changed, 128 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 39cb6f015db..a3891d370be 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,26 @@ CDH 5.X ``` mvn clean package -Pspark-1.2 -Dhadoop.version=2.5.0-cdh5.3.0 -Phadoop-2.4 -DskipTests ``` +For the MapR Hadoop Distribution, these profiles will handle the Hadoop version. As MapR allows different versions +of Spark to be installed, you should specify which version of Spark is installed on the cluster by adding a Spark profile (-Pspark-1.2, -Pspark-1.3, etc.) as needed. For Hive, check the hive/pom.xml and adjust the version installed as well. The correct Maven +artifacts can be found for every version of MapR at http://doc.mapr.com + +MapR 3.x +``` +mvn clean package -Pmapr3 -DskipTests +``` +MapR 4.0.x +``` +mvn clean package -Pmapr40 -DskipTests +``` +MapR 4.1 +``` +mvn clean package -Pmapr41 -DskipTests +``` +MapR 5.0 +``` +mvn clean package -Pmapr50 -DskipTests +``` Yarn (Hadoop 2.7.x) ``` diff --git a/hive/pom.xml b/hive/pom.xml index 7562c5880a4..f4867d3e150 100644 --- a/hive/pom.xml +++ b/hive/pom.xml @@ -32,10 +32,21 @@ 0.6.0-incubating-SNAPSHOT Zeppelin: Hive interpreter http://www.apache.org - + 0.14.0 2.6.0 + diff --git a/spark-dependencies/pom.xml b/spark-dependencies/pom.xml index 8294311544d..8304761148c 100644 --- a/spark-dependencies/pom.xml +++ b/spark-dependencies/pom.xml @@ -588,16 +588,62 @@ 2.3.0-mapr-4.0.0-FCS 0.7.1 + + + mapr-releases + http://repository.mapr.com/maven/ + false + true + + - mapr4 + mapr40 false - 2.3.0-mapr-4.0.0-FCS - 2.3.0-mapr-4.0.0-FCS + 2.4.1-mapr-1503 + 2.4.1-mapr-1503 + 0.9.3 + + + + org.apache.curator + curator-recipes + 2.4.0 + + + org.apache.zookeeper + zookeeper + + + + + org.apache.zookeeper + zookeeper + 3.4.5-mapr-1503 + + + + + mapr-releases + http://repository.mapr.com/maven/ + false + true + + + + + + mapr41 + + false + + + 2.5.1-mapr-1503 + 2.5.1-mapr-1503 0.7.1 @@ -615,9 +661,55 @@ org.apache.zookeeper zookeeper - 3.4.5-mapr-1406 + 3.4.5-mapr-1503 + + + mapr-releases + http://repository.mapr.com/maven/ + false + true + + + + + + mapr50 + + false + + + 2.7.0-mapr-1506 + 2.7.0-mapr-1506 + 0.9.3 + + + + org.apache.curator + curator-recipes + 2.4.0 + + + org.apache.zookeeper + zookeeper + + + + + org.apache.zookeeper + zookeeper + 3.4.5-mapr-1503 + + + + + mapr-releases + http://repository.mapr.com/maven/ + false + true + + From 748533b2a592280d0b276112d537bef679ab7f0e Mon Sep 17 00:00:00 2001 From: Eric Charles Date: Mon, 9 Nov 2015 17:30:31 +0100 Subject: [PATCH 024/491] ZEPPELIN-383 Override classpath with ZEPPELIN_CLASSPATH_OVERRIDES Prepend ZEPPELIN_CLASSPATH_OVERRIDES environment variable when building CLASSPATH in the shell scripts. This PR replaces the closed #398 and #386 - Sorry for the mess... Author: Eric Charles Closes #412 from echarles/ZEPPELIN-383-CLASSPATH_OVERRIDES and squashes the following commits: 8572ec5 [Eric Charles] Use ZEPPELIN_CLASSPATH_OVERRIDES instead of CLASSPATH_OVERRIDES d63cc55 [Eric Charles] Prepend CLASSPATH_OVERRIDES environment variable when building CLASSPATH in the shell scripts --- bin/interpreter.sh | 4 ++-- bin/zeppelin-daemon.sh | 2 +- bin/zeppelin.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/interpreter.sh b/bin/interpreter.sh index e03a13b0f98..7a21b3e8168 100755 --- a/bin/interpreter.sh +++ b/bin/interpreter.sh @@ -121,9 +121,9 @@ fi CLASSPATH+=":${ZEPPELIN_CLASSPATH}" if [[ -n "${SPARK_SUBMIT}" ]]; then - ${SPARK_SUBMIT} --class ${ZEPPELIN_SERVER} --driver-class-path "${CLASSPATH}" --driver-java-options "${JAVA_INTP_OPTS}" ${SPARK_SUBMIT_OPTIONS} ${SPARK_APP_JAR} ${PORT} & + ${SPARK_SUBMIT} --class ${ZEPPELIN_SERVER} --driver-class-path "${ZEPPELIN_CLASSPATH_OVERRIDESS}:${CLASSPATH}" --driver-java-options "${JAVA_INTP_OPTS}" ${SPARK_SUBMIT_OPTIONS} ${SPARK_APP_JAR} ${PORT} & else - ${ZEPPELIN_RUNNER} ${JAVA_INTP_OPTS} -cp ${CLASSPATH} ${ZEPPELIN_SERVER} ${PORT} & + ${ZEPPELIN_RUNNER} ${JAVA_INTP_OPTS} -cp ${ZEPPELIN_CLASSPATH_OVERRIDESS}:${CLASSPATH} ${ZEPPELIN_SERVER} ${PORT} & fi pid=$! diff --git a/bin/zeppelin-daemon.sh b/bin/zeppelin-daemon.sh index a386f277e5c..6e080895517 100755 --- a/bin/zeppelin-daemon.sh +++ b/bin/zeppelin-daemon.sh @@ -169,7 +169,7 @@ function start() { initialize_default_directories - nohup nice -n $ZEPPELIN_NICENESS $ZEPPELIN_RUNNER $JAVA_OPTS -cp $CLASSPATH $ZEPPELIN_MAIN >> "${ZEPPELIN_OUTFILE}" 2>&1 < /dev/null & + nohup nice -n $ZEPPELIN_NICENESS $ZEPPELIN_RUNNER $JAVA_OPTS -cp $ZEPPELIN_CLASSPATH_OVERRIDES:$CLASSPATH $ZEPPELIN_MAIN >> "${ZEPPELIN_OUTFILE}" 2>&1 < /dev/null & pid=$! if [[ -z "${pid}" ]]; then action_msg "${ZEPPELIN_NAME} start" "${SET_ERROR}" diff --git a/bin/zeppelin.sh b/bin/zeppelin.sh index 695e751839e..17950e8bbdd 100755 --- a/bin/zeppelin.sh +++ b/bin/zeppelin.sh @@ -85,4 +85,4 @@ if [[ ! -d "${ZEPPELIN_NOTEBOOK_DIR}" ]]; then $(mkdir -p "${ZEPPELIN_NOTEBOOK_DIR}") fi -$(exec $ZEPPELIN_RUNNER $JAVA_OPTS -cp $CLASSPATH $ZEPPELIN_SERVER "$@") +$(exec $ZEPPELIN_RUNNER $JAVA_OPTS -cp $ZEPPELIN_CLASSPATH_OVERRIDES:$CLASSPATH $ZEPPELIN_SERVER "$@") From b52c86c0dc0d7edda48060f4a738a6229b4c8ac7 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Wed, 11 Nov 2015 08:29:54 +0900 Subject: [PATCH 025/491] ZEPPELIN-410 Autoscroll only in y axis Addresses https://issues.apache.org/jira/browse/ZEPPELIN-410 Autoscroll scrolls not only vertical, but also horizontal scrollbar. but horizontal scrollbar should not be touched from it. Author: Lee moon soo Closes #419 from Leemoonsoo/ZEPPELIN-410 and squashes the following commits: 214de49 [Lee moon soo] Autoscroll only in y axis --- zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index e9de91c4711..d90f7108c44 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -673,7 +673,7 @@ angular.module('zeppelinWebApp') scrollTargetPos = documentHeight; } } - angular.element('body').scrollTo(scrollTargetPos, {duration:200}); + angular.element('body').scrollTo(scrollTargetPos, {axis: 'y', interrupt: true, duration:200}); }; var setEditorHeight = function(id, height) { From 76cdcd8cdd3a27d007dd767d1fa5ab4af4f17c83 Mon Sep 17 00:00:00 2001 From: Mina Lee Date: Wed, 11 Nov 2015 13:33:04 +0900 Subject: [PATCH 026/491] [ZEPPELIN-407] Improve document on how to manage external libraries in spark interpreter Improve docs on library loading in spark interpreter. * Add information to load libraries using spark properties besides dependency loading using %dep interpreter * State different ways of dependency loading for different version of Zeppelin * Move Spark specific information from install.md to spark.md Author: Mina Lee Closes #410 from minahlee/ZEPPELIN-407 and squashes the following commits: 8f62790 [Mina Lee] [ZEPPELIN-407] Improve document on how to manage external libraries in spark interpreter 857d10b [Mina Lee] [ZEPPELIN-407] Improve document on how to manage external libraries in spark interpreter --- docs/docs/install/install.md | 10 ------ docs/docs/interpreter/spark.md | 61 ++++++++++++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 13 deletions(-) diff --git a/docs/docs/install/install.md b/docs/docs/install/install.md index 03bc6f93bbb..2dc49304c8d 100644 --- a/docs/docs/install/install.md +++ b/docs/docs/install/install.md @@ -101,16 +101,6 @@ Configuration can be done by both environment variable(conf/zeppelin-env.sh) and JVM Options -#### Add jars, files - -spark.jars, spark.files property in *ZEPPELIN\_JAVA\_OPTS* adds jars, files into SparkContext. -for example, - - ZEPPELIN_JAVA_OPTS="-Dspark.jars=/mylib1.jar,/mylib2.jar -Dspark.files=/myfile1.dat,/myfile2.dat" - -or you can do it dynamically with [dependency loader](../interpreter/spark.html#dependencyloading) - - ## Start/Stop #### Start Zeppelin diff --git a/docs/docs/interpreter/spark.md b/docs/docs/interpreter/spark.md index 06aee94495f..58fce0b07e7 100644 --- a/docs/docs/interpreter/spark.md +++ b/docs/docs/interpreter/spark.md @@ -54,7 +54,10 @@ Note that scala / python environment shares the same SparkContext, SQLContext, Z

    -### Dependency loading +### Dependency Management +There are two ways to load external library in spark interpreter. First is using Zeppelin's %dep interpreter and second is loading Spark properties. + +#### 1. Dynamic Dependency Loading via %dep interpreter When your code requires external library, instead of doing download/copy/restart Zeppelin, you can easily do following jobs using %dep interpreter. @@ -64,6 +67,7 @@ When your code requires external library, instead of doing download/copy/restart * Automatically add libraries to SparkCluster (You can turn off) Dep interpreter leverages scala environment. So you can write any Scala code here. +Note that %dep interpreter should be used before %spark, %pyspark, %sql. Here's usages. @@ -78,7 +82,7 @@ z.addRepo("RepoName").url("RepoURL") z.addRepo("RepoName").url("RepoURL").snapshot() // add credentials for private maven repository -z.addRepo("RepoName").url("RepoURL).username("username").password("password") +z.addRepo("RepoName").url("RepoURL").username("username").password("password") // add artifact from filesystem z.load("/path/to.jar") @@ -101,7 +105,58 @@ z.load("groupId:artifactId:version").exclude("groupId:*") z.load("groupId:artifactId:version").local() ``` -Note that %dep interpreter should be used before %spark, %pyspark, %sql. + +
    +#### 2. Loading Spark Properties +Once `SPARK_HOME` is set in `conf/zeppelin-env.sh`, Zeppelin uses `spark-submit` as spark interpreter runner. `spark-submit` supports two ways to load configurations. The first is command line options such as --master and Zeppelin can pass these options to `spark-submit` by exporting `SPARK_SUBMIT_OPTIONS` in conf/zeppelin-env.sh. Second is reading configuration options from `SPARK_HOME/conf/spark-defaults.conf`. Spark properites that user can set to distribute libraries are: + + + + + + + + + + + + + + + + + + + + + + + + + + +
    spark-defaults.confSPARK_SUBMIT_OPTIONSApplicable InterpreterDescription
    spark.jars--jars%sparkComma-separated list of local jars to include on the driver and executor classpaths.
    spark.jars.packages--packages%sparkComma-separated list of maven coordinates of jars to include on the driver and executor classpaths. Will search the local maven repo, then maven central and any additional remote repositories given by --repositories. The format for the coordinates should be groupId:artifactId:version.
    spark.files--files%pysparkComma-separated list of files to be placed in the working directory of each executor.
    +Note that adding jar to pyspark is only availabe via %dep interpreter at the moment + +
    +Here are few examples: + +##### 0.5.5 and later +* SPARK\_SUBMIT\_OPTIONS in conf/zeppelin-env.sh + + export SPARK_SUBMIT_OPTIONS="--packages com.databricks:spark-csv_2.10:1.2.0 --jars /path/mylib1.jar,/path/mylib2.jar --files /path/mylib1.py,/path/mylib2.zip,/path/mylib3.egg" + +* SPARK_HOME/conf/spark-defaults.conf + + spark.jars /path/mylib1.jar,/path/mylib2.jar + spark.jars.packages com.databricks:spark-csv_2.10:1.2.0 + spark.files /path/mylib1.py,/path/mylib2.egg,/path/mylib3.zip + +##### 0.5.0 +* ZEPPELIN\_JAVA\_OPTS in conf/zeppelin-env.sh + + export ZEPPELIN_JAVA_OPTS="-Dspark.jars=/path/mylib1.jar,/path/mylib2.jar -Dspark.files=/path/myfile1.dat,/path/myfile2.dat" +
    From c877cd9d0d1e53a347c90acec249f0c6a2ae4196 Mon Sep 17 00:00:00 2001 From: Chae-Sung Lim Date: Thu, 12 Nov 2015 11:47:45 +0900 Subject: [PATCH 027/491] Zeppelin-web-docs] angular (beta) description fix Modify the incorrect description of the angular parts of the document unbind. original ``` // bind my 'object' as angular scope variable 'name' in current notebook. z.angularBind(String name, Object object) // bind my 'object' as angular scope variable 'name' in all notebooks related to current interpreter. z.angularBindGlobal(String name, Object object) // unbind angular scope variable 'name' in current notebook. z.angularBind(String name) // unbind angular scope variable 'name' in all notebooks related to current interpreter. z.angularBindGlobal(String name) In the example, let's bind "world" variable 'name'. Then you can see AngularJs view are updated immediately. ``` fix ``` // bind my 'object' as angular scope variable 'name' in current notebook. z.angularBind(String name, Object object) // bind my 'object' as angular scope variable 'name' in all notebooks related to current interpreter. z.angularBindGlobal(String name, Object object) // unbind angular scope variable 'name' in current notebook. z.angularUnbind(String name) // unbind angular scope variable 'name' in all notebooks related to current interpreter. z.angularUnbindGlobal(String name) In the example, let's bind "world" variable 'name'. Then you can see AngularJs view are updated immediately. ``` unbind description **angularBind -> angularUnbind** global unbind description **angularBindGlobal -> angularUnbindGlobal** Author: Chae-Sung Lim Closes #421 from cloverhearts/modify_docs/angularbinddocs_fix and squashes the following commits: 6dabd02 [Chae-Sung Lim] Zeppelin document , Angular (beta) part : modified unbind context --- docs/docs/displaysystem/angular.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/displaysystem/angular.md b/docs/docs/displaysystem/angular.md index 8471e3ef086..c0ea19682ec 100644 --- a/docs/docs/displaysystem/angular.md +++ b/docs/docs/displaysystem/angular.md @@ -40,10 +40,10 @@ z.angularBind(String name, Object object) z.angularBindGlobal(String name, Object object) // unbind angular scope variable 'name' in current notebook. -z.angularBind(String name) +z.angularUnbind(String name) // unbind angular scope variable 'name' in all notebooks related to current interpreter. -z.angularBindGlobal(String name) +z.angularUnbindGlobal(String name) ``` From 913bc0955c4ae48ba473645d6057da0647a11024 Mon Sep 17 00:00:00 2001 From: tog Date: Wed, 11 Nov 2015 07:24:13 +0000 Subject: [PATCH 028/491] [ZEPPELIN-409] upgrade spark to 1.5.2 Upgrade spark to latest (1.5.2) version Author: tog Closes #417 from galleon/spark-1.5.2 and squashes the following commits: b283a5a [tog] modified .travis.yml to take the new spark release into account 05386ff [tog] [ZEPPELIN-409] upgrade spark to 1.5.2 --- .travis.yml | 6 +++--- spark-dependencies/pom.xml | 2 +- .../main/java/org/apache/zeppelin/spark/SparkVersion.java | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0c74edfc55d..213fc5687e3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,10 +30,10 @@ before_script: script: # spark 1.5 - mvn package -Pbuild-distr -Phadoop-2.3 -Ppyspark -B - - ./testing/startSparkCluster.sh 1.5.1 2.3 - - echo "export SPARK_HOME=`pwd`/spark-1.5.1-bin-hadoop2.3" > conf/zeppelin-env.sh + - ./testing/startSparkCluster.sh 1.5.2 2.3 + - echo "export SPARK_HOME=`pwd`/spark-1.5.2-bin-hadoop2.3" > conf/zeppelin-env.sh - mvn verify -Pusing-packaged-distr -Phadoop-2.3 -Ppyspark -B - - ./testing/stopSparkCluster.sh 1.5.1 2.3 + - ./testing/stopSparkCluster.sh 1.5.2 2.3 # spark 1.4 - rm -rf `pwd`/interpreter/spark - mvn package -DskipTests -Pspark-1.4 -Phadoop-2.3 -Ppyspark -B -pl 'zeppelin-interpreter,spark-dependencies,spark' diff --git a/spark-dependencies/pom.xml b/spark-dependencies/pom.xml index 8304761148c..3af0678a9cb 100644 --- a/spark-dependencies/pom.xml +++ b/spark-dependencies/pom.xml @@ -480,7 +480,7 @@ spark-1.5 - 1.5.1 + 1.5.2 com.typesafe.akka 2.3.11 2.5.0 diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkVersion.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkVersion.java index 97716fa884a..e5256b75871 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/SparkVersion.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkVersion.java @@ -32,7 +32,8 @@ public enum SparkVersion { SPARK_1_4_0, SPARK_1_4_1, SPARK_1_5_0, - SPARK_1_5_1; + SPARK_1_5_1, + SPARK_1_5_2; private int version; From 96b720239dda3c0f4c12345a22eba64015c203a1 Mon Sep 17 00:00:00 2001 From: Chae-Sung Lim Date: Thu, 12 Nov 2015 16:11:34 +0900 Subject: [PATCH 029/491] ZEPPELIN-383-Additional_modifications ] Typo fixes #412 fix :: bin/interpreter.sh ZEPPELIN_CLASSPATH_OVERRIDE**SS** -> ZEPPELIN_CLASSPATH_OVERRIDE**S** Author: Chae-Sung Lim Closes #422 from cloverhearts/ZEPPELIN-383-Additional_modifications and squashes the following commits: 90a267e [Chae-Sung Lim] ZEPPELIN-383-Additional_modifications --- bin/interpreter.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/interpreter.sh b/bin/interpreter.sh index 7a21b3e8168..28424c8980b 100755 --- a/bin/interpreter.sh +++ b/bin/interpreter.sh @@ -79,7 +79,7 @@ if [[ "${INTERPRETER_ID}" == "spark" ]]; then ZEPPELIN_CLASSPATH=${SPARK_APP_JAR} export PYTHONPATH="$SPARK_HOME/python/:$PYTHONPATH" - export PYTHONPATH="$SPARK_HOME/python/lib/py4j-0.8.2.1-src.zip:$PYTHONPATH" + export PYTHONPATH="$SPARK_HOME/python/lib/py4j-0.8.2.1-src.zip:$PYTHONPATH" else # add Hadoop jars into classpath if [[ -n "${HADOOP_HOME}" ]]; then @@ -121,9 +121,9 @@ fi CLASSPATH+=":${ZEPPELIN_CLASSPATH}" if [[ -n "${SPARK_SUBMIT}" ]]; then - ${SPARK_SUBMIT} --class ${ZEPPELIN_SERVER} --driver-class-path "${ZEPPELIN_CLASSPATH_OVERRIDESS}:${CLASSPATH}" --driver-java-options "${JAVA_INTP_OPTS}" ${SPARK_SUBMIT_OPTIONS} ${SPARK_APP_JAR} ${PORT} & + ${SPARK_SUBMIT} --class ${ZEPPELIN_SERVER} --driver-class-path "${ZEPPELIN_CLASSPATH_OVERRIDES}:${CLASSPATH}" --driver-java-options "${JAVA_INTP_OPTS}" ${SPARK_SUBMIT_OPTIONS} ${SPARK_APP_JAR} ${PORT} & else - ${ZEPPELIN_RUNNER} ${JAVA_INTP_OPTS} -cp ${ZEPPELIN_CLASSPATH_OVERRIDESS}:${CLASSPATH} ${ZEPPELIN_SERVER} ${PORT} & + ${ZEPPELIN_RUNNER} ${JAVA_INTP_OPTS} -cp ${ZEPPELIN_CLASSPATH_OVERRIDES}:${CLASSPATH} ${ZEPPELIN_SERVER} ${PORT} & fi pid=$! From f435f3e46b7d62cd12c6dc97d84705032e0924ad Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Thu, 12 Nov 2015 19:54:38 +0900 Subject: [PATCH 030/491] Apply #407 into master branch #407 addressed https://issues.apache.org/jira/browse/ZEPPELIN-406 and merged into branch-0.5.5 This PR applies it to the master branch Author: Lee moon soo Closes #424 from Leemoonsoo/ZEPPELIN-406-master and squashes the following commits: 64b6550 [Lee moon soo] Add apache header and inline json message example into doc ba72645 [Lee moon soo] ZEPPELIN-406 Handle license issue found in 0.5.5-incubating rc2 --- LICENSE | 72 +- dev/create_release.sh | 5 +- docs/Gemfile | 15 + docs/Gemfile.lock | 3 + docs/assets/bootstrap-3.0.2-dist.zip | Bin 143318 -> 0 bytes .../bootstrap/css/bootstrap.2.2.2.min.css | 782 ------------------ .../img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes .../bootstrap/img/glyphicons-halflings.png | Bin 12799 -> 0 bytes docs/assets/themes/twitter/css/style.css | 65 -- docs/community.md | 13 + .../development/writingzeppelininterpreter.md | 13 + docs/docs/displaysystem/angular.md | 13 + docs/docs/displaysystem/display.md | 13 + docs/docs/displaysystem/table.md | 13 + docs/docs/index.md | 13 + docs/docs/install/install.md | 13 + docs/docs/install/yarn_install.md | 13 + docs/docs/manual/dynamicform.md | 13 + docs/docs/manual/interpreters.md | 13 + docs/docs/manual/notebookashomepage.md | 13 + docs/docs/pleasecontribute.md | 13 + .../zeppelin-release-0.5.0-incubating.md | 13 + docs/docs/rest-api/rest-interpreter.md | 182 +++- ...rest-json-interpreter-create-response.json | 1 - .../rest-json-interpreter-create.json | 1 - ...rest-json-interpreter-delete-response.json | 1 - .../rest-json/rest-json-interpreter-list.json | 1 - .../rest-json-interpreter-setting.json | 1 - ...rest-json-interpreter-update-response.json | 1 - .../rest-json-interpreter-update.json | 1 - .../rest-json-notebook-create-response.json | 1 - .../rest-json/rest-json-notebook-create.json | 1 - .../rest-json-notebook-delete-response.json | 1 - .../rest-json-notebook-list-response.json | 1 - docs/docs/rest-api/rest-notebook.md | 25 +- docs/docs/storage/storage.md | 12 + docs/docs/tutorial/tutorial.md | 14 +- docs/download.md | 13 + docs/index.md | 13 + docs/old_CNAME | 1 - docs/robot.txt | 14 + docs/screenshots.md | 13 + licenses/LICENSE-bootstrap-3.0.2 | 176 ++++ licenses/LICENSE-fontawesome-4.2.0 | 82 ++ licenses/LICENSE-fontawesome-style-4.2.0 | 21 + licenses/LICENSE-jekyll-1.3.0 | 21 + licenses/LICENSE-jekyll-bootstrap-0.3 | 21 + licenses/LICENSE-simple_line_icons-1.0.0 | 21 + pom.xml | 31 +- .../src/assemble/distribution.xml | 3 + zeppelin-distribution/src/bin_license/LICENSE | 176 ++++ zeppelin-distribution/src/bin_license/NOTICE | 153 ++++ .../licenses/LICENSE-AngularJS-1.3.8 | 21 + .../bin_license/licenses/LICENSE-Json3-3.3.1 | 20 + .../licenses/LICENSE-UI-Bootstrap-0.13.0 | 21 + .../bin_license/licenses/LICENSE-UI.ace-0.1.1 | 21 + .../bin_license/licenses/LICENSE-ace-1.1.9 | 24 + .../licenses/LICENSE-ace-builds-1.1.9 | 24 + .../licenses/LICENSE-angular-dragdrop-1.0.8 | 21 + .../licenses/LICENSE-angular-elastic-2.4.2 | 21 + .../LICENSE-angular-elastic-input-2.0.1 | 21 + .../licenses/LICENSE-angular-filter-0.5.4 | 9 + .../licenses/LICENSE-angular-websocket-1.0.13 | 21 + .../licenses/LICENSE-angular-xeditable-0.1.8 | 21 + .../licenses/LICENSE-aws-java-sdk-1.10.1 | 63 ++ .../licenses/LICENSE-bcprov-jdk15on-1.51 | 10 + .../licenses/LICENSE-bootstrap-3.2.0 | 21 + .../bin_license/licenses/LICENSE-d3-2.10.2 | 26 + .../bin_license/licenses/LICENSE-dom4j-1.6.1 | 40 + .../licenses/LICENSE-es5-shim-3.1.0 | 21 + .../src/bin_license/licenses/LICENSE-gson-2.2 | 203 +++++ .../licenses/LICENSE-highlightjs-8.4.0 | 24 + .../licenses/LICENSE-jquery.scrollTo-1.4.13 | 22 + .../bin_license/licenses/LICENSE-lodash-3.9.3 | 22 + .../licenses/LICENSE-ng-sortable-1.1.9 | 21 + .../licenses/LICENSE-ngToast-1.5.5 | 8 + .../licenses/LICENSE-nvd3.js-1.1.15-beta | 7 + .../licenses/LICENSE-perfect-scrollbar-0.5.4 | 7 + .../bin_license/licenses/LICENSE-postgresql | 29 + .../bin_license/licenses/LICENSE-slf4j-1.7.10 | 21 + .../licenses/LICENSE-slf4j-log4j12-1.7.10 | 21 + 81 files changed, 1999 insertions(+), 926 deletions(-) delete mode 100644 docs/assets/bootstrap-3.0.2-dist.zip delete mode 100644 docs/assets/themes/twitter/bootstrap/css/bootstrap.2.2.2.min.css delete mode 100644 docs/assets/themes/twitter/bootstrap/img/glyphicons-halflings-white.png delete mode 100644 docs/assets/themes/twitter/bootstrap/img/glyphicons-halflings.png delete mode 100644 docs/assets/themes/twitter/css/style.css delete mode 100644 docs/docs/rest-api/rest-json/rest-json-interpreter-create-response.json delete mode 100644 docs/docs/rest-api/rest-json/rest-json-interpreter-create.json delete mode 100644 docs/docs/rest-api/rest-json/rest-json-interpreter-delete-response.json delete mode 100644 docs/docs/rest-api/rest-json/rest-json-interpreter-list.json delete mode 100644 docs/docs/rest-api/rest-json/rest-json-interpreter-setting.json delete mode 100644 docs/docs/rest-api/rest-json/rest-json-interpreter-update-response.json delete mode 100644 docs/docs/rest-api/rest-json/rest-json-interpreter-update.json delete mode 100644 docs/docs/rest-api/rest-json/rest-json-notebook-create-response.json delete mode 100644 docs/docs/rest-api/rest-json/rest-json-notebook-create.json delete mode 100644 docs/docs/rest-api/rest-json/rest-json-notebook-delete-response.json delete mode 100644 docs/docs/rest-api/rest-json/rest-json-notebook-list-response.json delete mode 100644 docs/old_CNAME create mode 100644 licenses/LICENSE-bootstrap-3.0.2 create mode 100644 licenses/LICENSE-fontawesome-4.2.0 create mode 100644 licenses/LICENSE-fontawesome-style-4.2.0 create mode 100644 licenses/LICENSE-jekyll-1.3.0 create mode 100644 licenses/LICENSE-jekyll-bootstrap-0.3 create mode 100644 licenses/LICENSE-simple_line_icons-1.0.0 create mode 100644 zeppelin-distribution/src/bin_license/LICENSE create mode 100644 zeppelin-distribution/src/bin_license/NOTICE create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-AngularJS-1.3.8 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-Json3-3.3.1 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-UI-Bootstrap-0.13.0 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-UI.ace-0.1.1 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-ace-1.1.9 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-ace-builds-1.1.9 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-dragdrop-1.0.8 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-elastic-2.4.2 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-elastic-input-2.0.1 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-filter-0.5.4 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-websocket-1.0.13 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-xeditable-0.1.8 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-aws-java-sdk-1.10.1 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-bcprov-jdk15on-1.51 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-bootstrap-3.2.0 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-d3-2.10.2 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-dom4j-1.6.1 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-es5-shim-3.1.0 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-gson-2.2 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-highlightjs-8.4.0 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-jquery.scrollTo-1.4.13 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-lodash-3.9.3 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-ng-sortable-1.1.9 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-ngToast-1.5.5 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-nvd3.js-1.1.15-beta create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-perfect-scrollbar-0.5.4 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-postgresql create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-slf4j-1.7.10 create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-slf4j-log4j12-1.7.10 diff --git a/LICENSE b/LICENSE index 31af032a404..f6094226253 100644 --- a/LICENSE +++ b/LICENSE @@ -210,68 +210,38 @@ subcomponents is subject to the terms and conditions of the following licenses. -For the PostgreSQL JDBC driver jar file: - Copyright (c) 1997-2011, PostgreSQL Global Development Group - All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the name of the PostgreSQL Global Development Group nor the names - of its contributors may be used to endorse or promote products derived - from this software without specific prior written permission. +======================================================================== + The Open Font License +======================================================================== - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. +The following components are provided under the Open Font License. See project link for details. +The text of each license is also included at licenses/LICENSE-[project]-[version].txt. + (OFT 1.1) Font Awesome v4.2.0 (http://fortawesome.github.io/Font-Awesome/) - http://scripts.sil.org/OFL -This product contains webfonts from 'Font Awesome', which can be obtains at: - * LICENSE: - * SIL OFL 1.1 (http://scripts.sil.org/OFL) - * HOMEPAGE: - * http://fortawesome.github.io/Font-Awesome/ +======================================================================== +MIT licenses +======================================================================== +The following components are provided under the MIT License. See project link for details. +The text of each license is also included at licenses/LICENSE-[project]-[version].txt. + (The MIT License) Font Awesome (stylesheet) 4.2.0 (http://fortawesome.github.io/Font-Awesome/) - https://fortawesome.github.io/Font-Awesome/license/ + (The MIT License) Simple line icons v1.0.0 (http://thesabbir.github.io/simple-line-icons/) - https://github.com/thesabbir/simple-line-icons/tree/1.0.0 + (The MIT License) jekyll-bootstrap 0.3.0 (https://github.com/plusjade/jekyll-bootstrap) - https://github.com/plusjade/jekyll-bootstrap + (The MIT License) jekyll 1.3.0 (http://jekyllrb.com/) - https://github.com/jekyll/jekyll/blob/v1.3.0/LICENSE -This product contains a stylesheet from 'Font Awesome', which can be obtains at: - * LICENSE: - * MIT License (http://opensource.org/licenses/mit-license.html) - * HOMEPAGE: - * http://fortawesome.github.io/Font-Awesome/ +======================================================================== +Apache licenses +======================================================================== +The following components are provided under the Apache License. See project link for details. +The text of each license is also included at licenses/LICENSE-[project]-[version].txt. -This product contains embeddable code editor 'Ace', which can be obtains at: - - * LICENSE: - * BSD (https://github.com/ajaxorg/ace/blob/master/LICENSE) - Copyright (c) 2010, Ajax.org B.V. - All rights reserved. - * HOMEPAGE: - * http://ace.c9.io/ - - - -This product contains 'Simple line icons', which can be obtains at: - - * LICENSE: - * MIT License (http://opensource.org/licenses/mit-license.html) - * HOMEPAGE: - * http://thesabbir.github.io/simple-line-icons/ + (Apache 2.0) Bootstrap v3.0.2 (http://getbootstrap.com/) - https://github.com/twbs/bootstrap/blob/v3.0.2/LICENSE \ No newline at end of file diff --git a/dev/create_release.sh b/dev/create_release.sh index 63fcbade273..ac1a33a4996 100755 --- a/dev/create_release.sh +++ b/dev/create_release.sh @@ -103,9 +103,12 @@ function make_binary_release() { exit 1 fi - # re-create package with proper dir name + # re-create package with proper dir name with binary license cd zeppelin-distribution/target/zeppelin-* mv zeppelin-* zeppelin-${RELEASE_NAME}-bin-${BIN_RELEASE_NAME} + cat ../../src/bin_license/LICENSE >> zeppelin-${RELEASE_NAME}-bin-${BIN_RELEASE_NAME}/LICENSE + cat ../../src/bin_license/NOTICE >> zeppelin-${RELEASE_NAME}-bin-${BIN_RELEASE_NAME}/NOTICE + cp ../../src/bin_license/licenses/* zeppelin-${RELEASE_NAME}-bin-${BIN_RELEASE_NAME}/licenses/ ${TAR} cvzf zeppelin-${RELEASE_NAME}-bin-${BIN_RELEASE_NAME}.tgz zeppelin-${RELEASE_NAME}-bin-${BIN_RELEASE_NAME} # sign bin package diff --git a/docs/Gemfile b/docs/Gemfile index 053c27dc351..655775a0546 100644 --- a/docs/Gemfile +++ b/docs/Gemfile @@ -1,2 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# source 'https://rubygems.org' gem 'github-pages' diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index 317f587547e..170579e0edf 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -56,3 +56,6 @@ PLATFORMS DEPENDENCIES github-pages + +BUNDLED WITH + 1.10.4 diff --git a/docs/assets/bootstrap-3.0.2-dist.zip b/docs/assets/bootstrap-3.0.2-dist.zip deleted file mode 100644 index a935f7fc886ed1610b7efa4cd90ff7bb4d775c2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143318 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%0Ac=g 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 diff --git a/docs/assets/themes/twitter/bootstrap/css/bootstrap.2.2.2.min.css b/docs/assets/themes/twitter/bootstrap/css/bootstrap.2.2.2.min.css deleted file mode 100644 index 9f19ba66361..00000000000 --- a/docs/assets/themes/twitter/bootstrap/css/bootstrap.2.2.2.min.css +++ /dev/null @@ -1,782 +0,0 @@ -/*! - * Bootstrap v2.2.2 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ -.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;} -.clearfix:after{clear:both;} -.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;} -.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} -article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} -audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} -audio:not([controls]){display:none;} -html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} -a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -a:hover,a:active{outline:0;} -sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} -sup{top:-0.5em;} -sub{bottom:-0.25em;} -img{max-width:100%;width:auto\9;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;} -#map_canvas img,.google-maps img{max-width:none;} -button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} -button,input{*overflow:visible;line-height:normal;} -button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} -button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;} -label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer;} -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-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} -textarea{overflow:auto;vertical-align:top;} -@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important;} a,a:visited{text-decoration:underline;} a[href]:after{content:" (" attr(href) ")";} abbr[title]:after{content:" (" attr(title) ")";} .ir a:after,a[href^="javascript:"]:after,a[href^="#"]: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;} @page {margin:0.5cm;}p,h2,h3{orphans:3;widows:3;} h2,h3{page-break-after:avoid;}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333333;background-color:#ffffff;} -a{color:#0088cc;text-decoration:none;} -a:hover{color:#005580;text-decoration:underline;} -.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);} -.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;} -.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} -.row:after{clear:both;} -[class*="span"]{float:left;min-height:1px;margin-left:20px;} -.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} -.span12{width:940px;} -.span11{width:860px;} -.span10{width:780px;} -.span9{width:700px;} -.span8{width:620px;} -.span7{width:540px;} -.span6{width:460px;} -.span5{width:380px;} -.span4{width:300px;} -.span3{width:220px;} -.span2{width:140px;} -.span1{width:60px;} -.offset12{margin-left:980px;} -.offset11{margin-left:900px;} -.offset10{margin-left:820px;} -.offset9{margin-left:740px;} -.offset8{margin-left:660px;} -.offset7{margin-left:580px;} -.offset6{margin-left:500px;} -.offset5{margin-left:420px;} -.offset4{margin-left:340px;} -.offset3{margin-left:260px;} -.offset2{margin-left:180px;} -.offset1{margin-left:100px;} -.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} -.row-fluid:after{clear:both;} -.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;} -.row-fluid [class*="span"]:first-child{margin-left:0;} -.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%;} -.row-fluid .span12{width:100%;*width:99.94680851063829%;} -.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;} -.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;} -.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;} -.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;} -.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;} -.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;} -.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;} -.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;} -.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;} -.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;} -.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;} -.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;} -.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;} -.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;} -.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;} -.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;} -.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;} -.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;} -.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;} -.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;} -.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;} -.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;} -.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;} -.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;} -.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;} -.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;} -.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;} -.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;} -.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;} -.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;} -.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;} -.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;} -.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;} -.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;} -.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;} -[class*="span"].hide,.row-fluid [class*="span"].hide{display:none;} -[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;} -.container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;} -.container:after{clear:both;} -.container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;} -.container-fluid:after{clear:both;} -p{margin:0 0 10px;} -.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px;} -small{font-size:85%;} -strong{font-weight:bold;} -em{font-style:italic;} -cite{font-style:normal;} -.muted{color:#999999;} -a.muted:hover{color:#808080;} -.text-warning{color:#c09853;} -a.text-warning:hover{color:#a47e3c;} -.text-error{color:#b94a48;} -a.text-error:hover{color:#953b39;} -.text-info{color:#3a87ad;} -a.text-info:hover{color:#2d6987;} -.text-success{color:#468847;} -a.text-success:hover{color:#356635;} -h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999999;} -h1,h2,h3{line-height:40px;} -h1{font-size:38.5px;} -h2{font-size:31.5px;} -h3{font-size:24.5px;} -h4{font-size:17.5px;} -h5{font-size:14px;} -h6{font-size:11.9px;} -h1 small{font-size:24.5px;} -h2 small{font-size:17.5px;} -h3 small{font-size:14px;} -h4 small{font-size:14px;} -.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;} -ul,ol{padding:0;margin:0 0 10px 25px;} -ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} -li{line-height:20px;} -ul.unstyled,ol.unstyled{margin-left:0;list-style:none;} -ul.inline,ol.inline{margin-left:0;list-style:none;}ul.inline >li,ol.inline >li{display:inline-block;padding-left:5px;padding-right:5px;} -dl{margin-bottom:20px;} -dt,dd{line-height:20px;} -dt{font-weight:bold;} -dd{margin-left:10px;} -.dl-horizontal{*zoom:1;}.dl-horizontal:before,.dl-horizontal:after{display:table;content:"";line-height:0;} -.dl-horizontal:after{clear:both;} -.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;} -hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;} -abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999;} -abbr.initialism{font-size:90%;text-transform:uppercase;} -blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px;} -blockquote small{display:block;line-height:20px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} -blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} -blockquote.pull-right small:before{content:'';} -blockquote.pull-right small:after{content:'\00A0 \2014';} -q:before,q:after,blockquote:before,blockquote:after{content:"";} -address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;} -code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap;} -pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}pre.prettyprint{margin-bottom:20px;} -pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0;} -.pre-scrollable{max-height:340px;overflow-y:scroll;} -.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;} -.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;} -.label:empty,.badge:empty{display:none;} -a.label:hover,a.badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;} -.label-important,.badge-important{background-color:#b94a48;} -.label-important[href],.badge-important[href]{background-color:#953b39;} -.label-warning,.badge-warning{background-color:#f89406;} -.label-warning[href],.badge-warning[href]{background-color:#c67605;} -.label-success,.badge-success{background-color:#468847;} -.label-success[href],.badge-success[href]{background-color:#356635;} -.label-info,.badge-info{background-color:#3a87ad;} -.label-info[href],.badge-info[href]{background-color:#2d6987;} -.label-inverse,.badge-inverse{background-color:#333333;} -.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;} -.btn .label,.btn .badge{position:relative;top:-1px;} -.btn-mini .label,.btn-mini .badge{top:0;} -table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;} -.table{width:100%;margin-bottom:20px;}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;} -.table th{font-weight:bold;} -.table thead th{vertical-align:bottom;} -.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;} -.table tbody+tbody{border-top:2px solid #dddddd;} -.table .table{background-color:#ffffff;} -.table-condensed th,.table-condensed td{padding:4px 5px;} -.table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;} -.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} -.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} -.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;} -.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child{-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} -.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} -.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;} -.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;} -.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} -.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;} -.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9;} -.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5;} -table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0;} -.table td.span1,.table th.span1{float:none;width:44px;margin-left:0;} -.table td.span2,.table th.span2{float:none;width:124px;margin-left:0;} -.table td.span3,.table th.span3{float:none;width:204px;margin-left:0;} -.table td.span4,.table th.span4{float:none;width:284px;margin-left:0;} -.table td.span5,.table th.span5{float:none;width:364px;margin-left:0;} -.table td.span6,.table th.span6{float:none;width:444px;margin-left:0;} -.table td.span7,.table th.span7{float:none;width:524px;margin-left:0;} -.table td.span8,.table th.span8{float:none;width:604px;margin-left:0;} -.table td.span9,.table th.span9{float:none;width:684px;margin-left:0;} -.table td.span10,.table th.span10{float:none;width:764px;margin-left:0;} -.table td.span11,.table th.span11{float:none;width:844px;margin-left:0;} -.table td.span12,.table th.span12{float:none;width:924px;margin-left:0;} -.table tbody tr.success td{background-color:#dff0d8;} -.table tbody tr.error td{background-color:#f2dede;} -.table tbody tr.warning td{background-color:#fcf8e3;} -.table tbody tr.info td{background-color:#d9edf7;} -.table-hover tbody tr.success:hover td{background-color:#d0e9c6;} -.table-hover tbody tr.error:hover td{background-color:#ebcccc;} -.table-hover tbody tr.warning:hover td{background-color:#faf2cc;} -.table-hover tbody tr.info:hover td{background-color:#c4e3f3;} -form{margin:0 0 20px;} -fieldset{padding:0;margin:0;border:0;} -legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;} -label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px;} -input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} -label{display:block;margin-bottom:5px;} -select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555555;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;vertical-align:middle;} -input,textarea,.uneditable-input{width:206px;} -textarea{height:auto;} -textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-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 linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);} -input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;} -input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;} -select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;} -select{width:220px;border:1px solid #cccccc;background-color:#ffffff;} -select[multiple],select[size]{height:auto;} -select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -.uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} -.uneditable-input{overflow:hidden;white-space:nowrap;} -.uneditable-textarea{width:auto;height:auto;} -input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;} -input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;} -input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;} -.radio,.checkbox{min-height:20px;padding-left:20px;} -.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px;} -.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} -.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;} -.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} -.input-mini{width:60px;} -.input-small{width:90px;} -.input-medium{width:150px;} -.input-large{width:210px;} -.input-xlarge{width:270px;} -.input-xxlarge{width:530px;} -input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;} -.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;} -input,textarea,.uneditable-input{margin-left:0;} -.controls-row [class*="span"]+[class*="span"]{margin-left:20px;} -input.span12, textarea.span12, .uneditable-input.span12{width:926px;} -input.span11, textarea.span11, .uneditable-input.span11{width:846px;} -input.span10, textarea.span10, .uneditable-input.span10{width:766px;} -input.span9, textarea.span9, .uneditable-input.span9{width:686px;} -input.span8, textarea.span8, .uneditable-input.span8{width:606px;} -input.span7, textarea.span7, .uneditable-input.span7{width:526px;} -input.span6, textarea.span6, .uneditable-input.span6{width:446px;} -input.span5, textarea.span5, .uneditable-input.span5{width:366px;} -input.span4, textarea.span4, .uneditable-input.span4{width:286px;} -input.span3, textarea.span3, .uneditable-input.span3{width:206px;} -input.span2, textarea.span2, .uneditable-input.span2{width:126px;} -input.span1, textarea.span1, .uneditable-input.span1{width:46px;} -.controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;} -.controls-row:after{clear:both;} -.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left;} -.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px;} -input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;} -input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;} -.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} -.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;} -.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;} -.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} -.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} -.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;} -.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;} -.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} -.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} -.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;} -.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;} -.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} -.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad;} -.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;} -.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;} -.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad;} -input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} -.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;} -.form-actions:after{clear:both;} -.help-block,.help-inline{color:#595959;} -.help-block{display:block;margin-bottom:10px;} -.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;} -.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu{font-size:14px;} -.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2;} -.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;} -.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;} -.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;} -.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} -.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} -.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px;} -.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} -.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} -.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} -.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} -.input-prepend.input-append .btn-group:first-child{margin-left:0;} -input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} -.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;} -.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;} -.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;} -.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;} -.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle;} -.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;} -.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;} -.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;} -.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;} -.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;} -.control-group{margin-bottom:10px;} -legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;} -.form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;} -.form-horizontal .control-group:after{clear:both;} -.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right;} -.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:180px;} -.form-horizontal .help-block{margin-bottom:0;} -.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px;} -.form-horizontal .form-actions{padding-left:180px;} -.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(to bottom, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #bbbbbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;} -.btn:active,.btn.active{background-color:#cccccc \9;} -.btn:first-child{*margin-left:0;} -.btn:hover{color:#333333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} -.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} -.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);} -.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px;} -.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0;} -.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px;} -.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} -.btn-block+.btn-block{margin-top:5px;} -input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%;} -.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);} -.btn{border-color:#c5c5c5;border-color:rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);} -.btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(to bottom, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#0044cc;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3;} -.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} -.btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505;} -.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} -.btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a;} -.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} -.btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249;} -.btn-success:active,.btn-success.active{background-color:#408140 \9;} -.btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0;} -.btn-info:active,.btn-info.active{background-color:#24748c \9;} -.btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#222222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515;} -.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;} -button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} -button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;} -button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;} -button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;} -.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} -.btn-link{border-color:transparent;cursor:pointer;color:#0088cc;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent;} -.btn-link[disabled]:hover{color:#333333;text-decoration:none;} -[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px;} -.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png");} -.icon-glass{background-position:0 0;} -.icon-music{background-position:-24px 0;} -.icon-search{background-position:-48px 0;} -.icon-envelope{background-position:-72px 0;} -.icon-heart{background-position:-96px 0;} -.icon-star{background-position:-120px 0;} -.icon-star-empty{background-position:-144px 0;} -.icon-user{background-position:-168px 0;} -.icon-film{background-position:-192px 0;} -.icon-th-large{background-position:-216px 0;} -.icon-th{background-position:-240px 0;} -.icon-th-list{background-position:-264px 0;} -.icon-ok{background-position:-288px 0;} -.icon-remove{background-position:-312px 0;} -.icon-zoom-in{background-position:-336px 0;} -.icon-zoom-out{background-position:-360px 0;} -.icon-off{background-position:-384px 0;} -.icon-signal{background-position:-408px 0;} -.icon-cog{background-position:-432px 0;} -.icon-trash{background-position:-456px 0;} -.icon-home{background-position:0 -24px;} -.icon-file{background-position:-24px -24px;} -.icon-time{background-position:-48px -24px;} -.icon-road{background-position:-72px -24px;} -.icon-download-alt{background-position:-96px -24px;} -.icon-download{background-position:-120px -24px;} -.icon-upload{background-position:-144px -24px;} -.icon-inbox{background-position:-168px -24px;} -.icon-play-circle{background-position:-192px -24px;} -.icon-repeat{background-position:-216px -24px;} -.icon-refresh{background-position:-240px -24px;} -.icon-list-alt{background-position:-264px -24px;} -.icon-lock{background-position:-287px -24px;} -.icon-flag{background-position:-312px -24px;} -.icon-headphones{background-position:-336px -24px;} -.icon-volume-off{background-position:-360px -24px;} -.icon-volume-down{background-position:-384px -24px;} -.icon-volume-up{background-position:-408px -24px;} -.icon-qrcode{background-position:-432px -24px;} -.icon-barcode{background-position:-456px -24px;} -.icon-tag{background-position:0 -48px;} -.icon-tags{background-position:-25px -48px;} -.icon-book{background-position:-48px -48px;} -.icon-bookmark{background-position:-72px -48px;} -.icon-print{background-position:-96px -48px;} -.icon-camera{background-position:-120px -48px;} -.icon-font{background-position:-144px -48px;} -.icon-bold{background-position:-167px -48px;} -.icon-italic{background-position:-192px -48px;} -.icon-text-height{background-position:-216px -48px;} -.icon-text-width{background-position:-240px -48px;} -.icon-align-left{background-position:-264px -48px;} -.icon-align-center{background-position:-288px -48px;} -.icon-align-right{background-position:-312px -48px;} -.icon-align-justify{background-position:-336px -48px;} -.icon-list{background-position:-360px -48px;} -.icon-indent-left{background-position:-384px -48px;} -.icon-indent-right{background-position:-408px -48px;} -.icon-facetime-video{background-position:-432px -48px;} -.icon-picture{background-position:-456px -48px;} -.icon-pencil{background-position:0 -72px;} -.icon-map-marker{background-position:-24px -72px;} -.icon-adjust{background-position:-48px -72px;} -.icon-tint{background-position:-72px -72px;} -.icon-edit{background-position:-96px -72px;} -.icon-share{background-position:-120px -72px;} -.icon-check{background-position:-144px -72px;} -.icon-move{background-position:-168px -72px;} -.icon-step-backward{background-position:-192px -72px;} -.icon-fast-backward{background-position:-216px -72px;} -.icon-backward{background-position:-240px -72px;} -.icon-play{background-position:-264px -72px;} -.icon-pause{background-position:-288px -72px;} -.icon-stop{background-position:-312px -72px;} -.icon-forward{background-position:-336px -72px;} -.icon-fast-forward{background-position:-360px -72px;} -.icon-step-forward{background-position:-384px -72px;} -.icon-eject{background-position:-408px -72px;} -.icon-chevron-left{background-position:-432px -72px;} -.icon-chevron-right{background-position:-456px -72px;} -.icon-plus-sign{background-position:0 -96px;} -.icon-minus-sign{background-position:-24px -96px;} -.icon-remove-sign{background-position:-48px -96px;} -.icon-ok-sign{background-position:-72px -96px;} -.icon-question-sign{background-position:-96px -96px;} -.icon-info-sign{background-position:-120px -96px;} -.icon-screenshot{background-position:-144px -96px;} -.icon-remove-circle{background-position:-168px -96px;} -.icon-ok-circle{background-position:-192px -96px;} -.icon-ban-circle{background-position:-216px -96px;} -.icon-arrow-left{background-position:-240px -96px;} -.icon-arrow-right{background-position:-264px -96px;} -.icon-arrow-up{background-position:-289px -96px;} -.icon-arrow-down{background-position:-312px -96px;} -.icon-share-alt{background-position:-336px -96px;} -.icon-resize-full{background-position:-360px -96px;} -.icon-resize-small{background-position:-384px -96px;} -.icon-plus{background-position:-408px -96px;} -.icon-minus{background-position:-433px -96px;} -.icon-asterisk{background-position:-456px -96px;} -.icon-exclamation-sign{background-position:0 -120px;} -.icon-gift{background-position:-24px -120px;} -.icon-leaf{background-position:-48px -120px;} -.icon-fire{background-position:-72px -120px;} -.icon-eye-open{background-position:-96px -120px;} -.icon-eye-close{background-position:-120px -120px;} -.icon-warning-sign{background-position:-144px -120px;} -.icon-plane{background-position:-168px -120px;} -.icon-calendar{background-position:-192px -120px;} -.icon-random{background-position:-216px -120px;width:16px;} -.icon-comment{background-position:-240px -120px;} -.icon-magnet{background-position:-264px -120px;} -.icon-chevron-up{background-position:-288px -120px;} -.icon-chevron-down{background-position:-313px -119px;} -.icon-retweet{background-position:-336px -120px;} -.icon-shopping-cart{background-position:-360px -120px;} -.icon-folder-close{background-position:-384px -120px;} -.icon-folder-open{background-position:-408px -120px;width:16px;} -.icon-resize-vertical{background-position:-432px -119px;} -.icon-resize-horizontal{background-position:-456px -118px;} -.icon-hdd{background-position:0 -144px;} -.icon-bullhorn{background-position:-24px -144px;} -.icon-bell{background-position:-48px -144px;} -.icon-certificate{background-position:-72px -144px;} -.icon-thumbs-up{background-position:-96px -144px;} -.icon-thumbs-down{background-position:-120px -144px;} -.icon-hand-right{background-position:-144px -144px;} -.icon-hand-left{background-position:-168px -144px;} -.icon-hand-up{background-position:-192px -144px;} -.icon-hand-down{background-position:-216px -144px;} -.icon-circle-arrow-right{background-position:-240px -144px;} -.icon-circle-arrow-left{background-position:-264px -144px;} -.icon-circle-arrow-up{background-position:-288px -144px;} -.icon-circle-arrow-down{background-position:-312px -144px;} -.icon-globe{background-position:-336px -144px;} -.icon-wrench{background-position:-360px -144px;} -.icon-tasks{background-position:-384px -144px;} -.icon-filter{background-position:-408px -144px;} -.icon-briefcase{background-position:-432px -144px;} -.icon-fullscreen{background-position:-456px -144px;} -.btn-group{position:relative;display:inline-block;*display:inline;*zoom:1;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;} -.btn-group+.btn-group{margin-left:5px;} -.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px;} -.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.btn-group>.btn+.btn{margin-left:-1px;} -.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px;} -.btn-group>.btn-mini{font-size:10.5px;} -.btn-group>.btn-small{font-size:11.9px;} -.btn-group>.btn-large{font-size:17.5px;} -.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} -.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} -.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} -.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} -.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;} -.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} -.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px;} -.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;} -.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;} -.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;} -.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);} -.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;} -.btn-group.open .btn-primary.dropdown-toggle{background-color:#0044cc;} -.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;} -.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;} -.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;} -.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;} -.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;} -.btn .caret{margin-top:8px;margin-left:0;} -.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px;} -.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;} -.dropup .btn-large .caret{border-bottom-width:5px;} -.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} -.btn-group-vertical{display:inline-block;*display:inline;*zoom:1;} -.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.btn-group-vertical>.btn+.btn{margin-left:0;margin-top:-1px;} -.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} -.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} -.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;} -.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} -.nav{margin-left:0;margin-bottom:20px;list-style:none;} -.nav>li>a{display:block;} -.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} -.nav>li>a>img{max-width:none;} -.nav>.pull-right{float:right;} -.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;} -.nav li+.nav-header{margin-top:9px;} -.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;} -.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} -.nav-list>li>a{padding:3px 15px;} -.nav-list>.active>a,.nav-list>.active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} -.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px;} -.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} -.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;} -.nav-tabs:after,.nav-pills:after{clear:both;} -.nav-tabs>li,.nav-pills>li{float:left;} -.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} -.nav-tabs{border-bottom:1px solid #ddd;} -.nav-tabs>li{margin-bottom:-1px;} -.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} -.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} -.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} -.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#ffffff;background-color:#0088cc;} -.nav-stacked>li{float:none;} -.nav-stacked>li>a{margin-right:0;} -.nav-tabs.nav-stacked{border-bottom:0;} -.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} -.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} -.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} -.nav-pills.nav-stacked>li>a{margin-bottom:3px;} -.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} -.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} -.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.nav .dropdown-toggle .caret{border-top-color:#0088cc;border-bottom-color:#0088cc;margin-top:6px;} -.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580;} -.nav-tabs .dropdown-toggle .caret{margin-top:8px;} -.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;} -.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} -.nav>.dropdown.active>a:hover{cursor:pointer;} -.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} -.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);} -.tabs-stacked .open>a:hover{border-color:#999999;} -.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0;} -.tabbable:after{clear:both;} -.tab-content{overflow:auto;} -.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;} -.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} -.tab-content>.active,.pill-content>.active{display:block;} -.tabs-below>.nav-tabs{border-top:1px solid #ddd;} -.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;} -.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} -.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd;} -.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;} -.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} -.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} -.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} -.tabs-left>.nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} -.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} -.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} -.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} -.tabs-right>.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} -.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} -.nav>.disabled>a{color:#999999;} -.nav>.disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default;} -.navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2;} -.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top, #ffffff, #f2f2f2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));background-image:-webkit-linear-gradient(top, #ffffff, #f2f2f2);background-image:-o-linear-gradient(top, #ffffff, #f2f2f2);background-image:linear-gradient(to bottom, #ffffff, #f2f2f2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);-moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);*zoom:1;}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0;} -.navbar-inner:after{clear:both;} -.navbar .container{width:auto;} -.nav-collapse.collapse{height:auto;overflow:visible;} -.navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777777;text-shadow:0 1px 0 #ffffff;}.navbar .brand:hover{text-decoration:none;} -.navbar-text{margin-bottom:0;line-height:40px;color:#777777;} -.navbar-link{color:#777777;}.navbar-link:hover{color:#333333;} -.navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #f2f2f2;border-right:1px solid #ffffff;} -.navbar .btn,.navbar .btn-group{margin-top:5px;} -.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn{margin-top:0;} -.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;} -.navbar-form:after{clear:both;} -.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} -.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0;} -.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} -.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;} -.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0;}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} -.navbar-static-top{position:static;margin-bottom:0;}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;} -.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px;} -.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0;} -.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} -.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} -.navbar-fixed-top{top:0;} -.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1);} -.navbar-fixed-bottom{bottom:0;}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(0,0,0,.1);} -.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} -.navbar .nav.pull-right{float:right;margin-right:0;} -.navbar .nav>li{float:left;} -.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777777;text-decoration:none;text-shadow:0 1px 0 #ffffff;} -.navbar .nav .dropdown-toggle .caret{margin-top:8px;} -.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333333;text-decoration:none;} -.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);} -.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#ededed;background-image:-moz-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));background-image:-webkit-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-o-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:linear-gradient(to bottom, #f2f2f2, #e5e5e5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e5e5e5;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#ffffff;background-color:#e5e5e5;*background-color:#d9d9d9;} -.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#cccccc \9;} -.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} -.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} -.navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} -.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} -.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;} -.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;} -.navbar .nav li.dropdown>a:hover .caret{border-top-color:#555555;border-bottom-color:#555555;} -.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e5e5e5;color:#555555;} -.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777777;border-bottom-color:#777777;} -.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} -.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;} -.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;} -.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} -.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222222, #111111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));background-image:-webkit-linear-gradient(top, #222222, #111111);background-image:-o-linear-gradient(top, #222222, #111111);background-image:linear-gradient(to bottom, #222222, #111111);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);border-color:#252525;} -.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#ffffff;} -.navbar-inverse .brand{color:#999999;} -.navbar-inverse .navbar-text{color:#999999;} -.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;} -.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;} -.navbar-inverse .navbar-link{color:#999999;}.navbar-inverse .navbar-link:hover{color:#ffffff;} -.navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;} -.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;} -.navbar-inverse .nav li.dropdown>a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} -.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;} -.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} -.navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;} -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;} -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;} -.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} -.navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;background-image:-moz-linear-gradient(top, #151515, #040404);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));background-image:-webkit-linear-gradient(top, #151515, #040404);background-image:-o-linear-gradient(top, #151515, #040404);background-image:linear-gradient(to bottom, #151515, #040404);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);border-color:#040404 #040404 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#040404;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#ffffff;background-color:#040404;*background-color:#000000;} -.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;} -.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.breadcrumb>li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;}.breadcrumb>li>.divider{padding:0 5px;color:#ccc;} -.breadcrumb>.active{color:#999999;} -.pagination{margin:20px 0;} -.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} -.pagination ul>li{display:inline;} -.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;} -.pagination ul>li>a:hover,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5;} -.pagination ul>.active>a,.pagination ul>.active>span{color:#999999;cursor:default;} -.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#999999;background-color:transparent;cursor:default;} -.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} -.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} -.pagination-centered{text-align:center;} -.pagination-right{text-align:right;} -.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px;} -.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} -.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} -.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px;} -.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px;} -.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px;} -.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px;} -.pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";line-height:0;} -.pager:after{clear:both;} -.pager li{display:inline;} -.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} -.pager li>a:hover{text-decoration:none;background-color:#f5f5f5;} -.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>span{color:#999999;background-color:#fff;cursor:default;} -.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;} -.thumbnails:after{clear:both;} -.row-fluid .thumbnails{margin-left:0;} -.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;} -.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;} -a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} -.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} -.thumbnail .caption{padding:9px;color:#555555;} -.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.alert,.alert h4{color:#c09853;} -.alert h4{margin:0;} -.alert .close{position:relative;top:-2px;right:-21px;line-height:20px;} -.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;} -.alert-success h4{color:#468847;} -.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;} -.alert-danger h4,.alert-error h4{color:#b94a48;} -.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;} -.alert-info h4{color:#3a87ad;} -.alert-block{padding-top:14px;padding-bottom:14px;} -.alert-block>p,.alert-block>ul{margin-bottom:0;} -.alert-block p+p{margin-top:5px;} -@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(to bottom, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} -.progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} -.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);} -.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} -.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} -.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);} -.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);} -.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);} -.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);} -.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} -.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;} -.hero-unit li{line-height:30px;} -.media,.media-body{overflow:hidden;*overflow:visible;zoom:1;} -.media,.media .media{margin-top:15px;} -.media:first-child{margin-top:0;} -.media-object{display:block;} -.media-heading{margin:0 0 5px;} -.media .pull-left{margin-right:10px;} -.media .pull-right{margin-left:10px;} -.media-list{margin-left:0;list-style:none;} -.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-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-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} -.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} -.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);} -button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;} -.pull-right{float:right;} -.pull-left{float:left;} -.hide{display:none;} -.show{display:block;} -.invisible{visibility:hidden;} -.affix{position:fixed;} -.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;} -.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;} -.hidden{display:none;visibility:hidden;} -.visible-phone{display:none !important;} -.visible-tablet{display:none !important;} -.hidden-desktop{display:none !important;} -.visible-desktop{display:inherit !important;} -@media (min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important ;} .visible-tablet{display:inherit !important;} .hidden-tablet{display:none !important;}}@media (max-width:767px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important;} .visible-phone{display:inherit !important;} .hidden-phone{display:none !important;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-left:-20px;margin-right:-20px;} .container-fluid{padding:0;} .dl-horizontal dt{float:none;clear:none;width:auto;text-align:left;} .dl-horizontal dd{margin-left:0;} .container{width:auto;} .row-fluid{width:100%;} .row,.thumbnails{margin-left:0;} .thumbnails>li{float:none;margin-left:0;} [class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{float:none;display:block;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .row-fluid [class*="offset"]:first-child{margin-left:0;} .input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto;} .controls-row [class*="span"]+[class*="span"]{margin-left:0;} .modal{position:fixed;top:20px;left:20px;right:20px;width:auto;margin:0;}.modal.fade{top:-100px;} .modal.fade.in{top:20px;}}@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:20px;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .media .pull-left,.media .pull-right{float:none;display:block;margin-bottom:10px;} .media-object{margin-right:0;margin-left:0;} .modal{top:10px;left:10px;right:10px;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:20px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px;} .span12{width:724px;} .span11{width:662px;} .span10{width:600px;} .span9{width:538px;} .span8{width:476px;} .span7{width:414px;} .span6{width:352px;} .span5{width:290px;} .span4{width:228px;} .span3{width:166px;} .span2{width:104px;} .span1{width:42px;} .offset12{margin-left:764px;} .offset11{margin-left:702px;} .offset10{margin-left:640px;} .offset9{margin-left:578px;} .offset8{margin-left:516px;} .offset7{margin-left:454px;} .offset6{margin-left:392px;} .offset5{margin-left:330px;} .offset4{margin-left:268px;} .offset3{margin-left:206px;} .offset2{margin-left:144px;} .offset1{margin-left:82px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%;} .row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%;} .row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%;} .row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%;} .row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%;} .row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%;} .row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%;} .row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%;} .row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%;} .row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%;} .row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%;} .row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%;} .row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%;} .row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%;} .row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%;} .row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%;} .row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%;} .row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%;} .row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%;} .row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%;} .row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%;} .row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%;} .row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%;} .row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%;} .row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%;} .row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%;} .row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%;} .row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%;} .row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%;} .row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%;} .row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%;} .row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%;} .row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%;} .row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%;} .row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:20px;} input.span12, textarea.span12, .uneditable-input.span12{width:710px;} input.span11, textarea.span11, .uneditable-input.span11{width:648px;} input.span10, textarea.span10, .uneditable-input.span10{width:586px;} input.span9, textarea.span9, .uneditable-input.span9{width:524px;} input.span8, textarea.span8, .uneditable-input.span8{width:462px;} input.span7, textarea.span7, .uneditable-input.span7{width:400px;} input.span6, textarea.span6, .uneditable-input.span6{width:338px;} input.span5, textarea.span5, .uneditable-input.span5{width:276px;} input.span4, textarea.span4, .uneditable-input.span4{width:214px;} input.span3, textarea.span3, .uneditable-input.span3{width:152px;} input.span2, textarea.span2, .uneditable-input.span2{width:90px;} input.span1, textarea.span1, .uneditable-input.span1{width:28px;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:30px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px;} .span12{width:1170px;} .span11{width:1070px;} .span10{width:970px;} .span9{width:870px;} .span8{width:770px;} .span7{width:670px;} .span6{width:570px;} .span5{width:470px;} .span4{width:370px;} .span3{width:270px;} .span2{width:170px;} .span1{width:70px;} .offset12{margin-left:1230px;} .offset11{margin-left:1130px;} .offset10{margin-left:1030px;} .offset9{margin-left:930px;} .offset8{margin-left:830px;} .offset7{margin-left:730px;} .offset6{margin-left:630px;} .offset5{margin-left:530px;} .offset4{margin-left:430px;} .offset3{margin-left:330px;} .offset2{margin-left:230px;} .offset1{margin-left:130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%;} .row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%;} .row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%;} .row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%;} .row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%;} .row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%;} .row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%;} .row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%;} .row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%;} .row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%;} .row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%;} .row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%;} .row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%;} .row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%;} .row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%;} .row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%;} .row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%;} .row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%;} .row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%;} .row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%;} .row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%;} .row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%;} .row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%;} .row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%;} .row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%;} .row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%;} .row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%;} .row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%;} .row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%;} .row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%;} .row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%;} .row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%;} .row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%;} .row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%;} .row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:30px;} input.span12, textarea.span12, .uneditable-input.span12{width:1156px;} input.span11, textarea.span11, .uneditable-input.span11{width:1056px;} input.span10, textarea.span10, .uneditable-input.span10{width:956px;} input.span9, textarea.span9, .uneditable-input.span9{width:856px;} input.span8, textarea.span8, .uneditable-input.span8{width:756px;} input.span7, textarea.span7, .uneditable-input.span7{width:656px;} input.span6, textarea.span6, .uneditable-input.span6{width:556px;} input.span5, textarea.span5, .uneditable-input.span5{width:456px;} input.span4, textarea.span4, .uneditable-input.span4{width:356px;} input.span3, textarea.span3, .uneditable-input.span3{width:256px;} input.span2, textarea.span2, .uneditable-input.span2{width:156px;} input.span1, textarea.span1, .uneditable-input.span1{width:56px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;} .row-fluid .thumbnails{margin-left:0;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top,.navbar-fixed-bottom{position:static;} .navbar-fixed-top{margin-bottom:20px;} .navbar-fixed-bottom{margin-top:20px;} .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .nav-collapse{clear:both;} .nav-collapse .nav{float:none;margin:0 0 10px;} .nav-collapse .nav>li{float:none;} .nav-collapse .nav>li>a{margin-bottom:2px;} .nav-collapse .nav>.divider-vertical{display:none;} .nav-collapse .nav .nav-header{color:#777777;text-shadow:none;} .nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .nav-collapse .dropdown-menu li+li a{margin-bottom:2px;} .nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2;} .navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999999;} .navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111111;} .nav-collapse.in .btn-group{margin-top:5px;padding:0;} .nav-collapse .dropdown-menu{position:static;top:auto;left:auto;float:none;display:none;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .nav-collapse .open>.dropdown-menu{display:block;} .nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none;} .nav-collapse .dropdown-menu .divider{display:none;} .nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none;} .nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);-moz-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);} .navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111111;border-bottom-color:#111111;} .navbar .nav-collapse .nav.pull-right{float:none;margin-left:0;} .nav-collapse,.nav-collapse.collapse{overflow:hidden;height:0;} .navbar .btn-navbar{display:block;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;overflow:visible !important;}} diff --git a/docs/assets/themes/twitter/bootstrap/img/glyphicons-halflings-white.png b/docs/assets/themes/twitter/bootstrap/img/glyphicons-halflings-white.png deleted file mode 100644 index 3bf6484a29d8da269f9bc874b25493a45fae3bae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8777 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 B7G?kd diff --git a/docs/assets/themes/twitter/bootstrap/img/glyphicons-halflings.png b/docs/assets/themes/twitter/bootstrap/img/glyphicons-halflings.png deleted file mode 100644 index a9969993201f9cee63cf9f49217646347297b643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12799 zcma*OWmH^Ivn@*S;K3nSf_t!#;0f+&pm7Po8`nk}2q8f5;M%x$SdAkd9FAvlc$ zx660V9e3Ox@4WZ^?7jZ%QFGU-T~%||Ug4iK6bbQY@zBuF2$hxOw9wF=A)nUSxR_5@ zEX>HBryGrjyuOFFv$Y4<+|3H@gQfEqD<)+}a~mryD|1U9*I_FOG&F%+Ww{SJ-V2BR zjt<81Ek$}Yb*95D4RS0HCps|uLyovt;P05hchQb-u2bzLtmog&f2}1VlNhxXV);S9 zM2buBg~!q9PtF)&KGRgf3#z7B(hm5WlNClaCWFs!-P!4-u*u5+=+D|ZE9e`KvhTHT zJBnLwGM%!u&vlE%1ytJ=!xt~y_YkFLQb6bS!E+s8l7PiPGSt9xrmg?LV&&SL?J~cI zS(e9TF1?SGyh+M_p@o1dyWu7o7_6p;N6hO!;4~ z2B`I;y`;$ZdtBpvK5%oQ^p4eR2L)BH>B$FQeC*t)c`L71gXHPUa|vyu`Bnz)H$ZcXGve(}XvR!+*8a>BLV;+ryG1kt0=)ytl zNJxFUN{V7P?#|Cp85QTa@(*Q3%K-R(Pkv1N8YU*(d(Y}9?PQ(j;NzWoEVWRD-~H$=f>j9~PN^BM2okI(gY-&_&BCV6RP&I$FnSEM3d=0fCxbxA6~l>54-upTrw zYgX@%m>jsSGi`0cQt6b8cX~+02IghVlNblR7eI;0ps}mpWUcxty1yG56C5rh%ep(X z?)#2d?C<4t-KLc*EAn>>M8%HvC1TyBSoPNg(4id~H8JwO#I)Bf;N*y6ai6K9_bA`4 z_g9(-R;qyH&6I$`b42v|0V3Z8IXN*p*8g$gE98+JpXNY+jXxU0zsR^W$#V=KP z3AEFp@OL}WqwOfsV<)A^UTF4&HF1vQecz?LWE@p^Z2){=KEC_3Iopx_eS42>DeiDG zWMXGbYfG~W7C8s@@m<_?#Gqk;!&)_Key@^0xJxrJahv{B&{^!>TV7TEDZlP|$=ZCz zmX=ZWtt4QZKx**)lQQoW8y-XLiOQy#T`2t}p6l*S`68ojyH@UXJ-b~@tN`WpjF z%7%Yzv807gsO!v=!(2uR)16!&U5~VPrPHtGzUU?2w(b1Xchq}(5Ed^G|SD7IG+kvgyVksU) z(0R)SW1V(>&q2nM%Z!C9=;pTg!(8pPSc%H01urXmQI6Gi^dkYCYfu6b4^tW))b^U+ z$2K&iOgN_OU7n#GC2jgiXU{caO5hZt0(>k+c^(r><#m|#J^s?zA6pi;^#*rp&;aqL zRcZi0Q4HhVX3$ybclxo4FFJW*`IV`)Bj_L3rQe?5{wLJh168Ve1jZv+f1D}f0S$N= zm4i|9cEWz&C9~ZI3q*gwWH^<6sBWuphgy@S3Qy?MJiL>gwd|E<2h9-$3;gT9V~S6r z)cAcmE0KXOwDA5eJ02-75d~f?3;n7a9d_xPBJaO;Z)#@s7gk5$Qn(Fc^w@9c5W0zY z59is0?Mt^@Rolcn{4%)Ioat(kxQH6}hIykSA)zht=9F_W*D#<}N(k&&;k;&gKkWIL z0Of*sP=X(Uyu$Pw;?F@?j{}=>{aSHFcii#78FC^6JGrg-)!)MV4AKz>pXnhVgTgx8 z1&5Y=>|8RGA6++FrSy=__k_imx|z-EI@foKi>tK0Hq2LetjUotCgk2QFXaej!BWYL zJc{fv(&qA7UUJ|AXLc5z*_NW#yWzKtl(c8mEW{A>5Hj^gfZ^HC9lQNQ?RowXjmuCj4!!54Us1=hY z0{@-phvC}yls!PmA~_z>Y&n&IW9FQcj}9(OLO-t^NN$c0o}YksCUWt|DV(MJB%%Sr zdf}8!9ylU2TW!=T{?)g-ojAMKc>3pW;KiZ7f0;&g)k}K^#HBhE5ot)%oxq$*$W@b# zg4p<Ou`ME|Kd1WHK@8 zzLD+0(NHWa`B{em3Ye?@aVsEi>y#0XVZfaFuq#;X5C3{*ikRx7UY4FF{ZtNHNO?A_ z#Q?hwRv~D8fPEc%B5E-ZMI&TAmikl||EERumQCRh7p;)>fdZMxvKq;ky0}7IjhJph zW*uuu*(Y6)S;Od--8uR^R#sb$cmFCnPcj9PPCWhPN;n`i1Q#Qn>ii z{WR|0>8F`vf&#E(c2NsoH=I7Cd-FV|%(7a`i}gZw4N~QFFG2WtS^H%@c?%9UZ+kez z;PwGgg_r6V>Kn5n(nZ40P4qMyrCP3bDkJp@hp6&X3>gzC>=f@Hsen<%I~7W+x@}b> z0}Et*vx_50-q@PIV=(3&Tbm}}QRo*FP2@)A#XX-8jYspIhah`9ukPBr)$8>Tmtg&R z?JBoH17?+1@Y@r>anoKPQ}F8o9?vhcG79Cjv^V6ct709VOQwg{c0Q#rBSsSmK3Q;O zBpNihl3S0_IGVE)^`#94#j~$;7+u870yWiV$@={|GrBmuz4b)*bCOPkaN0{6$MvazOEBxFdKZDlbVvv{8_*kJ zfE6C`4&Kkz<5u%dEdStd85-5UHG5IOWbo8i9azgg#zw-(P1AA049hddAB*UdG3Vn0 zX`OgM+EM|<+KhJ<=k?z~WA5waVj?T9eBdfJGebVifBKS1u<$#vl^BvSg)xsnT5Aw_ZY#}v*LXO#htB>f}x3qDdDHoFeb zAq7;0CW;XJ`d&G*9V)@H&739DpfWYzdQt+Kx_E1K#Cg1EMtFa8eQRk_JuUdHD*2;W zR~XFnl!L2A?48O;_iqCVr1oxEXvOIiN_9CUVTZs3C~P+11}ebyTRLACiJuMIG#`xP zKlC|E(S@QvN+%pBc6vPiQS8KgQAUh75C0a2xcPQDD$}*bM&z~g8+=9ltmkT$;c;s z5_=8%i0H^fEAOQbHXf0;?DN5z-5+1 zDxj50yYkz4ox9p$HbZ|H?8ukAbLE^P$@h}L%i6QVcY>)i!w=hkv2zvrduut%!8>6b zcus3bh1w~L804EZ*s96?GB&F7c5?m?|t$-tp2rKMy>F*=4;w*jW}^;8v`st&8)c; z2Ct2{)?S(Z;@_mjAEjb8x=qAQvx=}S6l9?~H?PmP`-xu;ME*B8sm|!h@BX4>u(xg_ zIHmQzp4Tgf*J}Y=8STR5_s)GKcmgV!$JKTg@LO402{{Wrg>#D4-L%vjmtJ4r?p&$F!o-BOf7ej~ z6)BuK^^g1b#(E>$s`t3i13{6-mmSp7{;QkeG5v}GAN&lM2lQT$@(aQCcFP(%UyZbF z#$HLTqGT^@F#A29b0HqiJsRJAlh8kngU`BDI6 zJUE~&!cQ*&f95Ot$#mxU5+*^$qg_DWNdfu+1irglB7yDglzH()2!@#rpu)^3S8weW z_FE$=j^GTY*|5SH95O8o8W9FluYwB=2PwtbW|JG6kcV^dMVmX(wG+Otj;E$%gfu^K z!t~<3??8=()WQSycsBKy24>NjRtuZ>zxJIED;YXaUz$@0z4rl+TW zWxmvM$%4jYIpO>j5k1t1&}1VKM~s!eLsCVQ`TTjn3JRXZD~>GM z$-IT~(Y)flNqDkC%DfbxaV9?QuWCV&-U1yzrV@0jRhE;)ZO0=r-{s@W?HOFbRHDDV zq;eLo+wOW;nI|#mNf(J?RImB9{YSO2Y`9825Lz#u4(nk3)RGv3X8B(A$TsontJ8L! z9JP^eWxtKC?G8^xAZa1HECx*rp35s!^%;&@Jyk)NexVc)@U4$^X1Dag6`WKs|(HhZ#rzO2KEw3xh~-0<;|zcs0L>OcO#YYX{SN8m6`9pp+ zQG@q$I)T?aoe#AoR@%om_#z=c@ych!bj~lV13Qi-xg$i$hXEAB#l=t7QWENGbma4L zbBf*X*4oNYZUd_;1{Ln_ZeAwQv4z?n9$eoxJeI?lU9^!AB2Y~AwOSq67dT9ADZ)s@ zCRYS7W$Zpkdx$3T>7$I%3EI2ik~m!f7&$Djpt6kZqDWZJ-G{*_eXs*B8$1R4+I}Kf zqniwCI64r;>h2Lu{0c(#Atn)%E8&)=0S4BMhq9$`vu|Ct;^ur~gL`bD>J@l)P$q_A zO7b3HGOUG`vgH{}&&AgrFy%K^>? z>wf**coZ2vdSDcNYSm~dZ(vk6&m6bVKmVgrx-X<>{QzA!)2*L+HLTQz$e8UcB&Djq zl)-%s$ZtUN-R!4ZiG=L0#_P=BbUyH+YPmFl_ogkkQ$=s@T1v}rNnZ^eMaqJ|quc+6 z*ygceDOrldsL30w`H;rNu+IjlS+G~p&0SawXCA1+D zC%cZtjUkLNq%FadtHE?O(yQTP486A{1x<{krq#rpauNQaeyhM3*i0%tBpQHQo-u)x z{0{&KS`>}vf2_}b160XZO2$b)cyrHq7ZSeiSbRvaxnKUH{Q`-P(nL&^fcF2){vhN- zbX&WEjP7?b4A%0y6n_=m%l00uZ+}mCYO(!x?j$+O$*TqoD_Q5EoyDJ?w?^UIa491H zE}87(bR`X;@u#3Qy~9wWdWQIg1`cXrk$x9=ccR|RY1~%{fAJ@uq@J3e872x0v$hmv ze_KcL(wM|n0EOp;t{hKoohYyDmYO;!`7^Lx;0k=PWPGZpI>V5qYlzjSL_(%|mud50 z7#{p97s`U|Sn$WYF>-i{i4`kzlrV6a<}=72q2sAT7Zh{>P%*6B;Zl;~0xWymt10Mo zl5{bmR(wJefJpNGK=fSRP|mpCI-)Nf6?Pv==FcFmpSwF1%CTOucV{yqxSyx4Zws3O z8hr5Uyd%ezIO7?PnEO0T%af#KOiXD$e?V&OX-B|ZX-YsgSs%sv-6U+sLPuz{D4bq| zpd&|o5tNCmpT>(uIbRf?8c}d3IpOb3sn6>_dr*26R#ev<_~vi)wleW$PX|5)$_ z+_|=pi(0D(AB_sjQ;sQQSM&AWqzDO1@NHw;C9cPdXRKRI#@nUW)CgFxzQ1nyd!+h& zcjU!U=&u|>@}R(9D$%lu2TlV>@I2-n@fCr5PrZNVyKWR7hm zWjoy^p7v8m#$qN0K#8jT- zq`mSirDZDa1Jxm;Rg3rAPhC)LcI4@-RvKT+@9&KsR3b0_0zuM!Fg7u>oF>3bzOxZPU&$ab$Z9@ zY)f7pKh22I7ZykL{YsdjcqeN++=0a}elQM-4;Q)(`Ep3|VFHqnXOh14`!Bus& z9w%*EWK6AiAM{s$6~SEQS;A>ey$#`7)khZvamem{P?>k)5&7Sl&&NXKk}o!%vd;-! zpo2p-_h^b$DNBO>{h4JdGB=D>fvGIYN8v&XsfxU~VaefL?q} z3ekM?iOKkCzQHkBkhg=hD!@&(L}FcHKoa zbZ7)H1C|lHjwEb@tu=n^OvdHOo7o+W`0-y3KdP#bb~wM=Vr_gyoEq|#B?$&d$tals ziIs-&7isBpvS|CjC|7C&3I0SE?~`a%g~$PI%;au^cUp@ER3?mn-|vyu!$7MV6(uvt z+CcGuM(Ku2&G0tcRCo7#D$Dirfqef2qPOE5I)oCGzmR5G!o#Q~(k~)c=LpIfrhHQk zeAva6MilEifE7rgP1M7AyWmLOXK}i8?=z2;N=no)`IGm#y%aGE>-FN zyXCp0Sln{IsfOBuCdE*#@CQof%jzuU*jkR*Su3?5t}F(#g0BD0Zzu|1MDes8U7f9; z$JBg|mqTXt`muZ8=Z`3wx$uizZG_7>GI7tcfOHW`C2bKxNOR)XAwRkLOaHS4xwlH4 zDpU29#6wLXI;H?0Se`SRa&I_QmI{zo7p%uveBZ0KZKd9H6@U?YGArbfm)D*^5=&Rp z`k{35?Z5GbZnv>z@NmJ%+sx=1WanWg)8r}C_>EGR8mk(NR$pW<-l8OTU^_u3M@gwS z7}GGa1)`z5G|DZirw;FB@VhH7Dq*0qc=|9lLe{w2#`g+_nt>_%o<~9(VZe=zI*SSz4w43-_o>4E4`M@NPKTWZuQJs)?KXbWp1M zimd5F;?AP(LWcaI-^Sl{`~>tmxsQB9Y$Xi*{Zr#py_+I$vx7@NY`S?HFfS!hUiz$a z{>!&e1(16T!Om)m)&k1W#*d#GslD^4!TwiF2WjFBvi=Ms!ADT)ArEW6zfVuIXcXVk z>AHjPADW+mJzY`_Ieq(s?jbk4iD2Rb8*V3t6?I+E06(K8H!!xnDzO%GB;Z$N-{M|B zeT`jo%9)s%op*XZKDd6*)-^lWO{#RaIGFdBH+;XXjI(8RxpBc~azG1H^2v7c^bkFE zZCVPE+E*Q=FSe8Vm&6|^3ki{9~qafiMAf7i4APZg>b%&5>nT@pHH z%O*pOv(77?ZiT{W zBibx}Q12tRc7Py1NcZTp`Q4ey%T_nj@1WKg5Fz_Rjl4wlJQj)rtp8yL3r!Shy zvZvnmh!tH4T6Js-?vI0<-rzzl{mgT*S0d_7^AU_8gBg^03o-J=p(1o6kww2hx|!%T z-jqp}m^G*W?$!R#M%Ef?&2jYxmx+lXWZszpI4d$pUN`(S)|*c^CgdwY>Fa>> zgGBJhwe8y#Xd*q0=@SLEgPF>+Qe4?%E*v{a`||luZ~&dqMBrRfJ{SDMaJ!s_;cSJp zSqZHXIdc@@XteNySUZs^9SG7xK`8=NBNM)fRVOjw)D^)w%L2OPkTQ$Tel-J)GD3=YXy+F4in(ILy*A3m@3o73uv?JC}Q>f zrY&8SWmesiba0|3X-jmlMT3 z*ST|_U@O=i*sM_*48G)dgXqlwoFp5G6qSM3&%_f_*n!PiT>?cNI)fAUkA{qWnqdMi+aNK_yVQ&lx4UZknAc9FIzVk% zo6JmFH~c{_tK!gt4+o2>)zoP{sR}!!vfRjI=13!z5}ijMFQ4a4?QIg-BE4T6!#%?d&L;`j5=a`4is>U;%@Rd~ zXC~H7eGQhhYWhMPWf9znDbYIgwud(6$W3e>$W4$~d%qoJ z+JE`1g$qJ%>b|z*xCKenmpV$0pM=Gl-Y*LT8K+P)2X#;XYEFF4mRbc~jj?DM@(1e`nL=F4Syv)TKIePQUz)bZ?Bi3@G@HO$Aps1DvDGkYF50O$_welu^cL7;vPiMGho74$;4fDqKbE{U zd1h{;LfM#Fb|Z&uH~Rm_J)R~Vy4b;1?tW_A)Iz#S_=F|~pISaVkCnQ0&u%Yz%o#|! zS-TSg87LUfFSs{tTuM3$!06ZzH&MFtG)X-l7>3)V?Txuj2HyG*5u;EY2_5vU0ujA? zHXh5G%6e3y7v?AjhyX79pnRBVr}RmPmtrxoB7lkxEzChX^(vKd+sLh?SBic=Q)5nA zdz7Mw3_iA>;T^_Kl~?1|5t%GZ;ki_+i>Q~Q1EVdKZ)$Sh3LM@ea&D~{2HOG++7*wF zAC6jW4>fa~!Vp5+$Z{<)Qxb|{unMgCv2)@%3j=7)Zc%U<^i|SAF88s!A^+Xs!OASYT%7;Jx?olg_6NFP1475N z#0s<@E~FI}#LNQ{?B1;t+N$2k*`K$Hxb%#8tRQi*Z#No0J}Pl;HWb){l7{A8(pu#@ zfE-OTvEreoz1+p`9sUI%Y{e5L-oTP_^NkgpYhZjp&ykinnW;(fu1;ttpSsgYM8ABX4dHe_HxU+%M(D=~) zYM}XUJ5guZ;=_ZcOsC`_{CiU$zN3$+x&5C`vX-V3`8&RjlBs^rf00MNYZW+jCd~7N z%{jJuUUwY(M`8$`B>K&_48!Li682ZaRknMgQ3~dnlp8C?__!P2z@=Auv;T^$yrsNy zCARmaA@^Yo2sS%2$`031-+h9KMZsIHfB>s@}>Y(z988e!`%4=EDoAQ0kbk>+lCoK60Mx9P!~I zlq~wf7kcm_NFImt3ZYlE(b3O1K^QWiFb$V^a2Jlwvm(!XYx<`i@ZMS3UwFt{;x+-v zhx{m=m;4dgvkKp5{*lfSN3o^keSpp9{hlXj%=}e_7Ou{Yiw(J@NXuh*;pL6@$HsfB zh?v+r^cp@jQ4EspC#RqpwPY(}_SS$wZ{S959`C25777&sgtNh%XTCo9VHJC-G z;;wi9{-iv+ETiY;K9qvlEc04f;ZnUP>cUL_T*ms``EtGoP^B#Q>n2dSrbAg8a>*Lg zd0EJ^=tdW~7fbcLFsqryFEcy*-8!?;n%;F+8i{eZyCDaiYxghr z$8k>L|2&-!lhvuVdk!r-kpSFl`5F5d4DJr%M4-qOy3gdmQbqF1=aBtRM7)c_Ae?$b8 zQg4c8*KQ{XJmL)1c7#0Yn0#PTMEs4-IHPjkn0!=;JdhMXqzMLeh`yOylXROP- zl#z3+fwM9l3%VN(6R77ua*uI9%hO7l7{+Hcbr(peh;afUK?B4EC09J{-u{mv)+u#? zdKVBCPt`eU@IzL)OXA`Ebu`Xp?u0m%h&X41}FNfnJ*g1!1wcbbpo%F4x!-#R9ft!8{5`Ho}04?FI#Kg zL|k`tF1t_`ywdy8(wnTut>HND(qNnq%Sq=AvvZbXnLx|mJhi!*&lwG2g|edBdVgLy zjvVTKHAx(+&P;P#2Xobo7_RttUi)Nllc}}hX>|N?-u5g7VJ-NNdwYcaOG?NK=5)}` zMtOL;o|i0mSKm(UI_7BL_^6HnVOTkuPI6y@ZLR(H?c1cr-_ouSLp{5!bx^DiKd*Yb z{K78Ci&Twup zTKm)ioN|wcYy%Qnwb)IzbH>W!;Ah5Zdm_jRY`+VRJ2 zhkspZ9hbK3iQD91A$d!0*-1i#%x81|s+SPRmD}d~<1p6!A13(!vABP2kNgqEG z?AMgl^P+iRoIY(9@_I?n1829lGvAsRnHwS~|5vD2+Zi53j<5N4wNn0{q>>jF9*bI) zL$kMXM-awNOElF>{?Jr^tOz1glbwaD-M0OKOlTeW3C!1ZyxRbB>8JDof(O&R1bh%3x#>y2~<>OXO#IIedH0Q`(&&?eo-c~ z>*Ah#3~09unym~UC-UFqqI>{dmUD$Y4@evG#ORLI*{ZM)Jl=e1it!XzY($S3V zLG!Y6fCjE>x6r@5FG1n|8ompSZaJ>9)q6jqU;XxCQk9zV(?C9+i*>w z21+KYt1gXX&0`x3E)hS7I5}snbBzox9C@Xzcr|{B8Hw;SY1$}&BoYKXH^hpjW-RgJ z-Fb}tannKCv>y~^`r|(1Q9;+sZlYf3XPSX|^gR01UFtu$B*R;$sPZdIZShRr>|b@J z;#G{EdoY+O;REEjQ}X7_YzWLO+Ey3>a_KDe1CjSe| z6arqcEZ)CX!8r(si`dqbF$uu&pnf^Np{1f*TdJ`r2;@SaZ z#hb4xlaCA@Pwqj#LlUEe5L{I$k(Zj$d3(~)u(F%&xb8={N9hKxlZIO1ABsM{Mt|)2 zJ^t9Id;?%4PfR4&Ph9B9cFK~@tG3wlFW-0fXZS_L4U*EiAA%+`h%q2^6BCC;t0iO4V=s4Qug{M|iDV@s zC7|ef-dxiR7T&Mpre!%hiUhHM%3Qxi$Lzw6&(Tvlx9QA_7LhYq<(o~=Y>3ka-zrQa zhGpfFK@)#)rtfz61w35^sN1=IFw&Oc!Nah+8@qhJ0UEGr;JplaxOGI82OVqZHsqfX ze1}r{jy;G?&}Da}a7>SCDsFDuzuseeCKof|Dz2BPsP8? zY;a)Tkr2P~0^2BeO?wnzF_Ul-ekY=-w26VnU%U3f19Z-pj&2 z4J_a|o4Dci+MO)mPQIM>kdPG1xydiR9@#8m zh27D7GF{p|a{8({Q-Pr-;#jV{2zHR>lGoFtIfIpoMo?exuQyX_A;;l0AP4!)JEM$EwMInZkj+8*IHP4vKRd zKx_l-i*>A*C@{u%ct`y~s6MWAfO{@FPIX&sg8H{GMDc{4M3%$@c8&RAlw0-R<4DO3 trJqdc$mBpWeznn?E0M$F`|3v=`3%T2A17h;rxP7$%JLd=6(2u;`(N3pt&so# diff --git a/docs/assets/themes/twitter/css/style.css b/docs/assets/themes/twitter/css/style.css deleted file mode 100644 index f61e4b5e5f8..00000000000 --- a/docs/assets/themes/twitter/css/style.css +++ /dev/null @@ -1,65 +0,0 @@ -/* Custom container */ -.container-narrow { - margin: 0 auto; - max-width: 700px; } - -.container-narrow > hr { - margin: 30px 0; } - -.navbar .nav { - float: right; } - -/* posts index */ -.post > h3.title { - position: relative; - padding-top: 10px; } - -.post > h3.title span.date { - position: absolute; - right: 0; - font-size: 0.9em; } - -.post > .more { - margin: 10px 0; - text-align: left; } - -/* post-full*/ -.post-full .date { - margin-bottom: 20px; - font-weight: bold; } - -/* tag_box */ -.tag_box { - list-style: none; - margin: 0; - overflow: hidden; } - -.tag_box li { - line-height: 28px; } - -.tag_box li i { - opacity: 0.9; } - -.tag_box.inline li { - float: left; } - -.tag_box a { - padding: 3px 6px; - margin: 2px; - background: #eee; - color: #555; - border-radius: 3px; - text-decoration: none; - border: 1px dashed #cccccc; } - -.tag_box a span { - vertical-align: super; - font-size: 0.8em; } - -.tag_box a:hover { - background-color: #e5e5e5; } - -.tag_box a.active { - background: #57A957; - border: 1px solid #4c964d; - color: #FFF; } \ No newline at end of file diff --git a/docs/community.md b/docs/community.md index bf956e0ab7a..d9ec874e94e 100644 --- a/docs/community.md +++ b/docs/community.md @@ -4,6 +4,19 @@ title: "Community" description: "" group: nav-right --- + {% include JB/setup %} diff --git a/docs/docs/development/writingzeppelininterpreter.md b/docs/docs/development/writingzeppelininterpreter.md index 95ca5ab5cd8..4bb69b4a065 100644 --- a/docs/docs/development/writingzeppelininterpreter.md +++ b/docs/docs/development/writingzeppelininterpreter.md @@ -4,6 +4,19 @@ title: "Writing Zeppelin Interpreter" description: "" group: development --- + {% include JB/setup %} ### What is Zeppelin Interpreter diff --git a/docs/docs/displaysystem/angular.md b/docs/docs/displaysystem/angular.md index c0ea19682ec..32e8253f342 100644 --- a/docs/docs/displaysystem/angular.md +++ b/docs/docs/displaysystem/angular.md @@ -4,6 +4,19 @@ title: "Angular Display System" description: "" group: display --- + {% include JB/setup %} diff --git a/docs/docs/displaysystem/display.md b/docs/docs/displaysystem/display.md index 1c1ebd5653e..132e356c448 100644 --- a/docs/docs/displaysystem/display.md +++ b/docs/docs/displaysystem/display.md @@ -4,6 +4,19 @@ title: "Text/Html Display System" description: "" group: display --- + {% include JB/setup %} diff --git a/docs/docs/displaysystem/table.md b/docs/docs/displaysystem/table.md index 188681c19e5..b1fe2af4ac5 100644 --- a/docs/docs/displaysystem/table.md +++ b/docs/docs/displaysystem/table.md @@ -4,6 +4,19 @@ title: "Table Display System" description: "" group: display --- + {% include JB/setup %} diff --git a/docs/docs/index.md b/docs/docs/index.md index 4eb9d954289..1f1292e797a 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -4,6 +4,19 @@ title: "Docs" description: "" group: nav-right --- + {% include JB/setup %} ### Install diff --git a/docs/docs/install/install.md b/docs/docs/install/install.md index 2dc49304c8d..a4b3336b6b9 100644 --- a/docs/docs/install/install.md +++ b/docs/docs/install/install.md @@ -4,6 +4,19 @@ title: "Install Zeppelin" description: "" group: install --- + {% include JB/setup %} diff --git a/docs/docs/install/yarn_install.md b/docs/docs/install/yarn_install.md index 549b770b6e4..2b38068647f 100644 --- a/docs/docs/install/yarn_install.md +++ b/docs/docs/install/yarn_install.md @@ -4,6 +4,19 @@ title: "Install Zeppelin to connect with existing YARN cluster" description: "" group: install --- + {% include JB/setup %} ## Introduction diff --git a/docs/docs/manual/dynamicform.md b/docs/docs/manual/dynamicform.md index 2b58c93fc0b..06074fdaca8 100644 --- a/docs/docs/manual/dynamicform.md +++ b/docs/docs/manual/dynamicform.md @@ -4,6 +4,19 @@ title: "Dynamic Form" description: "" group: manual --- + {% include JB/setup %} diff --git a/docs/docs/manual/interpreters.md b/docs/docs/manual/interpreters.md index c74f755ace0..ff5bff7ddd0 100644 --- a/docs/docs/manual/interpreters.md +++ b/docs/docs/manual/interpreters.md @@ -4,6 +4,19 @@ title: "Interpreters" description: "" group: manual --- + {% include JB/setup %} diff --git a/docs/docs/manual/notebookashomepage.md b/docs/docs/manual/notebookashomepage.md index f1c0fae0e54..86f1ea90bed 100644 --- a/docs/docs/manual/notebookashomepage.md +++ b/docs/docs/manual/notebookashomepage.md @@ -4,6 +4,19 @@ title: "Notebook as Homepage" description: "" group: manual --- + {% include JB/setup %} ## Customize your zeppelin homepage diff --git a/docs/docs/pleasecontribute.md b/docs/docs/pleasecontribute.md index 4724a66897c..063b48f2bee 100644 --- a/docs/docs/pleasecontribute.md +++ b/docs/docs/pleasecontribute.md @@ -4,6 +4,19 @@ title: "Please contribute" description: "" group: development --- + {% include JB/setup %} diff --git a/docs/docs/releases/zeppelin-release-0.5.0-incubating.md b/docs/docs/releases/zeppelin-release-0.5.0-incubating.md index 7f6b3479a3d..a6fbe4d8275 100644 --- a/docs/docs/releases/zeppelin-release-0.5.0-incubating.md +++ b/docs/docs/releases/zeppelin-release-0.5.0-incubating.md @@ -4,6 +4,19 @@ title: "Zeppelin Release 0.5.0-incubating" description: "" group: release --- + {% include JB/setup %} ### Zeppelin Release 0.5.0-incubating diff --git a/docs/docs/rest-api/rest-interpreter.md b/docs/docs/rest-api/rest-interpreter.md index e3f27cacb61..d8523402847 100644 --- a/docs/docs/rest-api/rest-interpreter.md +++ b/docs/docs/rest-api/rest-interpreter.md @@ -4,6 +4,19 @@ title: "Interpreter REST API" description: "" group: rest-api --- + {% include JB/setup %} ## Zeppelin REST API @@ -47,7 +60,50 @@ group: rest-api sample JSON response - [Interpreter list sample](rest-json/rest-json-interpreter-list.json) + +
    +{
    +  "status": "OK",
    +  "message": "",
    +  "body": {
    +    "md.md": {
    +      "name": "md",
    +      "group": "md",
    +      "className": "org.apache.zeppelin.markdown.Markdown",
    +      "properties": {},
    +      "path": "/zeppelin/interpreter/md"
    +    },
    +    "spark.spark": {
    +      "name": "spark",
    +      "group": "spark",
    +      "className": "org.apache.zeppelin.spark.SparkInterpreter",
    +      "properties": {
    +        "spark.executor.memory": {
    +          "defaultValue": "512m",
    +          "description": "Executor memory per worker instance. ex) 512m, 32g"
    +        },
    +        "spark.cores.max": {
    +          "defaultValue": "",
    +          "description": "Total number of cores to use. Empty value uses all available core."
    +        },
    +      },
    +      "path": "/zeppelin/interpreter/spark"
    +    },
    +    "spark.sql": {
    +      "name": "sql",
    +      "group": "spark",
    +      "className": "org.apache.zeppelin.spark.SparkSqlInterpreter",
    +      "properties": {
    +        "zeppelin.spark.maxResult": {
    +          "defaultValue": "1000",
    +          "description": "Max number of SparkSQL result to display."
    +        }
    +      },
    +      "path": "/zeppelin/interpreter/spark"
    +    }
    +  }
    +}
    +        
    @@ -79,7 +135,48 @@ group: rest-api sample JSON response - [Setting list sample](rest-json/rest-json-interpreter-setting.json) + +
    +{
    +  "status": "OK",
    +  "message": "",
    +  "body": [
    +    {
    +      "id": "2AYUGP2D5",
    +      "name": "md",
    +      "group": "md",
    +      "properties": {
    +        "_empty_": ""
    +      },
    +      "interpreterGroup": [
    +        {
    +          "class": "org.apache.zeppelin.markdown.Markdown",
    +          "name": "md"
    +        }
    +      ]
    +    },  
    +    {
    +      "id": "2AY6GV7Q3",
    +      "name": "spark",
    +      "group": "spark",
    +      "properties": {
    +        "spark.cores.max": "",
    +        "spark.executor.memory": "512m",
    +      },
    +      "interpreterGroup": [
    +        {
    +          "class": "org.apache.zeppelin.spark.SparkInterpreter",
    +          "name": "spark"
    +        },
    +        {
    +          "class": "org.apache.zeppelin.spark.SparkSqlInterpreter",
    +          "name": "sql"
    +        }
    +      ]
    +    }
    +  ]
    +}
    +        
    @@ -111,13 +208,48 @@ group: rest-api sample JSON input - [Create JSON sample](rest-json/rest-json-interpreter-create.json) + +
    +{
    +  "name": "Markdown setting name",
    +  "group": "md",
    +  "properties": {
    +    "propname": "propvalue"
    +  },
    +  "interpreterGroup": [
    +    {
    +      "class": "org.apache.zeppelin.markdown.Markdown",
    +      "name": "md"
    +    }
    +  ]
    +}
    +        
    sample JSON response - [Create response sample](rest-json/rest-json-interpreter-create-response.json) + +
    +{
    +  "status": "CREATED",
    +  "message": "",
    +  "body": {
    +    "id": "2AYW25ANY",
    +    "name": "Markdown setting name",
    +    "group": "md",
    +    "properties": {
    +      "propname": "propvalue"
    +    },
    +    "interpreterGroup": [
    +      {
    +        "class": "org.apache.zeppelin.markdown.Markdown",
    +        "name": "md"
    +      }
    +    ]
    +  }
    +}
    +        
    @@ -150,13 +282,48 @@ group: rest-api sample JSON input - [Update JSON sample](rest-json/rest-json-interpreter-update.json) + +
    +{
    +  "name": "Markdown setting name",
    +  "group": "md",
    +  "properties": {
    +    "propname": "Otherpropvalue"
    +  },
    +  "interpreterGroup": [
    +    {
    +      "class": "org.apache.zeppelin.markdown.Markdown",
    +      "name": "md"
    +    }
    +  ]
    +}
    +        
    sample JSON response - [Update response sample](rest-json/rest-json-interpreter-update-response.json) + +
    +{
    +  "status": "OK",
    +  "message": "",
    +  "body": {
    +    "id": "2AYW25ANY",
    +    "name": "Markdown setting name",
    +    "group": "md",
    +    "properties": {
    +      "propname": "Otherpropvalue"
    +    },
    +    "interpreterGroup": [
    +      {
    +        "class": "org.apache.zeppelin.markdown.Markdown",
    +        "name": "md"
    +      }
    +    ]
    +  }
    +}
    +        
    @@ -189,7 +356,8 @@ group: rest-api sample JSON response - [Delete response sample](rest-json/rest-json-interpreter-delete-response.json) + +
    {"status":"OK"}
    diff --git a/docs/docs/rest-api/rest-json/rest-json-interpreter-create-response.json b/docs/docs/rest-api/rest-json/rest-json-interpreter-create-response.json deleted file mode 100644 index dd2bda48bb3..00000000000 --- a/docs/docs/rest-api/rest-json/rest-json-interpreter-create-response.json +++ /dev/null @@ -1 +0,0 @@ -{"status":"CREATED","message":"","body":{"id":"2AYW25ANY","name":"md2","group":"md","properties":{"propname":"propvalue"},"interpreterGroup":[{"class":"org.apache.zeppelin.markdown.Markdown","name":"md"}]}} \ No newline at end of file diff --git a/docs/docs/rest-api/rest-json/rest-json-interpreter-create.json b/docs/docs/rest-api/rest-json/rest-json-interpreter-create.json deleted file mode 100644 index 778b7b42376..00000000000 --- a/docs/docs/rest-api/rest-json/rest-json-interpreter-create.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"md2","group":"md","properties":{"propname":"propvalue"},"interpreterGroup":[{"class":"org.apache.zeppelin.markdown.Markdown","name":"md"}]} \ No newline at end of file diff --git a/docs/docs/rest-api/rest-json/rest-json-interpreter-delete-response.json b/docs/docs/rest-api/rest-json/rest-json-interpreter-delete-response.json deleted file mode 100644 index 48aa9beb26c..00000000000 --- a/docs/docs/rest-api/rest-json/rest-json-interpreter-delete-response.json +++ /dev/null @@ -1 +0,0 @@ -{"status":"OK"} \ No newline at end of file diff --git a/docs/docs/rest-api/rest-json/rest-json-interpreter-list.json b/docs/docs/rest-api/rest-json/rest-json-interpreter-list.json deleted file mode 100644 index 2489c535795..00000000000 --- a/docs/docs/rest-api/rest-json/rest-json-interpreter-list.json +++ /dev/null @@ -1 +0,0 @@ -{"status":"OK","message":"","body":{"md.md":{"name":"md","group":"md","className":"org.apache.zeppelin.markdown.Markdown","properties":{},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/md"},"flink.flink":{"name":"flink","group":"flink","className":"org.apache.zeppelin.flink.FlinkInterpreter","properties":{"port":{"defaultValue":"6123","description":"port of running JobManager"},"host":{"defaultValue":"local","description":"host name of running JobManager. \u0027local\u0027 runs flink in local mode"}},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/flink"},"ignite.ignitesql":{"name":"ignitesql","group":"ignite","className":"org.apache.zeppelin.ignite.IgniteSqlInterpreter","properties":{"ignite.jdbc.url":{"defaultValue":"jdbc:ignite://localhost:11211/","description":"Ignite JDBC connection URL."}},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/ignite"},"tajo.tql":{"name":"tql","group":"tajo","className":"org.apache.zeppelin.tajo.TajoInterpreter","properties":{"tajo.jdbc.uri":{"defaultValue":"jdbc:tajo://localhost:26002/default","description":"The URL for TajoServer."}},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/tajo"},"sh.sh":{"name":"sh","group":"sh","className":"org.apache.zeppelin.shell.ShellInterpreter","properties":{},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/sh"},"hive.hql":{"name":"hql","group":"hive","className":"org.apache.zeppelin.hive.HiveInterpreter","properties":{"hive.hiveserver2.password":{"defaultValue":"","description":"The password for the hive user"},"hive.hiveserver2.user":{"defaultValue":"hive","description":"The hive user"},"hive.hiveserver2.url":{"defaultValue":"jdbc:hive2://localhost:10000","description":"The URL for HiveServer2."}},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/hive"},"ignite.ignite":{"name":"ignite","group":"ignite","className":"org.apache.zeppelin.ignite.IgniteInterpreter","properties":{"ignite.config.url":{"defaultValue":"","description":"Configuration URL. Overrides all other settings."},"ignite.peerClassLoadingEnabled":{"defaultValue":"true","description":"Peer class loading enabled. true or false"},"ignite.clientMode":{"defaultValue":"true","description":"Client mode. true or false"},"ignite.addresses":{"defaultValue":"127.0.0.1:47500..47509","description":"Coma separated list of addresses (e.g. 127.0.0.1:47500 or 127.0.0.1:47500..47509)"}},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/ignite"},"psql.sql":{"name":"sql","group":"psql","className":"org.apache.zeppelin.postgresql.PostgreSqlInterpreter","properties":{"postgresql.password":{"defaultValue":"","description":"The PostgreSQL user password"},"postgresql.max.result":{"defaultValue":"1000","description":"Max number of SQL result to display."},"postgresql.user":{"defaultValue":"gpadmin","description":"The PostgreSQL user name"},"postgresql.url":{"defaultValue":"jdbc:postgresql://localhost:5432/","description":"The URL for PostgreSQL."},"postgresql.driver.name":{"defaultValue":"org.postgresql.Driver","description":"JDBC Driver Name"}},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/psql"},"geode.oql":{"name":"oql","group":"geode","className":"org.apache.zeppelin.geode.GeodeOqlInterpreter","properties":{"geode.max.result":{"defaultValue":"1000","description":"Max number of OQL result to display."},"geode.locator.host":{"defaultValue":"localhost","description":"The Geode Locator Host."},"geode.locator.port":{"defaultValue":"10334","description":"The Geode Locator Port"}},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/geode"},"cassandra.cassandra":{"name":"cassandra","group":"cassandra","className":"org.apache.zeppelin.cassandra.CassandraInterpreter","properties":{"cassandra.pooling.new.connection.threshold.remote":{"defaultValue":"100","description":"Cassandra new connection threshold remove. Protocol V2 and below default \u003d 100Protocol V3 and above default \u003d 200"},"cassandra.query.default.fetchSize":{"defaultValue":"5000","description":"Cassandra query default fetch size. Default \u003d 5000"},"cassandra.socket.tcp.no_delay":{"defaultValue":"true","description":"Cassandra socket TCP no delay. Default \u003d true"},"cassandra.hosts":{"defaultValue":"localhost","description":"Comma separated Cassandra hosts (DNS name or IP address). Default \u003d localhost. Ex: \u0027192.168.0.12,node2,node3\u0027"},"cassandra.credentials.username":{"defaultValue":"none","description":"Cassandra credentials username. Default \u003d \u0027none\u0027"},"cassandra.pooling.new.connection.threshold.local":{"defaultValue":"100","description":"Cassandra new connection threshold local. Protocol V2 and below default \u003d 100Protocol V3 and above default \u003d 800"},"cassandra.socket.read.timeout.millisecs":{"defaultValue":"12000","description":"Cassandra socket read timeout in millisecs. Default \u003d 12000"},"cassandra.load.balancing.policy":{"defaultValue":"DEFAULT","description":"Cassandra Load Balancing Policy. Default \u003d new TokenAwarePolicy(new DCAwareRoundRobinPolicy())"},"cassandra.pooling.max.request.per.connection.local":{"defaultValue":"1024","description":"Cassandra max request per connection local. Protocol V2 and below default \u003d 128Protocol V3 and above default \u003d 1024"},"cassandra.cluster":{"defaultValue":"Test Cluster","description":"Cassandra cluster name. Default \u003d \u0027Test Cluster\u0027"},"cassandra.pooling.heartbeat.interval.seconds":{"defaultValue":"30","description":"Cassandra pool heartbeat interval in secs. Default \u003d 30"},"cassandra.query.default.serial.consistency":{"defaultValue":"SERIAL","description":"Cassandra query default serial consistency level. Default \u003d SERIAL"},"cassandra.retry.policy":{"defaultValue":"DEFAULT","description":"Cassandra Retry Policy. Default \u003d DefaultRetryPolicy.INSTANCE"},"cassandra.native.port":{"defaultValue":"9042","description":"Cassandra native port. Default \u003d 9042"},"cassandra.interpreter.parallelism":{"defaultValue":"10","description":"Cassandra interpreter parallelism.Default \u003d 10"},"cassandra.pooling.pool.timeout.millisecs":{"defaultValue":"5000","description":"Cassandra pool time out in millisecs. Default \u003d 5000"},"cassandra.pooling.max.request.per.connection.remote":{"defaultValue":"256","description":"Cassandra max request per connection remote. Protocol V2 and below default \u003d 128Protocol V3 and above default \u003d 256"},"cassandra.compression.protocol":{"defaultValue":"NONE","description":"Cassandra compression protocol. Available values: NONE, SNAPPY, LZ4. Default \u003d NONE"},"cassandra.socket.connection.timeout.millisecs":{"defaultValue":"5000","description":"Cassandra socket default connection timeout in millisecs. Default \u003d 5000"},"cassandra.query.default.consistency":{"defaultValue":"ONE","description":"Cassandra query default consistency level. Default \u003d ONE"},"cassandra.keyspace":{"defaultValue":"system","description":"Cassandra keyspace name. Default \u003d \u0027system\u0027"},"cassandra.reconnection.policy":{"defaultValue":"DEFAULT","description":"Cassandra Reconnection Policy. Default \u003d new ExponentialReconnectionPolicy(1000, 10 * 60 * 1000)"},"cassandra.pooling.max.connection.per.host.local":{"defaultValue":"8","description":"Cassandra max connection per host local. Protocol V2 and below default \u003d 8Protocol V3 and above default \u003d 1"},"cassandra.credentials.password":{"defaultValue":"none","description":"Cassandra credentials password. Default \u003d \u0027none\u0027"},"cassandra.protocol.version":{"defaultValue":"3","description":"Cassandra protocol version. Default \u003d 3"},"cassandra.max.schema.agreement.wait.second":{"defaultValue":"10","description":"Cassandra max schema agreement wait in second.Default \u003d ProtocolOptions.DEFAULT_MAX_SCHEMA_AGREEMENT_WAIT_SECONDS"},"cassandra.pooling.core.connection.per.host.remote":{"defaultValue":"1","description":"Cassandra core connection per host remove. Protocol V2 and below default \u003d 1Protocol V3 and above default \u003d 1"},"cassandra.pooling.core.connection.per.host.local":{"defaultValue":"2","description":"Cassandra core connection per host local. Protocol V2 and below default \u003d 2Protocol V3 and above default \u003d 1"},"cassandra.pooling.max.connection.per.host.remote":{"defaultValue":"2","description":"Cassandra max connection per host remote. Protocol V2 and below default \u003d 2Protocol V3 and above default \u003d 1"},"cassandra.pooling.idle.timeout.seconds":{"defaultValue":"120","description":"Cassandra idle time out in seconds. Default \u003d 120"},"cassandra.speculative.execution.policy":{"defaultValue":"DEFAULT","description":"Cassandra Speculative Execution Policy. Default \u003d NoSpeculativeExecutionPolicy.INSTANCE"}},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/cassandra"},"lens.lens":{"name":"lens","group":"lens","className":"org.apache.zeppelin.lens.LensInterpreter","properties":{"lens.server.base.url":{"defaultValue":"http://\u003chostname\u003e:\u003cport\u003e/lensapi","description":"The URL for Lens Server"},"zeppelin.lens.maxThreads":{"defaultValue":"10","description":"If concurrency is true then how many threads?"},"zeppelin.lens.maxResults":{"defaultValue":"1000","description":"max number of rows to display"},"lens.client.dbname":{"defaultValue":"default","description":"The database schema name"},"lens.query.enable.persistent.resultset":{"defaultValue":"false","description":"Apache Lens to persist result in HDFS?"},"zeppelin.lens.run.concurrent":{"defaultValue":"true","description":"Run concurrent Lens Sessions"},"lens.session.cluster.user":{"defaultValue":"default","description":"Hadoop cluster username"}},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/lens"},"spark.spark":{"name":"spark","group":"spark","className":"org.apache.zeppelin.spark.SparkInterpreter","properties":{"spark.executor.memory":{"defaultValue":"512m","description":"Executor memory per worker instance. ex) 512m, 32g"},"args":{"defaultValue":"","description":"spark commandline args"},"spark.yarn.jar":{"defaultValue":"","description":"The location of the Spark jar file. If you use yarn as a cluster, we should set this value"},"zeppelin.spark.useHiveContext":{"defaultValue":"true","description":"Use HiveContext instead of SQLContext if it is true."},"spark.app.name":{"defaultValue":"Zeppelin","description":"The name of spark application."},"spark.cores.max":{"defaultValue":"","description":"Total number of cores to use. Empty value uses all available core."},"zeppelin.spark.maxResult":{"defaultValue":"1000","description":"Max number of SparkSQL result to display."},"master":{"defaultValue":"local[*]","description":"Spark master uri. ex) spark://masterhost:7077"}},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/spark"},"angular.angular":{"name":"angular","group":"angular","className":"org.apache.zeppelin.angular.AngularInterpreter","properties":{},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/angular"},"phoenix.sql":{"name":"sql","group":"phoenix","className":"org.apache.zeppelin.phoenix.PhoenixInterpreter","properties":{"phoenix.jdbc.url":{"defaultValue":"jdbc:phoenix:localhost:2181:/hbase-unsecure","description":"Phoenix JDBC connection string"},"phoenix.user":{"defaultValue":"","description":"The Phoenix user"},"phoenix.driver.name":{"defaultValue":"org.apache.phoenix.jdbc.PhoenixDriver","description":"Phoenix Driver classname."},"phoenix.password":{"defaultValue":"","description":"The password for the Phoenix user"},"phoenix.max.result":{"defaultValue":"1000","description":"Max number of SQL results to display."}},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/phoenix"},"spark.pyspark":{"name":"pyspark","group":"spark","className":"org.apache.zeppelin.spark.PySparkInterpreter","properties":{"spark.home":{"defaultValue":"","description":"Spark home path. Should be provided for pyspark"},"zeppelin.pyspark.python":{"defaultValue":"python","description":"Python command to run pyspark with"}},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/spark"},"spark.sql":{"name":"sql","group":"spark","className":"org.apache.zeppelin.spark.SparkSqlInterpreter","properties":{"zeppelin.spark.concurrentSQL":{"defaultValue":"false","description":"Execute multiple SQL concurrently if set true."},"zeppelin.spark.maxResult":{"defaultValue":"1000","description":"Max number of SparkSQL result to display."}},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/spark"},"spark.dep":{"name":"dep","group":"spark","className":"org.apache.zeppelin.spark.DepInterpreter","properties":{"zeppelin.dep.localrepo":{"defaultValue":"local-repo","description":"local repository for dependency loader"}},"path":"/home/Downloads/incubator-zeppelin-master/interpreter/spark"}}} \ No newline at end of file diff --git a/docs/docs/rest-api/rest-json/rest-json-interpreter-setting.json b/docs/docs/rest-api/rest-json/rest-json-interpreter-setting.json deleted file mode 100644 index 04b94862515..00000000000 --- a/docs/docs/rest-api/rest-json/rest-json-interpreter-setting.json +++ /dev/null @@ -1 +0,0 @@ -{"status":"OK","message":"","body":[{"id":"2AY6GV7Q3","name":"spark","group":"spark","properties":{"spark.cores.max":"","spark.yarn.jar":"","master":"local[*]","zeppelin.spark.maxResult":"1000","zeppelin.dep.localrepo":"local-repo","spark.app.name":"Zeppelin","spark.executor.memory":"512m","zeppelin.spark.useHiveContext":"true","args":"","spark.home":"","zeppelin.spark.concurrentSQL":"false","zeppelin.pyspark.python":"python"},"interpreterGroup":[{"class":"org.apache.zeppelin.spark.SparkInterpreter","name":"spark"},{"class":"org.apache.zeppelin.spark.PySparkInterpreter","name":"pyspark"},{"class":"org.apache.zeppelin.spark.SparkSqlInterpreter","name":"sql"},{"class":"org.apache.zeppelin.spark.DepInterpreter","name":"dep"}]},{"id":"2AYUGP2D5","name":"md","group":"md","properties":{"":""},"interpreterGroup":[{"class":"org.apache.zeppelin.markdown.Markdown","name":"md"}]},{"id":"2AWBZQVB8","name":"angular","group":"angular","properties":{},"interpreterGroup":[{"class":"org.apache.zeppelin.angular.AngularInterpreter","name":"angular"}]},{"id":"2AWSES8Z8","name":"sh","group":"sh","properties":{},"interpreterGroup":[{"class":"org.apache.zeppelin.shell.ShellInterpreter","name":"sh"}]},{"id":"2AWTCSXEX","name":"hive","group":"hive","properties":{"hive.hiveserver2.url":"jdbc:hive2://localhost:10000","hive.hiveserver2.password":"","hive.hiveserver2.user":"hive"},"interpreterGroup":[{"class":"org.apache.zeppelin.hive.HiveInterpreter","name":"hql"}]}]} \ No newline at end of file diff --git a/docs/docs/rest-api/rest-json/rest-json-interpreter-update-response.json b/docs/docs/rest-api/rest-json/rest-json-interpreter-update-response.json deleted file mode 100644 index abaeff1e0c0..00000000000 --- a/docs/docs/rest-api/rest-json/rest-json-interpreter-update-response.json +++ /dev/null @@ -1 +0,0 @@ -{"status":"OK","message":"","body":{"id":"2AYW25ANY","name":"md2","group":"md","properties":{"propname":"Otherpropvalue"},"interpreterGroup":[{"class":"org.apache.zeppelin.markdown.Markdown","name":"md"}]}} \ No newline at end of file diff --git a/docs/docs/rest-api/rest-json/rest-json-interpreter-update.json b/docs/docs/rest-api/rest-json/rest-json-interpreter-update.json deleted file mode 100644 index 4588a920c42..00000000000 --- a/docs/docs/rest-api/rest-json/rest-json-interpreter-update.json +++ /dev/null @@ -1 +0,0 @@ -{"name":"md2","group":"md","properties":{"propname":"Otherpropvalue"},"interpreterGroup":[{"class":"org.apache.zeppelin.markdown.Markdown","name":"md"}]} \ No newline at end of file diff --git a/docs/docs/rest-api/rest-json/rest-json-notebook-create-response.json b/docs/docs/rest-api/rest-json/rest-json-notebook-create-response.json deleted file mode 100644 index acb89df4ade..00000000000 --- a/docs/docs/rest-api/rest-json/rest-json-notebook-create-response.json +++ /dev/null @@ -1 +0,0 @@ -{"status": "CREATED","message": "","body": "2AZPHY918"} \ No newline at end of file diff --git a/docs/docs/rest-api/rest-json/rest-json-notebook-create.json b/docs/docs/rest-api/rest-json/rest-json-notebook-create.json deleted file mode 100644 index cd67820864c..00000000000 --- a/docs/docs/rest-api/rest-json/rest-json-notebook-create.json +++ /dev/null @@ -1 +0,0 @@ -{"name": "name of new notebook"} \ No newline at end of file diff --git a/docs/docs/rest-api/rest-json/rest-json-notebook-delete-response.json b/docs/docs/rest-api/rest-json/rest-json-notebook-delete-response.json deleted file mode 100644 index a2b9b29ccb1..00000000000 --- a/docs/docs/rest-api/rest-json/rest-json-notebook-delete-response.json +++ /dev/null @@ -1 +0,0 @@ -{"status":"OK","message":""} \ No newline at end of file diff --git a/docs/docs/rest-api/rest-json/rest-json-notebook-list-response.json b/docs/docs/rest-api/rest-json/rest-json-notebook-list-response.json deleted file mode 100644 index ba424a90232..00000000000 --- a/docs/docs/rest-api/rest-json/rest-json-notebook-list-response.json +++ /dev/null @@ -1 +0,0 @@ -{"status":"OK","message":"","body":[{"name":"Homepage","id":"2AV4WUEMK"},{"name":"Zeppelin Tutorial","id":"2A94M5J1Z"}]} \ No newline at end of file diff --git a/docs/docs/rest-api/rest-notebook.md b/docs/docs/rest-api/rest-notebook.md index f50668bc2b2..ffee95a6d3d 100644 --- a/docs/docs/rest-api/rest-notebook.md +++ b/docs/docs/rest-api/rest-notebook.md @@ -4,6 +4,19 @@ title: "Notebook REST API" description: "" group: rest-api --- + {% include JB/setup %} ## Zeppelin REST API @@ -48,7 +61,7 @@ group: rest-api sample JSON response - [List response sample](rest-json/rest-json-notebook-list-response.json) +
    {"status":"OK","message":"","body":[{"name":"Homepage","id":"2AV4WUEMK"},{"name":"Zeppelin Tutorial","id":"2A94M5J1Z"}]}
    @@ -80,11 +93,11 @@ group: rest-api sample JSON input - [Create JSON sample](rest-json/rest-json-notebook-create.json) +
    {"name": "name of new notebook"}
    sample JSON response - [Create response sample](rest-json/rest-json-notebook-create-response.json) +
    {"status": "CREATED","message": "","body": "2AZPHY918"}
    @@ -115,7 +128,7 @@ group: rest-api sample JSON response - [Delete response sample](rest-json/rest-json-notebook-delete-response.json) +
    {"status":"OK","message":""}
    @@ -148,11 +161,11 @@ group: rest-api sample JSON input - [Clone JSON sample](rest-json/rest-json-notebook-create.json) +
    {"name": "name of new notebook"}
    sample JSON response - [Clone response sample](rest-json/rest-json-notebook-create-response.json) +
    {"status": "CREATED","message": "","body": "2AZPHY918"}
    diff --git a/docs/docs/storage/storage.md b/docs/docs/storage/storage.md index c4855d26b71..a04a703006b 100644 --- a/docs/docs/storage/storage.md +++ b/docs/docs/storage/storage.md @@ -4,7 +4,19 @@ title: "Storage" description: "Notebook Storage option for Zeppelin" group: storage --- + ### Notebook Storage In Zeppelin there are two option for storage Notebook, by default the notebook is storage in the notebook folder in your local File System and the second option is S3. diff --git a/docs/docs/tutorial/tutorial.md b/docs/docs/tutorial/tutorial.md index f5e1e614944..68b2ee7e83d 100644 --- a/docs/docs/tutorial/tutorial.md +++ b/docs/docs/tutorial/tutorial.md @@ -4,7 +4,19 @@ title: "Tutorial" description: "Tutorial is valid for Spark 1.3 and higher" group: tutorial --- - + ### Zeppelin Tutorial We will assume you have Zeppelin installed already. If that's not the case, see [Install](../install/install.html). diff --git a/docs/download.md b/docs/download.md index c05eb56244c..99c4ac1b10e 100644 --- a/docs/download.md +++ b/docs/download.md @@ -4,6 +4,19 @@ title: "Download" description: "" group: nav-right --- + {% include JB/setup %} ### Download Zeppelin diff --git a/docs/index.md b/docs/index.md index 433912a8eac..57ad2fbbe39 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,6 +3,19 @@ layout: page title: Zeppelin tagline: Less Development, More analysis! --- + {% include JB/setup %}
    diff --git a/docs/old_CNAME b/docs/old_CNAME deleted file mode 100644 index 869e2e6463a..00000000000 --- a/docs/old_CNAME +++ /dev/null @@ -1 +0,0 @@ -zeppelin-project.org diff --git a/docs/robot.txt b/docs/robot.txt index e69de29bb2d..ec2014340d7 100644 --- a/docs/robot.txt +++ b/docs/robot.txt @@ -0,0 +1,14 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/docs/screenshots.md b/docs/screenshots.md index 10e6b57aadc..90f87965a1f 100644 --- a/docs/screenshots.md +++ b/docs/screenshots.md @@ -3,6 +3,19 @@ layout: page title: "Screenshots" description: "" --- + {% include JB/setup %}
    diff --git a/licenses/LICENSE-bootstrap-3.0.2 b/licenses/LICENSE-bootstrap-3.0.2 new file mode 100644 index 00000000000..9dd8af7de7a --- /dev/null +++ b/licenses/LICENSE-bootstrap-3.0.2 @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/licenses/LICENSE-fontawesome-4.2.0 b/licenses/LICENSE-fontawesome-4.2.0 new file mode 100644 index 00000000000..d8037f381e8 --- /dev/null +++ b/licenses/LICENSE-fontawesome-4.2.0 @@ -0,0 +1,82 @@ +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting — in part or in whole — any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/licenses/LICENSE-fontawesome-style-4.2.0 b/licenses/LICENSE-fontawesome-style-4.2.0 new file mode 100644 index 00000000000..9a1434cc667 --- /dev/null +++ b/licenses/LICENSE-fontawesome-style-4.2.0 @@ -0,0 +1,21 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + + + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/licenses/LICENSE-jekyll-1.3.0 b/licenses/LICENSE-jekyll-1.3.0 new file mode 100644 index 00000000000..17ad5951b9f --- /dev/null +++ b/licenses/LICENSE-jekyll-1.3.0 @@ -0,0 +1,21 @@ +(The MIT License) + +Copyright (c) 2008 Tom Preston-Werner + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the 'Software'), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/licenses/LICENSE-jekyll-bootstrap-0.3 b/licenses/LICENSE-jekyll-bootstrap-0.3 new file mode 100644 index 00000000000..9a1434cc667 --- /dev/null +++ b/licenses/LICENSE-jekyll-bootstrap-0.3 @@ -0,0 +1,21 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + + + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/licenses/LICENSE-simple_line_icons-1.0.0 b/licenses/LICENSE-simple_line_icons-1.0.0 new file mode 100644 index 00000000000..9a1434cc667 --- /dev/null +++ b/licenses/LICENSE-simple_line_icons-1.0.0 @@ -0,0 +1,21 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + + + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/pom.xml b/pom.xml index 394f8530e40..6cee83694b5 100755 --- a/pom.xml +++ b/pom.xml @@ -435,7 +435,6 @@ **/*.avsc **/*.avro **/*.log - **/docs/** **/test/resources/** **/.settings/* **/.classpath @@ -455,9 +454,39 @@ CONTRIBUTING.md STYLE.md Roadmap.md + **/licenses/** + **/zeppelin-distribution/src/bin_license/** conf/interpreter.json conf/zeppelin-env.sh spark-*-bin*/** + + + docs/assets/themes/zeppelin/bootstrap/** + docs/assets/themes/zeppelin/css/style.css + docs/_includes/themes/zeppelin/_jumbotron.html + docs/_includes/themes/zeppelin/_navigation.html + + + docs/404.html + docs/_config.yml + docs/_includes/JB/** + docs/_layouts/** + docs/_plugins/** + docs/atom.xml + docs/_includes/themes/zeppelin/default.html + docs/_includes/themes/zeppelin/page.html + docs/_includes/themes/zeppelin/post.html + docs/_includes/themes/zeppelin/settings.yml + docs/Rakefile + docs/rss.xml + docs/sitemap.txt + + + docs/assets/themes/zeppelin/css/syntax.css + + + docs/_site/** + docs/Gemfile.lock diff --git a/zeppelin-distribution/src/assemble/distribution.xml b/zeppelin-distribution/src/assemble/distribution.xml index e3c2c9f8430..782aee9b8e3 100644 --- a/zeppelin-distribution/src/assemble/distribution.xml +++ b/zeppelin-distribution/src/assemble/distribution.xml @@ -64,6 +64,9 @@ 0755 0755 + + ../licenses + ../conf diff --git a/zeppelin-distribution/src/bin_license/LICENSE b/zeppelin-distribution/src/bin_license/LICENSE new file mode 100644 index 00000000000..e043b90584a --- /dev/null +++ b/zeppelin-distribution/src/bin_license/LICENSE @@ -0,0 +1,176 @@ + (Apache 2.0) nvd3.js v1.1.15-beta (http://nvd3.org/) - https://github.com/novus/nvd3/blob/v1.1.15-beta/LICENSE.md + (Apache 2.0) gson v2.2 (com.google.code.gson:gson:jar:2.2 - https://github.com/google/gson) - https://github.com/google/gson/blob/gson-2.2/LICENSE + (Apache 2.0) Amazon Web Services SDK for Java v1.10.1 (https://aws.amazon.com/sdk-for-java/) - https://raw.githubusercontent.com/aws/aws-sdk-java/1.10.1/LICENSE.txt + + + +The following components are provided under Apache License. + + + (Apache 2.0) Apache Commons Logging (commons-logging:commons-logging:1.1.1 - http://commons.apache.org/proper/commons-logging/) + (Apache 2.0) Apache Commons Codec (commons-codec:commons-codec:1.5 - http://commons.apache.org/proper/commons-codec/) + (Apache 2.0) Apache Commons Collections (commons-collections:commons-collections:3.2.1 - http://commons.apache.org/proper/commons-configuration/) + (Apache 2.0) Apache Commons Compress (org.apache.commons:commons-compress:1.9 - http://commons.apache.org/proper/commons-compress/) + (Apache 2.0) Apache Commons Configuration (commons-configuration:commons-configuration:1.9 - http://commons.apache.org/configuration/) + (Apache 2.0) Apache Commons CLI (commons-cli:commons-cli:1.2 - http://commons.apache.org/cli/) + (Apache 2.0) Apache Commons Exec (commons-exec:commons-exec:1.1 - http://commons.apache.org/exec/) + (Apache 2.0) Http Components (org.apache.httpcomponents:httpcore:4.3.3 - https://github.com/apache/httpclient) + (Apache 2.0) Http Components (org.apache.httpcomponents:httpclient:4.3.6 - https://github.com/apache/httpclient) + (Apache 2.0) Apache Commons Lang (org.apache.commons:commons-lang:2.5 - http://commons.apache.org/proper/commons-lang/) + (Apache 2.0) Apache Commons Lang 3 (org.apache.commons:commons-lang3:3.3.2 - http://commons.apache.org/proper/commons-lang/) + (Apache 2.0) Apache Commons Math 3 (org.apache.commons:commons-math3:3.4.1 - http://commons.apache.org/proper/commons-math/) + (Apache 2.0) Apache Commons Net (commons-net:commons-net:2.2 - http://commons.apache.org/proper/commons-net/) + (Apache 2.0) Apache log4j (log4j:log4j:1.2.17 - http://logging.apache.org/log4j/1.2/) + (Apache 2.0) Apache Commons Pool2 (commons-exec:commons-pool2:2.3 - https://commons.apache.org/proper/commons-pool/) + (Apache 2.0) Apache Commons FileUpload (commons-fileupload:commons-fileupload:1.3.1 - http://commons.apache.org/fileupload/) + (Apache 2.0) Apache Commons IO (commons-io:commons-io:2.4 - http://commons.apache.org/io/) + (Apache 2.0) Apache Commons VFS2 (org.apache.commons:commons-vfs2:2.0 - https://commons.apache.org/proper/commons-vfs/) + (Apache 2.0) Apache Jackrabbit webdav (org.apache.jackrabbit:jackrabbit-webdav:jar:1.5.2 - https://jackrabbit.apache.org/jcr/components/jackrabbit-webdav-library.html) + (Apache 2.0) Apache Jackrabbit JCR commons - http://jackrabbit.apache.org/jcr/components/jackrabbit-jcr-commons.html) + (Apache 2.0) Apache Maven scm api (org.apache.maven.scm:maven-scm-api:jar:1.4 - https://maven.apache.org/scm/) + (Apache 2.0) Apache Maven scm provider svnexe (org.apache.maven.scm:maven-scm-provider-svnexe:jar:1.4 - http://maven.apache.org/scm/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/index.html/) + (Apache 2.0) Apache Maven scm provider common (org.apache.maven.scm:maven-scm-provider-svn-commons:jar:1.4 - http://maven.apache.org/scm/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/) + (Apache 2.0) Apache Spark (org.apache.spark:spark:1.5.1) - http://spark.apache.org + (Apache 2.0) Apache Hadoop (http://hadoop.apache.org) + (Apache 2.0) Apache Avro (org.apache.avro:avro:1.7.7 - http://avro.apache.org) + (Apache 2.0) Apache Curator (org.apache.curator:curator:2.4.0 - http://curator.apache.org/) + (Apache 2.0) Apache Cassandra (http://cassandra.apache.org/) + (Apache 2.0) Apache CXF (http://cxf.apache.org/) + (Apache 2.0) Apache Hive (http://hive.apache.org/) + (Apache 2.0) Apache Ignite (http://ignite.apache.org/) + (Apache 2.0) Apache Kylin (http://kylin.apache.org/) + (Apache 2.0) Apache Lens (http://lens.apache.org/) + (Apache 2.0) Apache Phoenix (http://phoenix.apache.org/) + (Apache 2.0) Apache Tajo (http://tajo.apache.org/) + (Apache 2.0) Apache Flink (http://flink.apache.org/) + (Apache 2.0) Apache Thrift (http://thrift.apache.org/) + (Apache 2.0) Apache Zookeeper (org.apache.zookeeper:zookeeper:jar:3.4.5 - http://zookeeper.apache.org/) + (Apache 2.0) Chill (com.twitter:chill-java:jar:0.5.0 - https://github.com/twitter/chill/) + (Apache 2.0) Codehaus Plexus (org.codehaus.plexus:plexus:jar:1.5.6 - https://codehaus-plexus.github.io/) + (Apache 2.0) findbugs jsr305 (com.google.code.findbugs:jsr305:jar:1.3.9 - http://findbugs.sourceforge.net/) + (Apache 2.0) Google Guava (com.google.guava:guava:15.0 - https://code.google.com/p/guava-libraries/) + (Apache 2.0) Jackson (com.fasterxml.jackson.core:jackson-core:2.5.3 - https://github.com/FasterXML/jackson-core) + (Apache 2.0) Jackson (com.fasterxml.jackson.core:jackson-annotations:2.5.0 - https://github.com/FasterXML/jackson-core) + (Apache 2.0) Jackson (com.fasterxml.jackson.core:jackson-databind:2.5.3 - https://github.com/FasterXML/jackson-core) + (Apache 2.0) javax.servlet (org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016 - http://www.eclipse.org/jetty) + (Apache 2.0) Joda-Time (joda-time:joda-time:2.8.1 - http://www.joda.org/joda-time/) + (Apache 2.0) Jackson (org.codehaus.jackson:jackson-core-asl:1.9.13 - http://jackson.codehaus.org/) + (Apache 2.0) JetS3t (net.java.dev.jets3t:jets3t:jar:0.9.3) - http://www.jets3t.org/ + (Apache 2.0) Jetty (org.eclipse.jetty:jetty - http://www.eclipse.org/jetty) + (Apache 2.0) mx4j (mx4j:mx4j:jar:3.0.2) - http://mx4j.sourceforge.net/ + (Apache 2.0) Quartz Scheduler (org.quartz-scheduler:quartz:jar:2.2.1 - https://quartz-scheduler.org/) + (Apache 2.0) xml apis (xml-apis:xml-apis:jar:1.4.01 - http://xerces.apache.org/xml-commons/components/external) + (Apache 2.0) java-xmlbuilder (com.jamesmurty.utils:java-xmlbuilder:jar:1.0 - https://github.com/jmurty/java-xmlbuilder) + (Apache 2.0) compress-lzf (com.ning:compress-lzf:jar:1.0.3 - https://github.com/ning/compress) Copyright 2009-2010 Ning, Inc. + (Apache 2.0) Snappy-java (org.xerial.snappy:snappy-java:1.1.1.7 - https://github.com/xerial/snappy-java/) + (Apache 2.0) lz4-java (net.jpountz.lz4:lz4:jar:1.3.0 - https://github.com/jpountz/lz4-java) + (Apache 2.0) RoaringBitmap (org.roaringbitmap:RoaringBitmap:jar:0.4.5 - https://github.com/lemire/RoaringBitmap) + (Apache 2.0) json4s (org.json4s:json4s-ast_2.10:jar:3.2.10 - https://github.com/json4s/json4s) + + + +======================================================================== +MIT licenses +======================================================================== + +The following components are provided under the MIT License. See project link for details. +The text of each license is also included at licenses/LICENSE-[project]-[version].txt. + + (The MIT License) AngularJS v1.3.8 (https://angularjs.org/) - https://github.com/angular/angular.js/blob/v1.3.8/LICENSE + (The MIT License) Json3 v3.3.1 (http://bestiejs.github.io/json3) - https://github.com/bestiejs/json3/blob/v3.3.1/LICENSE + (The MIT License) es5-shim v3.1.0 (https://github.com/es-shims/es5-shim) - https://github.com/es-shims/es5-shim/blob/v3.1.0/LICENSE + (The MIT License) bootstrap v3.2.0 (http://getbootstrap.com/) - https://github.com/twbs/bootstrap/blob/v3.2.0/LICENSE + (The MIT License) UI Bootstrap v0.13.0 (http://angular-ui.github.io/bootstrap/) - https://github.com/angular-ui/bootstrap/blob/0.13.0/LICENSE + (The MIT License) Angular Websocket v1.0.13 (http://angularclass.github.io/angular-websocket/) - https://github.com/AngularClass/angular-websocket/blob/v1.0.13/LICENSE + (The MIT License) UI.Ace v0.1.1 (http://angularclass.github.io/angular-websocket/) - https://github.com/angular-ui/ui-ace/blob/master/LICENSE + (The MIT License) jquery.scrollTo v1.4.13 (https://github.com/flesler/jquery.scrollTo) - https://github.com/flesler/jquery.scrollTo/blob/1.4.13/LICENSE + (The MIT License) angular-dragdrop v1.0.8 (http://codef0rmer.github.io/angular-dragdrop/#/) - https://github.com/codef0rmer/angular-dragdrop/blob/v1.0.8/LICENSE + (The MIT License) perfect-scrollbar v0.5.4 (http://noraesae.github.io/perfect-scrollbar/) - https://github.com/noraesae/perfect-scrollbar/tree/0.5.4 + (The MIT License) ng-sortable v1.1.9 (https://github.com/a5hik/ng-sortable) - https://github.com/a5hik/ng-sortable/blob/1.1.9/LICENSE + (The MIT License) angular-elastic v2.4.2 (https://github.com/monospaced/angular-elastic) - https://github.com/monospaced/angular-elastic/blob/v2.4.2/LICENCE.txt + (The MIT License) angular-elastic-input v2.0.1 (https://github.com/jacek-pulit/angular-elastic-input) - https://github.com/jacek-pulit/angular-elastic-input/blob/v2.0.1/LICENSE + (The MIT License) angular-xeditable v0.1.8 (http://vitalets.github.io/angular-xeditable/) - https://github.com/vitalets/angular-xeditable/tree/0.1.8 + (The MIT License) lodash v3.9.3 (https://lodash.com/) - https://github.com/lodash/lodash/blob/3.9.3/LICENSE.txt + (The MIT License) angular-filter v0.5.4 (https://github.com/a8m/angular-filter) - https://github.com/a8m/angular-filter/blob/v0.5.4/license.md + (The MIT License) ngToast v1.5.5 (http://tamerayd.in/ngToast/) - http://tameraydin.mit-license.org/ + (The MIT License) slf4j v1.7.10 (org.slf4j:slf4j-api:jar:1.7.10 - http://www.slf4j.org) - http://www.slf4j.org/license.html + (The MIT License) slf4j-log4j12 v1.7.10 (org.slf4j:slf4j-log4j12:jar:1.7.10 - http://www.slf4j.org) - http://www.slf4j.org/license.html + (The MIT License) bcprov-jdk15on v1.51 (org.bouncycastle:bcprov-jdk15on:jar:1.51 - http://www.bouncycastle.org/java.html) - http://www.bouncycastle.org/licence.html + +The following components are provided under the MIT License. + + (The MIT License) Objenesis (org.objenesis:objenesis:2.1 - https://github.com/easymock/objenesis) - Copyright (c) 2006-2015 the original author and authors + (The MIT License) JCL 1.1.1 implemented over SLF4J (org.slf4j:jcl-over-slf4j:1.7.5 - http://www.slf4j.org) + (The MIT License) JUL to SLF4J bridge (org.slf4j:jul-to-slf4j:1.7.5 - http://www.slf4j.org) + + + +======================================================================== +BSD-style licenses +======================================================================== + +The following components are provided under the BSD-style license. See project link for details. +The text of each license is also included at licenses/LICENSE-[project]-[version].txt. + + (BSD 3 Clause) d3 v2.10.2 (https://d3js.org/) - https://github.com/mbostock/d3/blob/v2.10.2/LICENSE + (BSD 3 Clause) ace-builds v1.1.9 (https://github.com/ajaxorg/ace-builds) - https://github.com/ajaxorg/ace-builds/blob/v1.1.9/LICENSE + (BSD 3 Clause) Ace v1.1.9 (http://ace.c9.io/) - https://github.com/ajaxorg/ace/blob/v1.1.9/LICENSE + (BSD Style) dom4j v1.6.1 (http://www.dom4j.org) - https://github.com/dom4j/dom4j/blob/dom4j_1_6_1/LICENSE.txt + (BSD 3 Clause) highlightjs v8.4.0 (https://highlightjs.org/) - https://github.com/isagalaev/highlight.js/blob/8.4/LICENSE + + + +The following components are provided under the BSD-style License. + + (New BSD License) Kryo (com.esotericsoftware.kryo:kryo:2.21 - http://code.google.com/p/kryo/) + (New BSD License) MinLog (com.esotericsoftware.minlog:minlog:1.2 - http://code.google.com/p/minlog/) + (New BSD License) ReflectASM (com.esotericsoftware.reflectasm:reflectasm:1.07 - http://code.google.com/p/reflectasm/) + (BSD-like) Scala Library (org.scala-lang:scala-library:2.10.4 - http://www.scala-lang.org/) + (BSD-like) Scalap (org.scala-lang:scalap:2.10.4 - http://www.scala-lang.org/) + (BSD-like) (The BSD License) jline (org.scala-lang:jline:2.10.4 - http://www.scala-lang.org/) + (BSD-like) Scala Actors library (org.scala-lang:scala-actors:2.10.4 - http://www.scala-lang.org/) + (BSD-like) Scala Compiler (org.scala-lang:scala-compiler:2.10.4 - http://www.scala-lang.org/) + (BSD-like) Scala Compiler (org.scala-lang:scala-reflect:2.10.4 - http://www.scala-lang.org/) + (BSD-like) ASM (asm:asm:jar:3.1 - http://asm.ow2.org/) - Copyright (c) 2000-2011 INRIA, France Telecom + (New BSD License) Py4J (net.sf.py4j:py4j:0.9 - http://py4j.sourceforge.net/) + (New BSD License) Markdown4j (org.commonjava.googlecode.markdown4j:markdown4j:jar:2.2-cj-1.0 - https://code.google.com/p/markdown4j/) + + + +======================================================================== +CDDL license +======================================================================== + +The following components are provided under the CDDL License. + + (CDDL 1.0) javax.activation (javax.activation:activation:jar:1.1.1 - http://java.sun.com/javase/technologies/desktop/javabeans/jaf/index.jsp) + (CDDL 1.1) Jersey (com.sun.jersey:jersey:jar:1.9 - https://jersey.java.net/) + + + +======================================================================== +EPL license +======================================================================== + +The following components are provided under the EPL License. + + (EPL 1.0) Aether (org.sonatype.aether - http://www.eclipse.org/aether/) + + + +======================================================================== +WTFPL - (http://www.wtfpl.net/) +======================================================================== + + (WTFPL) Reflections (org.reflections:reflections:jar:0.9.8 - https://code.google.com/p/reflections/) + + + +======================================================================== +For the PostgreSQL JDBC driver jar +======================================================================== + +See licenses/LICENSE-postgresql + + + diff --git a/zeppelin-distribution/src/bin_license/NOTICE b/zeppelin-distribution/src/bin_license/NOTICE new file mode 100644 index 00000000000..264c9f61020 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/NOTICE @@ -0,0 +1,153 @@ + +======================================================================== + +The following NOTICEs are pertain to software distributed with this project. + +----------------------------------------------------------------------- + Apache Commons Codec +----------------------------------------------------------------------- + +src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java +contains test data from http://aspell.net/test/orig/batch0.tab. +Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org) + +The content of package org.apache.commons.codec.language.bm has been translated +from the original php source code available at http://stevemorse.org/phoneticinfo.htm +with permission from the original authors. +Original source copyright: +Copyright (c) 2008 Alexander Beider & Stephen P. Morse. + + +----------------------------------------------------------------------- + Apache Commmons Lang3 +----------------------------------------------------------------------- + +This product includes software from the Spring Framework, +under the Apache License 2.0 (see: StringUtils.containsWhitespace()) + + + +----------------------------------------------------------------------- + Apache Commmons Compress +----------------------------------------------------------------------- + +Apache Commons Compress +Copyright 2002-2015 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +The files in the package org.apache.commons.compress.archivers.sevenz +were derived from the LZMA SDK, version 9.20 (C/ and CPP/7zip/), +which has been placed in the public domain: + +"LZMA SDK is placed in the public domain." (http://www.7-zip.org/sdk.html) + + +----------------------------------------------------------------------- + Httpclient +----------------------------------------------------------------------- + +Apache HttpComponents Client +Copyright 1999-2015 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + + +----------------------------------------------------------------------- + Httpcore +----------------------------------------------------------------------- + +Apache HttpComponents Core - HttpCore +Copyright 2006-2009 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). + + + + + + +----------------------------------------------------------------------- + Amazon Web Services SDK for Java +----------------------------------------------------------------------- + +AWS SDK for Java +Copyright 2010-2014 Amazon.com, Inc. or its affiliates. All Rights Reserved. + +This product includes software developed by +Amazon Technologies, Inc (http://www.amazon.com/). + +********************** +THIRD PARTY COMPONENTS +********************** +This software includes third party software subject to the following copyrights: +- XML parsing and utility functions from JetS3t - Copyright 2006-2009 James Murty. +- JSON parsing and utility functions from JSON.org - Copyright 2002 JSON.org. +- PKCS#1 PEM encoded private key parsing and utility functions from oauth.googlecode.com - Copyright 1998-2010 AOL Inc. + +The licenses for these third party components are included in LICENSE.txt + + +----------------------------------------------------------------------- + Joda-Time Library +----------------------------------------------------------------------- + +This product includes software developed by +Joda.org (http://www.joda.org/). + + +----------------------------------------------------------------------- + Twitter Chill Library +----------------------------------------------------------------------- + +Chill is a set of Scala extensions for Kryo. +Copyright 2012 Twitter, Inc. + + + +----------------------------------------------------------------------- + Jetty Web Container +----------------------------------------------------------------------- + +Copyright 1995-2014 Mort Bay Consulting Pty Ltd. + +The Jetty Web Container is Copyright Mort Bay Consulting Pty Ltd +unless otherwise noted. + +Jetty is dual licensed under both + + * The Apache 2.0 License + http://www.apache.org/licenses/LICENSE-2.0.html + + and + + * The Eclipse Public 1.0 License + http://www.eclipse.org/legal/epl-v10.html + +Jetty may be distributed under either license. + +The javax.servlet package used was sourced from the Apache +Software Foundation and is distributed under the apache 2.0 +license. + +The UnixCrypt.java code implements the one way cryptography used by +Unix systems for simple password protection. Copyright 1996 Aki Yoshida, +modified April 2001 by Iris Van den Broeke, Daniel Deville. +Permission to use, copy, modify and distribute UnixCrypt +for non-commercial or commercial purposes and without fee is +granted provided that the copyright notice appears in all copies. + + + +----------------------------------------------------------------------- + +This product contains a modified version of Robert Harder's Public Domain +Base64 Encoder and Decoder, which can be obtained at: + + * LICENSE: + * license/LICENSE.base64.txt (Public Domain) + * HOMEPAGE: + * http://iharder.sourceforge.net/current/java/base64/ \ No newline at end of file diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-AngularJS-1.3.8 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-AngularJS-1.3.8 new file mode 100644 index 00000000000..020f87acd2e --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-AngularJS-1.3.8 @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2010-2014 Google, Inc. http://angularjs.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-Json3-3.3.1 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-Json3-3.3.1 new file mode 100644 index 00000000000..ede3956ab6c --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-Json3-3.3.1 @@ -0,0 +1,20 @@ +Copyright (c) 2012-2014 Kit Cambridge. +http://kitcambridge.be/ + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-UI-Bootstrap-0.13.0 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-UI-Bootstrap-0.13.0 new file mode 100644 index 00000000000..f9475e20fef --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-UI-Bootstrap-0.13.0 @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2012-2014 the AngularUI Team, https://github.com/organizations/angular-ui/teams/291112 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-UI.ace-0.1.1 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-UI.ace-0.1.1 new file mode 100644 index 00000000000..dfc5e0ca17c --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-UI.ace-0.1.1 @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2012 the AngularUI Team, http://angular-ui.github.com + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-ace-1.1.9 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-ace-1.1.9 new file mode 100644 index 00000000000..4760be2a622 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-ace-1.1.9 @@ -0,0 +1,24 @@ +Copyright (c) 2010, Ajax.org B.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Ajax.org B.V. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-ace-builds-1.1.9 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-ace-builds-1.1.9 new file mode 100644 index 00000000000..4760be2a622 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-ace-builds-1.1.9 @@ -0,0 +1,24 @@ +Copyright (c) 2010, Ajax.org B.V. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Ajax.org B.V. nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-dragdrop-1.0.8 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-dragdrop-1.0.8 new file mode 100644 index 00000000000..c0efa85c960 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-dragdrop-1.0.8 @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2013 Amit Gharat a.k.a codef0rmer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-elastic-2.4.2 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-elastic-2.4.2 new file mode 100644 index 00000000000..50a2d939c9e --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-elastic-2.4.2 @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Monospaced + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-elastic-input-2.0.1 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-elastic-input-2.0.1 new file mode 100644 index 00000000000..7f9ecbe37ad --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-elastic-input-2.0.1 @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Jacek Pulit + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-filter-0.5.4 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-filter-0.5.4 new file mode 100644 index 00000000000..08644d0a5e3 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-filter-0.5.4 @@ -0,0 +1,9 @@ +The MIT License + +Copyright (c) 2015 Ariel Mashraki + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-websocket-1.0.13 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-websocket-1.0.13 new file mode 100644 index 00000000000..f42118c8059 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-websocket-1.0.13 @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-2015 Patrick Stapleton, gdi2290, PatrickJS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-xeditable-0.1.8 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-xeditable-0.1.8 new file mode 100644 index 00000000000..9a1434cc667 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-angular-xeditable-0.1.8 @@ -0,0 +1,21 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + + + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-aws-java-sdk-1.10.1 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-aws-java-sdk-1.10.1 new file mode 100644 index 00000000000..98d1f9319f3 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-aws-java-sdk-1.10.1 @@ -0,0 +1,63 @@ +Apache License +Version 2.0, January 2004 + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works a copy of this License; and + 2. You must cause any modified files to carry prominent notices stating that You changed the files; and + 3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + 4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + +You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +Note: Other license terms may apply to certain, identified software files contained within or distributed with the accompanying software if such terms are included in the directory containing the accompanying software. Such other license terms will then apply in lieu of the terms of the software license above. + +JSON processing code subject to the JSON License from JSON.org: + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +The Software shall be used for Good, not Evil. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-bcprov-jdk15on-1.51 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-bcprov-jdk15on-1.51 new file mode 100644 index 00000000000..91adcf17a1d --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-bcprov-jdk15on-1.51 @@ -0,0 +1,10 @@ +Please note this should be read in the same way as the MIT license. + +LICENSE +Copyright (c) 2000 - 2015 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-bootstrap-3.2.0 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-bootstrap-3.2.0 new file mode 100644 index 00000000000..8d94aa9ac9f --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-bootstrap-3.2.0 @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2011-2014 Twitter, Inc + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-d3-2.10.2 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-d3-2.10.2 new file mode 100644 index 00000000000..cde4728a2cc --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-d3-2.10.2 @@ -0,0 +1,26 @@ +Copyright (c) 2012, Michael Bostock +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* The name Michael Bostock may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-dom4j-1.6.1 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-dom4j-1.6.1 new file mode 100644 index 00000000000..7cae050cadb --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-dom4j-1.6.1 @@ -0,0 +1,40 @@ +Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved. + +Redistribution and use of this software and associated documentation +("Software"), with or without modification, are permitted provided +that the following conditions are met: + +1. Redistributions of source code must retain copyright + statements and notices. Redistributions must also contain a + copy of this document. + +2. Redistributions in binary form must reproduce the + above copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +3. The name "DOM4J" must not be used to endorse or promote + products derived from this Software without prior written + permission of MetaStuff, Ltd. For written permission, + please contact dom4j-info@metastuff.com. + +4. Products derived from this Software may not be called "DOM4J" + nor may "DOM4J" appear in their names without prior written + permission of MetaStuff, Ltd. DOM4J is a registered + trademark of MetaStuff, Ltd. + +5. Due credit should be given to the DOM4J Project - + http://www.dom4j.org + +THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +METASTUFF, LTD. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-es5-shim-3.1.0 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-es5-shim-3.1.0 new file mode 100644 index 00000000000..509d223a42d --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-es5-shim-3.1.0 @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (C) 2009-2014 Kristopher Michael Kowal and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-gson-2.2 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-gson-2.2 new file mode 100644 index 00000000000..8763058a27b --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-gson-2.2 @@ -0,0 +1,203 @@ +Google Gson + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2008-2011 Google Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-highlightjs-8.4.0 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-highlightjs-8.4.0 new file mode 100644 index 00000000000..422deb7350f --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-highlightjs-8.4.0 @@ -0,0 +1,24 @@ +Copyright (c) 2006, Ivan Sagalaev +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of highlight.js nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-jquery.scrollTo-1.4.13 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-jquery.scrollTo-1.4.13 new file mode 100644 index 00000000000..aeaf77d8a6e --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-jquery.scrollTo-1.4.13 @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2007-2014 Ariel Flesler + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-lodash-3.9.3 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-lodash-3.9.3 new file mode 100644 index 00000000000..9cd87e5dcef --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-lodash-3.9.3 @@ -0,0 +1,22 @@ +Copyright 2012-2015 The Dojo Foundation +Based on Underscore.js, copyright 2009-2015 Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-ng-sortable-1.1.9 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-ng-sortable-1.1.9 new file mode 100644 index 00000000000..ea2dc3287e5 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-ng-sortable-1.1.9 @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Muhammed Ashik + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-ngToast-1.5.5 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-ngToast-1.5.5 new file mode 100644 index 00000000000..9dcce88ceb6 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-ngToast-1.5.5 @@ -0,0 +1,8 @@ +The MIT License (MIT) +Copyright © 2015 Tamer Aydin, http://tamerayd.in + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-nvd3.js-1.1.15-beta b/zeppelin-distribution/src/bin_license/licenses/LICENSE-nvd3.js-1.1.15-beta new file mode 100644 index 00000000000..3f2f00f7756 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-nvd3.js-1.1.15-beta @@ -0,0 +1,7 @@ +Copyright (c) 2011, 2012 Novus Partners, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-perfect-scrollbar-0.5.4 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-perfect-scrollbar-0.5.4 new file mode 100644 index 00000000000..093517badb4 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-perfect-scrollbar-0.5.4 @@ -0,0 +1,7 @@ +The MIT License (MIT) Copyright (c) 2012, 2014 Hyunje Alex Jun and other contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-postgresql b/zeppelin-distribution/src/bin_license/licenses/LICENSE-postgresql new file mode 100644 index 00000000000..45550ff7db4 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-postgresql @@ -0,0 +1,29 @@ + + Copyright (c) 1997-2011, PostgreSQL Global Development Group + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the PostgreSQL Global Development Group nor the names + of its contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-slf4j-1.7.10 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-slf4j-1.7.10 new file mode 100644 index 00000000000..f9f183aa0e7 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-slf4j-1.7.10 @@ -0,0 +1,21 @@ +Copyright (c) 2004-2013 QOS.ch + All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-slf4j-log4j12-1.7.10 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-slf4j-log4j12-1.7.10 new file mode 100644 index 00000000000..5a11c0c29e5 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-slf4j-log4j12-1.7.10 @@ -0,0 +1,21 @@ +Copyright (c) 2004-2007 QOS.ch +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From 7d133b6193304de5252035ed71de7a14e66aa6b7 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Fri, 13 Nov 2015 23:39:58 +0900 Subject: [PATCH 031/491] ZEPPELIN-419 Change loglevel to debug for SEND, RECEIVE web socket server message log https://issues.apache.org/jira/browse/ZEPPELIN-419 It changes log level to debug for SEND, RECEIVE message from ZeppelinServer. Author: Lee moon soo Closes #428 from Leemoonsoo/ZEPPELIN-419 and squashes the following commits: 2675576 [Lee moon soo] Change loglevel to debug for SEND, RECEIVE web socket server message log --- .../java/org/apache/zeppelin/socket/NotebookServer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java index a7a0f4d28e0..f295a8e0590 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java @@ -98,7 +98,7 @@ public void onMessage(NotebookSocket conn, String msg) { Notebook notebook = notebook(); try { Message messagereceived = deserializeMessage(msg); - LOG.info("RECEIVE << " + messagereceived.op); + LOG.debug("RECEIVE << " + messagereceived.op); /** Lets be elegant here */ switch (messagereceived.op) { case LIST_NOTES: @@ -253,7 +253,7 @@ private void broadcast(String noteId, Message m) { if (socketLists == null || socketLists.size() == 0) { return; } - LOG.info("SEND >> " + m.op); + LOG.debug("SEND >> " + m.op); for (NotebookSocket conn : socketLists) { try { conn.send(serializeMessage(m)); @@ -435,7 +435,7 @@ private void updateParagraph(NotebookSocket conn, Notebook notebook, note.persist(); broadcast(note.id(), new Message(OP.PARAGRAPH).put("paragraph", p)); } - + private void cloneNote(NotebookSocket conn, Notebook notebook, Message fromMessage) throws IOException, CloneNotSupportedException { String noteId = getOpenNoteId(conn); From 0fde27fda6fdc4c76165925cd3060a59eace1c8a Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Sat, 14 Nov 2015 20:39:54 +0900 Subject: [PATCH 032/491] ZEPPELIN-331 Don't update back the browser where updated the angular object This PR fixes problem described in https://issues.apache.org/jira/browse/ZEPPELIN-331 By excluding the webbrowser who created the angular object update event from broadcast target. * [x] exclude from broadcast * [x] add unittest Author: Lee moon soo Closes #341 from Leemoonsoo/ZEPPELIN-331 and squashes the following commits: 40f8f84 [Lee moon soo] Change log level to debug for SEND message cd45a7f [Lee moon soo] Fix test 8175c8d [Lee moon soo] Add mock interpreter 527c56f [Lee moon soo] Add test for broadcast for angularObjectUpdate 4c4ce6d [Lee moon soo] Don't update back to the browser where update the angular object --- .../zeppelin/socket/NotebookServer.java | 32 +++++- .../interpreter/mock/MockInterpreter1.java | 73 +++++++++++++ .../zeppelin/socket/NotebookServerTest.java | 102 +++++++++++++++++- 3 files changed, 201 insertions(+), 6 deletions(-) create mode 100644 zeppelin-server/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java index f295a8e0590..e987461d877 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java @@ -264,6 +264,26 @@ private void broadcast(String noteId, Message m) { } } + private void broadcastExcept(String noteId, Message m, NotebookSocket exclude) { + synchronized (noteSocketMap) { + List socketLists = noteSocketMap.get(noteId); + if (socketLists == null || socketLists.size() == 0) { + return; + } + LOG.debug("SEND >> " + m.op); + for (NotebookSocket conn : socketLists) { + if (exclude.equals(conn)) { + continue; + } + try { + conn.send(serializeMessage(m)); + } catch (IOException e) { + LOG.error("socket error", e); + } + } + } + } + private void broadcastAll(Message m) { synchronized (connectedSockets) { for (NotebookSocket conn : connectedSockets) { @@ -498,7 +518,7 @@ private void completion(NotebookSocket conn, Notebook notebook, * @param notebook the notebook. * @param fromMessage the message. */ - private void angularObjectUpdated(WebSocket conn, Notebook notebook, + private void angularObjectUpdated(NotebookSocket conn, Notebook notebook, Message fromMessage) { String noteId = (String) fromMessage.get("noteId"); String interpreterGroupId = (String) fromMessage.get("interpreterGroupId"); @@ -552,20 +572,22 @@ private void angularObjectUpdated(WebSocket conn, Notebook notebook, if (interpreterGroupId.equals(setting.getInterpreterGroup().getId())) { AngularObjectRegistry angularObjectRegistry = setting .getInterpreterGroup().getAngularObjectRegistry(); - this.broadcast( + this.broadcastExcept( n.id(), new Message(OP.ANGULAR_OBJECT_UPDATE).put("angularObject", ao) .put("interpreterGroupId", interpreterGroupId) - .put("noteId", n.id())); + .put("noteId", n.id()), + conn); } } } } else { // broadcast to all web session for the note - this.broadcast( + this.broadcastExcept( note.id(), new Message(OP.ANGULAR_OBJECT_UPDATE).put("angularObject", ao) .put("interpreterGroupId", interpreterGroupId) - .put("noteId", note.id())); + .put("noteId", note.id()), + conn); } } diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java b/zeppelin-server/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java new file mode 100644 index 00000000000..b76a8b2dc38 --- /dev/null +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/interpreter/mock/MockInterpreter1.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.zeppelin.interpreter.mock; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import org.apache.zeppelin.interpreter.Interpreter; +import org.apache.zeppelin.interpreter.InterpreterContext; +import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.scheduler.Scheduler; +import org.apache.zeppelin.scheduler.SchedulerFactory; + +public class MockInterpreter1 extends Interpreter{ + Map vars = new HashMap(); + + public MockInterpreter1(Properties property) { + super(property); + } + + @Override + public void open() { + } + + @Override + public void close() { + } + + @Override + public InterpreterResult interpret(String st, InterpreterContext context) { + return new InterpreterResult(InterpreterResult.Code.SUCCESS, "repl1: "+st); + } + + @Override + public void cancel(InterpreterContext context) { + } + + @Override + public FormType getFormType() { + return FormType.SIMPLE; + } + + @Override + public int getProgress(InterpreterContext context) { + return 0; + } + + @Override + public Scheduler getScheduler() { + return SchedulerFactory.singleton().createOrGetFIFOScheduler("test_"+this.hashCode()); + } + + @Override + public List completion(String buf, int cursor) { + return null; + } +} diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java index c17809ae91e..5275d81ac67 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java @@ -20,16 +20,53 @@ package org.apache.zeppelin.socket; import static org.junit.Assert.*; + import java.io.IOException; + +import org.apache.zeppelin.interpreter.InterpreterGroup; +import org.apache.zeppelin.interpreter.InterpreterSetting; +import org.apache.zeppelin.notebook.Note; +import org.apache.zeppelin.notebook.Notebook; +import org.apache.zeppelin.rest.AbstractTestRestApi; +import org.apache.zeppelin.server.ZeppelinServer; +import org.apache.zeppelin.socket.Message.OP; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; +import com.google.gson.Gson; + import java.net.UnknownHostException; import java.net.InetAddress; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; + +import static org.mockito.Mockito.*; + /** * BASIC Zeppelin rest api tests */ -public class NotebookServerTest { +public class NotebookServerTest extends AbstractTestRestApi { + + + private static Notebook notebook; + private static NotebookServer notebookServer; + private static Gson gson; + + @BeforeClass + public static void init() throws Exception { + AbstractTestRestApi.startUp(); + gson = new Gson(); + notebook = ZeppelinServer.notebook; + notebookServer = ZeppelinServer.notebookServer; + } + + @AfterClass + public static void destroy() throws Exception { + AbstractTestRestApi.shutDown(); + } @Test public void checkOrigin() throws UnknownHostException { @@ -45,5 +82,68 @@ public void checkInvalidOrigin(){ NotebookServer server = new NotebookServer(); assertFalse(server.checkOrigin(new TestHttpServletRequest(), "http://evillocalhost:8080")); } + + @Test + public void testMakeSureNoAngularObjectBroadcastToWebsocketWhoFireTheEvent() throws IOException { + // create a notebook + Note note1 = notebook.createNote(); + + // get reference to interpreterGroup + InterpreterGroup interpreterGroup = null; + List settings = note1.getNoteReplLoader().getInterpreterSettings(); + for (InterpreterSetting setting : settings) { + if (setting.getInterpreterGroup() == null) { + continue; + } + + interpreterGroup = setting.getInterpreterGroup(); + break; + } + + // add angularObject + interpreterGroup.getAngularObjectRegistry().add("object1", "value1", note1.getId()); + + // create two sockets and open it + NotebookSocket sock1 = createWebSocket(); + NotebookSocket sock2 = createWebSocket(); + + assertEquals(sock1, sock1); + assertNotEquals(sock1, sock2); + + notebookServer.onOpen(sock1); + notebookServer.onOpen(sock2); + verify(sock1, times(0)).send(anyString()); // getNote, getAngularObject + // open the same notebook from sockets + notebookServer.onMessage(sock1, gson.toJson(new Message(OP.GET_NOTE).put("id", note1.getId()))); + notebookServer.onMessage(sock2, gson.toJson(new Message(OP.GET_NOTE).put("id", note1.getId()))); + + reset(sock1); + reset(sock2); + + // update object from sock1 + notebookServer.onMessage(sock1, gson.toJson( + new Message(OP.ANGULAR_OBJECT_UPDATED) + .put("noteId", note1.getId()) + .put("name", "object1") + .put("value", "value1") + .put("interpreterGroupId", interpreterGroup.getId()))); + + + // expect object is broadcasted except for where the update is created + verify(sock1, times(0)).send(anyString()); + verify(sock2, times(1)).send(anyString()); + + notebook.removeNote(note1.getId()); + } + + private NotebookSocket createWebSocket() { + NotebookSocket sock = mock(NotebookSocket.class); + when(sock.getRequest()).thenReturn(createHttpServletRequest()); + return sock; + } + + private HttpServletRequest createHttpServletRequest() { + return mock(HttpServletRequest.class); + } } From c3892d56e2b00c6b8a8131ab2c55f975380f1b68 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Sat, 14 Nov 2015 00:05:38 +0900 Subject: [PATCH 033/491] ZEPPELIN-286 Scheduler already terminated Exception Fixes https://issues.apache.org/jira/browse/ZEPPELIN-286 Author: Lee moon soo Closes #427 from Leemoonsoo/ZEPPELIN-286 and squashes the following commits: 98eaad7 [Lee moon soo] Allow null return on getInterpreterProcess e289206 [Lee moon soo] Close all interpreter processes when server stops dddca9b [Lee moon soo] Shutdown event poller when interpreter process dies e4a306f [Lee moon soo] Clear reference to interpreterProcess from interpreterGroupReference with in close() to make sure not reusing after restart cdf3c4b [Lee moon soo] Add test for sharing scheduler instance e122171 [Lee moon soo] Better handling of RemoteInterpreter shutdown. Share scheduler instance among RemoteInterpreter in the same group --- .../interpreter/remote/RemoteInterpreter.java | 17 +++- .../remote/RemoteInterpreterEventPoller.java | 2 +- .../remote/RemoteInterpreterProcess.java | 15 +-- .../remote/RemoteInterpreterServer.java | 18 +++- .../remote/RemoteInterpreterTest.java | 98 ++++++++++++++++--- .../zeppelin/server/ZeppelinServer.java | 2 + 6 files changed, 126 insertions(+), 26 deletions(-) diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java index d5d92c83c01..9d01561a61f 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java @@ -32,6 +32,7 @@ import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.InterpreterResult.Code; import org.apache.zeppelin.interpreter.InterpreterResult.Type; +import org.apache.zeppelin.interpreter.WrappedInterpreter; import org.apache.zeppelin.interpreter.thrift.RemoteInterpreterContext; import org.apache.zeppelin.interpreter.thrift.RemoteInterpreterResult; import org.apache.zeppelin.interpreter.thrift.RemoteInterpreterService.Client; @@ -86,7 +87,7 @@ public RemoteInterpreter(Properties property, this.interpreterRunner = interpreterRunner; this.interpreterPath = interpreterPath; this.env = env; - this.connectTimeout = connectTimeout; + this.connectTimeout = connectTimeout; } @Override @@ -105,7 +106,8 @@ public RemoteInterpreterProcess getInterpreterProcess() { throw new InterpreterException(e); } } else { - throw new InterpreterException("Unexpected error"); + // closed or not opened yet + return null; } } } @@ -180,7 +182,13 @@ public void close() { interpreterProcess.releaseClient(client); } - interpreterProcess.dereference(); + int r = interpreterProcess.dereference(); + if (r == 0) { + synchronized (interpreterGroupReference) { + InterpreterGroup intpGroup = getInterpreterGroup(); + interpreterGroupReference.remove(getInterpreterGroupKey(intpGroup)); + } + } } @Override @@ -322,8 +330,7 @@ public Scheduler getScheduler() { int maxConcurrency = 10; RemoteInterpreterProcess interpreterProcess = getInterpreterProcess(); return SchedulerFactory.singleton().createOrGetRemoteScheduler( - "remoteinterpreter_" + interpreterProcess.hashCode(), - getInterpreterProcess(), + "remoteinterpreter_" + interpreterProcess.hashCode(), getInterpreterProcess(), maxConcurrency); } diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterEventPoller.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterEventPoller.java index f39f6a6aa10..1b734b73202 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterEventPoller.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterEventPoller.java @@ -56,7 +56,7 @@ public void setInterpreterGroup(InterpreterGroup interpreterGroup) { public void run() { Client client = null; - while (!shutdown) { + while (!shutdown && interpreterProcess.isRunning()) { try { client = interpreterProcess.getClient(); } catch (Exception e1) { diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterProcess.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterProcess.java index 534af271d2f..0c9e877e4ea 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterProcess.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterProcess.java @@ -37,7 +37,7 @@ */ public class RemoteInterpreterProcess implements ExecuteResultHandler { private static final Logger logger = LoggerFactory.getLogger(RemoteInterpreterProcess.class); - + private final AtomicInteger referenceCount; private DefaultExecutor executor; private ExecuteWatchdog watchdog; @@ -124,7 +124,7 @@ public int reference(InterpreterGroup interpreterGroup) { } } } - + clientPool = new GenericObjectPool(new ClientFactory("localhost", port)); remoteInterpreterEventPoller.setInterpreterGroup(interpreterGroup); @@ -151,13 +151,16 @@ public int dereference() { remoteInterpreterEventPoller.shutdown(); // first try shutdown + Client client = null; try { - Client client = getClient(); + client = getClient(); client.shutdown(); - releaseClient(client); } catch (Exception e) { - logger.error("Error", e); - watchdog.destroyProcess(); + // safely ignore exception while client.shutdown() may terminates remote process + } finally { + if (client != null) { + releaseClient(client); + } } clientPool.clear(); diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java index 16b188394d0..7405a6660bf 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java @@ -100,10 +100,26 @@ public void run() { @Override public void shutdown() throws TException { + interpreterGroup.close(); + interpreterGroup.destroy(); + + server.stop(); + // server.stop() does not always finish server.serve() loop // sometimes server.serve() is hanging even after server.stop() call. // this case, need to force kill the process - server.stop(); + + long startTime = System.currentTimeMillis(); + while (System.currentTimeMillis() - startTime < 2000 && server.isServing()) { + try { + Thread.sleep(300); + } catch (InterruptedException e) { + } + } + + if (server.isServing()) { + System.exit(0); + } } public int getPort() { diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java index 0c74cea54d4..bbda252ed21 100644 --- a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java @@ -17,10 +17,7 @@ package org.apache.zeppelin.interpreter.remote; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import java.io.File; import java.io.IOException; @@ -38,7 +35,6 @@ import org.apache.zeppelin.interpreter.InterpreterGroup; import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.InterpreterResult.Code; -import org.apache.zeppelin.interpreter.remote.RemoteInterpreterServer.InterpretJob; import org.apache.zeppelin.interpreter.remote.mock.MockInterpreterA; import org.apache.zeppelin.interpreter.remote.mock.MockInterpreterB; import org.apache.zeppelin.scheduler.Job; @@ -63,7 +59,7 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { - intpGroup.clone(); + intpGroup.close(); intpGroup.destroy(); } @@ -225,7 +221,7 @@ public void testRemoteSchedulerSharing() throws TTransportException, IOException intpB.close(); RemoteInterpreterProcess process = intpA.getInterpreterProcess(); - assertFalse(process.isRunning()); + assertNull(process); } @Test @@ -343,7 +339,7 @@ protected boolean jobAbort() { intpB.close(); RemoteInterpreterProcess process = intpA.getInterpreterProcess(); - assertFalse(process.isRunning()); + assertNull(process); } @Test @@ -555,10 +551,10 @@ public void testInterpreterGroupResetAfterProcessFinished() { } @Test - public void testInterpreterGroupResetDuringProcessRunning() { + public void testInterpreterGroupResetDuringProcessRunning() throws InterruptedException { Properties p = new Properties(); - RemoteInterpreter intpA = new RemoteInterpreter( + final RemoteInterpreter intpA = new RemoteInterpreter( p, MockInterpreterA.class.getName(), new File("../bin/interpreter.sh").getAbsolutePath(), @@ -567,16 +563,92 @@ public void testInterpreterGroupResetDuringProcessRunning() { 10 * 1000 ); + intpGroup.add(intpA); intpA.setInterpreterGroup(intpGroup); - RemoteInterpreterProcess processA = intpA.getInterpreterProcess(); + intpA.open(); + Job jobA = new Job("jobA", null) { + + @Override + public int progress() { + return 0; + } + + @Override + public Map info() { + return null; + } + + @Override + protected Object jobRun() throws Throwable { + return intpA.interpret("2000", + new InterpreterContext( + "note", + "jobA", + "title", + "text", + new HashMap(), + new GUI(), + new AngularObjectRegistry(intpGroup.getId(), null), + new LinkedList())); + } + + @Override + protected boolean jobAbort() { + return false; + } + + }; + intpA.getScheduler().submit(jobA); + + // wait for job started + while (intpA.getScheduler().getJobsRunning().size() == 0) { + Thread.sleep(100); + } + + // restart interpreter + RemoteInterpreterProcess processA = intpA.getInterpreterProcess(); + intpA.close(); intpA.setInterpreterGroup(new InterpreterGroup(intpA.getInterpreterGroup().getId())); + intpA.open(); RemoteInterpreterProcess processB = intpA.getInterpreterProcess(); - assertEquals(processA.hashCode(), processB.hashCode()); + assertNotSame(processA.hashCode(), processB.hashCode()); + + } + + @Test + public void testRemoteInterpreterSharesTheSameSchedulerInstanceInTheSameGroup() { + Properties p = new Properties(); - processA.dereference(); // intpA.close(); + RemoteInterpreter intpA = new RemoteInterpreter( + p, + MockInterpreterA.class.getName(), + new File("../bin/interpreter.sh").getAbsolutePath(), + "fake", + env, + 10 * 1000 + ); + + intpGroup.add(intpA); + intpA.setInterpreterGroup(intpGroup); + + RemoteInterpreter intpB = new RemoteInterpreter( + p, + MockInterpreterB.class.getName(), + new File("../bin/interpreter.sh").getAbsolutePath(), + "fake", + env, + 10 * 1000 + ); + + intpGroup.add(intpB); + intpB.setInterpreterGroup(intpGroup); + + intpA.open(); + intpB.open(); + assertEquals(intpA.getScheduler(), intpB.getScheduler()); } } diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java index a6e944da8be..3717eccf142 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java @@ -112,6 +112,7 @@ public static void main(String[] args) throws Exception { LOG.info("Shutting down Zeppelin Server ... "); try { jettyServer.stop(); + ZeppelinServer.notebook.getInterpreterFactory().close(); } catch (Exception e) { LOG.error("Error while stopping servlet container", e); } @@ -131,6 +132,7 @@ public static void main(String[] args) throws Exception { } jettyServer.join(); + ZeppelinServer.notebook.getInterpreterFactory().close(); } private static Server setupJettyServer(ZeppelinConfiguration conf) From 66e5433d27fa07c064ea6813648e175a15fc8c43 Mon Sep 17 00:00:00 2001 From: Mina Lee Date: Tue, 10 Nov 2015 08:12:32 +0900 Subject: [PATCH 034/491] [ZEPPELIN-328] Interpreter page should clarify the % magic syntax for interpreter group.name * Display %interpreterGroup.interpreterName instead of %settingName.interpreterName Before 2015-11-09 10 54 43 After 2015-11-09 10 54 18 * Clarify available interpreter as `%group.name` in each notebook when interpreter group name is different from interpreter name. * %hql -> %hive.hql * %tql -> %tajo.tql * %ignite, %ignitesql -> %ignite, %ignite.ignitesql Before 2015-11-09 10 51 16 After 2015-11-09 10 55 45 Author: Mina Lee Closes #411 from minahlee/ZEPPELIN-328 and squashes the following commits: 26fad51 [Mina Lee] Omit interpreter name when it is the first interpreter of interpreter group 4ea2a29 [Mina Lee] [ZEPPELIN-328] Interpreter page should clarify the % magic syntax for interpreter group.name --- zeppelin-web/src/app/interpreter/interpreter.html | 11 ++++++----- zeppelin-web/src/app/notebook/notebook.html | 13 ++++++++++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/zeppelin-web/src/app/interpreter/interpreter.html b/zeppelin-web/src/app/interpreter/interpreter.html index 3d6cbc97bc2..f9f75852669 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.html +++ b/zeppelin-web/src/app/interpreter/interpreter.html @@ -41,12 +41,13 @@

    {{setting.name}} - - %{{setting.name}} (default) - , %{{interpreter.name}} - %{{setting.name}} - , %{{setting.name}}.{{interpreter.name}} + , + %{{setting.group}}.{{interpreter.name}} + (default)

    diff --git a/zeppelin-web/src/app/notebook/notebook.html b/zeppelin-web/src/app/notebook/notebook.html index 9c5440d886b..23411607cc0 100644 --- a/zeppelin-web/src/app/notebook/notebook.html +++ b/zeppelin-web/src/app/notebook/notebook.html @@ -157,7 +157,18 @@
    Interpreter binding
    {{item.name}} , %{{intp.name}}
    + ng-class="{'btn-info': item.selected, 'btn-default': !item.selected}"> + {{item.name}} + + + , + %{{item.group}}.{{intp.name}} + (default) + + +

    From 070e0815854d314d0d12eff8db77242d11fa8a0c Mon Sep 17 00:00:00 2001 From: Khalid Huseynov Date: Wed, 4 Nov 2015 14:05:45 +0900 Subject: [PATCH 035/491] ZEPPELIN - 285 Abort "Pending" or "Running" paragraphs on Interpreter restart This PR address the following issue https://issues.apache.org/jira/browse/ZEPPELIN-285 . The idea is to abort all the jobs which are either running or waiting to run on the interpreter that is going to be restarted. TODO - [x] initial implementation - [x] tests Author: Khalid Huseynov Closes #306 from khalidhuseynov/fix-pending-issue and squashes the following commits: 45c15b3 [Khalid Huseynov] fix test, first paragraph may start running e719cca [Khalid Huseynov] add test 5287bbb [Khalid Huseynov] initial commit --- .../interpreter/InterpreterFactory.java | 18 +++++++ .../zeppelin/notebook/NotebookTest.java | 51 ++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java index 8a1d6ff2752..1beebde6d82 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java @@ -49,6 +49,8 @@ import org.apache.zeppelin.interpreter.Interpreter.RegisteredInterpreter; import org.apache.zeppelin.interpreter.remote.RemoteAngularObjectRegistry; import org.apache.zeppelin.interpreter.remote.RemoteInterpreter; +import org.apache.zeppelin.scheduler.Job; +import org.apache.zeppelin.scheduler.Job.Status; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -538,6 +540,22 @@ public void restart(String id) { synchronized (interpreterSettings) { InterpreterSetting intpsetting = interpreterSettings.get(id); if (intpsetting != null) { + + for (Interpreter intp : intpsetting.getInterpreterGroup()) { + for (Job job : intp.getScheduler().getJobsRunning()) { + job.abort(); + job.setStatus(Status.ABORT); + logger.info("Job " + job.getJobName() + " aborted "); + } + + for (Job job : intp.getScheduler().getJobsWaiting()) { + job.abort(); + job.setStatus(Status.ABORT); + logger.info("Job " + job.getJobName() + " aborted "); + } + } + + intpsetting.getInterpreterGroup().close(); intpsetting.getInterpreterGroup().destroy(); diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java index 31f18cf3929..faad0589b05 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java @@ -20,6 +20,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; @@ -273,6 +274,54 @@ public void testAngularObjectRemovalOnInterpreterRestart() throws InterruptedExc notebook.removeNote(note.id()); } + @Test + public void testAbortParagraphStatusOnInterpreterRestart() throws InterruptedException, + IOException { + Note note = notebook.createNote(); + note.getNoteReplLoader().setInterpreters(factory.getDefaultInterpreterSettingList()); + + Paragraph p1 = note.addParagraph(); + p1.setText("p1"); + Paragraph p2 = note.addParagraph(); + p2.setText("p2"); + Paragraph p3 = note.addParagraph(); + p3.setText("p3"); + Paragraph p4 = note.addParagraph(); + p4.setText("p4"); + + /* all jobs are ready to run */ + assertEquals(Job.Status.READY, p1.getStatus()); + assertEquals(Job.Status.READY, p2.getStatus()); + assertEquals(Job.Status.READY, p3.getStatus()); + assertEquals(Job.Status.READY, p4.getStatus()); + + /* run all */ + note.runAll(); + + /* all are pending in the beginning (first one possibly started)*/ + assertTrue(p1.getStatus() == Job.Status.PENDING || p1.getStatus() == Job.Status.RUNNING); + assertEquals(Job.Status.PENDING, p2.getStatus()); + assertEquals(Job.Status.PENDING, p3.getStatus()); + assertEquals(Job.Status.PENDING, p4.getStatus()); + + /* wait till first job is terminated and second starts running */ + while(p1.isTerminated() == false || (p2.getStatus() == Job.Status.PENDING)) Thread.yield(); + + assertEquals(Job.Status.FINISHED, p1.getStatus()); + assertEquals(Job.Status.RUNNING, p2.getStatus()); + assertEquals(Job.Status.PENDING, p3.getStatus()); + assertEquals(Job.Status.PENDING, p4.getStatus()); + + /* restart interpreter */ + factory.restart(note.getNoteReplLoader().getInterpreterSettings().get(0).id()); + + /* pending and running jobs have been aborted */ + assertEquals(Job.Status.FINISHED, p1.getStatus()); + assertEquals(Job.Status.ABORT, p2.getStatus()); + assertEquals(Job.Status.ABORT, p3.getStatus()); + assertEquals(Job.Status.ABORT, p4.getStatus()); + } + private void delete(File file){ if(file.isFile()) file.delete(); else if(file.isDirectory()){ @@ -285,7 +334,7 @@ else if(file.isDirectory()){ file.delete(); } } - + @Override public JobListener getParagraphJobListener(Note note) { return new JobListener(){ From 4b94aa701215b4426d94d22cd92257cdef823900 Mon Sep 17 00:00:00 2001 From: Damien CORNEAU Date: Fri, 13 Nov 2015 16:45:48 +0900 Subject: [PATCH 036/491] Deactivate IE scrollbar on page The page scrollbar of IE (at least 10) is covering the content of the page screen shot 2015-11-13 at 4 39 29 pm This PR is removing that style for a traditional scrollbar screen shot 2015-11-13 at 4 45 00 pm Author: Damien CORNEAU Closes #425 from corneadoug/fix/IEWindowScrollBar and squashes the following commits: ff31829 [Damien CORNEAU] Deactivate IE scrollbar on page --- zeppelin-web/src/app/home/home.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/zeppelin-web/src/app/home/home.css b/zeppelin-web/src/app/home/home.css index 42c317054ab..0c62279462d 100644 --- a/zeppelin-web/src/app/home/home.css +++ b/zeppelin-web/src/app/home/home.css @@ -20,6 +20,7 @@ body { html, body { height: 100%; + -ms-overflow-style: scrollbar; } .bodyAsIframe { @@ -308,4 +309,4 @@ This part should be removed when new version of bootstrap handles this issue. .btn-group > .tooltip + .btn, .btn-group > .popover + .btn { margin-left: -1px; -} \ No newline at end of file +} From 498fdd6b2ebb5f62864918649f30c72e75c8a75c Mon Sep 17 00:00:00 2001 From: Prabhjyot Singh Date: Tue, 10 Nov 2015 12:04:08 +0530 Subject: [PATCH 037/491] ZEPPELIN-372 : fix for Export not working on Firefox and Safari With reference to bug in https://github.com/apache/incubator-zeppelin/pull/376#issuecomment-154801136 The export link was not working on Firefox and Safari. Have made a fix, this should enable download on Firefox and Safari. Author: Prabhjyot Singh Closes #408 from prabhjyotsingh/ZEPPELIN-372_fix and squashes the following commits: cc20de6 [Prabhjyot Singh] refactoring function into service and remove jQuery call 0833eb2 [Prabhjyot Singh] ZEPPELIN-372: fix for Export not working on IE 91fd7f9 [Prabhjyot Singh] fix for not working on Firefox and Safari --- .../src/app/notebook/notebook.controller.js | 12 ++--- .../browser-detect/browserDetect.service.js | 40 ++++++++++++++++ .../src/components/saveAs/saveAs.service.js | 48 +++++++++++++++++++ zeppelin-web/src/index.html | 2 + 4 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 zeppelin-web/src/components/browser-detect/browserDetect.service.js create mode 100644 zeppelin-web/src/components/saveAs/saveAs.service.js diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index b671eadfc97..848d66d857b 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -15,7 +15,9 @@ */ 'use strict'; -angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $route, $routeParams, $location, $rootScope, $http, websocketMsgSrv, baseUrlSrv, $timeout) { +angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $route, $routeParams, $location, + $rootScope, $http, websocketMsgSrv, baseUrlSrv, + $timeout, SaveAsService) { $scope.note = null; $scope.showEditor = false; $scope.editorToggled = false; @@ -81,12 +83,8 @@ angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $ro //Export notebook $scope.exportNotebook = function() { - var jsonContent = 'data:text/json;charset=utf-8,' + JSON.stringify($scope.note); - var encodedUri = encodeURI(jsonContent); - var link = document.createElement('a'); - link.setAttribute('href', encodedUri); - link.setAttribute('download', $scope.note.name + '.json'); - link.click(); + var jsonContent = JSON.stringify($scope.note); + SaveAsService.SaveAs(jsonContent, $scope.note.name, 'json'); }; //Clone note diff --git a/zeppelin-web/src/components/browser-detect/browserDetect.service.js b/zeppelin-web/src/components/browser-detect/browserDetect.service.js new file mode 100644 index 00000000000..2e70175193f --- /dev/null +++ b/zeppelin-web/src/components/browser-detect/browserDetect.service.js @@ -0,0 +1,40 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +angular.module('zeppelinWebApp').service('browserDetectService', function() { + + this.detectIE = function() { + var ua = window.navigator.userAgent; + var msie = ua.indexOf('MSIE '); + if (msie > 0) { + // IE 10 or older => return version number + return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); + } + var trident = ua.indexOf('Trident/'); + if (trident > 0) { + // IE 11 => return version number + var rv = ua.indexOf('rv:'); + return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10); + } + var edge = ua.indexOf('Edge/'); + if (edge > 0) { + // IE 12 (aka Edge) => return version number + return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10); + } + // other browser + return false; + }; + +}); diff --git a/zeppelin-web/src/components/saveAs/saveAs.service.js b/zeppelin-web/src/components/saveAs/saveAs.service.js new file mode 100644 index 00000000000..7026594c642 --- /dev/null +++ b/zeppelin-web/src/components/saveAs/saveAs.service.js @@ -0,0 +1,48 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +angular.module('zeppelinWebApp').service('SaveAsService', function(browserDetectService) { + + this.SaveAs = function(content, filename, extension) { + if (browserDetectService.detectIE()) { + angular.element('body').append(''); + var frameSaveAs = angular.element('body > iframe#SaveAsId')[0].contentWindow; + frameSaveAs.document.open('text/json', 'replace'); + frameSaveAs.document.write(content); + frameSaveAs.document.close(); + frameSaveAs.focus(); + var t1 = Date.now(); + frameSaveAs.document.execCommand('SaveAs', false, filename + '.' + extension); + var t2 = Date.now(); + + //This means, this version of IE dosen't support auto download of a file with extension provided in param + //falling back to ".txt" + if (t1 === t2) { + frameSaveAs.document.execCommand('SaveAs', true, filename + '.txt'); + } + angular.element('body > iframe#SaveAsId').remove(); + } else { + content = 'data:image/svg;charset=utf-8,' + encodeURIComponent(content); + angular.element('body').append('
    '); + var saveAsElement = angular.element('body > a#SaveAsId'); + saveAsElement.attr('href', content); + saveAsElement.attr('download', filename + '.' + extension); + saveAsElement.attr('target', '_blank'); + saveAsElement[0].click(); + saveAsElement.remove(); + } + }; + +}); diff --git a/zeppelin-web/src/index.html b/zeppelin-web/src/index.html index ea485e109dc..b8dd48911ad 100644 --- a/zeppelin-web/src/index.html +++ b/zeppelin-web/src/index.html @@ -138,6 +138,8 @@ + + From ee1d70494b8bad7033b7534712e82f1f1486c874 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Sun, 15 Nov 2015 15:55:15 +0900 Subject: [PATCH 038/491] ZEPPELIN-422 Add missing Apache Header Some files are missing an Apache Header. https://issues.apache.org/jira/browse/ZEPPELIN-422 Author: Lee moon soo Closes #433 from Leemoonsoo/ZEPPELIN-422 and squashes the following commits: 8abde29 [Lee moon soo] Add Apache Header --- .../notebook/NoteInterpreterLoaderTest.java | 16 +++++++++++++++ .../repo/mock/VFSNotebookRepoMock.java | 20 +++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteInterpreterLoaderTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteInterpreterLoaderTest.java index 3463a900b5c..2e1f5e3e5b2 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteInterpreterLoaderTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NoteInterpreterLoaderTest.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.zeppelin.notebook; import static org.junit.Assert.assertEquals; diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/mock/VFSNotebookRepoMock.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/mock/VFSNotebookRepoMock.java index dd4e513cce4..2674cce07ff 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/mock/VFSNotebookRepoMock.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/mock/VFSNotebookRepoMock.java @@ -1,3 +1,19 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.apache.zeppelin.notebook.repo.mock; import java.io.File; @@ -11,7 +27,7 @@ import org.apache.zeppelin.notebook.repo.VFSNotebookRepo; public class VFSNotebookRepoMock extends VFSNotebookRepo { - + private static ZeppelinConfiguration modifyNotebookDir(ZeppelinConfiguration conf) { String secNotebookDir = conf.getNotebookDir() + "_secondary"; System.setProperty(ConfVars.ZEPPELIN_NOTEBOOK_DIR.getVarName(), secNotebookDir); @@ -22,5 +38,5 @@ private static ZeppelinConfiguration modifyNotebookDir(ZeppelinConfiguration con public VFSNotebookRepoMock(ZeppelinConfiguration conf) throws IOException { super(modifyNotebookDir(conf)); } - + } From bd5cd85673793ee7e67b33f90c4f3cc1eaf21dc7 Mon Sep 17 00:00:00 2001 From: Damien CORNEAU Date: Mon, 16 Nov 2015 16:54:20 +0900 Subject: [PATCH 039/491] ZEPPELIN-430 - Remove deprecated grunt-autoprefixer for grunt-postcss Making a switch off grunt plugin since grunt-autoprefixer is deprecated, and its version of autoprefixer is old. Author: Damien CORNEAU Closes #438 from corneadoug/modify/switchToPostCSS and squashes the following commits: c343530 [Damien CORNEAU] Remove deprecated grunt-autoprefixer for grunt-postcss --- zeppelin-web/Gruntfile.js | 17 ++++++++++------- zeppelin-web/package.json | 3 ++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/zeppelin-web/Gruntfile.js b/zeppelin-web/Gruntfile.js index e7b857def3f..13612ea0af5 100644 --- a/zeppelin-web/Gruntfile.js +++ b/zeppelin-web/Gruntfile.js @@ -83,7 +83,7 @@ module.exports = function (grunt) { '<%= yeoman.app %>/assets/styles/**/*.css', '<%= yeoman.app %>/fonts/**/*.css' ], - tasks: ['newer:copy:styles', 'autoprefixer'] + tasks: ['newer:copy:styles', 'postcss'] }, gruntfile: { files: ['Gruntfile.js'] @@ -186,9 +186,12 @@ module.exports = function (grunt) { }, // Add vendor prefixed styles - autoprefixer: { + postcss: { options: { - browsers: ['last 1 version'] + map: true, + processors: [ + require('autoprefixer')({browsers: ['last 2 versions']}) + ] }, dist: { files: [{ @@ -410,7 +413,7 @@ module.exports = function (grunt) { 'clean:server', 'wiredep', 'concurrent:server', - 'autoprefixer', + 'postcss', 'connect:livereload', 'watch' ]); @@ -425,7 +428,7 @@ module.exports = function (grunt) { 'clean:server', 'wiredep', 'concurrent:test', - 'autoprefixer', + 'postcss', 'connect:test', 'karma' ]); @@ -436,7 +439,7 @@ module.exports = function (grunt) { 'wiredep', 'useminPrepare', 'concurrent:dist', - 'autoprefixer', + 'postcss', 'concat', 'ngAnnotate', 'copy:dist', @@ -451,7 +454,7 @@ module.exports = function (grunt) { 'wiredep', 'useminPrepare', 'concurrent:dist', - 'autoprefixer', + 'postcss', 'concat', 'ngAnnotate', 'copy:dist', diff --git a/zeppelin-web/package.json b/zeppelin-web/package.json index 4a5eea3b88f..62d19b4c1a8 100644 --- a/zeppelin-web/package.json +++ b/zeppelin-web/package.json @@ -6,9 +6,9 @@ "grunt-dom-munger": "^3.4.0" }, "devDependencies": { + "autoprefixer": "^6.1.0", "bower": "", "grunt": "^0.4.1", - "grunt-autoprefixer": "^0.7.3", "grunt-concurrent": "^0.5.0", "grunt-contrib-clean": "^0.5.0", "grunt-contrib-concat": "^0.4.0", @@ -22,6 +22,7 @@ "grunt-filerev": "^0.2.1", "grunt-newer": "^0.7.0", "grunt-ng-annotate": "^0.10.0", + "grunt-postcss": "^0.7.1", "grunt-svgmin": "^0.4.0", "grunt-usemin": "^2.1.1", "grunt-wiredep": "~2.0.0", From 42d875dfa4626e07e47450de6a4ac861d5986ccd Mon Sep 17 00:00:00 2001 From: Damien CORNEAU Date: Mon, 16 Nov 2015 11:57:54 +0900 Subject: [PATCH 040/491] ZEPPELIN-414 - Contain result inside paragraph Taking care of https://issues.apache.org/jira/browse/ZEPPELIN-414 I only applied it on ``HTML`` and ``ANGULAR`` result, because it is the only one that i saw breaking. Didn't have any problem with other types, although I couldn't test with the response type ``IMG``, any good example to test it? Here is how it looks now: ![screen shot 2015-11-16 at 11 54 47 am](https://cloud.githubusercontent.com/assets/710411/11173419/8d137ebe-8c59-11e5-924b-a7fcc43447cf.png) Author: Damien CORNEAU Closes #436 from corneadoug/fix/ZEPPELIN-414 and squashes the following commits: 1cf6921 [Damien CORNEAU] Add overflow auto to html and angular result container --- zeppelin-web/src/app/notebook/paragraph/paragraph.css | 6 +++++- zeppelin-web/src/app/notebook/paragraph/paragraph.html | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.css b/zeppelin-web/src/app/notebook/paragraph/paragraph.css index 79725ef9251..15be3d32266 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.css +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.css @@ -77,6 +77,10 @@ font-family: 'Roboto', sans-serif; } +.paragraph .resultContained { + overflow: auto; +} + /* Paragraph as Iframe CSS */ @@ -381,4 +385,4 @@ .lightBold { font-weight: 500; -} \ No newline at end of file +} diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.html b/zeppelin-web/src/app/notebook/paragraph/paragraph.html index 25ac5849a8d..dcec1072acb 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.html +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.html @@ -372,11 +372,13 @@
    From 79a92c789ff43ce5320655da24e456a7719df7a2 Mon Sep 17 00:00:00 2001 From: Mina Lee Date: Sun, 15 Nov 2015 16:46:23 +0900 Subject: [PATCH 041/491] =?UTF-8?q?[ZEPPELIN-421]=20Remove=20deprecated=20?= =?UTF-8?q?spark=20interpreter=20properties=20from=20in=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …terpreter ui Removed deprecated properties `spark.home`, `spark.yarn.jar`. Corresponding docs will be updated in different PR after #430, #431 merged. Author: Mina Lee Closes #435 from minahlee/ZEPPELIN-421 and squashes the following commits: 3548b3e [Mina Lee] [ZEPPELIN-421] Remove deprecated spark interpreter properties from interpreter ui --- .../apache/zeppelin/spark/PySparkInterpreter.java | 13 ------------- .../org/apache/zeppelin/spark/SparkInterpreter.java | 6 +----- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java index d0e5fecc2b2..9bd258b2e9a 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java @@ -82,9 +82,6 @@ public class PySparkInterpreter extends Interpreter implements ExecuteResultHand "spark", PySparkInterpreter.class.getName(), new InterpreterPropertyBuilder() - .add("spark.home", - SparkInterpreter.getSystemDefault("SPARK_HOME", "spark.home", ""), - "Spark home path. Should be provided for pyspark") .add("zeppelin.pyspark.python", SparkInterpreter.getSystemDefault("PYSPARK_PYTHON", null, "python"), "Python command to run pyspark with").build()); @@ -96,16 +93,6 @@ public PySparkInterpreter(Properties property) { scriptPath = System.getProperty("java.io.tmpdir") + "/zeppelin_pyspark.py"; } - private String getSparkHome() { - String sparkHome = getProperty("spark.home"); - if (sparkHome == null) { - throw new InterpreterException("spark.home is undefined"); - } else { - return sparkHome; - } - } - - private void createPythonScript() { ClassLoader classLoader = getClass().getClassLoader(); File out = new File(scriptPath); diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java index 77d4986bf4e..528005e353b 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java @@ -100,10 +100,6 @@ public class SparkInterpreter extends Interpreter { .add("spark.cores.max", getSystemDefault(null, "spark.cores.max", ""), "Total number of cores to use. Empty value uses all available core.") - .add("spark.yarn.jar", - getSystemDefault("SPARK_YARN_JAR", "spark.yarn.jar", ""), - "The location of the Spark jar file. If you use yarn as a cluster, " - + "we should set this value") .add("zeppelin.spark.useHiveContext", getSystemDefault("ZEPPELIN_SPARK_USEHIVECONTEXT", "zeppelin.spark.useHiveContext", "true"), @@ -310,7 +306,7 @@ public SparkContext createSparkContext() { } //TODO(jongyoul): Move these codes into PySparkInterpreter.java - String pysparkBasePath = getSystemDefault("SPARK_HOME", "spark.home", null); + String pysparkBasePath = getSystemDefault("SPARK_HOME", null, null); File pysparkPath; if (null == pysparkBasePath) { pysparkBasePath = getSystemDefault("ZEPPELIN_HOME", "zeppelin.home", "../"); From c2cbafd1d834cd3b694a6f27f034d5724c90fee8 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Sat, 14 Nov 2015 20:12:09 +0900 Subject: [PATCH 042/491] ZEPPELIN-412 Documentation based on Zeppelin version https://issues.apache.org/jira/browse/ZEPPELIN-412 To provide documentation based on Zeppelin version, like Spark, Flink project does, it need to separate documentations from website. * docs will be kept in Zeppelin main source tree and being built and published under 'docs' menu on website with specific version number. * website will be kept in gh-pages branch and provides menu for multiple version of docs. This PR removes unnecessary pages, which is provided by website. (for example download page) This is the screenshot after applying this PR ![image](https://cloud.githubusercontent.com/assets/1540981/11163334/53a14c7a-8b0e-11e5-80cb-961bb8a15faa.png) ![image](https://cloud.githubusercontent.com/assets/1540981/11163335/5acc9f22-8b0e-11e5-8329-273bee738cc9.png) Author: Lee moon soo Closes #430 from Leemoonsoo/ZEPPELIN-412 and squashes the following commits: 35da7f2 [Lee moon soo] Remove docs dir 5e4ce12 [Lee moon soo] Update readme 0635cbb [Lee moon soo] Remove unnecessary pages e21cdd2 [Lee moon soo] Style font size b5fe812 [Lee moon soo] Change title to overview 469b850 [Lee moon soo] Get remove unnecessary menu --- docs/README.md | 6 +- .../themes/zeppelin/_navigation.html | 26 +----- docs/assets/themes/zeppelin/css/style.css | 3 +- docs/community.md | 33 ------- .../{docs => }/development/howtocontribute.md | 0 .../development/howtocontributewebsite.md | 0 .../development/writingzeppelininterpreter.md | 0 docs/{docs => }/displaysystem/angular.md | 0 docs/{docs => }/displaysystem/display.md | 0 docs/{docs => }/displaysystem/table.md | 0 docs/{docs/index.md => docs.md} | 8 +- .../zeppelin-release-0.5.0-incubating.md | 77 ---------------- docs/download.md | 87 ------------------- docs/index.md | 15 ++-- docs/{docs => }/install/install.md | 0 docs/{docs => }/install/yarn_install.md | 0 docs/{docs => }/interpreter/cassandra.md | 0 docs/{docs => }/interpreter/flink.md | 0 docs/{docs => }/interpreter/geode.md | 0 docs/{docs => }/interpreter/ignite.md | 0 docs/{docs => }/interpreter/lens.md | 0 docs/{docs => }/interpreter/postgresql.md | 0 docs/{docs => }/interpreter/spark.md | 0 docs/{docs => }/manual/dynamicform.md | 0 docs/{docs => }/manual/interpreters.md | 0 docs/{docs => }/manual/notebookashomepage.md | 0 docs/{docs => }/pleasecontribute.md | 0 docs/{docs => }/rest-api/rest-interpreter.md | 0 docs/{docs => }/rest-api/rest-notebook.md | 0 docs/{docs => }/storage/storage.md | 0 docs/{docs => }/tutorial/tutorial.md | 0 31 files changed, 17 insertions(+), 238 deletions(-) delete mode 100644 docs/community.md rename docs/{docs => }/development/howtocontribute.md (100%) rename docs/{docs => }/development/howtocontributewebsite.md (100%) rename docs/{docs => }/development/writingzeppelininterpreter.md (100%) rename docs/{docs => }/displaysystem/angular.md (100%) rename docs/{docs => }/displaysystem/display.md (100%) rename docs/{docs => }/displaysystem/table.md (100%) rename docs/{docs/index.md => docs.md} (92%) delete mode 100644 docs/docs/releases/zeppelin-release-0.5.0-incubating.md delete mode 100644 docs/download.md rename docs/{docs => }/install/install.md (100%) rename docs/{docs => }/install/yarn_install.md (100%) rename docs/{docs => }/interpreter/cassandra.md (100%) rename docs/{docs => }/interpreter/flink.md (100%) rename docs/{docs => }/interpreter/geode.md (100%) rename docs/{docs => }/interpreter/ignite.md (100%) rename docs/{docs => }/interpreter/lens.md (100%) rename docs/{docs => }/interpreter/postgresql.md (100%) rename docs/{docs => }/interpreter/spark.md (100%) rename docs/{docs => }/manual/dynamicform.md (100%) rename docs/{docs => }/manual/interpreters.md (100%) rename docs/{docs => }/manual/notebookashomepage.md (100%) rename docs/{docs => }/pleasecontribute.md (100%) rename docs/{docs => }/rest-api/rest-interpreter.md (100%) rename docs/{docs => }/rest-api/rest-notebook.md (100%) rename docs/{docs => }/storage/storage.md (100%) rename docs/{docs => }/tutorial/tutorial.md (100%) diff --git a/docs/README.md b/docs/README.md index b4635999472..100aacf5062 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,4 @@ -## Zeppelin project website - -Welcome to the Zeppelin documentation! +## Zeppelin documentation This readme will walk you through building the Zeppelin documentation, which is included here with the Zeppelin source code. @@ -32,7 +30,7 @@ See https://help.github.com/articles/using-jekyll-with-pages#installing-jekyll ``` svn co https://svn.apache.org/repos/asf/incubator/zeppelin asf-zepplelin ``` - 3. copy zeppelin/_site to asf-zepplelin/site + 3. copy zeppelin/_site to asf-zepplelin/site/docs/[VERSION] 4. ```svn commit``` ## Adding a new page diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html index ca53595d745..6ac69305d72 100644 --- a/docs/_includes/themes/zeppelin/_navigation.html +++ b/docs/_includes/themes/zeppelin/_navigation.html @@ -9,7 +9,7 @@ I'm zeppelin - Apache Zeppelin (incubating) + Zeppelin (0.6.0-incubating-SNAPSHOT) - -{% if page.title == "Zeppelin" %} -
    -
    -

    Apache Zeppelin (incubating)

    -

    A web-based notebook that enables interactive data analytics.
    - You can make beautiful data-driven, interactive and collaborative documents with SQL, Scala and more. -

    -

    Watch the video - - Get Zeppelin

    -
    -
    -{% endif %} diff --git a/docs/assets/themes/zeppelin/css/style.css b/docs/assets/themes/zeppelin/css/style.css index 92f25bf005f..d54df95f67a 100644 --- a/docs/assets/themes/zeppelin/css/style.css +++ b/docs/assets/themes/zeppelin/css/style.css @@ -305,7 +305,8 @@ body { } .navbar-brand small { - font-size: 60%; + font-size: 14px; + font-family: 'Helvetica Neue', Helvetica; color: #FFF; } .navbar-collapse.collapse { diff --git a/docs/community.md b/docs/community.md deleted file mode 100644 index d9ec874e94e..00000000000 --- a/docs/community.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -layout: page -title: "Community" -description: "" -group: nav-right ---- - -{% include JB/setup %} - - -### Mailing list - -Get help using Zeppelin or contribute to the project on our mailing lists: - -* [users@zeppelin.incubator.apache.org](http://mail-archives.apache.org/mod_mbox/incubator-zeppelin-users/) is for usage questions, help, and announcements. [subscribe](mailto:users-subscribe@zeppelin.incubator.apache.org?subject=send this email to subscribe), [unsubscribe](mailto:users-unsubscribe@zeppelin.incubator.apache.org?subject=send this email to unsubscribe), [archives](http://mail-archives.apache.org/mod_mbox/incubator-zeppelin-users/) -* [dev@zeppelin.incubator.apache.org](http://mail-archives.apache.org/mod_mbox/incubator-zeppelin-dev/) is for people who want to contribute code to Zeppelin. [subscribe](mailto:dev-subscribe@zeppelin.incubator.apache.org?subject=send this email to subscribe), [unsubscribe](mailto:dev-unsubscribe@zeppelin.incubator.apache.org?subject=send this email to unsubscribe), [archives](http://mail-archives.apache.org/mod_mbox/incubator-zeppelin-dev/) -* [commits@zeppelin.incubator.apache.org](http://mail-archives.apache.org/mod_mbox/incubator-zeppelin-commits/) is for commit messages and patches to Zeppelin. [subscribe](mailto:commits-subscribe@zeppelin.incubator.apache.org?subject=send this email to subscribe), [unsubscribe](mailto:commits-unsubscribe@zeppelin.incubator.apache.org?subject=send this email to unsubscribe), [archives](http://mail-archives.apache.org/mod_mbox/incubator-zeppelin-commits/) - -### Issue tracker - - [https://issues.apache.org/jira/browse/ZEPPELIN](https://issues.apache.org/jira/browse/ZEPPELIN) diff --git a/docs/docs/development/howtocontribute.md b/docs/development/howtocontribute.md similarity index 100% rename from docs/docs/development/howtocontribute.md rename to docs/development/howtocontribute.md diff --git a/docs/docs/development/howtocontributewebsite.md b/docs/development/howtocontributewebsite.md similarity index 100% rename from docs/docs/development/howtocontributewebsite.md rename to docs/development/howtocontributewebsite.md diff --git a/docs/docs/development/writingzeppelininterpreter.md b/docs/development/writingzeppelininterpreter.md similarity index 100% rename from docs/docs/development/writingzeppelininterpreter.md rename to docs/development/writingzeppelininterpreter.md diff --git a/docs/docs/displaysystem/angular.md b/docs/displaysystem/angular.md similarity index 100% rename from docs/docs/displaysystem/angular.md rename to docs/displaysystem/angular.md diff --git a/docs/docs/displaysystem/display.md b/docs/displaysystem/display.md similarity index 100% rename from docs/docs/displaysystem/display.md rename to docs/displaysystem/display.md diff --git a/docs/docs/displaysystem/table.md b/docs/displaysystem/table.md similarity index 100% rename from docs/docs/displaysystem/table.md rename to docs/displaysystem/table.md diff --git a/docs/docs/index.md b/docs/docs.md similarity index 92% rename from docs/docs/index.md rename to docs/docs.md index 1f1292e797a..9678641b8e1 100644 --- a/docs/docs/index.md +++ b/docs/docs.md @@ -35,14 +35,14 @@ limitations under the License. * [cassandra](./interpreter/cassandra.html) * [flink](./interpreter/flink.html) * [geode](./interpreter/geode.html) -* [hive](../docs/pleasecontribute.html) +* [hive](../pleasecontribute.html) * [ignite](./interpreter/ignite.html) * [lens](./interpreter/lens.html) -* [md](../docs/pleasecontribute.html) +* [md](../pleasecontribute.html) * [postgresql, hawq](./interpreter/postgresql.html) -* [sh](../docs/pleasecontribute.html) +* [sh](../pleasecontribute.html) * [spark](./interpreter/spark.html) -* [tajo](../docs/pleasecontribute.html) +* [tajo](../pleasecontribute.html) ### Storage * [S3 Storage](./storage/storage.html) diff --git a/docs/docs/releases/zeppelin-release-0.5.0-incubating.md b/docs/docs/releases/zeppelin-release-0.5.0-incubating.md deleted file mode 100644 index a6fbe4d8275..00000000000 --- a/docs/docs/releases/zeppelin-release-0.5.0-incubating.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -layout: page -title: "Zeppelin Release 0.5.0-incubating" -description: "" -group: release ---- - -{% include JB/setup %} - -### Zeppelin Release 0.5.0-incubating - -Zeppelin 0.5.0-incubating is the first release under Apache incubation, with contributions from 42 developers and more than 600 commits. - -To download Zeppelin 0.5.0-incubating visit the [download](../../download.html) page. - -You can visit [issue tracker](https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12316221&version=12329850) for full list of issues being resolved. - -### Contributors - -The following developers contributed to this release: - -* Akshat Aranya - New features and Improvements in UI. -* Alexander Bezzubov -Improvements and Bug fixes in Core, UI, Build system. New feature and Improvements in Spark interpreter. Documentation in roadmap. -* Anthony Corbacho - Improvements in Website. Bug fixes Build system. Improvements and Bug fixes in UI. Documentation in roadmap. -* Brennon York - Improvements and Bug fixes in Build system. -* CORNEAU Damien - New feature, Improvements and Bug fixes in UI and Build system. -* Corey Huang - Improvements in Build system. New feature in Core. -* Digeratus - Improvements in Tutorials. -* Dimitrios Liapis - Improvements in Documentation. -* DuyHai DOAN - New feature in Build system. -* Emmanuelle Raffenne - Bug fixes in UI. -* Eran Medan - Improvements in Documentation. -* Eugene Morozov - Bug fixes in Core. -* Felix Cheung - Improvements in Spark interpreter. Improvements in Documentation. New features, Improvements and Bug fixes in UI. -* Hung Lin - Improvements in Core. -* Hyungu Roh - Bug fixes in UI. -* Ilya Ganelin - Improvements in Tutorials. -* JaeHwa Jung - New features in Tajo interpreter. -* Jakob Homan - Improvements in Website. -* James Carman - Improvements in Build system. -* Jongyoul Lee - Improvements in Core, Build system and Spark interpreter. Bug fixes in Spark Interpreter. New features in Build system and Spark interpreter. Improvements in Documentation. -* Juarez Bochi - Bug fixes in Build system. -* Julien Buret - Bug fixes in Spark interpreter. -* Jérémy Subtil - Bug fixes in Build system. -* Kevin (SangWoo) Kim - New features in Core, Tutorials. Improvements in Documentation. New features, Improvements and Bug fixes in UI. -* Kyoung-chan Lee - Improvements in Documentation. -* Lee moon soo - Improvements in Tutorials. New features, Improvements and Bug fixes in Core, UI, Build system and Spark interpreter. New features in Flink interpreter. Improvments in Documentation. -* Mina Lee - Improvements and Bug fixes in UI. New features in UI. Improvements in Core, Website. -* Rajat Gupta - Bug fixes in Spark interpreter. -* Ram Venkatesh - Improvements in Core, Build system, Spark interpreter and Markdown interpreter. New features and Bug fixes in Hive interpreter. -* Sebastian YEPES - Improvements in Core. -* Seckin Savasci - Improvements in Build system. -* Timothy Shelton - Bug fixes in UI. -* Vincent Botta - New features in UI. -* Young boom - Improvements in UI. -* bobbych - Improvements in Spark interpreter. -* debugger87 - Bug fixes in Core. -* dobachi - Improvements in UI. -* epahomov - Improvements in Core and Spark interpreter. -* kevindai0126 - Improvements in Core. -* rahul agarwal - Bug fixes in Core. -* whisperstream - Improvements in Spark interpreter. -* yundai - Improvements in Core. - -Thanks to everyone who made this release possible! diff --git a/docs/download.md b/docs/download.md deleted file mode 100644 index 99c4ac1b10e..00000000000 --- a/docs/download.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -layout: page -title: "Download" -description: "" -group: nav-right ---- - -{% include JB/setup %} - -### Download Zeppelin - -The latest release of Apache Zeppelin (incubating) is *0.5.0-incubating*. - - - 0.5.0-incubating released on July 23, 2015 ([release notes](./docs/releases/zeppelin-release-0.5.0-incubating.html)) ([git tag](https://git-wip-us.apache.org/repos/asf?p=incubator-zeppelin.git;a=tag;h=refs/tags/v0.5.0)) - - - * Source: - zeppelin-0.5.0-incubating.tgz - ([pgp](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating.tgz.asc), - [md5](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating.tgz.md5), - [sha](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating.tgz.sha)) - - * Binary built with spark-1.4.0 and hadoop-2.3: - zeppelin-0.5.0-incubating-bin-spark-1.4.0_hadoop-2.3.tgz - ([pgp](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating-bin-spark-1.4.0_hadoop-2.3.tgz.asc), - [md5](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating-bin-spark-1.4.0_hadoop-2.3.tgz.md5), - [sha](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating-bin-spark-1.4.0_hadoop-2.3.tgz.sha)) - - * Binary built with spark-1.3.1 and hadoop-2.3: - zeppelin-0.5.0-incubating-bin-spark-1.3.1_hadoop-2.3.tgz - ([pgp](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating-bin-spark-1.3.1_hadoop-2.3.tgz.asc), - [md5](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating-bin-spark-1.3.1_hadoop-2.3.tgz.md5), - [sha](https://www.apache.org/dist/incubator/zeppelin/0.5.0-incubating/zeppelin-0.5.0-incubating-bin-spark-1.3.1_hadoop-2.3.tgz.sha)) - - - - - -### Verify the integrity of the files - -It is essential that you [verify](https://www.apache.org/info/verification.html) the integrity of the downloaded files using the PGP or MD5 signatures. This signature should be matched against the [KEYS](https://www.apache.org/dist/incubator/zeppelin/KEYS) file. - - - -### Build from source - -For developers, to get latest *0.6.0-incubating-SNAPSHOT* check [install](./docs/install/install.html) section. - - - \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 57ad2fbbe39..4343c648b1f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,7 +1,8 @@ --- layout: page -title: Zeppelin +title: Overview tagline: Less Development, More analysis! +group: nav-right --- {% include JB/setup %} - +

    Multi-purpose Notebook

    @@ -45,7 +46,7 @@ Currently Zeppelin supports many interpreters such as Scala(with Apache Spark), -Adding new language-backend is really simple. Learn [how to write a zeppelin interpreter](./docs/development/writingzeppelininterpreter.html). +Adding new language-backend is really simple. Learn [how to write a zeppelin interpreter](./development/writingzeppelininterpreter.html).
    @@ -58,7 +59,7 @@ Zeppelin provides built-in Apache Spark integration. You don't need to build a s Zeppelin's Spark integration provides - Automatic SparkContext and SQLContext injection -- Runtime jar dependency loading from local filesystem or maven repository. Learn more about [dependency loader](./docs/interpreter/spark.html#dependencyloading). +- Runtime jar dependency loading from local filesystem or maven repository. Learn more about [dependency loader](./interpreter/spark.html#dependencyloading). - Canceling job and displaying its progress
    @@ -84,7 +85,7 @@ With simple drag and drop Zeppelin aggeregates the values and display them in pi
    -Learn more about Zeppelin's Display system. ( [text](./docs/displaysystem/display.html), [html](./docs/displaysystem/display.html#html), [table](./docs/displaysystem/table.html), [angular](./docs/displaysystem/angular.html) ) +Learn more about Zeppelin's Display system. ( [text](./displaysystem/display.html), [html](./displaysystem/display.html#html), [table](./displaysystem/table.html), [angular](./displaysystem/angular.html) )
    @@ -94,7 +95,7 @@ Zeppelin can dynamically create some input forms into your notebook. -Learn more about [Dynamic Forms](./docs/manual/dynamicform.html). +Learn more about [Dynamic Forms](./manual/dynamicform.html).
    @@ -117,7 +118,7 @@ This way, you can easily embed it as an iframe inside of your website.


    ### 100% Opensource -Apache Zeppelin (incubating) is Apache2 Licensed software. Please check out the [source repository](https://github.com/apache/incubator-zeppelin) and [How to contribute](./docs/development/howtocontribute.html) +Apache Zeppelin (incubating) is Apache2 Licensed software. Please check out the [source repository](https://github.com/apache/incubator-zeppelin) and [How to contribute](./development/howtocontribute.html) Zeppelin has a very active development community. Join the [Mailing list](./community.html) and report issues on our [Issue tracker](https://issues.apache.org/jira/browse/ZEPPELIN). diff --git a/docs/docs/install/install.md b/docs/install/install.md similarity index 100% rename from docs/docs/install/install.md rename to docs/install/install.md diff --git a/docs/docs/install/yarn_install.md b/docs/install/yarn_install.md similarity index 100% rename from docs/docs/install/yarn_install.md rename to docs/install/yarn_install.md diff --git a/docs/docs/interpreter/cassandra.md b/docs/interpreter/cassandra.md similarity index 100% rename from docs/docs/interpreter/cassandra.md rename to docs/interpreter/cassandra.md diff --git a/docs/docs/interpreter/flink.md b/docs/interpreter/flink.md similarity index 100% rename from docs/docs/interpreter/flink.md rename to docs/interpreter/flink.md diff --git a/docs/docs/interpreter/geode.md b/docs/interpreter/geode.md similarity index 100% rename from docs/docs/interpreter/geode.md rename to docs/interpreter/geode.md diff --git a/docs/docs/interpreter/ignite.md b/docs/interpreter/ignite.md similarity index 100% rename from docs/docs/interpreter/ignite.md rename to docs/interpreter/ignite.md diff --git a/docs/docs/interpreter/lens.md b/docs/interpreter/lens.md similarity index 100% rename from docs/docs/interpreter/lens.md rename to docs/interpreter/lens.md diff --git a/docs/docs/interpreter/postgresql.md b/docs/interpreter/postgresql.md similarity index 100% rename from docs/docs/interpreter/postgresql.md rename to docs/interpreter/postgresql.md diff --git a/docs/docs/interpreter/spark.md b/docs/interpreter/spark.md similarity index 100% rename from docs/docs/interpreter/spark.md rename to docs/interpreter/spark.md diff --git a/docs/docs/manual/dynamicform.md b/docs/manual/dynamicform.md similarity index 100% rename from docs/docs/manual/dynamicform.md rename to docs/manual/dynamicform.md diff --git a/docs/docs/manual/interpreters.md b/docs/manual/interpreters.md similarity index 100% rename from docs/docs/manual/interpreters.md rename to docs/manual/interpreters.md diff --git a/docs/docs/manual/notebookashomepage.md b/docs/manual/notebookashomepage.md similarity index 100% rename from docs/docs/manual/notebookashomepage.md rename to docs/manual/notebookashomepage.md diff --git a/docs/docs/pleasecontribute.md b/docs/pleasecontribute.md similarity index 100% rename from docs/docs/pleasecontribute.md rename to docs/pleasecontribute.md diff --git a/docs/docs/rest-api/rest-interpreter.md b/docs/rest-api/rest-interpreter.md similarity index 100% rename from docs/docs/rest-api/rest-interpreter.md rename to docs/rest-api/rest-interpreter.md diff --git a/docs/docs/rest-api/rest-notebook.md b/docs/rest-api/rest-notebook.md similarity index 100% rename from docs/docs/rest-api/rest-notebook.md rename to docs/rest-api/rest-notebook.md diff --git a/docs/docs/storage/storage.md b/docs/storage/storage.md similarity index 100% rename from docs/docs/storage/storage.md rename to docs/storage/storage.md diff --git a/docs/docs/tutorial/tutorial.md b/docs/tutorial/tutorial.md similarity index 100% rename from docs/docs/tutorial/tutorial.md rename to docs/tutorial/tutorial.md From d9ac131e1301cf8fbf8946cd5be5b6fd84d6b184 Mon Sep 17 00:00:00 2001 From: JaeHwa Jung Date: Tue, 17 Nov 2015 10:37:00 +0900 Subject: [PATCH 043/491] ZEPPELIN-427: Upgrade to Apache TAJO 0.11.0 I bumped up Tajo to 0.11.0. And I enabled ```cancel()``` because Tajo supports it since 0.11.0 release. For the reference, this patch ran successfully on my Tajo testing cluster. Author: JaeHwa Jung Closes #439 from blrunner/ZEPPELIN-427 and squashes the following commits: 295e59e [JaeHwa Jung] Remove unused packages 8346f90 [JaeHwa Jung] Add more unit test cases 2b81d4f [JaeHwa Jung] Bump up Tajo to 0.11.0 --- tajo/pom.xml | 2 +- .../apache/zeppelin/tajo/TajoInterpreter.java | 22 +++++++-------- .../zeppelin/tajo/TajoInterpreterTest.java | 27 +++++++++---------- 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/tajo/pom.xml b/tajo/pom.xml index c08a0db73a6..cf4311f3e34 100644 --- a/tajo/pom.xml +++ b/tajo/pom.xml @@ -33,7 +33,7 @@ http://www.apache.org - 0.10.0 + 0.11.0 diff --git a/tajo/src/main/java/org/apache/zeppelin/tajo/TajoInterpreter.java b/tajo/src/main/java/org/apache/zeppelin/tajo/TajoInterpreter.java index 716a32a4e7d..f896061387b 100644 --- a/tajo/src/main/java/org/apache/zeppelin/tajo/TajoInterpreter.java +++ b/tajo/src/main/java/org/apache/zeppelin/tajo/TajoInterpreter.java @@ -165,18 +165,16 @@ public InterpreterResult interpret(String cmd, InterpreterContext contextInterpr @Override public void cancel(InterpreterContext context) { - // Currently, Tajo doesn't provide JDBC cancel method. It will be implemented in - // Tajo 0.11.0 version. You can find related issue progress at TAJO-751. -// if (statement != null) { -// try { -// statement.cancel(); -// } -// catch (SQLException ex) { -// } -// finally { -// statement = null; -// } -// } + if (statement != null) { + try { + statement.cancel(); + } + catch (SQLException ex) { + } + finally { + statement = null; + } + } } @Override diff --git a/tajo/src/test/java/org/apache/zeppelin/tajo/TajoInterpreterTest.java b/tajo/src/test/java/org/apache/zeppelin/tajo/TajoInterpreterTest.java index abe1ca6bfbf..4390d58c6f7 100644 --- a/tajo/src/test/java/org/apache/zeppelin/tajo/TajoInterpreterTest.java +++ b/tajo/src/test/java/org/apache/zeppelin/tajo/TajoInterpreterTest.java @@ -18,19 +18,16 @@ package org.apache.zeppelin.tajo; -import com.google.gson.JsonParseException; import org.apache.tajo.jdbc.TajoDriver; import org.apache.zeppelin.interpreter.InterpreterResult; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.lang.reflect.Constructor; import java.util.Properties; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.*; /** * Tajo interpreter unit tests @@ -45,21 +42,20 @@ public void tearDown() throws Exception { } @Test - public void test() { + public void testTajoInterpreter() throws Exception { TajoInterpreter t = new TesterTajoInterpreter(new Properties()); t.open(); - Class clazz; - try { - clazz = Class.forName(t.TAJO_DRIVER_NAME); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - throw new JsonParseException(e); - } - // check tajo jdbc driver + Class clazz = Class.forName(t.TAJO_DRIVER_NAME); assertNotNull(clazz); + Constructor cons = clazz.getConstructor(new Class[]{}); + + TajoDriver driver = (TajoDriver) cons.newInstance(); + assertTrue(driver.acceptsURL("jdbc:tajo:")); + assertFalse(driver.acceptsURL("jdbc:taju:")); + // simple select test InterpreterResult result = t.interpret("select * from t", null); assertEquals(result.type(), InterpreterResult.Type.TABLE); @@ -67,6 +63,9 @@ public void test() { // explain test result = t.interpret("explain select * from t", null); assertEquals(result.type(), InterpreterResult.Type.TEXT); + t.close(); } + + } \ No newline at end of file From 28d30b4d47d9e3267ae991ba0bece461a3a83e92 Mon Sep 17 00:00:00 2001 From: Mina Lee Date: Sun, 15 Nov 2015 21:32:59 +0900 Subject: [PATCH 044/491] [ZEPPELIN-420] Improve notebook clone behavior This PR handles two issues with notebook clone behavior. * If same paragraphs from original notebook and cloned notebook run at the same time, both paragraphs can be in `RUNNING` status. And clone notebook's paragraph stays in running status until restart Zeppelin server because two paragraphs have same paragraph id and job id: ![before1](https://cloud.githubusercontent.com/assets/8503346/11164773/35fba1be-8b3d-11e5-9d70-d49ed1b25bba.gif) After: ![after1](https://cloud.githubusercontent.com/assets/8503346/11164844/a6aff5fc-8b3f-11e5-9bb4-72152790db03.gif) * Copy paragraph status(RUNNING, PENDING): ![before2](https://cloud.githubusercontent.com/assets/8503346/11164793/265029fa-8b3e-11e5-9105-e2bf7f4af07e.gif) After: ![after2 fig](https://cloud.githubusercontent.com/assets/8503346/11164855/25a64938-8b40-11e5-87ba-8f3b6ff492b9.gif) Author: Mina Lee Closes #432 from minahlee/ZEPPELIN-420 and squashes the following commits: 8eb7973 [Mina Lee] [ZEPPELIN-420] Add clone note test 102f8ea [Mina Lee] [ZEPPELIN-420] Improve notebook clone behavior --- .../org/apache/zeppelin/notebook/Note.java | 29 ++++++++++++++++--- .../apache/zeppelin/notebook/Notebook.java | 5 ++-- .../apache/zeppelin/notebook/Paragraph.java | 14 +-------- .../zeppelin/notebook/NotebookTest.java | 21 ++++++++++++++ 4 files changed, 49 insertions(+), 20 deletions(-) diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java index 033039cb87c..89a72b517c8 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java @@ -28,9 +28,11 @@ import org.apache.zeppelin.conf.ZeppelinConfiguration; import org.apache.zeppelin.display.AngularObject; import org.apache.zeppelin.display.AngularObjectRegistry; +import org.apache.zeppelin.display.Input; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterException; import org.apache.zeppelin.interpreter.InterpreterGroup; +import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.InterpreterSetting; import org.apache.zeppelin.notebook.repo.NotebookRepo; import org.apache.zeppelin.notebook.utility.IdHashes; @@ -40,6 +42,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.Gson; + /** * Binded interpreters for a note */ @@ -144,13 +148,30 @@ public Paragraph addParagraph() { } /** - * Add the paragraph p to the list of paras in note. + * Clone paragraph and add it to note. * - * @param p + * @param srcParagraph */ - public void addParagraph(Paragraph p) { + public void addCloneParagraph(Paragraph srcParagraph) { + Paragraph newParagraph = new Paragraph(this, this, replLoader); + + Map config = new HashMap<>(srcParagraph.getConfig()); + Map param = new HashMap<>(srcParagraph.settings.getParams()); + Map form = new HashMap<>(srcParagraph.settings.getForms()); + Gson gson = new Gson(); + InterpreterResult result = gson.fromJson( + gson.toJson(srcParagraph.getReturn()), + InterpreterResult.class); + + newParagraph.setConfig(config); + newParagraph.settings.setParams(param); + newParagraph.settings.setForms(form); + newParagraph.setText(srcParagraph.getText()); + newParagraph.setTitle(srcParagraph.getTitle()); + newParagraph.setReturn(result, null); + synchronized (paragraphs) { - paragraphs.add(p); + paragraphs.add(newParagraph); } } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java index 770172a43c3..66243103e27 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java @@ -141,9 +141,8 @@ public Note cloneNote(String sourceNoteID, String newNoteName) throws bindInterpretersToNote(newNote.id(), boundInterpreterSettingsIds); List paragraphs = sourceNote.getParagraphs(); - for (Paragraph para : paragraphs) { - Paragraph p = (Paragraph) para.clone(); - newNote.addParagraph(p); + for (Paragraph p : paragraphs) { + newNote.addCloneParagraph(p); } newNote.persist(); return newNote; diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java index fc3646aaf57..1332f167a6b 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java @@ -276,19 +276,7 @@ public void setReturn(InterpreterResult value, Throwable t) { @Override public Object clone() throws CloneNotSupportedException { - Paragraph paraClone = (Paragraph) super.clone(); - Map config = new HashMap<>(this.getConfig()); - // Show the editor by default - String hideEditorKey = "editorHide"; - Object object = config.get(hideEditorKey); - if (object != null && object == Boolean.TRUE) { - config.put(hideEditorKey, Boolean.FALSE); - } - Map param = new HashMap<>(this.settings.getParams()); - paraClone.setConfig(config); - paraClone.settings.setParams(param); - paraClone.setTitle(this.getTitle()); - paraClone.setText(this.getText()); + Paragraph paraClone = (Paragraph) this.clone(); return paraClone; } } diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java index faad0589b05..5d887e9d13a 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java @@ -18,6 +18,7 @@ package org.apache.zeppelin.notebook; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -221,6 +222,26 @@ public void testSchedule() throws InterruptedException, IOException{ assertEquals(dateFinished, p.getDateFinished()); } + @Test + public void testCloneNote() throws IOException, CloneNotSupportedException, + InterruptedException { + Note note = notebook.createNote(); + note.getNoteReplLoader().setInterpreters(factory.getDefaultInterpreterSettingList()); + + final Paragraph p = note.addParagraph(); + p.setText("hello world"); + note.runAll(); + while(p.isTerminated()==false || p.getResult()==null) Thread.yield(); + + p.setStatus(Status.RUNNING); + Note cloneNote = notebook.cloneNote(note.getId(), "clone note"); + Paragraph cp = cloneNote.paragraphs.get(0); + assertEquals(cp.getStatus(), Status.READY); + assertNotEquals(cp.getId(), p.getId()); + assertEquals(cp.text, p.text); + assertEquals(cp.getResult().message(), p.getResult().message()); + } + @Test public void testAngularObjectRemovalOnNotebookRemove() throws InterruptedException, IOException { From 36f3549bee4be408a832b0857c32abd75920985e Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Fri, 13 Nov 2015 20:11:58 +0900 Subject: [PATCH 045/491] ZEPPELIN-418 Keep paragraph height the same with/without executionTime label Addresses https://issues.apache.org/jira/browse/ZEPPELIN-418. * [x] executionTime label ("took xx seconds") keeps it's space while paragraph is running * [x] show executionTime label only on hover mouse in 'simple' look n feel #### 'default' look n feel Before ![image](https://cloud.githubusercontent.com/assets/1540981/11144800/d92565ba-8a42-11e5-9948-ec1dce8afb2a.png) After ![image](https://cloud.githubusercontent.com/assets/1540981/11144767/988a2342-8a42-11e5-889f-988a3d3aefcb.png) #### 'simple' look n feel Before ![image](https://cloud.githubusercontent.com/assets/1540981/11144821/06c38510-8a43-11e5-9839-843861c97edd.png) After ![image](https://cloud.githubusercontent.com/assets/1540981/11144834/27c86d84-8a43-11e5-9214-936cff901abe.png) Author: Lee moon soo Closes #426 from Leemoonsoo/fixed_height and squashes the following commits: c040c5c [Lee moon soo] botton-margin 974e613 [Lee moon soo] Keep paragraph height the same with/without scrollbar (and executionTime) --- .../paragraph/paragraph.controller.js | 2 +- .../src/app/notebook/paragraph/paragraph.css | 17 ++++++++++++++--- .../src/app/notebook/paragraph/paragraph.html | 9 +++++++-- .../src/assets/styles/looknfeel/simple.css | 19 +++++++++++++++++++ 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index d90f7108c44..57c432df2f2 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -697,7 +697,7 @@ angular.module('zeppelinWebApp') } return ''; } - var desc = 'Took ' + (timeMs/1000) + ' seconds.'; + var desc = 'Took ' + (timeMs/1000) + ' seconds'; if ($scope.isResultOutdated()){ desc += ' (outdated)'; } diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.css b/zeppelin-web/src/app/notebook/paragraph/paragraph.css index 15be3d32266..6d413c666da 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.css +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.css @@ -18,7 +18,8 @@ .paragraph-space { margin-bottom: 5px !important; - padding: 10px !important; + padding: 10px 10px 10px 10px !important; + min-height : 30px; } .paragraph-margin { @@ -42,6 +43,7 @@ font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace; font-size: 12px !important; margin-bottom: 5px !important; + padding-top: 2px; } .paragraph table { @@ -71,6 +73,10 @@ border: 3px solid #DDDDDD; } +.paragraph .paragraphFooter { + height: 9px; +} + .paragraph .executionTime { color: #999; font-size: 10px; @@ -181,8 +187,7 @@ */ .paragraph .title { - margin: 3px 0px 0px 0px; - min-height: 20px; + margin: 0px 0px 0px 0px; font-size: 12px; } @@ -289,6 +294,12 @@ Table Display CSS */ +.tableDisplay { +} + +.tableDisplay div { +} + .tableDisplay img { display: block; max-width: 100%; diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.html b/zeppelin-web/src/app/notebook/paragraph/paragraph.html index dcec1072acb..e2aa9a36af1 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.html +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.html @@ -394,10 +394,9 @@ ng-if="paragraph.status == 'ERROR'" ng-bind="paragraph.errorMessage"> - -
    +
    @@ -483,4 +482,10 @@
    + +
    +
    +
    +
    + diff --git a/zeppelin-web/src/assets/styles/looknfeel/simple.css b/zeppelin-web/src/assets/styles/looknfeel/simple.css index aaf7d181122..43a78e80263 100644 --- a/zeppelin-web/src/assets/styles/looknfeel/simple.css +++ b/zeppelin-web/src/assets/styles/looknfeel/simple.css @@ -53,6 +53,25 @@ body { visibility: visible; } +.paragraph .paragraphFooter { + visibility: hidden; + height: 0px; + position: relative; + top : -13px; + z-index: 99; +} + +.paragraph .executionTime { + font-size: 8px; + text-align: right; + margin-right: 5px; +} + +.paragraph:hover .paragraphFooter { + visibility: visible; +} + + .noteAction span, .noteAction button, .noteAction form { From d457277f0ef7229b725b6605dfeb5292b0e78723 Mon Sep 17 00:00:00 2001 From: Damien CORNEAU Date: Tue, 17 Nov 2015 17:06:10 +0900 Subject: [PATCH 046/491] ZEPPELIN-431 - Show Karma test results There has been a few karma issues during build, after trying it today I realized that running ``./grunt test`` wasn't really showing the usual output. Some time Before: screen shot 2015-11-04 at 11 50 34 pm Now: screen shot 2015-11-04 at 11 51 18 pm I'm thinking that Karma coverage might have been hidding those karma results, and therefore we can't see what is really happening or which rest is failing. Author: Damien CORNEAU Closes #390 from corneadoug/fix/karmaProblems and squashes the following commits: f231014 [Damien CORNEAU] Fix RAT 3c6006e [Damien CORNEAU] Re-activate karma test results on the CLI --- .gitignore | 2 +- pom.xml | 5 +++-- zeppelin-web/pom.xml | 1 - zeppelin-web/test/karma.conf.js | 5 +++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index aa5306086d1..1cdb809f286 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ conf/interpreter.json # other generated files spark/dependency-reduced-pom.xml +reports #webapp zeppelin-web/node_modules @@ -26,7 +27,6 @@ zeppelin-web/.sass-cache zeppelin-web/bower_components **nbproject/ **node/ -zeppelin-web/reports/coverage # project level diff --git a/pom.xml b/pom.xml index 6cee83694b5..696f26f92a4 100755 --- a/pom.xml +++ b/pom.xml @@ -425,6 +425,7 @@ **/*.keywords + reports/** **/.idea/ **/*.iml .git/ @@ -480,10 +481,10 @@ docs/Rakefile docs/rss.xml docs/sitemap.txt - + docs/assets/themes/zeppelin/css/syntax.css - + docs/_site/** docs/Gemfile.lock diff --git a/zeppelin-web/pom.xml b/zeppelin-web/pom.xml index b4c7defa77c..6b278af71b7 100644 --- a/zeppelin-web/pom.xml +++ b/zeppelin-web/pom.xml @@ -79,7 +79,6 @@ bower.json package.json *.md - reports/** diff --git a/zeppelin-web/test/karma.conf.js b/zeppelin-web/test/karma.conf.js index 409c3a72da6..b4813f08cb0 100644 --- a/zeppelin-web/test/karma.conf.js +++ b/zeppelin-web/test/karma.conf.js @@ -81,7 +81,7 @@ module.exports = function(config) { 'PhantomJS' ], - reporters: 'coverage', + reporters: ['coverage','progress'], preprocessors: { 'src/*/{*.js,!(test)/**/*.js}': 'coverage' @@ -89,7 +89,8 @@ module.exports = function(config) { coverageReporter: { type: 'html', - dir: 'reports/coverage' + dir: '../reports/zeppelin-web-coverage', + subdir: '.' }, // Which plugins to enable From 18e59916250ad92b9086a234578271d392c10939 Mon Sep 17 00:00:00 2001 From: Felix Cheung Date: Tue, 17 Nov 2015 18:31:29 -0800 Subject: [PATCH 047/491] [ZEPPELIN-436] Broken link to Spark in Dynamic Form doc fix broken link Author: Felix Cheung Closes #444 from felixcheung/zcbrokenlink and squashes the following commits: 9b7c667 [Felix Cheung] fix broken link --- docs/manual/dynamicform.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/manual/dynamicform.md b/docs/manual/dynamicform.md index 06074fdaca8..36cadef149b 100644 --- a/docs/manual/dynamicform.md +++ b/docs/manual/dynamicform.md @@ -61,7 +61,7 @@ Also you can separate option's display name and value, using _${formName=default
    ### Creates Programmatically -Some language backend uses programmatic way to create form. For example [ZeppelinContext](./interpreter/spark.html#zeppelincontext) provides form creation API +Some language backend uses programmatic way to create form. For example [ZeppelinContext](../interpreter/spark.html#zeppelincontext) provides form creation API Here're some examples. From 80edf58adcff163356c435f192b0389f165591b1 Mon Sep 17 00:00:00 2001 From: Till Rohrmann Date: Tue, 17 Nov 2015 14:48:17 +0100 Subject: [PATCH 048/491] [ZEPPELIN-433] Bump Flink version to 0.10 Bumps the Flink version to the latest released version 0.10. The new version contains many bug fixes which make the runtime more stable. Author: Till Rohrmann Closes #442 from tillrohrmann/flink-0.10 and squashes the following commits: 4f00305 [Till Rohrmann] [ZEPPELIN-433] Bump Flink version to 0.10 --- flink/pom.xml | 2 +- .../org/apache/zeppelin/flink/FlinkInterpreter.java | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/flink/pom.xml b/flink/pom.xml index 27d8034f583..3a8c36c4f87 100644 --- a/flink/pom.xml +++ b/flink/pom.xml @@ -35,7 +35,7 @@ http://zeppelin.incubator.apache.org - 0.9.0 + 0.10.0 2.3.7 2.10 2.10.4 diff --git a/flink/src/main/java/org/apache/zeppelin/flink/FlinkInterpreter.java b/flink/src/main/java/org/apache/zeppelin/flink/FlinkInterpreter.java index b106c7d4181..8a022bd552a 100644 --- a/flink/src/main/java/org/apache/zeppelin/flink/FlinkInterpreter.java +++ b/flink/src/main/java/org/apache/zeppelin/flink/FlinkInterpreter.java @@ -20,8 +20,6 @@ import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.IOException; -import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.net.URL; @@ -31,7 +29,6 @@ import java.util.Map; import java.util.Properties; -import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.scala.FlinkILoop; import org.apache.flink.configuration.Configuration; import org.apache.flink.runtime.minicluster.LocalFlinkMiniCluster; @@ -46,7 +43,6 @@ import scala.Console; import scala.None; -import scala.Option; import scala.Some; import scala.runtime.AbstractFunction0; import scala.tools.nsc.Settings; @@ -137,7 +133,7 @@ private String getHost() { private int getPort() { if (localMode()) { - return localFlinkCluster.getJobManagerRPCPort(); + return localFlinkCluster.getLeaderRPCPort(); } else { return Integer.parseInt(getProperty("port")); } @@ -332,7 +328,12 @@ public List completion(String buf, int cursor) { private void startFlinkMiniCluster() { localFlinkCluster = new LocalFlinkMiniCluster(flinkConf, false); - localFlinkCluster.waitForTaskManagersToBeRegistered(); + + try { + localFlinkCluster.start(true); + } catch (Exception e){ + throw new RuntimeException("Could not start Flink mini cluster.", e); + } } private void stopFlinkMiniCluster() { From c7cf115dd1945ea03fc0359c0f69b40d81dd4870 Mon Sep 17 00:00:00 2001 From: Prabhjyot Singh Date: Tue, 17 Nov 2015 10:59:20 +0530 Subject: [PATCH 049/491] ZEPPELIN-293 notebook execution results leaking to dashboard page Original PR https://github.com/apache/incubator-zeppelin/pull/293 When we run a paragraph, and without it completing we navigate to dashboard page; upon execution the results are displayed on the dashboard. ![leaking result](https://cloud.githubusercontent.com/assets/674497/9783325/15990682-57c1-11e5-82c4-da020f859e0a.png) Author: Prabhjyot Singh Closes #441 from prabhjyotsingh/ZEPPELIN-293 and squashes the following commits: 996ee80 [Prabhjyot Singh] notebook results leaking to dashboard page --- .../src/main/java/org/apache/zeppelin/socket/NotebookServer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java index e987461d877..654d782c6d5 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java @@ -359,6 +359,7 @@ private void sendHomeNote(NotebookSocket conn, Notebook notebook) throws IOExcep conn.send(serializeMessage(new Message(OP.NOTE).put("note", note))); sendAllAngularObjects(note, conn); } else { + removeConnectionFromAllNote(conn); conn.send(serializeMessage(new Message(OP.NOTE).put("note", null))); } } From 0c50712e3ea4bac0bd9daaa10a53351c35b3a4a0 Mon Sep 17 00:00:00 2001 From: Damien CORNEAU Date: Tue, 17 Nov 2015 13:00:12 +0900 Subject: [PATCH 050/491] ZEPPELIN-426 - Allowing new paragraph under the last one Adding a paragraph under the last one of the notebook was not allowed. I tested a lot of different cases: * While running the full note * With or Without content in the last paragraph * with or Without saved content in the last paragraph And didn't find any issue to allow that feature on that last paragraph Author: Damien CORNEAU Closes #440 from corneadoug/fix/ZEPPELIN-426 and squashes the following commits: 2e168c4 [Damien CORNEAU] Remove jshint global 8bf82a5 [Damien CORNEAU] Remove alert on insert paragraph from last one --- zeppelin-web/.jshintrc | 8 +++++++- .../src/app/interpreter/interpreter.controller.js | 7 +++---- zeppelin-web/src/app/notebook/notebook.controller.js | 5 ----- .../src/app/notebook/paragraph/paragraph.controller.js | 3 +-- zeppelin-web/src/components/navbar/navbar.controller.js | 5 ++--- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/zeppelin-web/.jshintrc b/zeppelin-web/.jshintrc index bb2795019e8..06f72ccd360 100644 --- a/zeppelin-web/.jshintrc +++ b/zeppelin-web/.jshintrc @@ -25,6 +25,12 @@ "angular": false, "_": false, "jQuery": false, - "hljs": false + "hljs": false, + "confirm": false, + "alert": false, + "nv": false, + "$": false, + "ace": false, + "d3": false } } diff --git a/zeppelin-web/src/app/interpreter/interpreter.controller.js b/zeppelin-web/src/app/interpreter/interpreter.controller.js index e531181cf5c..c36311543d6 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.controller.js +++ b/zeppelin-web/src/app/interpreter/interpreter.controller.js @@ -1,4 +1,3 @@ -/* global confirm:false, alert:false, _:false */ /* jshint loopfunc: true */ /* * Licensed under the Apache License, Version 2.0 (the "License"); @@ -105,7 +104,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope, $scope.newInterpreterGroupChange = function() { var el = _.pluck(_.filter($scope.availableInterpreters, { 'group': $scope.newInterpreterSetting.group }), 'properties'); - + var properties = {}; for (var i=0; i < el.length; i++) { var intpInfo = el[i]; @@ -116,7 +115,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope, }; } } - + $scope.newInterpreterSetting.properties = properties; }; @@ -189,7 +188,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope, if (!$scope.newInterpreterSetting.propertyKey || $scope.newInterpreterSetting.propertyKey === '') { return; } - + $scope.newInterpreterSetting.properties[$scope.newInterpreterSetting.propertyKey] = { value: $scope.newInterpreterSetting.propertyValue }; diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index 848d66d857b..74bc4f4d597 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -1,4 +1,3 @@ -/* global confirm:false, alert:false */ /* jshint loopfunc: true */ /* * Licensed under the Apache License, Version 2.0 (the "License"); @@ -298,10 +297,6 @@ angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $ro } } - if (newIndex === $scope.note.paragraphs.length) { - alert('Cannot insert after the last paragraph.'); - return; - } if (newIndex < 0 || newIndex > $scope.note.paragraphs.length) { return; } diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index 57c432df2f2..2fea151cf75 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -1,4 +1,3 @@ -/* global $:false, jQuery:false, ace:false, confirm:false, d3:false, nv:false*/ /*jshint loopfunc: true, unused:false */ /* * Licensed under the Apache License, Version 2.0 (the "License"); @@ -649,7 +648,7 @@ angular.module('zeppelinWebApp') var lineHeight = $scope.editor.renderer.lineHeight; var headerHeight = 103; // menubar, notebook titlebar var scrollTriggerEdgeMargin = 50; - + var documentHeight = angular.element(document).height(); var windowHeight = angular.element(window).height(); // actual viewport height diff --git a/zeppelin-web/src/components/navbar/navbar.controller.js b/zeppelin-web/src/components/navbar/navbar.controller.js index 620e075bed8..3294164ce74 100644 --- a/zeppelin-web/src/components/navbar/navbar.controller.js +++ b/zeppelin-web/src/components/navbar/navbar.controller.js @@ -1,4 +1,3 @@ -/* global $:false */ /* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,9 +22,9 @@ angular.module('zeppelinWebApp').controller('NavCtrl', function($scope, $rootSco vm.connected = websocketMsgSrv.isConnected(); vm.websocketMsgSrv = websocketMsgSrv; vm.arrayOrderingSrv = arrayOrderingSrv; - + $('#notebook-list').perfectScrollbar({suppressScrollX: true}); - + $scope.$on('setNoteMenu', function(event, notes) { notebookListDataFactory.setNotes(notes); }); From c7633afdb09ed43984f7c9842b736bb4744708db Mon Sep 17 00:00:00 2001 From: Felix Cheung Date: Tue, 17 Nov 2015 23:46:10 -0800 Subject: [PATCH 051/491] [ZEPPELIN-428] Support Python programmatic access to dynamic form https://issues.apache.org/jira/browse/ZEPPELIN-428 This is what it looks like: ![image](https://cloud.githubusercontent.com/assets/8969467/11176543/f5a5f8a6-8bf2-11e5-9f26-ba0d7a9148af.png) ![image](https://cloud.githubusercontent.com/assets/8969467/11176547/f8d554a4-8bf2-11e5-8ced-c03eaa84f504.png) Author: Felix Cheung Closes #437 from felixcheung/pyz and squashes the following commits: 8a7045e [Felix Cheung] add doc for python dynamic form de00d17 [Felix Cheung] fix type conversion 816319c [Felix Cheung] pyspark new methods --- docs/manual/dynamicform.md | 48 +++++++++++++++++++ .../main/resources/python/zeppelin_pyspark.py | 16 +++++++ 2 files changed, 64 insertions(+) diff --git a/docs/manual/dynamicform.md b/docs/manual/dynamicform.md index 36cadef149b..dc46a5e24e3 100644 --- a/docs/manual/dynamicform.md +++ b/docs/manual/dynamicform.md @@ -67,12 +67,60 @@ Here're some examples. Text input form +You can do this in Scala +```scala +%spark +println("Hello "+z.input("name")) +``` + +Or Python +```python +%pyspark +print("Hello "+z.input("name")) +``` + Text input form with default value +Scala +```scala +%spark +println("Hello "+z.input("name", "sun")) +``` + +Python +```python +%pyspark +print("Hello "+z.input("name", "sun")) +``` + Select form +Scala +```scala +%spark +println("Hello "+z.select("day", Seq(("1","mon"), + ("2","tue"), + ("3","wed"), + ("4","thurs"), + ("5","fri"), + ("6","sat"), + ("7","sun")))) +``` + +Python +```python +%pyspark +print("Hello "+z.select("day", [("1","mon"), + ("2","tue"), + ("3","wed"), + ("4","thurs"), + ("5","fri"), + ("6","sat"), + ("7","sun")])) +``` + diff --git a/spark/src/main/resources/python/zeppelin_pyspark.py b/spark/src/main/resources/python/zeppelin_pyspark.py index e57190e65a2..b8daa3d4c33 100644 --- a/spark/src/main/resources/python/zeppelin_pyspark.py +++ b/spark/src/main/resources/python/zeppelin_pyspark.py @@ -78,6 +78,22 @@ def put(self, key, value): def get(self, key): return self.__getitem__(key) + def input(self, name, defaultValue = ""): + return self.z.input(name, defaultValue) + + def select(self, name, options, defaultValue = ""): + # auto_convert to ArrayList doesn't match the method signature on JVM side + tuples = map(lambda items: self.__tupleToScalaTuple2(items), options) + iterables = gateway.jvm.scala.collection.JavaConversions.collectionAsScalaIterable(tuples) + return self.z.select(name, defaultValue, iterables) + + def __tupleToScalaTuple2(self, tuple): + if (len(tuple) == 2): + return gateway.jvm.scala.Tuple2(tuple[0], tuple[1]) + else: + raise IndexError("options must be a list of tuple of 2") + + class SparkVersion(object): SPARK_1_4_0 = 140 SPARK_1_3_0 = 130 From ea995b116bc3b4dacbe1ccb9dd09641d9611dacb Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Wed, 18 Nov 2015 23:38:17 +0900 Subject: [PATCH 052/491] ZEPPELIN-437 Improvement Autoscroll https://issues.apache.org/jira/browse/ZEPPELIN-437 This PR changes * Autoscroll to cursor on paragraph status change, only when cursor is on the last paragraph (to tail the notebook) * When tail the notebook, waits for sometime to output is rendered and then fire autoscroll event. Author: Lee moon soo Closes #445 from Leemoonsoo/ZEPPELIN-437 and squashes the following commits: 3d94d9e [Lee moon soo] single quote 1641de1 [Lee moon soo] $ to angular.element 03943f1 [Lee moon soo] More strict rule to trigger autoscroll after paragraph status change aa1f18d [Lee moon soo] Force top position 0 when key input after focus change by key up/down 453e084 [Lee moon soo] Autoscroll on Paragraph status change, only when cursor is on the last paragraph --- .../notebook/paragraph/paragraph.controller.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index 2fea151cf75..d32375751bd 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -227,7 +227,13 @@ angular.module('zeppelinWebApp') if (statusChanged || resultRefreshed) { // when last paragraph runs, zeppelin automatically appends new paragraph. // this broadcast will focus to the newly inserted paragraph - $rootScope.$broadcast('scrollToCursor'); + var paragraphs = angular.element('div[id$="_paragraphColumn_main"'); + if (paragraphs.length >= 2 && paragraphs[paragraphs.length-2].id.startsWith($scope.paragraph.id)) { + // rendering output can took some time. So delay scrolling event firing for sometime. + setTimeout(function() { + $rootScope.$broadcast('scrollToCursor'); + }, 500); + } } } @@ -595,6 +601,9 @@ angular.module('zeppelinWebApp') $scope.editor.keyBinding.onCommandKey = function(e, hashId, keyCode) { if ($scope.editor.completer && $scope.editor.completer.activated) { // if autocompleter is active } else { + // fix ace editor focus issue in chrome (textarea element goes to top: -1000px after focused by cursor move) + angular.element('#' + $scope.paragraph.id + '_editor > textarea').css('top', 0); + var numRows; var currentRow; @@ -632,7 +641,11 @@ angular.module('zeppelinWebApp') }; $rootScope.$on('scrollToCursor', function(event) { - $scope.scrollToCursor($scope.paragraph.id, 0); + // scroll on 'scrollToCursor' event only when cursor is in the last paragraph + var paragraphs = angular.element('div[id$="_paragraphColumn_main"'); + if (paragraphs[paragraphs.length-1].id.startsWith($scope.paragraph.id)) { + $scope.scrollToCursor($scope.paragraph.id, 0); + } }); /** scrollToCursor if it is necessary @@ -732,7 +745,6 @@ angular.module('zeppelinWebApp') row = $scope.editor.session.getLength() - 1; $scope.editor.gotoLine(row + 1, 0); } - $scope.scrollToCursor($scope.paragraph.id, 0); } }); From 98758d1cc56f25747cfd7a1e0c3266e00e956339 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Sun, 15 Nov 2015 15:59:55 +0900 Subject: [PATCH 053/491] ZEPPELIN-423 Exclude DEPENDENCIES from rat plugin https://issues.apache.org/jira/browse/ZEPPELIN-423 Exclude DEPENDENCIES from rat plugin. Author: Lee moon soo Closes #434 from Leemoonsoo/ZEPPELIN-423 and squashes the following commits: 9c9f8e1 [Lee moon soo] Exclude DEPENDENCIES from rat plugin --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 696f26f92a4..47206107c46 100755 --- a/pom.xml +++ b/pom.xml @@ -451,6 +451,7 @@ **/notebook/** _tools/site/css/* **/README.md + DEPENDENCIES DEPLOY.md CONTRIBUTING.md STYLE.md From e4ff4c03536999d824c2f3b60859c156dc592a85 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Fri, 20 Nov 2015 17:37:23 +0900 Subject: [PATCH 054/491] ZEPPELIN-448 Update documentation for Spark configuration and BASE_PATH change https://issues.apache.org/jira/browse/ZEPPELIN-448 Addresses update documentation for Spark configuration. And BASE_PATH change after #430, #431 is deployed. (currently deployed website has this change applied) Author: Lee moon soo Closes #448 from Leemoonsoo/update_install and squashes the following commits: 54e2edf [Lee moon soo] add newline cbd95d6 [Lee moon soo] Add description for included version of spark when SPARK_HOME is not set 00099ad [Lee moon soo] Add description for bumping up version cf99212 [Lee moon soo] Fix typo ab6d267 [Lee moon soo] Update BASE_PATH 73a737c [Lee moon soo] Remove instruction for 0.5.0 as zeppelin has documentation per version 4369f3e [Lee moon soo] Fix link dcdaa74 [Lee moon soo] Add more configurations possible 8c9361d [Lee moon soo] Change font style de74e6b [Lee moon soo] Update install and configuring spark --- docs/README.md | 11 +- docs/_config.yml | 2 +- .../development/writingzeppelininterpreter.md | 2 +- docs/displaysystem/angular.md | 8 +- docs/displaysystem/display.md | 6 +- docs/displaysystem/table.md | 6 +- docs/docs.md | 8 +- docs/index.md | 19 +- docs/install/install.md | 178 +++++++++++++----- docs/interpreter/cassandra.md | 18 +- docs/interpreter/ignite.md | 10 +- docs/interpreter/lens.md | 10 +- docs/interpreter/spark.md | 60 ++++-- docs/manual/dynamicform.md | 14 +- docs/manual/interpreters.md | 6 +- docs/manual/notebookashomepage.md | 4 +- 16 files changed, 242 insertions(+), 120 deletions(-) diff --git a/docs/README.md b/docs/README.md index 100aacf5062..82a752ffae4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,7 +3,7 @@ This readme will walk you through building the Zeppelin documentation, which is included here with the Zeppelin source code. -## Build website +## Build documentation See https://help.github.com/articles/using-jekyll-with-pages#installing-jekyll **tl;dr version:** @@ -36,3 +36,12 @@ See https://help.github.com/articles/using-jekyll-with-pages#installing-jekyll ## Adding a new page rake page name="new-page.md" + + + +## Bumping up version + + * `BASE_PATH` property in _config.yml + * `ZEPPELIN ([VERSION])` in _includes/themes/zeppelin/_navigation.html + +need to be updated diff --git a/docs/_config.yml b/docs/_config.yml index ee0e727a4b2..bdba7a05fce 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -55,7 +55,7 @@ JB : # - Only the following values are falsy: ["", null, false] # - When setting BASE_PATH it must be a valid url. # This means always setting the protocol (http|https) or prefixing with "/" - BASE_PATH : false + BASE_PATH : /docs/0.6.0-incubating-SNAPSHOT # By default, the asset_path is automatically defined relative to BASE_PATH plus the enabled theme. # ex: [BASE_PATH]/assets/themes/[THEME-NAME] diff --git a/docs/development/writingzeppelininterpreter.md b/docs/development/writingzeppelininterpreter.md index 4bb69b4a065..f64f09246a2 100644 --- a/docs/development/writingzeppelininterpreter.md +++ b/docs/development/writingzeppelininterpreter.md @@ -25,7 +25,7 @@ Zeppelin Interpreter is a language backend. For example to use scala code in Zep Every Interpreter belongs to an InterpreterGroup. InterpreterGroup is a unit of start/stop interpreter. Interpreters in the same InterpreterGroup can reference each other. For example, SparkSqlInterpreter can reference SparkInterpreter to get SparkContext from it while they're in the same group. - + All Interpreters in the same interpreter group are launched in a single, separate JVM process. The Interpreter communicates with Zeppelin engine via thrift. diff --git a/docs/displaysystem/angular.md b/docs/displaysystem/angular.md index 32e8253f342..c8a0ddc1542 100644 --- a/docs/displaysystem/angular.md +++ b/docs/displaysystem/angular.md @@ -32,7 +32,7 @@ Therefore, you can not only update scope variable from your interpreter but also #### Print AngularJS view To use angular display system, your output should starts with "%angular". - + Note that display system is backend independent. @@ -62,7 +62,7 @@ z.angularUnbindGlobal(String name) In the example, let's bind "world" variable 'name'. Then you can see AngularJs view are updated immediately. - +
    @@ -91,8 +91,8 @@ z.angularUnwatchGlobal(String name) Let's make an button, that increment 'run' variable by 1 when it is clicked. z.angularBind("run", 0) will initialize 'run' to zero. And then register watcher of 'run'. - + After clicked button, you'll see both 'run' and numWatched are increased by 1 - + diff --git a/docs/displaysystem/display.md b/docs/displaysystem/display.md index 132e356c448..63cc1a7308f 100644 --- a/docs/displaysystem/display.md +++ b/docs/displaysystem/display.md @@ -27,11 +27,11 @@ limitations under the License. Zeppelin prints output of language backend in text, by default. - + You can explicitly say you're using text display system. - + Note that display system is backend independent. @@ -42,4 +42,4 @@ Note that display system is backend independent. With '%html' directive, Zeppelin treats your output as html - + diff --git a/docs/displaysystem/table.md b/docs/displaysystem/table.md index b1fe2af4ac5..085c8571f5a 100644 --- a/docs/displaysystem/table.md +++ b/docs/displaysystem/table.md @@ -24,14 +24,14 @@ limitations under the License. If you have data that row seprated by '\n' (newline) and column separated by '\t' (tab) with first row as header row, for example - + You can simply use %table display system to leverage Zeppelin's built in visualization. - + Note that display system is backend independent. If table contents start with %html, it is interpreted as an HTML. - + diff --git a/docs/docs.md b/docs/docs.md index 9678641b8e1..28ee73a09d2 100644 --- a/docs/docs.md +++ b/docs/docs.md @@ -35,14 +35,14 @@ limitations under the License. * [cassandra](./interpreter/cassandra.html) * [flink](./interpreter/flink.html) * [geode](./interpreter/geode.html) -* [hive](../pleasecontribute.html) +* [hive](./pleasecontribute.html) * [ignite](./interpreter/ignite.html) * [lens](./interpreter/lens.html) -* [md](../pleasecontribute.html) +* [md](./pleasecontribute.html) * [postgresql, hawq](./interpreter/postgresql.html) -* [sh](../pleasecontribute.html) +* [sh](./pleasecontribute.html) * [spark](./interpreter/spark.html) -* [tajo](../pleasecontribute.html) +* [tajo](./pleasecontribute.html) ### Storage * [S3 Storage](./storage/storage.html) diff --git a/docs/index.md b/docs/index.md index 4343c648b1f..6919c5dcee5 100644 --- a/docs/index.md +++ b/docs/index.md @@ -34,7 +34,7 @@ limitations under the License. -
    +
    @@ -44,17 +44,16 @@ limitations under the License. Zeppelin interpreter concept allows any language/data-processing-backend to be plugged into Zeppelin. Currently Zeppelin supports many interpreters such as Scala(with Apache Spark), Python(with Apache Spark), SparkSQL, Hive, Markdown and Shell. - + Adding new language-backend is really simple. Learn [how to write a zeppelin interpreter](./development/writingzeppelininterpreter.html). -
    ### Apache Spark integration Zeppelin provides built-in Apache Spark integration. You don't need to build a separate module, plugin or library for it. - + Zeppelin's Spark integration provides @@ -69,10 +68,10 @@ Some basic charts are already included in Zeppelin. Visualizations are not limit
    - +
    - +
    @@ -82,7 +81,7 @@ With simple drag and drop Zeppelin aggeregates the values and display them in pi
    - +
    Learn more about Zeppelin's Display system. ( [text](./displaysystem/display.html), [html](./displaysystem/display.html#html), [table](./displaysystem/table.html), [angular](./displaysystem/angular.html) ) @@ -93,7 +92,7 @@ Learn more about Zeppelin's Display system. ( [text](./displaysystem/display.htm Zeppelin can dynamically create some input forms into your notebook. - + Learn more about [Dynamic Forms](./manual/dynamicform.html). @@ -103,7 +102,7 @@ Learn more about [Dynamic Forms](./manual/dynamicform.html). Notebook URL can be shared among collaborators. Zeppelin can then broadcast any changes in realtime, just like the collaboration in Google docs. - +
    ### Publish @@ -112,7 +111,7 @@ Notebook URL can be shared among collaborators. Zeppelin can then broadcast any This way, you can easily embed it as an iframe inside of your website.

    - +

    diff --git a/docs/install/install.md b/docs/install/install.md index a4b3336b6b9..e1dc5d1af1b 100644 --- a/docs/install/install.md +++ b/docs/install/install.md @@ -21,46 +21,14 @@ limitations under the License. -## Build +## From binary package -#### Prerequisites + Download latest binary package from [Download](../download.html). - * Java 1.7 - * None root account - * Apache Maven -Build tested on OSX, CentOS 6. - -Checkout source code from [https://github.com/apache/incubator-zeppelin](https://github.com/apache/incubator-zeppelin) - -#### Local mode - -``` -mvn install -DskipTests -``` - -#### Cluster mode - -``` -mvn install -DskipTests -Dspark.version=1.1.0 -Dhadoop.version=2.2.0 -``` - -Change spark.version and hadoop.version to your cluster's one. - -#### Custom built Spark - -Note that is you uses custom build spark, you need build Zeppelin with custome built spark artifact. To do that, deploy spark artifact to local maven repository using - -``` -sbt/sbt publish-local -``` - -and then build Zeppelin with your custom built Spark - -``` -mvn install -DskipTests -Dspark.version=1.1.0-Custom -Dhadoop.version=2.2.0 -``` +## Build from source + Check instructions in [README](https://github.com/apache/incubator-zeppelin/blob/master/README.md) to build from source. @@ -80,19 +48,135 @@ Configuration can be done by both environment variable(conf/zeppelin-env.sh) and ZEPPELIN_PORT zeppelin.server.port 8080 - Zeppelin server port. Note that port+1 is used for web socket + Zeppelin server port. + + + ZEPPELIN_MEM + N/A + -Xmx1024m -XX:MaxPermSize=512m + JVM mem options + + + ZEPPELIN_INTP_MEM + N/A + ZEPPELIN_MEM + JVM mem options for interpreter process + + + ZEPPELIN_JAVA_OPTS + N/A + + JVM Options + + + ZEPPELIN_ALLOWED_ORIGINS + zeppelin.server.allowed.origins + * + Allows a way to specify a ',' separated list of allowed origins for rest and websockets. i.e. http://localhost:8080 + + + ZEPPELIN_SSL + zeppelin.ssl + false + + + + ZEPPELIN_SSL_CLIENT_AUTH + zeppelin.ssl.client.auth + false + + + + ZEPPELIN_SSL_KEYSTORE_PATH + zeppelin.ssl.keystore.path + keystore + + + + ZEPPELIN_SSL_KEYSTORE_TYPE + zeppelin.ssl.keystore.type + JKS + + + + ZEPPELIN_SSL_KEYSTORE_PASSWORD + zeppelin.ssl.keystore.password + + + + + ZEPPELIN_SSL_KEY_MANAGER_PASSWORD + zeppelin.ssl.key.manager.password + + + + + ZEPPELIN_SSL_TRUSTSTORE_PATH + zeppelin.ssl.truststore.path + + + + + ZEPPELIN_SSL_TRUSTSTORE_TYPE + zeppelin.ssl.truststore.type + + + + + ZEPPELIN_SSL_TRUSTSTORE_PASSWORD + zeppelin.ssl.truststore.password + + + + + ZEPPELIN_NOTEBOOK_HOMESCREEN + zeppelin.notebook.homescreen + + Id of notebook to be displayed in homescreen ex) 2A94M5J1Z + + ZEPPELIN_NOTEBOOK_HOMESCREEN_HIDE + zeppelin.notebook.homescreen.hide + false + hide homescreen notebook from list when this value set to "true" + ZEPPELIN_NOTEBOOK_DIR zeppelin.notebook.dir notebook Where notebook file is saved + + ZEPPELIN_NOTEBOOK_S3_BUCKET + zeppelin.notebook.s3.bucket + zeppelin + Bucket where notebook saved + + + ZEPPELIN_NOTEBOOK_S3_USER + zeppelin.notebook.s3.user + user + User in bucket where notebook saved. For example bucket/user/notebook/2A94M5J1Z/note.json + + + ZEPPELIN_NOTEBOOK_STORAGE + zeppelin.notebook.storage + org.apache.zeppelin.notebook.repo.VFSNotebookRepo + Comma separated list of notebook storage + + + ZEPPELIN_NOTEBOOK_RELOAD_FROM_STORAGE + zeppelin.notebook.reloadAllNotesFromStorage + false + Notebook list and contents will be always loaded from repository if set true. If set false, modified notebooks or new notebooks added on file system level won't be reflected on Zeppelin till user restarts Zeppelin. + ZEPPELIN_INTERPRETERS zeppelin.interpreters - org.apache.zeppelin.spark.SparkInterpreter,
    org.apache.zeppelin.spark.PySparkInterpreter,
    org.apache.zeppelin.spark.SparkSqlInterpreter,
    org.apache.zeppelin.spark.DepInterpreter,
    org.apache.zeppelin.markdown.Markdown,
    org.apache.zeppelin.shell.ShellInterpreter,
    org.apache.zeppelin.hive.HiveInterpreter + org.apache.zeppelin.spark.SparkInterpreter,
    org.apache.zeppelin.spark.PySparkInterpreter,
    org.apache.zeppelin.spark.SparkSqlInterpreter,
    org.apache.zeppelin.spark.DepInterpreter,
    org.apache.zeppelin.markdown.Markdown,
    org.apache.zeppelin.shell.ShellInterpreter,
    org.apache.zeppelin.hive.HiveInterpreter
    + ... + Comma separated interpreter configurations [Class]. First interpreter become a default @@ -101,19 +185,14 @@ Configuration can be done by both environment variable(conf/zeppelin-env.sh) and interpreter Zeppelin interpreter directory - - MASTER - - N/A - Spark master url. eg. spark://master_addr:7077. Leave empty if you want to use local mode - - - ZEPPELIN_JAVA_OPTS - - N/A - JVM Options +
    +You'll also need to configure individual interpreter. Information can be found in 'Interpreter' section in this documentation. + +For example [Spark](../interpreter/spark.html). + +
    ## Start/Stop #### Start Zeppelin @@ -121,7 +200,6 @@ Configuration can be done by both environment variable(conf/zeppelin-env.sh) and bin/zeppelin-daemon.sh start ``` After successful start, visit http://localhost:8080 with your web browser. -Note that port **8081** also need to be accessible for websocket connection. #### Stop Zeppelin diff --git a/docs/interpreter/cassandra.md b/docs/interpreter/cassandra.md index b53295c1468..eded545e52d 100644 --- a/docs/interpreter/cassandra.md +++ b/docs/interpreter/cassandra.md @@ -30,9 +30,9 @@ group: manual In a notebook, to enable the **Cassandra** interpreter, click on the **Gear** icon and select **Cassandra**
    - ![Interpreter Binding](/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterBinding.png) - - ![Interpreter Selection](/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterSelection.png) + ![Interpreter Binding](../assets/themes/zeppelin/img/docs-img/cassandra-InterpreterBinding.png) + + ![Interpreter Selection](../assets/themes/zeppelin/img/docs-img/cassandra-InterpreterSelection.png)

    @@ -44,7 +44,7 @@ group: manual To access the interactive help, type **HELP;**
    - ![Interactive Help](/assets/themes/zeppelin/img/docs-img/cassandra-InteractiveHelp.png) + ![Interactive Help](../assets/themes/zeppelin/img/docs-img/cassandra-InteractiveHelp.png)

    @@ -283,7 +283,7 @@ There is a drop-down menu on the top left corner to expand objects details. On t
    - ![Describe Schema](/assets/themes/zeppelin/img/docs-img/cassandra-DescribeSchema.png) + ![Describe Schema](../assets/themes/zeppelin/img/docs-img/cassandra-DescribeSchema.png)

    @@ -551,7 +551,7 @@ For this, first go to the **Interpreter** menu and click on the **Create** butto

    - ![Create Interpreter](/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInstance.png) + ![Create Interpreter](../assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInstance.png)
    In the interpreter creation form, put **cass-instance2** as **Name** and select the **cassandra** @@ -559,7 +559,7 @@ in the interpreter drop-down list

    - ![Interpreter Name](/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterName.png) + ![Interpreter Name](../assets/themes/zeppelin/img/docs-img/cassandra-InterpreterName.png)
    Click on **Save** to create the new interpreter instance. Now you should be able to see it in the interpreter list. @@ -567,7 +567,7 @@ in the interpreter drop-down list

    - ![Interpreter In List](/assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInList.png) + ![Interpreter In List](../assets/themes/zeppelin/img/docs-img/cassandra-NewInterpreterInList.png)
    Go back to your notebook and click on the **Gear** icon to configure interpreter bindings. @@ -577,7 +577,7 @@ interpreter list instead of the standard **cassandra** instance.

    - ![Interpreter Instance Selection](/assets/themes/zeppelin/img/docs-img/cassandra-InterpreterInstanceSelection.png) + ![Interpreter Instance Selection](../assets/themes/zeppelin/img/docs-img/cassandra-InterpreterInstanceSelection.png)

    diff --git a/docs/interpreter/ignite.md b/docs/interpreter/ignite.md index 02fc5875eda..963c7d96990 100644 --- a/docs/interpreter/ignite.md +++ b/docs/interpreter/ignite.md @@ -11,7 +11,7 @@ group: manual ### Overview [Apache Ignite](https://ignite.apache.org/) In-Memory Data Fabric is a high-performance, integrated and distributed in-memory platform for computing and transacting on large-scale data sets in real-time, orders of magnitude faster than possible with traditional disk-based or flash technologies. -![Apache Ignite](/assets/themes/zeppelin/img/docs-img/ignite-logo.png) +![Apache Ignite](../assets/themes/zeppelin/img/docs-img/ignite-logo.png) You can use Zeppelin to retrieve distributed data from cache using Ignite SQL interpreter. Moreover, Ignite interpreter allows you to execute any Scala code in cases when SQL doesn't fit to your requirements. For example, you can populate data into your caches or execute distributed computations. @@ -68,12 +68,12 @@ At the "Interpreters" menu, you may edit Ignite interpreter or create new one. Z -![Configuration of Ignite Interpreter](/assets/themes/zeppelin/img/docs-img/ignite-interpreter-setting.png) +![Configuration of Ignite Interpreter](../assets/themes/zeppelin/img/docs-img/ignite-interpreter-setting.png) ### Interpreter Binding for Zeppelin Notebook After configuring Ignite interpreter, create your own notebook. Then you can bind interpreters like below image. -![Binding Interpreters](/assets/themes/zeppelin/img/docs-img/ignite-interpreter-binding.png) +![Binding Interpreters](../assets/themes/zeppelin/img/docs-img/ignite-interpreter-binding.png) For more interpreter binding information see [here](http://zeppelin.incubator.apache.org/docs/manual/interpreters.html). @@ -87,7 +87,7 @@ For example, you can select top 10 words in the words cache using the following select _val, count(_val) as cnt from String group by _val order by cnt desc limit 10 ``` - ![IgniteSql on Zeppelin](/assets/themes/zeppelin/img/docs-img/ignite-sql-example.png) + ![IgniteSql on Zeppelin](../assets/themes/zeppelin/img/docs-img/ignite-sql-example.png) As long as your Ignite version and Zeppelin Ignite version is same, you can also use scala code. Please check the Zeppelin Ignite version before you download your own Ignite. @@ -109,7 +109,7 @@ As long as your Ignite version and Zeppelin Ignite version is same, you can also collectionAsScalaIterable(res).foreach(println _) ``` - ![Using Scala Code](/assets/themes/zeppelin/img/docs-img/ignite-scala-example.png) + ![Using Scala Code](../assets/themes/zeppelin/img/docs-img/ignite-scala-example.png) Apache Ignite also provides a guide docs for Zeppelin ["Ignite with Apache Zeppelin"](https://apacheignite.readme.io/docs/data-analysis-with-apache-zeppelin) diff --git a/docs/interpreter/lens.md b/docs/interpreter/lens.md index 903df7e2f52..a3eb2848e04 100644 --- a/docs/interpreter/lens.md +++ b/docs/interpreter/lens.md @@ -11,7 +11,7 @@ group: manual ### Overview [Apache Lens](https://lens.apache.org/) provides an Unified Analytics interface. Lens aims to cut the Data Analytics silos by providing a single view of data across multiple tiered data stores and optimal execution environment for the analytical query. It seamlessly integrates Hadoop with traditional data warehouses to appear like one. -![Apache Lens](/assets/themes/zeppelin/img/docs-img/lens-logo.png) +![Apache Lens](../assets/themes/zeppelin/img/docs-img/lens-logo.png) ### Installing and Running Lens In order to use Lens interpreters, you may install Apache Lens in some simple steps: @@ -75,11 +75,11 @@ At the "Interpreters" menu, you can to edit Lens interpreter or create new one. -![Apache Lens Interpreter Setting](/assets/themes/zeppelin/img/docs-img/lens-interpreter-setting.png) +![Apache Lens Interpreter Setting](../assets/themes/zeppelin/img/docs-img/lens-interpreter-setting.png) ### Interpreter Bindging for Zeppelin Notebook After configuring Lens interpreter, create your own notebook, then you can bind interpreters like below image. -![Zeppelin Notebook Interpreter Biding](/assets/themes/zeppelin/img/docs-img/lens-interpreter-binding.png) +![Zeppelin Notebook Interpreter Biding](../assets/themes/zeppelin/img/docs-img/lens-interpreter-binding.png) For more interpreter binding information see [here](http://zeppelin.incubator.apache.org/docs/manual/interpreters.html). @@ -159,14 +159,14 @@ As you can see in this video, they are using Lens Client Shell(./bin/lens-cli.sh ``` - ![Lens Query Result](/assets/themes/zeppelin/img/docs-img/lens-result.png) + ![Lens Query Result](../assets/themes/zeppelin/img/docs-img/lens-result.png) These are just examples that provided in advance by Lens. If you want to explore whole tutorials of Lens, see the [tutorial video](https://cwiki.apache.org/confluence/display/LENS/2015/07/13/20+Minute+video+demo+of+Apache+Lens+through+examples). ### Lens UI Service Lens also provides web UI service. Once the server starts up, you can open the service on http://serverhost:19999/index.html and browse. You may also check the structure that you made and use query easily here. - ![Lens UI Servive](/assets/themes/zeppelin/img/docs-img/lens-ui-service.png) + ![Lens UI Servive](../assets/themes/zeppelin/img/docs-img/lens-ui-service.png) diff --git a/docs/interpreter/spark.md b/docs/interpreter/spark.md index 58fce0b07e7..20be7f8324a 100644 --- a/docs/interpreter/spark.md +++ b/docs/interpreter/spark.md @@ -7,7 +7,7 @@ group: manual {% include JB/setup %} -## Spark +## Spark Interpreter [Apache Spark](http://spark.apache.org) is supported in Zeppelin with Spark Interpreter group, which consisted of 4 interpreters. @@ -41,10 +41,54 @@ Spark Interpreter group, which consisted of 4 interpreters. +

    + +### Configuration +
    + +Without any configuration, Spark interpreter works out of box in local mode. But if you want to connect to your Spark cluster, you'll need following two simple steps. + + +#### 1. export SPARK_HOME + +In **conf/zeppelin-env.sh**, export SPARK_HOME environment variable with your Spark installation path. + +for example + +```bash +export SPARK_HOME=/usr/lib/spark +``` + +You can optionally export HADOOP\_CONF\_DIR and SPARK\_SUBMIT\_OPTIONS + +```bash +export HADOOP_CONF_DIR=/usr/lib/hadoop +export SPARK_SUBMIT_OPTIONS="--packages com.databricks:spark-csv_2.10:1.2.0" +``` + +
    +#### 2. set master in Interpreter menu. +After start Zeppelin, go to **Interpreter** menu and edit **master** property in your Spark interpreter setting. The value may vary depending on your Spark cluster deployment type. +for example, + + * **local[*]** in local mode + * **spark://master:7077** in standalone cluster + * **yarn-client** in Yarn client mode + * **mesos://host:5050** in Mesos cluster + + + +
    +That's it. Zeppelin will work with any version of Spark and any deployment type without rebuild Zeppelin in this way. (Zeppelin 0.5.5-incubating release works up to Spark 1.5.1) + +Note that without exporting SPARK_HOME, it's running in local mode with included version of Spark. The included version may vary depending on the build profile. + +

    ### SparkContext, SQLContext, ZeppelinContext +
    SparkContext, SQLContext, ZeppelinContext are automatically created and exposed as variable names 'sc', 'sqlContext' and 'z', respectively, both in scala and python environments. @@ -55,6 +99,7 @@ Note that scala / python environment shares the same SparkContext, SQLContext, Z

    ### Dependency Management +
    There are two ways to load external library in spark interpreter. First is using Zeppelin's %dep interpreter and second is loading Spark properties. #### 1. Dynamic Dependency Loading via %dep interpreter @@ -141,7 +186,6 @@ Note that adding jar to pyspark is only availabe via %dep interpreter at the mom
    Here are few examples: -##### 0.5.5 and later * SPARK\_SUBMIT\_OPTIONS in conf/zeppelin-env.sh export SPARK_SUBMIT_OPTIONS="--packages com.databricks:spark-csv_2.10:1.2.0 --jars /path/mylib1.jar,/path/mylib2.jar --files /path/mylib1.py,/path/mylib2.zip,/path/mylib3.egg" @@ -152,18 +196,10 @@ Here are few examples: spark.jars.packages com.databricks:spark-csv_2.10:1.2.0 spark.files /path/mylib1.py,/path/mylib2.egg,/path/mylib3.zip -##### 0.5.0 -* ZEPPELIN\_JAVA\_OPTS in conf/zeppelin-env.sh - - export ZEPPELIN_JAVA_OPTS="-Dspark.jars=/path/mylib1.jar,/path/mylib2.jar -Dspark.files=/path/myfile1.dat,/path/myfile2.dat" -
    - - -

    ### ZeppelinContext - +
    Zeppelin automatically injects ZeppelinContext as variable 'z' in your scala/python environment. ZeppelinContext provides some additional functions and utility. @@ -218,4 +254,4 @@ In sql environment, you can create form in simple template. select * from ${table=defaultTableName} where text like '%${search}%' ``` -To learn more about dynamic form, checkout [Dynamic Form](../dynamicform.html). +To learn more about dynamic form, checkout [Dynamic Form](../manual/dynamicform.html). diff --git a/docs/manual/dynamicform.md b/docs/manual/dynamicform.md index dc46a5e24e3..68aa7a1c67b 100644 --- a/docs/manual/dynamicform.md +++ b/docs/manual/dynamicform.md @@ -37,12 +37,12 @@ To create text input form, use _${formName}_ templates. for example - + Also you can provide default value, using _${formName=defaultValue}_. - +
    @@ -52,11 +52,11 @@ To create select form, use _${formName=defaultValue,option1|option2...}_ for example - + Also you can separate option's display name and value, using _${formName=defaultValue,option1(DisplayName)|option2(DisplayName)...}_ - +
    ### Creates Programmatically @@ -79,7 +79,7 @@ Or Python print("Hello "+z.input("name")) ``` - + Text input form with default value @@ -95,7 +95,7 @@ Python print("Hello "+z.input("name", "sun")) ``` - + Select form @@ -123,4 +123,4 @@ print("Hello "+z.select("day", [("1","mon"), ("7","sun")])) ``` - + diff --git a/docs/manual/interpreters.md b/docs/manual/interpreters.md index ff5bff7ddd0..48cd1a35f3d 100644 --- a/docs/manual/interpreters.md +++ b/docs/manual/interpreters.md @@ -32,13 +32,13 @@ Zeppelin Interpreter is the plug-in which enable zeppelin user to use a specific When you click on the ```+Create``` button in the interpreter page the interpreter drop-down list box will present all the available interpreters on your server. - + ### What is zeppelin interpreter setting? Zeppelin interpreter setting is the configuration of a given interpreter on zeppelin server. For example, the properties requried for hive JDBC interpreter to connect to the Hive server. - + ### What is zeppelin interpreter group? Every Interpreter belongs to an InterpreterGroup. InterpreterGroup is a unit of start/stop interpreter. @@ -48,7 +48,7 @@ SparkSQL and the dependency loader. Technically, Zeppelin interpreters from the same group are running in the same JVM. Interpreters belong to a single group a registered together and all of their properties are listed in the interpreter setting. - + ### Programming langages for interpreter diff --git a/docs/manual/notebookashomepage.md b/docs/manual/notebookashomepage.md index 86f1ea90bed..3e436768188 100644 --- a/docs/manual/notebookashomepage.md +++ b/docs/manual/notebookashomepage.md @@ -51,7 +51,7 @@ The process for creating your homepage is very simple as shown below: for example - + Set the notebook id to the ```ZEPPELIN_NOTEBOOK_HOMESCREEN``` environment variable or ```zeppelin.notebook.homescreen``` property. @@ -97,7 +97,7 @@ you need to do is use our %angular support. ``` After running the notebook you will see output similar to this one: - + The main trick here relays in linking the ```
    ``` to the controller: From b554f9a3151e820f41660b5ea0c6d55aa647bf2a Mon Sep 17 00:00:00 2001 From: Eric Charles Date: Thu, 19 Nov 2015 09:45:20 +0100 Subject: [PATCH 055/491] Zeppelin 337 configurable context path (2) Allow to configure the context path of the webapp via zeppelin.server.context.path property or ZEPPELIN_SERVER_CONTEXT_PATH env variable + documentation for this. (replaces #385) Author: Eric Charles This patch had conflicts when merged, resolved by Committer: Lee moon soo Closes #429 from echarles/ZEPPELIN-337-Configurable-ContextPath and squashes the following commits: 37e07f9 [Eric Charles] Ensure context path is also setup when running with the distribution 70194fc [Eric Charles] Set /api path on servlet level, not context to fix test 54f6b07 [Eric Charles] ZEPPELIN_CONTEXT_PATH is now ZEPPELIN_SERVER_CONTEXT_PATH 9095d5d [Eric Charles] Allow to configure the context path of the webapp via zeppelin.server.context.path property or ZEPPELIN_CONTEXT_PATH env variable + add doc on this --- conf/zeppelin-site.xml.template | 6 ++++++ docs/install/install.md | 6 ++++++ .../org/apache/zeppelin/server/ZeppelinServer.java | 12 ++++++------ .../src/components/baseUrl/baseUrl.service.js | 2 +- .../apache/zeppelin/conf/ZeppelinConfiguration.java | 5 +++++ 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/conf/zeppelin-site.xml.template b/conf/zeppelin-site.xml.template index 90989478f97..0f44c62ad51 100755 --- a/conf/zeppelin-site.xml.template +++ b/conf/zeppelin-site.xml.template @@ -31,6 +31,12 @@ Server port. + + zeppelin.server.context.path + / + Context Path of the Web Application + + zeppelin.notebook.dir notebook diff --git a/docs/install/install.md b/docs/install/install.md index e1dc5d1af1b..d3914010f64 100644 --- a/docs/install/install.md +++ b/docs/install/install.md @@ -74,6 +74,12 @@ Configuration can be done by both environment variable(conf/zeppelin-env.sh) and * Allows a way to specify a ',' separated list of allowed origins for rest and websockets. i.e. http://localhost:8080 + + ZEPPELIN_SERVER_CONTEXT_PATH + zeppelin.server.context.path + / + Context Path of the Web Application + ZEPPELIN_SSL zeppelin.ssl diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java index 3717eccf142..ea8a0b64c45 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java @@ -85,7 +85,7 @@ public static void main(String[] args) throws Exception { jettyServer = setupJettyServer(conf); // REST api - final ServletContextHandler restApi = setupRestApiContextHandler(); + final ServletContextHandler restApi = setupRestApiContextHandler(conf); // Notebook server final ServletContextHandler notebook = setupNotebookServer(conf); @@ -170,7 +170,7 @@ private static ServletContextHandler setupNotebookServer(ZeppelinConfiguration c ServletContextHandler.SESSIONS); cxfContext.setSessionHandler(new SessionHandler()); - cxfContext.setContextPath("/"); + cxfContext.setContextPath(conf.getServerContextPath()); cxfContext.addServlet(servletHolder, "/ws/*"); cxfContext.addFilter(new FilterHolder(CorsFilter.class), "/*", EnumSet.allOf(DispatcherType.class)); @@ -210,7 +210,7 @@ private static SSLContext getSslContext(ZeppelinConfiguration conf) return scf.getSslContext(); } - private static ServletContextHandler setupRestApiContextHandler() { + private static ServletContextHandler setupRestApiContextHandler(ZeppelinConfiguration conf) { final ServletHolder cxfServletHolder = new ServletHolder(new CXFNonSpringJaxrsServlet()); cxfServletHolder.setInitParameter("javax.ws.rs.Application", ZeppelinServer.class.getName()); cxfServletHolder.setName("rest"); @@ -218,8 +218,8 @@ private static ServletContextHandler setupRestApiContextHandler() { final ServletContextHandler cxfContext = new ServletContextHandler(); cxfContext.setSessionHandler(new SessionHandler()); - cxfContext.setContextPath("/api"); - cxfContext.addServlet(cxfServletHolder, "/*"); + cxfContext.setContextPath(conf.getServerContextPath()); + cxfContext.addServlet(cxfServletHolder, "/api/*"); cxfContext.addFilter(new FilterHolder(CorsFilter.class), "/*", EnumSet.allOf(DispatcherType.class)); @@ -230,12 +230,12 @@ private static WebAppContext setupWebAppContext( ZeppelinConfiguration conf) { WebAppContext webApp = new WebAppContext(); + webApp.setContextPath(conf.getServerContextPath()); File warPath = new File(conf.getString(ConfVars.ZEPPELIN_WAR)); if (warPath.isDirectory()) { // Development mode, read from FS // webApp.setDescriptor(warPath+"/WEB-INF/web.xml"); webApp.setResourceBase(warPath.getPath()); - webApp.setContextPath("/"); webApp.setParentLoaderPriority(true); } else { // use packaged WAR diff --git a/zeppelin-web/src/components/baseUrl/baseUrl.service.js b/zeppelin-web/src/components/baseUrl/baseUrl.service.js index f5eb2df5970..f06eef3c4d5 100644 --- a/zeppelin-web/src/components/baseUrl/baseUrl.service.js +++ b/zeppelin-web/src/components/baseUrl/baseUrl.service.js @@ -32,7 +32,7 @@ angular.module('zeppelinWebApp').service('baseUrlSrv', function() { this.getWebsocketUrl = function() { var wsProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:'; - return wsProtocol + '//' + location.hostname + ':' + this.getPort() + '/ws'; + return wsProtocol + '//' + location.hostname + ':' + this.getPort() + skipTrailingSlash(location.pathname) + '/ws'; }; this.getRestApiBase = function() { diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java index 19ddceb22de..17964307817 100755 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java @@ -268,6 +268,10 @@ public int getServerPort() { return getInt(ConfVars.ZEPPELIN_PORT); } + public String getServerContextPath() { + return getString(ConfVars.ZEPPELIN_SERVER_CONTEXT_PATH); + } + public String getKeyStorePath() { return getRelativeDir( String.format("%s/%s", @@ -383,6 +387,7 @@ public static enum ConfVars { ZEPPELIN_HOME("zeppelin.home", "../"), ZEPPELIN_ADDR("zeppelin.server.addr", "0.0.0.0"), ZEPPELIN_PORT("zeppelin.server.port", 8080), + ZEPPELIN_SERVER_CONTEXT_PATH("zeppelin.server.context.path", "/"), ZEPPELIN_SSL("zeppelin.ssl", false), ZEPPELIN_SSL_CLIENT_AUTH("zeppelin.ssl.client.auth", false), ZEPPELIN_SSL_KEYSTORE_PATH("zeppelin.ssl.keystore.path", "keystore"), From 01f4884a3a971ece49d668a9783d6b705cf6dbb5 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Fri, 20 Nov 2015 17:45:50 +0900 Subject: [PATCH 056/491] ZEPPELIN-441 Make SparkInterpreter work even if Spark version is not listed https://issues.apache.org/jira/browse/ZEPPELIN-441 Currently when spark version is not listed in SparkVersion.java, it throws ``` java.lang.IllegalArgumentException at org.apache.zeppelin.spark.SparkVersion.fromVersionString(SparkVersion.java:58) at org.apache.zeppelin.spark.SparkInterpreter.open(SparkInterpreter.java:477) ``` This PR changes SparkVersion from 'enum' to 'class' and make Spark Interpreter work with unlisted version. Author: Lee moon soo Closes #446 from Leemoonsoo/ZEPPELIN-441 and squashes the following commits: ddd2db4 [Lee moon soo] Add test and print version check message in SparkSqlInterpreter and SparkInterpreter 5e97d60 [Lee moon soo] Show error message on Unsupported version of spark is detected f6d3007 [Lee moon soo] enum -> class to handle unlisted Spark version --- .../zeppelin/spark/PySparkInterpreter.java | 7 +- .../zeppelin/spark/SparkInterpreter.java | 5 ++ .../zeppelin/spark/SparkSqlInterpreter.java | 7 +- .../apache/zeppelin/spark/SparkVersion.java | 71 ++++++++++++------- .../zeppelin/spark/SparkVersionTest.java | 17 ++++- 5 files changed, 78 insertions(+), 29 deletions(-) diff --git a/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java index 9bd258b2e9a..273c89736ec 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java @@ -284,6 +284,12 @@ public void onPythonScriptInitialized() { @Override public InterpreterResult interpret(String st, InterpreterContext context) { + SparkInterpreter sparkInterpreter = getSparkInterpreter(); + if (sparkInterpreter.getSparkVersion().isUnsupportedVersion()) { + return new InterpreterResult(Code.ERROR, "Spark " + + sparkInterpreter.getSparkVersion().toString() + " is not supported"); + } + if (!pythonscriptRunning) { return new InterpreterResult(Code.ERROR, "python process not running" + outputStream.toString()); @@ -314,7 +320,6 @@ public InterpreterResult interpret(String st, InterpreterContext context) { + outputStream.toString()); } - SparkInterpreter sparkInterpreter = getSparkInterpreter(); if (!sparkInterpreter.getSparkVersion().isPysparkSupported()) { return new InterpreterResult(Code.ERROR, "pyspark " + sparkInterpreter.getSparkContext().version() + " is not supported"); diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java index 528005e353b..54691c47fc6 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java @@ -605,6 +605,11 @@ String getJobGroup(InterpreterContext context){ */ @Override public InterpreterResult interpret(String line, InterpreterContext context) { + if (sparkVersion.isUnsupportedVersion()) { + return new InterpreterResult(Code.ERROR, "Spark " + sparkVersion.toString() + + " is not supported"); + } + z.setInterpreterContext(context); if (line == null || line.trim().length() == 0) { return new InterpreterResult(Code.SUCCESS); diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkSqlInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkSqlInterpreter.java index 1ee5f9c0488..88582cd5f5d 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/SparkSqlInterpreter.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkSqlInterpreter.java @@ -115,9 +115,14 @@ public void close() {} @Override public InterpreterResult interpret(String st, InterpreterContext context) { SQLContext sqlc = null; + SparkInterpreter sparkInterpreter = getSparkInterpreter(); - sqlc = getSparkInterpreter().getSQLContext(); + if (sparkInterpreter.getSparkVersion().isUnsupportedVersion()) { + return new InterpreterResult(Code.ERROR, "Spark " + + sparkInterpreter.getSparkVersion().toString() + " is not supported"); + } + sqlc = getSparkInterpreter().getSQLContext(); SparkContext sc = sqlc.sparkContext(); if (concurrentSQL()) { sc.setLocalProperty("spark.scheduler.pool", "fair"); diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkVersion.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkVersion.java index e5256b75871..a362938860c 100644 --- a/spark/src/main/java/org/apache/zeppelin/spark/SparkVersion.java +++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkVersion.java @@ -16,29 +16,47 @@ */ package org.apache.zeppelin.spark; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * Provide reading comparing capability of spark version returned from SparkContext.version() */ -public enum SparkVersion { - SPARK_1_0_0, - SPARK_1_0_1, - SPARK_1_1_0, - SPARK_1_1_1, - SPARK_1_2_0, - SPARK_1_2_1, - SPARK_1_2_2, - SPARK_1_3_0, - SPARK_1_3_1, - SPARK_1_4_0, - SPARK_1_4_1, - SPARK_1_5_0, - SPARK_1_5_1, - SPARK_1_5_2; +public class SparkVersion { + Logger logger = LoggerFactory.getLogger(SparkVersion.class); + + public static final SparkVersion SPARK_1_0_0 = SparkVersion.fromVersionString("1.0.0"); + public static final SparkVersion SPARK_1_1_0 = SparkVersion.fromVersionString("1.1.0"); + public static final SparkVersion SPARK_1_2_0 = SparkVersion.fromVersionString("1.2.0"); + public static final SparkVersion SPARK_1_3_0 = SparkVersion.fromVersionString("1.3.0"); + public static final SparkVersion SPARK_1_4_0 = SparkVersion.fromVersionString("1.4.0"); + public static final SparkVersion SPARK_1_5_0 = SparkVersion.fromVersionString("1.5.0"); + public static final SparkVersion SPARK_1_6_0 = SparkVersion.fromVersionString("1.6.0"); + + public static final SparkVersion MIN_SUPPORTED_VERSION = SPARK_1_0_0; + public static final SparkVersion UNSUPPORTED_FUTURE_VERSION = SPARK_1_6_0; private int version; + private String versionString; + + SparkVersion(String versionString) { + this.versionString = versionString; - SparkVersion() { - version = Integer.parseInt(name().substring("SPARK_".length()).replaceAll("_", "")); + try { + int pos = versionString.indexOf('-'); + + String numberPart = versionString; + if (pos > 0) { + numberPart = versionString.substring(0, pos); + } + version = Integer.parseInt(numberPart.replaceAll("\\.", "")); + } catch (Exception e) { + logger.error("Can not recognize Spark version " + versionString + + ". Assume it's a future release", e); + + // assume it is future release + version = 999; + } } public int toNumber() { @@ -46,17 +64,16 @@ public int toNumber() { } public String toString() { - return name().substring("SPARK_".length()).replaceAll("_", "."); + return versionString; } + public boolean isUnsupportedVersion() { + return olderThan(MIN_SUPPORTED_VERSION) || newerThanEquals(UNSUPPORTED_FUTURE_VERSION); + } + + public static SparkVersion fromVersionString(String versionString) { - for (SparkVersion v : values()) { - // Check for the beginning of the version string to allow for "1.5.0-SNAPSHOT" - if (versionString.startsWith(v.toString())) { - return v; - } - } - throw new IllegalArgumentException(); + return new SparkVersion(versionString); } public boolean isPysparkSupported() { @@ -79,6 +96,10 @@ public boolean oldSqlContextImplicits() { return this.olderThan(SPARK_1_3_0); } + public boolean equals(Object versionToCompare) { + return version == ((SparkVersion) versionToCompare).version; + } + public boolean newerThan(SparkVersion versionToCompare) { return version > versionToCompare.version; } diff --git a/spark/src/test/java/org/apache/zeppelin/spark/SparkVersionTest.java b/spark/src/test/java/org/apache/zeppelin/spark/SparkVersionTest.java index ab54b6509a6..5783c1ea23c 100644 --- a/spark/src/test/java/org/apache/zeppelin/spark/SparkVersionTest.java +++ b/spark/src/test/java/org/apache/zeppelin/spark/SparkVersionTest.java @@ -22,11 +22,24 @@ public class SparkVersionTest { + @Test + public void testUnknownSparkVersion() { + assertEquals(999, SparkVersion.fromVersionString("DEV-10.10").toNumber()); + } + + @Test + public void testUnsupportedVersion() { + assertTrue(SparkVersion.fromVersionString("9.9.9").isUnsupportedVersion()); + assertFalse(SparkVersion.fromVersionString("1.5.9").isUnsupportedVersion()); + assertTrue(SparkVersion.fromVersionString("0.9.0").isUnsupportedVersion()); + assertTrue(SparkVersion.UNSUPPORTED_FUTURE_VERSION.isUnsupportedVersion()); + } + @Test public void testSparkVersion() { // test equals - assertTrue(SparkVersion.SPARK_1_2_0 == SparkVersion.fromVersionString("1.2.0")); - assertTrue(SparkVersion.SPARK_1_5_0 == SparkVersion.fromVersionString("1.5.0-SNAPSHOT")); + assertEquals(SparkVersion.SPARK_1_2_0, SparkVersion.fromVersionString("1.2.0")); + assertEquals(SparkVersion.SPARK_1_5_0, SparkVersion.fromVersionString("1.5.0-SNAPSHOT")); // test newer than assertFalse(SparkVersion.SPARK_1_2_0.newerThan(SparkVersion.SPARK_1_2_0)); From 0e3698222704d9e42f7588e6ba0f6d14807a4e11 Mon Sep 17 00:00:00 2001 From: Prabhjyot Singh Date: Thu, 19 Nov 2015 15:07:13 +0530 Subject: [PATCH 057/491] ZEPPELIN-447: removing of redundant "$" in jshintrc Allow only jQuery, so that its always more readable. Author: Prabhjyot Singh Closes #449 from prabhjyotsingh/ZEPPELIN-447 and squashes the following commits: a50ee6b [Prabhjyot Singh] replace jQuery with angular.element f15e176 [Prabhjyot Singh] Allow only jQuery, so that its always more readable. --- zeppelin-web/.jshintrc | 1 - .../src/app/notebook/notebook.controller.js | 2 +- .../paragraph/paragraph.controller.js | 30 ++++++++++--------- .../components/navbar/navbar.controller.js | 6 ++-- 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/zeppelin-web/.jshintrc b/zeppelin-web/.jshintrc index 06f72ccd360..623ffedc0e8 100644 --- a/zeppelin-web/.jshintrc +++ b/zeppelin-web/.jshintrc @@ -29,7 +29,6 @@ "confirm": false, "alert": false, "nv": false, - "$": false, "ace": false, "d3": false } diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index 74bc4f4d597..74bb87aa7fa 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -412,7 +412,7 @@ angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $ro $http.get(baseUrlSrv.getRestApiBase()+ '/notebook/interpreter/bind/' +$scope.note.id). success(function(data, status, headers, config) { $scope.interpreterBindings = data.body; - $scope.interpreterBindingsOrig = jQuery.extend(true, [], $scope.interpreterBindings); // to check dirty + $scope.interpreterBindingsOrig = angular.copy($scope.interpreterBindings); // to check dirty if (callback) { callback(); } diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index d32375751bd..41039c03563 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -54,12 +54,14 @@ angular.module('zeppelinWebApp') $scope.renderHtml = function() { var retryRenderer = function() { - if ($('#p'+$scope.paragraph.id+'_html').length) { + if (angular.element('#p' + $scope.paragraph.id + '_html').length) { try { - $('#p'+$scope.paragraph.id+'_html').html($scope.paragraph.result.msg); + angular.element('#p' + $scope.paragraph.id + '_html').html($scope.paragraph.result.msg); - $('#p'+$scope.paragraph.id+'_html').find('pre code').each(function(i, e) { hljs.highlightBlock(e); }); - } catch(err) { + angular.element('#p' + $scope.paragraph.id + '_html').find('pre code').each(function(i, e) { + hljs.highlightBlock(e); + }); + } catch (err) { console.log('HTML rendering error %o', err); } } else { @@ -131,7 +133,7 @@ angular.module('zeppelinWebApp') $scope.getIframeDimensions = function () { if ($scope.asIframe) { var paragraphid = '#' + $routeParams.paragraphId + '_container'; - var height = $(paragraphid).height(); + var height = angular.element(paragraphid).height(); return height; } return 0; @@ -471,7 +473,7 @@ angular.module('zeppelinWebApp') $scope.editor.focus(); autoAdjustEditorHeight(_editor.container.id); - $(window).resize(function(){ + angular.element(window).resize(function() { autoAdjustEditorHeight(_editor.container.id); }); @@ -636,7 +638,7 @@ angular.module('zeppelinWebApp') var editor = $scope.editor; var height = editor.getSession().getScreenLength() * editor.renderer.lineHeight + editor.renderer.scrollBar.getWidth(); - $('#' + id).height(height.toString() + 'px'); + angular.element('#' + id).height(height.toString() + 'px'); editor.resize(); }; @@ -847,7 +849,7 @@ angular.module('zeppelinWebApp') clearUnknownColsFromGraphOption(); // set graph height var height = $scope.paragraph.config.graph.height; - $('#p'+$scope.paragraph.id+'_graph').height(height); + angular.element('#p' + $scope.paragraph.id + '_graph').height(height); if (!type || type === 'table') { setTable($scope.paragraph.result, refresh); @@ -933,16 +935,16 @@ angular.module('zeppelinWebApp') html += ''; - $('#p' + $scope.paragraph.id + '_table').html(html); - $('#p' + $scope.paragraph.id + '_table').perfectScrollbar(); + angular.element('#p' + $scope.paragraph.id + '_table').html(html); + angular.element('#p' + $scope.paragraph.id + '_table').perfectScrollbar(); // set table height var height = $scope.paragraph.config.graph.height; - $('#p'+$scope.paragraph.id+'_table').height(height); + angular.element('#p' + $scope.paragraph.id + '_table').height(height); }; var retryRenderer = function() { - if ($('#p'+$scope.paragraph.id+'_table').length) { + if (angular.element('#p' + $scope.paragraph.id + '_table').length) { try { renderTable(); } catch(err) { @@ -1076,7 +1078,7 @@ angular.module('zeppelinWebApp') }; var retryRenderer = function() { - if ($('#p'+$scope.paragraph.id+'_'+type+' svg').length !== 0) { + if (angular.element('#p' + $scope.paragraph.id + '_' + type + ' svg').length !== 0) { try { renderChart(); } catch(err) { @@ -1751,7 +1753,7 @@ angular.module('zeppelinWebApp') }; $scope.setGraphHeight = function() { - var height = $('#p'+$scope.paragraph.id+'_graph').height(); + var height = angular.element('#p' + $scope.paragraph.id + '_graph').height(); var newParams = angular.copy($scope.paragraph.settings.params); var newConfig = angular.copy($scope.paragraph.config); diff --git a/zeppelin-web/src/components/navbar/navbar.controller.js b/zeppelin-web/src/components/navbar/navbar.controller.js index 3294164ce74..81b28de6c69 100644 --- a/zeppelin-web/src/components/navbar/navbar.controller.js +++ b/zeppelin-web/src/components/navbar/navbar.controller.js @@ -14,7 +14,9 @@ 'use strict'; -angular.module('zeppelinWebApp').controller('NavCtrl', function($scope, $rootScope, $routeParams, notebookListDataFactory, websocketMsgSrv, arrayOrderingSrv) { +angular.module('zeppelinWebApp').controller('NavCtrl', function($scope, $rootScope, $routeParams, + notebookListDataFactory, websocketMsgSrv, + arrayOrderingSrv) { /** Current list of notes (ids) */ var vm = this; @@ -23,7 +25,7 @@ angular.module('zeppelinWebApp').controller('NavCtrl', function($scope, $rootSco vm.websocketMsgSrv = websocketMsgSrv; vm.arrayOrderingSrv = arrayOrderingSrv; - $('#notebook-list').perfectScrollbar({suppressScrollX: true}); + angular.element('#notebook-list').perfectScrollbar({suppressScrollX: true}); $scope.$on('setNoteMenu', function(event, notes) { notebookListDataFactory.setNotes(notes); From 461b3ea9897a0b769f7807dfd24c9c0e5753ed50 Mon Sep 17 00:00:00 2001 From: Mina Lee Date: Thu, 19 Nov 2015 18:57:20 +0900 Subject: [PATCH 058/491] [Zeppelin-136] Zeppelin delete paragraph content after 'Move up' Zeppelin doesn't keep the text change in editor if user tries to "Move up" or "Move down" the paragraph before "auto save"(which is introduced by #168) triggered. Description of this PR: * Save moving paragraphs before changing the paragraph location. * removed unnecessary element * changed dirty text condition ( color of editor bar is always grey when there is no text, but it should be orange when user is erasing all the text ) Author: Mina Lee Closes #451 from minahlee/ZEPPELIN-136 and squashes the following commits: d1e6287 [Mina Lee] [ZEPPELIN-136] Remove unnecessary element and change dirty text condition 8552386 [Mina Lee] [ZEPPELIN-136] zeppelin delete paragraph content after 'Move up' operation --- zeppelin-web/src/app/notebook/notebook.controller.js | 9 ++++++++- zeppelin-web/src/app/notebook/paragraph/paragraph.html | 5 +---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index 74bb87aa7fa..c7d53474fe0 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -280,10 +280,13 @@ angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $ro break; } } - if (newIndex<0 || newIndex>=$scope.note.paragraphs.length) { return; } + // save dirtyText of moving paragraphs. + var prevParagraphId = $scope.note.paragraphs[newIndex].id; + angular.element('#' + paragraphId + '_paragraphColumn_main').scope().saveParagraph(); + angular.element('#' + prevParagraphId + '_paragraphColumn_main').scope().saveParagraph(); websocketMsgSrv.moveParagraph(paragraphId, newIndex); }); @@ -315,6 +318,10 @@ angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $ro if (newIndex<0 || newIndex>=$scope.note.paragraphs.length) { return; } + // save dirtyText of moving paragraphs. + var nextParagraphId = $scope.note.paragraphs[newIndex].id; + angular.element('#' + paragraphId + '_paragraphColumn_main').scope().saveParagraph(); + angular.element('#' + nextParagraphId + '_paragraphColumn_main').scope().saveParagraph(); websocketMsgSrv.moveParagraph(paragraphId, newIndex); }); diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.html b/zeppelin-web/src/app/notebook/paragraph/paragraph.html index e2aa9a36af1..0ccb716c7bc 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.html +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.html @@ -41,7 +41,7 @@ require : ['ace/ext/language_tools'] }" ng-model="paragraph.text" - ng-class="{'disable': paragraph.status == 'RUNNING' || paragraph.status == 'PENDING', 'paragraph-text--dirty' : dirtyText}"> + ng-class="{'disable': paragraph.status == 'RUNNING' || paragraph.status == 'PENDING', 'paragraph-text--dirty' : dirtyText !== undefined}">
    @@ -418,9 +418,6 @@ ng-click="toggleEditor()"> - Date: Mon, 23 Nov 2015 09:26:16 +0530 Subject: [PATCH 059/491] Run button do not have rounded border Run button in case of report view have squarish border Before: Before square edge After: after rounded edge Author: Prabhjyot Singh Closes #452 from prabhjyotsingh/reportViewRunButton and squashes the following commits: 6fc5788 [Prabhjyot Singh] run button do not have rounded border --- zeppelin-web/src/assets/styles/looknfeel/report.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/zeppelin-web/src/assets/styles/looknfeel/report.css b/zeppelin-web/src/assets/styles/looknfeel/report.css index df717e10550..944ae1174ba 100644 --- a/zeppelin-web/src/assets/styles/looknfeel/report.css +++ b/zeppelin-web/src/assets/styles/looknfeel/report.css @@ -69,3 +69,7 @@ body { .lastEmptyParagraph { display: none; } + +.noteAction button.btn { + border-radius: 4px !important; +} From 6cfb32e5f686dba1973c81d8d97d00ce07f3601a Mon Sep 17 00:00:00 2001 From: Renjith Kamath Date: Fri, 20 Nov 2015 16:30:07 +0530 Subject: [PATCH 060/491] ZEPPELIN-387 Allow enable/disable of specific paragraphs - When "run all" is called the disabled paragraphs are not executed. - There is no "run" button for a disabled paragraph. Disabled paragraph menu item screen shot 2015-11-09 at 10 30 42 pm --- Enabled paragraph menu item screen shot 2015-11-09 at 10 30 26 pm Author: Renjith Kamath Closes #414 from r-kamath/ZEPPELIN-387 and squashes the following commits: 796575d [Renjith Kamath] ZEPPELIN-387 fix testClearParagraphOutput failure 38ef9bf [Renjith Kamath] Merge branch 'master' of https://github.com/apache/incubator-zeppelin into ZEPPELIN-387 87ef87b [Renjith Kamath] ZEPPELIN-387 fix tests 118d358 [Renjith Kamath] ZEPPELIN-387 review fix 3a7175a [Renjith Kamath] ZEPPELIN-387 review updates 87aa4e8 [Renjith Kamath] ZEPPELIN-387 remove checkbox, add icon and update the position 226493a [Renjith Kamath] ZEPPELIN-387 Allow enable/disable of specific paragraphs --- .../zeppelin/rest/ZeppelinRestApiTest.java | 8 ++++++ .../rest/ZeppelinSparkClusterTest.java | 27 +++++++++++++++++++ .../paragraph/paragraph.controller.js | 11 ++++++++ .../src/app/notebook/paragraph/paragraph.html | 7 +++-- .../org/apache/zeppelin/notebook/Note.java | 4 ++- .../zeppelin/notebook/NotebookTest.java | 22 +++++++++++++-- .../notebook/repo/NotebookRepoSyncTest.java | 8 +++--- 7 files changed, 78 insertions(+), 9 deletions(-) diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java index 8c8ff07af24..8468de223bc 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java @@ -18,6 +18,7 @@ package org.apache.zeppelin.rest; import java.io.IOException; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -155,8 +156,11 @@ public void testInterpreterRestart() throws IOException, InterruptedException { Note note = ZeppelinServer.notebook.createNote(); note.addParagraph(); Paragraph p = note.getLastParagraph(); + Map config = p.getConfig(); + config.put("enabled", true); // run markdown paragraph + p.setConfig(config); p.setText("%md markdown"); note.run(p.getId()); while (p.getStatus() != Status.FINISHED) { @@ -175,6 +179,7 @@ public void testInterpreterRestart() throws IOException, InterruptedException { // run markdown paragraph, again p = note.addParagraph(); + p.setConfig(config); p.setText("%md markdown restarted"); note.run(p.getId()); while (p.getStatus() != Status.FINISHED) { @@ -262,6 +267,9 @@ public void testCloneNotebook() throws IOException, CloneNotSupportedException, assertNotNull("cant create new note", note); note.setName("source note for clone"); Paragraph paragraph = note.addParagraph(); + Map config = paragraph.getConfig(); + config.put("enabled", true); + paragraph.setConfig(config); paragraph.setText("%md This is my new paragraph in my new note"); note.persist(); String sourceNoteID = note.getId(); diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java index d5006eee957..7076a796e8b 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java @@ -20,7 +20,9 @@ import java.io.File; import java.io.IOException; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.commons.io.FileUtils; import org.apache.zeppelin.interpreter.InterpreterSetting; @@ -68,6 +70,9 @@ public void basicRDDTransformationAndActionTest() throws IOException { // run markdown paragraph, again Paragraph p = note.addParagraph(); + Map config = p.getConfig(); + config.put("enabled", true); + p.setConfig(config); p.setText("%spark print(sc.parallelize(1 to 10).reduce(_ + _))"); note.run(p.getId()); waitForFinish(p); @@ -84,6 +89,9 @@ public void pySparkTest() throws IOException { if (isPyspark() && sparkVersion >= 12) { // pyspark supported from 1.2.1 // run markdown paragraph, again Paragraph p = note.addParagraph(); + Map config = p.getConfig(); + config.put("enabled", true); + p.setConfig(config); p.setText("%pyspark print(sc.parallelize(range(1, 11)).reduce(lambda a, b: a + b))"); note.run(p.getId()); waitForFinish(p); @@ -102,6 +110,9 @@ public void pySparkAutoConvertOptionTest() throws IOException { if (isPyspark() && sparkVersion >= 14) { // auto_convert enabled from spark 1.4 // run markdown paragraph, again Paragraph p = note.addParagraph(); + Map config = p.getConfig(); + config.put("enabled", true); + p.setConfig(config); p.setText("%pyspark\nfrom pyspark.sql.functions import *\n" + "print(sqlContext.range(0, 10).withColumn('uniform', rand(seed=10) * 3.14).count())"); note.run(p.getId()); @@ -116,10 +127,19 @@ public void zRunTest() throws IOException { // create new note Note note = ZeppelinServer.notebook.createNote(); Paragraph p0 = note.addParagraph(); + Map config0 = p0.getConfig(); + config0.put("enabled", true); + p0.setConfig(config0); p0.setText("%spark z.run(1)"); Paragraph p1 = note.addParagraph(); + Map config1 = p1.getConfig(); + config1.put("enabled", true); + p1.setConfig(config1); p1.setText("%spark val a=10"); Paragraph p2 = note.addParagraph(); + Map config2 = p2.getConfig(); + config2.put("enabled", true); + p2.setConfig(config2); p2.setText("%spark print(a)"); note.run(p0.getId()); @@ -151,6 +171,9 @@ public void pySparkDepLoaderTest() throws IOException { // load dep Paragraph p0 = note.addParagraph(); + Map config = p0.getConfig(); + config.put("enabled", true); + p0.setConfig(config); p0.setText("%dep z.load(\"com.databricks:spark-csv_2.11:1.2.0\")"); note.run(p0.getId()); waitForFinish(p0); @@ -161,6 +184,7 @@ public void pySparkDepLoaderTest() throws IOException { // load data using libraries from dep loader Paragraph p1 = note.addParagraph(); + p1.setConfig(config); p1.setText("%pyspark\n" + "from pyspark.sql import SQLContext\n" + "print(sqlContext.read.format('com.databricks.spark.csv')" + @@ -178,6 +202,9 @@ public void pySparkDepLoaderTest() throws IOException { */ private int getSparkVersionNumber(Note note) { Paragraph p = note.addParagraph(); + Map config = p.getConfig(); + config.put("enabled", true); + p.setConfig(config); p.setText("%spark print(sc.version)"); note.run(p.getId()); waitForFinish(p); diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index 41039c03563..430c5ac5f05 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -128,6 +128,10 @@ angular.module('zeppelinWebApp') if (!config.graph.scatter) { config.graph.scatter = {}; } + + if (config.enabled === undefined) { + config.enabled = true; + } }; $scope.getIframeDimensions = function () { @@ -268,6 +272,13 @@ angular.module('zeppelinWebApp') $scope.dirtyText = undefined; }; + $scope.toggleEnableDisable = function () { + $scope.paragraph.config.enabled = $scope.paragraph.config.enabled ? false : true; + var newParams = angular.copy($scope.paragraph.settings.params); + var newConfig = angular.copy($scope.paragraph.config); + commitParagraph($scope.paragraph.title, $scope.paragraph.text, newConfig, newParams); + }; + $scope.moveUp = function() { $scope.$emit('moveParagraphUp', $scope.paragraph.id); }; diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.html b/zeppelin-web/src/app/notebook/paragraph/paragraph.html index 0ccb716c7bc..3ad3e315e7f 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.html +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.html @@ -410,7 +410,7 @@ + ng-show="paragraph.status!='RUNNING' && paragraph.status!='PENDING' && paragraph.config.enabled"> @@ -463,7 +463,10 @@ ng-click="showLineNumbers()" ng-show="!paragraph.config.lineNumbers"> Show line numbers
  • - +
  • + {{paragraph.config.enabled ? "Disable" : "Enable"}} run +
  • Link this paragraph
  • diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java index 89a72b517c8..4271a735813 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java @@ -323,7 +323,9 @@ public void run(String paragraphId) { if (intp == null) { throw new InterpreterException("Interpreter " + p.getRequiredReplName() + " not found"); } - intp.getScheduler().submit(p); + if ((Boolean) p.getConfig().get("enabled")) { + intp.getScheduler().submit(p); + } } public List completion(String paragraphId, String buffer, int cursor) { diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java index 5d887e9d13a..8ae0970868b 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java @@ -26,6 +26,7 @@ import java.io.File; import java.io.IOException; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -95,6 +96,9 @@ public void testSelectingReplImplementation() throws IOException { // run with defatul repl Paragraph p1 = note.addParagraph(); + Map config = p1.getConfig(); + config.put("enabled", true); + p1.setConfig(config); p1.setText("hello world"); note.run(p1.getId()); while(p1.isTerminated()==false || p1.getResult()==null) Thread.yield(); @@ -102,6 +106,7 @@ public void testSelectingReplImplementation() throws IOException { // run with specific repl Paragraph p2 = note.addParagraph(); + p2.setConfig(config); p2.setText("%mock2 hello world"); note.run(p2.getId()); while(p2.isTerminated()==false || p2.getResult()==null) Thread.yield(); @@ -155,6 +160,9 @@ public void testPersist() throws IOException, SchedulerException{ // run with default repl Paragraph p1 = note.addParagraph(); + Map config = p1.getConfig(); + config.put("enabled", true); + p1.setConfig(config); p1.setText("hello world"); note.persist(); @@ -166,6 +174,9 @@ public void testPersist() throws IOException, SchedulerException{ public void testClearParagraphOutput() throws IOException, SchedulerException{ Note note = notebook.createNote(); Paragraph p1 = note.addParagraph(); + Map config = p1.getConfig(); + config.put("enabled", true); + p1.setConfig(config); p1.setText("hello world"); note.run(p1.getId()); @@ -181,10 +192,14 @@ public void testClearParagraphOutput() throws IOException, SchedulerException{ public void testRunAll() throws IOException { Note note = notebook.createNote(); note.getNoteReplLoader().setInterpreters(factory.getDefaultInterpreterSettingList()); - Paragraph p1 = note.addParagraph(); + Map config = p1.getConfig(); + config.put("enabled", true); + p1.setConfig(config); p1.setText("p1"); Paragraph p2 = note.addParagraph(); + Map config1 = p2.getConfig(); + p2.setConfig(config1); p2.setText("p2"); assertEquals(null, p2.getResult()); note.runAll(); @@ -200,12 +215,15 @@ public void testSchedule() throws InterruptedException, IOException{ note.getNoteReplLoader().setInterpreters(factory.getDefaultInterpreterSettingList()); Paragraph p = note.addParagraph(); + Map config = new HashMap(); + p.setConfig(config); p.setText("p1"); Date dateFinished = p.getDateFinished(); assertNull(dateFinished); // set cron scheduler, once a second - Map config = note.getConfig(); + config = note.getConfig(); + config.put("enabled", true); config.put("cron", "* * * * * ?"); note.setConfig(config); notebook.refreshCron(note.id()); diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java index bfc6561d571..8d33d51b0d1 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java @@ -19,11 +19,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; import java.io.File; import java.io.IOException; +import java.util.Map; import org.apache.commons.io.FileUtils; import org.apache.zeppelin.conf.ZeppelinConfiguration; @@ -34,10 +33,8 @@ import org.apache.zeppelin.interpreter.mock.MockInterpreter2; import org.apache.zeppelin.notebook.JobListenerFactory; import org.apache.zeppelin.notebook.Note; -import org.apache.zeppelin.notebook.NoteInfo; import org.apache.zeppelin.notebook.Notebook; import org.apache.zeppelin.notebook.Paragraph; -import org.apache.zeppelin.notebook.repo.NotebookRepoSync; import org.apache.zeppelin.scheduler.Job; import org.apache.zeppelin.scheduler.Job.Status; import org.apache.zeppelin.scheduler.JobListener; @@ -149,6 +146,9 @@ public void testSyncUpdateMain() throws IOException { /* create note */ Note note = notebookSync.createNote(); Paragraph p1 = note.addParagraph(); + Map config = p1.getConfig(); + config.put("enabled", true); + p1.setConfig(config); p1.setText("hello world"); /* new paragraph exists in note instance */ From 26b5a3be15fc00549fdae1b4b9f76ae483ce1150 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Sun, 22 Nov 2015 16:14:14 +0900 Subject: [PATCH 061/491] ZEPPELIN-455 Improve build instruction This PR improves build instruction in README.md https://issues.apache.org/jira/browse/ZEPPELIN-455 Author: Lee moon soo Closes #459 from Leemoonsoo/ZEPPELIN-455 and squashes the following commits: 777599d [Lee moon soo] Improve build instruction --- README.md | 156 +++++++++++++++++++++++------------------------------- 1 file changed, 66 insertions(+), 90 deletions(-) diff --git a/README.md b/README.md index a3891d370be..bd2a04cf614 100644 --- a/README.md +++ b/README.md @@ -49,134 +49,110 @@ _Notes:_ If you want to build Zeppelin from the source, please first clone this repository, then: ``` -mvn clean package -DskipTests +mvn clean package -DskipTests [Options] ``` -To build with a specific Spark version, Hadoop version or specific features, define one or more of the `spark`, `pyspark`, `hadoop` and `yarn` profiles, such as: +Each Interpreter requires different Options. -``` --Pspark-1.5 [Version to run in local spark mode] --Ppyspark [optional: enable PYTHON support in spark via the %pyspark interpreter] --Pyarn [optional: enable YARN support] --Dhadoop.version=2.2.0 [hadoop distribution] --Phadoop-2.2 [hadoop version] -``` -Currently, final/full distributions run with: +#### Spark Interpreter -``` -mvn clean package -Pspark-1.5 -Phadoop-2.4 -Pyarn -Ppyspark -``` +To build with a specific Spark version, Hadoop version or specific features, define one or more of the following profiles and options: -Spark 1.5.x +##### -Pspark-[version] -``` -mvn clean package -Pspark-1.5 -Dhadoop.version=2.2.0 -Phadoop-2.2 -DskipTests -``` -Spark 1.4.x +Set spark major version -``` -mvn clean package -Pspark-1.4 -Dhadoop.version=2.2.0 -Phadoop-2.2 -DskipTests -``` -Spark 1.3.x +Available profiles are ``` -mvn clean package -Pspark-1.3 -Dhadoop.version=2.2.0 -Phadoop-2.2 -DskipTests +-Pspark-1.5 +-Pspark-1.4 +-Pspark-1.3 +-Pspark-1.2 +-Pspark-1.1 +-Pcassandra-spark-1.5 +-Pcassandra-spark-1.4 +-Pcassandra-spark-1.3 +-Pcassandra-spark-1.2 +-Pcassandra-spark-1.1 ``` -Spark 1.2.x -``` -mvn clean package -Pspark-1.2 -Dhadoop.version=2.2.0 -Phadoop-2.2 -DskipTests -``` -Spark 1.1.x +minor version can be adjusted by `-Dspark.version=x.x.x` -``` -mvn clean package -Pspark-1.1 -Dhadoop.version=2.2.0 -Phadoop-2.2 -DskipTests -``` -CDH 5.X + +##### -Phadoop-[version] + +set hadoop major version + +Available profiles are ``` -mvn clean package -Pspark-1.2 -Dhadoop.version=2.5.0-cdh5.3.0 -Phadoop-2.4 -DskipTests +-Phadoop-0.23 +-Phadoop-1 +-Phadoop-2.2 +-Phadoop-2.3 +-Phadoop-2.4 +-Phadoop-2.6 ``` + +minor version can be adjusted by `-Dhadoop.version=x.x.x` + +##### -Pyarn (optional) + +enable YARN support for local mode + + +##### -Ppyspark (optional) + +enable PySpark support for local mode + + +##### -Pvendor-repo (optional) + +enable 3rd party vendor repository (cloudera) + + +##### -Pmapr[version] (optional) + For the MapR Hadoop Distribution, these profiles will handle the Hadoop version. As MapR allows different versions of Spark to be installed, you should specify which version of Spark is installed on the cluster by adding a Spark profile (-Pspark-1.2, -Pspark-1.3, etc.) as needed. For Hive, check the hive/pom.xml and adjust the version installed as well. The correct Maven artifacts can be found for every version of MapR at http://doc.mapr.com -MapR 3.x -``` -mvn clean package -Pmapr3 -DskipTests -``` -MapR 4.0.x -``` -mvn clean package -Pmapr40 -DskipTests -``` -MapR 4.1 -``` -mvn clean package -Pmapr41 -DskipTests -``` -MapR 5.0 -``` -mvn clean package -Pmapr50 -DskipTests -``` -Yarn (Hadoop 2.7.x) - -``` -mvn clean package -Pspark-1.4 -Dspark.version=1.4.1 -Dhadoop.version=2.7.0 -Phadoop-2.6 -Pyarn -DskipTests -``` -Yarn (Hadoop 2.6.x) +Available profiles are ``` -mvn clean package -Pspark-1.1 -Dhadoop.version=2.6.0 -Phadoop-2.6 -Pyarn -DskipTests +-Pmapr3 +-Pmapr40 +-Pmapr41 +-Pmapr50 ``` -Yarn (Hadoop 2.4.x) -``` -mvn clean package -Pspark-1.1 -Dhadoop.version=2.4.0 -Phadoop-2.4 -Pyarn -DskipTests -``` -Yarn (Hadoop 2.3.x) -``` -mvn clean package -Pspark-1.1 -Dhadoop.version=2.3.0 -Phadoop-2.3 -Pyarn -DskipTests -``` -Yarn (Hadoop 2.2.x) +Here're some examples: ``` -mvn clean package -Pspark-1.1 -Dhadoop.version=2.2.0 -Phadoop-2.2 -Pyarn -DskipTests -``` - -Ignite (1.1.0-incubating and later) +# basic build +mvn clean package -Pspark-1.5 -Phadoop-2.4 -Pyarn -Ppyspark -``` -mvn clean package -Dignite.version=1.1.0-incubating -DskipTests -``` +# spark-cassandra integration +mvn clean package -Pcassandra-spark-1.5 -Dhadoop.version=2.6.0 -Phadoop-2.6 -DskipTests -Spark-Cassandra integration (Spark 1.1.x) -``` -mvn clean package -Pcassandra-spark-1.1 -Dhadoop.version=2.6.0 -Phadoop-2.6 -DskipTests -``` +# with CDH +mvn clean package -Pspark-1.2 -Dhadoop.version=2.5.0-cdh5.3.0 -Phadoop-2.4 -Pvendor-repo -DskipTests -Spark-Cassandra integration (Spark 1.2.x) -``` -mvn clean package -Pcassandra-spark-1.2 -Dhadoop.version=2.6.0 -Phadoop-2.6 -DskipTests +# with MapR +mvn clean package -Pspark-1.5 -Pmapr50 -DskipTests ``` -Spark-Cassandra integration (Spark 1.3.x) -``` -mvn clean package -Pcassandra-spark-1.3 -Dhadoop.version=2.6.0 -Phadoop-2.6 -DskipTests -``` -Spark-Cassandra integration (Spark 1.4.x) -``` -mvn clean package -Pcassandra-spark-1.4 -Dhadoop.version=2.6.0 -Phadoop-2.6 -DskipTests -``` +#### Ignite Interpreter -Spark-Cassandra integration (Spark 1.5.x) ``` -mvn clean package -Pcassandra-spark-1.5 -Dhadoop.version=2.6.0 -Phadoop-2.6 -DskipTests +mvn clean package -Dignite.version=1.1.0-incubating -DskipTests ``` - ### Configure If you wish to configure Zeppelin option (like port number), configure the following files: From 4b109c19c0f72376f52e67f44be8eb91ee017a65 Mon Sep 17 00:00:00 2001 From: astroshim Date: Fri, 20 Nov 2015 21:06:34 +0900 Subject: [PATCH 062/491] [ZEPPELIN-37] Upload to sonatype maven repository the spark interpreter module. Since maven-deploy-plugin is set as skip in the spark pom.xml, it'll be removed. related issue : https://issues.apache.org/jira/browse/ZEPPELIN-37 Author: astroshim Closes #453 from astroshim/issue-37 and squashes the following commits: 45ab390 [astroshim] remove maven-deploy-plugin in spark pom.xml. --- spark/pom.xml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/spark/pom.xml b/spark/pom.xml index bca93eca09c..dcf71a1e57d 100644 --- a/spark/pom.xml +++ b/spark/pom.xml @@ -328,15 +328,6 @@ - - org.apache.maven.plugins - maven-deploy-plugin - 2.7 - - true - - - maven-enforcer-plugin 1.3.1 From f162615fba5243612c8db45013c6930116978a46 Mon Sep 17 00:00:00 2001 From: Alexander Bezzubov Date: Tue, 24 Nov 2015 11:20:18 +0900 Subject: [PATCH 063/491] ZEPPELIN-413: Fix ability to link a single paragraph Fixes [ZEPPELIN-413](https://issues.apache.org/jira/browse/ZEPPELIN-413) Relevant changes in `setNoteContent ` handler Test plan: - Link a paragraph from Zeppelin Tutorial i.e [/#/notebook/2A94M5J1Z/paragraph/20150210-015302_1492795503?asIframe](http://localhost:9000/#/notebook/2A94M5J1Z/paragraph/20150210-015302_1492795503?asIframe) \cc minahlee corneadoug for a review Author: Alexander Bezzubov Closes #464 from bzz/bugfix/link-par-ZEPPELIN-413 and squashes the following commits: f978f68 [Alexander Bezzubov] ZEPPELIN-413: restore ability to link single paragraph 9425a97 [Alexander Bezzubov] ZEPPELIN-413: fix tabs and formatting --- .../noteName-create/notename.controller.js | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/zeppelin-web/src/components/noteName-create/notename.controller.js b/zeppelin-web/src/components/noteName-create/notename.controller.js index a81ffbad6d3..430e60db38e 100644 --- a/zeppelin-web/src/components/noteName-create/notename.controller.js +++ b/zeppelin-web/src/components/noteName-create/notename.controller.js @@ -14,41 +14,45 @@ 'use strict'; -angular.module('zeppelinWebApp').controller('NotenameCtrl', function($scope, $rootScope, $routeParams, websocketMsgSrv) { +angular.module('zeppelinWebApp').controller('NotenameCtrl', function($scope, $rootScope, $routeParams, websocketMsgSrv, $location) { var vm = this; vm.websocketMsgSrv = websocketMsgSrv; $scope.note = {}; - vm.createNote = function(){ - if(!vm.clone){ - vm.websocketMsgSrv.createNotebook($scope.note.notename); - }else{ - var noteId = $routeParams.noteId; - vm.websocketMsgSrv.cloneNotebook(noteId, $scope.note.notename); - } + + vm.createNote = function() { + if (!vm.clone) { + vm.websocketMsgSrv.createNotebook($scope.note.notename); + } else { + var noteId = $routeParams.noteId; + vm.websocketMsgSrv.cloneNotebook(noteId, $scope.note.notename); + } }; $scope.$on('setNoteContent', function(event, note) { - if(note !== undefined) { - window.location = '#/notebook/' + note.id; - console.log(note); + //a hack, to make it run only after notebook creation + //it should not run i.e in case of linking to the paragraph + if (note && $location.path().indexOf(note.id) < 0) { + $location.path('notebook/' + note.id); } }); - vm.preVisible = function(clone){ - var generatedName = vm.generateName(); - $scope.note.notename = 'Note ' + generatedName; - vm.clone = clone; - $scope.$apply(); + vm.preVisible = function(clone) { + var generatedName = vm.generateName(); + $scope.note.notename = 'Note ' + generatedName; + vm.clone = clone; + $scope.$apply(); }; + vm.generateName = function () { - var DICTIONARY = [ '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', - 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R', - 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ]; - var randIndex, name = ''; - for (var i = 0; i < 9; i++) { - randIndex = Math.floor(Math.random() * 32); - name += DICTIONARY[randIndex]; - } - return name; - }; + var DICTIONARY = [ '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', + 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R', + 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ]; + var randIndex, name = ''; + for (var i = 0; i < 9; i++) { + randIndex = Math.floor(Math.random() * 32); + name += DICTIONARY[randIndex]; + } + return name; + }; + }); From fa5057cfd084ed36093fe032faad7f59ff22c28e Mon Sep 17 00:00:00 2001 From: Prabhjyot Singh Date: Tue, 24 Nov 2015 11:28:33 +0530 Subject: [PATCH 064/491] ZEPPELIN-371 : Import a notebook Import a notebook by either an external URL or uploading a valid JSON. screen shot 2015-10-28 at 4 53 58 pm screen shot 2015-10-28 at 4 56 30 pm screen shot 2015-10-28 at 4 56 55 pm screen shot 2015-10-28 at 4 55 29 pm Author: Prabhjyot Singh Closes #374 from prabhjyotsingh/ZEPPELIN-371 and squashes the following commits: 35e1e02 [Prabhjyot Singh] review changes; uniform naming: renaming IMPORT_NOTEBOOK to IMPORT_NOTE 246ae8b [Prabhjyot Singh] Fixing test case 3b8816f [Prabhjyot Singh] Import a notebook as JSON file or external URL --- .../org/apache/zeppelin/socket/Message.java | 2 + .../zeppelin/socket/NotebookServer.java | 69 +++- .../java/org/apache/zeppelin/ZeppelinIT.java | 2 +- .../zeppelin/socket/NotebookServerTest.java | 21 + zeppelin-web/src/app/home/home.css | 382 +++++++++++++++++- zeppelin-web/src/app/home/home.html | 2 + .../noteName-import/note-import-dialog.html | 76 ++++ .../notenameImport.controller.js | 110 +++++ .../websocketEvents/websocketMsg.service.js | 9 + zeppelin-web/src/index.html | 4 + 10 files changed, 667 insertions(+), 10 deletions(-) create mode 100644 zeppelin-web/src/components/noteName-import/note-import-dialog.html create mode 100644 zeppelin-web/src/components/noteName-import/notenameImport.controller.js diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/Message.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/Message.java index c51cfe371ff..7a1c749b010 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/Message.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/Message.java @@ -55,6 +55,8 @@ public static enum OP { CLONE_NOTE, // [c-s] clone new notebook // @param id id of note to clone // @param name name fpor the cloned note + IMPORT_NOTE, // [c-s] import notebook + // @param object notebook NOTE_UPDATE, RUN_PARAGRAPH, // [c-s] run paragraph diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java index 654d782c6d5..114582f6375 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java @@ -16,20 +16,17 @@ */ package org.apache.zeppelin.socket; import java.io.IOException; -import java.net.URI; import java.net.URISyntaxException; import java.net.UnknownHostException; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import javax.servlet.http.HttpServletRequest; + import org.apache.zeppelin.conf.ZeppelinConfiguration; import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars; import org.apache.zeppelin.display.AngularObject; import org.apache.zeppelin.display.AngularObjectRegistry; import org.apache.zeppelin.display.AngularObjectRegistryListener; +import org.apache.zeppelin.display.Input; import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.InterpreterSetting; import org.apache.zeppelin.notebook.JobListenerFactory; @@ -119,6 +116,9 @@ public void onMessage(NotebookSocket conn, String msg) { case CLONE_NOTE: cloneNote(conn, notebook, messagereceived); break; + case IMPORT_NOTE: + importNote(conn, notebook, messagereceived); + break; case COMMIT_PARAGRAPH: updateParagraph(conn, notebook, messagereceived); break; @@ -171,7 +171,7 @@ public void onClose(NotebookSocket conn, int code, String reason) { } } - private Message deserializeMessage(String msg) { + protected Message deserializeMessage(String msg) { return gson.fromJson(msg, Message.class); } @@ -467,6 +467,61 @@ private void cloneNote(NotebookSocket conn, Notebook notebook, Message fromMessa broadcastNoteList(); } + protected Note importNote(NotebookSocket conn, Notebook notebook, Message fromMessage) + throws IOException { + + Note note = notebook.createNote(); + if (fromMessage != null) { + String noteName = (String) ((Map) fromMessage.get("notebook")).get("name"); + if (noteName == null || noteName.isEmpty()) { + noteName = "Note " + note.getId(); + } + note.setName(noteName); + ArrayList paragraphs = ((Map) fromMessage.get("notebook")) + .get("paragraphs"); + if (paragraphs.size() > 0) { + for (Map paragraph : paragraphs) { + try { + Paragraph p = note.addParagraph(); + String text = (String) paragraph.get("text"); + p.setText(text); + p.setTitle((String) paragraph.get("title")); + Map params = (Map) ((Map) paragraph + .get("settings")).get("params"); + Map forms = (Map) ((Map) paragraph + .get("settings")).get("forms"); + if (params != null) { + p.settings.setParams(params); + } + if (forms != null) { + p.settings.setForms(forms); + } + Map result = (Map) paragraph.get("result"); + if (result != null) { + InterpreterResult.Code code = InterpreterResult.Code + .valueOf((String) result.get("code")); + InterpreterResult.Type type = InterpreterResult.Type + .valueOf((String) result.get("type")); + String msg = (String) result.get("msg"); + p.setReturn(new InterpreterResult(code, type, msg), null); + } + + Map config = (Map) paragraph + .get("config"); + p.setConfig(config); + } catch (Exception e) { + LOG.error("Exception while setting parameter in paragraph", e); + } + } + } + } + + note.persist(); + broadcastNote(note); + broadcastNoteList(); + return note; + } + private void removeParagraph(NotebookSocket conn, Notebook notebook, Message fromMessage) throws IOException { final String paragraphId = (String) fromMessage.get("id"); diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinIT.java b/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinIT.java index dc188f8f96f..c1b10ced281 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinIT.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinIT.java @@ -299,7 +299,7 @@ private void createNewNote() { notebookTitles.add(el.getText()); } - WebElement createNoteLink = driver.findElement(By.xpath("//div[contains(@class, \"col-md-4\")]/div/h5/a")); + WebElement createNoteLink = driver.findElement(By.xpath("//div[contains(@class, \"col-md-4\")]/div/h5/a[contains(.,'Create new note')]")); createNoteLink.click(); WebDriverWait block = new WebDriverWait(driver, 10); diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java index 5275d81ac67..faef28709ed 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/socket/NotebookServerTest.java @@ -136,6 +136,27 @@ public void testMakeSureNoAngularObjectBroadcastToWebsocketWhoFireTheEvent() thr notebook.removeNote(note1.getId()); } + @Test + public void testImportNotebook() throws IOException { + String msg = "{\"op\":\"IMPORT_NOTE\",\"data\":" + + "{\"notebook\":{\"paragraphs\": [{\"text\": \"Test " + + "paragraphs import\",\"config\":{},\"settings\":{}}]," + + "\"name\": \"Test Zeppelin notebook import\",\"config\": " + + "{}}}}"; + Message messageReceived = notebookServer.deserializeMessage(msg); + Note note = null; + try { + note = notebookServer.importNote(null, notebook, messageReceived); + } catch (NullPointerException e) { + //broadcastNoteList(); failed nothing to worry. + } + + assertNotEquals(null, notebook.getNote(note.getId())); + assertEquals("Test Zeppelin notebook import", notebook.getNote(note.getId()).getName()); + assertEquals("Test paragraphs import", notebook.getNote(note.getId()).getParagraphs().get(0).getText()); + notebook.removeNote(note.getId()); + } + private NotebookSocket createWebSocket() { NotebookSocket sock = mock(NotebookSocket.class); when(sock.getRequest()).thenReturn(createHttpServletRequest()); diff --git a/zeppelin-web/src/app/home/home.css b/zeppelin-web/src/app/home/home.css index 0c62279462d..70baee9ae1d 100644 --- a/zeppelin-web/src/app/home/home.css +++ b/zeppelin-web/src/app/home/home.css @@ -130,30 +130,37 @@ a.navbar-brand:hover { .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #D3D3D3; } + .navbar-nav .open .dropdown-menu > .scrollbar-container > li > a { padding: 5px 15px 5px 25px; line-height: 20px; } + .navbar-inverse .navbar-nav .open .dropdown-menu > .scrollbar-container > li > a { color: #D3D3D3; } + .navbar-inverse .navbar-nav .open .dropdown-menu > .scrollbar-container > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .scrollbar-container > li > a:focus { color: #fff; background-color: transparent; } + .navbar-inverse .navbar-nav .open .dropdown-menu > .scrollbar-container > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .scrollbar-container > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .scrollbar-container > .active > a:focus { color: #fff; background-color: #080808; } - .server-status{ + + .server-status { float: right; } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: #3071A9; } + .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #3071A9; } @@ -210,7 +217,7 @@ a.navbar-brand:hover { .box-heading { position: relative; max-width: 100%; - font-weight:300; + font-weight: 300; white-space: nowrap; text-overflow: ellipsis; vertical-align: middle; @@ -310,3 +317,374 @@ This part should be removed when new version of bootstrap handles this issue. .btn-group > .popover + .btn { margin-left: -1px; } + +.display-inline { + display: inline; + float: left; +} + +#noteImportModal .modal-body { + min-height: 420px; + overflow: hidden; +} + +#noteImportModal .modal-footer { + min-height: 65px; +} + +#noteImportModal .display-inline a { + background-color: #fff; + border: 1px solid #ddd; + border-radius: 5px; + color: #999; + cursor: pointer; + display: block; + float: left; + font-size: 98px; + height: 240px; + margin: 0 10px 16px; + padding-top: 60px; + text-align: center; + text-decoration: none; + width: 264px; +} + +#noteImportModal .display-inline a:hover { + background-color: #eee; +} + +#noteImportModal .display-inline a p { + font-size: 14px; +} + +/* ------------------------------------------- */ +/* Slide Top +/* ------------------------------------------- */ +.slide-top { + -webkit-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + -moz-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + -ms-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + -o-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + /* easeOutQuad */ + -webkit-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + -moz-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + -ms-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + -o-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + /* easeOutQuad */ +} + +.slide-top.ng-enter { + transform: translateY(60px); + -ms-transform: translateY(60px); + -webkit-transform: translateY(60px); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + opacity: 0; +} + +.slide-top.ng-enter-active { + transform: translateY(0); + -ms-transform: translateY(0); + -webkit-transform: translateY(0); + opacity: 1; +} + +.slide-top.ng-leave { + transform: translateY(0); + -ms-transform: translateY(0); + -webkit-transform: translateY(0); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + opacity: 1; +} + +.slide-top.ng-leave-active { + transform: translateY(60px); + -ms-transform: translateY(60px); + -webkit-transform: translateY(60px); + opacity: 0; +} + +.slide-top.ng-hide-add { + transform: translateY(0); + -ms-transform: translateY(0); + -webkit-transform: translateY(0); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + opacity: 1; +} + +.slide-top.ng-hide-add.ng-hide-add-active { + transform: translateY(60px); + -ms-transform: translateY(60px); + -webkit-transform: translateY(60px); + opacity: 0; +} + +.slide-top.ng-hide-remove { + transform: translateY(60px); + -ms-transform: translateY(60px); + -webkit-transform: translateY(60px); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + display: block !important; + opacity: 0; +} + +.slide-top.ng-hide-remove.ng-hide-remove-active { + transform: translateY(0); + -ms-transform: translateY(0); + -webkit-transform: translateY(0); + opacity: 1; +} + +/* ------------------------------------------- */ +/* Slide Right +/* ------------------------------------------- */ +.slide-right { + -webkit-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + -moz-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + -ms-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + -o-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + /* easeOutQuad */ + -webkit-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + -moz-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + -ms-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + -o-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + /* easeOutQuad */ +} + +.slide-right.ng-enter { + transform: translateX(60px); + -ms-transform: translateX(60px); + -webkit-transform: translateX(60px); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + opacity: 0; +} + +.slide-right.ng-enter-active { + transform: translateX(0); + -ms-transform: translateX(0); + -webkit-transform: translateX(0); + opacity: 1; +} + +.slide-right.ng-leave { + transform: translateX(0); + -ms-transform: translateX(0); + -webkit-transform: translateX(0); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + opacity: 1; +} + +.slide-right.ng-leave-active { + transform: translateX(60px); + -ms-transform: translateX(60px); + -webkit-transform: translateX(60px); + opacity: 0; +} + +.slide-right.ng-hide-add { + transform: translateX(0); + -ms-transform: translateX(0); + -webkit-transform: translateX(0); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + opacity: 1; +} + +.slide-right.ng-hide-add.ng-hide-add-active { + transform: translateX(60px); + -ms-transform: translateX(60px); + -webkit-transform: translateX(60px); + opacity: 0; +} + +.slide-right.ng-hide-remove { + transform: translateX(60px); + -ms-transform: translateX(60px); + -webkit-transform: translateX(60px); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + display: block !important; + opacity: 0; +} + +.slide-right.ng-hide-remove.ng-hide-remove-active { + transform: translateX(0); + -ms-transform: translateX(0); + -webkit-transform: translateX(0); + opacity: 1; +} + +/* ------------------------------------------- */ +/* Slide Left +/* ------------------------------------------- */ +.slide-left { + -webkit-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + -moz-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + -ms-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + -o-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + /* easeOutQuad */ + -webkit-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + -moz-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + -ms-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + -o-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + /* easeOutQuad */ +} + +.slide-left.ng-enter { + transform: translateX(-60px); + -ms-transform: translateX(-60px); + -webkit-transform: translateX(-60px); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + opacity: 0; +} + +.slide-left.ng-enter-active { + transform: translateX(0); + -ms-transform: translateX(0); + -webkit-transform: translateX(0); + opacity: 1; +} + +.slide-left.ng-leave { + transform: translateX(0); + -ms-transform: translateX(0); + -webkit-transform: translateX(0); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + opacity: 1; +} + +.slide-left.ng-leave-active { + transform: translateX(-60px); + -ms-transform: translateX(-60px); + -webkit-transform: translateX(-60px); + opacity: 0; +} + +.slide-left.ng-hide-add { + transform: translateX(0); + -ms-transform: translateX(0); + -webkit-transform: translateX(0); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + opacity: 1; +} + +.slide-left.ng-hide-add.ng-hide-add-active { + transform: translateX(-60px); + -ms-transform: translateX(-60px); + -webkit-transform: translateX(-60px); + opacity: 0; +} + +.slide-left.ng-hide-remove { + transform: translateX(-60px); + -ms-transform: translateX(-60px); + -webkit-transform: translateX(-60px); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + display: block !important; + opacity: 0; +} + +.slide-left.ng-hide-remove.ng-hide-remove-active { + transform: translateX(0); + -ms-transform: translateX(0); + -webkit-transform: translateX(0); + opacity: 1; +} + +/* ------------------------------------------- */ +/* Slide Down +/* ------------------------------------------- */ +.slide-down { + -webkit-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + -moz-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + -ms-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + -o-transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + transition: all 0 cubic-bezier(0.25, 0.46, 0.45, 0.94); + /* easeOutQuad */ + -webkit-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + -moz-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + -ms-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + -o-transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); + /* easeOutQuad */ +} + +.slide-down.ng-enter { + transform: translateY(-60px); + -ms-transform: translateY(-60px); + -webkit-transform: translateY(-60px); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + opacity: 0; +} + +.slide-down.ng-enter-active { + transform: translateY(0); + -ms-transform: translateY(0); + -webkit-transform: translateY(0); + opacity: 1; +} + +.slide-down.ng-leave { + transform: translateY(0); + -ms-transform: translateY(0); + -webkit-transform: translateY(0); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + opacity: 1; +} + +.slide-down.ng-leave-active { + transform: translateY(-60px); + -ms-transform: translateY(-60px); + -webkit-transform: translateY(-60px); + opacity: 0; +} + +.slide-down.ng-hide-add { + transform: translateY(0); + -ms-transform: translateY(0); + -webkit-transform: translateY(0); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + opacity: 1; +} + +.slide-down.ng-hide-add.ng-hide-add-active { + transform: translateY(-60px); + -ms-transform: translateY(-60px); + -webkit-transform: translateY(-60px); + opacity: 0; +} + +.slide-down.ng-hide-remove { + transform: translateY(-60px); + -ms-transform: translateY(-60px); + -webkit-transform: translateY(-60px); + transition-duration: 250ms; + -webkit-transition-duration: 250ms; + display: block !important; + opacity: 0; +} + +.slide-down.ng-hide-remove.ng-hide-remove-active { + transform: translateY(0); + -ms-transform: translateY(0); + -webkit-transform: translateY(0); + opacity: 1; +} diff --git a/zeppelin-web/src/app/home/home.html b/zeppelin-web/src/app/home/home.html index cdefa69c063..56e6dc4e29f 100644 --- a/zeppelin-web/src/app/home/home.html +++ b/zeppelin-web/src/app/home/home.html @@ -29,6 +29,8 @@

    Notebook

    +
    + Import note
    Create new note
      diff --git a/zeppelin-web/src/components/noteName-import/note-import-dialog.html b/zeppelin-web/src/components/noteName-import/note-import-dialog.html new file mode 100644 index 00000000000..524e4d2d943 --- /dev/null +++ b/zeppelin-web/src/components/noteName-import/note-import-dialog.html @@ -0,0 +1,76 @@ + + + diff --git a/zeppelin-web/src/components/noteName-import/notenameImport.controller.js b/zeppelin-web/src/components/noteName-import/notenameImport.controller.js new file mode 100644 index 00000000000..d48179d712d --- /dev/null +++ b/zeppelin-web/src/components/noteName-import/notenameImport.controller.js @@ -0,0 +1,110 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +angular.module('zeppelinWebApp').controller('NoteImportCtrl', function($scope, $timeout, websocketMsgSrv) { + var vm = this; + $scope.note = {}; + $scope.note.step1 = true; + $scope.note.step2 = false; + + vm.resetFlags = function() { + $scope.note = {}; + $scope.note.step1 = true; + $scope.note.step2 = false; + angular.element('#noteImportFile').val(''); + }; + + $scope.uploadFile = function() { + angular.element('#noteImportFile').click(); + }; + + $scope.importFile = function(element) { + $scope.note.errorText = ''; + $scope.note.importFile = element.files[0]; + var file = $scope.note.importFile; + var reader = new FileReader(); + + reader.onloadend = function() { + vm.processImportJson(reader.result); + }; + + if (file) { + reader.readAsText(file); + } + }; + + $scope.uploadURL = function() { + $scope.note.errorText = ''; + $scope.note.step1 = false; + $timeout(function() { + $scope.note.step2 = true; + }, 400); + }; + + vm.importBack = function() { + $scope.note.errorText = ''; + $timeout(function() { + $scope.note.step1 = true; + }, 400); + $scope.note.step2 = false; + }; + + vm.importNote = function() { + $scope.note.errorText = ''; + if ($scope.note.importUrl) { + jQuery.getJSON($scope.note.importUrl, function(result) { + vm.processImportJson(result); + }).fail(function() { + $scope.note.errorText = 'Unable to Fetch URL'; + $scope.$apply(); + }); + } + else { + $scope.note.errorText = 'Enter URL'; + $scope.$apply(); + } + }; + + vm.processImportJson = function(result) { + if (typeof result !== 'object') { + try { + result = JSON.parse(result); + } catch (e) { + $scope.note.errorText = 'JSON parse exception'; + $scope.$apply(); + return; + } + + } + if (result.paragraphs && result.paragraphs.length > 0) { + if (!$scope.note.noteImportName) { + $scope.note.noteImportName = result.name; + } else { + result.name = $scope.note.noteImportName; + } + websocketMsgSrv.importNotebook(result); + //angular.element('#noteImportModal').modal('hide'); + } else { + $scope.note.errorText = 'Invalid JSON'; + } + $scope.$apply(); + }; + + $scope.$on('setNoteMenu', function(event, notes) { + vm.resetFlags(); + angular.element('#noteImportModal').modal('hide'); + }); +}); diff --git a/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js b/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js index 60225432ab7..a10bc875242 100644 --- a/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js +++ b/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js @@ -113,6 +113,15 @@ angular.module('zeppelinWebApp').service('websocketMsgSrv', function($rootScope, }); }, + importNotebook: function(notebook) { + websocketEvents.sendNewEvent({ + op: 'IMPORT_NOTE', + data: { + notebook: notebook + } + }); + }, + isConnected: function(){ return websocketEvents.isConnected(); } diff --git a/zeppelin-web/src/index.html b/zeppelin-web/src/index.html index b8dd48911ad..0d065a55e09 100644 --- a/zeppelin-web/src/index.html +++ b/zeppelin-web/src/index.html @@ -73,6 +73,9 @@
      +
      +
      +
      +
    • Overview
    • + + +
    • Install
    • +
    • YARN Install
    • + + +
    • Tutorial
    • + + +
    • Dynamic Form
    • +
    + +
  • + Interpreter + +
  • +
  • + Display System + +
  • +
  • + More + +
  • diff --git a/docs/assets/themes/zeppelin/css/style.css b/docs/assets/themes/zeppelin/css/style.css index d54df95f67a..98aca0b883d 100644 --- a/docs/assets/themes/zeppelin/css/style.css +++ b/docs/assets/themes/zeppelin/css/style.css @@ -11,9 +11,7 @@ body { } .navbar-brand { - padding: 12px 12px; - padding-top: 15px; - padding-bottom: 10px; + padding: 15px 5px; } .navbar { @@ -351,3 +349,29 @@ and (max-width : 1024px) { padding-right: 0; } } + + +/* docs dropdown menu */ +#menu { + +} + +#menu .dropdown-menu li span { + padding : 3px 10px 10px 10px; + font-size: 13px; + +} + +#menu .caret { + border-top-color: white; + border-bottom-color: white; +} + +#menu .open .caret { + border-top-color: #428bca; + border-bottom-color: #428bca; +} + +#menu .navbar-nav { + margin-left:50px; +} From 4af49ca8e088bb691884edd6440ba1654ea8d199 Mon Sep 17 00:00:00 2001 From: Jongyoul Lee Date: Wed, 25 Nov 2015 10:09:35 +0900 Subject: [PATCH 067/491] [Minor] Fix travis setting for testing Spark 1.5.x Zeppelin builds Spark 1.4 by default. For testing Spark 1.5.x, we should use `-Pspark-1.5` Author: Jongyoul Lee Closes #462 from jongyoul/fix-travis-spark-1.5 and squashes the following commits: 3b68461 [Jongyoul Lee] [Minor] Fix travis setting for testing Spark 1.5.x 1c75c2c [Jongyoul Lee] [Minor] Fix travis setting for testing Spark 1.5.x 46a10e7 [Jongyoul Lee] [Minor] Fix travis setting for testing Spark 1.5.x --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 213fc5687e3..ad6ff569dde 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,17 +22,17 @@ before_install: - "sh -e /etc/init.d/xvfb start" install: - - mvn package -DskipTests -Phadoop-2.3 -Ppyspark -B + - mvn package -DskipTests -Pspark-1.5 -Phadoop-2.3 -Ppyspark -B before_script: - script: # spark 1.5 - - mvn package -Pbuild-distr -Phadoop-2.3 -Ppyspark -B + - mvn package -Pbuild-distr -Pspark-1.5 -Phadoop-2.3 -Ppyspark -B - ./testing/startSparkCluster.sh 1.5.2 2.3 - echo "export SPARK_HOME=`pwd`/spark-1.5.2-bin-hadoop2.3" > conf/zeppelin-env.sh - - mvn verify -Pusing-packaged-distr -Phadoop-2.3 -Ppyspark -B + - mvn verify -Pusing-packaged-distr -Pspark-1.5 -Phadoop-2.3 -Ppyspark -B - ./testing/stopSparkCluster.sh 1.5.2 2.3 # spark 1.4 - rm -rf `pwd`/interpreter/spark From 74b1f0c977628bd2b24483a7a0fa3c25ebf42776 Mon Sep 17 00:00:00 2001 From: astroshim Date: Sun, 22 Nov 2015 01:27:59 +0900 Subject: [PATCH 068/491] Improve storing notebook. This PR relates to: https://issues.apache.org/jira/browse/ZEPPELIN-454 Storing the notebook process changed. (store".note.json" temporary file first and if it is succeed ".note.json" move to "note.json") Author: astroshim Closes #457 from astroshim/issue-454 and squashes the following commits: 5a66bff [astroshim] change way storing notebook. --- .../org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java index 3039f80ff7d..58f36f298c4 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java @@ -214,11 +214,12 @@ public void save(Note note) throws IOException { throw new IOException(noteDir.getName().toString() + " is not a directory"); } - FileObject noteJson = noteDir.resolveFile("note.json", NameScope.CHILD); + FileObject noteJson = noteDir.resolveFile(".note.json", NameScope.CHILD); // false means not appending. creates file if not exists OutputStream out = noteJson.getContent().getOutputStream(false); out.write(json.getBytes(conf.getString(ConfVars.ZEPPELIN_ENCODING))); out.close(); + noteJson.moveTo(noteDir.resolveFile("note.json", NameScope.CHILD)); } @Override From 1285f4fbd8fa21b256ffa7e927ac0792829cd2ee Mon Sep 17 00:00:00 2001 From: Jongyoul Lee Date: Tue, 24 Nov 2015 17:06:49 +0900 Subject: [PATCH 069/491] ZEPPELIN-458 Fix testAbortParagraphStatusOnInterpreterRestart - Changed how to check some paragraph is aborted - See the https://issues.apache.org/jira/browse/ZEPPELIN-458 for more details Author: Jongyoul Lee Closes #468 from jongyoul/ZEPPELIN-458 and squashes the following commits: d41e53d [Jongyoul Lee] ZEPPELIN-458 Fix testAbortParagraphStatusOnInterpreterRestart - Changed how to check some paragraph is aborted --- .../zeppelin/notebook/NotebookTest.java | 65 +++++++++---------- 1 file changed, 29 insertions(+), 36 deletions(-) diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java index 8ae0970868b..ee35773b12f 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/NotebookTest.java @@ -25,6 +25,7 @@ import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -48,8 +49,11 @@ import org.junit.Before; import org.junit.Test; import org.quartz.SchedulerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class NotebookTest implements JobListenerFactory{ + private static final Logger logger = LoggerFactory.getLogger(NotebookTest.class); private File tmpDir; private ZeppelinConfiguration conf; @@ -228,7 +232,7 @@ public void testSchedule() throws InterruptedException, IOException{ note.setConfig(config); notebook.refreshCron(note.id()); Thread.sleep(1*1000); - + // remove cron scheduler. config.put("cron", null); note.setConfig(config); @@ -319,46 +323,35 @@ public void testAbortParagraphStatusOnInterpreterRestart() throws InterruptedExc Note note = notebook.createNote(); note.getNoteReplLoader().setInterpreters(factory.getDefaultInterpreterSettingList()); - Paragraph p1 = note.addParagraph(); - p1.setText("p1"); - Paragraph p2 = note.addParagraph(); - p2.setText("p2"); - Paragraph p3 = note.addParagraph(); - p3.setText("p3"); - Paragraph p4 = note.addParagraph(); - p4.setText("p4"); - - /* all jobs are ready to run */ - assertEquals(Job.Status.READY, p1.getStatus()); - assertEquals(Job.Status.READY, p2.getStatus()); - assertEquals(Job.Status.READY, p3.getStatus()); - assertEquals(Job.Status.READY, p4.getStatus()); - - /* run all */ - note.runAll(); + ArrayList paragraphs = new ArrayList<>(); + for (int i = 0; i < 100; i++) { + Paragraph tmp = note.addParagraph(); + tmp.setText("p" + tmp.getId()); + paragraphs.add(tmp); + } - /* all are pending in the beginning (first one possibly started)*/ - assertTrue(p1.getStatus() == Job.Status.PENDING || p1.getStatus() == Job.Status.RUNNING); - assertEquals(Job.Status.PENDING, p2.getStatus()); - assertEquals(Job.Status.PENDING, p3.getStatus()); - assertEquals(Job.Status.PENDING, p4.getStatus()); + for (Paragraph p : paragraphs) { + assertEquals(Job.Status.READY, p.getStatus()); + } - /* wait till first job is terminated and second starts running */ - while(p1.isTerminated() == false || (p2.getStatus() == Job.Status.PENDING)) Thread.yield(); + note.runAll(); - assertEquals(Job.Status.FINISHED, p1.getStatus()); - assertEquals(Job.Status.RUNNING, p2.getStatus()); - assertEquals(Job.Status.PENDING, p3.getStatus()); - assertEquals(Job.Status.PENDING, p4.getStatus()); + while (paragraphs.get(0).getStatus() != Status.FINISHED) Thread.yield(); - /* restart interpreter */ factory.restart(note.getNoteReplLoader().getInterpreterSettings().get(0).id()); - /* pending and running jobs have been aborted */ - assertEquals(Job.Status.FINISHED, p1.getStatus()); - assertEquals(Job.Status.ABORT, p2.getStatus()); - assertEquals(Job.Status.ABORT, p3.getStatus()); - assertEquals(Job.Status.ABORT, p4.getStatus()); + boolean isAborted = false; + for (Paragraph p : paragraphs) { + logger.debug(p.getStatus().name()); + if (isAborted) { + assertEquals(Job.Status.ABORT, p.getStatus()); + } + if (p.getStatus() == Status.ABORT) { + isAborted = true; + } + } + + assertTrue(isAborted); } private void delete(File file){ @@ -373,7 +366,7 @@ else if(file.isDirectory()){ file.delete(); } } - + @Override public JobListener getParagraphJobListener(Note note) { return new JobListener(){ From a30aeb06b0f432eb5c4596aeaa803fd0ab12e259 Mon Sep 17 00:00:00 2001 From: Renjith Kamath Date: Thu, 26 Nov 2015 11:16:59 +0530 Subject: [PATCH 070/491] Add basic documentation for Markdown Author: Renjith Kamath Closes #467 from r-kamath/markdownDocUpdate and squashes the following commits: 3ebed22 [Renjith Kamath] update top nav and add basepath f7e954a [Renjith Kamath] Merge branch 'master' of https://github.com/apache/incubator-zeppelin into markdownDocUpdate d839992 [Renjith Kamath] add link to markdown4j page 95442b4 [Renjith Kamath] Merge branch 'master' of https://github.com/apache/incubator-zeppelin into markdownDocUpdate e429355 [Renjith Kamath] Add basic documentation for Markdown --- .../themes/zeppelin/_navigation.html | 2 +- .../img/docs-img/markdown-example.png | Bin 0 -> 69359 bytes .../docs-img/markdown-interpreter-setting.png | Bin 0 -> 32571 bytes docs/docs.md | 2 +- docs/interpreter/markdown.md | 22 ++++++++++++++++++ 5 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 docs/assets/themes/zeppelin/img/docs-img/markdown-example.png create mode 100644 docs/assets/themes/zeppelin/img/docs-img/markdown-interpreter-setting.png create mode 100644 docs/interpreter/markdown.md diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html index c3f89560355..10e97e5f60a 100644 --- a/docs/_includes/themes/zeppelin/_navigation.html +++ b/docs/_includes/themes/zeppelin/_navigation.html @@ -40,7 +40,7 @@
  • Hive
  • Ignite
  • Lens
  • -
  • Markdown
  • +
  • Markdown
  • Postgresql, hawq
  • Shell
  • Spark
  • diff --git a/docs/assets/themes/zeppelin/img/docs-img/markdown-example.png b/docs/assets/themes/zeppelin/img/docs-img/markdown-example.png new file mode 100644 index 0000000000000000000000000000000000000000..128d43563910078c0685c701f4307df6dd9acf9a GIT binary patch literal 69359 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 @I=92$u`16yZ!M#`PW^%YBRqJm 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 c?k{|Ob*#N$rTLF;_ZS&M-G2R#aI>Hq)$ literal 0 HcmV?d00001 diff --git a/docs/docs.md b/docs/docs.md index 28ee73a09d2..8e338f76498 100644 --- a/docs/docs.md +++ b/docs/docs.md @@ -38,7 +38,7 @@ limitations under the License. * [hive](./pleasecontribute.html) * [ignite](./interpreter/ignite.html) * [lens](./interpreter/lens.html) -* [md](./pleasecontribute.html) +* [md](./interpreter/markdown.html) * [postgresql, hawq](./interpreter/postgresql.html) * [sh](./pleasecontribute.html) * [spark](./interpreter/spark.html) diff --git a/docs/interpreter/markdown.md b/docs/interpreter/markdown.md new file mode 100644 index 00000000000..7c339d25083 --- /dev/null +++ b/docs/interpreter/markdown.md @@ -0,0 +1,22 @@ +--- +layout: page +title: "Markdown Interpreter" +description: "Markdown Interpreter" +group: manual +--- +{% include JB/setup %} + +## Markdown Interpreter for Apache Zeppelin + +### Overview +[Markdown](http://daringfireball.net/projects/markdown/) is a plain text formatting syntax designed so that it can be converted to HTML. +Zeppelin uses markdown4j, for more examples and extension support checkout [markdown4j](https://code.google.com/p/markdown4j/) +In Zeppelin notebook you can use ``` %md ``` in the beginning of a paragraph to invoke the Markdown interpreter to generate static html from Markdown plain text. + +In Zeppelin, Markdown interpreter is enabled by default. + + +### Example +The following example demonstrates the basic usage of Markdown in a Zeppelin notebook. + + From 4b55a9c0235ee7a2ecc2b3088226cf4cc9ae87ad Mon Sep 17 00:00:00 2001 From: Felix Cheung Date: Wed, 25 Nov 2015 18:56:45 -0800 Subject: [PATCH 071/491] [ZEPPELIN-466][DOCS] fix typos PostgreSQL doc just notice this has typos too Author: Felix Cheung Closes #475 from felixcheung/postgresdoc and squashes the following commits: 08baa89 [Felix Cheung] fix broken link 3f728f3 [Felix Cheung] fix typos --- docs/interpreter/postgresql.md | 42 ++++++++++++++++------------------ 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/docs/interpreter/postgresql.md b/docs/interpreter/postgresql.md index 9753cdc1f69..9d3a2837c3e 100644 --- a/docs/interpreter/postgresql.md +++ b/docs/interpreter/postgresql.md @@ -19,7 +19,7 @@ group: manual %psql.sql PostgreSqlInterpreter - Provides SQL environment for Postgresql, HAWQ and Greenplum + Provides SQL environment for PostgreSQL, HAWQ and Greenplum @@ -28,22 +28,22 @@ group: manual This interpreter seamlessly supports the following SQL data processing engines: -* [PostgreSQL](http://www.postgresql.org/) - OSS, Object-relational database management system (ORDBMS) -* [Apache HAWQ](http://pivotal.io/big-data/pivotal-hawq) - Powerful [Open Source](https://wiki.apache.org/incubator/HAWQProposal) SQL-On-Hadoop engine. +* [PostgreSQL](http://www.postgresql.org/) - OSS, Object-relational database management system (ORDBMS) +* [Apache HAWQ](http://pivotal.io/big-data/pivotal-hawq) - Powerful [Open Source](https://wiki.apache.org/incubator/HAWQProposal) SQL-On-Hadoop engine. * [Greenplum](http://pivotal.io/big-data/pivotal-greenplum-database) - MPP database built on open source PostgreSQL. This [Video Tutorial](https://www.youtube.com/watch?v=wqXXQhJ5Uk8) illustrates some of the features provided by the `Postgresql Interpreter`. -### Create Interpreter +### Create Interpreter -By default Zeppelin creates one `PSQL` instance. You can remove it or create new instances. +By default Zeppelin creates one `PSQL` instance. You can remove it or create new instances. -Multiple PSQL instances can be created, each configured to the same or different backend databases. But over time a `Notebook` can have only one PSQL interpreter instance `bound`. That means you _can not_ connect to different databases in the same `Notebook`. This is a known Zeppelin limitation. +Multiple PSQL instances can be created, each configured to the same or different backend databases. But over time a `Notebook` can have only one PSQL interpreter instance `bound`. That means you _cannot_ connect to different databases in the same `Notebook`. This is a known Zeppelin limitation. -To create new PSQL instance open the `Interprter` section and click the `+Create` button. Pick a `Name` of your choice and from the `Interpreter` drop-down select `psql`. Then follow the configuration instructions and `Save` the new instance. +To create new PSQL instance open the `Interpreter` section and click the `+Create` button. Pick a `Name` of your choice and from the `Interpreter` drop-down select `psql`. Then follow the configuration instructions and `Save` the new instance. -> Note: The `Name` of the instance is used only to distinct the instances while binding them to the `Notebook`. The `Name` is irrelevant inside the `Notebook`. In the `Notebook` you must use `%psql.sql` tag. +> Note: The `Name` of the instance is used only to distinct the instances while binding them to the `Notebook`. The `Name` is irrelevant inside the `Notebook`. In the `Notebook` you must use `%psql.sql` tag. ### Bind to Notebook In the `Notebook` click on the `settings` icon in the top right corner. The select/deselect the interpreters to be bound with the `Notebook`. @@ -51,7 +51,7 @@ In the `Notebook` click on the `settings` icon in the top right corner. The sele ### Configuration You can modify the configuration of the PSQL from the `Interpreter` section. The PSQL interpreter expenses the following properties: - + @@ -84,15 +84,15 @@ You can modify the configuration of the PSQL from the `Interpreter` section. Th
    Property Name1000
    - - + + ### How to use ``` Tip: Use (CTRL + .) for SQL auto-completion. ``` #### DDL and SQL commands -Start the paragraphs with the full `%psql.sql` prefix tag! The short notation: `%psql` would still be able run the queries but the syntax highlighting and the auto-completions will be disabled. +Start the paragraphs with the full `%psql.sql` prefix tag! The short notation: `%psql` would still be able run the queries but the syntax highlighting and the auto-completions will be disabled. You can use the standard CREATE / DROP / INSERT commands to create or modify the data model: @@ -147,14 +147,14 @@ This will produce output like this: #### Apply Zeppelin Dynamic Forms -You can leverage [Zepplein Dynamic Form](https://zeppelin.incubator.apache.org/docs/manual/dynamicform.html) inside your queries. You can use both the `text input` and `select form` parametrization features +You can leverage [Zeppelin Dynamic Form](../manual/dynamicform.html) inside your queries. You can use both the `text input` and `select form` parametrization features ```sql %psql.sql -SELECT ${group_by}, count(*) as count -FROM retail_demo.order_lineitems_pxf -GROUP BY ${group_by=product_id,product_id|product_name|customer_id|store_id} -ORDER BY count ${order=DESC,DESC|ASC} +SELECT ${group_by}, count(*) as count +FROM retail_demo.order_lineitems_pxf +GROUP BY ${group_by=product_id,product_id|product_name|customer_id|store_id} +ORDER BY count ${order=DESC,DESC|ASC} LIMIT ${limit=10}; ``` #### Example HAWQ PXF/HDFS Tables @@ -172,9 +172,7 @@ And retrieve content ```sql %psql.sql -seelect * from retail_demo.payment_methods_pxf +select * from retail_demo.payment_methods_pxf ``` -### Auto-completion -The PSQL Interpreter provides a basic auto-completion functionality. On `(Ctrl+.)` it list the most relevant suggesntions in a pop-up window. In addition to the SQL keyword the interpter provides suggestions for the Schema, Table, Column names as well. - - +### Auto-completion +The PSQL Interpreter provides a basic auto-completion functionality. On `(Ctrl+.)` it list the most relevant suggestions in a pop-up window. In addition to the SQL keyword the interpreter provides suggestions for the Schema, Table, Column names as well. From e5089bb4134fcbd50ae1fc09660d1c4dd6b6ffc9 Mon Sep 17 00:00:00 2001 From: Jongyoul Lee Date: Tue, 24 Nov 2015 14:36:07 +0900 Subject: [PATCH 072/491] [Minor] Possible to make a hang while integration test There are three status of completion of paragraph.run. with Status.FINISHED only, that makes tests hang because other status returns. Fast fail will help to fix it. Author: Jongyoul Lee Closes #466 from jongyoul/hang-while-itegration-test and squashes the following commits: c482641 [Jongyoul Lee] [Minor] Possible to make a hang while integration test --- .../zeppelin/rest/ZeppelinSparkClusterTest.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java index 7076a796e8b..ffe5d545b02 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinSparkClusterTest.java @@ -54,7 +54,9 @@ public static void destroy() throws Exception { } private void waitForFinish(Paragraph p) { - while (p.getStatus() != Status.FINISHED) { + while (p.getStatus() != Status.FINISHED + && p.getStatus() != Status.ERROR + && p.getStatus() != Status.ABORT) { try { Thread.sleep(100); } catch (InterruptedException e) { @@ -76,6 +78,7 @@ public void basicRDDTransformationAndActionTest() throws IOException { p.setText("%spark print(sc.parallelize(1 to 10).reduce(_ + _))"); note.run(p.getId()); waitForFinish(p); + assertEquals(Status.FINISHED, p.getStatus()); assertEquals("55", p.getResult().message()); ZeppelinServer.notebook.removeNote(note.id()); } @@ -95,6 +98,7 @@ public void pySparkTest() throws IOException { p.setText("%pyspark print(sc.parallelize(range(1, 11)).reduce(lambda a, b: a + b))"); note.run(p.getId()); waitForFinish(p); + assertEquals(Status.FINISHED, p.getStatus()); assertEquals("55\n", p.getResult().message()); } ZeppelinServer.notebook.removeNote(note.id()); @@ -117,6 +121,7 @@ public void pySparkAutoConvertOptionTest() throws IOException { + "print(sqlContext.range(0, 10).withColumn('uniform', rand(seed=10) * 3.14).count())"); note.run(p.getId()); waitForFinish(p); + assertEquals(Status.FINISHED, p.getStatus()); assertEquals("10\n", p.getResult().message()); } ZeppelinServer.notebook.removeNote(note.id()); @@ -144,9 +149,11 @@ public void zRunTest() throws IOException { note.run(p0.getId()); waitForFinish(p0); + assertEquals(Status.FINISHED, p0.getStatus()); note.run(p2.getId()); waitForFinish(p2); + assertEquals(Status.FINISHED, p2.getStatus()); assertEquals("10", p2.getResult().message()); ZeppelinServer.notebook.removeNote(note.id()); @@ -177,6 +184,7 @@ public void pySparkDepLoaderTest() throws IOException { p0.setText("%dep z.load(\"com.databricks:spark-csv_2.11:1.2.0\")"); note.run(p0.getId()); waitForFinish(p0); + assertEquals(Status.FINISHED, p0.getStatus()); // write test csv file File tmpFile = File.createTempFile("test", "csv"); @@ -192,6 +200,7 @@ public void pySparkDepLoaderTest() throws IOException { note.run(p1.getId()); waitForFinish(p1); + assertEquals(Status.FINISHED, p1.getStatus()); assertEquals("2\n", p1.getResult().message()); } } @@ -208,6 +217,7 @@ private int getSparkVersionNumber(Note note) { p.setText("%spark print(sc.version)"); note.run(p.getId()); waitForFinish(p); + assertEquals(Status.FINISHED, p.getStatus()); String sparkVersion = p.getResult().message(); System.out.println("Spark version detected " + sparkVersion); String[] split = sparkVersion.split("\\."); From bd8c9ea402699e5a607611c3bfcaeec982536219 Mon Sep 17 00:00:00 2001 From: Felix Cheung Date: Sat, 28 Nov 2015 11:26:37 -0800 Subject: [PATCH 073/491] [ZEPPELIN-461] fix typos in geode doc Author: Felix Cheung Closes #471 from felixcheung/doctypo and squashes the following commits: 4e5b235 [Felix Cheung] fix link for dynamic form 4fba563 [Felix Cheung] more typos 792b15f [Felix Cheung] fix typos --- docs/interpreter/geode.md | 46 +++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/docs/interpreter/geode.md b/docs/interpreter/geode.md index 96d1c049d46..250495aaf2f 100644 --- a/docs/interpreter/geode.md +++ b/docs/interpreter/geode.md @@ -37,23 +37,23 @@ This interpreter supports the [Geode](http://geode.incubator.apache.org/) [Objec This [Video Tutorial](https://www.youtube.com/watch?v=zvzzA9GXu3Q) illustrates some of the features provided by the `Geode Interpreter`. -### Create Interpreter +### Create Interpreter -By default Zeppelin creates one `Geode/OQL` instance. You can remove it or create more instances. +By default Zeppelin creates one `Geode/OQL` instance. You can remove it or create more instances. -Multiple Geode instances can be created, each configured to the same or different backend Geode cluster. But over time a `Notebook` can have only one Geode interpreter instance `bound`. That means you _can not_ connect to different Geode clusters in the same `Notebook`. This is a known Zeppelin limitation. +Multiple Geode instances can be created, each configured to the same or different backend Geode cluster. But over time a `Notebook` can have only one Geode interpreter instance `bound`. That means you _cannot_ connect to different Geode clusters in the same `Notebook`. This is a known Zeppelin limitation. -To create new Geode instance open the `Interprter` section and click the `+Create` button. Pick a `Name` of your choice and from the `Interpreter` drop-down select `geode`. Then follow the configuration instructions and `Save` the new instance. +To create new Geode instance open the `Interpreter` section and click the `+Create` button. Pick a `Name` of your choice and from the `Interpreter` drop-down select `geode`. Then follow the configuration instructions and `Save` the new instance. -> Note: The `Name` of the instance is used only to distinct the instances while binding them to the `Notebook`. The `Name` is irrelevant inside the `Notebook`. In the `Notebook` you must use `%geode.oql` tag. +> Note: The `Name` of the instance is used only to distinguish the instances while binding them to the `Notebook`. The `Name` is irrelevant inside the `Notebook`. In the `Notebook` you must use `%geode.oql` tag. ### Bind to Notebook In the `Notebook` click on the `settings` icon in the top right corner. The select/deselect the interpreters to be bound with the `Notebook`. ### Configuration -You can modify the configuration of the Geode from the `Interpreter` section. The Geode interpreter express the following properties: +You can modify the configuration of the Geode from the `Interpreter` section. The Geode interpreter expresses the following properties: + - @@ -76,16 +76,16 @@ You can modify the configuration of the Geode from the `Interpreter` section. T
    Property Name1000
    - + ### How to use > *Tip 1: Use (CTRL + .) for OQL auto-completion.* -> *Tip 2: Alawys start the paragraphs with the full `%geode.oql` prefix tag! The short notation: `%geode` would still be able run the OQL queries but the syntax highlighting and the auto-completions will be disabled.* +> *Tip 2: Always start the paragraphs with the full `%geode.oql` prefix tag! The short notation: `%geode` would still be able run the OQL queries but the syntax highlighting and the auto-completions will be disabled.* #### Create / Destroy Regions -The OQL sepecification does not support [Geode Regions](https://cwiki.apache.org/confluence/display/GEODE/Index#Index-MainConceptsandComponents) mutation operations. To `creaate`/`destroy` regions one should use the [GFSH](http://geode-docs.cfapps.io/docs/tools_modules/gfsh/chapter_overview.html) shell tool instead. To wokr this it assumes that the GFSH is colocated with Zeppelin server. +The OQL specification does not support [Geode Regions](https://cwiki.apache.org/confluence/display/GEODE/Index#Index-MainConceptsandComponents) mutation operations. To `create`/`destroy` regions one should use the [GFSH](http://geode-docs.cfapps.io/docs/tools_modules/gfsh/chapter_overview.html) shell tool instead. In the following it is assumed that the GFSH is colocated with Zeppelin server. ```bash %sh @@ -98,26 +98,26 @@ gfsh << EOF destroy region --name=/regionCompany create region --name=regionEmployee --type=REPLICATE create region --name=regionCompany --type=REPLICATE - + exit; EOF ``` -Above snippet re-creates two regions: `regionEmployee` and `regionCompany`. Note that you have to explicetely specify the locator host and port. The values should match those you have used in the Geode Interpreter configuration. Comprehensive list of [GFSH Commands by Functional Area](http://geode-docs.cfapps.io/docs/tools_modules/gfsh/gfsh_quick_reference.html). +Above snippet re-creates two regions: `regionEmployee` and `regionCompany`. Note that you have to explicitly specify the locator host and port. The values should match those you have used in the Geode Interpreter configuration. Comprehensive list of [GFSH Commands by Functional Area](http://geode-docs.cfapps.io/docs/tools_modules/gfsh/gfsh_quick_reference.html). #### Basic OQL -```sql -%geode.oql -SELECT count(*) FROM /regionEmploee +```sql +%geode.oql +SELECT count(*) FROM /regionEmployee ``` OQL `IN` and `SET` filters: ```sql %geode.oql -SELECT * FROM /regionEmployee +SELECT * FROM /regionEmployee WHERE companyId IN SET(2) OR lastName IN SET('Tzolov13', 'Tzolov73') ``` @@ -126,15 +126,15 @@ OQL `JOIN` operations ```sql %geode.oql SELECT e.employeeId, e.firstName, e.lastName, c.id as companyId, c.companyName, c.address -FROM /regionEmployee e, /regionCompany c +FROM /regionEmployee e, /regionCompany c WHERE e.companyId = c.id ``` -By default the QOL responses contain only the region entry values. To access the keys, query the `EntrySet` instead: +By default the QOL responses contain only the region entry values. To access the keys, query the `EntrySet` instead: ```sql %geode.oql -SELECT e.key, e.value.companyId, e.value.email +SELECT e.key, e.value.companyId, e.value.email FROM /regionEmployee.entrySet e ``` Following query will return the EntrySet value as a Blob: @@ -160,7 +160,7 @@ gfsh -e "connect" -e "list members" #### Apply Zeppelin Dynamic Forms -You can leverage [Zepplein Dynamic Form](https://zeppelin.incubator.apache.org/docs/manual/dynamicform.html) inside your OQL queries. You can use both the `text input` and `select form` parametrization features +You can leverage [Zeppelin Dynamic Form](../manual/dynamicform.html) inside your OQL queries. You can use both the `text input` and `select form` parameterization features ```sql %geode.oql @@ -197,7 +197,5 @@ http-service-port=8484 start-dev-rest-api=true ``` -### Auto-completion -The Geode Interpreter provides a basic auto-completion functionality. On `(Ctrl+.)` it list the most relevant suggesntions in a pop-up window. - - +### Auto-completion +The Geode Interpreter provides a basic auto-completion functionality. On `(Ctrl+.)` it list the most relevant suggestions in a pop-up window. From 3478f960fbeb48d9733ba42dcc13622c2b447887 Mon Sep 17 00:00:00 2001 From: Ryu Ah young Date: Thu, 26 Nov 2015 17:11:13 +0900 Subject: [PATCH 074/491] Modify style.css for the aesthetically pleasant documentation I closed last PR because of my mistake. Last one is [here](https://github.com/apache/incubator-zeppelin/pull/469). I apologize to any confusion. Once again, this PR result is 1. Resize hn tag font & Add bottom-border to h2, h3 tag (Because these tags are used a lot for the title.) & Adjust table size to web page border - Before ![before resize](https://github.com/AhyoungRyu/Platform-Documentation/blob/master/compared_img/BeforeHn.png?raw=true) - After ![After resize](https://github.com/AhyoungRyu/Platform-Documentation/blob/master/compared_img/AfterHn.png?raw=true) 2. Change code color & Arrange code font size ![img1](https://github.com/AhyoungRyu/Platform-Documentation/blob/master/compared_img/Code%20Color%20&%20Size.png?raw=true) 3. Change Code font-family and reduce the font size - Before ![before](https://github.com/AhyoungRyu/Platform-Documentation/blob/master/compared_img/BeforeCode.png?raw=true) - After ![after](https://github.com/AhyoungRyu/Platform-Documentation/blob/master/compared_img/AfterCode.png?raw=true) 4. Increase padding size between p, block quote, table, pre, img Author: Ryu Ah young Closes #477 from AhyoungRyu/ZEPPELIN-460-new and squashes the following commits: 3d005ee [Ryu Ah young] Modify style.css for the aesthetically pleasant documentation --- docs/assets/themes/zeppelin/css/style.css | 132 ++++++++++++++++++++-- 1 file changed, 123 insertions(+), 9 deletions(-) diff --git a/docs/assets/themes/zeppelin/css/style.css b/docs/assets/themes/zeppelin/css/style.css index 98aca0b883d..b0f594a467a 100644 --- a/docs/assets/themes/zeppelin/css/style.css +++ b/docs/assets/themes/zeppelin/css/style.css @@ -11,7 +11,9 @@ body { } .navbar-brand { - padding: 15px 5px; + padding: 12px 12px; + padding-top: 0px; + padding-bottom: 0px; } .navbar { @@ -195,7 +197,7 @@ body { /* Table for property */ .table-configuration { - width : 800px; + width : 100%; border : 1px solid gray; } .table-configuration tr td { @@ -218,15 +220,127 @@ body { transform: rotate(270deg); } +/* Custom container */ +/*
    */ +.container a { + color: #4183C4; } +a.absent { + color: #cc0000; } +a.anchor { + display: block; + padding-left: 30px; + margin-left: -30px; + cursor: pointer; + position: absolute; + top: 0; + left: 0; + bottom: 0; +} + +/* */ +.container h1, h2, h3, h4, h5, h6 { + margin: 20px 0 10px; + padding: 0; + font-weight: bold; + -webkit-font-smoothing: antialiased; + cursor: text; + position: relative; } +.container h1 { + font-size: 30px; + color: black; } +.container h2 { + font-size: 28px; + padding-top: 5px; + padding-bottom: 5px; + border-bottom: 1px solid #E5E5E5;} +.container h3 { + font-size: 22px; + padding-top: 5px; + padding-bottom: 5px; + border-bottom: 1px solid #E5E5E5;} +.container h4 { + font-size: 18px; } +.container h5 { + font-size: 14px; } +.container h6 { + font-size: 14px; + color: #777777;} + +/* */ +.container li { + margin: 0; } +.container li p.first { + display: inline-block;} +.container ul :first-child, ol :first-child { + margin-top: 0; +} + +/* */ + .container table { + width : 100%; + padding: 0; + border-collapse: collapse; } +.container table tr { + border-top: 1px solid #cccccc; + background-color: white; + margin: 0; + padding: 0; } +.container table tr th { + text-align: center; + font-weight: bold; + border: 1px solid #cccccc; + margin: 0; + padding: 6px 13px; } +.container table tr td { + border: 1px solid #cccccc; + margin: 0; + padding: 6px 13px; +} + +/* */ +.container code{ + color:#000000; + font-size: 90%; + font-family: "Menlo", "Lucida Console", monospace; + background-color: #f8f8f8; + border: 1px solid #cccccc; +} + +/*
     */
    +.container pre {
    +    background-color: #f8f8f8;
    +    border: 1px solid #cccccc;
    +    line-height: 19px;
    +    overflow: auto;
    +    padding: 6px 10px;
    +    border-radius: 3px;}
    +.container pre code {
    +    font-size: 95%;
    +    margin: 0;
    +    padding: 0;
    +    white-space: pre;
    +    border: none;
    +    background: transparent;
    +}
    +
    +/* 
    */ +.container blockquote { + border-left: 4px solid #dddddd; + padding: 0 15px; + color: #777777; } +.container blockquote > :first-child { + margin-top: 0; } +.container blockquote > :last-child { + margin-bottom: 0; } +.container blockquote p{ + font-size: 14px; +} +/*

    ,

    ,
    ,
    ,  margin */
    +.container p, blockquote, table, pre, img {
    +    margin: 12px 0; 
    +}
     
    -
    -
    -
    -
    -
    -
    -/* Custom container */
     .container-narrow {
       margin: 0 auto;
     /*  max-width: 960px; */
    
    From 8c330a4873625ece3060680e9b656745f89bf257 Mon Sep 17 00:00:00 2001
    From: Renjith Kamath 
    Date: Thu, 26 Nov 2015 14:19:54 +0530
    Subject: [PATCH 075/491] Fix paragraph actions dropdown styling for Firefox
    
    Before on Firefox
    screen shot 2015-11-26 at 12 39 21 pm
    
    After on Firefox
    screen shot 2015-11-26 at 2 18 43 pm
    
    Author: Renjith Kamath 
    
    Closes #478 from r-kamath/firefoxMenuStyleFix and squashes the following commits:
    
    5176869 [Renjith Kamath] Fix paragraph actions dropdown styling for Firefox
    ---
     .../src/app/notebook/paragraph/paragraph.css  | 10 +++-
     .../src/app/notebook/paragraph/paragraph.html | 59 ++++++++-----------
     2 files changed, 34 insertions(+), 35 deletions(-)
    
    diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.css b/zeppelin-web/src/app/notebook/paragraph/paragraph.css
    index 6d413c666da..87a3e30759a 100644
    --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.css
    +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.css
    @@ -73,7 +73,7 @@
       border: 3px solid #DDDDDD;
     }
     
    -.paragraph .paragraphFooter { 
    +.paragraph .paragraphFooter {
       height: 9px;
     }
     
    @@ -182,6 +182,14 @@
       color: #333333;
     }
     
    +/*
    +  Paragraph Menu
    +*/
    +
    +.dropdown-menu > li > a {
    +  cursor: pointer;
    +}
    +
     /*
       Paragraph Title
     */
    diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.html b/zeppelin-web/src/app/notebook/paragraph/paragraph.html
    index 3ad3e315e7f..0edf43ed214 100644
    --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.html
    +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.html
    @@ -425,59 +425,50 @@
           
           
         
    @@ -487,5 +478,5 @@
         
    - + From a6187df255f12eac41cb8828d07730fdc614c7da Mon Sep 17 00:00:00 2001 From: Prabhjyot Singh Date: Thu, 26 Nov 2015 16:30:58 +0530 Subject: [PATCH 076/491] progressbar is showing on top of header and other interpreter options screen shot 2015-11-26 at 3 55 12 pm screen shot 2015-11-26 at 4 10 33 pm Author: Prabhjyot Singh Closes #481 from prabhjyotsingh/progressbarBug and squashes the following commits: 4936649 [Prabhjyot Singh] progressbar is showing on top of header and other interpreter options --- zeppelin-web/src/assets/styles/looknfeel/default.css | 1 + 1 file changed, 1 insertion(+) diff --git a/zeppelin-web/src/assets/styles/looknfeel/default.css b/zeppelin-web/src/assets/styles/looknfeel/default.css index 93d302aa21c..10403a430e7 100644 --- a/zeppelin-web/src/assets/styles/looknfeel/default.css +++ b/zeppelin-web/src/assets/styles/looknfeel/default.css @@ -20,6 +20,7 @@ body { box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); color: #2c3e50; border-bottom: 1px solid #E5E5E5; + z-index: 300; } .editor, From 5951e6102b37e79140430ac6c1eabd6c0c29491c Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Fri, 27 Nov 2015 15:53:28 +0900 Subject: [PATCH 077/491] ZEPPELIN-467 Fix ace editor focusing problem in chrome This PR addresses https://issues.apache.org/jira/browse/ZEPPELIN-467 When (invisible) textarea position is not correctly placed(this problem occur in Chrome when contents in editor is long), place it in cursor position of ace editor. not always set to 0. This PR also includes scrolling animation improvement. Make animation faster (duration 200 -> 100ms), and cancel animation before new animation starts. Author: Lee moon soo Closes #482 from Leemoonsoo/ZEPPELIN-467 and squashes the following commits: 434b5b2 [Lee moon soo] Avoid repeating angular.element('body') 04ba168 [Lee moon soo] Fix ace editor focusing problem --- .../paragraph/paragraph.controller.js | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index 430c5ac5f05..18a47a52bab 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -615,7 +615,11 @@ angular.module('zeppelinWebApp') if ($scope.editor.completer && $scope.editor.completer.activated) { // if autocompleter is active } else { // fix ace editor focus issue in chrome (textarea element goes to top: -1000px after focused by cursor move) - angular.element('#' + $scope.paragraph.id + '_editor > textarea').css('top', 0); + if (parseInt(angular.element('#' + $scope.paragraph.id + '_editor > textarea').css('top').replace('px', '')) < 0) { + var position = $scope.editor.getCursorPosition(); + var cursorPos = $scope.editor.renderer.$cursorLayer.getPixelPosition(position, true); + angular.element('#' + $scope.paragraph.id + '_editor > textarea').css('top', cursorPos.top); + } var numRows; var currentRow; @@ -683,7 +687,7 @@ angular.module('zeppelinWebApp') var position = $scope.editor.getCursorPosition(); var lastCursorPosition = $scope.editor.renderer.$cursorLayer.getPixelPosition(position, true); - var calculatedCursorPosition = editorPosition.top + lastCursorPosition.top + 16*lastCursorMove; + var calculatedCursorPosition = editorPosition.top + lastCursorPosition.top + lineHeight*lastCursorMove; var scrollTargetPos; if (calculatedCursorPosition < scrollPosition + headerHeight + scrollTriggerEdgeMargin) { @@ -698,7 +702,14 @@ angular.module('zeppelinWebApp') scrollTargetPos = documentHeight; } } - angular.element('body').scrollTo(scrollTargetPos, {axis: 'y', interrupt: true, duration:200}); + + // cancel previous scroll animation + var bodyEl = angular.element('body'); + bodyEl.stop(); + bodyEl.finish(); + + // scroll to scrollTargetPos + bodyEl.scrollTo(scrollTargetPos, {axis: 'y', interrupt: true, duration:100}); }; var setEditorHeight = function(id, height) { @@ -752,11 +763,10 @@ angular.module('zeppelinWebApp') var row; if (cursorPos >= 0) { row = cursorPos; - var column = 0; $scope.editor.gotoLine(row, 0); } else { - row = $scope.editor.session.getLength() - 1; - $scope.editor.gotoLine(row + 1, 0); + row = $scope.editor.session.getLength(); + $scope.editor.gotoLine(row, 0); } $scope.scrollToCursor($scope.paragraph.id, 0); } From ddde27a7abdc4e1357672b9489960a4a974ded44 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Fri, 27 Nov 2015 20:41:37 +0900 Subject: [PATCH 078/491] ZEPPELIN-469 Interpreter process loads unnecessary classes Addresses issue https://issues.apache.org/jira/browse/ZEPPELIN-469 This PR fixes problem by remove `export ZEPPELIN_CLASSPATH`, so classpath from bin/zeppelin-daemon.sh is not propagated bin/interpreter.sh. It can be verified by printing System classloader inside of notebook, like ```scala val cl = ClassLoader.getSystemClassLoader() val ucl = cl.asInstanceOf[java.net.URLClassLoader] ucl.getURLs.foreach(u=>println(u)) ``` Result is Before ``` cl: ClassLoader = sun.misc.Launcher$AppClassLoader36c51089 ucl: java.net.URLClassLoader = sun.misc.Launcher$AppClassLoader36c51089 file:/zeppelin/ file:/zeppelin/ file:/zeppelin/interpreter/spark/dep/datanucleus-api-jdo-3.2.6.jar file:/zeppelin/interpreter/spark/dep/datanucleus-core-3.2.10.jar file:/zeppelin/interpreter/spark/dep/datanucleus-rdbms-3.2.9.jar file:/zeppelin/interpreter/spark/dep/zeppelin-spark-dependencies-0.6.0-incubating-SNAPSHOT.jar file:/zeppelin/interpreter/spark/zeppelin-spark-0.6.0-incubating-SNAPSHOT.jar file:/zeppelin/lib/asm-3.1.jar file:/zeppelin/lib/aws-java-sdk-core-1.10.1.jar file:/zeppelin/lib/aws-java-sdk-kms-1.10.1.jar file:/zeppelin/lib/aws-java-sdk-s3-1.10.1.jar ... ... ... file:/zeppelin/lib/regexp-1.3.jar file:/zeppelin/lib/scala-library-2.10.4.jar file:/zeppelin/lib/slf4j-api-1.7.10.jar file:/zeppelin/lib/slf4j-log4j12-1.7.10.jar file:/zeppelin/lib/stax2-api-3.1.1.jar file:/zeppelin/lib/woodstox-core-asl-4.2.0.jar file:/zeppelin/lib/wsdl4j-1.6.3.jar file:/zeppelin/lib/xml-apis-1.4.01.jar file:/zeppelin/lib/xmlschema-core-2.0.3.jar file:/zeppelin/lib/zeppelin-interpreter-0.6.0-incubating-SNAPSHOT.jar file:/zeppelin/lib/zeppelin-zengine-0.6.0-incubating-SNAPSHOT.jar file:/zeppelin/zeppelin-server-0.6.0-incubating-SNAPSHOT.jar file:/zeppelin/ file:/zeppelin/conf/ file:/zeppelin/conf/ file:/zeppelin/conf/ ``` After ``` cl: ClassLoader = sun.misc.Launcher$AppClassLoader338bd37a ucl: java.net.URLClassLoader = sun.misc.Launcher$AppClassLoader338bd37a file:/zeppelin/ file:/zeppelin/ file:/zeppelin/interpreter/spark/dep/datanucleus-api-jdo-3.2.6.jar file:/zeppelin/interpreter/spark/dep/datanucleus-core-3.2.10.jar file:/zeppelin/interpreter/spark/dep/datanucleus-rdbms-3.2.9.jar file:/zeppelin/interpreter/spark/dep/zeppelin-spark-dependencies-0.6.0-incubating-SNAPSHOT.jar file:/zeppelin/interpreter/spark/zeppelin-spark-0.6.0-incubating-SNAPSHOT.jar file:/zeppelin/ file:/zeppelin/conf/ file:/zeppelin/conf/ ``` Author: Lee moon soo Closes #485 from Leemoonsoo/ZEPPELIN-469 and squashes the following commits: 63dcaaf [Lee moon soo] do not export ZEPPELIN_CLASSPATH --- bin/common.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/common.sh b/bin/common.sh index 2ed2d00d962..ae8b0bd3378 100644 --- a/bin/common.sh +++ b/bin/common.sh @@ -76,8 +76,6 @@ function addJarInDir(){ fi } -export ZEPPELIN_CLASSPATH - # Text encoding for # read/write job into files, # receiving/displaying query/result. From d6ed41306ed79cb5aefc0232ef9f4da80be9844f Mon Sep 17 00:00:00 2001 From: Damien CORNEAU Date: Fri, 27 Nov 2015 14:04:27 +0900 Subject: [PATCH 079/491] ZEPPELIN-462 - Fix Navbar CSS This PR is fixing https://issues.apache.org/jira/browse/ZEPPELIN-462 Navbar alignment has been reworked ![screen shot 2015-11-27 at 2 07 12 pm](https://cloud.githubusercontent.com/assets/710411/11434457/39d0cfb2-9510-11e5-9bf6-c59f91c10ddd.png) And Navbar style on smaller resolutions has been fixed ![screen shot 2015-11-27 at 1 33 35 pm](https://cloud.githubusercontent.com/assets/710411/11434460/4469b286-9510-11e5-8b66-25e037343e95.png) Author: Damien CORNEAU This patch had conflicts when merged, resolved by Committer: Lee moon soo Closes #483 from corneadoug/fix/docCss and squashes the following commits: c648748 [Damien CORNEAU] Fix CSS formating cdd76cd [Damien CORNEAU] Fix Navbar style --- .../themes/zeppelin/_navigation.html | 3 +- docs/assets/themes/zeppelin/css/style.css | 257 ++++++++++-------- 2 files changed, 146 insertions(+), 114 deletions(-) diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html index 10e97e5f60a..5d5cf713d43 100644 --- a/docs/_includes/themes/zeppelin/_navigation.html +++ b/docs/_includes/themes/zeppelin/_navigation.html @@ -9,7 +9,8 @@ I'm zeppelin - Zeppelin (0.6.0-incubating-SNAPSHOT) + Zeppelin + (0.6.0-incubating-SNAPSHOT)
    '; angular.element('#p' + $scope.paragraph.id + '_table').html(html); - angular.element('#p' + $scope.paragraph.id + '_table').perfectScrollbar(); + if ($scope.paragraph.result.msgTable.length > 10000) { + angular.element('#p' + $scope.paragraph.id + '_table').css('overflow', 'scroll'); + } else { + angular.element('#p' + $scope.paragraph.id + '_table').perfectScrollbar(); + } // set table height var height = $scope.paragraph.config.graph.height; From a54a3ac181fa34a0ff1c3c423cac07f9e1013a33 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Mon, 30 Nov 2015 21:37:15 +0900 Subject: [PATCH 086/491] [ZEPPELIN-475] NullPointerException when run notebook generated before ZEPPELIN-387 `p.getConfig().get("enabled")` can be null when Zeppelin load notebook generated before ZEPPELIN-387. This PR fixes ZEPPELIN-475 by assuming "true" when `p.getConfig().get("enabled")` is null. Author: Lee moon soo Closes #491 from Leemoonsoo/ZEPPELIN-475 and squashes the following commits: e6a459f [Lee moon soo] Assume "enabled" is true, when it is not defined. --- .../src/main/java/org/apache/zeppelin/notebook/Note.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java index 4271a735813..66a63c84975 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java @@ -93,7 +93,7 @@ private void generateId() { public String id() { return id; } - + public String getId() { return id; } @@ -174,7 +174,7 @@ public void addCloneParagraph(Paragraph srcParagraph) { paragraphs.add(newParagraph); } } - + /** * Insert paragraph in given index. * @@ -323,7 +323,7 @@ public void run(String paragraphId) { if (intp == null) { throw new InterpreterException("Interpreter " + p.getRequiredReplName() + " not found"); } - if ((Boolean) p.getConfig().get("enabled")) { + if (p.getConfig().get("enabled") == null || (Boolean) p.getConfig().get("enabled")) { intp.getScheduler().submit(p); } } From 48ee2b14d4d65f70b40334fd16d61992d83bbf8d Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Mon, 30 Nov 2015 22:50:38 +0900 Subject: [PATCH 087/491] [ZEPPELIN-474] Provide InterpreterContext as ThreadLocal value This PR implements ZEPPELIN-474. Let 3rd party library access InterpreterContext. Author: Lee moon soo Closes #492 from Leemoonsoo/ZEPPELIN-474 and squashes the following commits: 14c707b [Lee moon soo] Add very basic test 4297f3f [Lee moon soo] Provide InterpreterContext as ThreadLocal value --- .../interpreter/InterpreterContext.java | 17 ++++++++- .../remote/RemoteInterpreterServer.java | 9 ++++- .../interpreter/InterpreterContextTest.java | 37 +++++++++++++++++++ .../apache/zeppelin/notebook/Paragraph.java | 14 +++++-- 4 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterContextTest.java diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java index 7c2f6c0d726..0417f9108bc 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterContext.java @@ -27,6 +27,21 @@ * Interpreter context */ public class InterpreterContext { + private static final ThreadLocal threadIC = + new ThreadLocal(); + + public static InterpreterContext get() { + return threadIC.get(); + } + + public static void set(InterpreterContext ic) { + threadIC.set(ic); + } + + public static void remove() { + threadIC.remove(); + } + private final String noteId; private final String paragraphTitle; private final String paragraphId; @@ -55,7 +70,7 @@ public InterpreterContext(String noteId, this.runners = runners; } - + public String getNoteId() { return noteId; } diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java index d6768c9d0fd..725ee63131a 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java @@ -294,8 +294,13 @@ public Map info() { @Override protected Object jobRun() throws Throwable { - InterpreterResult result = interpreter.interpret(script, context); - return result; + try { + InterpreterContext.set(context); + InterpreterResult result = interpreter.interpret(script, context); + return result; + } finally { + InterpreterContext.remove(); + } } @Override diff --git a/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterContextTest.java b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterContextTest.java new file mode 100644 index 00000000000..080bdaa4337 --- /dev/null +++ b/zeppelin-interpreter/src/test/java/org/apache/zeppelin/interpreter/InterpreterContextTest.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.interpreter; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class InterpreterContextTest { + + @Test + public void testThreadLocal() { + assertNull(InterpreterContext.get()); + + InterpreterContext.set(new InterpreterContext(null, null, null, null, null, null, null, null)); + assertNotNull(InterpreterContext.get()); + + InterpreterContext.remove(); + assertNull(InterpreterContext.get()); + } + +} diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java index 28c49c6f55f..348c12ed259 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java @@ -206,12 +206,18 @@ protected Object jobRun() throws Throwable { script = Input.getSimpleQuery(settings.getParams(), scriptBody); } logger().debug("RUN : " + script); - InterpreterResult ret = repl.interpret(script, getInterpreterContext()); + try { + InterpreterContext context = getInterpreterContext(); + InterpreterContext.set(context); + InterpreterResult ret = repl.interpret(script, context); - if (Code.KEEP_PREVIOUS_RESULT == ret.code()) { - return getReturn(); + if (Code.KEEP_PREVIOUS_RESULT == ret.code()) { + return getReturn(); + } + return ret; + } finally { + InterpreterContext.remove(); } - return ret; } @Override From bce6b89e1320f288e0b6e29328a25cfac5175332 Mon Sep 17 00:00:00 2001 From: Jeff Steinmetz Date: Mon, 30 Nov 2015 21:24:49 -0800 Subject: [PATCH 088/491] virtual machine documenation link Author: Jeff Steinmetz Closes #495 from jeffsteinmetz/vagrant-navigation and squashes the following commits: 437421f [Jeff Steinmetz] virtual machine documenation link --- docs/_includes/themes/zeppelin/_navigation.html | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html index 5d5cf713d43..73e856a4fa3 100644 --- a/docs/_includes/themes/zeppelin/_navigation.html +++ b/docs/_includes/themes/zeppelin/_navigation.html @@ -24,6 +24,7 @@
  • Install
  • YARN Install
  • +
  • Virtual Machine Install
  • Tutorial
  • From ee6c6315c534e73fe5cc03388755c8b47683bcf1 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Mon, 30 Nov 2015 22:39:48 +0900 Subject: [PATCH 089/491] [ZEPPELIN-314] pyspark is not responding for Python 3 This PR fixes https://issues.apache.org/jira/browse/ZEPPELIN-314, by adding parentheses to call 'print' Author: Lee moon soo Closes #493 from Leemoonsoo/ZEPPELIN-314 and squashes the following commits: 33847e7 [Lee moon soo] python3 compatible syntax --- spark/src/main/resources/python/zeppelin_pyspark.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spark/src/main/resources/python/zeppelin_pyspark.py b/spark/src/main/resources/python/zeppelin_pyspark.py index b8daa3d4c33..1b17772b736 100644 --- a/spark/src/main/resources/python/zeppelin_pyspark.py +++ b/spark/src/main/resources/python/zeppelin_pyspark.py @@ -52,9 +52,9 @@ def __init__(self, zc): def show(self, obj): from pyspark.sql import DataFrame if isinstance(obj, DataFrame): - print gateway.jvm.org.apache.zeppelin.spark.ZeppelinContext.showDF(self.z, obj._jdf) + print(gateway.jvm.org.apache.zeppelin.spark.ZeppelinContext.showDF(self.z, obj._jdf)) else: - print str(obj) + print(str(obj)) # By implementing special methods it makes operating on it more Pythonic def __setitem__(self, key, item): From 576ead8542e516907aaa80313a0571b09c9f8b0b Mon Sep 17 00:00:00 2001 From: Tsuyoshi Miyake Date: Wed, 2 Dec 2015 18:07:07 +0900 Subject: [PATCH 090/491] fixed a broken link to Zeppelin documentation Author: Tsuyoshi Miyake Closes #503 from tsuyo/patch-1 and squashes the following commits: 9221cfd [Tsuyoshi Miyake] fixed a broken link to Zeppelin documentation --- zeppelin-web/src/app/home/home.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zeppelin-web/src/app/home/home.html b/zeppelin-web/src/app/home/home.html index 56e6dc4e29f..da7f6fb3f9d 100644 --- a/zeppelin-web/src/app/home/home.html +++ b/zeppelin-web/src/app/home/home.html @@ -44,7 +44,7 @@

    Help

    Get started with
    Zeppelin documentation
    + href="http://zeppelin.incubator.apache.org/docs/latest/index.html">Zeppelin documentation

    Community

    Please feel free to help us to improve Zeppelin,
    From fab573fe98a88b3fd1e247ae7c8cb7318f55a6e5 Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Wed, 2 Dec 2015 21:08:45 +0900 Subject: [PATCH 091/491] [ZEPPELIN-447] Document review process and becoming a committer https://issues.apache.org/jira/browse/ZEPPELIN-477 Documenting review process and becoming a committer. Note that purpose of this PR is not improving those process but document what it looks like at the moment. Author: Lee moon soo Closes #502 from Leemoonsoo/ZEPPELIN-477 and squashes the following commits: 2247402 [Lee moon soo] change order e5c936a [Lee moon soo] Remove spaces 6ebffb0 [Lee moon soo] Document review process and becoming a committer --- CONTRIBUTING.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index aa69016680f..7dcc36e3e9b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,8 +11,30 @@ Contributing to Zeppelin (Source code, Documents, Image, Website) means you agre ## SourceControl Workflow Zeppelin follows [Fork & Pull] (https://github.com/sevntu-checkstyle/sevntu.checkstyle/wiki/Development-workflow-with-Git:-Fork,-Branching,-Commits,-and-Pull-Request) model. + +## The Review Process + +When a Pull Request is submitted, it is being merged or rejected by following review process. + +* Anybody can be a reviewer and may comment on the change and suggest modifications. +* Reviewer can indicate that a patch looks suitable for merging with a comment such as : "Looks good", "LGTM", "+1". +* At least one indication of suitable for merging(eg. "LGTM") from committer is required to be merged. +* Pullrequest is open for 1 or 2 days for potential additional review, unless it's got enough indication of suitable for merging. +* Committer can initiate lazy consensus ("Merge if there is no more discusssion") and the code can be merged after certain time (normally 24 hours) when there is no review exists. +* Contributor can ping reviewers (including committer) by commenting 'Ready to review' or suitable indication. + + +## Becoming a Committer + +The PPMC adds new committers from the active contributors, based on their contribution to Zeppelin. The qualifications for new committers include: + +1. Sustained contributions : Committers should have a history of constant contributions to Zeppelin. +2. Quality of contributions : Committers more than any other community member should submit simple, well-tested, and well-designed patches. +3. Community involvement : Committers should have a constructive and friendly attitude in all community interactions. They should also be active on the dev, user list and reviewing patches. Also help new contributors and users. + + ## Setting up -Here are some things you will need to build and test Zeppelin. +Here are some things you will need to build and test Zeppelin. ### Software Configuration Management(SCM) From f29b4a60b50ad0a3bc077605765d173d3e8a5088 Mon Sep 17 00:00:00 2001 From: Prabhjyot Singh Date: Thu, 3 Dec 2015 12:21:28 +0530 Subject: [PATCH 092/491] fixing few typos Observed few typos in [ZEPPELIN-447] Document review process and becoming a committer. Since, https://github.com/apache/incubator-zeppelin/pull/502 is closed, fixing it here. Author: Prabhjyot Singh Closes #508 from prabhjyotsingh/ZEPPELIN-447-typos and squashes the following commits: 4aa85dd [Prabhjyot Singh] fixing typos --- CONTRIBUTING.md | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7dcc36e3e9b..aecfca07088 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,8 +8,8 @@ Contributing to Zeppelin (Source code, Documents, Image, Website) means you agre 3. Contribute your patch via Pull Request. -## SourceControl Workflow -Zeppelin follows [Fork & Pull] (https://github.com/sevntu-checkstyle/sevntu.checkstyle/wiki/Development-workflow-with-Git:-Fork,-Branching,-Commits,-and-Pull-Request) model. +## Source Control Workflow +Zeppelin follows [Fork & Pull] (https://github.com/sevntu-checkstyle/sevntu.checkstyle/wiki/Development-workflow-with-Git: -Fork, -Branching, -Commits, -and-Pull-Request) model. ## The Review Process @@ -17,10 +17,10 @@ Zeppelin follows [Fork & Pull] (https://github.com/sevntu-checkstyle/sevntu.chec When a Pull Request is submitted, it is being merged or rejected by following review process. * Anybody can be a reviewer and may comment on the change and suggest modifications. -* Reviewer can indicate that a patch looks suitable for merging with a comment such as : "Looks good", "LGTM", "+1". -* At least one indication of suitable for merging(eg. "LGTM") from committer is required to be merged. -* Pullrequest is open for 1 or 2 days for potential additional review, unless it's got enough indication of suitable for merging. -* Committer can initiate lazy consensus ("Merge if there is no more discusssion") and the code can be merged after certain time (normally 24 hours) when there is no review exists. +* Reviewer can indicate that a patch looks suitable for merging with a comment such as: "Looks good", "LGTM", "+1". +* At least one indication of suitable for merging (e.g. "LGTM") from committer is required to be merged. +* Pull request is open for 1 or 2 days for potential additional review, unless it's got enough indication of suitable for merging. +* Committer can initiate lazy consensus ("Merge if there is no more discussion") and the code can be merged after certain time (normally 24 hours) when there is no review exists. * Contributor can ping reviewers (including committer) by commenting 'Ready to review' or suitable indication. @@ -28,26 +28,26 @@ When a Pull Request is submitted, it is being merged or rejected by following re The PPMC adds new committers from the active contributors, based on their contribution to Zeppelin. The qualifications for new committers include: -1. Sustained contributions : Committers should have a history of constant contributions to Zeppelin. -2. Quality of contributions : Committers more than any other community member should submit simple, well-tested, and well-designed patches. -3. Community involvement : Committers should have a constructive and friendly attitude in all community interactions. They should also be active on the dev, user list and reviewing patches. Also help new contributors and users. +1. Sustained contributions: Committers should have a history of constant contributions to Zeppelin. +2. Quality of contributions: Committers more than any other community member should submit simple, well-tested, and well-designed patches. +3. Community involvement: Committers should have a constructive and friendly attitude in all community interactions. They should also be active on the dev, user list and reviewing patches. Also help new contributors and users. ## Setting up Here are some things you will need to build and test Zeppelin. -### Software Configuration Management(SCM) +### Software Configuration Management (SCM) -Zeppelin uses Git for it's SCM system. Hosted by github.com. `https://github.com/apache/incubator-zeppelin` You'll need git client installed in your development machine. +Zeppelin uses Git for its SCM system. Hosted by github.com. `https://github.com/apache/incubator-zeppelin` you'll need git client installed in your development machine. -### Integrated Development Environment(IDE) +### Integrated Development Environment (IDE) You are free to use whatever IDE you prefer, or your favorite command line editor. ### Project Structure Zeppelin project is based on Maven. Maven works by convention & defines [directory structure] (https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html) for a project. -The top level pom.xml describes the basic project structure. Currently Zeppelin has the following modules. +The top-level pom.xml describes the basic project structure. Currently Zeppelin has the following modules. zeppelin-interpreter zeppelin-zengine @@ -71,7 +71,7 @@ We are following Google Code style: * [Java style](http://google-styleguide.googlecode.com/svn/trunk/javaguide.html) * [Shell style](https://google-styleguide.googlecode.com/svn/trunk/shell.xml) -Checkstyle report location are in `${submodule}/target/site/checkstyle.html` +Check style report location are in `${submodule}/target/site/checkstyle.html` Test coverage report location are in `${submodule}/target/site/cobertura/index.html` #### Build Tools @@ -127,9 +127,9 @@ Each new File should have its own accompanying unit tests. Each new interpreter Zeppelin has 3 types of tests: - 1. Unit Tests: The unit tests run as part of each package's build. E.g SparkInterpeter Module's unit test is SparkInterpreterTest - 2. Integration Tests: The intergration tests run after all modules are build. The integration tests launch an instance of Zeppelin server. ZeppelinRestApiTest is an example integration test. - 3. GUI integration tests: These tests validate the Zeppelin UI elements. These tests require a running Zepplein server and lauches a web browser to validate Notebook UI elements like Notes and their execution. See ZeppelinIT as an example. + 1. Unit Tests: The unit tests run as part of each package's build. E.g. SparkInterpeter Module's unit test is SparkInterpreterTest + 2. Integration Tests: The integration tests run after all modules are build. The integration tests launch an instance of Zeppelin server. ZeppelinRestApiTest is an example integration test. + 3. GUI integration tests: These tests validate the Zeppelin UI elements. These tests require a running Zeppelin server and launches a web browser to validate Notebook UI elements like Notes and their execution. See ZeppelinIT as an example. Currently the GUI integration tests are not run in the Maven and are only run in the CI environment when the pull request is submitted to github. Make sure to watch the [CI results] (https://travis-ci.org/apache/incubator-zeppelin/pull_requests) for your pull request. @@ -138,7 +138,7 @@ Currently the GUI integration tests are not run in the Maven and are only run in Zeppelin uses Travis for CI. In the project root there is .travis.yml that configures CI and [publishes CI results] (https://travis-ci.org/apache/incubator-zeppelin/builds) -## Run Zepplin server in development mode +## Run Zeppelin server in development mode ``` cd zeppelin-server @@ -158,8 +158,8 @@ Server will be run on http://localhost:8080 Zeppelin manages it's issues in Jira. [https://issues.apache.org/jira/browse/ZEPPELIN](https://issues.apache.org/jira/browse/ZEPPELIN) ## Stay involved -Everyone is welcome to join our mailling list: +Everyone is welcome to join our mailing list: * [users@zeppelin.incubator.apache.org](http://mail-archives.apache.org/mod_mbox/incubator-zeppelin-users/) is for usage questions, help, and announcements [ [subscribe](mailto:users-subscribe@zeppelin.incubator.apache.org?subject=send%20this%20email%20to%20subscribe), [unsubscribe](mailto:users-unsubscribe@zeppelin.incubator.apache.org?subject=send%20this%20email%20to%20unsubscribe), [archive](http://mail-archives.apache.org/mod_mbox/incubator-zeppelin-users/) ] * [dev@zeppelin.incubator.apache.org](http://mail-archives.apache.org/mod_mbox/incubator-zeppelin-users/) is for people who want to contribute code to Zeppelin.[ [subscribe](mailto:dev-subscribe@zeppelin.incubator.apache.org?subject=send%20this%20email%20to%20subscribe), [unsubscribe](mailto:dev-unsubscribe@zeppelin.incubator.apache.org?subject=send%20this%20email%20to%20unsubscribe), [archive](http://mail-archives.apache.org/mod_mbox/incubator-zeppelin-dev/) ] - * [commits@zeppelin.incubator.apache.org](http://mail-archives.apache.org/mod_mbox/incubator-zeppelin-commits/) is for commit messages and patches to Zeppelin. [ [subscribe](mailto:commits-subscribe@zeppelin.incubator.apache.org?subject=send%20this%20email%20to%20subscribe), [unsubscribe](mailto:commits-unsubscribe@zeppelin.incubator.apache.org?subject=send%20this%20email%20to%20unsubscribe), [archive](http://mail-archives.apache.org/mod_mbox/incubator-zeppelin-commits/) ] \ No newline at end of file + * [commits@zeppelin.incubator.apache.org](http://mail-archives.apache.org/mod_mbox/incubator-zeppelin-commits/) is for commit messages and patches to Zeppelin. [ [subscribe](mailto:commits-subscribe@zeppelin.incubator.apache.org?subject=send%20this%20email%20to%20subscribe), [unsubscribe](mailto:commits-unsubscribe@zeppelin.incubator.apache.org?subject=send%20this%20email%20to%20unsubscribe), [archive](http://mail-archives.apache.org/mod_mbox/incubator-zeppelin-commits/) ] From 9a8779bdd742f608b6131ec80010173acd232d4f Mon Sep 17 00:00:00 2001 From: Ryu Ah young Date: Wed, 2 Dec 2015 13:53:27 +0900 Subject: [PATCH 093/491] Fix navbar-brand image margin Currently, because of overlapping #483 #469, http://zeppelin.incubator.apache.org/docs/0.6.0-incubating-SNAPSHOT/ navbar-brand image location is little bit wired. ![before](https://github.com/AhyoungRyu/Platform-Documentation/blob/master/compared_img/Before_NavbarImg.png?raw=true) So I fixed this. Additionally, I deleted some traces generated by last merge. Author: Ryu Ah young Closes #500 from AhyoungRyu/fix-navbar-brand-img-margin and squashes the following commits: 16984b3 [Ryu Ah young] fix navbar-brand image margin --- docs/assets/themes/zeppelin/css/style.css | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/docs/assets/themes/zeppelin/css/style.css b/docs/assets/themes/zeppelin/css/style.css index ccbd092510c..066dd844601 100644 --- a/docs/assets/themes/zeppelin/css/style.css +++ b/docs/assets/themes/zeppelin/css/style.css @@ -15,6 +15,10 @@ body { padding-bottom: 10px; } +.navbar-brand img { + margin: 0; +} + .navbar { background: #3071a9; border-bottom: 0px; @@ -209,13 +213,8 @@ body { /* Table for property */ .table-configuration { -<<<<<<< HEAD width : 100%; border : 1px solid gray; -======= - width: 800px; - border: 1px solid gray; ->>>>>>> PR_TOOL_MERGE_PR_483 } .table-configuration tr td { border: 1px solid gray; @@ -238,7 +237,6 @@ body { } /* Custom container */ -<<<<<<< HEAD /* */ .container a { color: #4183C4; } @@ -359,8 +357,6 @@ a.anchor { margin: 12px 0; } -======= ->>>>>>> PR_TOOL_MERGE_PR_483 .container-narrow { margin: 0 auto; } From 4538524e9d850c1ad36e7488ee339732192ad9a9 Mon Sep 17 00:00:00 2001 From: astroshim Date: Thu, 3 Dec 2015 14:03:17 +0900 Subject: [PATCH 094/491] synchronization saving notebook. The issue related to https://issues.apache.org/jira/browse/ZEPPELIN-473. Saving notebook operation has called save method in the VFSNotebookRepo class in the end, It can be synchronized. Author: astroshim Closes #489 from astroshim/ZEPPELIN-473 and squashes the following commits: 6dc3bc6 [astroshim] remove TODO. 2032d1a [astroshim] for rebuilding. 98c7e7e [astroshim] add apache license comment. 84fb90a [astroshim] to pass CI. bc97bf3 [astroshim] add testcase. 8c0fac8 [astroshim] synchronization saving notebook. --- .../notebook/repo/VFSNotebookRepo.java | 2 +- .../notebook/repo/VFSNotebookRepoTest.java | 121 ++++++++++++++++++ 2 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepoTest.java diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java index 58f36f298c4..8363bc76740 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java @@ -197,7 +197,7 @@ private FileObject getRootDir() throws IOException { } @Override - public void save(Note note) throws IOException { + public synchronized void save(Note note) throws IOException { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setPrettyPrinting(); Gson gson = gsonBuilder.create(); diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepoTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepoTest.java new file mode 100644 index 00000000000..e747078ce6a --- /dev/null +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepoTest.java @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.notebook.repo; + +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.io.IOException; +import java.util.Map; + +import org.apache.zeppelin.conf.ZeppelinConfiguration; +import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars; +import org.apache.zeppelin.interpreter.InterpreterFactory; +import org.apache.zeppelin.interpreter.InterpreterOption; +import org.apache.zeppelin.notebook.JobListenerFactory; +import org.apache.zeppelin.notebook.Note; +import org.apache.zeppelin.notebook.Notebook; +import org.apache.zeppelin.notebook.NotebookTest; +import org.apache.zeppelin.notebook.Paragraph; +import org.apache.zeppelin.scheduler.JobListener; +import org.apache.zeppelin.scheduler.SchedulerFactory; +import org.apache.zeppelin.scheduler.Job.Status; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class VFSNotebookRepoTest implements JobListenerFactory{ + private static final Logger logger = LoggerFactory.getLogger(NotebookTest.class); + + private ZeppelinConfiguration conf; + private SchedulerFactory schedulerFactory; + private Notebook notebook; + private NotebookRepo notebookRepo; + private InterpreterFactory factory; + + @Before + public void setUp() throws Exception { + conf = ZeppelinConfiguration.create(); + + this.schedulerFactory = new SchedulerFactory(); + factory = new InterpreterFactory(conf, new InterpreterOption(false), null); + + notebookRepo = new VFSNotebookRepo(conf); + notebook = new Notebook(conf, notebookRepo, schedulerFactory, factory, this); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testSaveNotebook() throws IOException, InterruptedException { + Note note = notebook.createNote(); + note.getNoteReplLoader().setInterpreters(factory.getDefaultInterpreterSettingList()); + + Paragraph p1 = note.addParagraph(); + Map config = p1.getConfig(); + config.put("enabled", true); + p1.setConfig(config); + p1.setText("%md hello world"); + + note.run(p1.getId()); + int timeout = 1; + while (!p1.isTerminated()) { + Thread.sleep(1000); + if (timeout++ > 10) { + break; + } + } + int i = 0; + int TEST_COUNT = 10; + while (i++ < TEST_COUNT) { + p1.setText("%md hello zeppelin"); + new Thread(new NotebookWriter(note)).start(); + p1.setText("%md hello world"); + new Thread(new NotebookWriter(note)).start(); + } + + note.setName("SaveTest"); + notebookRepo.save(note); + assertEquals(note.getName(), "SaveTest"); + } + + class NotebookWriter implements Runnable { + Note note; + public NotebookWriter(Note note) { + this.note = note; + } + + @Override + public void run() { + try { + notebookRepo.save(note); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + @Override + public JobListener getParagraphJobListener(Note note) { + return null; + } +} From b5506f76f590e8e01be67dc16639cc8e9f35d7f9 Mon Sep 17 00:00:00 2001 From: Minwoo Kang Date: Wed, 2 Dec 2015 11:38:57 +0900 Subject: [PATCH 095/491] ZEPPELIN-358: Jetty server is HTTP ERROR 404 [ZEPPELIN-358](https://issues.apache.org/jira/browse/ZEPPELIN-358) Define local jetty temp directory. `varName: zeppelin.war.tempdir` `default varValue: webapps` Zeppelin create temp directory in `{zeppelin.home}/webapps` when zeppelin server start. Author: Minwoo Kang Closes #498 from mwkang/master and squashes the following commits: f19e2ca [Minwoo Kang] ZEPPELIN-358 add the environment variable and property. update documentation. cc7fdb7 [Minwoo Kang] ZEPPELIN-358 restore unused imports 0046d36 [Minwoo Kang] ZEPPELIN-358 use getRelativeDir instead of getString 98b784c [Minwoo Kang] ZEPPELIN-358 add jetty temporary directory --- conf/zeppelin-env.sh.template | 1 + conf/zeppelin-site.xml.template | 6 ++++++ docs/install/install.md | 8 +++++++- .../java/org/apache/zeppelin/server/ZeppelinServer.java | 4 ++++ .../org/apache/zeppelin/conf/ZeppelinConfiguration.java | 6 +++--- 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/conf/zeppelin-env.sh.template b/conf/zeppelin-env.sh.template index fe133ba348e..b0b1a5b6e50 100644 --- a/conf/zeppelin-env.sh.template +++ b/conf/zeppelin-env.sh.template @@ -25,6 +25,7 @@ # export ZEPPELIN_LOG_DIR # Where log files are stored. PWD by default. # export ZEPPELIN_PID_DIR # The pid files are stored. /tmp by default. +# export ZEPPELIN_WAR_TEMPDIR # The location of jetty temporary directory. # export ZEPPELIN_NOTEBOOK_DIR # Where notebook saved # export ZEPPELIN_NOTEBOOK_HOMESCREEN # Id of notebook to be displayed in homescreen. ex) 2A94M5J1Z # export ZEPPELIN_NOTEBOOK_HOMESCREEN_HIDE # hide homescreen notebook from list when this value set to "true". default "false" diff --git a/conf/zeppelin-site.xml.template b/conf/zeppelin-site.xml.template index 0f44c62ad51..191f8c265ae 100755 --- a/conf/zeppelin-site.xml.template +++ b/conf/zeppelin-site.xml.template @@ -37,6 +37,12 @@ Context Path of the Web Application + + zeppelin.war.tempdir + webapps + Location of jetty temporary directory + + zeppelin.notebook.dir notebook diff --git a/docs/install/install.md b/docs/install/install.md index d3914010f64..73dd7e0cf7a 100644 --- a/docs/install/install.md +++ b/docs/install/install.md @@ -145,7 +145,13 @@ Configuration can be done by both environment variable(conf/zeppelin-env.sh) and zeppelin.notebook.homescreen.hide false hide homescreen notebook from list when this value set to "true" - + + + ZEPPELIN_WAR_TEMPDIR + zeppelin.war.tempdir + webapps + The location of jetty temporary directory. + ZEPPELIN_NOTEBOOK_DIR zeppelin.notebook.dir diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java index ea8a0b64c45..4eb30bf692a 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java @@ -240,6 +240,10 @@ private static WebAppContext setupWebAppContext( } else { // use packaged WAR webApp.setWar(warPath.getAbsolutePath()); + File warTempDirectory = new File(conf.getRelativeDir(ConfVars.ZEPPELIN_WAR_TEMPDIR)); + warTempDirectory.mkdir(); + LOG.info("ZeppelinServer Webapp path: {}", warTempDirectory.getPath()); + webApp.setTempDirectory(warTempDirectory); } // Explicit bind to root webApp.addServlet( diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java index 17964307817..909345a1c48 100755 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java @@ -28,7 +28,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; - /** * Zeppelin configuration. * @@ -326,11 +325,11 @@ public String getTrustStorePassword() { public String getNotebookDir() { return getString(ConfVars.ZEPPELIN_NOTEBOOK_DIR); } - + public String getUser() { return getString(ConfVars.ZEPPELIN_NOTEBOOK_S3_USER); } - + public String getBucketName() { return getString(ConfVars.ZEPPELIN_NOTEBOOK_S3_BUCKET); } @@ -398,6 +397,7 @@ public static enum ConfVars { ZEPPELIN_SSL_TRUSTSTORE_TYPE("zeppelin.ssl.truststore.type", null), ZEPPELIN_SSL_TRUSTSTORE_PASSWORD("zeppelin.ssl.truststore.password", null), ZEPPELIN_WAR("zeppelin.war", "../zeppelin-web/dist"), + ZEPPELIN_WAR_TEMPDIR("zeppelin.war.tempdir", "webapps"), ZEPPELIN_INTERPRETERS("zeppelin.interpreters", "org.apache.zeppelin.spark.SparkInterpreter," + "org.apache.zeppelin.spark.PySparkInterpreter," + "org.apache.zeppelin.spark.SparkSqlInterpreter," From 79059395bc0c2b539973c6758f61d6abf3403d98 Mon Sep 17 00:00:00 2001 From: Jongyoul Lee Date: Mon, 30 Nov 2015 19:15:33 +0900 Subject: [PATCH 096/491] ZEPPELIN-440 HiveInterpreter with multiple configuration This PR enable HiveInterpreter to configure several connection information. For using specific configurations, you should use some tricks like ``%hive(configuration_prefix)``. without it, you can use default settings starting with ``default``. screen shot 2015-11-21 at 1 51 31 am screen shot 2015-11-21 at 1 53 59 am Author: Jongyoul Lee Closes #455 from jongyoul/ZEPPELIN-440 and squashes the following commits: af4c64b [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Rebased and fixed links of docs d68bcc5 [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Fixed typos on docs fc33a30 [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Fixed Apaceh license header - Fixed some codestyle - Removed unused codes and classes 4e01265 [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Updated docs for hive b4f1a1c [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Fixed test case to be more general 4867c6f [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Fixed test case to be more general dcb65ae [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Revised executeSql from Postgresql.executeSql f2b61c0 [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Restored ParallelScheduler from FIFOScheduler 2616050 [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Restored some tests from the beginning 5fa4fd7 [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Fixed getScriptBody return after trimming 8aa7601 [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Fixed some tests 85e4914 [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Fixed style 9293d78 [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Fixed linefeed to variable df9f3cb [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Remove commented codes - Fixed license part 87ee87a [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Revert log4j.properties 97bfa65 [Jongyoul Lee] ZEPPELIN-440 HiveInterpreter with multiple configuration - Enable multiple connection properties --- .../themes/zeppelin/_navigation.html | 2 +- docs/docs.md | 2 +- docs/interpreter/hive.md | 105 + hive/pom.xml | 6 + .../apache/zeppelin/hive/HiveInterpreter.java | 342 +++- .../zeppelin/hive/HiveInterpreterTest.java | 1726 ++--------------- .../interpreter/remote/RemoteInterpreter.java | 1 + .../remote/RemoteInterpreterServer.java | 1 + .../apache/zeppelin/notebook/Paragraph.java | 6 +- .../zeppelin/notebook/ParagraphTest.java | 38 + 10 files changed, 532 insertions(+), 1697 deletions(-) create mode 100644 docs/interpreter/hive.md create mode 100644 zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/ParagraphTest.java diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html index 73e856a4fa3..440ce425ff1 100644 --- a/docs/_includes/themes/zeppelin/_navigation.html +++ b/docs/_includes/themes/zeppelin/_navigation.html @@ -39,7 +39,7 @@
  • Cassandra
  • Flink
  • Geode
  • -
  • Hive
  • +
  • Hive
  • Ignite
  • Lens
  • Markdown
  • diff --git a/docs/docs.md b/docs/docs.md index 0eebfcf08a2..97cba96d455 100644 --- a/docs/docs.md +++ b/docs/docs.md @@ -36,7 +36,7 @@ limitations under the License. * [cassandra](./interpreter/cassandra.html) * [flink](./interpreter/flink.html) * [geode](./interpreter/geode.html) -* [hive](./pleasecontribute.html) +* [hive](./interpreter/hive.html) * [ignite](./interpreter/ignite.html) * [lens](./interpreter/lens.html) * [md](./interpreter/markdown.html) diff --git a/docs/interpreter/hive.md b/docs/interpreter/hive.md new file mode 100644 index 00000000000..b37c421de12 --- /dev/null +++ b/docs/interpreter/hive.md @@ -0,0 +1,105 @@ +--- +layout: page +title: "Hive Interpreter" +description: "" +group: manual +--- +{% include JB/setup %} + + +## Hive Interpreter for Apache Zeppelin + +### Configuration + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefaultDescription
    default.driverorg.apache.hive.jdbc.HiveDriverClass path of JDBC driver
    default.urljdbc:hive2://localhost:10000Url for connection
    default.user(Optional)Username of the connection
    default.password(Optional)Password of the connection
    default.xxx(Optional)Other properties used by the driver
    ${prefix}.driverDriver class path of `%hive(${prefix})`
    ${prefix}.urlUrl of `%hive(${prefix})`
    ${prefix}.user(Optional)Username of the connection of `%hive(${prefix})`
    ${prefix}.password(Optional)Password of the connection of `%hive(${prefix})`
    ${prefix}.xxx(Optional)Other properties used by the driver of `%hive(${prefix})`
    + +This interpreter provides multiple configuration with ${prefix}. User can set a multiple connection properties by this prefix. It can be used like `%hive(${prefix})`. + +### How to use + +Basically, you can use + +```sql +%hive +select * from my_table; +``` + +or + +```sql +%hive(etl) +-- 'etl' is a ${prefix} +select * from my_table; +``` + +You can also run multiple queries up to 10 by default. Changing these settings is not implemented yet. + +#### Apply Zeppelin Dynamic Forms + +You can leverage [Zeppelin Dynamic Form]({{BASE_PATH}}/manual/dynamicform.html) inside your queries. You can use both the `text input` and `select form` parameterization features + +```sql +%hive +SELECT ${group_by}, count(*) as count +FROM retail_demo.order_lineitems_pxf +GROUP BY ${group_by=product_id,product_id|product_name|customer_id|store_id} +ORDER BY count ${order=DESC,DESC|ASC} +LIMIT ${limit=10}; +``` diff --git a/hive/pom.xml b/hive/pom.xml index f4867d3e150..ca41d3887e6 100644 --- a/hive/pom.xml +++ b/hive/pom.xml @@ -87,6 +87,12 @@ junit test + + com.h2database + h2 + 1.4.190 + test + diff --git a/hive/src/main/java/org/apache/zeppelin/hive/HiveInterpreter.java b/hive/src/main/java/org/apache/zeppelin/hive/HiveInterpreter.java index 5c3dee37387..b1f3339674e 100644 --- a/hive/src/main/java/org/apache/zeppelin/hive/HiveInterpreter.java +++ b/hive/src/main/java/org/apache/zeppelin/hive/HiveInterpreter.java @@ -1,13 +1,12 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -15,6 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.apache.zeppelin.hive; import java.sql.Connection; @@ -23,10 +23,13 @@ import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Properties; +import java.util.Set; -import org.apache.commons.lang.StringUtils; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterPropertyBuilder; @@ -37,152 +40,284 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static org.apache.commons.lang.StringUtils.containsIgnoreCase; + /** * Hive interpreter for Zeppelin. */ public class HiveInterpreter extends Interpreter { Logger logger = LoggerFactory.getLogger(HiveInterpreter.class); - int commandTimeOut = 600000; - static final String HIVESERVER_URL = "hive.hiveserver2.url"; - static final String HIVESERVER_USER = "hive.hiveserver2.user"; - static final String HIVESERVER_PASSWORD = "hive.hiveserver2.password"; + static final String COMMON_KEY = "common"; + static final String MAX_LINE_KEY = "max_count"; + static final String MAX_LINE_DEFAULT = "1000"; + + static final String DEFAULT_KEY = "default"; + static final String DRIVER_KEY = "driver"; + static final String URL_KEY = "url"; + static final String USER_KEY = "user"; + static final String PASSWORD_KEY = "password"; + static final String DOT = "."; + + static final char TAB = '\t'; + static final char NEWLINE = '\n'; + static final String EXPLAIN_PREDICATE = "EXPLAIN "; + static final String TABLE_MAGIC_TAG = "%table "; + static final String UPDATE_COUNT_HEADER = "Update Count"; + + static final String COMMON_MAX_LINE = COMMON_KEY + DOT + MAX_LINE_KEY; + + static final String DEFAULT_DRIVER = DEFAULT_KEY + DOT + DRIVER_KEY; + static final String DEFAULT_URL = DEFAULT_KEY + DOT + URL_KEY; + static final String DEFAULT_USER = DEFAULT_KEY + DOT + USER_KEY; + static final String DEFAULT_PASSWORD = DEFAULT_KEY + DOT + PASSWORD_KEY; + + private final HashMap propertiesMap; + private final Map keyConnectionMap; + private final Map paragraphIdStatementMap; static { Interpreter.register( - "hql", - "hive", - HiveInterpreter.class.getName(), - new InterpreterPropertyBuilder() - .add(HIVESERVER_URL, "jdbc:hive2://localhost:10000", "The URL for HiveServer2.") - .add(HIVESERVER_USER, "hive", "The hive user") - .add(HIVESERVER_PASSWORD, "", "The password for the hive user").build()); + "hql", + "hive", + HiveInterpreter.class.getName(), + new InterpreterPropertyBuilder() + .add(COMMON_MAX_LINE, MAX_LINE_DEFAULT, "Maximum line of results") + .add(DEFAULT_DRIVER, "org.apache.hive.jdbc.HiveDriver", "Hive JDBC driver") + .add(DEFAULT_URL, "jdbc:hive2://localhost:10000", "The URL for HiveServer2.") + .add(DEFAULT_USER, "hive", "The hive user") + .add(DEFAULT_PASSWORD, "", "The password for the hive user").build()); } public HiveInterpreter(Properties property) { super(property); + propertiesMap = new HashMap<>(); + keyConnectionMap = new HashMap<>(); + paragraphIdStatementMap = new HashMap<>(); } - Connection jdbcConnection; - Exception exceptionOnConnect; - - //Test only method - public Connection getJdbcConnection() - throws SQLException { - String url = getProperty(HIVESERVER_URL); - String user = getProperty(HIVESERVER_USER); - String password = getProperty(HIVESERVER_PASSWORD); - - return DriverManager.getConnection(url, user, password); + public HashMap getPropertiesMap() { + return propertiesMap; } @Override public void open() { - logger.info("Jdbc open connection called!"); - try { - String driverName = "org.apache.hive.jdbc.HiveDriver"; - Class.forName(driverName); - } catch (ClassNotFoundException e) { - logger.error("Can not open connection", e); - exceptionOnConnect = e; - return; + logger.debug("property: {}", property); + + for (String propertyKey : property.stringPropertyNames()) { + logger.debug("propertyKey: {}", propertyKey); + String[] keyValue = propertyKey.split("\\.", 2); + if (2 == keyValue.length) { + logger.debug("key: {}, value: {}", keyValue[0], keyValue[1]); + Properties prefixProperties; + if (propertiesMap.containsKey(keyValue[0])) { + prefixProperties = propertiesMap.get(keyValue[0]); + } else { + prefixProperties = new Properties(); + propertiesMap.put(keyValue[0], prefixProperties); + } + prefixProperties.put(keyValue[1], property.getProperty(propertyKey)); + } } - try { - jdbcConnection = getJdbcConnection(); - exceptionOnConnect = null; - logger.info("Successfully created Jdbc connection"); + + Set removeKeySet = new HashSet<>(); + for (String key : propertiesMap.keySet()) { + if (!COMMON_KEY.equals(key)) { + Properties properties = propertiesMap.get(key); + if (!properties.containsKey(DRIVER_KEY) || !properties.containsKey(URL_KEY)) { + logger.error("{} will be ignored. {}.{} and {}.{} is mandatory.", + key, DRIVER_KEY, key, key, URL_KEY); + removeKeySet.add(key); + } + } } - catch (SQLException e) { - logger.error("Cannot open connection", e); - exceptionOnConnect = e; + + for (String key : removeKeySet) { + propertiesMap.remove(key); } + + logger.debug("propertiesMap: {}", propertiesMap); } @Override public void close() { try { - if (jdbcConnection != null) { - jdbcConnection.close(); + for (Statement statement : paragraphIdStatementMap.values()) { + statement.close(); } + paragraphIdStatementMap.clear(); + + for (Connection connection : keyConnectionMap.values()) { + connection.close(); + } + keyConnectionMap.clear(); + } catch (SQLException e) { + logger.error("Error while closing...", e); } - catch (SQLException e) { - logger.error("Cannot close connection", e); + } + + public Connection getConnection(String propertyKey) throws ClassNotFoundException, SQLException { + Connection connection = null; + if (keyConnectionMap.containsKey(propertyKey)) { + connection = keyConnectionMap.get(propertyKey); + if (connection.isClosed() || !connection.isValid(10)) { + connection.close(); + connection = null; + keyConnectionMap.remove(propertyKey); + } } - finally { - jdbcConnection = null; - exceptionOnConnect = null; + if (null == connection) { + Properties properties = propertiesMap.get(propertyKey); + Class.forName(properties.getProperty(DRIVER_KEY)); + String url = properties.getProperty(URL_KEY); + String user = properties.getProperty(USER_KEY); + String password = properties.getProperty(PASSWORD_KEY); + if (null != user && null != password) { + connection = DriverManager.getConnection(url, user, password); + } else { + connection = DriverManager.getConnection(url, properties); + } + keyConnectionMap.put(propertyKey, connection); } + return connection; } - Statement currentStatement; - private InterpreterResult executeSql(String sql) { - try { - if (exceptionOnConnect != null) { - return new InterpreterResult(Code.ERROR, exceptionOnConnect.getMessage()); + public Statement getStatement(String propertyKey, String paragraphId) + throws SQLException, ClassNotFoundException { + Statement statement = null; + if (paragraphIdStatementMap.containsKey(paragraphId)) { + statement = paragraphIdStatementMap.get(paragraphId); + if (statement.isClosed()) { + statement = null; + paragraphIdStatementMap.remove(paragraphId); } - currentStatement = jdbcConnection.createStatement(); - StringBuilder msg = null; - if (StringUtils.containsIgnoreCase(sql, "EXPLAIN ")) { - //return the explain as text, make this visual explain later + } + if (null == statement) { + statement = getConnection(propertyKey).createStatement(); + paragraphIdStatementMap.put(paragraphId, statement); + } + return statement; + } + + public InterpreterResult executeSql(String propertyKey, String sql, + InterpreterContext interpreterContext) { + String paragraphId = interpreterContext.getParagraphId(); + + try { + + Statement statement = getStatement(propertyKey, paragraphId); + + statement.setMaxRows(getMaxResult()); + + StringBuilder msg; + + if (containsIgnoreCase(sql, EXPLAIN_PREDICATE)) { msg = new StringBuilder(); + } else { + msg = new StringBuilder(TABLE_MAGIC_TAG); } - else { - msg = new StringBuilder("%table "); - } - ResultSet res = currentStatement.executeQuery(sql); + + ResultSet resultSet = null; + try { - ResultSetMetaData md = res.getMetaData(); - for (int i = 1; i < md.getColumnCount() + 1; i++) { - if (i == 1) { + boolean isResultSetAvailable = statement.execute(sql); + + if (isResultSetAvailable) { + resultSet = statement.getResultSet(); + + ResultSetMetaData md = resultSet.getMetaData(); + + for (int i = 1; i < md.getColumnCount() + 1; i++) { + if (i > 1) { + msg.append(TAB); + } msg.append(md.getColumnName(i)); - } else { - msg.append("\t" + md.getColumnName(i)); } - } - msg.append("\n"); - while (res.next()) { - for (int i = 1; i < md.getColumnCount() + 1; i++) { - msg.append(res.getString(i) + "\t"); + msg.append(NEWLINE); + + int displayRowCount = 0; + while (resultSet.next() && displayRowCount < getMaxResult()) { + for (int i = 1; i < md.getColumnCount() + 1; i++) { + msg.append(resultSet.getString(i)); + if (i != md.getColumnCount()) { + msg.append(TAB); + } + } + msg.append(NEWLINE); + displayRowCount++; } - msg.append("\n"); + } else { + // Response contains either an update count or there are no results. + int updateCount = statement.getUpdateCount(); + msg.append(UPDATE_COUNT_HEADER).append(NEWLINE); + msg.append(updateCount).append(NEWLINE); } - } - finally { + } finally { try { - res.close(); - currentStatement.close(); - } - finally { - currentStatement = null; + if (resultSet != null) { + resultSet.close(); + } + statement.close(); + } finally { + removeStatement(paragraphId); } } - InterpreterResult rett = new InterpreterResult(Code.SUCCESS, msg.toString()); - return rett; - } - catch (SQLException ex) { - logger.error("Can not run " + sql, ex); + return new InterpreterResult(Code.SUCCESS, msg.toString()); + + } catch (SQLException | ClassNotFoundException ex) { + logger.error("Cannot run " + sql, ex); return new InterpreterResult(Code.ERROR, ex.getMessage()); } } + private void removeStatement(String paragraphId) { + paragraphIdStatementMap.remove(paragraphId); + } + @Override public InterpreterResult interpret(String cmd, InterpreterContext contextInterpreter) { - logger.info("Run SQL command '" + cmd + "'"); - return executeSql(cmd); + String propertyKey = getPropertyKey(cmd); + + if (null != propertyKey) { + cmd = cmd.substring(propertyKey.length() + 2); + } else { + propertyKey = DEFAULT_KEY; + } + + cmd = cmd.trim(); + + logger.info("PropertyKey: {}, SQL command: '{}'", propertyKey, cmd); + + return executeSql(propertyKey, cmd, contextInterpreter); + } + + private int getMaxResult() { + return Integer.valueOf( + propertiesMap.get(COMMON_KEY).getProperty(MAX_LINE_KEY, MAX_LINE_DEFAULT)); + } + + public String getPropertyKey(String cmd) { + int firstLineIndex = cmd.indexOf("\n"); + if (-1 == firstLineIndex) { + firstLineIndex = cmd.length(); + } + int configStartIndex = cmd.indexOf("("); + int configLastIndex = cmd.indexOf(")"); + if (configStartIndex != -1 && configLastIndex != -1 + && configLastIndex < firstLineIndex && configLastIndex < firstLineIndex) { + return cmd.substring(configStartIndex + 1, configLastIndex); + } + return null; } @Override public void cancel(InterpreterContext context) { - if (currentStatement != null) { - try { - currentStatement.cancel(); - } - catch (SQLException ex) { - } - finally { - currentStatement = null; - } + String paragraphId = context.getParagraphId(); + try { + paragraphIdStatementMap.get(paragraphId).cancel(); + } catch (SQLException e) { + logger.error("Error while cancelling...", e); } } @@ -198,13 +333,12 @@ public int getProgress(InterpreterContext context) { @Override public Scheduler getScheduler() { - return SchedulerFactory.singleton().createOrGetFIFOScheduler( - HiveInterpreter.class.getName() + this.hashCode()); + return SchedulerFactory.singleton().createOrGetParallelScheduler( + HiveInterpreter.class.getName() + this.hashCode(), 10); } @Override public List completion(String buf, int cursor) { return null; } - } diff --git a/hive/src/test/java/org/apache/zeppelin/hive/HiveInterpreterTest.java b/hive/src/test/java/org/apache/zeppelin/hive/HiveInterpreterTest.java index 41ab1089b52..c22080d57f0 100644 --- a/hive/src/test/java/org/apache/zeppelin/hive/HiveInterpreterTest.java +++ b/hive/src/test/java/org/apache/zeppelin/hive/HiveInterpreterTest.java @@ -17,30 +17,50 @@ */ package org.apache.zeppelin.hive; -import static org.junit.Assert.assertEquals; - -import java.io.InputStream; -import java.io.Reader; -import java.math.BigDecimal; -import java.net.URL; -import java.sql.*; -import java.util.Calendar; -import java.util.Map; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; import java.util.Properties; -import java.util.concurrent.Executor; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterResult; import org.junit.After; -import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; +import static org.junit.Assert.*; +import static java.lang.String.format; + /** * Hive interpreter unit tests */ public class HiveInterpreterTest { - @Before - public void setUp() throws Exception { + static String jdbcConnection; + + private static String getJdbcConnection() throws IOException { + if(null == jdbcConnection) { + Path tmpDir = Files.createTempDirectory("h2-test-"); + tmpDir.toFile().deleteOnExit(); + jdbcConnection = format("jdbc:h2:%s", tmpDir); + } + return jdbcConnection; + } + @BeforeClass + public static void setUp() throws Exception { + + Class.forName("org.h2.Driver"); + Connection connection = DriverManager.getConnection(getJdbcConnection()); + Statement statement = connection.createStatement(); + statement.execute( + "DROP TABLE IF EXISTS test_table; " + + "CREATE TABLE test_table(id varchar(255), name varchar(255));"); + statement.execute( + "insert into test_table(id, name) values ('a', 'a_name'),('b', 'b_name');" + ); } @After @@ -48,1599 +68,129 @@ public void tearDown() throws Exception { } @Test - public void test() { - HiveInterpreter t = new MockHiveInterpreter(new Properties()); + public void readTest() throws IOException { + Properties properties = new Properties(); + properties.setProperty("common.max_count", "1000"); + properties.setProperty("common.max_retry", "3"); + properties.setProperty("default.driver", "org.h2.Driver"); + properties.setProperty("default.url", getJdbcConnection()); + properties.setProperty("default.user", ""); + properties.setProperty("default.password", ""); + HiveInterpreter t = new HiveInterpreter(properties); t.open(); - //simple select test - InterpreterResult result = t.interpret("select * from t", null); - assertEquals(result.type(), InterpreterResult.Type.TABLE); - - //explain test - result = t.interpret("explain select * from t", null); - assertEquals(result.type(), InterpreterResult.Type.TEXT); - t.close(); - } -} - -class MockHiveInterpreter extends HiveInterpreter { - - public MockHiveInterpreter(Properties property) { - super(property); - } - - @Override - public Connection getJdbcConnection() - throws SQLException { - return new MockConnection(); - } -} - -class MockResultSetMetadata implements ResultSetMetaData { - - @Override - public int getColumnCount() throws SQLException { - return 0; - } - - @Override - public boolean isAutoIncrement(int column) throws SQLException { - return false; - } - - @Override - public boolean isCaseSensitive(int column) throws SQLException { - return false; - } - - @Override - public boolean isSearchable(int column) throws SQLException { - return false; - } - - @Override - public boolean isCurrency(int column) throws SQLException { - return false; - } - - @Override - public int isNullable(int column) throws SQLException { - return 0; - } - - @Override - public boolean isSigned(int column) throws SQLException { - return false; - } - - @Override - public int getColumnDisplaySize(int column) throws SQLException { - return 0; - } - - @Override - public String getColumnLabel(int column) throws SQLException { - return null; - } - - @Override - public String getColumnName(int column) throws SQLException { - return null; - } - - @Override - public String getSchemaName(int column) throws SQLException { - return null; - } - - @Override - public int getPrecision(int column) throws SQLException { - return 0; - } - - @Override - public int getScale(int column) throws SQLException { - return 0; - } - - @Override - public String getTableName(int column) throws SQLException { - return null; - } - - @Override - public String getCatalogName(int column) throws SQLException { - return null; - } - - @Override - public int getColumnType(int column) throws SQLException { - return 0; - } - - @Override - public String getColumnTypeName(int column) throws SQLException { - return null; - } - - @Override - public boolean isReadOnly(int column) throws SQLException { - return false; - } - - @Override - public boolean isWritable(int column) throws SQLException { - return false; - } - - @Override - public boolean isDefinitelyWritable(int column) throws SQLException { - return false; - } - - @Override - public String getColumnClassName(int column) throws SQLException { - return null; - } - - @Override - public T unwrap(Class iface) throws SQLException { - return null; - } - - @Override - public boolean isWrapperFor(Class iface) throws SQLException { - return false; - } -} -class MockResultSet implements ResultSet { - - @Override - public boolean next() throws SQLException { - return false; - } - - @Override - public void close() throws SQLException { - - } - - @Override - public boolean wasNull() throws SQLException { - return false; - } - - @Override - public String getString(int columnIndex) throws SQLException { - return null; - } - - @Override - public boolean getBoolean(int columnIndex) throws SQLException { - return false; - } - - @Override - public byte getByte(int columnIndex) throws SQLException { - return 0; - } - - @Override - public short getShort(int columnIndex) throws SQLException { - return 0; - } - - @Override - public int getInt(int columnIndex) throws SQLException { - return 0; - } - - @Override - public long getLong(int columnIndex) throws SQLException { - return 0; - } - - @Override - public float getFloat(int columnIndex) throws SQLException { - return 0; - } - - @Override - public double getDouble(int columnIndex) throws SQLException { - return 0; - } - - @Override - public BigDecimal getBigDecimal(int columnIndex, int scale) throws SQLException { - return null; - } - - @Override - public byte[] getBytes(int columnIndex) throws SQLException { - return new byte[0]; - } - - @Override - public Date getDate(int columnIndex) throws SQLException { - return null; - } - - @Override - public Time getTime(int columnIndex) throws SQLException { - return null; - } - - @Override - public Timestamp getTimestamp(int columnIndex) throws SQLException { - return null; - } - - @Override - public InputStream getAsciiStream(int columnIndex) throws SQLException { - return null; - } - - @Override - public InputStream getUnicodeStream(int columnIndex) throws SQLException { - return null; - } - - @Override - public InputStream getBinaryStream(int columnIndex) throws SQLException { - return null; - } - - @Override - public String getString(String columnLabel) throws SQLException { - return null; - } - - @Override - public boolean getBoolean(String columnLabel) throws SQLException { - return false; - } - - @Override - public byte getByte(String columnLabel) throws SQLException { - return 0; - } - - @Override - public short getShort(String columnLabel) throws SQLException { - return 0; - } - - @Override - public int getInt(String columnLabel) throws SQLException { - return 0; - } - - @Override - public long getLong(String columnLabel) throws SQLException { - return 0; - } - - @Override - public float getFloat(String columnLabel) throws SQLException { - return 0; - } - - @Override - public double getDouble(String columnLabel) throws SQLException { - return 0; - } - - @Override - public BigDecimal getBigDecimal(String columnLabel, int scale) throws SQLException { - return null; - } - - @Override - public byte[] getBytes(String columnLabel) throws SQLException { - return new byte[0]; - } - - @Override - public Date getDate(String columnLabel) throws SQLException { - return null; - } - - @Override - public Time getTime(String columnLabel) throws SQLException { - return null; - } - - @Override - public Timestamp getTimestamp(String columnLabel) throws SQLException { - return null; - } - - @Override - public InputStream getAsciiStream(String columnLabel) throws SQLException { - return null; - } - - @Override - public InputStream getUnicodeStream(String columnLabel) throws SQLException { - return null; - } - - @Override - public InputStream getBinaryStream(String columnLabel) throws SQLException { - return null; - } - - @Override - public SQLWarning getWarnings() throws SQLException { - return null; - } - - @Override - public void clearWarnings() throws SQLException { - - } - - @Override - public String getCursorName() throws SQLException { - return null; - } - - @Override - public ResultSetMetaData getMetaData() throws SQLException { - return new MockResultSetMetadata(); - } - - @Override - public Object getObject(int columnIndex) throws SQLException { - return null; - } - - @Override - public Object getObject(String columnLabel) throws SQLException { - return null; - } - - @Override - public int findColumn(String columnLabel) throws SQLException { - return 0; - } - - @Override - public Reader getCharacterStream(int columnIndex) throws SQLException { - return null; - } - - @Override - public Reader getCharacterStream(String columnLabel) throws SQLException { - return null; - } - - @Override - public BigDecimal getBigDecimal(int columnIndex) throws SQLException { - return null; - } - - @Override - public BigDecimal getBigDecimal(String columnLabel) throws SQLException { - return null; - } - - @Override - public boolean isBeforeFirst() throws SQLException { - return false; - } - - @Override - public boolean isAfterLast() throws SQLException { - return false; - } - - @Override - public boolean isFirst() throws SQLException { - return false; - } - - @Override - public boolean isLast() throws SQLException { - return false; - } - - @Override - public void beforeFirst() throws SQLException { - - } - - @Override - public void afterLast() throws SQLException { - - } - - @Override - public boolean first() throws SQLException { - return false; - } - - @Override - public boolean last() throws SQLException { - return false; - } - - @Override - public int getRow() throws SQLException { - return 0; - } - - @Override - public boolean absolute(int row) throws SQLException { - return false; - } - - @Override - public boolean relative(int rows) throws SQLException { - return false; - } - - @Override - public boolean previous() throws SQLException { - return false; - } - - @Override - public void setFetchDirection(int direction) throws SQLException { - - } - - @Override - public int getFetchDirection() throws SQLException { - return 0; - } - - @Override - public void setFetchSize(int rows) throws SQLException { - - } - - @Override - public int getFetchSize() throws SQLException { - return 0; - } - - @Override - public int getType() throws SQLException { - return 0; + assertTrue(t.interpret("show databases", new InterpreterContext("", "1", "","", null,null,null,null)).message().contains("SCHEMA_NAME")); + assertEquals("ID\tNAME\na\ta_name\nb\tb_name\n", + t.interpret("select * from test_table", new InterpreterContext("", "1", "","", null,null,null,null)).message()); } - @Override - public int getConcurrency() throws SQLException { - return 0; - } - - @Override - public boolean rowUpdated() throws SQLException { - return false; - } - - @Override - public boolean rowInserted() throws SQLException { - return false; - } - - @Override - public boolean rowDeleted() throws SQLException { - return false; - } - - @Override - public void updateNull(int columnIndex) throws SQLException { - - } - - @Override - public void updateBoolean(int columnIndex, boolean x) throws SQLException { - - } - - @Override - public void updateByte(int columnIndex, byte x) throws SQLException { - - } - - @Override - public void updateShort(int columnIndex, short x) throws SQLException { - - } - - @Override - public void updateInt(int columnIndex, int x) throws SQLException { - - } - - @Override - public void updateLong(int columnIndex, long x) throws SQLException { - - } - - @Override - public void updateFloat(int columnIndex, float x) throws SQLException { - - } - - @Override - public void updateDouble(int columnIndex, double x) throws SQLException { - - } - - @Override - public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException { - - } - - @Override - public void updateString(int columnIndex, String x) throws SQLException { - - } - - @Override - public void updateBytes(int columnIndex, byte[] x) throws SQLException { - - } - - @Override - public void updateDate(int columnIndex, Date x) throws SQLException { - - } - - @Override - public void updateTime(int columnIndex, Time x) throws SQLException { - - } - - @Override - public void updateTimestamp(int columnIndex, Timestamp x) throws SQLException { + @Test + public void readTestWithConfiguration() throws IOException { + Properties properties = new Properties(); + properties.setProperty("common.max_count", "1000"); + properties.setProperty("common.max_retry", "3"); + properties.setProperty("default.driver", "wrong.Driver"); + properties.setProperty("default.url", getJdbcConnection()); + properties.setProperty("default.user", ""); + properties.setProperty("default.password", ""); + properties.setProperty("h2.driver", "org.h2.Driver"); + properties.setProperty("h2.url", getJdbcConnection()); + properties.setProperty("h2.user", ""); + properties.setProperty("h2.password", ""); + HiveInterpreter t = new HiveInterpreter(properties); + t.open(); + assertEquals("ID\tNAME\na\ta_name\nb\tb_name\n", + t.interpret("(h2)\n select * from test_table", new InterpreterContext("", "1", "","", null,null,null,null)).message()); } - @Override - public void updateAsciiStream(int columnIndex, InputStream x, int length) throws SQLException { + @Test + public void jdbcRestart() throws IOException, SQLException, ClassNotFoundException { + Properties properties = new Properties(); + properties.setProperty("common.max_count", "1000"); + properties.setProperty("common.max_retry", "3"); + properties.setProperty("default.driver", "org.h2.Driver"); + properties.setProperty("default.url", getJdbcConnection()); + properties.setProperty("default.user", ""); + properties.setProperty("default.password", ""); + HiveInterpreter t = new HiveInterpreter(properties); + t.open(); - } + InterpreterResult interpreterResult = + t.interpret("select * from test_table", new InterpreterContext("", "1", "","", null,null,null,null)); + assertEquals("ID\tNAME\na\ta_name\nb\tb_name\n", interpreterResult.message()); - @Override - public void updateBinaryStream(int columnIndex, InputStream x, int length) throws SQLException { + t.getConnection("default").close(); + interpreterResult = + t.interpret("select * from test_table", new InterpreterContext("", "1", "","", null,null,null,null)); + assertEquals("ID\tNAME\na\ta_name\nb\tb_name\n", interpreterResult.message()); } - @Override - public void updateCharacterStream(int columnIndex, Reader x, int length) throws SQLException { + @Test + public void test() throws IOException { + Properties properties = new Properties(); + properties.setProperty("common.max_count", "1000"); + properties.setProperty("common.max_retry", "3"); + properties.setProperty("default.driver", "org.h2.Driver"); + properties.setProperty("default.url", getJdbcConnection()); + properties.setProperty("default.user", ""); + properties.setProperty("default.password", ""); + HiveInterpreter t = new HiveInterpreter(properties); + t.open(); - } + InterpreterContext interpreterContext = new InterpreterContext(null, "a", null, null, null, null, null, null); - @Override - public void updateObject(int columnIndex, Object x, int scaleOrLength) throws SQLException { + //simple select test + InterpreterResult result = t.interpret("select * from test_table", interpreterContext); + assertEquals(result.type(), InterpreterResult.Type.TABLE); + //explain test + result = t.interpret("explain select * from test_table", interpreterContext); + assertEquals(result.type(), InterpreterResult.Type.TEXT); + t.close(); } - @Override - public void updateObject(int columnIndex, Object x) throws SQLException { - + @Test + public void parseMultiplePropertiesMap() { + Properties properties = new Properties(); + properties.setProperty("common.max_count", "1000"); + properties.setProperty("common.max_retry", "3"); + properties.setProperty("default.driver", "defaultDriver"); + properties.setProperty("default.url", "defaultUri"); + properties.setProperty("default.user", "defaultUser"); + HiveInterpreter hi = new HiveInterpreter(properties); + hi.open(); + assertNotNull("propertiesMap is not null", hi.getPropertiesMap()); + assertNotNull("propertiesMap.get(default) is not null", hi.getPropertiesMap().get("default")); + assertTrue("default exists", "defaultDriver".equals(hi.getPropertiesMap().get("default").getProperty("driver"))); + hi.close(); } - @Override - public void updateNull(String columnLabel) throws SQLException { - + @Test + public void ignoreInvalidSettings() { + Properties properties = new Properties(); + properties.setProperty("common.max_count", "1000"); + properties.setProperty("common.max_retry", "3"); + properties.setProperty("default.driver", "defaultDriver"); + properties.setProperty("default.url", "defaultUri"); + properties.setProperty("default.user", "defaultUser"); + properties.setProperty("presto.driver", "com.facebook.presto.jdbc.PrestoDriver"); + HiveInterpreter hi = new HiveInterpreter(properties); + hi.open(); + assertTrue("default exists", hi.getPropertiesMap().containsKey("default")); + assertFalse("presto doesn't exists", hi.getPropertiesMap().containsKey("presto")); + hi.close(); } - @Override - public void updateBoolean(String columnLabel, boolean x) throws SQLException { - - } - - @Override - public void updateByte(String columnLabel, byte x) throws SQLException { - - } - - @Override - public void updateShort(String columnLabel, short x) throws SQLException { - - } - - @Override - public void updateInt(String columnLabel, int x) throws SQLException { - - } - - @Override - public void updateLong(String columnLabel, long x) throws SQLException { - - } - - @Override - public void updateFloat(String columnLabel, float x) throws SQLException { - - } - - @Override - public void updateDouble(String columnLabel, double x) throws SQLException { - - } - - @Override - public void updateBigDecimal(String columnLabel, BigDecimal x) throws SQLException { - - } - - @Override - public void updateString(String columnLabel, String x) throws SQLException { - - } - - @Override - public void updateBytes(String columnLabel, byte[] x) throws SQLException { - - } - - @Override - public void updateDate(String columnLabel, Date x) throws SQLException { - - } - - @Override - public void updateTime(String columnLabel, Time x) throws SQLException { - - } - - @Override - public void updateTimestamp(String columnLabel, Timestamp x) throws SQLException { - - } - - @Override - public void updateAsciiStream(String columnLabel, InputStream x, int length) throws SQLException { - - } - - @Override - public void updateBinaryStream(String columnLabel, InputStream x, int length) throws SQLException { - - } - - @Override - public void updateCharacterStream(String columnLabel, Reader reader, int length) throws SQLException { - - } - - @Override - public void updateObject(String columnLabel, Object x, int scaleOrLength) throws SQLException { - - } - - @Override - public void updateObject(String columnLabel, Object x) throws SQLException { - - } - - @Override - public void insertRow() throws SQLException { - - } - - @Override - public void updateRow() throws SQLException { - - } - - @Override - public void deleteRow() throws SQLException { - - } - - @Override - public void refreshRow() throws SQLException { - - } - - @Override - public void cancelRowUpdates() throws SQLException { - - } - - @Override - public void moveToInsertRow() throws SQLException { - - } - - @Override - public void moveToCurrentRow() throws SQLException { - - } - - @Override - public Statement getStatement() throws SQLException { - return new MockStatement(); - } - - @Override - public Object getObject(int columnIndex, Map> map) throws SQLException { - return null; - } - - @Override - public Ref getRef(int columnIndex) throws SQLException { - return null; - } - - @Override - public Blob getBlob(int columnIndex) throws SQLException { - return null; - } - - @Override - public Clob getClob(int columnIndex) throws SQLException { - return null; - } - - @Override - public Array getArray(int columnIndex) throws SQLException { - return null; - } - - @Override - public Object getObject(String columnLabel, Map> map) throws SQLException { - return null; - } - - @Override - public Ref getRef(String columnLabel) throws SQLException { - return null; - } - - @Override - public Blob getBlob(String columnLabel) throws SQLException { - return null; - } - - @Override - public Clob getClob(String columnLabel) throws SQLException { - return null; - } - - @Override - public Array getArray(String columnLabel) throws SQLException { - return null; - } - - @Override - public Date getDate(int columnIndex, Calendar cal) throws SQLException { - return null; - } - - @Override - public Date getDate(String columnLabel, Calendar cal) throws SQLException { - return null; - } - - @Override - public Time getTime(int columnIndex, Calendar cal) throws SQLException { - return null; - } - - @Override - public Time getTime(String columnLabel, Calendar cal) throws SQLException { - return null; - } - - @Override - public Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException { - return null; - } - - @Override - public Timestamp getTimestamp(String columnLabel, Calendar cal) throws SQLException { - return null; - } - - @Override - public URL getURL(int columnIndex) throws SQLException { - return null; - } - - @Override - public URL getURL(String columnLabel) throws SQLException { - return null; - } - - @Override - public void updateRef(int columnIndex, Ref x) throws SQLException { - - } - - @Override - public void updateRef(String columnLabel, Ref x) throws SQLException { - - } - - @Override - public void updateBlob(int columnIndex, Blob x) throws SQLException { - - } - - @Override - public void updateBlob(String columnLabel, Blob x) throws SQLException { - - } - - @Override - public void updateClob(int columnIndex, Clob x) throws SQLException { - - } - - @Override - public void updateClob(String columnLabel, Clob x) throws SQLException { - - } - - @Override - public void updateArray(int columnIndex, Array x) throws SQLException { - - } - - @Override - public void updateArray(String columnLabel, Array x) throws SQLException { - - } - - @Override - public RowId getRowId(int columnIndex) throws SQLException { - return null; - } - - @Override - public RowId getRowId(String columnLabel) throws SQLException { - return null; - } - - @Override - public void updateRowId(int columnIndex, RowId x) throws SQLException { - - } - - @Override - public void updateRowId(String columnLabel, RowId x) throws SQLException { - - } - - @Override - public int getHoldability() throws SQLException { - return 0; - } - - @Override - public boolean isClosed() throws SQLException { - return false; - } - - @Override - public void updateNString(int columnIndex, String nString) throws SQLException { - - } - - @Override - public void updateNString(String columnLabel, String nString) throws SQLException { - - } - - @Override - public void updateNClob(int columnIndex, NClob nClob) throws SQLException { - - } - - @Override - public void updateNClob(String columnLabel, NClob nClob) throws SQLException { - - } - - @Override - public NClob getNClob(int columnIndex) throws SQLException { - return null; - } - - @Override - public NClob getNClob(String columnLabel) throws SQLException { - return null; - } - - @Override - public SQLXML getSQLXML(int columnIndex) throws SQLException { - return null; - } - - @Override - public SQLXML getSQLXML(String columnLabel) throws SQLException { - return null; - } - - @Override - public void updateSQLXML(int columnIndex, SQLXML xmlObject) throws SQLException { - - } - - @Override - public void updateSQLXML(String columnLabel, SQLXML xmlObject) throws SQLException { - - } - - @Override - public String getNString(int columnIndex) throws SQLException { - return null; - } - - @Override - public String getNString(String columnLabel) throws SQLException { - return null; - } - - @Override - public Reader getNCharacterStream(int columnIndex) throws SQLException { - return null; - } - - @Override - public Reader getNCharacterStream(String columnLabel) throws SQLException { - return null; - } - - @Override - public void updateNCharacterStream(int columnIndex, Reader x, long length) throws SQLException { - - } - - @Override - public void updateNCharacterStream(String columnLabel, Reader reader, long length) throws SQLException { - - } - - @Override - public void updateAsciiStream(int columnIndex, InputStream x, long length) throws SQLException { - - } - - @Override - public void updateBinaryStream(int columnIndex, InputStream x, long length) throws SQLException { - - } - - @Override - public void updateCharacterStream(int columnIndex, Reader x, long length) throws SQLException { - - } - - @Override - public void updateAsciiStream(String columnLabel, InputStream x, long length) throws SQLException { - - } - - @Override - public void updateBinaryStream(String columnLabel, InputStream x, long length) throws SQLException { - - } - - @Override - public void updateCharacterStream(String columnLabel, Reader reader, long length) throws SQLException { - - } - - @Override - public void updateBlob(int columnIndex, InputStream inputStream, long length) throws SQLException { - - } - - @Override - public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException { - - } - - @Override - public void updateClob(int columnIndex, Reader reader, long length) throws SQLException { - - } - - @Override - public void updateClob(String columnLabel, Reader reader, long length) throws SQLException { - - } - - @Override - public void updateNClob(int columnIndex, Reader reader, long length) throws SQLException { - - } - - @Override - public void updateNClob(String columnLabel, Reader reader, long length) throws SQLException { - - } - - @Override - public void updateNCharacterStream(int columnIndex, Reader x) throws SQLException { - - } - - @Override - public void updateNCharacterStream(String columnLabel, Reader reader) throws SQLException { - - } - - @Override - public void updateAsciiStream(int columnIndex, InputStream x) throws SQLException { - - } - - @Override - public void updateBinaryStream(int columnIndex, InputStream x) throws SQLException { - - } - - @Override - public void updateCharacterStream(int columnIndex, Reader x) throws SQLException { - - } - - @Override - public void updateAsciiStream(String columnLabel, InputStream x) throws SQLException { - - } - - @Override - public void updateBinaryStream(String columnLabel, InputStream x) throws SQLException { - - } - - @Override - public void updateCharacterStream(String columnLabel, Reader reader) throws SQLException { - - } - - @Override - public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException { - - } - - @Override - public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException { - - } - - @Override - public void updateClob(int columnIndex, Reader reader) throws SQLException { - - } - - @Override - public void updateClob(String columnLabel, Reader reader) throws SQLException { - - } - - @Override - public void updateNClob(int columnIndex, Reader reader) throws SQLException { - - } - - @Override - public void updateNClob(String columnLabel, Reader reader) throws SQLException { - - } - - @Override - public T getObject(int columnIndex, Class type) throws SQLException { - return null; - } - - @Override - public T getObject(String columnLabel, Class type) throws SQLException { - return null; - } - - @Override - public T unwrap(Class iface) throws SQLException { - return null; - } - - @Override - public boolean isWrapperFor(Class iface) throws SQLException { - return false; - } -} -class MockStatement implements Statement { - - @Override - public ResultSet executeQuery(String sql) throws SQLException { - return new MockResultSet(); - } - - @Override - public int executeUpdate(String sql) throws SQLException { - return 0; - } - - @Override - public void close() throws SQLException { - - } - - @Override - public int getMaxFieldSize() throws SQLException { - return 0; - } - - @Override - public void setMaxFieldSize(int max) throws SQLException { - - } - - @Override - public int getMaxRows() throws SQLException { - return 0; - } - - @Override - public void setMaxRows(int max) throws SQLException { - - } - - @Override - public void setEscapeProcessing(boolean enable) throws SQLException { - - } - - @Override - public int getQueryTimeout() throws SQLException { - return 0; - } - - @Override - public void setQueryTimeout(int seconds) throws SQLException { - - } - - @Override - public void cancel() throws SQLException { - - } - - @Override - public SQLWarning getWarnings() throws SQLException { - return null; - } - - @Override - public void clearWarnings() throws SQLException { - - } - - @Override - public void setCursorName(String name) throws SQLException { - - } - - @Override - public boolean execute(String sql) throws SQLException { - return false; - } - - @Override - public ResultSet getResultSet() throws SQLException { - return new MockResultSet(); - } - - @Override - public int getUpdateCount() throws SQLException { - return 0; - } - - @Override - public boolean getMoreResults() throws SQLException { - return false; - } - - @Override - public void setFetchDirection(int direction) throws SQLException { - - } - - @Override - public int getFetchDirection() throws SQLException { - return 0; - } - - @Override - public void setFetchSize(int rows) throws SQLException { - - } - - @Override - public int getFetchSize() throws SQLException { - return 0; - } - - @Override - public int getResultSetConcurrency() throws SQLException { - return 0; - } - - @Override - public int getResultSetType() throws SQLException { - return 0; - } - - @Override - public void addBatch(String sql) throws SQLException { - - } - - @Override - public void clearBatch() throws SQLException { - - } - - @Override - public int[] executeBatch() throws SQLException { - return new int[0]; - } - - @Override - public Connection getConnection() throws SQLException { - return null; - } - - @Override - public boolean getMoreResults(int current) throws SQLException { - return false; - } - - @Override - public ResultSet getGeneratedKeys() throws SQLException { - return null; - } - - @Override - public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { - return 0; - } - - @Override - public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { - return 0; - } - - @Override - public int executeUpdate(String sql, String[] columnNames) throws SQLException { - return 0; - } - - @Override - public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { - return false; - } - - @Override - public boolean execute(String sql, int[] columnIndexes) throws SQLException { - return false; - } - - @Override - public boolean execute(String sql, String[] columnNames) throws SQLException { - return false; - } - - @Override - public int getResultSetHoldability() throws SQLException { - return 0; - } - - @Override - public boolean isClosed() throws SQLException { - return false; - } - - @Override - public void setPoolable(boolean poolable) throws SQLException { - - } - - @Override - public boolean isPoolable() throws SQLException { - return false; - } - - @Override - public void closeOnCompletion() throws SQLException { - - } - - @Override - public boolean isCloseOnCompletion() throws SQLException { - return false; - } - - @Override - public T unwrap(Class iface) throws SQLException { - return null; - } - - @Override - public boolean isWrapperFor(Class iface) throws SQLException { - return false; - } -} -class MockConnection implements Connection { - - @Override - public Statement createStatement() throws SQLException { - return new MockStatement(); - } - - @Override - public PreparedStatement prepareStatement(String sql) throws SQLException { - return null; - } - - @Override - public CallableStatement prepareCall(String sql) throws SQLException { - return null; - } - - @Override - public String nativeSQL(String sql) throws SQLException { - return null; - } - - @Override - public void setAutoCommit(boolean autoCommit) throws SQLException { - - } - - @Override - public boolean getAutoCommit() throws SQLException { - return false; - } - - @Override - public void commit() throws SQLException { - - } - - @Override - public void rollback() throws SQLException { - - } - - @Override - public void close() throws SQLException { - - } - - @Override - public boolean isClosed() throws SQLException { - return false; - } - - @Override - public DatabaseMetaData getMetaData() throws SQLException { - return null; - } - - @Override - public void setReadOnly(boolean readOnly) throws SQLException { - - } - - @Override - public boolean isReadOnly() throws SQLException { - return false; - } - - @Override - public void setCatalog(String catalog) throws SQLException { - - } - - @Override - public String getCatalog() throws SQLException { - return null; - } - - @Override - public void setTransactionIsolation(int level) throws SQLException { - - } - - @Override - public int getTransactionIsolation() throws SQLException { - return 0; - } - - @Override - public SQLWarning getWarnings() throws SQLException { - return null; - } - - @Override - public void clearWarnings() throws SQLException { - - } - - @Override - public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { - return null; - } - - @Override - public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { - return null; - } - - @Override - public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { - return null; - } - - @Override - public Map> getTypeMap() throws SQLException { - return null; - } - - @Override - public void setTypeMap(Map> map) throws SQLException { - - } - - @Override - public void setHoldability(int holdability) throws SQLException { - - } - - @Override - public int getHoldability() throws SQLException { - return 0; - } - - @Override - public Savepoint setSavepoint() throws SQLException { - return null; - } - - @Override - public Savepoint setSavepoint(String name) throws SQLException { - return null; - } - - @Override - public void rollback(Savepoint savepoint) throws SQLException { - - } - - @Override - public void releaseSavepoint(Savepoint savepoint) throws SQLException { - - } - - @Override - public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { - return null; - } - - @Override - public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { - return null; - } - - @Override - public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { - return null; - } - - @Override - public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { - return null; - } - - @Override - public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { - return null; - } - - @Override - public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { - return null; - } - - @Override - public Clob createClob() throws SQLException { - return null; - } - - @Override - public Blob createBlob() throws SQLException { - return null; - } - - @Override - public NClob createNClob() throws SQLException { - return null; - } - - @Override - public SQLXML createSQLXML() throws SQLException { - return null; - } - - @Override - public boolean isValid(int timeout) throws SQLException { - return false; - } - - @Override - public void setClientInfo(String name, String value) throws SQLClientInfoException { - - } - - @Override - public void setClientInfo(Properties properties) throws SQLClientInfoException { - - } - - @Override - public String getClientInfo(String name) throws SQLException { - return null; - } - - @Override - public Properties getClientInfo() throws SQLException { - return null; - } - - @Override - public Array createArrayOf(String typeName, Object[] elements) throws SQLException { - return null; - } - - @Override - public Struct createStruct(String typeName, Object[] attributes) throws SQLException { - return null; - } - - @Override - public void setSchema(String schema) throws SQLException { - - } - - @Override - public String getSchema() throws SQLException { - return null; - } - - @Override - public void abort(Executor executor) throws SQLException { - - } - - @Override - public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException { - - } - - @Override - public int getNetworkTimeout() throws SQLException { - return 0; - } - - @Override - public T unwrap(Class iface) throws SQLException { - return null; - } - - @Override - public boolean isWrapperFor(Class iface) throws SQLException { - return false; - } -} + @Test + public void getPropertyKey() { + HiveInterpreter hi = new HiveInterpreter(new Properties()); + hi.open(); + String testCommand = "(default)\nshow tables"; + assertEquals("get key of default", "default", hi.getPropertyKey(testCommand)); + testCommand = "(default) show tables"; + assertEquals("get key of default", "default", hi.getPropertyKey(testCommand)); + hi.close(); + } +} \ No newline at end of file diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java index ef1f115dea7..27f4b652531 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java @@ -193,6 +193,7 @@ public void close() { @Override public InterpreterResult interpret(String st, InterpreterContext context) { + logger.debug("st: {}", st); FormType form = getFormType(); RemoteInterpreterProcess interpreterProcess = getInterpreterProcess(); Client client = null; diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java index 725ee63131a..46a07083468 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java @@ -203,6 +203,7 @@ public void close(String className) throws TException { @Override public RemoteInterpreterResult interpret(String className, String st, RemoteInterpreterContext interpreterContext) throws TException { + logger.debug("st: {}", st); Interpreter intp = getInterpreter(className); InterpreterContext context = convert(interpreterContext); diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java index 348c12ed259..ec47efdde61 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java @@ -103,7 +103,7 @@ public static String getRequiredReplName(String text) { int scriptHeadIndex = 0; for (int i = 0; i < text.length(); i++) { char ch = text.charAt(i); - if (ch == ' ' || ch == '\n') { + if (ch == ' ' || ch == '\n' || ch == '(') { scriptHeadIndex = i; break; } @@ -132,10 +132,10 @@ public static String getScriptBody(String text) { if (magic == null) { return text; } - if (magic.length() + 2 >= text.length()) { + if (magic.length() + 1 >= text.length()) { return ""; } - return text.substring(magic.length() + 2); + return text.substring(magic.length() + 1).trim(); } public NoteInterpreterLoader getNoteReplLoader() { diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/ParagraphTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/ParagraphTest.java new file mode 100644 index 00000000000..87805cef133 --- /dev/null +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/ParagraphTest.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.notebook; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class ParagraphTest { + @Test + public void scriptBodyWithReplName() { + String text = "%spark(1234567"; + assertEquals("(1234567", Paragraph.getScriptBody(text)); + + text = "%table 1234567"; + assertEquals("1234567", Paragraph.getScriptBody(text)); + } + @Test + public void scriptBodyWithoutReplName() { + String text = "12345678"; + assertEquals(text, Paragraph.getScriptBody(text)); + } +} From 986b0adba3a7986a387c0633d15279b6b2f45c95 Mon Sep 17 00:00:00 2001 From: Michael Chen Date: Wed, 2 Dec 2015 09:16:27 -0600 Subject: [PATCH 097/491] ZEPPELIN-442: utilize space between paragraphs to add new paragraphs This PR relates to: https://issues.apache.org/jira/browse/ZEPPELIN-442 Quickly add new paragraphs. By utilizing the space between the paragraphs, thought it'd be a good place to add new paragraphs. Thoughts/suggestions? Current User Experience of Adding New Paragraph (no direct response if paragraph covers screen): ![before-1](https://cloud.githubusercontent.com/assets/6380209/11248426/b6b668ec-8de6-11e5-9785-c2362c878a88.gif) After Pull Request (adds above the paragraph): ![after-1](https://cloud.githubusercontent.com/assets/6380209/11248444/db528a28-8de6-11e5-93b6-411a672a5c1d.gif) Author: Michael Chen Closes #447 from MikeTYChen/ZEPPELIN-442 and squashes the following commits: 67df37a [Michael Chen] revert control top spacing to 16px b9f2780 [Michael Chen] Merge branch 'master' into ZEPPELIN-442 29b222d [Michael Chen] add clearer feature and clean css 20149a3 [Michael Chen] add functionality to add below last paragraph ebd8264 [Michael Chen] Merge branch 'master' into ZEPPELIN-442 e6eae3f [Michael Chen] Merge branch 'master' into ZEPPELIN-442 a352363 [Michael Chen] ZEPPELIN-442: modify add new paragraph height ee28972 [Michael Chen] Merge remote-tracking branch 'upstream/master' into ZEPPELIN-442 423add0 [Michael Chen] ZEPPELIN-442: utilize space between paragraphs to add new para --- .../src/app/notebook/notebook.controller.js | 11 ++++++-- zeppelin-web/src/app/notebook/notebook.css | 28 +++++++++++++++++++ zeppelin-web/src/app/notebook/notebook.html | 6 ++++ .../paragraph/paragraph.controller.js | 4 +-- .../src/assets/styles/looknfeel/simple.css | 2 +- 5 files changed, 45 insertions(+), 6 deletions(-) diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index c7d53474fe0..fc9acb10f7a 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -291,11 +291,16 @@ angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $ro }); // create new paragraph on current position - $scope.$on('insertParagraph', function(event, paragraphId) { + $scope.$on('insertParagraph', function(event, paragraphId, position) { var newIndex = -1; for (var i=0; i<$scope.note.paragraphs.length; i++) { - if ($scope.note.paragraphs[i].id === paragraphId) { - newIndex = i+1; + if ( $scope.note.paragraphs[i].id === paragraphId ) { + //determine position of where to add new paragraph; default is below + if ( position === 'above' ) { + newIndex = i; + } else { + newIndex = i+1; + } break; } } diff --git a/zeppelin-web/src/app/notebook/notebook.css b/zeppelin-web/src/app/notebook/notebook.css index eaf41d920ab..4b6271c8dc9 100644 --- a/zeppelin-web/src/app/notebook/notebook.css +++ b/zeppelin-web/src/app/notebook/notebook.css @@ -37,6 +37,34 @@ margin-top: 20px; } +/* + Add New Paragraph + */ + +.new-paragraph{ + text-align: center; + height: 7px; + margin: -7px 2px 0 2px; + cursor: pointer; +} + +.new-paragraph:hover{ + background: #d3e5ea; +} + +.new-paragraph:hover .plus-sign{ + display: block; +} + +.plus-sign{ + display: none; + height: 7px; + margin: 0; + color: #3071a9; + line-height: 5px; + font-size: 11.5px; +} + .noteBtnfa { margin-left: 3px; } diff --git a/zeppelin-web/src/app/notebook/notebook.html b/zeppelin-web/src/app/notebook/notebook.html index 23411607cc0..970e9e4cdba 100644 --- a/zeppelin-web/src/app/notebook/notebook.html +++ b/zeppelin-web/src/app/notebook/notebook.html @@ -188,12 +188,18 @@
    Interpreter binding
    ng-Init="init(currentParagraph)" ng-class="columnWidthClass(currentParagraph.config.colWidth)" class="paragraph-col"> +
    +

    +

    +
    +
    +

    +

    +
    diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index 8114e9ebb68..a4e7c1717f3 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -287,8 +287,8 @@ angular.module('zeppelinWebApp') $scope.$emit('moveParagraphDown', $scope.paragraph.id); }; - $scope.insertNew = function() { - $scope.$emit('insertParagraph', $scope.paragraph.id); + $scope.insertNew = function(position) { + $scope.$emit('insertParagraph', $scope.paragraph.id, position || 'below'); }; $scope.removeParagraph = function() { diff --git a/zeppelin-web/src/assets/styles/looknfeel/simple.css b/zeppelin-web/src/assets/styles/looknfeel/simple.css index c2ede61ff03..7817da28ec8 100644 --- a/zeppelin-web/src/assets/styles/looknfeel/simple.css +++ b/zeppelin-web/src/assets/styles/looknfeel/simple.css @@ -45,7 +45,7 @@ body { .paragraph .control { visibility: hidden; - top: 7px !important; + top: 5px !important; right: 10px !important; } From 991d6357874f19553747df499cff49d0b576107a Mon Sep 17 00:00:00 2001 From: Renjith Kamath Date: Thu, 3 Dec 2015 15:07:45 +0530 Subject: [PATCH 098/491] Cron UI fix and css cleanup - add spacing between links in presets - remove inline css and fix alignment Before screen shot 2015-12-03 at 2 02 13 pm screen shot 2015-12-03 at 2 46 27 pm
    After screen shot 2015-12-03 at 2 01 30 pm screen shot 2015-12-03 at 2 48 17 pm Author: Renjith Kamath Closes #511 from r-kamath/cronUIFix and squashes the following commits: 87c21cd [Renjith Kamath] add more spacing between cron expression and error message 7aa6f5c [Renjith Kamath] Cron UI fix and css cleanup --- zeppelin-web/src/app/notebook/notebook.css | 26 +++++++++++++++ zeppelin-web/src/app/notebook/notebook.html | 36 ++++++++++----------- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/zeppelin-web/src/app/notebook/notebook.css b/zeppelin-web/src/app/notebook/notebook.css index 4b6271c8dc9..454e4749dae 100644 --- a/zeppelin-web/src/app/notebook/notebook.css +++ b/zeppelin-web/src/app/notebook/notebook.css @@ -174,3 +174,29 @@ .setting .modal-footer { border: 0; } + +.cron-preset-container { + padding: 10px 20px 0 20px; + font-weight: normal; + word-wrap: break-word; +} + +.cron-preset-container > div { + margin: 10px 0; +} + +.cron-preset { + margin: 0px 2px; + cursor: pointer; +} + +.cron-info { + margin: 5px; + font-size: 11px; +} + +.cron-preset.selected { + color: #000; + text-decoration: none; + cursor: default; +} diff --git a/zeppelin-web/src/app/notebook/notebook.html b/zeppelin-web/src/app/notebook/notebook.html index 970e9e4cdba..935192a0d0e 100644 --- a/zeppelin-web/src/app/notebook/notebook.html +++ b/zeppelin-web/src/app/notebook/notebook.html @@ -81,26 +81,26 @@

    From ccba2ec2d509bd4bc250f65ad8e693a3f4c54341 Mon Sep 17 00:00:00 2001 From: Renjith Kamath Date: Thu, 3 Dec 2015 15:26:02 +0530 Subject: [PATCH 099/491] Add animation for dropdown menu Author: Renjith Kamath Closes #479 from r-kamath/animateMenu and squashes the following commits: 55f9969 [Renjith Kamath] update animation time to 0.2s a57aca7 [Renjith Kamath] Add animation for dropdown menu --- .../src/app/notebook/paragraph/paragraph.css | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.css b/zeppelin-web/src/app/notebook/paragraph/paragraph.css index 6588736763e..98a4b4b3454 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.css +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.css @@ -182,6 +182,20 @@ color: #333333; } +.dropdown-menu { + display: block; + visibility: hidden; + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; +} + +.open > .dropdown-menu { + visibility: visible; + opacity: 1; +} + /* Paragraph Menu */ From d90e3805bb2d2434bc08672a6227c0afc927f6ae Mon Sep 17 00:00:00 2001 From: Damien CORNEAU Date: Thu, 3 Dec 2015 15:55:02 +0900 Subject: [PATCH 100/491] Don't set Dirty state if text is same as last save Previous Behavior ![masterbranch](https://cloud.githubusercontent.com/assets/710411/11531309/4696e4ec-993f-11e5-9f4b-ef0fe774e507.gif) With this PR ![prbranch](https://cloud.githubusercontent.com/assets/710411/11531313/4e0e9c60-993f-11e5-9b47-8b33bb34243c.gif) Author: Damien CORNEAU Closes #505 from corneadoug/improve/saveOnDirty and squashes the following commits: 1c72502 [Damien CORNEAU] Fix run and update cases 95ea650 [Damien CORNEAU] Check that dirtyText is different from originalText before saving --- .../src/app/notebook/paragraph/paragraph.controller.js | 9 +++++++-- zeppelin-web/src/app/notebook/paragraph/paragraph.html | 3 ++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index a4e7c1717f3..533b9d9ae5e 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -19,6 +19,7 @@ angular.module('zeppelinWebApp') $timeout, $compile, websocketMsgSrv) { $scope.paragraph = null; + $scope.originalText = ''; $scope.editor = null; var editorModes = { @@ -31,6 +32,7 @@ angular.module('zeppelinWebApp') // Controller init $scope.init = function(newParagraph) { $scope.paragraph = newParagraph; + $scope.originalText = angular.copy(newParagraph.text); $scope.chart = {}; $scope.colWidthOption = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]; $scope.showTitleEditor = false; @@ -181,11 +183,13 @@ angular.module('zeppelinWebApp') if ($scope.dirtyText === data.paragraph.text ) { // when local update is the same from remote, clear local update $scope.paragraph.text = data.paragraph.text; $scope.dirtyText = undefined; + $scope.originalText = angular.copy(data.paragraph.text); } else { // if there're local update, keep it. $scope.paragraph.text = $scope.dirtyText; } } else { $scope.paragraph.text = data.paragraph.text; + $scope.originalText = angular.copy(data.paragraph.text); } } @@ -261,14 +265,16 @@ angular.module('zeppelinWebApp') $scope.runParagraph = function(data) { websocketMsgSrv.runParagraph($scope.paragraph.id, $scope.paragraph.title, data, $scope.paragraph.config, $scope.paragraph.settings.params); + $scope.originalText = angular.copy(data); $scope.dirtyText = undefined; }; $scope.saveParagraph = function(){ - if($scope.dirtyText === undefined){ + if($scope.dirtyText === undefined || $scope.dirtyText === $scope.originalText){ return; } commitParagraph($scope.paragraph.title, $scope.dirtyText, $scope.paragraph.config, $scope.paragraph.settings.params); + $scope.originalText = angular.copy($scope.dirtyText); $scope.dirtyText = undefined; }; @@ -459,7 +465,6 @@ angular.module('zeppelinWebApp') }; $scope.aceChanged = function() { - $scope.dirtyText = $scope.editor.getSession().getValue(); $scope.startSaveTimer(); diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.html b/zeppelin-web/src/app/notebook/paragraph/paragraph.html index 0edf43ed214..02c9a38df2e 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.html +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.html @@ -41,7 +41,8 @@ require : ['ace/ext/language_tools'] }" ng-model="paragraph.text" - ng-class="{'disable': paragraph.status == 'RUNNING' || paragraph.status == 'PENDING', 'paragraph-text--dirty' : dirtyText !== undefined}"> + ng-class="{'disable': paragraph.status == 'RUNNING' || paragraph.status == 'PENDING', + 'paragraph-text--dirty' : dirtyText !== originalText && dirtyText !== undefined}"> From bb77050223800379387fea7e308915fab171da73 Mon Sep 17 00:00:00 2001 From: Rohit Agarwal Date: Tue, 1 Dec 2015 16:21:04 -0800 Subject: [PATCH 101/491] Minor improvement in RemoteInterpreter.java No need to call `getInterpreterProcess()` again. Author: Rohit Agarwal Closes #499 from mindprince/remote-interpreter-improvement and squashes the following commits: 7d2744c [Rohit Agarwal] No need to call getInterpreterProcess() again. --- .../apache/zeppelin/interpreter/remote/RemoteInterpreter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java index 27f4b652531..3ac5121580d 100644 --- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java +++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreter.java @@ -334,7 +334,7 @@ public Scheduler getScheduler() { return null; } else { return SchedulerFactory.singleton().createOrGetRemoteScheduler( - "remoteinterpreter_" + interpreterProcess.hashCode(), getInterpreterProcess(), + "remoteinterpreter_" + interpreterProcess.hashCode(), interpreterProcess, maxConcurrency); } } From 52b41438bea41b1b7ca605a7cdad80f6bd84c2a6 Mon Sep 17 00:00:00 2001 From: CloverHearts Date: Wed, 2 Dec 2015 11:56:08 +0900 Subject: [PATCH 102/491] Zeppelin-472 ] Shortcuts execution bugs. https://issues.apache.org/jira/browse/ZEPPELIN-472 If you use the Shift + Enter keys to execute the Paragraph, If you continue to run while Paragraph enter the Shift + Enter key, Paragraph enter that this is done constantly being requested RUNNING state. Case) Pragraph details Scala) Thread.sleep (1000); Key press running SHIFT + Enter * 10 Author: CloverHearts Closes #496 from cloverhearts/bug_fix/ZEPPELIN-472 and squashes the following commits: 6158afd [CloverHearts] I changed 'brace syntax' In accordance with the coding style. 47eca0c [CloverHearts] Zeppelin-472 ] Shortcuts execution bugs. --- .../src/app/notebook/paragraph/paragraph.controller.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index 533b9d9ae5e..e8aa6ed3eb4 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -592,7 +592,9 @@ angular.module('zeppelinWebApp') exec: function(editor) { var editorValue = editor.getValue(); if (editorValue) { - $scope.runParagraph(editorValue); + if (!($scope.paragraph.status === 'RUNNING' || $scope.paragraph.status === 'PENDING')) { + $scope.runParagraph(editorValue); + } } }, readOnly: false From b5e2e62f239d6b1b625add16405e3a302e8ff060 Mon Sep 17 00:00:00 2001 From: Alexander Bezzubov Date: Mon, 7 Dec 2015 15:19:00 +0900 Subject: [PATCH 103/491] ZEPPELIN-143: Git as a versioned notebook storage This is very basic implementation of the [ZEPPELIN-143](https://issues.apache.org/jira/browse/ZEPPELIN-143) at the backend. It makes a local git repository our of your `/notebook` dir and commits a new revision for each save/update. It does not: - add any remotes to the git repo. It is totally possible to do that manually though. It would be interesting to add this later, to be able to push the notebook to hostings like GH - have any GUI modifications. It is left as further work, to add the ability for a user to switch "versions" of the notebook, navigating between previous runs. Feedback is very welcome! Author: Alexander Bezzubov Closes #497 from bzz/add-git-notebook-repo and squashes the following commits: 468a858 [Alexander Bezzubov] ZEPPELIN-143: add all new dependencies to LICENCE 5d7ffea [Alexander Bezzubov] ZEPPELIN-143: introduce NotebookRepo.close() 978e62c [Alexander Bezzubov] ZEPPELIN-143: muting down the logs fca2300 [Alexander Bezzubov] ZEPPELIN-143: general Notebook storage doc update 94720d9 [Alexander Bezzubov] Merge branch 'master' into add-git-notebook-repo 85de737 [Alexander Bezzubov] ZEPPELIN-143: last-minute cleanup 8d66c51 [Alexander Bezzubov] ZEPPELIN-143: docs and conf updated 274830f [Alexander Bezzubov] ZEPPELIN-143: .history() implemented 4ef879a [Alexander Bezzubov] ZEPPELIN-143: initial repo creation + tests bdee039 [Alexander Bezzubov] ZEPPELIN-143: simple case save() implemented 20a93a4 [Alexander Bezzubov] ZEPPELIN-143: adding JGit as initial impl c21b3e6 [Alexander Bezzubov] ZEPPELIN-143: WIP - very basic sketch of GitNotebookRepo cf0b4bc [Alexander Bezzubov] Small cleanup: JavaDoc, annotations, warning for NotebookRepos --- conf/zeppelin-site.xml.template | 8 ++ .../themes/zeppelin/_navigation.html | 3 +- docs/storage/storage.md | 24 +++- zeppelin-distribution/src/bin_license/LICENSE | 8 +- .../zeppelin/server/ZeppelinServer.java | 8 +- zeppelin-zengine/pom.xml | 32 +++-- .../apache/zeppelin/notebook/Notebook.java | 6 +- .../notebook/repo/GitNotebookRepo.java | 126 ++++++++++++++++++ .../zeppelin/notebook/repo/NotebookRepo.java | 5 + .../notebook/repo/NotebookRepoSync.java | 83 +++++++----- .../notebook/repo/NotebookRepoVersioned.java | 60 +++++++++ .../notebook/repo/S3NotebookRepo.java | 48 +++---- .../notebook/repo/VFSNotebookRepo.java | 9 +- .../notebook/repo/GitNotebookRepoTest.java | 115 ++++++++++++++++ .../notebook/repo/NotebookRepoSyncTest.java | 4 +- .../src/test/resources/log4j.properties | 48 +++++++ 16 files changed, 503 insertions(+), 84 deletions(-) create mode 100644 zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/GitNotebookRepo.java create mode 100644 zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoVersioned.java create mode 100644 zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/GitNotebookRepoTest.java create mode 100644 zeppelin-zengine/src/test/resources/log4j.properties diff --git a/conf/zeppelin-site.xml.template b/conf/zeppelin-site.xml.template index 191f8c265ae..78d7f1ece4f 100755 --- a/conf/zeppelin-site.xml.template +++ b/conf/zeppelin-site.xml.template @@ -83,6 +83,14 @@ --> + + zeppelin.notebook.storage org.apache.zeppelin.notebook.repo.VFSNotebookRepo diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html index 440ce425ff1..ef8a0970e8d 100644 --- a/docs/_includes/themes/zeppelin/_navigation.html +++ b/docs/_includes/themes/zeppelin/_navigation.html @@ -65,7 +65,8 @@
  • Notebook as Homepage
  • -
  • S3 Storage
  • +
  • Git Storage
  • +
  • S3 Storage
  • Interpreter API
  • diff --git a/docs/storage/storage.md b/docs/storage/storage.md index a04a703006b..bcfb8371c65 100644 --- a/docs/storage/storage.md +++ b/docs/storage/storage.md @@ -19,10 +19,30 @@ limitations under the License. --> ### Notebook Storage -In Zeppelin there are two option for storage Notebook, by default the notebook is storage in the notebook folder in your local File System and the second option is S3. +Zeppelin has a pluggable notebook storage mechanism controlled by `zeppelin.notebook.storage` configuration option with multiple implementations. +There are few Notebook storages avaialble for a use out of the box: + - (default) all notes are saved in the notebook folder in your local File System - `VFSNotebookRepo` + - there is also an option to version it using local Git repository - `GitNotebookRepo` + - another option is Amazon S3 service - `S3NotebookRepo` + +Multiple storages can be used at the same time by providing a comma-separated list of the calss-names in the confiruration. +By default, only first two of them will be automatically kept in sync by Zeppelin. + +
    +#### Notebook Storage in local Git repository + +To enable versioning for all your local notebooks though a standard Git repository - uncomment the next property in `zeppelin-site.xml` in order to use GitNotebookRepo class: + +``` + + zeppelin.notebook.storage + org.apache.zeppelin.notebook.repo.GitNotebookRepo + notebook persistence layer implementation + +```
    -#### Notebook Storage in S3 +#### Notebook Storage in S3 For notebook storage in S3 you need the AWS credentials, for this there are three options, the enviroment variable ```AWS_ACCESS_KEY_ID``` and ```AWS_ACCESS_SECRET_KEY```, credentials file in the folder .aws in you home and IAM role for your instance. For complete the need steps is necessary: diff --git a/zeppelin-distribution/src/bin_license/LICENSE b/zeppelin-distribution/src/bin_license/LICENSE index e043b90584a..cc08f98f4a7 100644 --- a/zeppelin-distribution/src/bin_license/LICENSE +++ b/zeppelin-distribution/src/bin_license/LICENSE @@ -1,7 +1,7 @@ (Apache 2.0) nvd3.js v1.1.15-beta (http://nvd3.org/) - https://github.com/novus/nvd3/blob/v1.1.15-beta/LICENSE.md (Apache 2.0) gson v2.2 (com.google.code.gson:gson:jar:2.2 - https://github.com/google/gson) - https://github.com/google/gson/blob/gson-2.2/LICENSE (Apache 2.0) Amazon Web Services SDK for Java v1.10.1 (https://aws.amazon.com/sdk-for-java/) - https://raw.githubusercontent.com/aws/aws-sdk-java/1.10.1/LICENSE.txt - + (Apache 2.0) JavaEWAH v0.7.9 (https://github.com/lemire/javaewah) - https://github.com/lemire/javaewah/blob/master/LICENSE-2.0.txt The following components are provided under Apache License. @@ -115,13 +115,15 @@ The text of each license is also included at licenses/LICENSE-[project]-[version (BSD 3 Clause) d3 v2.10.2 (https://d3js.org/) - https://github.com/mbostock/d3/blob/v2.10.2/LICENSE (BSD 3 Clause) ace-builds v1.1.9 (https://github.com/ajaxorg/ace-builds) - https://github.com/ajaxorg/ace-builds/blob/v1.1.9/LICENSE (BSD 3 Clause) Ace v1.1.9 (http://ace.c9.io/) - https://github.com/ajaxorg/ace/blob/v1.1.9/LICENSE - (BSD Style) dom4j v1.6.1 (http://www.dom4j.org) - https://github.com/dom4j/dom4j/blob/dom4j_1_6_1/LICENSE.txt + (BSD Style) dom4j v1.6.1 (http://www.dom4j.org) - https://github.com/dom4j/dom4j/blob/dom4j_1_6_1/LICENSE.txt + (BSD Style) JSch v0.1.53 (http://www.jcraft.com) - http://www.jcraft.com/jsch/LICENSE.txt (BSD 3 Clause) highlightjs v8.4.0 (https://highlightjs.org/) - https://github.com/isagalaev/highlight.js/blob/8.4/LICENSE The following components are provided under the BSD-style License. + (New BSD License) JGit (org.eclipse.jgit:org.eclipse.jgit:jar:4.1.1.201511131810-r - https://eclipse.org/jgit/) (New BSD License) Kryo (com.esotericsoftware.kryo:kryo:2.21 - http://code.google.com/p/kryo/) (New BSD License) MinLog (com.esotericsoftware.minlog:minlog:1.2 - http://code.google.com/p/minlog/) (New BSD License) ReflectASM (com.esotericsoftware.reflectasm:reflectasm:1.07 - http://code.google.com/p/reflectasm/) @@ -155,7 +157,7 @@ EPL license The following components are provided under the EPL License. (EPL 1.0) Aether (org.sonatype.aether - http://www.eclipse.org/aether/) - + (EPL 1.0) JDT Annotations For Enhanced Null Analysis (org.eclipse.jdt:org.eclipse.jdt.annotation:1.1.0 - https://repo.eclipse.org/content/repositories/eclipse-releases/org/eclipse/jdt/org.eclipse.jdt.annotation) ======================================================================== diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java index 4eb30bf692a..e0e4a5d1f9f 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java @@ -19,14 +19,12 @@ import java.io.File; import java.io.IOException; -import java.lang.reflect.Constructor; import java.util.EnumSet; import java.util.HashSet; import java.util.Set; import javax.net.ssl.SSLContext; import javax.servlet.DispatcherType; -import javax.servlet.Servlet; import javax.ws.rs.core.Application; import org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet; @@ -60,8 +58,6 @@ /** * Main class of Zeppelin. * - * @author Leemoonsoo - * */ public class ZeppelinServer extends Application { @@ -69,13 +65,10 @@ public class ZeppelinServer extends Application { private SchedulerFactory schedulerFactory; public static Notebook notebook; - public static NotebookServer notebookServer; - public static Server jettyServer; private InterpreterFactory replFactory; - private NotebookRepo notebookRepo; public static void main(String[] args) throws Exception { @@ -113,6 +106,7 @@ public static void main(String[] args) throws Exception { try { jettyServer.stop(); ZeppelinServer.notebook.getInterpreterFactory().close(); + ZeppelinServer.notebook.close(); } catch (Exception e) { LOG.error("Error while stopping servlet container", e); } diff --git a/zeppelin-zengine/pom.xml b/zeppelin-zengine/pom.xml index e4310891ff0..e9de7482078 100644 --- a/zeppelin-zengine/pom.xml +++ b/zeppelin-zengine/pom.xml @@ -51,13 +51,13 @@ zeppelin-interpreter ${project.version} - + com.amazonaws aws-java-sdk-s3 1.10.1 - + org.slf4j slf4j-api @@ -123,12 +123,6 @@ guava - - junit - junit - test - - org.reflections reflections @@ -151,11 +145,31 @@ 1.4.01 + + org.eclipse.jgit + org.eclipse.jgit + 4.1.1.201511131810-r + + + + junit + junit + test + + org.mockito mockito-all 1.9.0 test - + + + + com.google.truth + truth + 0.27 + test + + diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java index 66243103e27..481f70838b0 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java @@ -275,7 +275,7 @@ private Note loadNoteFromRepo(String id) { String noteId = snapshot.getAngularObject().getNoteId(); // at this point, remote interpreter process is not created. // so does not make sense add it to the remote. - // + // // therefore instead of addAndNotifyRemoteProcess(), need to use add() // that results add angularObject only in ZeppelinServer side not remoteProcessSide registry.add(name, snapshot.getAngularObject().get(), noteId); @@ -457,4 +457,8 @@ public ZeppelinConfiguration getConf() { return conf; } + public void close() { + this.notebookRepo.close(); + } + } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/GitNotebookRepo.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/GitNotebookRepo.java new file mode 100644 index 00000000000..fe4975353eb --- /dev/null +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/GitNotebookRepo.java @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.notebook.repo; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +import org.apache.zeppelin.conf.ZeppelinConfiguration; +import org.apache.zeppelin.notebook.Note; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.diff.DiffEntry; +import org.eclipse.jgit.dircache.DirCache; +import org.eclipse.jgit.internal.storage.file.FileRepository; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.revwalk.RevCommit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Joiner; +import com.google.common.collect.Lists; + +/** + * NotebookRepo that hosts all the notebook FS in a single Git repo + * + * This impl intended to be simple and straightforward: + * - does not handle branches + * - only basic local git file repo, no remote Github push\pull yet + * + * TODO(bzz): add default .gitignore + */ +public class GitNotebookRepo extends VFSNotebookRepo implements NotebookRepoVersioned { + private static final Logger LOG = LoggerFactory.getLogger(GitNotebookRepo.class); + + private String localPath; + private Git git; + + public GitNotebookRepo(ZeppelinConfiguration conf) throws IOException { + super(conf); + localPath = getRootDir().getName().getPath(); + LOG.info("Opening a git repo at '{}'", localPath); + Repository localRepo = new FileRepository(Joiner.on(File.separator).join(localPath, ".git")); + if (!localRepo.getDirectory().exists()) { + LOG.info("Git repo {} does not exist, creating a new one", localRepo.getDirectory()); + localRepo.create(); + } + git = new Git(localRepo); + maybeAddAndCommit("."); + } + + @Override + public synchronized void save(Note note) throws IOException { + super.save(note); + maybeAddAndCommit(note.getId()); + } + + private void maybeAddAndCommit(String pattern) { + try { + List gitDiff = git.diff().call(); + if (!gitDiff.isEmpty()) { + LOG.debug("Changes found for pattern '{}': {}", pattern, gitDiff); + DirCache added = git.add().addFilepattern(pattern).call(); + LOG.debug("{} changes are about to be commited", added.getEntryCount()); + git.commit().setMessage("Updated " + pattern).call(); + } else { + LOG.debug("No changes found {}", pattern); + } + } catch (GitAPIException e) { + LOG.error("Faild to add+comit {} to Git", pattern, e); + } + } + + @Override + public Note get(String noteId, String rev) throws IOException { + //TODO(bzz): something like 'git checkout rev', that will not change-the-world though + return super.get(noteId); + } + + @Override + public List history(String noteId) { + List history = Lists.newArrayList(); + LOG.debug("Listing history for {}:", noteId); + try { + Iterable logs = git.log().addPath(noteId).call(); + for (RevCommit log: logs) { + history.add(new Rev(log.getName(), log.getCommitTime())); + LOG.debug(" - ({},{})", log.getName(), log.getCommitTime()); + } + } catch (GitAPIException e) { + LOG.error("Failed to get logs for {}", noteId, e); + } + return history; + } + + @Override + public void close() { + git.getRepository().close(); + } + + //DI replacements for Tests + Git getGit() { + return git; + } + + void setGit(Git git) { + this.git = git; + } + + +} diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepo.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepo.java index 07e08758ee4..f8e0b57fa4b 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepo.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepo.java @@ -31,4 +31,9 @@ public interface NotebookRepo { public Note get(String noteId) throws IOException; public void save(Note note) throws IOException; public void remove(String noteId) throws IOException; + + /** + * Release any underlying resources + */ + public void close(); } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoSync.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoSync.java index 49f40fcdd70..08156c7b0ed 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoSync.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoSync.java @@ -36,14 +36,15 @@ /** * Notebook repository sync with remote storage */ -public class NotebookRepoSync implements NotebookRepo{ - private List repos = new ArrayList(); +public class NotebookRepoSync implements NotebookRepo { private static final Logger LOG = LoggerFactory.getLogger(NotebookRepoSync.class); private static final int maxRepoNum = 2; private static final String pushKey = "pushNoteIDs"; private static final String pullKey = "pullNoteIDs"; private static ZeppelinConfiguration config; + private List repos = new ArrayList(); + /** * @param (conf) * @throws - Exception @@ -51,18 +52,19 @@ public class NotebookRepoSync implements NotebookRepo{ public NotebookRepoSync(ZeppelinConfiguration conf) throws Exception { config = conf; - + String allStorageClassNames = conf.getString(ConfVars.ZEPPELIN_NOTEBOOK_STORAGE).trim(); if (allStorageClassNames.isEmpty()) { throw new IOException("Empty ZEPPELIN_NOTEBOOK_STORAGE conf parameter"); } String[] storageClassNames = allStorageClassNames.split(","); if (storageClassNames.length > getMaxRepoNum()) { - throw new IOException("Unsupported number of storage classes (" + + throw new IOException("Unsupported number of storage classes (" + storageClassNames.length + ") in ZEPPELIN_NOTEBOOK_STORAGE"); } for (int i = 0; i < storageClassNames.length; i++) { + @SuppressWarnings("static-access") Class notebookStorageClass = getClass().forName(storageClassNames[i].trim()); Constructor constructor = notebookStorageClass.getConstructor( ZeppelinConfiguration.class); @@ -73,20 +75,26 @@ public NotebookRepoSync(ZeppelinConfiguration conf) throws Exception { } } - /* by default lists from first repository */ + /** + * Lists Notebooks from the first repository + */ + @Override public List list() throws IOException { if (config.getBoolean(ConfVars.ZEPPELIN_NOTEBOOK_RELOAD_FROM_STORAGE) && getRepoCount() > 1) { sync(0, 1); } return getRepo(0).list(); } - + /* list from specific repo (for tests) */ List list(int repoIndex) throws IOException { return getRepo(repoIndex).list(); } - /* by default returns from first repository */ + /** + * Returns from Notebook from the first repository + */ + @Override public Note get(String noteId) throws IOException { return getRepo(0).get(noteId); } @@ -95,8 +103,11 @@ public Note get(String noteId) throws IOException { Note get(int repoIndex, String noteId) throws IOException { return getRepo(repoIndex).get(noteId); } - - /* by default saves to all repos */ + + /** + * Saves to all repositories + */ + @Override public void save(Note note) throws IOException { getRepo(0).save(note); if (getRepoCount() > 1) { @@ -114,6 +125,7 @@ void save(int repoIndex, Note note) throws IOException { getRepo(repoIndex).save(note); } + @Override public void remove(String noteId) throws IOException { for (NotebookRepo repo : repos) { repo.remove(noteId); @@ -122,16 +134,16 @@ public void remove(String noteId) throws IOException { } /** - * copy new/updated notes from source to destination storage + * copy new/updated notes from source to destination storage * @throws IOException */ - public void sync(int sourceRepoIndex, int destRepoIndex) throws IOException { + void sync(int sourceRepoIndex, int destRepoIndex) throws IOException { LOG.info("Sync started"); NotebookRepo sourceRepo = getRepo(sourceRepoIndex); NotebookRepo destRepo = getRepo(destRepoIndex); List sourceNotes = sourceRepo.list(); List destNotes = destRepo.list(); - + Map> noteIDs = notesCheckDiff(sourceNotes, sourceRepo, destNotes, @@ -147,7 +159,7 @@ public void sync(int sourceRepoIndex, int destRepoIndex) throws IOException { } else { LOG.info("Nothing to push"); } - + if (!pullNoteIDs.isEmpty()) { LOG.info("Notes with the following IDs will be pulled"); for (String id : pullNoteIDs) { @@ -157,16 +169,16 @@ public void sync(int sourceRepoIndex, int destRepoIndex) throws IOException { } else { LOG.info("Nothing to pull"); } - + LOG.info("Sync ended"); } public void sync() throws IOException { sync(0, 1); } - + private void pushNotes(List ids, NotebookRepo localRepo, - NotebookRepo remoteRepo) throws IOException { + NotebookRepo remoteRepo) throws IOException { for (String id : ids) { remoteRepo.save(localRepo.get(id)); } @@ -175,7 +187,7 @@ private void pushNotes(List ids, NotebookRepo localRepo, int getRepoCount() { return repos.size(); } - + int getMaxRepoNum() { return maxRepoNum; } @@ -186,14 +198,13 @@ private NotebookRepo getRepo(int repoIndex) throws IOException { } return repos.get(repoIndex); } - - private Map> notesCheckDiff(List sourceNotes, - NotebookRepo sourceRepo, - List destNotes, - NotebookRepo destRepo) throws IOException { + + private Map> notesCheckDiff(List sourceNotes, + NotebookRepo sourceRepo, List destNotes, NotebookRepo destRepo) + throws IOException { List pushIDs = new ArrayList(); List pullIDs = new ArrayList(); - + NoteInfo dnote; Date sdate, ddate; for (NoteInfo snote : sourceNotes) { @@ -218,7 +229,7 @@ private Map> notesCheckDiff(List sourceNotes, pushIDs.add(snote.getId()); } } - + for (NoteInfo note : destNotes) { dnote = containsID(sourceNotes, note.getId()); if (dnote == null) { @@ -226,14 +237,14 @@ private Map> notesCheckDiff(List sourceNotes, pullIDs.add(note.getId()); } } - + Map> map = new HashMap>(); map.put(pushKey, pushIDs); map.put(pullKey, pullIDs); return map; } - private NoteInfo containsID(List notes, String id) { + private NoteInfo containsID(List notes, String id) { for (NoteInfo note : notes) { if (note.getId().equals(id)) { return note; @@ -248,7 +259,7 @@ private NoteInfo containsID(List notes, String id) { private Date lastModificationDate(Note note) { Date latest = new Date(0L); Date tempCreated, tempStarted, tempFinished; - + for (Paragraph paragraph : note.getParagraphs()) { tempCreated = paragraph.getDateCreated(); tempStarted = paragraph.getDateStarted(); @@ -266,7 +277,8 @@ private Date lastModificationDate(Note note) { } return latest; } - + + @SuppressWarnings("unused") private void printParagraphs(Note note) { LOG.info("Note name : " + note.getName()); LOG.info("Note ID : " + note.id()); @@ -274,7 +286,7 @@ private void printParagraphs(Note note) { printParagraph(p); } } - + private void printParagraph(Paragraph paragraph) { LOG.info("Date created : " + paragraph.getDateCreated()); LOG.info("Date started : " + paragraph.getDateStarted()); @@ -282,7 +294,8 @@ private void printParagraph(Paragraph paragraph) { LOG.info("Paragraph ID : " + paragraph.getId()); LOG.info("Paragraph title : " + paragraph.getTitle()); } - + + @SuppressWarnings("unused") private void printNoteInfos(List notes) { LOG.info("The following is a list of note infos"); for (NoteInfo note : notes) { @@ -295,9 +308,17 @@ private void printNoteInfo(NoteInfo note) { LOG.info("ID : " + note.getId()); Map configs = note.getConfig(); for (Map.Entry entry : configs.entrySet()) { - LOG.info("Config Key = " + entry.getKey() + " , Value = " + + LOG.info("Config Key = " + entry.getKey() + " , Value = " + entry.getValue().toString() + "of class " + entry.getClass()); } } + @Override + public void close() { + LOG.info("Closing all notebook storages"); + for (NotebookRepo repo: repos) { + repo.close(); + } + } + } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoVersioned.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoVersioned.java new file mode 100644 index 00000000000..4615afd900d --- /dev/null +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoVersioned.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.notebook.repo; + +import java.io.IOException; +import java.util.List; + +import org.apache.zeppelin.notebook.Note; + +/** + * Notebook repository w/ versions + */ +public interface NotebookRepoVersioned extends NotebookRepo { + + /** + * Get particular revision of the Notebooks + * + * @param noteId Id of the Notebook + * @param rev revision of the Notebook + * @return a Notebook + * @throws IOException + */ + public Note get(String noteId, String rev) throws IOException; + + /** + * List of revisions of the given Notebook + * + * @param noteId id of the Notebook + * @return list of revisions + */ + public List history(String noteId); + + /** + * Represents the 'Revision' a point in life of the notebook + */ + static class Rev { + public Rev(String name, int time) { + this.name = name; + this.time = time; + } + String name; + int time; + } + +} diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/S3NotebookRepo.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/S3NotebookRepo.java index bb9e5d1571d..870aa8635d7 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/S3NotebookRepo.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/S3NotebookRepo.java @@ -38,7 +38,6 @@ import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; -import com.amazonaws.auth.AWSCredentialsProviderChain; import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; @@ -52,13 +51,10 @@ import com.google.gson.GsonBuilder; /** - * - * @author vgmartinez - * + * Backend for storing Notebooks on S3 */ public class S3NotebookRepo implements NotebookRepo { - - Logger logger = LoggerFactory.getLogger(S3NotebookRepo.class); + private static final Logger LOG = LoggerFactory.getLogger(S3NotebookRepo.class); // Use a credential provider chain so that instance profiles can be utilized // on an EC2 instance. The order of locations where credentials are searched @@ -75,13 +71,11 @@ public class S3NotebookRepo implements NotebookRepo { // shared by all AWS SDKs and the AWS CLI // 4. Instance profile credentials delivered through the Amazon EC2 metadata service private AmazonS3 s3client = new AmazonS3Client(new DefaultAWSCredentialsProviderChain()); - private static String bucketName = ""; private String user = ""; - - + private ZeppelinConfiguration conf; - + public S3NotebookRepo(ZeppelinConfiguration conf) throws IOException { this.conf = conf; user = conf.getUser(); @@ -96,11 +90,11 @@ public List list() throws IOException { ListObjectsRequest listObjectsRequest = new ListObjectsRequest() .withBucketName(bucketName) .withPrefix(user + "/" + "notebook"); - ObjectListing objectListing; + ObjectListing objectListing; do { objectListing = s3client.listObjects(listObjectsRequest); - - for (S3ObjectSummary objectSummary : + + for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) { if (objectSummary.getKey().contains("note.json")) { try { @@ -109,22 +103,21 @@ public List list() throws IOException { infos.add(info); } } catch (IOException e) { - logger.error("Can't read note ", e); + LOG.error("Can't read note ", e); } } } - listObjectsRequest.setMarker(objectListing.getNextMarker()); } while (objectListing.isTruncated()); } catch (AmazonServiceException ase) { - + } catch (AmazonClientException ace) { - logger.info("Caught an AmazonClientException, " + + LOG.info("Caught an AmazonClientException, " + "which means the client encountered " + "an internal error while trying to communicate" + " with S3, " + "such as not being able to access the network."); - logger.info("Error Message: " + ace.getMessage()); + LOG.info("Error Message: " + ace.getMessage()); } return infos; } @@ -133,10 +126,10 @@ private Note getNote(String key) throws IOException { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setPrettyPrinting(); Gson gson = gsonBuilder.create(); - + S3Object s3object = s3client.getObject(new GetObjectRequest( bucketName, key)); - + InputStream ins = s3object.getObjectContent(); String json = IOUtils.toString(ins, conf.getString(ConfVars.ZEPPELIN_ENCODING)); ins.close(); @@ -167,20 +160,18 @@ public void save(Note note) throws IOException { Gson gson = gsonBuilder.create(); String json = gson.toJson(note); String key = user + "/" + "notebook" + "/" + note.id() + "/" + "note.json"; - + File file = File.createTempFile("note", "json"); file.deleteOnExit(); Writer writer = new OutputStreamWriter(new FileOutputStream(file)); - + writer.write(json); writer.close(); - s3client.putObject(new PutObjectRequest( - bucketName, key, file)); + s3client.putObject(new PutObjectRequest(bucketName, key, file)); } - + @Override public void remove(String noteId) throws IOException { - String key = user + "/" + "notebook" + "/" + noteId; final ListObjectsRequest listObjectsRequest = new ListObjectsRequest() .withBucketName(bucketName).withPrefix(key); @@ -193,4 +184,9 @@ public void remove(String noteId) throws IOException { objects = s3client.listNextBatchOfObjects(objects); } while (objects.isTruncated()); } + + @Override + public void close() { + //no-op + } } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java index 8363bc76740..67f9b643888 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java @@ -54,7 +54,6 @@ public class VFSNotebookRepo implements NotebookRepo { private FileSystemManager fsManager; private URI filesystemRoot; - private ZeppelinConfiguration conf; public VFSNotebookRepo(ZeppelinConfiguration conf) throws IOException { @@ -182,7 +181,7 @@ public Note get(String noteId) throws IOException { return getNote(noteDir); } - private FileObject getRootDir() throws IOException { + protected FileObject getRootDir() throws IOException { FileObject rootDir = fsManager.resolveFile(getPath("/")); if (!rootDir.exists()) { @@ -239,4 +238,10 @@ public void remove(String noteId) throws IOException { noteDir.delete(Selectors.SELECT_SELF_AND_CHILDREN); } + + @Override + public void close() { + //no-op + } + } diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/GitNotebookRepoTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/GitNotebookRepoTest.java new file mode 100644 index 00000000000..b92c7a97f64 --- /dev/null +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/GitNotebookRepoTest.java @@ -0,0 +1,115 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.notebook.repo; + +import static com.google.common.truth.Truth.assertThat; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +import org.apache.commons.io.FileUtils; +import org.apache.zeppelin.conf.ZeppelinConfiguration; +import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars; +import org.apache.zeppelin.interpreter.mock.MockInterpreter1; +import org.apache.zeppelin.interpreter.mock.MockInterpreter2; +import org.apache.zeppelin.notebook.repo.NotebookRepoVersioned.Rev; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.diff.DiffEntry; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.google.common.base.Joiner; + +public class GitNotebookRepoTest { + + private static final String TEST_NOTE_ID = "2A94M5J1Z"; + + private File zeppelinDir; + private String notebooksDir; + private ZeppelinConfiguration conf; + private GitNotebookRepo notebookRepo; + + @Before + public void setUp() throws Exception { + String zpath = System.getProperty("java.io.tmpdir")+"/ZeppelinTest_"+System.currentTimeMillis(); + zeppelinDir = new File(zpath); + zeppelinDir.mkdirs(); + new File(zeppelinDir, "conf").mkdirs(); + + notebooksDir = Joiner.on(File.separator).join(zpath, "notebook"); + File notebookDir = new File(notebooksDir); + notebookDir.mkdirs(); + + String testNoteDir = Joiner.on(File.separator).join(notebooksDir, TEST_NOTE_ID); + FileUtils.copyDirectory(new File(Joiner.on(File.separator).join("src", "test", "resources", TEST_NOTE_ID)), + new File(testNoteDir) + ); + + System.setProperty(ConfVars.ZEPPELIN_HOME.getVarName(), zeppelinDir.getAbsolutePath()); + System.setProperty(ConfVars.ZEPPELIN_NOTEBOOK_DIR.getVarName(), notebookDir.getAbsolutePath()); + System.setProperty(ConfVars.ZEPPELIN_INTERPRETERS.getVarName(), "org.apache.zeppelin.interpreter.mock.MockInterpreter1,org.apache.zeppelin.interpreter.mock.MockInterpreter2"); + System.setProperty(ConfVars.ZEPPELIN_NOTEBOOK_STORAGE.getVarName(), "org.apache.zeppelin.notebook.repo.GitNotebookRepo"); + + MockInterpreter1.register("mock1", "org.apache.zeppelin.interpreter.mock.MockInterpreter1"); + MockInterpreter2.register("mock2", "org.apache.zeppelin.interpreter.mock.MockInterpreter2"); + + conf = ZeppelinConfiguration.create(); + } + + @After + public void tearDown() throws Exception { + NotebookRepoSyncTest.delete(zeppelinDir); + } + + @Test + public void initNonemptyNotebookDir() throws IOException, GitAPIException { + //given - .git does not exit + File dotGit = new File(Joiner.on(File.separator).join(notebooksDir, ".git")); + assertThat(dotGit.exists()).isEqualTo(false); + + //when + notebookRepo = new GitNotebookRepo(conf); + + //then + Git git = notebookRepo.getGit(); + assertThat(git).isNotNull(); + + assertThat(dotGit.exists()).isEqualTo(true); + assertThat(notebookRepo.list()).isNotEmpty(); + + List diff = git.diff().call(); + assertThat(diff).isEmpty(); + } + + @Test + public void showNotebookHistory() throws GitAPIException, IOException { + //given + notebookRepo = new GitNotebookRepo(conf); + assertThat(notebookRepo.list()).isNotEmpty(); + + //when + List testNotebookHistory = notebookRepo.history(TEST_NOTE_ID); + + //then + assertThat(testNotebookHistory).isNotEmpty(); + } + +} diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java index 8d33d51b0d1..64d9b32444d 100644 --- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java +++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/NotebookRepoSyncTest.java @@ -46,7 +46,7 @@ import org.slf4j.LoggerFactory; -public class NotebookRepoSyncTest implements JobListenerFactory{ +public class NotebookRepoSyncTest implements JobListenerFactory { private File mainZepDir; private ZeppelinConfiguration conf; @@ -215,7 +215,7 @@ public void testSyncOnList() throws IOException { assertEquals(1, notebookRepoSync.list(1).size()); } - private void delete(File file){ + static void delete(File file){ if(file.isFile()) file.delete(); else if(file.isDirectory()){ File [] files = file.listFiles(); diff --git a/zeppelin-zengine/src/test/resources/log4j.properties b/zeppelin-zengine/src/test/resources/log4j.properties new file mode 100644 index 00000000000..001a222535d --- /dev/null +++ b/zeppelin-zengine/src/test/resources/log4j.properties @@ -0,0 +1,48 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Direct log messages to stdout +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c:%L - %m%n +#log4j.appender.stdout.layout.ConversionPattern= +#%5p [%t] (%F:%L) - %m%n +#%-4r [%t] %-5p %c %x - %m%n +# + +# Root logger option +log4j.rootLogger=INFO, stdout + +log4j.logger.org.apache.zeppelin.notebook.repo=DEBUG + +#mute some noisy guys +log4j.logger.org.apache.hadoop.mapred=WARN +log4j.logger.org.apache.hadoop.hive.ql=WARN +log4j.logger.org.apache.hadoop.hive.metastore=WARN +log4j.logger.org.apache.haadoop.hive.service.HiveServer=WARN +log4j.logger.org.apache.zeppelin.scheduler=WARN + +log4j.logger.org.quartz=WARN +log4j.logger.DataNucleus=WARN +log4j.logger.DataNucleus.MetaData=ERROR +log4j.logger.DataNucleus.Datastore=ERROR + +# Log all JDBC parameters +log4j.logger.org.hibernate.type=ALL + + From 71c1af84a1c4f285842dfd5c85fc99ffc4bfca26 Mon Sep 17 00:00:00 2001 From: Damien CORNEAU Date: Thu, 3 Dec 2015 15:19:09 +0900 Subject: [PATCH 104/491] Fix Yaxis cut Number MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR fixes https://issues.apache.org/jira/browse/ZEPPELIN-243 By adding a TickFormat to yAxis. This is using a slightly custom SI-Format: * k - kilo, 10³ * M - mega, 10⁶ * B - giga, 10⁹ (instead of G) * T - tera, 10¹² * P - peta, 10¹⁵ * E - exa, 10¹⁸ * Z - zetta, 10²¹ * Y - yotta, 10²⁴ ![screen shot 2015-12-03 at 3 19 29 pm](https://cloud.githubusercontent.com/assets/710411/11553421/e307928a-99d1-11e5-909b-1245b036fba3.png) Author: Damien CORNEAU Closes #507 from corneadoug/fix/ZEPPELIN-243 and squashes the following commits: 16adde7 [Damien CORNEAU] Add Yaxis tickFormat --- .../paragraph/paragraph.controller.js | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index e8aa6ed3eb4..f73db755ecd 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -990,6 +990,31 @@ angular.module('zeppelinWebApp') }; + var integerFormatter = d3.format(',.1d'); + + var customAbbrevFormatter = function(x) { + var s = d3.format('.3s')(x); + switch (s[s.length - 1]) { + case 'G': return s.slice(0, -1) + 'B'; + } + return s; + }; + + var xAxisTickFormat = function(d, xLabels) { + if (xLabels[d] && (isNaN(parseFloat(xLabels[d])) || !isFinite(xLabels[d]))) { // to handle string type xlabel + return xLabels[d]; + } else { + return d; + } + }; + + var yAxisTickFormat = function(d) { + if(d >= Math.pow(10,6)){ + return customAbbrevFormatter(d); + } + return integerFormatter(d); + }; + var setD3Chart = function(type, data, refresh) { if (!$scope.chart[type]) { var chart = nv.models[type](); @@ -1007,21 +1032,8 @@ angular.module('zeppelinWebApp') yLabels = scatterData.yLabels; d3g = scatterData.d3g; - $scope.chart[type].xAxis.tickFormat(function(d) { - if (xLabels[d] && (isNaN(parseFloat(xLabels[d])) || !isFinite(xLabels[d]))) { - return xLabels[d]; - } else { - return d; - } - }); - - $scope.chart[type].yAxis.tickFormat(function(d) { - if (yLabels[d] && (isNaN(parseFloat(yLabels[d])) || !isFinite(yLabels[d]))) { - return yLabels[d]; - } else { - return d; - } - }); + $scope.chart[type].xAxis.tickFormat(function(d) {return xAxisTickFormat(d, xLabels);}); + $scope.chart[type].yAxis.tickFormat(function(d) {return xAxisTickFormat(d, yLabels);}); // configure how the tooltip looks. $scope.chart[type].tooltipContent(function(key, x, y, data) { @@ -1058,17 +1070,13 @@ angular.module('zeppelinWebApp') } else if (type === 'multiBarChart') { d3g = pivotDataToD3ChartFormat(p, true, false, type).d3g; $scope.chart[type].yAxis.axisLabelDistance(50); + $scope.chart[type].yAxis.tickFormat(function(d) {return yAxisTickFormat(d);}); } else if (type === 'lineChart' || type === 'stackedAreaChart' || type === 'lineWithFocusChart') { var pivotdata = pivotDataToD3ChartFormat(p, false, true); xLabels = pivotdata.xLabels; d3g = pivotdata.d3g; - $scope.chart[type].xAxis.tickFormat(function(d) { - if (xLabels[d] && (isNaN(parseFloat(xLabels[d])) || !isFinite(xLabels[d]))) { // to handle string type xlabel - return xLabels[d]; - } else { - return d; - } - }); + $scope.chart[type].xAxis.tickFormat(function(d) {return xAxisTickFormat(d, xLabels);}); + $scope.chart[type].yAxis.tickFormat(function(d) {return yAxisTickFormat(d);}); $scope.chart[type].yAxis.axisLabelDistance(50); if ($scope.chart[type].useInteractiveGuideline) { // lineWithFocusChart hasn't got useInteractiveGuideline $scope.chart[type].useInteractiveGuideline(true); // for better UX and performance issue. (https://github.com/novus/nvd3/issues/691) From e8fe3c18bf48f11de5f73da940f626087564612c Mon Sep 17 00:00:00 2001 From: karuppayya Date: Wed, 2 Dec 2015 20:59:05 +0530 Subject: [PATCH 105/491] Fix for ZEPPELIN-478 Steps to repro the issue The following is in case of FIFO scheduler 1.Run a para(say para1-> %sh sleep 100). The status of the para is "RUNNING". A new last para(say para2) is created 2.Now run some thing from para2.(eg: %sh ls )(para1 should be "RUNNING") Expected: The status of para2 should be "PENDING" Current: The status of para2 is "READY" Author: karuppayya Closes #506 from Karuppayya/ZEPPELIN-478 and squashes the following commits: f10372b [karuppayya] Fix for ZEPPELIN-478 --- zeppelin-web/src/app/notebook/notebook.controller.js | 1 + 1 file changed, 1 insertion(+) diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index fc9acb10f7a..6c3fc4e67ca 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -389,6 +389,7 @@ angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $ro $scope.note.paragraphs.splice(index, 0, note.paragraphs[index]); break; } + $scope.$broadcast('updateParagraph', {paragraph: note.paragraphs[index]}); } } From 36c69f4831809db91db2052050e4cbbeee0abed8 Mon Sep 17 00:00:00 2001 From: Prabhjyot Singh Date: Mon, 30 Nov 2015 12:10:51 +0530 Subject: [PATCH 106/491] Distribution Management To manage distribution of the artifact and supporting files generated throughout the build process Author: Prabhjyot Singh Closes #484 from prabhjyotsingh/distributionManagement and squashes the following commits: 848d840 [Prabhjyot Singh] Distribution Management --- pom.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pom.xml b/pom.xml index 47206107c46..1984cca7913 100755 --- a/pom.xml +++ b/pom.xml @@ -701,4 +701,15 @@ + + + Website + ${site_url} + + + ${repoid} + ${reponame} + ${repourl} + + From f7670c8f60424c8889879fa1007a4d16cd5509bb Mon Sep 17 00:00:00 2001 From: Damien CORNEAU Date: Tue, 8 Dec 2015 18:09:21 +0900 Subject: [PATCH 107/491] Hot Fix - ZEPPELIN-492 This PR takes care of https://issues.apache.org/jira/browse/ZEPPELIN-492 Reverting #479 as it creates a huge space under the last paragraph. Author: Damien CORNEAU Closes #521 from corneadoug/fix/ZEPPELIN-492 and squashes the following commits: b6ef82f [Damien CORNEAU] Remove transition css --- .../src/app/notebook/paragraph/paragraph.css | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.css b/zeppelin-web/src/app/notebook/paragraph/paragraph.css index 98a4b4b3454..6588736763e 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.css +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.css @@ -182,20 +182,6 @@ color: #333333; } -.dropdown-menu { - display: block; - visibility: hidden; - opacity: 0; - -webkit-transition: opacity 0.2s linear; - -moz-transition: opacity 0.2s linear; - transition: opacity 0.2s linear; -} - -.open > .dropdown-menu { - visibility: visible; - opacity: 1; -} - /* Paragraph Menu */ From c760351b8e84906dd2271d79d2fbe9305dce33fc Mon Sep 17 00:00:00 2001 From: Prabhjyot Singh Date: Thu, 3 Dec 2015 12:54:33 +0530 Subject: [PATCH 108/491] ZEPPELIN-480 Enter/return key on create/clone notebook In current behaviour on pressing enter/return key on create/clone notebook doesn't do anything. Expected behaviour is it should be equivalent of create/cone. Author: Prabhjyot Singh Closes #509 from prabhjyotsingh/ZEPPELIN-480 and squashes the following commits: 766fba4 [Prabhjyot Singh] Enter/return key on create/clone notebook --- .../src/components/noteName-create/note-name-dialog.html | 4 ++-- .../src/components/noteName-create/notename.controller.js | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/zeppelin-web/src/components/noteName-create/note-name-dialog.html b/zeppelin-web/src/components/noteName-create/note-name-dialog.html index d1bcd4982c3..74149bc638d 100644 --- a/zeppelin-web/src/components/noteName-create/note-name-dialog.html +++ b/zeppelin-web/src/components/noteName-create/note-name-dialog.html @@ -11,7 +11,7 @@ See the License for the specific language governing permissions and limitations under the License. --> -

    + diff --git a/zeppelin-web/src/app/notebook/notebook.css b/zeppelin-web/src/app/notebook/notebook.css index c7b7a78b843..8c37e3b0278 100644 --- a/zeppelin-web/src/app/notebook/notebook.css +++ b/zeppelin-web/src/app/notebook/notebook.css @@ -74,6 +74,11 @@ pointer-events: none; } +.navbar-fixed-top, +.navbar-fixed-top .dropdown-menu { + z-index: 10002; +} + .noteAction { margin-left: -10px; margin-right: -10px; @@ -83,7 +88,7 @@ top: 50px; width: 100%; height: 54px; - z-index: 3; + z-index: 10001; } .noteAction h3 { diff --git a/zeppelin-web/src/app/notebook/notebook.html b/zeppelin-web/src/app/notebook/notebook.html index 9679ac5a4fb..227f8cdaafc 100644 --- a/zeppelin-web/src/app/notebook/notebook.html +++ b/zeppelin-web/src/app/notebook/notebook.html @@ -12,129 +12,7 @@ limitations under the License. --> -
    -

    - -

    {{note.name || 'Note ' + note.id}}

    - - - - - - - - - - - -
    - - -
    -
    - -
    - - - - - - - - - - - -
    -

    -
    - +
    diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph-chart-selector.html b/zeppelin-web/src/app/notebook/paragraph/paragraph-chart-selector.html new file mode 100644 index 00000000000..b7ebbedc2d0 --- /dev/null +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph-chart-selector.html @@ -0,0 +1,49 @@ + + +
    + + + + + + +
    + + + settings + + diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph-control.html b/zeppelin-web/src/app/notebook/paragraph/paragraph-control.html new file mode 100644 index 00000000000..f6bf9b42fae --- /dev/null +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph-control.html @@ -0,0 +1,90 @@ + + +
    + + + {{paragraph.status}} + + + + {{getProgress()}}% + + + + + + + + + + + + +
    diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph-graph.html b/zeppelin-web/src/app/notebook/paragraph/paragraph-graph.html new file mode 100644 index 00000000000..e72ad0e049a --- /dev/null +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph-graph.html @@ -0,0 +1,55 @@ + +
    + +
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    +
    diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph-graphOptions.html b/zeppelin-web/src/app/notebook/paragraph/paragraph-graphOptions.html new file mode 100644 index 00000000000..d4df1a4d899 --- /dev/null +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph-graphOptions.html @@ -0,0 +1,31 @@ + +
    +
    + +
    + + +
    +
    diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph-parameterizedQueryForm.html b/zeppelin-web/src/app/notebook/paragraph/paragraph-parameterizedQueryForm.html new file mode 100644 index 00000000000..bbcf7646447 --- /dev/null +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph-parameterizedQueryForm.html @@ -0,0 +1,40 @@ + +
    +
    + +
    + + + + +
    +
    +
    diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph-pivot.html b/zeppelin-web/src/app/notebook/paragraph/paragraph-pivot.html new file mode 100644 index 00000000000..66f570b183f --- /dev/null +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph-pivot.html @@ -0,0 +1,168 @@ + +
    + +
    + + All fields: +
    +
      +
    • +
      + {{col.name | limitTo: 30}}{{col.name.length > 30 ? '...' : ''}} +
      +
    • +
    +
    + +
    +
    + + Keys +
      +
    • +
      + {{item.name}} +
      +
    • +
    +
    +
    +
    + + Groups +
      +
    • +
      + {{item.name}} +
      +
    • +
    +
    +
    +
    + + Values +
      +
    • +
      + + +
      +
    • +
    +
    +
    +
    + +
    +
    + + xAxis +
      +
    • +
      + {{paragraph.config.graph.scatter.xAxis.name}} +
      +
    • +
    +
    +
    +
    + + yAxis +
      +
    • +
      + {{paragraph.config.graph.scatter.yAxis.name}} +
      +
    • +
    +
    +
    +
    + + group +
      +
    • +
      + {{paragraph.config.graph.scatter.group.name}} +
      +
    • +
    +
    +
    +
    + + size + +
      +
    • +
      + {{paragraph.config.graph.scatter.size.name}} +
      +
    • +
    +
    +
    +
    +
    diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph-progressBar.html b/zeppelin-web/src/app/notebook/paragraph/paragraph-progressBar.html new file mode 100644 index 00000000000..010cea76031 --- /dev/null +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph-progressBar.html @@ -0,0 +1,22 @@ + + +
    +
    +
    +
    +
    +
    diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph-results.html b/zeppelin-web/src/app/notebook/paragraph/paragraph-results.html new file mode 100644 index 00000000000..7980d720d7b --- /dev/null +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph-results.html @@ -0,0 +1,47 @@ + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + + +
    +
    diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index 5aff815da09..1a91c2760a2 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -67,10 +67,10 @@ angular.module('zeppelinWebApp') console.log('HTML rendering error %o', err); } } else { + $timeout(retryRenderer, 10); } }; $timeout(retryRenderer); - }; $scope.renderAngular = function() { @@ -84,11 +84,10 @@ angular.module('zeppelinWebApp') console.log('ANGULAR rendering error %o', err); } } else { - $timeout(retryRenderer,10); + $timeout(retryRenderer, 10); } }; $timeout(retryRenderer); - }; diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.css b/zeppelin-web/src/app/notebook/paragraph/paragraph.css index 6e370ddc1b9..392785b2ff6 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.css +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.css @@ -142,7 +142,7 @@ font-size: 1px; color: #AAAAAA; height:4px; - margin: 1px 0 0 0; + margin: 0px 0px 3px 0px; } .paragraph .runControl .progress { @@ -153,10 +153,6 @@ border-radius: 0; } -.paragraph .runControl .progress .progress-bar { - z-index: 100; -} - .paragraph .control span { margin-left: 4px; } diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.html b/zeppelin-web/src/app/notebook/paragraph/paragraph.html index cded6d8ea31..043b6e81739 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.html +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.html @@ -35,7 +35,7 @@
    -
    +
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - {{getProgress()}}% -
    -
    -
    - -
    -
    - -
    - - - - - -
    -
    -
    +
    +
    -
    - - - - - - -
    - - - settings - - - settings - - - -
    -
    - -
    - - -
    - - All fields: -
    -
      -
    • -
      - {{col.name | limitTo: 30}}{{col.name.length > 30 ? '...' : ''}} -
      -
    • -
    -
    - -
    -
    - - Keys -
      -
    • -
      - {{item.name}} -
      -
    • -
    -
    -
    -
    - - Groups -
      -
    • -
      - {{item.name}} -
      -
    • -
    -
    -
    -
    - - Values -
      -
    • -
      - - -
      -
    • -
    -
    -
    -
    - -
    -
    - - xAxis -
      -
    • -
      - {{paragraph.config.graph.scatter.xAxis.name}} -
      -
    • -
    -
    -
    -
    - - yAxis -
      -
    • -
      - {{paragraph.config.graph.scatter.yAxis.name}} -
      -
    • -
    -
    -
    -
    - - group -
      -
    • -
      - {{paragraph.config.graph.scatter.group.name}} -
      -
    • -
    -
    -
    -
    - - size - -
      -
    • -
      - {{paragraph.config.graph.scatter.size.name}} -
      -
    • -
    -
    -
    -
    - -
    - - -
    - -
    -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - - - - -
    -
    +
    +
    +
    -
    - - - {{paragraph.status}} - - - - {{getProgress()}}% - - - - - - - - - - - - -
    +
    -
    +
    -
    diff --git a/zeppelin-web/src/assets/styles/looknfeel/default.css b/zeppelin-web/src/assets/styles/looknfeel/default.css index 10403a430e7..93d302aa21c 100644 --- a/zeppelin-web/src/assets/styles/looknfeel/default.css +++ b/zeppelin-web/src/assets/styles/looknfeel/default.css @@ -20,7 +20,6 @@ body { box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); color: #2c3e50; border-bottom: 1px solid #E5E5E5; - z-index: 300; } .editor, From 9e51f9cb4206fbe327c9226447e477038971e65f Mon Sep 17 00:00:00 2001 From: Lee moon soo Date: Tue, 15 Dec 2015 13:29:18 +0900 Subject: [PATCH 124/491] Remove unnecessary spaces from docs/manual/dynamicform.md ### What is this PR for? #518 introduces some unnecessary spaces in docs/manual/dynamicform.md which results dynamicform.md is not compiled to dynamicform.html under _site directory after `bundle exec jekyll build --safe` command ### What type of PR is it? Bug Fix ### Is there a relevant Jira issue? https://issues.apache.org/jira/browse/ZEPPELIN-490 ### How should this be tested? run `bundle exec jekyll build --safe` under /docs and see if /docs/_site/manual/dynamicform.html is generated. Author: Lee moon soo Closes #533 from Leemoonsoo/ZEPPELIN-490-followup and squashes the following commits: a06475f [Lee moon soo] Remove unnecessary spaces --- docs/manual/dynamicform.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/manual/dynamicform.md b/docs/manual/dynamicform.md index 408aeede61a..5b754f0bb58 100644 --- a/docs/manual/dynamicform.md +++ b/docs/manual/dynamicform.md @@ -1,4 +1,4 @@ - --- +--- layout: page title: "Dynamic Form" description: "" From 3dd77d15a5e5ee7bd7ea3f56c5b50f209c2e3b52 Mon Sep 17 00:00:00 2001 From: Damien CORNEAU Date: Mon, 14 Dec 2015 15:19:32 +0900 Subject: [PATCH 125/491] ZEPPELIN-500 - Fix leak of output in Firefox ### What is this PR for? It has been reported in #436 that the output was breaking in the case of ``_text`` container. (long line outside of container instead of multiple lines) We then realized that it was happening only on Firefox ### What type of PR is it? Bug Fix ### Todos * [x] - Fix line break on Firefox * [x] - Test on: Chrome, Firefox, Safari, Opera, IE10 ### Is there a relevant Jira issue? https://issues.apache.org/jira/browse/ZEPPELIN-500 ### How should this be tested? You can run ``println(1 to 1000)`` and check the result on every web browsers ### Screenshots (if appropriate) Before: ![cf086616-a245-11e5-9d22-1a46b6d6b8d9](https://cloud.githubusercontent.com/assets/710411/11774306/0d11bcc4-a277-11e5-8163-9f66493b187e.png) After: ce1bcd5e-a256-11e5-9744-a65c02c647c9 ### Questions: * Does the licenses files need update? No * Is there breaking changes for older versions? No * Does this needs documentation? No Author: Damien CORNEAU Closes #531 from corneadoug/fix/ZEPPELIN-500 and squashes the following commits: 3b1ad0b [Damien CORNEAU] Remove CSS white-space: pre --- zeppelin-web/src/app/notebook/paragraph/paragraph.css | 1 - 1 file changed, 1 deletion(-) diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.css b/zeppelin-web/src/app/notebook/paragraph/paragraph.css index 392785b2ff6..45a94b99d14 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.css +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.css @@ -32,7 +32,6 @@ */ .paragraph .text { - white-space: pre; display: block; unicode-bidi: embed; display: block !important; From 4a1edd525b31e5c6de41c3598ce921b82b7abeeb Mon Sep 17 00:00:00 2001 From: Prabhjyot Singh Date: Tue, 15 Dec 2015 16:44:26 +0530 Subject: [PATCH 126/491] fixing z-index for all modals, backdrop and popups ### What is this PR for? This fixes z-index for all modals, backdrop. ### What type of PR is it? Bug Fix ### Screenshots Before: screen shot 2015-12-15 at 4 46 55 pm screen shot 2015-12-15 at 4 47 30 pm After: screen shot 2015-12-15 at 4 47 05 pm screen shot 2015-12-15 at 4 47 17 pm Author: Prabhjyot Singh Closes #535 from prabhjyotsingh/fixingZIndex and squashes the following commits: c0bb62f [Prabhjyot Singh] fixing z-index for all modals, backdrop and popups --- zeppelin-web/src/app/home/home.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/zeppelin-web/src/app/home/home.css b/zeppelin-web/src/app/home/home.css index c5f79e1b973..62bef10f225 100644 --- a/zeppelin-web/src/app/home/home.css +++ b/zeppelin-web/src/app/home/home.css @@ -318,6 +318,14 @@ This part should be removed when new version of bootstrap handles this issue. float: left; } +.modal-backdrop { + z-index: 10002 !important; +} + +.modal-dialog, .modal { + z-index: 10003 !important; +} + #noteImportModal .modal-body { min-height: 420px; overflow: hidden; From d69a30eec7d6a22ecb4bc8c4d18b24afeba61e7f Mon Sep 17 00:00:00 2001 From: Jungtaek Lim Date: Wed, 16 Dec 2015 11:24:08 +0900 Subject: [PATCH 127/491] ZEPPELIN-506 Expand "create notebook" of REST API to have initial paragraphs ### What is this PR for? To provide initial paragraphs when creating new notebook via REST API ### What type of PR is it? Improvement ### Todos * [ ] - ### Is there a relevant Jira issue? https://issues.apache.org/jira/browse/ZEPPELIN-506 ### How should this be tested? 1. Request ```http://:/api/notebook``` with POST method including JSON payload, ``` { "name": "Test for initial paragraphs2", "paragraphs": [ { "text": "%spark\nvar hello: Int=1" }, { "text": "%spark\nhello = hello + 1" }, { "text": "%spark\nimport java.util.Date\n\nprintln(hello + \", current time is <\" + new Date + \">\")" } ] } ``` 2. Check notebook is made with initial paragraphs via UI or REST API or Web socket. ### Screenshots (if appropriate) ### Questions: * Does the licenses files need update? (No) * Is there breaking changes for older versions? (No, added parameter is optional.) * Does this needs documentation? (Yes, I've updated related doc.) Author: Jungtaek Lim Closes #536 from HeartSaVioR/ZEPPELIN-506 and squashes the following commits: b009b76 [Jungtaek Lim] ZEPPELIN-506 Add sample json which describes paragraphs is optional d7cd1ed [Jungtaek Lim] ZEPPELIN-506 Expand "create notebook" of REST API to have initial paragraphs --- docs/rest-api/rest-notebook.md | 22 +++++++++- .../apache/zeppelin/rest/NotebookRestApi.java | 15 ++++--- .../rest/message/NewNotebookRequest.java | 6 +++ .../rest/message/NewParagraphRequest.java | 41 ++++++++++++++++++ .../zeppelin/rest/ZeppelinRestApiTest.java | 43 +++++++++++++++++++ 5 files changed, 120 insertions(+), 7 deletions(-) create mode 100644 zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewParagraphRequest.java diff --git a/docs/rest-api/rest-notebook.md b/docs/rest-api/rest-notebook.md index 1bb0e531c83..8293c4f176e 100644 --- a/docs/rest-api/rest-notebook.md +++ b/docs/rest-api/rest-notebook.md @@ -92,8 +92,26 @@ limitations under the License. 500 - sample JSON input -
    {"name": "name of new notebook"}
    + sample JSON input (without paragraphs) +
    { "name": "name of new notebook" }
    + + + sample JSON input (with initial paragraphs) +
    +{
    +  "name": "name of new notebook", 
    +  "paragraphs": [
    +    {
    +      "title": "paragraph title1",
    +      "text": "paragraph text1"
    +    },
    +    {
    +      "title": "paragraph title2",
    +      "text": "paragraph text2"
    +    }
    +  ]
    +}
    +      
    sample JSON response diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java index b3f912ed2c9..4f1dd01a1f6 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRestApi.java @@ -30,10 +30,7 @@ import org.apache.zeppelin.notebook.Note; import org.apache.zeppelin.notebook.Notebook; import org.apache.zeppelin.notebook.Paragraph; -import org.apache.zeppelin.rest.message.CronRequest; -import org.apache.zeppelin.rest.message.InterpreterSettingListForNoteBind; -import org.apache.zeppelin.rest.message.NewInterpreterSettingRequest; -import org.apache.zeppelin.rest.message.NewNotebookRequest; +import org.apache.zeppelin.rest.message.*; import org.apache.zeppelin.server.JsonResponse; import org.apache.zeppelin.server.ZeppelinServer; import org.apache.zeppelin.socket.NotebookServer; @@ -138,7 +135,15 @@ public Response createNote(String message) throws IOException { NewNotebookRequest request = gson.fromJson(message, NewNotebookRequest.class); Note note = notebook.createNote(); - note.addParagraph(); // it's an empty note. so add one paragraph + List initialParagraphs = request.getParagraphs(); + if (initialParagraphs != null) { + for (NewParagraphRequest paragraphRequest : initialParagraphs) { + Paragraph p = note.addParagraph(); + p.setTitle(paragraphRequest.getTitle()); + p.setText(paragraphRequest.getText()); + } + } + note.addParagraph(); // add one paragraph to the last String noteName = request.getName(); if (noteName.isEmpty()) { noteName = "Note " + note.getId(); diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewNotebookRequest.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewNotebookRequest.java index 8d1b8c0b145..61ae6577c0d 100644 --- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewNotebookRequest.java +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewNotebookRequest.java @@ -17,6 +17,7 @@ package org.apache.zeppelin.rest.message; +import java.util.List; import java.util.Map; import org.apache.zeppelin.interpreter.InterpreterOption; @@ -27,6 +28,7 @@ */ public class NewNotebookRequest { String name; + List paragraphs; public NewNotebookRequest (){ @@ -35,4 +37,8 @@ public NewNotebookRequest (){ public String getName() { return name; } + + public List getParagraphs() { + return paragraphs; + } } diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewParagraphRequest.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewParagraphRequest.java new file mode 100644 index 00000000000..a1d65562131 --- /dev/null +++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NewParagraphRequest.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.rest.message; + +/** + * NewParagraphRequest rest api request message + * + * It is used for NewNotebookRequest with initial paragraphs + * + */ +public class NewParagraphRequest { + String title; + String text; + + public NewParagraphRequest() { + + } + + public String getTitle() { + return title; + } + + public String getText() { + return text; + } +} diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java index 0a58fb06c77..31118074535 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/ZeppelinRestApiTest.java @@ -18,6 +18,7 @@ package org.apache.zeppelin.rest; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -26,10 +27,12 @@ import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.PutMethod; +import org.apache.commons.lang3.StringUtils; import org.apache.zeppelin.conf.ZeppelinConfiguration; import org.apache.zeppelin.interpreter.InterpreterSetting; import org.apache.zeppelin.notebook.Note; import org.apache.zeppelin.notebook.Paragraph; +import org.apache.zeppelin.rest.message.NewParagraphRequest; import org.apache.zeppelin.scheduler.Job.Status; import org.apache.zeppelin.server.ZeppelinServer; import org.junit.AfterClass; @@ -201,6 +204,46 @@ public void testNotebookCreateNoName() throws IOException { testNotebookCreate(""); } + @Test + public void testNotebookCreateWithParagraphs() throws IOException { + // Call Create Notebook REST API + String noteName = "test"; + String jsonRequest = "{\"name\":\"" + noteName + "\", \"paragraphs\": [" + + "{\"title\": \"title1\", \"text\": \"text1\"}," + + "{\"title\": \"title2\", \"text\": \"text2\"}" + + "]}"; + PostMethod post = httpPost("/notebook/", jsonRequest); + LOG.info("testNotebookCreate \n" + post.getResponseBodyAsString()); + assertThat("test notebook create method:", post, isCreated()); + + Map resp = gson.fromJson(post.getResponseBodyAsString(), new TypeToken>() { + }.getType()); + + String newNotebookId = (String) resp.get("body"); + LOG.info("newNotebookId:=" + newNotebookId); + Note newNote = ZeppelinServer.notebook.getNote(newNotebookId); + assertNotNull("Can not find new note by id", newNote); + // This is partial test as newNote is in memory but is not persistent + String newNoteName = newNote.getName(); + LOG.info("new note name is: " + newNoteName); + String expectedNoteName = noteName; + if (noteName.isEmpty()) { + expectedNoteName = "Note " + newNotebookId; + } + assertEquals("compare note name", expectedNoteName, newNoteName); + assertEquals("initial paragraph check failed", 3, newNote.getParagraphs().size()); + for (Paragraph p : newNote.getParagraphs()) { + if (StringUtils.isEmpty(p.getText())) { + continue; + } + assertTrue("paragraph title check failed", p.getTitle().startsWith("title")); + assertTrue("paragraph text check failed", p.getText().startsWith("text")); + } + // cleanup + ZeppelinServer.notebook.removeNote(newNotebookId); + post.releaseConnection(); + } + private void testNotebookCreate(String noteName) throws IOException { // Call Create Notebook REST API String jsonRequest = "{\"name\":\"" + noteName + "\"}"; From 6ac6a56089d60f9160150c5722280a8106df2425 Mon Sep 17 00:00:00 2001 From: Alexander Bezzubov Date: Thu, 17 Dec 2015 14:48:59 +0900 Subject: [PATCH 128/491] ZEPPELIN-510: refactor Integration Test This is another approach to solve [ZEPPELIN-510](https://issues.apache.org/jira/browse/ZEPPELIN-510) problem of flacky integration tests. It uses [FluentWait](http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html) to poll every 1s untill 30s timeout. Author: Alexander Bezzubov Closes #546 from bzz/fix/zeppelin-510-integration-tests and squashes the following commits: 53b6491 [Alexander Bezzubov] ZEPPELIN-510: increase MAX browsear delay 30s + poll every 1s --- .../java/org/apache/zeppelin/ZeppelinIT.java | 117 +++++++++++------- 1 file changed, 69 insertions(+), 48 deletions(-) diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinIT.java b/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinIT.java index bbba084b119..47caaa3ec2e 100644 --- a/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinIT.java +++ b/zeppelin-server/src/test/java/org/apache/zeppelin/ZeppelinIT.java @@ -17,37 +17,57 @@ package org.apache.zeppelin; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import java.io.File; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.TimeUnit; + import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.openqa.selenium.*; +import org.openqa.selenium.By; +import org.openqa.selenium.ElementNotVisibleException; +import org.openqa.selenium.Keys; +import org.openqa.selenium.NoSuchElementException; +import org.openqa.selenium.OutputType; +import org.openqa.selenium.TakesScreenshot; +import org.openqa.selenium.TimeoutException; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxBinary; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxProfile; import org.openqa.selenium.safari.SafariDriver; -import org.openqa.selenium.support.ui.ExpectedCondition; import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.FluentWait; +import org.openqa.selenium.support.ui.Wait; import org.openqa.selenium.support.ui.WebDriverWait; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import java.util.LinkedList; -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; +import com.google.common.base.Function; /** - * Test Zeppelin with web brower. + * Test Zeppelin with web browser. * * To test, ZeppelinServer should be running on port 8080 - * On OSX, you'll need firefox 42.0 installed. + * On OSX, you'll need firefox 42.0 installed, then you can run with + * + * PATH=~/Applications/Firefox.app/Contents/MacOS/:$PATH CI="" \ + * mvn -Dtest=org.apache.zeppelin.ZeppelinIT -Denforcer.skip=true \ + * test -pl zeppelin-server * */ public class ZeppelinIT { + private static final Logger LOG = LoggerFactory.getLogger(ZeppelinIT.class); + private static final long MAX_BROWSER_TIMEOUT_SEC = 30; private WebDriver driver; - private WebDriver getWebDriver() { - WebDriver driver = null; + private void setWebDriver() { if (driver == null) { try { @@ -59,6 +79,7 @@ private WebDriver getWebDriver() { FirefoxProfile profile = new FirefoxProfile(); driver = new FirefoxDriver(ffox, profile); } catch (Exception e) { + LOG.error("Starting Firefox failed",e); } } @@ -66,6 +87,7 @@ private WebDriver getWebDriver() { try { driver = new ChromeDriver(); } catch (Exception e) { + LOG.error("Starting Chrome failed",e); } } @@ -73,6 +95,7 @@ private WebDriver getWebDriver() { try { driver = new SafariDriver(); } catch (Exception e) { + LOG.error("Starting Safari failed",e); } } @@ -88,16 +111,9 @@ private WebDriver getWebDriver() { driver.get(url); while (System.currentTimeMillis() - start < 60 * 1000) { - // wait for page load - try { - (new WebDriverWait(driver, 5)).until(new ExpectedCondition() { - @Override - public Boolean apply(WebDriver d) { - return d.findElement(By.partialLinkText("Create new note")) - .isDisplayed(); - } - }); - loaded = true; + try { // wait for page load + WebElement element = pollingWait(By.partialLinkText("Create new note")); + loaded = element.isDisplayed(); break; } catch (TimeoutException e) { driver.navigate().to(url); @@ -107,8 +123,6 @@ public Boolean apply(WebDriver d) { if (loaded == false) { fail(); } - - return driver; } @Before @@ -116,8 +130,7 @@ public void startUp() { if (!endToEndTestEnabled()) { return; } - - driver = getWebDriver(); + setWebDriver(); } @After @@ -133,41 +146,45 @@ String getParagraphXPath(int paragraphNo) { return "//div[@ng-controller=\"ParagraphCtrl\"][" + paragraphNo +"]"; } - void waitForParagraph(final int paragraphNo, final String state) { - (new WebDriverWait(driver, 60)).until(new ExpectedCondition() { - public Boolean apply(WebDriver d) { - return driver.findElement(By.xpath(getParagraphXPath(paragraphNo) - + "//div[contains(@class, 'control')]//span[1][contains(.,'" + state + "')]")) - .isDisplayed(); - } - - ; - }); - } - - boolean endToEndTestEnabled() { - return null != System.getenv("CI"); + boolean waitForParagraph(final int paragraphNo, final String state) { + By locator = By.xpath(getParagraphXPath(paragraphNo) + + "//div[contains(@class, 'control')]//span[1][contains(.,'" + state + "')]"); + WebElement element = pollingWait(locator); + return element.isDisplayed(); } - boolean waitForText(final String txt, final By by) { + boolean waitForText(final String txt, final By locator) { try { - new WebDriverWait(driver, 5).until(new ExpectedCondition() { - @Override - public Boolean apply(WebDriver d) { - return txt.equals(driver.findElement(by).getText()); - } - }); - return true; + WebElement element = pollingWait(locator); + return txt.equals(element.getText()); } catch (TimeoutException e) { return false; } } + public WebElement pollingWait(final By locator) { + Wait wait = new FluentWait(driver) + .withTimeout(MAX_BROWSER_TIMEOUT_SEC, TimeUnit.SECONDS) + .pollingEvery(1, TimeUnit.SECONDS) + .ignoring(NoSuchElementException.class); + + return wait.until(new Function() { + public WebElement apply(WebDriver driver) { + return driver.findElement(locator); + } + }); + }; + + boolean endToEndTestEnabled() { + return null != System.getenv("CI"); + } + @Test public void testAngularDisplay() throws InterruptedException{ if (!endToEndTestEnabled()) { return; } + try { createNewNote(); // wait for first paragraph's " READY " status text @@ -287,6 +304,10 @@ public void testAngularDisplay() throws InterruptedException{ By.xpath(getParagraphXPath(1) + "//div[@id=\"angularTestButton\"]")); System.out.println("testCreateNotebook Test executed"); + } catch (ElementNotVisibleException e) { + File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); + + } } private void createNewNote() { @@ -300,7 +321,7 @@ private void createNewNote() { WebElement createNoteLink = driver.findElement(By.xpath("//div[contains(@class, \"col-md-4\")]/div/h5/a[contains(.,'Create new note')]")); createNoteLink.click(); - WebDriverWait block = new WebDriverWait(driver, 10); + WebDriverWait block = new WebDriverWait(driver, MAX_BROWSER_TIMEOUT_SEC); WebElement modal = block.until(ExpectedConditions.visibilityOfElementLocated(By.id("noteNameModal"))); WebElement createNoteButton = modal.findElement(By.id("createNoteButton")); createNoteButton.click(); From 9e6ebd81660c214e7c916cffc04e45e61d8c8871 Mon Sep 17 00:00:00 2001 From: Renjith Kamath Date: Wed, 16 Dec 2015 12:09:08 +0530 Subject: [PATCH 129/491] Interpreter properties editor updates - Add extra validations in add new interpreter property function to prevent 'undefined' - Instead of an empty table show a message when there are no properties to display - Apply bootstrap style for the table Before screen shot 2015-12-09 at 2 34 48 pm screen shot 2015-12-09 at 2 34 36 pm
    After screen shot 2015-12-09 at 2 36 07 pm screen shot 2015-12-09 at 2 35 47 pm Author: Renjith Kamath Closes #525 from r-kamath/interpreterPropertyPageFix and squashes the following commits: 80da2d9 [Renjith Kamath] add border for table-striped 4fafa2b [Renjith Kamath] review updates 45b44ed [Renjith Kamath] Merge branch 'master' of https://github.com/apache/incubator-zeppelin into interpreterPropertyPageFix 146ef21 [Renjith Kamath] Interpreter properties editor updates --- zeppelin-web/src/app/home/home.css | 4 ---- .../app/interpreter/interpreter.controller.js | 4 ++++ .../src/app/interpreter/interpreter.css | 18 ++++++++++---- .../src/app/interpreter/interpreter.html | 24 +++++++++++-------- zeppelin-web/src/app/notebook/notebook.css | 5 ---- .../src/app/notebook/paragraph/paragraph.css | 5 ++++ 6 files changed, 37 insertions(+), 23 deletions(-) diff --git a/zeppelin-web/src/app/home/home.css b/zeppelin-web/src/app/home/home.css index 62bef10f225..6130c2e0e89 100644 --- a/zeppelin-web/src/app/home/home.css +++ b/zeppelin-web/src/app/home/home.css @@ -275,10 +275,6 @@ kbd { border-radius: 2px; } -.home { - min-height: 400px; -} - /* ngToast Style */ diff --git a/zeppelin-web/src/app/interpreter/interpreter.controller.js b/zeppelin-web/src/app/interpreter/interpreter.controller.js index e4c772a2c76..ea62b16b927 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.controller.js +++ b/zeppelin-web/src/app/interpreter/interpreter.controller.js @@ -20,6 +20,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope, $scope.interpreterSettings = []; $scope.availableInterpreters = {}; $scope.showAddNewSetting = false; + $scope._ = _; var getInterpreterSettings = function() { $http.get(baseUrlSrv.getRestApiBase()+'/interpreter/setting'). @@ -216,6 +217,9 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope, var index = _.findIndex($scope.interpreterSettings, { 'id': settingId }); var setting = $scope.interpreterSettings[index]; + if (!setting.propertyKey || setting.propertyKey === '') { + return; + } setting.properties[setting.propertyKey] = setting.propertyValue; emptyNewProperty(setting); } diff --git a/zeppelin-web/src/app/interpreter/interpreter.css b/zeppelin-web/src/app/interpreter/interpreter.css index 89738957654..b6fe133fcf5 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.css +++ b/zeppelin-web/src/app/interpreter/interpreter.css @@ -62,10 +62,6 @@ overflow-y: auto; } -.interpreter table tr { - height : 45px; -} - .interpreterSettingAdd { margin : 5px 5px 5px 5px; padding : 10px 10px 10px 10px; @@ -74,3 +70,17 @@ .editable-wrap { width : 100%; } + +.interpreter h5 { + font-weight: bold; +} + +.new_h3 { + margin-top: 1px; + padding-top: 7px; + float: left; +} + +.empty-properties-message { + color: #666; +} diff --git a/zeppelin-web/src/app/interpreter/interpreter.html b/zeppelin-web/src/app/interpreter/interpreter.html index f9f75852669..57984dab41d 100644 --- a/zeppelin-web/src/app/interpreter/interpreter.html +++ b/zeppelin-web/src/app/interpreter/interpreter.html @@ -15,7 +15,7 @@
    -

    +

    Interpreters

    {{setting.name}}
    -
    -
    - Properties +
    + Currently there are no properties set for this interpreter +
    +
    +
    Properties
    - - - - - - + + + + + + + +
    namevalueaction
    namevalueaction
    {{key}} diff --git a/zeppelin-web/src/app/notebook/notebook.css b/zeppelin-web/src/app/notebook/notebook.css index 8c37e3b0278..b41bdb4d181 100644 --- a/zeppelin-web/src/app/notebook/notebook.css +++ b/zeppelin-web/src/app/notebook/notebook.css @@ -104,11 +104,6 @@ color: #333333; } -.new_h3 { - margin-top: 1px; - padding-top: 7px; -} - .form-control2 { width: 100%; height: 40px; diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.css b/zeppelin-web/src/app/notebook/paragraph/paragraph.css index 45a94b99d14..bdf09c2c56a 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.css +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.css @@ -404,3 +404,8 @@ .dropdown-menu > li:first-child > a:hover { background-color: transparent; } + +table.table-striped { + border-top: 1px solid #ddd; + margin-top: 20px; +} From 3debddff5a9a5af10ccb13d2a6474b7a1e903b5e Mon Sep 17 00:00:00 2001 From: Anthony Corbacho Date: Thu, 17 Dec 2015 15:55:55 +0900 Subject: [PATCH 130/491] Fix wording in run all paragraphs tooltip ### What is this PR for? Fix the wording in the run all paragraphs, instead of showing `run all the notes` it should be `run all paragraphs` ### What type of PR is it? * Improvement ### Todos * none ### Is there a relevant Jira issue? * no ### How should this be tested? Run zeppelin and check the tooltip ### Screenshots (if appropriate) #### before screen shot 2015-12-17 at 3 56 14 pm #### after ![screen shot 2015-12-17 at 4 06 18 pm](https://cloud.githubusercontent.com/assets/3139557/11863562/34af2fb0-a4d8-11e5-8daf-6d7fe08da6f1.png) ### Questions: * Does the licenses files need update? NO!!!! * Is there breaking changes for older versions? NOOOOO! * Does this needs documentation? NOOOO! Author: Anthony Corbacho Closes #547 from anthonycorbacho/fix/TooltipMessage and squashes the following commits: 0147875 [Anthony Corbacho] Change run all tooltip --- zeppelin-web/src/app/notebook/notebook-actionBar.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zeppelin-web/src/app/notebook/notebook-actionBar.html b/zeppelin-web/src/app/notebook/notebook-actionBar.html index f9239f1797b..340273593db 100644 --- a/zeppelin-web/src/app/notebook/notebook-actionBar.html +++ b/zeppelin-web/src/app/notebook/notebook-actionBar.html @@ -21,7 +21,7 @@

    class="btn btn-default btn-xs" ng-click="runNote()" ng-class="{'disabled':isNoteRunning()}" - tooltip-placement="bottom" tooltip="Run all the notes"> + tooltip-placement="bottom" tooltip="Run all paragraphs">

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Restart an interpreter
    DescriptionThis ```PUT``` method restart the given interpreter id.
    URL```http://[zeppelin-server]:[zeppelin-port]/api/interpreter/setting/restart/[interpreter ID]```
    Success code200
    Fail code 500
    sample JSON response + +
    {"status":"OK"}
    +
    From 0194d389a5ffaf1094a350afb87a9bd341f0fa6e Mon Sep 17 00:00:00 2001 From: Ryu Ah young Date: Fri, 18 Dec 2015 21:47:44 -0800 Subject: [PATCH 136/491] ZEPPELIN-508 Interpreter binding cancel button doesn't work ### What is this PR for? Currently, when there is no change compared with before the interpreter binding setting status, the cancel button in binding page doesn't work. So I fixed this bug. ### What type of PR is it? Bug Fix ### Todos * [x] - Fix the cancel button in interpreter binding page. ### Is there a relevant Jira issue? [https://issues.apache.org/jira/browse/ZEPPELIN-508](https://issues.apache.org/jira/browse/ZEPPELIN-508) ### How should this be tested? Open the Zeppelin any notebook page -> Click the interpreter binding button 1. Don't change any binding setting and Just click the **cancel** button. 2. Or just click twice the interpreter binding button. ### Screenshots (if appropriate) After this PR applied, ![zeppelin508_after 1](https://cloud.githubusercontent.com/assets/10060731/11865265/cadc8dce-a457-11e5-9448-4014e1a9431f.gif) ### Questions: * Does the licenses files need update? No. * Is there breaking changes for older versions? No. * Does this needs documentation? No. Author: Ryu Ah young Closes #548 from AhyoungRyu/ZEPPELIN-508 and squashes the following commits: 3873545 [Ryu Ah young] Remove useless space between parenthesis 2d1d915 [Ryu Ah young] Fix else statement position 63eb0ae [Ryu Ah young] Remove space between colon e946e8d [Ryu Ah young] Remove useless dialog 62b1349 [Ryu Ah young] Fix typo : Notihing -> Nothing f39d4f5 [Ryu Ah young] ZEPPELIN-508 Interpreter binding cancel button doesn't work --- zeppelin-web/src/app/notebook/notebook.controller.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index b767e4e73d6..1a4cff874c5 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -499,15 +499,17 @@ angular.module('zeppelinWebApp').controller('NotebookCtrl', function($scope, $ro if (isSettingDirty()) { BootstrapDialog.confirm({ title: '', - message: 'Changes will be discarded', + message: 'Changes will be discarded.', callback: function(result) { if (result) { - $scope.$apply(function () { + $scope.$apply(function() { $scope.showSetting = false; }); } } }); + } else { + $scope.showSetting = false; } }; From f0d3c3f0e3e898b5625a1d3745a701271905c22c Mon Sep 17 00:00:00 2001 From: Renjith Kamath Date: Wed, 16 Dec 2015 12:01:17 +0530 Subject: [PATCH 137/491] Fix edit note name bug ### What is this PR for? hide and show of the editor is not functioning properly ### What type of PR is it? Bug fix ### Is there a relevant Jira issue? no ### How should this be tested? Click on on the note name, change the text and enter or focus out to save the new name. Hit Esc for cancel Author: Renjith Kamath Closes #539 from r-kamath/noteNameEditBugFix and squashes the following commits: 8d1ad4b [Renjith Kamath] fix edit note name enter/blur fix --- zeppelin-web/src/app/notebook/notebook-actionBar.html | 2 +- zeppelin-web/src/app/notebook/notebook.controller.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/zeppelin-web/src/app/notebook/notebook-actionBar.html b/zeppelin-web/src/app/notebook/notebook-actionBar.html index 340273593db..dc99e1d1bb7 100644 --- a/zeppelin-web/src/app/notebook/notebook-actionBar.html +++ b/zeppelin-web/src/app/notebook/notebook-actionBar.html @@ -14,7 +14,7 @@

    + ng-show="showEditor" ng-model="note.name" ng-blur="sendNewName();showEditor = false;" ng-enter="sendNewName();showEditor = false;" ng-escape="note.name = oldName; showEditor = false" focus-if="showEditor" />

    {{note.name || 'Note ' + note.id}}