From ebb24b3ee00066c2a2866d71965f77505159dc29 Mon Sep 17 00:00:00 2001 From: Ryan Hamilton Date: Sat, 7 Dec 2024 12:21:00 +0000 Subject: [PATCH] Add SQL Notebook docs. --- .../sqlnotebook-docs/duckdb.duckdb | Bin 0 -> 5779456 bytes .../sqlnotebook-docs/logo-qstudio-195-45.png | Bin 0 -> 3672 bytes .../pages/Components/All Components.md | 270 ++++++++++ .../pages/Components/Time-series Charts.md | 133 +++++ .../pages/Components/Time-series TAQ.md | 100 ++++ .../sqlnotebook-docs/pages/Components/grid.md | 234 ++++++++ .../pages/Components/table.md | 219 ++++++++ .../sqlnotebook-docs/pages/Data Sources.md | 89 ++++ .../pages/Database Demos/babeldb.md | 499 ++++++++++++++++++ .../pages/Database Demos/duckdb.md | 259 +++++++++ .../pages/Database Demos/kdb+ All.md | 267 ++++++++++ .../pages/Database Demos/kdb+ Simple.md | 135 +++++ .../pages/concepts/Markdown Blocks.md | 113 ++++ .../sqlnotebook-docs/pages/concepts/Pages.md | 13 + .../pages/concepts/Sql Blocks.md | 9 + .../sqlnotebook-docs/pages/concepts/index.md | 12 + .../sqlnotebook-docs/pages/index.md | 20 + .../sqlnotebook-docs/pages/setup.md | 16 + notebook-examples/sqlnotebook-docs/pulse.png | Bin 0 -> 3570 bytes 19 files changed, 2388 insertions(+) create mode 100644 notebook-examples/sqlnotebook-docs/duckdb.duckdb create mode 100644 notebook-examples/sqlnotebook-docs/logo-qstudio-195-45.png create mode 100644 notebook-examples/sqlnotebook-docs/pages/Components/All Components.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/Components/Time-series Charts.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/Components/Time-series TAQ.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/Components/grid.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/Components/table.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/Data Sources.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/Database Demos/babeldb.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/Database Demos/duckdb.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/Database Demos/kdb+ All.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/Database Demos/kdb+ Simple.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/concepts/Markdown Blocks.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/concepts/Pages.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/concepts/Sql Blocks.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/concepts/index.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/index.md create mode 100644 notebook-examples/sqlnotebook-docs/pages/setup.md create mode 100644 notebook-examples/sqlnotebook-docs/pulse.png diff --git a/notebook-examples/sqlnotebook-docs/duckdb.duckdb b/notebook-examples/sqlnotebook-docs/duckdb.duckdb new file mode 100644 index 0000000000000000000000000000000000000000..8aa15d9b75b223bf599e62636b0a0c38f28e2a3e GIT binary patch literal 5779456 zcmeEv3w#_^_5Y+zlk{EM0tHH0+5!biDNvw1lsucJP1=xz78Hfa?j%{V*;F`#{YhP^t!+}MvEGNnDdrV1PFP5Lm zQWw+*#eiZ!F`yVw3@8Q^1BwB~fMP%~pcqgLC;_&-I3`k)w43@8Q^1BwB~fMP%~pcqgLCeogDG<+D*rcDlp+aj?pJrRtAPl@|Gj4nN>X;499e5)SrJf%$!hLSNO{*)HbN|BBK5CfkkY}wMTX&sb$Kr60yScLhW9_NOFwO+QSfrb}zh zKNN9Y$(Ai`+RepKoEYh==%uZZ)zMHSL4_WT0=7p&0ZPqL?2>pew91HOTp#6+B?F>} z4)Ia(P|z=Ea$GL)N21XzsT2oek#I)ZrGcQ{6$xiiCYEe%&6Z5a(B0B*Zb}U8{XK}A zF?mo^=GQ|;IH1Rf8@S$xK!UV%*sW-lOL2FO;|=Z3Jt@c6M&*%ZiC+%~LI!160%IhC zU4q?7X=~$ZBx(q{Y(5asM)^aLxDa++9vO;slZK9q#T~)+j*P1%t0JMK%+F>vcX=in z+EY`hJb^rlGr`{x3&s;&di)fBBrbex6zW!0BpFV`GW~pF6@-?zRap9|~sO6c}mcaf$V+CzA#O`DcSkw*I?T~R$8l+8r3C=Ff6EX~Nq zaD4{JrA@{vBb>}M)aYeKJDRgqM%?v`Tia=dwozzXmWQ@G`z6(<#L*VT(NgM(gdzMH z?v>LHV;UpTWJolwE@cAR$lB`0jEm!N5jDF?j|LNZ#@$k5bu1zN=t9r05FhK_%%`hJojoz>CAlvD~)Qo`ZdCDr2DjO&x7{3*@V zr!-VFEv>IxRzot59?KW$ zzgM#3J2Sb*eTnBy@L$xn(_IvS8{qXl8|lVSX*UtbYLaa7$t=@9Y!7#4962O zbU|U!&pPgnkN0%7MndG&EfuvcH$X{xGO)-pdM$H^qrs>evEx}v3`vZ5(N#!_IBTLHIk zAo)KPkqr*b!-Ge~baT*xMt(Fky={?DFp@!9vECjF(p5*D8WS`0Pz{+#R71zT;)H>* zw)=^R?XgIAqN5Rp4<~}Ck8Xj|wqRHf``zie3%StHE*8~vL>`4KiPK2DhZ+sk(y_~9 z0VB3N7HkiSp^?LP%4$~oJM?h2W(A{zEJO5u2X$XCw9j@TbBxPF)A4b%>i&*X5-|)W zMYFO8bY5u~Vub8y>c=;rf9^24edrOhjB&dwhlC)?e4H?-?B3@4BWT;?hb4BExU))^nDBOmFWk4KQPVa6n#tXVtR-;pCwvuMGinIr=Q-D+jh^tk2wm{dRwj^u=#rL z&R#gO-wEL$V$iaaBFUJqD$-@q**LJmUHE~>ag2*j;Z@gPM}JewQzay~-n7TG3YjI3 z(NfIgy-Rwq~lxvUqBZd`V(;7H@6kJuIB#AEiX5HuleEX&-Dkcy>c_1{Z2{t%Q>%d_2J5UZC`HsT>EnU zjVqtiFoSf1TVAd_*B`k4$>oz+*8lkjp2xyj*#1`{4Eav)uldTV5{z zUi%MMA8z~OwY=B-aP{Z2o_tuRAfWy}0^t`Qh@<9Tao*8J)cu z$a$5^XU>Fj+~B6q<&$gQ(j0o`y3EywTi?C*2QEKc{kig9^U19*x$K_nI#++LJXilh zljqiVul=9PKexVc)92O~ul4adeJ(#-|KX<34NAE3If9J-*0%BsGPs>P*SOrqBv&Ju z>pE8-?%*?5zPYY*_2KfvO`q%hTzRhkTzPJJxs4%LpImm&b)DOo42C}W*pQnKw;Z|n z$aS5YzSnlnheLZ=xPI!jJXe42poyD4*S=hNul<>uKG#3F<>m6vmFM~=SATBM%+;Tp zK39LPKXCQu>cf?{w_W*s_PV@Wez@{n{keQ{_2DjKR56!5^0BF1CRdQr&vv%_f(&~` zUVP>ni>rgz>2vkrHqPAix$<0nxRsHskJs{CfAG4zT>ic0hpP{lPpWS zHAuzEnT*%^WDhdLOCDL@V977K@Y?Hh(v{-|mqo68j%)|*GMCRn)1ONOx0Z89^ISf; z@?P^_X#8;P%jJ`sK6k3oYkj=77dL$_pIm+l&HuT>aIeeD<%g?3H+`-=*WbAET>s?i z&rP4JKes>P+Lx;j*PprkaMS1Vd)ohYkm4{6kUXK%garl%MaJS zTz$CZ<;rvQ;qt>xpUWp#o*U$G)Aw4Q%craQ^!t^YKDT|~^5b>-Tz}@)uYL)432^r{ zbM@!imzzGshifk`|M}>Xjgx$yvsVhPJhvS7yz=?X<(2DqT>ZIz#MR$x zd2V^R{=k*z+KVgC<&(<~*B|ondAkf(A1?n~{ki&hEuXE;v-9Wv%;m>xdG0uc>;K&J zx%T4vkJ}#oedqGe)t@WR)rV^@uiGoGKXA*-<&(<~SDvd6mwzrl)y(%co`u=A@J-7*M(n=bY1uX&TMu(a^omEQ(63E z6LK6wr$-}^9H&R8&mV?r^3OczSUh+ZJ=o{j(K3BQTbM@{qX(A7iQZ?iI%gJO**vHj zzXu`zwvMQ4#fiyTkMd3%0|pyN9=-YGf#2I0NFJMW=K%*axf-BT-JIKTq5a_40(@@vnYZkfu zcrDK@FIOLK`bvH<7~r1OIT(3*n}*k`N#1I&QdbNp28J>N+|@;|%R1EiVHH<+?IF(e zhq}KEb^V>z82oQse!Q0FmXNCtH+?0q7_c*-;t4w&>hq4l0QXlvcZ^aGWd+oyjMj@aDaWv4dM^m6~F}V+Oo#$GuM9V|rBb ziUGxdVn8vV7*GuCfDGgnSD5e1Z@;)=$02^Gj|Ydk{$6{M*ZdS_`s2K&Ri&>OPz)#r z6a$KZVZngc{k+#C_7PWPoRO7JT;a98D*f%tz)<)1?aN+f?uEu@q3M&!n7X1EPz>-G z7|#<|(u#p$#z3L%gBt4e_YqfQoQtdCilJ`pf$Ps5cXH(iuHn#1LGd%R?4`6-3@8Q^ z1KW!MZhyg*-(KY!-uX`0;fmi!T#@lx7=;j54E6Veb~p#x!3*T|JcifpzN#-fwu37B z?%4KKrBe)SO9r^Vnz$`>Q+X9W12Ud){VFDYF>-YJ2P;bq?H^O^zhH?A&+qKI@RMC! z7rwQt>%yn*3$IUeN%ZdKx^V06t_v6LLBIZp7s$O>|$#@ts=^uKYmDkwfj&WiGE=dG2o7 zpYr>_)rae!Tzhf#@!H?KPM=%eLi10q{@nJHTVAjIpQ{hof4K71lZq=i|8eE>Yemvh zGT_M?U1Y{ABD8qBc#uO2u8VP9nA-$$P0BqYoU4!5<@LIXaP{Z<1J_<@=g;pGcSy+9 zhbzzZAFh45>2vMN)n`!UC*`&|*ACorbLF}EaQ&3aE4N;Hoj#WzuDsXf&FzWV?{N9# zmX|BfZ70gI7c1vgZh5)=FgJa!yx0E2wHLR2;I>y>d9V55>XXwEbKKyj&-EW}`jwox zf)#{F;T$yNylgI}Y_a?_plLF47?EB%8gFQuuwvu5@Wgcc5>9|taPUJTITlvd{`7kf z{}87In~ONTAN*=FeU*RaI*v%bSzSVsAz8~U({M)(=*CNu&k>mTD9)76xrN1Bpvw+XM+wq;RE&Ui5;y4tUn$97BaBb#g2LTnEzS(0WQeDt;=x})(3Nx@$Lf_-o0SLUy*^CW6j&I z9eQ`mzi>hRZC#Eph?T&SY<5haGyN_;vNI{k8ZP(Yi6U+epcs8D$Z>m9t5)T#ey$r{ z%X3>dmwNqv1rlTiv*GYTWd><>mG+Uh~f_FSoXPEzh+tmrpJ~T>EnUhs!5df37}W%X96;)rV^@ zF8^G8xbj^4a`orRbM3|DpPN2co~sX6p35iKzTEO|cYm9ly@XtzxaH2CYwoLDeY_sm z2p`Q-W$mrt%dS08Sa;q_WxA5lg>OHTPj8C-U<`&90$UR#S>ySU}$))uZl z+?^KO+L+ri+3#@q;p)Tn2d+FktA_2HJ6%O^Lg;_Abd=jxx`%X44l^3Szz z?wqsV;kGASJ`1h9Tz$Cm*;yVsSGoSi^#`xzx&0m2GF<(+FHv#R=gM>IJGVXL%6rW} zS065)TzRfOTzRfO+-QVruRfxSezuq86J6xR&Xi1@xve^v)x7kwsl{z|y_UDBme)tF zKHOG_n?6^bYu}+RpO;Z>LR>y=kLLA}n?6^bYcH;UdL6}h-Cl9|STSDwo! z*Pprac~x4QP@$#I<&!J#b$z!{o7YFL`S-g0$*Yhyp+d74x4wIAFB?^!eB|=aRf4;- zs*fn6pI1r-Ey~~)aRBm#=52-M&D_?CE6??QuD!Uf!PSRbUhZg^>knN0^OT?J=8>zH z`}zL9bJOR__m{u>J~w@?pL#9tE>C~ox%znR*Ia$L^8NAQzMp5kNj=8Zhuf~CGV2u}1wwKra3s-+Bzq7{W$!ovk^5pd7eS~@gj$<&SXc4W@XqTLK^0>j} zmD}#-p@Kt%TMrx$=kdks^z%@`A;Q&%YcEG;9(?gyAFut*14E6mF$ zu;8wpIkZt<2Fw7r!gA#YtYAM04D~>ypWAzqou3^$u>RmzV25 zUi&|n&*3KTHUD0xUugE?`hTJ6&(()pUama%*fOsE2q?@)cE!hj0*lnr&QOdjxXg2z z^g4a6K3>avUEV@#ISWl6ukEYS-?16++MkEpk^-Ye?lszhae85yg`^6ahSpc}Oeyr=lW#e2IK5}1p74PAvPYWoc(*jDeo)%CU z(}UrJrs1@J6DpfU!L8E*MoV?gSL{U^XZ3qpfXvF!PRy2@e2Zkn#RnZ&{doD7El)wK zBAkwJrvKmn9#vFfv9omiR&k%JEP zMKLg_3=H-9#oenjsN|`{*bEGHe`6PTm_5Lqa`XDF$-dIxeVEy1C>2+=6GO>b-s>s@ zAa{t7PoS1hl)=^CYwzT?qJ^eES0Apt*Zg~(z8bamZE>&tzwg}DUB!T6Krx^gPz)#r z3W0&a9WU*Xvq*hJ8T~BIcoAi&QBY1psT+y`#lR3}!0YzS>nMJR)6f1@o1tD_uKr&8 zCs!XOKe!C2_F-`ORH^mNKp)XXKO3>Uh%WlpRo(TP0k2yhuhaLMpTSRm`rs#-M~Z3` zkq1e`NJRO=Ffw)l6qWnipUOWAz-SB=l)d^UYq*VrWR&50c?Yjp6sKR_!A~q+;&@jF z7yjwK@Q&kM9Z3An@vhEjdRM13+q*1fm3p{6qz4SVt8NfEnvrVZn)y%r_=ATeC5pOzaH$I;(k|$nc-c1yg75&E8o9=_kGei zYOl^&8~*pkjM5If`38UOgs0CT)h{NQNT93wZqb;j$5J(14w#)ofO(Ea9ut;w;(y;-nd zzZ6mSXhVa|a=wq$cUx2VcZXYR$hC;#hs)UD$`9^JztnBd!BtVEwgWPt>irIAR8^#5 z!vMGb7FyI?X!>~VI9~Mg1JRl5KU>6~JH*H*7#$8##y~8go>dGKTI;~I$WYgxTVAi_ zxvjI;`f$@9ZoNB~A8+hCgR90imsft#H|1QvP<-~yr@A||80aI)IIQmlC>3Q4ElcO4 zZC_{Ew=v-Z z%ubC521sCmKR(p!<51VXkLaSG7fgm?biu6*s(0rymRsJJ`(7mLc-GvTC%z4(3(anYrq4DsML}fcHUHdtSrDXbLnVe=)VvL;9Tr*1 zD8qHO8jg!9NuRB@hoL<`dCL~Zg$Jg%F5EHIb>XI+T^GK&i|fMKyVB`r8eJ_iwDXGT z__Z>+RMLS@8lspsO>5US;0x}r-SFJUm;K}-oV4|ndEvEJ{_;(6L6*Thfla1!R=-EE znfV!-k3`32%W}ytKmKRiF)tsN%5up&9iOdxax*T-zpc&k@;!6rxzFZjCx1Wu2C^`V z`DE46cRoD#6I_sgoIFQneVe}@CPno4jA@aar-pIceXr%Y@d&qH;ik`(=kha-**bCi z39kNJ`O!@Mx%_bT;qt@Phgn>WtIsHA23-H=>ci!q%cs}!UhB{0)9dnb)93QT^*686 z=jy|)UtIlV^_{74=M_qs^?vL0%0CmY{fMhSSDtHUt{-{L4_6JT(xcYPX=cdmsuh;V2@^a<5_TtKO`Qg?Vujl!=`f%mB_Tu`pY|m$DUdQp= za@25w07ML2d2T<}N1V~ml1YAXhS&ALYro^xd#*ol?Zr)>E6?TAYk98zTz})*mzzGf z-QuRtmFMciofq-iUflG#_T{GUHUC_DarNiQdtF|xy}ag!+rDx2=cdoKSE2F4Ew9)9 z#^sZ%KR11Dc?)g)z}4Stez^K@<-O*g+n#Xsul6_|F?UyOvGfYi1~l3uHZr~M&1Yzz z;1@$37ydlKb>Y>Cw71LJ)wYT@wT-4LSvR%)^xiX58@=AU1izFi|I9sJ;^DLC;SrAQ zX_lC|b57=AXfKFg+RU2IZ{Jyv%IB9GZyjJp_Z84~8AYpmF(NPqV1@bj1NrhnBH``YBTLMcf97uyRh65kcZ z>MP5Ykyt3;Td7-F;sN?|WqBWd7q(p!KM9&OOIaUh)6PaK>-+HYwC!3()+ZTy%ol0% zp|sXVD{Jhi%#!t5@vFAEv(ES#Q9(dfR}``HDxqS|oq!9NO$)ar<&F%v@=WzLtA)t- zIc|Bm>F2A5CCAl=JCfk?&+R$5>2vkx^3R>Qv+R)Xzg&H|{CMpT-1NES&6h_@j_VIx z`9hnC;PS~Wuh;(Owf@}t%jG9ET(KOmpMSaK?I*d6+uZgxBY}P{aQWeumzzGf{o%@U z>pPc!EvT4 z%9Zb@P0hGnXqA?0uZ#lqb782b@A8Lz`YCSeHrLLsd{XJ;`oQIt+Zb}?y{?zs^5)_# z*LCh-z-xPPI}5HpLp^^?z>qUd!k5^IX@t`f&O8+TXbP%&dI(435` zf1$~HT?x7N@|quRqrlaNn?9ExuhZxH16Q8QCzl^?`rIIvTVAfcxbM_)+w++Ld)nq>(5+yZu{W1 zyx07&4laPOZRH}hM=Ou*W%+~{+^VbO6$6R^#eia9crw84+J`4gs?>^sA<4jgLsIJk zP?{SO7J$kQ75Wb`vc68DLJS9s>WgAvn=`gg;rek<99L!g zanPBD_WM2TN1)-tuco^$tjF(NrcX_S#JU--3+L|Ty6`VtXipuZX3#Ne=@YeVzYSV8 z-z*m5ouiJDpRMDu%ne@V$y_3hvnbU*Pg9dw8QP}Yhn(H{49+z(f1dN{KOAkbv~~I1 zC(b6zdTQG<7p8yh^t|u(x(`#!r$8CM0NO8KB0e+>4XNim@{7BXk1NmJh{*SB-Vsj=z6&_;->Glyi2`)zxHbfR|+*V?K9_$NU4#CWs}EOx&=nqFf?WG@<+)2H zT>s}5pKC8}dAa&?<+=KEUvT06m?t-V8Tn*A`YUUUluvBI<%BEGJ&uu^KG%o2V^yzx z%-4$yEpL=psex*!HaqB&|yoHuNm;W?V-hATn$(8q-e=aLr z{kihoc9F{u_hc?^Y{5;xkJuvnx=2331($TL6L5{h9c*yrxs5E>X}ElH)91=__2J5M z{ef#Qu0Dmv54XHr{ki;ePZ;9z&#muV{ki&Z`Q*xbJ$d5wAco5)S08TrTzRhlaP7;L z=jzX`k6!EJb^6@?m&=dW{BzqkZhi5(zu?-JtG`tr541ky`LEaI-r92HsXlvhfa|CE z>S4*%GJoU5+OlQo6`)`H#EvK1kA3cEXiww!71P_+aN*uvT^DYeX5XbYhIXlqr7Kyt zbKzGv%}rzGPe!JGG*UcxR=-=*Wcr4-FlQF&eQ5*C;zaMWSe-Kq?7TCH!Y^6MKXY$g zK13B~U60BjUxbTe3=K)<+~;Pwm-=_dWWcKaJ7(zyUMem>T={`(s8Uc26b=L2;d0?< zt~5~$CDe~>f(!TQG4Yq0WF=?qT>R9rDU?XF6#7$^h=R9rE*R_G(H$kQmDg*13XPva)5mN6Rr=ePfgL`cn74iTRk`n&3~<|Nt~{4D?rSsL^u3l> zamC;=EaM8-Ina12g?HT-HjZ*h{HTOp0>K`tfL0`4zzJyM=t@xs z-lXyTl;?4Mp7J~;wG#8_&u3Z;Y{ePR$mPP^XFMZibN|@wuk5`Qxu^r42gB954Jx;R z&*g{9f1&Bm)rVUjy-uHNFRuPvd2V^R z{=+RVH+`?m>vj5E{<(Z|<+=KB<=y%m?7py_zH{x&mFG_2aO(k=Hm=>c<>l(nmFMcu zJ%E{e2pc#3J{FX+gh%ye(<>2p1%&`yjQ!>qF07KG~$Om*1eUbi4zg}8ij z)93mpmmjV?S08S9x$<7O4_tk`=7(D!x%TCj*K2*a=@*(maP{Z%&n++4AH4QwZu`kS z;gHKG*Ir)p!_|k&CpUes%gY^Kas8R=4_?cA&F3H<>zrjNB%g?aTSAUStsfU9D{(!U z+j4T#_gbFID_0+{`Qg}kYic34CGnb1Zh5)#T#mTubN$C_eYpC2?a$owx$<28x%_yY zzSsW1O`luex$Oy8AFe!iq{mI4>p$G|y_VzCL1b0Y;V|JLRytK5OiGo25@hOaU9Eoiu~5eGJ>cdg;V-C_rtwI}URI@9?q+LJcI zwI@w%SzCMSxj*^gh}0e~>#Nko+$@$W2}@yf_nQ#IfyeDyu`8#twqPh^pgd1$Wl=qr z2zJs~QpM}~{epLgPktHCR>oIh{%>Jv{KB&T^*WS7f|(a%0V z!_MiZ!;k3v2QJ9Jt+1l$i-&-d4U_t?rZ(s~BggxuX1C^{haO6Lku}YamNl`#mj3Jo zMLL^AI${rPR%?#UdZMA#cA48zt*86XQe-s0X0mXn~Krt{J7_h>s z;ZRmpM#X?)fX9FcM7Fpii+-mr#0swpEqGijX^$8XakfWkt7H`eiUGyI&}Be{07KVy zUT9uuE3jUaQKeZp4CDwg`dhD5Ax7btP-&tVPz)#rxSN?gX6!JJ(=XWM)sTMsnug22 z8gg%6dkweThnv6U3NcK(=h~x~Pl&;->dMuI8w0Am17SebuYs_qo>dI&*bH!oGF*AD z*()@Cye{vyNPoe$$VBC#7_c#rJ;cc8y(BN94DP6jD{m`!ULU=F3(@Ph;<>Ff_pNWQ z`RAt3oyg_#lb6%jgt+>9tq+$UuKrwk8&w7I(QE#_PM=Gn*Z#oOhbzx*uekDDeY}?E z`VZH>T>ZJ{(|O%KcwJsDKf_I)>z`bHxaoT>@3lX3`QiG1^`v6fA>3Sj`iw66JcGcC z=z{AF+|qL8Eo&XleUK?%sO8SL7=>2L3XRWvdE8cVUh~6E-|Hxz>z`cxxpwn9eeSFU zmmh9vetPmX|BfEiYG| zYhNy(tPlgjTz+g(M(TvA4LF{vpL56Z2{E{;DEXnqfE9ubEv=QdI|Ktq>=30;g-{GA z1_qe{ZiqC<*{kFf1Bw9~1GW%DL);*aBu0qQ-#No7#ISLwJ{AN6?C`oEv{p(C7Y4Yq zQNx87Rn8rSfg^X6g6z=c;Lf7&&}68>dCoxg5W{*Cqpx51$S2C+_NrX(=Z-45`f%yz z>d##W;HK}jJeN2u}1)@P{iL@zY|;o6rg&ut&L>2u||{^_;7xapU2 z3p~W-3(a1IrVrP=Tz})rbM+bO@?I}E6&nBBqdi}khm&yYWgba7L{yaFpkshvxL(cm zI&S)2%X7VxtIq(<(eLA2{rgRDfC66YqoRxf8fY6o&TSvOR*&nSUe|YS`YOuk+e5f~ z_MKYh-9q!9Obz?K!sUl6-*@gi-dz=CY+svl>myfNTXf-g6QiHs49{l)gR6>?R}2&g z14k8z9!d?xfMQ?=XFv@>cW?u%;wc7(F#|Hh*s{fH=K>mD$T+l38ynEpntuly+PTxV zY;j!pyZgfLc5_KQxx4Ga&-QR#SU=r$;rcyY7cQIOy70OC!r%9@OUyU4=$0+*nno89 zF^y=`0@?(+Qq+M@_E${;LA@&yP8j&nk3>hz&;w!PX-(Ux6+NSklbjfM!b;;TN@Ij0 z4U0HOR)#hwTW%tuFwmf@)5!*@hm)R-L%Cg)z=T>wnr6RF~DHpXojp3RSXOx2CUKB zFe>tpE~?iH2Sb`1rMzNbm@^;)5_gD^BaBpm#W434ReZ&OVn8vlgEDZ;4q7f%tR0U5 z6^L(Nn=1bM=3fOCee_# zk-soB)!trOtG&eAi+Po=Vn8vV7*Gr-1`3A(HBr~ME&2#7GF}NUgt$W4vu}H`d?c$PnbXV7f+i@CO`qZ;=bn4kex>D>ov224@R(nF7U;(F|tu$K2N9)wHGO53L zBAH0zEJ~x#Q_o~phSr!hx2nn-E4O7QHH*(yZp8!1?b@QO*)0l&LIzHGL*W|rSR$y0 zG%LH(%led=>Z~;40vDU?cE5;4i>Oz-Tmby8-(G3xR6jc%Thf4SW;01^5N< zEbu1q88899yEkwka3rtoD8%B-M}rty};wZX5jyT zU0|enz;Qr5@D-pHhyZ5-mjJf{KLG9po&jD5-Uj{)j2W$IbAf8$c;I9p0$c*z0IUZd z0$u{%1^xw09D`?oYM==?4LBRP8dwkf68JUn4)7mf>R50L90ME=7(fKL7`PL768IDF zF`$iu?SWaq7lD;P05}u49{3@!5qJyuH?a43O*;r!415(x02cw*0N(}f1|9?c2z&~R zoq)7~BY-7982BIHI^Z7QN#KvbKY>vbp*t`eI2@=2z6=C`HNfS-Ex^x!CxJJCkAPB4 zxK9HP1Qr5~KoE!lYk_Y9*8>j$&jB9*Wjkrw6u<{80a}3=a5?a8;K#uIz!Si8!0&<2 zfSo35+QC3IupDRw)&iFUw*kKdo&o+0{1@1D3d#c<4J-mq0#*Un0Y3yD1fB!l0zLsI zPQ^38{=kvIN+1ke0DKF$3wRQE6ZktYVQ2U+a3F9DupBUeuK||<*8;Z#4+4(?e+K>w z?2N``f8ZEk32-vd0dxab0XGBdfro$>f%kyVfRbHdBVZn|9QZO21kM3&0Db{%0Nw)r z4Qv5+nWkwAfF;1GKn(aga0Bol@I3Ga@K<09FnKrV27Ccn350=f0M`NQfk%M<2W$pL z?yhN*fZ4zTU@`DzpbIz~xDvP>cntV8@F(E^fbn~vodu2tRscG1I&dv;C-6()dEhnR z9pJyf)ajab0B|&L0&p5|IdCKJ6X1E^HQ;YR@t&|Fa1^i{2m)sUmjX8ecL2WtHUMt| z{{~8DXxg5@!9WGj1n9umfo}opfyaPf1MdT$0n^Yy%m-S45YPi$4BP_T2W$Xd0saJh z0*v*cZvc)2mH;b((}A;r>ww3A-vJ*1rF)|t0agNG;9THR;11v(;A!AZ;1giPOq3Ux z1<1hJGyq=( z62Nu9?ZAV;OTgQ}{`;X10D{2RfNucT19t*10&fE&=fFO|VZaxGI^Yzb8@Lp>9{3gT zXW(DJuKS~20d+t#paWgNTHtEnF5nU1W#AvcXTYQb&>jOv1B-z(fptJH@F(D3z_-Z5I|#)CL@|`4F&zaMZs7+;j7fc{zxoZ6-)%z z7~wd5?_6x)O{9<>4)|JP!GoF;dcqLb8bw?fBDO+Dfn zTv}zs+N~riLS05!_qo$V_EOvzY4a@#MPk8#E^|vu(ydB8)*4C1;;ZPbshU{OA4hI! z5s}O?JrRtA^^nM(9$IE}`<587I5e8$kl4S;h(|(6vvl>5WH7G#sv=!o$*`qQONZgB z35OzvEti#gydxNHPax|>M!<+!S+zxCzGi(DZpG=bMS83Yx%!C51|#P0(8GziEg4d+ zBGw)W2lYjIkCA{HRgq-aB%(H{$MAs3%ACN#tq1GAN+X^i)_uXSuhxjf+Jm}GKIrcV zw(H^jC1=Yjt3=@&W0AI?KNyjQF!XNSOir3M3G<`0Q9azVSdXnj+OEP^ghD|hAfBcI zt&Btht;v{71EsVcmYG&XVqqiJ3|5Smm@R4X__9bW(cxK#9kEPMrALE_NXVCVr&LK72irS@OFQjr z66SW9suYeRla|liee>8p7bWxE^72Ln86<%b&Sg|Hy_$!bbloV2^0lu1eRDbmD zNC-Y*gadlW;jAz$u7-ojE+IcRUG$20JOZVuMy`N6>+OcGF%k@mcBiwsCk8i?dDty} zLKx!J$tX#uNF;Y?F;?qwmy>4C%yOP3y1$d!2wAhTSbMHd55*(CNEG!rK~9Yf9LBR! zlID%jy_5^>C)>;BWH=U#r#-eJ7F>fCC?)1=jwIp!l#-R&NabI_ z8>msxQR5v{9Aeg1_=L=uQjXKZD}!;g!SP_Y$_OW@W|-=T{OzhX2IK8|N4hjZpgNLl z4+)Y}O%dKp?X;Q>cy2Tja<`I;;VZ(nR`FzgcQoXd`;ka(Boy#fq1}OH=)0p%RYg{z zi!fb;irHkeqa>2*m8h4g`jBp>(^Oj;Bw(lIYoK{N)xtQ1&_>7}FN;%Tl*cT|vgIo( zgu*qe{f4ZF@@cB3zGkYY_KH-S47Ev9HpYUhtS(SK0Uu9TZEGyqrJF>EKG~@#T&2@M zNwg`_ z1NUmwL$caak|t5LaG~}{w?pLyw43c{?adBEbX+1Ws!~>GX_>FSC+zP)XVZ=%CE;8> zK2VMx6fFXYG$s>a-QM!8)ctBZW+0s^o z^j4&dp%8UyB!d=bUd6nWV(CkQiE1Nm#1hWR+K8S9qbRg$sZ8mqx^MzEw0n%`PtX~! zpw5^?h|>l=)ZokKePt}zHRGosWl=iI7(#E>#W73gD@Oe)T#B0pr{sM7^t;l#1Rj!GTl28>V!n9 z1kOk32MuzkFiYRE~5XikmUs`OA0gK`Y8ty^RPDrO|yZRnvyhfLF9K1#u~ zG)932A{?~p^t{6_A!K^DOu{y9GdZ9xKf^cbdjdhU!}ji=QAT6goiIbQO8vNiY67R58>Iw>d69|w67pcZXrsYV!Iq52` z)kV^iwr)9%XibPu1#v;jRQzUM5Q48d3+?taZb_C6uzsy)|wKmjcEJoOlaj)e_F@$x{ zHPwhMGgj#VIdV*OBvu339HmGg?##>CHIUh;c=T*N#zTG?hvs0e8X-^IjDeh_G^762 zBht5dqUd$4-f6im-94jOscCD2jvac}V!ah33VaZxR_bWo(2J*LNzjVX`~X@!amksx zIp}p*+NvYzB+}2w;*pu;klOBHsctMiG^wGv7K$Tn`p6{GiJJ}sD$^}5U2Cy|T61V> z*@iMFkO3;<9fs&aQyR+gt+=16Dm65&fkn-b$W{}UqrXj{-H1wu%&;RR3j9T^*J(&c35~an6!H7|)j2W7+8K6;Nq!CS>C_KpSB#|f$?qM>SRW&+W zbLPezp|u3tX!|M7 z7?tSW%=jSPbPyXf2271B>>aJB_@dWDKp_2VrQVqgA;6_XrL}BL*kT=xsjcC#1`6mS z5l!00#PoC}{G-)1ysT?pCRMj}i?X;T|LzWz5+W9AFco*2-eWegB8}!qID)vuHqlcb zi6a^dfFPNP?hj)A&(;)FCgm)nz3SI>QHzd#$RcK65i8b(14a}xJ@90wiAhn}a5!zN zlToP67krZ52#27MC_$=eXd(vVG)56O>Vs%X6FnqD6}&3ajVNV}xFyIZv$|5Sy3Mp6 z^fbD1F)d&fg06`u#YT^4s=ATl3C$HE(Uy)R3MlK?O1Ku9l{m$m=2+KJzGhTtI7z#B zkfsOy#Ei3W&_AtJ%Hc=`LuQn&CrX2SQ9sj7Z%Z;31_|Z>y1_`qoVg?j!OmPlexa4dGibo1X3~&BmMN(HhP6z$!sHJR&+UENz7* zzQ!bKWCUTCKhktiEkc#_v^#m0?Y3jqt|l47JOOo_7+TXr2jx<=i2kAVC9Fs|d?UWH z!_eg#6A5AnL<4GCONZkCM#n0!V#x=Dji&(F4|; zW0iK7-~sWHvu_;cx^q zgw_NA+)xiib&OIevs6r9X<(?6t#wL;G2~XZ0n}2gd8K@vMntZ76)=02+@mgwo5ew_HqmqqMH*x`N4>8ItfC1qX>KeWMJ@K6PC^q6q8?cx zlhCf)3dpG%xI-MX5{WeiX;P~0spLsLOT{`g_~A$}z7oT{SXwopaH<$i zE2ZYhQuk>*V%8?`BBVjc!IMzq5b>rmV0Qr4Owun(QG z*XMM5h;iY(=6RL#Qez|gB!qorMEW5X+)rpn&6IH0to>*zo=h9h3jCxxPP5PipE;m) z)#+whvW7L|l(`k++9pY)o_Et;Y!a^gtye~B^Ay_sr;ofD<^;C4FV@h)07CnLJ z!E_C&ZmL2%S~t-(CHZ-OQ?EVu4tj=-{$ z8SA--szoWSHlBQpTt+PNBk-Wr69g}$mlzaTEZOUynQE$_BrMzf#SyFpnEEv6fgoA~ z5z*L&+9`88=n>78>xvwtJ1){3MRm|Y*-Y%nAay6kY8niD8>Ft=@h&uCkhGkaoma4=ikCYV3pTI5wv#&uZ zmqhf_lUUoNo3ietCjK0ZETJZuW{A?YXQdvCq4Lv{X3HbL)Wy1yATl)#WI2iZdb;7G zGEyBkISwF>SI`LEtR#-wPfuEPU+R}}dkKcI z6ylNc88>U;nPKeo$#vfxQ6@uZTrwV(H${M$aj!Di+Uj5|wZbBt$KquLMg={(=|wF@ z7uHr0ir7MAlBPng?1^;2+>1~Qv3g3^ZJRvOm5_wRu8f*ca1G`~vCScUGaKngI*7pxOI{<^*=1V2tK> zEO*f3X5)!%M$}Zt$snT1Grc=Kx=$tSR6*{)vpOqtR3~C>OS!s$-eJ}e>r$nGdE`)! zPs9Zc=H@b=W1+yRUCsfz7+OF-tSAXBiB;Loq~&3H(UeeTG-Pswk!aOu8QYxrT;3H9 zI=h+{L+_#ot*%b4Tsmch>8L>!Dl9U0Nm*qx?VGAX_8vb~!fYI3kAf8?A=D4+e$4Gz zi7t(Sb9~3XbdPb&+vYtg{GJ> zKA~m-9c;R?yXQt_1v1%o)r-bOVq(A+qgT_U1)@ZAYRl?aXgKMzg|#2VUgH;GEY}IA z$}o6EDB59$nWi-w%tcTkN}Viu7}Qw&J#|OSUpQI}oX?41P@ar*g=V zG)h5349N=Cf3a3(IjE?ODc2)C?A0{G2(msQ3c;M9U#92OLq1)xtTMf~Q0!R2>;Ww* z;Q!(H;v{CPDJyfomuu-w)3l%BJ%?klKYlDePXw_2UBmWgZ60t0a5PX0Gy*GtQ-L55 z1A2gSfQx`Dfg6GE0zU%o10Dx90xtot0&fEE0UrXN0cAzV6POC@3CscJ0Y?HAz*3+E z_zGYEVPF+-Hn0x38n_9#9rzJ&KS1wBJr4XD_yh1~;C&ao|kgeBcUz z-VysQ@FU>oz(c?zz|+8s!0&-S1AhlT0sar5cgS`Fe83#wFyI)V7H9%a1ik{a16@Ej za29X@a5-=da3k=)z1LEur~Y2Y`&AAom&4}s5s(PhXNmz!ktv!0o`#fk%L6f!_je z0`CGJ0b76)G=`Ia-2i$QZw_z>a3oLx)ByFs3Bbuf2SD%Wtp?5oz6o3l+zR{{xCeLy zcoujG_&x9z@DcDiP&N*>17-kofJ1dJmPk;x2Uja`6F95#-{sMdgdfCqs`fsMe+!0W)fz(+t4I3$Q0J z3pf-w3MdC^f#ZP_0Y7jW5C_%(X9E`j^zP)W0fxUq_z&v09a5PX3)B-Jl0dxWh;4I)$;5y)DU_C%%kj9Q+2+N=t$OZLg9RU)? zO*NrTnnR{(G8+2%X~#Q-5+_Ay>N$O!av8$U`Q}41gV7R9zBDP)1rbJT^@mjkND<#$=2yrpKH$x}6y;x6T$WJeR zG|=v817VJ@A{eVeI8VV)B3Nm}x_iQl^kA$_UyV_w2=Wk$(?+REEVCGRfuhL>N5pcJ znGcPasrX`r8mqN_xw)t&5De2gyqy1zV%J+^M+A$>t1*3upaUy5;^hh2_1r*uHsdjh zfUw_2PLkAPMr{T5h{cy8LnzSfhdJV;JmxwASclP58=1`UuXwl~(!m%lp6Dpja(EUd zfoRIM9vj`n3tzSu7wUCdUT!zcqEv(fcyA$wa2@}T)7T#Kfqny=%6(A6)iAY%=#bVq zKpQQ1)F%^bByr6K)C=mg@CP2SE{C~9ST13tX00nj5iu!)$E;TZKi0c|Q=Wz_0H#Jw@G$)XCoW5k9X z>0X9WjlcvmHDT<;z$;-1L(B)sje%wf=|wMTs9*vsr!pYN&KP+SF?6W4N8Dc=X=|f! zx(1d`81bdy$ZByNS)n*sjO#S4kkP)qs4@~sbij%65}UtMDhD?Yk#}{Q9+;|3^}0XO z)oRcr77>)%kBx}ZoI^5}cj+BEEJ>b#8WYFlh#{MV6>@@6%oU=@5p$1q6`GD%H#El9 zF}>1^*%wrhF9+ho+AvPsj)46dk=&5>Y;f~BpRu{3U5yOgK+B<$7XYdnZZCj606eVWLqNCG&`E{9u!7w z%`nZC_RQvRqyyC=-cgwpEe-@N(;_^kIT?QhGXSIrG61!rLSy|u(kV+)jaeO?wu*{& zLF^+&$AP&~G~%@34->(uy|9(R7|}>ATIv(MvS4k`q6gsK(nqZ}h#EYa8Z`H~l1;F& z2kof!Hl*0AO2n9@qGnv|P+i^{j7KA=!Mc1_EK-XJ8gmC7xRRL(Ze@cdY-;AUSntBb zVpobuOmSm>qI?8}qDg(&A&Kq@L{ZDr9%<1dana?8LdfnV<$x$FjNIU_#?~`DRT;xp z*KVwnq}x|?f2i`<21PHP)#}*)7H{xZVRM#9&a`wr*4;%V#1bZ|r_4$3wpP)^WGZ%% zkSXydk92oA7nwG4B~5iz^@O{70$@F+w^Bt->#+ha5L0t1_DQx-UDd@>7j2?4Vq^o- zQzqJkPc*fMy=&og3JrP>xxC!bXxp`DcSE81a+)ip#HgoOVzjlv15k}<7$SC&nwtw` zg-UHUMCI=LBK zBFye#4MA)X#DX#EZM&#(WN5s68bRBS`Yx##(}r^Io>}AIL)f|J9JtgZ@fIFNLvj>S z;qOLu?r7AprxbQTS!MMW&EJxUQH6be7>k7cv{Iewj?sBQ6WJF~mm)T_)zerltjoTP zhER<$y*+854t57&lW+xg3}Oq3E_VGcMs1@9o1-XzE=LKWWE<^yr3s0m|RG8vo3C(T$KM*}4Hol(t)Zy4}cKXx2Zk53!Q zuqQ56CgBgVmqqtNor~2YQk8DhlObE>rAwf`C*Bz9!RFyahqRlbAl z{6?)Vd6_kSvwQ#!K|=)CBqo-Usi1PVF}4Mv=3&!3RRL0`NpI7Q5C$2dt83`NNdh2@ z+Fz=t=oVlqYg>}Ny)-*mx#g%niSmUpWR$yJt<6N$No;-SsE$#QP}{mNMx$)e+|XP1 zNZ1MjtbZ#bejOUooe0E3wPKo`D*EzvR1w)QKnttF!Zz5xBgZZE@N3$#Bl8dz!X>dI zXEAMR!w3uBE{6%$Bd9eM7!#t^qqP9Ma;Gmw%L36lymQnEM?%H0NT9(l`T@wAE(i7y zv@F8g4Ky?q?!MG&ImvNg6x!~BC8%HoaSLciq0tw~=NjNWe%;d0=5uv$1@d9yBvlJ+ z71wN(9nBc|o=~6(?GLJ;*arsduQG`5CL3nEOhZ%vIV6WC$X+yI$jV_2 z4ai4QK^qlI^fquH(y^MhzXlVscAG1$_6-(T{-LHpx~?-NBrCQ|&?acp2Bu5Z<3*Nm zLNx#QcX=X?wVEa!VT+M!D5Z+^dN+0ym_dlVREeQtEG{};?0jquMI^DZ36nbztWJ%N zj}Wc792+I$^%(#6P*+3IovE|fK#|bf+L}-kU_M_1Hp)c0HQP%2;Oa5 z1LV#GU0xSmXUdXh_UQph1@@){sV0Q=bjxc}0Vgrv!EMA4T8zUxYJ(JqCMYJ6!+&Ik z#U#sKc++ncib4I5*`}tJdc`98k|f^GLYImTiS|zm1{$f4qS0z|vRe-uhFFH7_DUx@ z;8A`A*BG419!!>9tgfLe_IF_aToNzyqNl-IpK^^Fbp;I%29?;ZNBs`f8$F&<1nKzY zqH+~Tg~Kiv>v7gvvCSpw5GIBV+NvwamMpEH;W(C_{W|IvE$>nYA{!L*WDZfPdf5q3 zM?uvsp;h-L!Mn zgz)Y|Km?}ZA+uc-7tpKWO*b>&^dl`;$M4irX*qJI(Lf_?gpPt@CW@mg#jr{w4$<^{ z6D_CNsw-A?#Jbcku+DNP)|L*$cPs;F6~1xR`qa`Zrak@0f~Ve`T6g^Hi(a1l_{cr$ zj<2qrRd?CC*;B4)Y(8~%{qg(!=AP*dFVCKO#q8?i7c{)QU|D?UQCH8dyJGf5(ZJQe znSQ}fPk*Cr_Offrt9M%P)q4(q?8CE1SJgkhZhGzF1<$USTJxuc%O06jar*Sf*Ui4@ zHy1v6{_N7153jj0d9O@!FNM>uN(!t-EUJ@z*|i z`h4Wo@N#i|bly8Bg&uoxeqH(WC-td2y*BrWb(c<>9Wb7n{$$1M+KZ;Wbo%T|URm($ z=@-@YvinY^guUN20%haV;gi3ck^yEV))y1ZN`HHJvS#a4&*Ulc_ zJYBzHYR#4BHTY-O{dT80SI&O&^x04SZ=}q5&h_%b=McyUg2waX;MXe zdQta+y1OPd{N(H>EB0ym$$5*`ocrEwM_=%AVCVg=zO3Z%+N&2dHczU(^2TScnyWv( z&pE$7Ht?$NvXQ5)xOMvCA;3c5i$D#~1e^>6fDk|r zCV{U3=K+@hwBC6Oa2s$J@N?i%U?cE6@EhQdzofRBOCfl=_2@xZQt51{qVV}L~f zo%Q%7zyPWuXdp1G_9qjmcj6m@m@&kE(P+@NKfeLdA%FkC^*(Uw_z<*23GC$T!Adhp)GKi^rJ1OMep^OuN}Yh`b}6VX^Hk0O_;VB>lV|a_#f6IMwV*xM`)$APL8FwUYH91 zE7hWF(FoB0rd!wWwR~iewn^N86rLqv`de#0CckM&8Gm#w{mJzeH$;{bC|~i1%&k9p zjh>yp$-HK%Mqe8rcBYI=QjQWOf%O0IMW{xlwEnD5;s#w5O3MG4*B}B8NDVM#re_rf z-%b69ChKo!vm8iZIykinQ$-X{K)8IA`K6@UMLFC}O=08$Yiqt3UJUvRKL@F)QH?18reR|{B zBNu&+OSe20E#G}s@0-143#T_0%{s1e;b^V&)}2NkQhMP*Yqdj9-TMh@x~M(FN;}r( z(4aknGXht`pAUl$ST5CyipTjHd!a(v z@r5%!*CtnQm^5?7#nX<8y|rQ8tlG_=zJ zJmb@kKltc^kvEqoipS5a+OT}@stYFV)AZAh7iUhmbax~A%7%@z7O$J#@V_ljO}=62 zwfAj$>eiZ<_g!}5!n@yl>%A!#%-?;}+Srtf&sl%`xr@Iwv*zhn_HQ}<&Rd)Aefpc< zndQ57;fIerebx6@{OII{Ps=Zyu;7e?1ls-N}){jr%lpW}b#xoiDP$Cj9;ud|MK5GSUTa9FMjPmpMKE!;>54-nz;V+|2yaA(KmnR3q_;; zGVRmzPOUhn^nUHY#CZLY6MryuUf|Ui_P*ePlYMO$uCMxI^~Jj#aQ+hggPF%&y4yJ& zub=phSvxJ=ZQ@S`IV;t-$HPdB7FGEdY(DUIzXSl)$HV z0`>(OfG}_Ya1B6vaP9=20^S4u3D7>9J%B@iF940eR{%QK_)g$H;921Jz(0Xf)S$`0 zbl_m18aN5?1E&LL02cx`0QUkLfla_Dv;lJf+RJh>5Cg6Oeh9n-(4Lh40^=|!+y$UB zjgJOsAIb?p0$2-N4Ez{)5O@xF6DUEWG7~rmr~+v3NGos_@GanWfX+7F1pFNsfrel@ za2Rk5umtb}VPFk#4)7h|ZeSDe5wH^)3EHzk`!(u;Q-C$VrNGs|y};AJn*i;c3o384KHbe{3pu_!xm06_aEssP$Iu?n~pxEY}R5x)dp z2HpVv2~5U5g#&=YfNH?n{}99Ha{$`+a651x@Hp^mfc8231Nbkn8}=K_1P%u1yyGUI z3pfY33Ah8eAJ_oA0c-|nf5J3iKfv0P@Kt<151{=AHvzQ&;Ag;ZfRBOVi8vP;m;vku zlmjimSAkA|_7q$P{0w*wpmUEu1!#}JEP(a~ECEgi=*;7D0Xp;eX5c5lGr*g`KLJ|f zKMwbfiD3D z&<$J&d>?oacp9KHjXwZB2X;eWxi3KH8h;6h1Jr*m59Kb}7c(b3rR$?e`^w^KH zu*Ub!v)2&zBmNee<8%%L%%aqCOQ}5X&Dx_&sUjG$-mtPZs@qQ*qth|P4%LIOLXbXR z)|cKHEjGo{$}{c$r4(Bt0lmjOSCM8&=^E{da2}B=x4qgE^<&W*lV&a5*wIVN5#qsY zI^lJo=1NL+1y&bQ2SbUNMQq?t1qrgui(zl`g$cYiwhE=Q&hwb-tFN!Bz=8%QX0ePV zHFcG&9(L)%vXHo$-6OK=h@(GgArFyT#Fl(IEES{nK>@{Y zVudutV{;E)hqk|GC8xX0LzzxOh=%zo`^$wgv-Iknl^b3_T8tgvbT}ocMr2?If_!N~ zK9he7QISnlg2hErm|NOT?s;A8o4C7|SW} zUB9$Y>J{B=DWt2q^)_+FX=Bzg&$ZA5YfU)8B~^c_Xzs>5QiOcooD{L%uci#?oq-r_ z+)BL{PJ-4lg}oIQ3#%P^w|NYl*~H0N)zoYAzBwZIu(=Wj0#4drxQCzCdos@gO4(Wz zKIJv!FZ7;7_V-5YS7}087`!e_(?sH9`jyURy_Gf%hUh&|>zq|-6nnELuTWKUxc`Y* z0I{FfYo5j-rBj7!z>y?iS)Kw$UDYDmK7^$N`Ff~0f*>y6&vH6Ec4dg&IYQ;^Z`ij` z+b@R&=`x9Gg=w))r?!qG*-Ra=PGub)C9G<$0+{D6U{{-?yz<01DgrH6W9uBPO1e&p zkS0ufm@pe02KofC`-u*MrAw}QDy|7nNgvmpE)YE+{Gh>)ag4B{D}y5)?Jw$`_0p%6 zz1V$|>SL_Y5E_)!SjawHaX4M0e8E+yxT3DPMSP$Y{y;Q!LN&HbCfjsB>Jk=DOvT|> z`0RMA2MZ0>FeqI*%at+U!xli1I-R9MgBI)w6J$9D6mT;a2ep+|80ER^sc8y(8!jhQ z#pV)`vKZuuw>L!v7uTxjoppGX%)3c%73Z}`hsk!7g}ie@tQ8d)i|yjQZF==PWi`uB zge_7v7@gJ{*%FgOVZnsn+oskyZCWg>U|GdHKBeZY3JGIb@oH|& z7eJj%AIL-Fo1orGX*zG9l>@_+84gOI@rB4YWfS^lo{S=$$C^VIa_QDd-Xv*pJdc@V z+NE>W7Wv69vL<7sZ)>5Y3kacfiKIAUgg`4ACAl|4h=?+R zTj~7PYC@`YO?#3hn1H?Inc(6P=a5sD-5yfVxjQmw5$%Q}&l93pOC|qtHl!)WEkZ9^d$B`w}r4xNcLx@_040YQoX6v zfreJn5NYdCNok+R5{#>(=83(I$1;aXslc36bstb5qC*E&WJj!WrOvw}U95Hz>(H`i zGxz)m@+;)8WsqDAHCj=*#~WYMR-<=pZLW>2czP=Ytd%A*s_g*I4BL{g3X*L^q`XV? zdSca!R3IO-egT8XvMog0&lF3mW;v8(+J4rUXzeI^cJL$R?4xbU#%!BuC!(LWs|aSK zb%l9kKa;9Mj$?*x2Y(XzxyI}=<8%@Zf~`_u#zJ<+#D&aXHscN_v6JNN)oDDNrBAP` ztZAyNsH|AFw6bzVh0H7-$4&ukH4#On*ezud-<- z!E_G0V%SE3c^|roEgWIIz+g@*h<(>KezW<6MTgAMQFfb}@H!e^S70L_!t2x<Et|^l9WfzMi%>OeZ!|KWqGV-(91cnDhl&}a ztwh+f>liYayL5zGVe1l2-lPR&TB%~&D8OhX6s;o(Jb^#+j1P%d=)uIu+5`=f5 zd^pn&-{EI|%oUjgyRtc3{*7)f`n9I}l?LbI_Y= zTb#4vm`tgXzq6AXf0@TZ2;CYn)HP@qnxmr0v5<`jIb-GSgy3muGdjFBZl3r6mc@%Z zq5!B*scu%rR5^|*O()ujaeKTo=<*n=8C){25j((bO8}{JNT_VtyK5|t;_qXu7t*`A zhsdw^{lyV$XKI^QK6XlN(T7F7@r57MmA${O_P5c!OG~47j(F(EqN9p?x7>To(X;}2 z>-h4AM?|CJ-d&*ucklh^jOeJ*C(hRP+oilwD<4yYy-oPF!52nsenXox6F&&ryYtxS ztm1R0Xm3m{zhT7X2WXE?!Ry^?Ye!59YPTMw-Bw(FW=XVZ#PoXY9}VUA6*b zLytvschg=R(fhwzbc*(Qsn%Is{^ikk&CzarPb*zg{@oETRBI1CpnbEf{J%x>pU{dI zX^&4Rzf^0irDe3GCB3hfY<_FxRkhl6BOwr7LO+Uo$_tP76g8fzwd|&S=RXynjcQz> zy}F zFN)qa@|iDb6L0K2@0jTRBe8b+l-4`CtnpRtthaR33s-43&etv((R<~@ z%a79PkJhU8D_>F+ouIu{k5$&*=d~C9pLXk)w2uxfpH?#Id)oBoA)Pbu zopXEd7(3}8D$vHsy$g#bO(^>5XsxQe{K=xt$CgZ=Ibz~Fy_Y36Kc{`ZlQyxaym`d@ z2TH3aX?u+-fBXNlci&-BRR5!(YnXu{2}sUCkRUmOglTflK{5<^h$C4*89<^42q;KK zB#0m&K@^k$2__T~m7s!(hyn_T0*bOdfZyNUyL+E!cmKI}pZiwL=hW#_Rp(T_-8HAr zGt<>UhJrzbF2Tv{p$^IBev|YJl^z^E^tsW&%PoUB853)y$gm{oqwSxiPD~bT86KQ# zA52J>xHLu5LDmg_Za;}66pUXI{up(rMMU^B#~bqp>r#cEiwx(3@i~GgGA9m?p8HY| zezHopOIFWebi(gbqd?O$aV!46;Rrc1I>%0U3i&(}s#fl&Kh8${mzUk$52DO8elW zazU=B(Cg7xT0}=B55LwEUyPdDGTGCmgXfba_KKX_EGRKN=$bp!F=9(xuqR*mgZZJK zgTxv^{^x@)awRMddORMq%oDtoGI3pSHb+q5kzh%&(D%X7dBN@W5f4R$S|krOi1Yf#6WO#8MH7J(KQU@LuM`LP7qYg5JA=qEVq`$yQbl4&(~9 zrw+48aT02@fVqsE~9xU!+bf8rh>q($^=ii4MIQ zb#_LubWX4-DzRJAEod@F2icM(j!jl3M{qV>P$>Ll1xG`{mNLPHAn}=CONO9C=A?f% zsTvi&{Y?0uEiR=CU5@DSK(O@th>yd68IMRP7(|s1jwDZ*7xZWzBt|FQ*ri2~&^DM= zKZuA-ED_A@8>~zn6pK!*m+DHnAak0??iVA&H)N?39NnJu>v%}Agd#yg zjbK5ta1Dv2Ber}KoJ$ql*p>L>Q}G#t1yRA!~cYDR_o zM|A7Xy(#Mc;he;3K_XEFv!x%^4TkvyrW#QpMr7k3*^DnC}^k-KFH_m1qp-~ONb2lQ{f z{~qU{-;-*%TmRkj{I~w-`wjeC|G={!-z)ha)E{o|?)0zc+8%E%ntQ)2xaWBH`2Q`k zBtU=w0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk|0@U# zD>&-2<2Pp|%Y6S}Qa1~NJK-s15JV;wMcqwm{%uhzd=uHNfM*6mWXc8864(*!Oto>O`y$L01by(P}W7nF^OCGJ? zH$J*X^N$~GH$7|7zS~>&>0PS8=#{ZGdRM92Z&mAtgL2jDzPnAk;kl~zUOc#B_i`OW z?{{g@s#vR9`#V;cnWkIYrOo1oWN0#I-s6qiR;ko!N#|BW3)JhrVraSeqE*JNYS+Eb zBiXv1s@u3tW7KI13$TVSNwPvHMR_nI7SDo>tsLYL9wl+Vq*;s{e!nMO&UK*1LPj>Vr4d8(6PJzWB|Js`af~ zJ9&2NQMF@A_k6#4*Z!6Aw0&)8#|C8^H96e2LF-n9J0#X07HXMy$nIh-rubU7gV0~N{?3UW6HE$ z+NI%y2iw+oYe>yeSt|_RUcdEYEgy>CS#oHrnt6t;?A&T>C})$C)!Prs(W%CV9qNxP zldb={x*bOrYTW#AlXguWZC&zA#TL`kH}Ca&wN`x#)rwuxy?K12yn|OX?bjt&Oy3v# zb{v$hcI#~e+df{YaGk^!ZDLC_uYIy=y=SvF=`p)|-5%{r_1OGat??=9_gg)vUXvD~ zDxbBj-Mnqt-mg{fGqgmmfeSnKY|^e+w^!@N4lfgWbWi^d)hfsI_@MZxHV@aWvuk+8 z>8V=QINYUO>zMM*4m7Jjv~vEZrgrQ#s!;LH?{yb4>s&PJWI@=jon+eEncnT zk(MP!)yy(vUCTb*YlN!rZ1UKYV%1|dwjbR-TeZix^r$~Fy5@lSW6M8Xq~M4pZ99(4 z(6Q3n1FFV1Ox=B7X^YLwTRQRA-2a|* zr(!2EhV!A?>F<`L41&m{OqXz4CNkyKn9DJjVy?tojQJ(z=a^q(B7>Kk6?^|o(RmAA zZd9nzOM~C-`_|jPMhA&Oa3cKk=Y)$pe{YuQ;fxQ2_r6zp;N+iyi$xyO+j1_Q7)>Y`K^2Z`f_oN4Lwpczea_@v9Oi_DWgeca z51Cam=-X#mo9T0&>_6)5_^S_ow*ULn&#(Mo%hvyE`rKOwUwQh=KDS1+eXHi6&wKV5 zb$rZ6efrOSbIpbMjT)4>m!|FbPpe?uu}p_LE?o3=%aNB#rs%!pm17s1-Al{8|6FYB z3w0`f*rr^wo*7@O{N?Zs2b!E7mifO;U;86-{Xbt^H@8*J1vAD!{!*@yM-$tBl>O*4 z=ZeH9EIyO9Yx+lf)-5#sk3GTevx6hblzix3dZ$6QZV#{6zhh0t$2x!0WAdW1^M)** z_sfsXXHVaD`Q)+jwP&1J*{j2tO}R#-Is5G3A)RM8eejI~Q=`We-rnlMj#7_~+4*Sa zG`VZVzA~*}>8WoPIX<)6XVu0fM2*f_x6!6tU(TGKGGWTpv1Nv)=uzdv>WxoKS^C!p>aDh^9CY50~2&$p>qxbmw*-fsB*&B(VN{`8Me zBCpi`y5`a8({c`ctHn2Q1+G*kIzOne~dq=0%sS^Z?+V!g%1ZQ`=9!`TQ-HQF27R}J3L^ywU zx>BZBxctPl7fS}g7s2zj?o7xqCn+BvQNKzM+{+i;d%RK*99@@GK0aH{>fslEmet`p zqwdzQ=thrl{-s;3I|o6s@Ek6^+t&S7?zMY&%en8LO@6P{@Uc}o8m{xFm}}v=a8NU- z7u>mXC)@qC9-%n(tl{=An4Pm4%QOdlCsIyG|e z8x_;tPOLno&_l&Oed+S)j2WVmF0T96*T-AO^}h1bjt92vEOxb0s7Q444#WSv_{fUX zQzm>+blPKClg$`Va?g?_Wp{0P=K8wd4`1xt@yfn#b%MIA zOK|4+k}S*eZMv7P_}=0C2KaZ z(yNcxyL{@wIgS2)p!cik(~s$qztN5nCuSGFeEEe>a=y`_!R=I0KYlmsM4uDw7OtsM z;Fa&jG-&vK@8fyCxKMf3sy}l)n67V?v1|S)yrAN%1>Y(1%ff`kwB4U<%Uf_lx@AXuF8(TK zy1%|ZJ+Vr=W~a{o`o!%oMveO7@1s4(H8?l!w}BVxOqkSZ(NE`Z{`L92w06I(*&dm7 zY0`~zZSq#H^l`<6hP_uWACRf+y|hYPwTQzi?LvK8S=U!okTN{~Kfk^%hkL01nlFZXsf#hmgXkbtkS1sxbPc)( zu|dzESJJhYH2r)1CG~G*Bcp%McRk-9`L5-=neVrJH}VBR(Tv+0&CeWUe0Y7bLWAEL z++6eyQ+x{v{*FwEv-C!HZWme$b%);z=)0+1zjcCnZkhy?v$5g;$FoTC}!Zomc9X zY4+;W)-!@M3$l&h`FQNu0+l}4QDVjH#$T?>bbQ(5p(RsoyAv!Z_SOrhAK72`;18dl z8hSeGnFs!8cx2a~d*^Ps-164i34i~X=9A)2ebKaO!8*{_;IUWR$Ec7HE_p0urw zP0Kmu!x|f=KU*hPrt-U=IS~3g)wEwqT&tXSN}hxoT`%YSZc>hGJ99phe0itnivRRj zy(jd3&Xjki}8wYC@PTjkQ*rJLXBUh{OX zroEbe-m+!3(I3AvDz0+YW#9GQT%vWWwx4ZyHvb=)4`%PY>cPJ&j4bnZmbcnJ@OaeF z`VVv|lJ2XC9m}>zHT-bhUE>BWe>?m6FSvq7TZiTUEBtpkx!Cn-Tx+f@eP1vhu|rFVC%$(7)`IQByM(8kzWP zOt7o%UwxA=o*ug*d6xFI9?N^=`7d64Z^503pMExfck+h@e383GOy=8PRc-!Csd6#j zuT3(37Xb2z=*@wCjJ*x}zUCt+HSCJ{lxlZ#F!3lej# zEO+5f`UAcCrU`;wLBa4lzI%OL%cou$9Dc*MqVLXd&$;{P*@z%$Q+9D=kZ`Y-^EEnz zTljSRE8(s%2qKc^_&u$IU}Y#_Yq%isYUA(@_oi|=_WYX-n&#@CD+umnxnD3Se2s+P zKVA#>Ygfbl+aEE%hkLr;Vp0T?`W{(aDb?ht%b_%9_ucufUhNl3X58NUxqPWI2RBOu zpRKKvFzboP|E7OCaO%t7USAaVezT~n(_Za4qr~LhgARjaTg!E-twPnr>jP%&-~NTGdIT`?veGG z?%N+NI(*r^{_Xu{PyUwmYWJRrRoQd%hrUb84*IClz`k#kJCN?j>;-!j zEmUpwiM>B(98m9>Vvja2k!4lZd;QzgwG)R%)h`!c_S=5b@AYp>e;8e3?|{`8C%5c( z_~XM_CT`lcGU~aiZ=I-|RI@h^8M^1;SM-}Lyq%#5#6RNj9$RsTyZ zt{iyu{I-^ji@Y~(#Dc7&rZ=4N(y-n2&Yvo`we7CS8P5-Rv(B5D%J%qq>B`twTV;Q^ zdz}$$x86%TzuN7+lc#=vW%bOT$Nm#DqkKf2#n(4KnzR3<=tAQQ&n$iHhi6t~ia$}V z#r3OEucT~HV0`6Wd$O;uwDs%PX7>E``6ox_I`+%G_m2<6t*Nu2u0f7~6FW5TJR?ef>Nk62uM^!!)$ zj{dH0%->HpSlsKtg)i>3eCb5mMHBA5e;ktj=f8Ta8QDBrh5GsDEUWg}{+YcW9QxD? ziA{dXnXc5IQ(mg~b@GfI`V^Wx^t+oM)QtLe?!Epkbm>yRH@lRo*7NPBuSK0NU;NUI zsb3zd+PF!sN(<7?Y#Qu1GVo69z4wpPUaxtg|Jwgq{afV!%l_@xm>c2w*Kn_PIVOEj zE~xl_-=EF;&xLp|6aH0kcbdK8^=X?vc>Q?xmt#APU3_SAiAL4t&!3fR!_>iLldVtj zR+=Tj%muF(tJ7rSgvATK>%U=9r4LfSG;wT!;d9fEO*`Ph54WVM8kMGa`nOWiXZsI?`47P-?_)t>U{hv3$_Yc8>009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U 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 zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FoJc3Dn%w zu;2IPC*1pFs9KMLQB)w@hr6gyNa2toAw@%qg~Wvv4=E8+Dx`Es*^mQ64h|_FQZb}b zNR^PPA=N^T45<-vbV$vRS|PPVP6(+Rk`R&yWk~?L$rr=@@c)NSBaqA!mg22mjUC8W^8$)gmnG?*wh_|^nJ10 z1&=Sge(Ra%{r%vk&mU;d*t%>%dI(~LUy6r3kKXU z=8K6BOm6jX@9bmSWW93!j?o9TsIqzUyfSeU>!0}9-7kGLfAshB{#5?GzizuZ{o=+c zmlW*1V#uXA&va~^^vR|Tvj-+&{Z9iM*c>#b(BxoFYi#j_h$Z+qde zl8>J9xZtiQa~iHLn)_NT9D8E7Yu~TG|9`Ft z1OMiFz!5LTz0tZ$$K?~_7nX^?S%N-ttb*L*gnY)@=0D2PIzEQRei?osK`FdGGO+4t@EKo0|5i zwRG<0ftN0+ydb;hLuD3EzIb}mRVOXI;M7Lb9?O~Xr@3dByfUXkw}&=9*YKMcei(IA z+ktPqa@xR0=PsS~r?=i5@aG{M^L#BjW5i&L8>X7LnGeTyDTo*Dsn5cqr6r{%r6eUMB_$;$B_zcs)lE!KOiN5n zOi4^mOiD~lOh}ARtecRYkd}~|kdly`kd%;^kdP3cP&Yn3J}o{qJ|#XmJ}EviJ|R9n zzHWM2YD#iaVnTe~(EqW46_$Y)?95%t?s^z?sTLbiyOz;4Uaq?|t$qDcjg~eY*0No@ zil^Rk>N}lo>UPu_clJ2F>-P3nHP|9y)}ou2A)XP2H`3wD39`=~RH=~<&s zuR-r*jmSD+#Pvgmol`seieaUOpK#u&5x0)~bX4ZZyRw^&7(Qy}$i^4689ivsg`+Eu zSw4DG&e#jb+tZyx*cn7Ly{j=6mF>!XhyQ+w>AV>8EHId18=V{j3f7al$S;qeDgXgguzgr_EKm{4nCy@{PC4xX4Zani(V z!$A4qo)7NH3@@drvB43Rvgho&|Npl=?=79z^srSO2xu zcWWCbelV-#Ay-uD^2U9wd#)Qge`MD47gTL9ZqB4v&O5vN@a5Ny+W6{>^Pal+_BWHV z=A=x2_^{G(_e^Z}Wafu;&wVicj?r!Empg0f$16vzZL+yw`fWcn`SGa9H&tHq>4tBH z-TPhZ8?Nth%8Fa-yt;nFpSN^7KW)s+8@sGnQ0J|#8%J$j{r!)J6{vGjyQe37{MBEp zjJoNEPGf8DytY`B^Z2r}GNYVmV%1%(S)SM2zqKu_ESlN4VD94vtN-ruk2_c=K!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 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 zf9NG<7hAr~Q;79NY>D+_Y`MAU^w*0XP_uY0Zg`xwi#ZB?9pknTAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N 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 z!5QMEOp3bc2K&16xZhKsd=2YPts8Gm$rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00n#$Xf!nS^4=i{t!s+<{l#yb_zf4oq2hPu%a85aTVC8yDy#od%86g~zKY^k zEm0p6pPiXyGo@KfgX6nr+tM@4@tGD=zj&pyxbHskt3D<|{OXUXDsER7zv^S_i{FOg zw~_d5CVpFs-)qEgC-JL3e(2!tLoc+So}HE2JKbhB4a&|GeW-VKwVCd=q;(%Uw0BQy zlEu`0XfIQS$(oRAv5LDz18N)M_i6E)KMpm9TH?2k_>B|4O~vnJ;#ckeD)AdHetU^u z)kA%JU-NiNV*20=lf~*WoCK5Alw|6eWlEdih^mLpWKA?{k=rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ zfC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O z0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC z1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo z6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)U zP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZ zKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt z00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun z0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP z3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbF zC_n)UP=Epypa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epy zpa2CZKmiI+fC3bt00k&O0SZun0u-PC1t>rP3Q&Lo6rcbFC_n)UP=Epypa2CZKmiI+ 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 araxP;IrQKx7*C$VfQE{W@>@l?|9=3t7PcM$ literal 0 HcmV?d00001 diff --git a/notebook-examples/sqlnotebook-docs/pages/Components/All Components.md b/notebook-examples/sqlnotebook-docs/pages/Components/All Components.md new file mode 100644 index 0000000..0f36b7a --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/Components/All Components.md @@ -0,0 +1,270 @@ +# Welcome to qStudio - SqlNotebooks + +If you want help there are guides located at http://www.timestored.com/qstudio/help/ + +Any feature requests etc feel free to raise on [github](https://github.com/timeseries/qstudio/issues). + +# Latest Trade Prices + +Table display can be configured using column names. See help->charts for details on format. + +```sql type="grid" server="localhost:5000" +update percbar_SD_DATABAR:percent_SD_PERCENT0 ,bid_SD_FG:((`$("#FF6666";"#66FF66";""))!`$("#222";"#222";"")) bid_SD_BG from + ([] time:.z.t-til 50; + status:50?`partial`filled; + instrument:50?`GBPUSD`USDNZD`USDCAD`CHFJPY`EURUSD; + symbol_SD_TAG:50?`UBS`C`MS`HSBC`NOMURA`DB; + price_SD_CURUSD:50?100.0; + bid:50?20.0; + bid_SD_BG:50?`$("#FF6666";"";"";"";"";"";"";"";"";"";"";"";"";"#66FF66"); + bid_SD_CODE:50?("0.xXXx";"0.XXx";"0.xxXX"); + percent_SD_PERCENT0:50?1.0 ) +``` + +# Gold vs Bitcoin 2024 + +```sql type="timeseries" server="localhost:5000" +{ walk:{ [seed;n] + r:{{ abs ((1664525*x)+1013904223) mod 4294967296}\[y-1;x]}; + prds (100+((r[seed;n]) mod 11)-5)%100}; + c:{x mod `long$00:20:00.0t}x; st:x-c; cn:`long$c%1000; + ([] time:.z.d+st+1000*til cn; gold:walk[100;cn]; bitcoin:walk[2;cn]) }[.z.t] +``` + +## Candlestick Chart + + +- The table should contain columns labelled open/high/low/close/volume. +- The table must atleast contain high/low or open/close to allow it to be drawn. + + +```sql type="candle" server="localhost:5000" +{ r:{{ abs ((1664525*x)+1013904223) mod 4294967296}\[y-1;x]}; + walk:{ [r;seed;n] prds (100+((r[seed;n]) mod 11)-5)%100}[r;;]; + c:{x mod `long$00:05:00.0t}x; st:x-c; cn:100+`long$c%1000; + t:([] time:`second$.z.d+st+1000*til cn; open:walk[9;cn]; close:walk[105;cn]); + -100 sublist update low:?[open > close;close;open]-(r[11;cn] mod 11)*0.02,high:?[open < close;close;open]+(r[44;cn] mod 11)*0.02,volume:(r[44;cn] mod 110) from t}[.z.t] +``` + +# Bar + +- The first string columns are used as category labels. +- Whatever numeric columns appear after the strings represents a separate series in the chart. + +```sql type="bar" server="localhost:5000" +([] Company:`Microsoft`Oracle`Paypal`Monero`FXC`Braint`MS`UBS; + PnL:(0.8+rand[0.2])*31847.0 13239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0; + Revenue:(0.9+rand[0.1])*15080.0 11300.0 34444.0 3114.0 2228.0 88.9 1113.0 41196.0 ; + Negatives:(0.95+rand[0.05])*48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 11732.0 ) +``` + +# Bar Horizontal + +```sql type="bar_horizontal" server="localhost:5000" +([] Company:`Microsoft`Oracle`Paypal`Monero`FXC`Braint`MS`UBS; + PnL:(0.8+rand[0.2])*31847.0 13239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0; + Revenue:(0.9+rand[0.1])*15080.0 11300.0 34444.0 3114.0 2228.0 88.9 1113.0 41196.0 ; + Negatives:(0.95+rand[0.05])*48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 11732.0 ) +``` + +# Stack + +- The first string columns are used as category labels. +- Whatever numeric columns appear after the strings represents a separate series in the chart. + +```sql type="stack" server="localhost:5000" +([] Company:`Microsoft`Oracle`Paypal`Monero`FXC`Braint`MS`UBS; + PnL:(0.8+rand[0.2])*31847.0 13239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0; + Revenue:(0.9+rand[0.1])*15080.0 11300.0 34444.0 3114.0 2228.0 88.9 1113.0 41196.0 ; + Negatives:(0.95+rand[0.05])*48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 11732.0 ) +``` + +# Bar Horizontal + +```sql type="stack_horizontal" server="localhost:5000" +([] Company:`Microsoft`Oracle`Paypal`Monero`FXC`Braint`MS`UBS; + PnL:(0.8+rand[0.2])*31847.0 13239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0; + Revenue:(0.9+rand[0.1])*15080.0 11300.0 34444.0 3114.0 2228.0 88.9 1113.0 41196.0 ; + Negatives:(0.95+rand[0.05])*48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 11732.0 ) +``` + +# Line + +- The first string columns are used as category labels. +- Whatever numeric columns appear after the strings represents a separate series in the chart. + +```sql type="line" server="localhost:5000" +([] Company:`Microsoft`Oracle`Paypal`Monero`FXC`Braint`MS`UBS; + PnL:(0.8+rand[0.2])*31847.0 13239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0; + Revenue:(0.9+rand[0.1])*15080.0 11300.0 34444.0 3114.0 2228.0 88.9 1113.0 41196.0 ; + Negatives:(0.95+rand[0.05])*48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 11732.0 ) +``` + + +# Area + +- The first string columns are used as category labels. +- Whatever numeric columns appear after the strings represents a separate series in the chart. + +```sql type="area" server="localhost:5000" +([] Company:`Microsoft`Oracle`Paypal`Monero`FXC`Braint`MS`UBS; + PnL:(0.8+rand[0.2])*31847.0 13239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0; + Revenue:(0.9+rand[0.1])*15080.0 11300.0 34444.0 3114.0 2228.0 88.9 1113.0 41196.0 ; + Negatives:(0.95+rand[0.05])*48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 11732.0 ) +``` + +# Pie + + - Each numeric column represents one pie chart. The title of each pie chart will be the column title. + - The segments of the pie chart use the string columns as a title where possible. If there are no string columns, row numbers are used. + +```sql type="pie" server="localhost:5000" +([] Company:`Microsoft`Oracle`Paypal`Monero`FXC`Braint`MS`UBS; + PnL:(0.8+rand[0.2])*31847.0 13239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0; + Revenue:(0.9+rand[0.1])*15080.0 11300.0 34444.0 3114.0 2228.0 88.9 1113.0 41196.0 ; + Negatives:(0.95+rand[0.05])*48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 11732.0 ) +``` + +# Hierarchical + +## Tree + + - Starting from the left each string column is taken as one nesting level + - The first numerical column will be taken as size. + +```sql type="tree" server="localhost:5000" +([] Continent:`NA`Asia`Asia`Europe`Asia`Europe`Europe`SA`Europe`NA`Europe`Asia`Australia`Europe`NA; + TradingBloc:`US`China`Japan`EU`India`UK`EU`Brazil`EU`US`Russia`SouthKorea`Australia`EU`US; + Country:`US`China`Japan`Germany`India`UK`France`Brazil`Italy`Canada`Russia`SouthKorea`Australia`Spain`Mexico; + GDP:19.485 12.238 4.872 3.693 2.651 2.638 2.583 2.054 1.944 1.647 1.578 1.531 1.323 1.314 1.151 ) +``` + + +## TreeMap + + - Starting from the left each string column is taken as one nesting level + - The first numerical column will be taken as size. + +```sql type="treemap" server="localhost:5000". +update exports:(0.1+9?0.1)*GDP, exportsPerCapita:(0.4+9?0.1)*GDPperCapita from + ([] Country:`US`France`japan`Germany`UK`Zimbabwe`Bangladesh`Nigeria`Vietnam; + Population:(0.9+9?0.2)*313847.0 213847.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0 87840.0 ; + GDP:(0.9+9?0.2)*15080.0 3333. 4444.0 3114.0 2228.0 9.9 113.0 196.0 104.0 ; + GDPperCapita:(0.9+9?0.2)*0.001*48300.0 37000 34700.0 38100.0 36500.0 413.0 1788.0 732.0 3359.0) +``` + + +## Sankey + + - Assuming string columns named S1,S2,S3 with a numeric column of value V. + - Each row represents one flow from the top level S1 to the leaf node S3. S1->S2->S3->V + - The first numeric column reprents the size of the flow between nodes. + - Sizes are back-propagated to the top level. + - Null can be used to represent either gaps or allow assigning value to a node that is neither an inflow nor outflow. + + +```sql type="sankey" server="localhost:5000" +([] OrderOrigin:`Internal`GUI`Web`Platform`Internal`GUI`Web`Platform`Internal`GUI`Web`Platform; + Exchange:`ICE`ICE`ICE`NYSE`NYSE`NYSE`LDN`LDN`LDN`CBE`CBE`CBE; + State:12?`New`Partial`Filled`Filled`Filled`; + v:12?20) +``` + + +## Sunburst + + - Starting from the left each string column is taken as one nesting level + - The first numerical column will be taken as size. + + +```sql type="sunburst" server="localhost:5000" +([] Continent:`NA`Asia`Asia`Europe`Asia`Europe`Europe`SA`Europe`NA`Europe`Asia`Australia`Europe`NA; + TradingBloc:`US`China`Japan`EU`India`UK`EU`Brazil`EU`US`Russia`SouthKorea`Australia`EU`US; + Country:`US`China`Japan`Germany`India`UK`France`Brazil`Italy`Canada`Russia`SouthKorea`Australia`Spain`Mexico; + GDP:19.485 12.238 4.872 3.693 2.651 2.638 2.583 2.054 1.944 1.647 1.578 1.531 1.323 1.314 1.151 ) +``` + + +## Scatter + + + - Two or more numeric columns are required. + - The values in the first column are used for the X-axis. + - The values in following columns are used for the Y-axis. Each column is displayed with a separate color. + + +```sql type="scatter" server="localhost:5000" +update exports:(0.1+9?0.1)*GDP, exportsPerCapita:(0.4+9?0.1)*GDPperCapita from + ([] Country:`US`France`japan`Germany`UK`Zimbabwe`Bangladesh`Nigeria`Vietnam; + Population:(0.9+9?0.2)*313847.0 213847.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0 87840.0 ; + GDP:(0.9+9?0.2)*15080.0 3333. 4444.0 3114.0 2228.0 9.9 113.0 196.0 104.0 ; + GDPperCapita:(0.9+9?0.2)*0.001*48300.0 37000 34700.0 38100.0 36500.0 413.0 1788.0 732.0 3359.0) +``` + +## bubble + + - The first string columns are used as category labels. + - There must then be 3 numeric columns which are used for x-coord, y-coord, size in that order. + +```sql type="bubble" server="localhost:5000" +update exports:(0.1+9?0.1)*GDP, exportsPerCapita:(0.4+9?0.1)*GDPperCapita from + ([] Country:`US`France`japan`Germany`UK`Zimbabwe`Bangladesh`Nigeria`Vietnam; + Population:(0.9+9?0.2)*313847.0 213847.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0 87840.0 ; + GDP:(0.9+9?0.2)*15080.0 3333. 4444.0 3114.0 2228.0 9.9 113.0 196.0 104.0 ; + GDPperCapita:(0.9+9?0.2)*0.001*48300.0 37000 34700.0 38100.0 36500.0 413.0 1788.0 732.0 3359.0) +``` + +## Heatmap + + - Each numerical column in the table becomes one column in the chart. + - The numerical values represent the shading within the chart. + +```sql type="heatmap" server="localhost:5000" +update exports:(0.1+9?0.1)*GDP, exportsPerCapita:(0.4+9?0.1)*GDPperCapita from + ([] Country:`US`France`japan`Germany`UK`Zimbabwe`Bangladesh`Nigeria`Vietnam; + Population:(0.9+9?0.2)*313847.0 213847.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0 87840.0 ; + GDP:(0.9+9?0.2)*15080.0 3333. 4444.0 3114.0 2228.0 9.9 113.0 196.0 104.0 ; + GDPperCapita:(0.9+9?0.2)*0.001*48300.0 37000 34700.0 38100.0 36500.0 413.0 1788.0 732.0 3359.0) +``` + +## Radar + + - A radar chart requires 3 or more numeric columns to render sensibly. + - Each numeric column represents one spoke in the radar. The column titles are used as spoke titles. + - Each row in the data represents one circle withing the radar. + +```sql type="radar" server="localhost:5000" +([] portfolio:`threadneedle`diamonte; agri:100 10; realEstate:100 10; tech:0 80; growthPotential:50 100; finance:60 20) +``` + +## Calendar + + - The table should contain a date and atleast one numeric column. + - The first numeric column will be used as the value for that date. + - Dates should not be repeated. If they are the value selected is not guaranteed. + + +```sql type="calendar" server="localhost:5000" +([] dt:2023.12.31 - til 730; v:(asc 730?50)+(730?50)+730#90 80 72 83 40 2 3) +``` + +## Boxplot + + - Each numerical column in the table becomes one boxplot item in the chart. + - The min/max/median/Q1/Q3 are calculated from the raw data. + - This is inefficient as a lot more data is being passed than needed but useful for toggling an existing data set view quickly. + +```sql type="boxplot" server="localhost:5000" +([] gold:10?10; silver:til 10; crude:desc til 10; slick:13-til 10; copper:10?3; iron:10?8; diamond:4+10?8; rubber:6+10?10; lead:8+10?12) +``` + +## Metrics + + - Two or more numeric columns are required. + - The values in the first column are used for the X-axis. + - The values in following columns are used for the Y-axis. Each column is displayed with a separate color. + + +```sql type="metrics" server="localhost:5000" +([] gold:10?10; silver:til 10; crude:desc til 10; slick:13-til 10) +``` diff --git a/notebook-examples/sqlnotebook-docs/pages/Components/Time-series Charts.md b/notebook-examples/sqlnotebook-docs/pages/Components/Time-series Charts.md new file mode 100644 index 0000000..137c2ca --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/Components/Time-series Charts.md @@ -0,0 +1,133 @@ +--- +server: c:\temp\duckdb.duckdb +--- + +# Time-series Charts + +Time-series Charts are the best way to visualize time-series data. They can render as lines, points or bars. + +Our SQLNotebooks work with 30+ databases , the examples below use this example [duckdb-demo.duckdb](https://www.timestored.com/sqlnotebook/files/duckdb-demo.duckdb) database** +you can download it and change the server name in the header of the file to render the examples on your own machine. + +## Single Time-Series + +A result with a single time column and a single numeric column are rendered as a single area chart with latest , maximum and minimum values shown by default. + +```sql type='timeseries' +SELECT time,gold FROM gold_vs_bitcoin ORDER BY time ASC +``` + +## Multiple Time-Series + +A tabular result with multiple numeric columns is shown as one series line per numeric column. The latest values are shown as labels on the right hand side. + +```sql type='timeseries' +SELECT * FROM gold_vs_bitcoin ORDER BY time ASC +``` + +# Time-Series TAQ Chart + +Pulse has particularly good support for finance charts. The below image shows a time-series chart displaying: +See the [TAQ docs](Time-series%20TAQ) for more information. + +```sql type='timeseries' overrideJson={{"custom":{"dataZoom":{"show":true}}, grid:{bottom:70}}} +SELECT * FROM taq ORDER BY time ASC +``` + +# OverrideJSON - eCharts + +You can specify an ``overrideJSON`` argument to configure charts. For example setting custom.dataZoom.show:true would add a data control as shown above in the TAQ chart. + +## dataZoom Control + +```` +```sql type='timeseries' overrideJson={{"custom":{"dataZoom":{"show":true}}, grid:{bottom:70}}} +SELECT * FROM taq ORDER BY time ASC +``` +```` + + +# colConfig - Column Configuration + +You can specify an ``colConfig`` argument to configure how a column is displayed within a chart. + +## Dual-Axis + +```` +```sql type='timeseries' colConfig={ {bitcoin:{itemStyle:{color:'#888822' }, axisChoice:"rightax"}}} +SELECT * FROM gold_vs_bitcoin ORDER BY time ASC +``` +```` + +```sql type='timeseries' colConfig={ {bitcoin:{itemStyle:{color:'#888822' }, axisChoice:"rightax"}}} +SELECT * FROM gold_vs_bitcoin ORDER BY time ASC +``` + +## Combined Bar and Line Charts + +```` +```sql type='timeseries' colConfig={ {bitcoin:{itemStyle:{color:'#661111' }, type:"bar"}}} +SELECT * FROM gold_vs_bitcoin ORDER BY time ASC +``` +```` + +```sql type='timeseries' colConfig={ {bitcoin:{itemStyle:{color:'#661111' }, type:"bar"}}} +SELECT * FROM gold_vs_bitcoin ORDER BY time ASC +``` + +# SQL Based Configuration + +```sql type='timeseries' colConfig={ {bitcoin:{itemStyle:{color:'#661111' }, type:"bar"}}} +SELECT * FROM japan_births_deaths ORDER BY Year +``` + +```sql type='grid' colConfig={ {bitcoin:{itemStyle:{color:'#661111' }, type:"bar"}}} +SELECT * FROM japan_births_deaths ORDER BY Year +``` + + +You can configure the appearance of a column by adding an _SD_FORMATTER at the end of the column name. +For example if a column was call itemPrice, you could name it itemPrice_SD_CIRCLE to show the chart without a line and instead showing circle markers. Additionally you could add a column named: itemPrice_SD_SIZE to set the size of the circle/symbol. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AreaExampleOptionsDescription
Shape_SD_CIRCLECIRCLE, RECT, ROUNDRECT, TRIANGLE, DIAMOND, PIN, ARROW, NONEThe shape to use for displaying points in the chart.
Shape Size_SD_SIZENumber 1-99The size of the shape to use for displaying points in the chart. You MUST have set an SD_SHAPE first.
Point Marker_SD_MARKPOINTStringAdds a labeled point to the chart at the corresponding point.
Point Line_SD_MARKLINEStringAdds a labeled vertical line to the chart at the x-axis/time location.
Point Line_SD_MARKAREAStringAdds a shaded area to the chart between when the label starts and finishes.
diff --git a/notebook-examples/sqlnotebook-docs/pages/Components/Time-series TAQ.md b/notebook-examples/sqlnotebook-docs/pages/Components/Time-series TAQ.md new file mode 100644 index 0000000..dd2713b --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/Components/Time-series TAQ.md @@ -0,0 +1,100 @@ +# Time-Series TAQ Chart + +Pulse has particularly good support for finance charts. The below image shows a time-series chart displaying: + + - **Bid/Ask Lines** - A two-way price quotation representing the highest price a buyer will pay for a security and the lowest price a seller will take for it. + - **Triangles** - Representing client trades, the position is the price executed at and the radius is proportional to the quantity of the trade. + - **Circles** - Represent hedger trades. To maintain an acceptable risk position given client trades. + + +```sql server='c:\temp\duckdb.duckdb' type='timeseries' overrideJson={{"custom":{"dataZoom":{"show":true}}, grid:{bottom:70}}} +SELECT * FROM taq ORDER BY time ASC +``` + +To generate such a chart, we use specially named columns to control the appearance as shown below. The table must: + + - Contain atleast one **date or time** column. + - Any plainly named columns e.g. **Bid/Ask** - will by default be rendered as a line. + - Specially named **COL_SD_SHAPE COL_SD_SIZE** - columns can be used to generate scatter points at that location with a given size. + - For example the column pair ``BUY_SD_TRIANGLE`` ``BUY_SD_SIZE`` generate the purple triangles that together represent BUY. + + +```sql server='c:\temp\duckdb.duckdb' type='grid' +SELECT * FROM taq ORDER BY time ASC +``` + +## Configuration Explained + +You can configure the appearance of a column by adding an _SD_FORMATTER at the end of the column name. +For example if a column was call itemPrice, you could name it itemPrice_SD_CIRCLE to show the chart without a line and instead showing circle markers. Additionally you could add a column named: itemPrice_SD_SIZE to set the size of the circle/symbol. + + + + + + + + + + + + + + + + + + + + + + + + +
AreaExampleOptionsDescription
Shape_SD_CIRCLECIRCLE, RECT, ROUNDRECT, TRIANGLE, DIAMOND, PIN, ARROW, NONEThe shape to use for displaying points in the chart.
Shape Size_SD_SIZENumber 1-99The size of the shape to use for displaying points in the chart. You MUST have set an SD_SHAPE first.
+ + + +## Example KDB Query + +```sql showcodeonly +// Random walk chart +{ r:{{ abs ((1664525*x)+1013904223) mod 4294967296}\[y-1;x]}; + walk:{ [r;seed;n] prds (100+((r[seed;n]) mod 11)-5)%100}[r;;]; + c:{x mod `long$00:05:00.0t}x; st:x-c; cn:100+`long$c%500; + t:([] time:.z.d+st+1000*til cn; bid:walk[100;cn]); + rnd:{[r;seed;n] (r[seed;n] mod 1000)%1000}[r;;]; + t:update ask:bid+0.1*rnd[10;cn] from t; + t:update buy_SD_CIRCLE:?[rnd[11;cn]>0.92;bid-rnd[11;cn]*0.03;0n],sell_SD_CIRCLE:?[rnd[15;cn]>0.92;ask+rnd[11;cn]*0.03;0n] from t; + t:update buy_SD_SIZE:?[null buy_SD_CIRCLE; 0n; 1+r[14;cn] mod 10],sell_SD_SIZE:?[null sell_SD_CIRCLE; 0n; 1+r[14;cn] mod 10] from t; + t:update hedger_buy_SD_TRIANGLE:?[rnd[11;cn]>0.98;bid-rnd[11;cn]*0.01;0n],hedger_sell_SD_TRIANGLE:?[rnd[15;cn]>0.98;ask+rnd[11;cn]*0.01;0n] from t; + t:update hedger_buy_SD_SIZE:?[null hedger_buy_SD_TRIANGLE; 0n; 6+r[14;cn] mod 14],hedger_sell_SD_SIZE:?[null hedger_sell_SD_TRIANGLE;0n;6+r[14;cn] mod 14] from t; + t:select time,action:0+((0^buy_SD_CIRCLE*buy_SD_SIZE)+(0^hedger_buy_SD_TRIANGLE*hedger_buy_SD_SIZE))- + ((0^sell_SD_CIRCLE*sell_SD_SIZE)+(0^hedger_sell_SD_TRIANGLE*hedger_sell_SD_SIZE)) from t; + update ulimit:150,dlimit:-150,position:sums action from t}[.z.t] + +``` + + +## Example BabelDB + +```sql showcodeonly +query_data('TIME,BID,ASK,BUY_SD_TRIANGLE,BUY_SD_SIZE,SELL_SD_TRIANGLE,SELL_SD_SIZE,HEDGER_BUY_SD_CIRCLE,HEDGER_BUY_SD_SIZE,HEDGER_SELL_SD_CIRCLE,HEDGER_SELL_SD_SIZE +2024-04-16 09:20:16.170,439.39,441.415,,,,,,,, +2024-04-16 09:20:17.171,437.7425,440.673,,,,,,,, +2024-04-16 09:20:17.175,435.009,435.537,,,,,,,, +2024-04-16 09:20:18.176,431.2073,432.236,410.51,6.6,,,,,, +2024-04-16 09:20:18.180,427.964,431.17,,,,,,, +2024-04-16 09:20:19.182,428.50,431.074,,,,,,,, +2024-04-16 09:20:19.184,429.575,433.14,,,,,,,, +2024-04-16 09:20:20.185,428.503,430.38,,,,,,,, +2024-04-16 09:20:20.187,429.032,430.833,426.22,13.28,,,,,, +2024-04-16 09:20:21.188,432.794,435.99,,,,,,, +2024-04-16 09:20:21.190,437.116,439.39,,,,,,,, +2024-04-16 09:20:22.192,440.941,445.137,,,,,,,, +2024-04-16 09:20:22.196,439.29,440.084,,,,,431.56956776713156,7.96,, +2024-04-16 09:20:23.198,438.194,439.284,,,,,,,, +2024-04-16 09:20:23.200,434.3515,435.40,,,,,,,, +2024-04-16 09:20:24.201,436.52,440.67,,,,,,,, +2024-04-16 09:20:24.203,434.3485,437.43,,,,,,,,') +``` diff --git a/notebook-examples/sqlnotebook-docs/pages/Components/grid.md b/notebook-examples/sqlnotebook-docs/pages/Components/grid.md new file mode 100644 index 0000000..e89ce4b --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/Components/grid.md @@ -0,0 +1,234 @@ +# Grid Component + +Both the ``grid`` and the ``table`` can display tabular data within notebooks. +The grid is useful when showing data with a large number of rows as it has a fixed height and allows paging. +The table is useful for small tables as it displays all rows as a full size HTML table. It is easier styled for printing. + +```sql server='c:\temp\duckdb.duckdb' type='grid' +SELECT time, status, instrument, symbol_SD_TAG, price_SD_CURUSD, bid, bid_SD_BG, bid_SD_CODE, percent_SD_PERCENT0, percbar_SD_DATABAR, bid_SD_FG FROM quotes ORDER BY time ASC +``` + +You can either configure: + + 1. The appearance of a **column** adding an _SD_FORMATTER at the end of the column name. + 2. The appearance of a **row** by adding specially named columns, similar to the existing. + 3. By setting grid options. + +# Simple Table + +```` +```sql server='c:\temp\duckdb.duckdb' type='grid' +SELECT Country, Population, GDP, GDPperCapita, exports, exportsPerCapita FROM country_stats_scatter +``` +```` + +```sql server='c:\temp\duckdb.duckdb' type='grid' +SELECT Country, Population, GDP, GDPperCapita, exports, exportsPerCapita FROM country_stats_scatter +``` + +## Grid Configuration Options + +| Flag | Settings | Description | +| -------- | ------- | ------- | +| pager | 'none', 'all' or a number | The number of rows shown on each page. | +| autosizeColumns | true or false | Expand the columns to fill the table width. | +| height | '150px', '50%' or any valid CSS value | The height of the grid shown. | +| showFilters | true or false | Show data filters at the top of the grid. | + +```` +```sql type='grid' pager='none' autosizeColumns={false} height="240px" showFilters={true} +FROM bank_failures +``` +```` + +```sql server='c:\temp\duckdb.duckdb' type='grid' pager='none' autosizeColumns={false} height="240px" showFilters={true} +FROM bank_failures +``` + +# Column Formatters + +Below is our per column formatters, by naming a column with the postfix on the end, you can select the formatter: + +```` +```sql server='c:\temp\duckdb.duckdb' type='grid' +SELECT Country AS Country_SD_TAG, Population AS Population_SD_NUMBER0, GDP AS GDP_SD_CURGBP, + GDPperCapita, exports, exportsPerCapita AS exportsPerCapita_SD_PERCENT0 + FROM country_stats_scatter +``` +```` + +```sql server='c:\temp\duckdb.duckdb' type='grid' +SELECT Country AS Country_SD_TAG, Population AS Population_SD_NUMBER0, GDP AS GDP_SD_CURGBP, + GDPperCapita, exports, exportsPerCapita AS exportsPerCapita_SD_PERCENT0 + FROM country_stats_scatter +``` + +## Formatter Postfixes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AreaExampleColumn Name PostfixOptionsDescription
Numbers0.11_SD_NUMBER00-9 Decimal places shownDisplay as a number with thousand separators and decimal places.
Percentages50%_SD_PERCENT00-9 Decimal places shownDisplay as a percentage % with thousand separators and decimal places.
Currencies$1,000.01_SD_CURUSDUSD/GBP/CCY where CCY is an ISO 4217 currency code. Display an amount in a given currency. Always showing decimal places as appropriate.
Coloured TagsLondon_SD_TAGNo options.Highlight the text with a randomly selected color based on the text. So that the same text generates the same color. + For more custom highlighting use raw html.
Status FlagsDone_SD_STATUSNo options.Highlight the text with an appropriate color based on the text content assuming the text represents a task. e.g. +
    +
  • Blue = new, open, created, ready, starting
  • +
  • Amber = runnable, waiting, partial, blocked, flagged, suspended, paused, stopping
  • +
  • Red = removed, cancelled, rejected, stopped
  • +
  • Green = terminated, resolved, closed, done, complete, filled, running
  • +
+For more custom highlighting use raw html. +
HTML_SD_HTMLDisplay the column content exactly as-is, rendering any HTML tags.
Databars██████████_SD_DATABAR Given a value between 0-1 i.e. a ratio or percent, draw it as a bar with size proportional to percentage.
Play Soundalarm_SD_SOUNDNo options.Play a sound or read the text out loud. +
    +
  • Pre-installed sounds include: alarm, bell, buzzer, kaching, sheep, siren, stockbell, trumpet, uhoh.
  • +
  • URLs beginning with http will be played if possible. e.g. https://www.timestored.com/files/goodresult.mp3
  • +
  • Text will be read out loud using the system Text To Speech
  • +
+For more information see raw html. +
+ + +# Sparklines + +```sql server='localhost:5000' type='grid' height='150px' +select v,vl_sd_sparkline:v , vb_sd_sparkbar:v , + vd_sd_sparkdiscrete:v , vbl_sd_sparkbullet:v , + vpie_sd_sparkpie:v , vbox_sd_sparkboxplot:v from + ([] a:1 2 3; v:(asc 9?1 2 3 1 9 8 7 3 -10 -28 7 3 -10 -2; 15?4 27 34 52 54 59 -4 -30 -45 52 54 59 61 68 78 82 85 87 91 93 100 ;6 6 6 6 6 -6 2 2 0)) +``` + +#### Kdb Sparklines Example Code + +```sql showcodeonly +select v,vl_sd_sparkline:v , vb_sd_sparkbar:v , + vd_sd_sparkdiscrete:v , vbl_sd_sparkbullet:v , + vpie_sd_sparkpie:v , vbox_sd_sparkboxplot:v from + ([] a:1 2 3; v:(asc 9?1 2 3 1 9 8 7 3 -10 -28 7 3 -10 -2; 15?4 27 34 52 54 59 -4 -30 -45 52 54 59 61 68 78 82 85 87 91 93 100 ;6 6 6 6 6 -6 2 2 0)) +``` + +#### H2 Database Sparklines Example SQL + +```sql showcodeonly +/* DROP table foo; */ +create table foo ( + id identity not null primary key, + nums array +); + +INSERT INTO FOO (id, nums) VALUES (1, ARRAY [1,2,3,2,-5,-6,3,1,2,5]); +INSERT INTO FOO (id, nums) VALUES (2, (4,5,6,8,9,14,18,25,10,0,-3)); +SELECT ID,NUMS AS N_SD_SPARKLINE FROM FOO; +``` + + +# Highlighting and Formatting by Row: + +**Highlighting and styling relies on having an additional column named similarly to the column you want to affect.** +For example to style a column called **itemPrice**, you could add an additional column called **itemPrice_SD_CURUSD** to show the price as a currency in US Dollars. +This allows you to customize the foreground/background and style per row. + +![Row Highlighting](https://www.timestored.com/pulse/help/img/table-example-pulse-highlight-rows.png) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AreaColumn Name PostfixExample ValueDescription
Background Color_SD_BG#FF0000Set the background colour of the original column. +
HTML Colors can be specified as names or values.
Foreground Color_SD_FG#FF0000Set the foreground colour of the original column. +
HTML Colors can be specified as names or values.
CSS Style Name(s)_SD_CLASSsd_cell_red sd_cell_greenSet the CSS class of the original column.
Format Code_SD_CODE0.xXXx 0.xxXX 0.xXXConfigure the number of decimal places displayed AND which of the digits are shown larger. This is useful for emphasising basis points for FX currencies etc.
\ No newline at end of file diff --git a/notebook-examples/sqlnotebook-docs/pages/Components/table.md b/notebook-examples/sqlnotebook-docs/pages/Components/table.md new file mode 100644 index 0000000..a4d474d --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/Components/table.md @@ -0,0 +1,219 @@ +# Table Component + +Both the ``table`` and the ``grid`` can display tabular data within notebooks. +The table is useful for small tables as it displays all rows as a full size HTML table. It is easier styled for printing. +The grid is useful when showing data with a large number of rows as it has a fixed height and allows paging. + + +```sql server='c:\temp\duckdb.duckdb' type='table' +SELECT time, status, instrument, symbol_SD_TAG, price_SD_CURUSD, bid, bid_SD_BG, bid_SD_CODE, percent_SD_PERCENT0, percbar_SD_DATABAR, bid_SD_FG FROM quotes ORDER BY time ASC LIMIT 10 +``` + +You can either configure: + + 1. The appearance of a **column** adding an _SD_FORMATTER at the end of the column name. + 2. The appearance of a **row** by adding specially named columns, similar to the existing. + 3. By setting grid options. + +# Simple Table + +```` +```sql server='c:\temp\duckdb.duckdb' type='table' +SELECT Country, Population, GDP, GDPperCapita, exports, exportsPerCapita FROM country_stats_scatter +``` +```` + +```sql server='c:\temp\duckdb.duckdb' type='table' +SELECT Country, Population, GDP, GDPperCapita, exports, exportsPerCapita FROM country_stats_scatter +``` + +# Column Formatters + +Below is our per column formatters, by naming a column with the postfix on the end, you can select the formatter: + +```` +```sql server='c:\temp\duckdb.duckdb' type='table' +SELECT Country AS Country_SD_TAG, Population AS Population_SD_NUMBER0, GDP AS GDP_SD_CURGBP, + GDPperCapita, exports, exportsPerCapita AS exportsPerCapita_SD_PERCENT0 + FROM country_stats_scatter +``` +```` + +```sql server='c:\temp\duckdb.duckdb' type='table' +SELECT Country AS Country_SD_TAG, Population AS Population_SD_NUMBER0, GDP AS GDP_SD_CURGBP, + GDPperCapita, exports, exportsPerCapita AS exportsPerCapita_SD_PERCENT0 + FROM country_stats_scatter +``` + +## Formatter Postfixes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AreaExampleColumn Name PostfixOptionsDescription
Numbers0.11_SD_NUMBER00-9 Decimal places shownDisplay as a number with thousand separators and decimal places.
Percentages50%_SD_PERCENT00-9 Decimal places shownDisplay as a percentage % with thousand separators and decimal places.
Currencies$1,000.01_SD_CURUSDUSD/GBP/CCY where CCY is an ISO 4217 currency code. Display an amount in a given currency. Always showing decimal places as appropriate.
Coloured TagsLondon_SD_TAGNo options.Highlight the text with a randomly selected color based on the text. So that the same text generates the same color. + For more custom highlighting use raw html.
Status FlagsDone_SD_STATUSNo options.Highlight the text with an appropriate color based on the text content assuming the text represents a task. e.g. +
    +
  • Blue = new, open, created, ready, starting
  • +
  • Amber = runnable, waiting, partial, blocked, flagged, suspended, paused, stopping
  • +
  • Red = removed, cancelled, rejected, stopped
  • +
  • Green = terminated, resolved, closed, done, complete, filled, running
  • +
+For more custom highlighting use raw html. +
HTML_SD_HTMLDisplay the column content exactly as-is, rendering any HTML tags.
Databars██████████_SD_DATABAR Given a value between 0-1 i.e. a ratio or percent, draw it as a bar with size proportional to percentage.
Play Soundalarm_SD_SOUNDNo options.Play a sound or read the text out loud. +
    +
  • Pre-installed sounds include: alarm, bell, buzzer, kaching, sheep, siren, stockbell, trumpet, uhoh.
  • +
  • URLs beginning with http will be played if possible. e.g. https://www.timestored.com/files/goodresult.mp3
  • +
  • Text will be read out loud using the system Text To Speech
  • +
+For more information see raw html. +
+ + +# Sparklines + +```sql server='localhost:5000' type='table' height='150px' +select v,vl_sd_sparkline:v , vb_sd_sparkbar:v , + vd_sd_sparkdiscrete:v , vbl_sd_sparkbullet:v , + vpie_sd_sparkpie:v , vbox_sd_sparkboxplot:v from + ([] a:1 2 3; v:(asc 9?1 2 3 1 9 8 7 3 -10 -28 7 3 -10 -2; 15?4 27 34 52 54 59 -4 -30 -45 52 54 59 61 68 78 82 85 87 91 93 100 ;6 6 6 6 6 -6 2 2 0)) +``` + +#### Kdb Sparklines Example Code + +```sql showcodeonly +select v,vl_sd_sparkline:v , vb_sd_sparkbar:v , + vd_sd_sparkdiscrete:v , vbl_sd_sparkbullet:v , + vpie_sd_sparkpie:v , vbox_sd_sparkboxplot:v from + ([] a:1 2 3; v:(asc 9?1 2 3 1 9 8 7 3 -10 -28 7 3 -10 -2; 15?4 27 34 52 54 59 -4 -30 -45 52 54 59 61 68 78 82 85 87 91 93 100 ;6 6 6 6 6 -6 2 2 0)) +``` + +#### H2 Database Sparklines Example SQL + +```sql showcodeonly +/* DROP table foo; */ +create table foo ( + id identity not null primary key, + nums array +); + +INSERT INTO FOO (id, nums) VALUES (1, ARRAY [1,2,3,2,-5,-6,3,1,2,5]); +INSERT INTO FOO (id, nums) VALUES (2, (4,5,6,8,9,14,18,25,10,0,-3)); +SELECT ID,NUMS AS N_SD_SPARKLINE FROM FOO; +``` + + +# Highlighting and Formatting by Row: + +**Highlighting and styling relies on having an additional column named similarly to the column you want to affect.** +For example to style a column called **itemPrice**, you could add an additional column called **itemPrice_SD_CURUSD** to show the price as a currency in US Dollars. +This allows you to customize the foreground/background and style per row. + + +```sql server='c:\temp\duckdb.duckdb' type='table' +FROM quotes LIMIT 10 +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AreaColumn Name PostfixExample ValueDescription
Background Color_SD_BG#FF0000Set the background colour of the original column. +
HTML Colors can be specified as names or values.
Foreground Color_SD_FG#FF0000Set the foreground colour of the original column. +
HTML Colors can be specified as names or values.
CSS Style Name(s)_SD_CLASSsd_cell_red sd_cell_greenSet the CSS class of the original column.
Format Code_SD_CODE0.xXXx 0.xxXX 0.xXXConfigure the number of decimal places displayed AND which of the digits are shown larger. This is useful for emphasising basis points for FX currencies etc.
\ No newline at end of file diff --git a/notebook-examples/sqlnotebook-docs/pages/Data Sources.md b/notebook-examples/sqlnotebook-docs/pages/Data Sources.md new file mode 100644 index 0000000..acb4797 --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/Data Sources.md @@ -0,0 +1,89 @@ +# Data Sources + +SQLNotebooks supports any database with a JDBC driver, this includes kdb, postgresql, mysql, ms sql, clickhouse and [30+ databases](https://www.timestored.com/qstudio/database/). +Once a connection is created it can be used within all notebooks. + +## Supported Databases + +The driver for these databases are built into the qStudio download. + + + + + + + + + + + + + + + + + + +
kdb+
mySQL
QuestDB
PostgreSQL
Redis
TimeScale
Microsoft SQL Server
H2 Database
DuckDB
Oracle
+ + + +The driver for the below databases should automatically download on first usage. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TDengine
DolphinDB
Clickhouse
MongoDB
Druid
InfluxDB
starrocks database
StarRocks
Redshift
HSQLDB
SQLite
CSV
MS Access
JDBC
apache doris
Apache Doris
Apache Calcite Avatica
Snowflake
Elastic Search
MariaDB
Apache Kylin
DB2
SingleStore
SingleStore
Teradata
CrateDB
NuoDB
SAP HANA
Gemfire XD
Snappy Data Tibco
DataBend
DataBend
Spark Hive
Kyubi Hive
Yandex Clickhouse
Derby
Presto
Trino
Volt
Volt Active Data
Apache Solr
Apache Ignite
Omnisci
Informix
Sqream
Aurora
\ No newline at end of file diff --git a/notebook-examples/sqlnotebook-docs/pages/Database Demos/babeldb.md b/notebook-examples/sqlnotebook-docs/pages/Database Demos/babeldb.md new file mode 100644 index 0000000..000d030 --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/Database Demos/babeldb.md @@ -0,0 +1,499 @@ +# BabelDB + +## Query everything in one place. + +Combine queries between any JDBC compatible database or JSON/CSV/HTML data sources +For videos and more help information see [BabelDB docs](https://www.timestored.com/pulse/help/babeldb). + +# Query_web( REST/CSV/HTML ) +To query JSON/CSV/HTML based tables use query_web and BabelDB will automatically detect the format and return a table: + +```sql showcodeonly +select * from query_web('https://api3.binance.com/api/v3/ticker/price'); +query_web('https://api.github.com/search/repositories?q=more+useful+keyboard') +query_web('https://www.iso20022.org/sites/default/files/ISO10383_MIC/ISO10383_MIC.csv') +query_web('https://en.wikipedia.org/wiki/List_of_bank_failures_in_the_United_States_(2008%E2%80%93present)') +https://fred.stlouisfed.org/graph/fredgraph.csv?id=MORTGAGE30US +``` + +```sql type='treemap' server='QDUCKDB' +select Bank,"Assets ($mil.)" as Millions from query_web('https://en.wikipedia.org/wiki/List_of_bank_failures_in_the_United_States_(2008%E2%80%93present)') +``` + +# Query_data( hardcoded JSON/CSV ) + +```sql showcodeonly +query_data('Date,val +2001-01-07,88 +2001-01-08,99 +2001-01-09,55 +2001-01-10,66 +2001-01-11,70 +2001-01-12,75 +') +``` + + +## Search Trends 2024 + + +```sql server='QDUCKDB' type='timeseries' overrideJson={{grid:{top:50}}} +query_data('Week Matthew Perry chandrayaan-3 titanic submarine hurricane lee maine shooting nashville shooting Tina Turner Ken Block Lil Tay Jerry Springer Angus Cloud Nicola Bulley Jason Aldean Joe Jonas Smash Mouth Matthew Perry_SD_MARKPOINT chandrayaan-3_SD_MARKPOINT titanic submarine_SD_MARKPOINT hurricane lee_SD_MARKPOINT maine shooting_SD_MARKPOINT nashville shooting_SD_MARKPOINT Tina Turner_SD_MARKPOINT Ken Block_SD_MARKPOINT Lil Tay_SD_MARKPOINT Jerry Springer_SD_MARKPOINT Angus Cloud_SD_MARKPOINT +01/01/2023 0 0 0 0 0 0 1 32 0 0 0 0 0 0 0 Ken Block +01/08/2023 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 +01/15/2023 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 +01/22/2023 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 +01/29/2023 0 0 0 0 0 0 1 0 0 0 0 4 0 0 0 +02/05/2023 0 0 0 0 0 0 1 0 0 0 0 14 0 0 0 +02/12/2023 0 0 0 0 0 0 1 0 0 0 0 12 1 0 0 +02/19/2023 0 0 0 0 0 0 1 0 0 0 0 17 0 0 0 +02/26/2023 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 +03/05/2023 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 +03/12/2023 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 +03/19/2023 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 +03/26/2023 0 0 0 0 0 38 1 0 0 0 0 0 0 0 0 nashville shooting +04/02/2023 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 +04/09/2023 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 +04/16/2023 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +04/23/2023 0 0 0 0 0 0 0 0 0 44 0 0 0 0 0 Jerry Springer +04/30/2023 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 +05/07/2023 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 +05/14/2023 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 +05/21/2023 0 0 0 0 0 0 56 0 0 1 0 0 0 0 0 Tina Turner +05/28/2023 0 0 0 0 0 0 7 0 0 1 0 0 0 0 0 +06/04/2023 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 +06/11/2023 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 +06/18/2023 0 0 73 0 0 0 1 0 0 0 0 0 0 0 0 titanic submarine +06/25/2023 0 0 6 0 0 0 1 0 0 1 0 1 0 0 0 +07/02/2023 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 +07/09/2023 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 +07/16/2023 0 1 0 0 0 0 1 0 0 0 0 0 19 0 0 +07/23/2023 0 0 0 0 0 0 1 0 0 0 0 0 14 0 0 +07/30/2023 0 1 0 0 0 0 1 0 0 0 69 0 3 0 0 Angus Cloud +08/06/2023 0 2 0 0 0 0 1 0 40 0 3 0 2 0 0 Lil Tay +08/13/2023 0 2 0 0 0 0 1 0 2 0 1 0 1 1 0 +08/20/2023 0 100 0 0 0 0 1 0 1 0 0 0 1 0 0 chandrayaan-3 +08/27/2023 0 6 0 0 0 0 0 0 0 0 0 0 1 0 0 +09/03/2023 0 3 0 17 0 0 0 0 0 0 0 0 1 14 12 17 +09/10/2023 0 2 0 24 0 0 0 0 0 0 0 0 1 3 1 hurricane lee +09/17/2023 0 2 0 2 0 0 0 0 0 0 2 0 1 3 0 +09/24/2023 0 2 0 0 0 0 0 0 1 0 1 0 1 2 0 +10/01/2023 0 1 0 0 0 0 1 0 6 0 0 0 1 1 0 +10/08/2023 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 +10/15/2023 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 +10/22/2023 0 1 0 0 29 0 0 0 0 0 0 0 0 0 0 maine shooting +10/29/2023 100 0 0 0 2 0 1 0 0 0 0 0 0 0 0 Matthew Perry +11/05/2023 7 0 0 0 0 0 1 0 0 0 0 0 0 1 0 +11/12/2023 3 0 0 0 0 0 1 0 0 0 0 0 0 0 0 +11/19/2023 2 0 0 0 0 0 1 0 0 0 0 0 0 0 0 +11/26/2023 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 +12/03/2023 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +') +``` + +# Population Trends + +## Niger Population + +```sql type='stack_horizontal' server='QDUCKDB' +/* https://www.census.gov/data-tools/demo/idb/ */ +select + Age, + CASE WHEN malesconfigured using column names. + +```sql type="grid" +SELECT * FROM quotes; +``` + +# Time-series - Gold vs Bitcoin 2024 + +```sql type="timeseries" +SELECT * FROM gold_vs_bitcoin +``` + + +## Search Trends 2024 + + +```sql server='QDUCKDB' type='timeseries' overrideJson={{grid:{top:50}}} +SELECT * FROM search_trends +``` + +# Population Trends + +## Niger Population + +```sql type='stack_horizontal' server='c:\temp\duckdb.duckdb' +/* https://www.census.gov/data-tools/demo/idb/ */ +select + Age, + CASE WHEN malesS2->S3->V + - The first numeric column reprents the size of the flow between nodes. + - Sizes are back-propagated to the top level. + - Null can be used to represent either gaps or allow assigning value to a node that is neither an inflow nor outflow. + + +```sql type="sankey" +SELECT * FROM sankey +``` + + +## Sunburst + + - Starting from the left each string column is taken as one nesting level + - The first numerical column will be taken as size. + + +```sql type="sunburst" +SELECT * FROM country_stats_scatter +``` + + +## Scatter + + + - Two or more numeric columns are required. + - The values in the first column are used for the X-axis. + - The values in following columns are used for the Y-axis. Each column is displayed with a separate color. + + +```sql type="scatter" +FROM country_stats_scatter +``` + +## bubble + + - The first string columns are used as category labels. + - There must then be 3 numeric columns which are used for x-coord, y-coord, size in that order. + +```sql type="bubble" +FROM country_stats_scatter +``` + +## Heatmap + + - Each numerical column in the table becomes one column in the chart. + - The numerical values represent the shading within the chart. + +```sql type="heatmap" +FROM country_stats_scatter +``` + +## Radar + + - A radar chart requires 3 or more numeric columns to render sensibly. + - Each numeric column represents one spoke in the radar. The column titles are used as spoke titles. + - Each row in the data represents one circle withing the radar. + +```sql type="radar" +FROM radar +``` + +## Calendar + + - The table should contain a date and atleast one numeric column. + - The first numeric column will be used as the value for that date. + - Dates should not be repeated. If they are the value selected is not guaranteed. + + +```sql type="calendar" height="500" +FROM calendar +``` + +## Boxplot + + - Each numerical column in the table becomes one boxplot item in the chart. + - The min/max/median/Q1/Q3 are calculated from the raw data. + - This is inefficient as a lot more data is being passed than needed but useful for toggling an existing data set view quickly. + +```sql type="boxplot" +SELECT * FROM boxplot +``` + +## Metrics + + - Two or more numeric columns are required. + - The values in the first column are used for the X-axis. + - The values in following columns are used for the Y-axis. Each column is displayed with a separate color. + + +```sql type="metrics" +SELECT * FROM metrics +``` + diff --git a/notebook-examples/sqlnotebook-docs/pages/Database Demos/kdb+ All.md b/notebook-examples/sqlnotebook-docs/pages/Database Demos/kdb+ All.md new file mode 100644 index 0000000..cd6416c --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/Database Demos/kdb+ All.md @@ -0,0 +1,267 @@ +# kdb+ SqlNotebooks + +QStudio has particularly strong support for kdb+. +Examples of in-memory queries using kdb+ for every chart type are shown below. + +# Latest Trade Prices + +```sql type="grid" server="localhost:5000" +update percbar_SD_DATABAR:percent_SD_PERCENT0 ,bid_SD_FG:((`$("#FF6666";"#66FF66";""))!`$("#222";"#222";"")) bid_SD_BG from + ([] time:.z.t-til 50; + status:50?`partial`filled; + instrument:50?`GBPUSD`USDNZD`USDCAD`CHFJPY`EURUSD; + symbol_SD_TAG:50?`UBS`C`MS`HSBC`NOMURA`DB; + price_SD_CURUSD:50?100.0; + bid:50?20.0; + bid_SD_BG:50?`$("#FF6666";"";"";"";"";"";"";"";"";"";"";"";"";"#66FF66"); + bid_SD_CODE:50?("0.xXXx";"0.XXx";"0.xxXX"); + percent_SD_PERCENT0:50?1.0 ) +``` + +# Gold vs Bitcoin 2024 + +```sql type="timeseries" server="localhost:5000" +{ walk:{ [seed;n] + r:{{ abs ((1664525*x)+1013904223) mod 4294967296}\[y-1;x]}; + prds (100+((r[seed;n]) mod 11)-5)%100}; + c:{x mod `long$00:20:00.0t}x; st:x-c; cn:`long$c%1000; + ([] time:.z.d+st+1000*til cn; gold:walk[100;cn]; bitcoin:walk[2;cn]) }[.z.t] +``` + +## Candlestick Chart + + +- The table should contain columns labelled open/high/low/close/volume. +- The table must atleast contain high/low or open/close to allow it to be drawn. + + +```sql type="candle" server="localhost:5000" +{ r:{{ abs ((1664525*x)+1013904223) mod 4294967296}\[y-1;x]}; + walk:{ [r;seed;n] prds (100+((r[seed;n]) mod 11)-5)%100}[r;;]; + c:{x mod `long$00:05:00.0t}x; st:x-c; cn:100+`long$c%1000; + t:([] time:`second$.z.d+st+1000*til cn; open:walk[9;cn]; close:walk[105;cn]); + -100 sublist update low:?[open > close;close;open]-(r[11;cn] mod 11)*0.02,high:?[open < close;close;open]+(r[44;cn] mod 11)*0.02,volume:(r[44;cn] mod 110) from t}[.z.t] +``` + +# Bar + +- The first string columns are used as category labels. +- Whatever numeric columns appear after the strings represents a separate series in the chart. + +```sql type="bar" server="localhost:5000" +([] Company:`Microsoft`Oracle`Paypal`Monero`FXC`Braint`MS`UBS; + PnL:(0.8+rand[0.2])*31847.0 13239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0; + Revenue:(0.9+rand[0.1])*15080.0 11300.0 34444.0 3114.0 2228.0 88.9 1113.0 41196.0 ; + Negatives:(0.95+rand[0.05])*48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 11732.0 ) +``` + +# Bar Horizontal + +```sql type="bar_horizontal" server="localhost:5000" +([] Company:`Microsoft`Oracle`Paypal`Monero`FXC`Braint`MS`UBS; + PnL:(0.8+rand[0.2])*31847.0 13239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0; + Revenue:(0.9+rand[0.1])*15080.0 11300.0 34444.0 3114.0 2228.0 88.9 1113.0 41196.0 ; + Negatives:(0.95+rand[0.05])*48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 11732.0 ) +``` + +# Stack + +- The first string columns are used as category labels. +- Whatever numeric columns appear after the strings represents a separate series in the chart. + +```sql type="stack" server="localhost:5000" +([] Company:`Microsoft`Oracle`Paypal`Monero`FXC`Braint`MS`UBS; + PnL:(0.8+rand[0.2])*31847.0 13239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0; + Revenue:(0.9+rand[0.1])*15080.0 11300.0 34444.0 3114.0 2228.0 88.9 1113.0 41196.0 ; + Negatives:(0.95+rand[0.05])*48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 11732.0 ) +``` + +# Bar Horizontal + +```sql type="stack_horizontal" server="localhost:5000" +([] Company:`Microsoft`Oracle`Paypal`Monero`FXC`Braint`MS`UBS; + PnL:(0.8+rand[0.2])*31847.0 13239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0; + Revenue:(0.9+rand[0.1])*15080.0 11300.0 34444.0 3114.0 2228.0 88.9 1113.0 41196.0 ; + Negatives:(0.95+rand[0.05])*48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 11732.0 ) +``` + +# Line + +- The first string columns are used as category labels. +- Whatever numeric columns appear after the strings represents a separate series in the chart. + +```sql type="line" server="localhost:5000" +([] Company:`Microsoft`Oracle`Paypal`Monero`FXC`Braint`MS`UBS; + PnL:(0.8+rand[0.2])*31847.0 13239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0; + Revenue:(0.9+rand[0.1])*15080.0 11300.0 34444.0 3114.0 2228.0 88.9 1113.0 41196.0 ; + Negatives:(0.95+rand[0.05])*48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 11732.0 ) +``` + + +# Area + +- The first string columns are used as category labels. +- Whatever numeric columns appear after the strings represents a separate series in the chart. + +```sql type="area" server="localhost:5000" +([] Company:`Microsoft`Oracle`Paypal`Monero`FXC`Braint`MS`UBS; + PnL:(0.8+rand[0.2])*31847.0 13239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0; + Revenue:(0.9+rand[0.1])*15080.0 11300.0 34444.0 3114.0 2228.0 88.9 1113.0 41196.0 ; + Negatives:(0.95+rand[0.05])*48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 11732.0 ) +``` + +# Pie + + - Each numeric column represents one pie chart. The title of each pie chart will be the column title. + - The segments of the pie chart use the string columns as a title where possible. If there are no string columns, row numbers are used. + +```sql type="pie" server="localhost:5000" +([] Company:`Microsoft`Oracle`Paypal`Monero`FXC`Braint`MS`UBS; + PnL:(0.8+rand[0.2])*31847.0 13239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0; + Revenue:(0.9+rand[0.1])*15080.0 11300.0 34444.0 3114.0 2228.0 88.9 1113.0 41196.0 ; + Negatives:(0.95+rand[0.05])*48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 11732.0 ) +``` + +# Hierarchical + +## Tree + + - Starting from the left each string column is taken as one nesting level + - The first numerical column will be taken as size. + +```sql type="tree" server="localhost:5000" +([] Continent:`NA`Asia`Asia`Europe`Asia`Europe`Europe`SA`Europe`NA`Europe`Asia`Australia`Europe`NA; + TradingBloc:`US`China`Japan`EU`India`UK`EU`Brazil`EU`US`Russia`SouthKorea`Australia`EU`US; + Country:`US`China`Japan`Germany`India`UK`France`Brazil`Italy`Canada`Russia`SouthKorea`Australia`Spain`Mexico; + GDP:19.485 12.238 4.872 3.693 2.651 2.638 2.583 2.054 1.944 1.647 1.578 1.531 1.323 1.314 1.151 ) +``` + + +## TreeMap + + - Starting from the left each string column is taken as one nesting level + - The first numerical column will be taken as size. + +```sql type="treemap" server="localhost:5000" +update exports:(0.1+9?0.1)*GDP, exportsPerCapita:(0.4+9?0.1)*GDPperCapita from + ([] Country:`US`France`japan`Germany`UK`Zimbabwe`Bangladesh`Nigeria`Vietnam; + Population:(0.9+9?0.2)*313847.0 213847.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0 87840.0 ; + GDP:(0.9+9?0.2)*15080.0 3333. 4444.0 3114.0 2228.0 9.9 113.0 196.0 104.0 ; + GDPperCapita:(0.9+9?0.2)*0.001*48300.0 37000 34700.0 38100.0 36500.0 413.0 1788.0 732.0 3359.0) +``` + + +## Sankey + + - Assuming string columns named S1,S2,S3 with a numeric column of value V. + - Each row represents one flow from the top level S1 to the leaf node S3. S1->S2->S3->V + - The first numeric column reprents the size of the flow between nodes. + - Sizes are back-propagated to the top level. + - Null can be used to represent either gaps or allow assigning value to a node that is neither an inflow nor outflow. + + +```sql type="sankey" server="localhost:5000" +([] OrderOrigin:`Internal`GUI`Web`Platform`Internal`GUI`Web`Platform`Internal`GUI`Web`Platform; + Exchange:`ICE`ICE`ICE`NYSE`NYSE`NYSE`LDN`LDN`LDN`CBE`CBE`CBE; + State:12?`New`Partial`Filled`Filled`Filled`; + v:12?20) +``` + + +## Sunburst + + - Starting from the left each string column is taken as one nesting level + - The first numerical column will be taken as size. + + +```sql type="sunburst" server="localhost:5000" +([] Continent:`NA`Asia`Asia`Europe`Asia`Europe`Europe`SA`Europe`NA`Europe`Asia`Australia`Europe`NA; + TradingBloc:`US`China`Japan`EU`India`UK`EU`Brazil`EU`US`Russia`SouthKorea`Australia`EU`US; + Country:`US`China`Japan`Germany`India`UK`France`Brazil`Italy`Canada`Russia`SouthKorea`Australia`Spain`Mexico; + GDP:19.485 12.238 4.872 3.693 2.651 2.638 2.583 2.054 1.944 1.647 1.578 1.531 1.323 1.314 1.151 ) +``` + + +## Scatter + + + - Two or more numeric columns are required. + - The values in the first column are used for the X-axis. + - The values in following columns are used for the Y-axis. Each column is displayed with a separate color. + + +```sql type="scatter" server="localhost:5000" +update exports:(0.1+9?0.1)*GDP, exportsPerCapita:(0.4+9?0.1)*GDPperCapita from + ([] Country:`US`France`japan`Germany`UK`Zimbabwe`Bangladesh`Nigeria`Vietnam; + Population:(0.9+9?0.2)*313847.0 213847.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0 87840.0 ; + GDP:(0.9+9?0.2)*15080.0 3333. 4444.0 3114.0 2228.0 9.9 113.0 196.0 104.0 ; + GDPperCapita:(0.9+9?0.2)*0.001*48300.0 37000 34700.0 38100.0 36500.0 413.0 1788.0 732.0 3359.0) +``` + +## bubble + + - The first string columns are used as category labels. + - There must then be 3 numeric columns which are used for x-coord, y-coord, size in that order. + +```sql type="bubble" server="localhost:5000" +update exports:(0.1+9?0.1)*GDP, exportsPerCapita:(0.4+9?0.1)*GDPperCapita from + ([] Country:`US`France`japan`Germany`UK`Zimbabwe`Bangladesh`Nigeria`Vietnam; + Population:(0.9+9?0.2)*313847.0 213847.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0 87840.0 ; + GDP:(0.9+9?0.2)*15080.0 3333. 4444.0 3114.0 2228.0 9.9 113.0 196.0 104.0 ; + GDPperCapita:(0.9+9?0.2)*0.001*48300.0 37000 34700.0 38100.0 36500.0 413.0 1788.0 732.0 3359.0) +``` + +## Heatmap + + - Each numerical column in the table becomes one column in the chart. + - The numerical values represent the shading within the chart. + +```sql type="heatmap" server="localhost:5000" +update exports:(0.1+9?0.1)*GDP, exportsPerCapita:(0.4+9?0.1)*GDPperCapita from + ([] Country:`US`France`japan`Germany`UK`Zimbabwe`Bangladesh`Nigeria`Vietnam; + Population:(0.9+9?0.2)*313847.0 213847.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0 87840.0 ; + GDP:(0.9+9?0.2)*15080.0 3333. 4444.0 3114.0 2228.0 9.9 113.0 196.0 104.0 ; + GDPperCapita:(0.9+9?0.2)*0.001*48300.0 37000 34700.0 38100.0 36500.0 413.0 1788.0 732.0 3359.0) +``` + +## Radar + + - A radar chart requires 3 or more numeric columns to render sensibly. + - Each numeric column represents one spoke in the radar. The column titles are used as spoke titles. + - Each row in the data represents one circle withing the radar. + +```sql type="radar" server="localhost:5000" +([] portfolio:`threadneedle`diamonte; agri:100 10; realEstate:100 10; tech:0 80; growthPotential:50 100; finance:60 20) +``` + +## Calendar + + - The table should contain a date and atleast one numeric column. + - The first numeric column will be used as the value for that date. + - Dates should not be repeated. If they are the value selected is not guaranteed. + + +```sql type="calendar" server="localhost:5000" +([] dt:2023.12.31 - til 730; v:(asc 730?50)+(730?50)+730#90 80 72 83 40 2 3) +``` + +## Boxplot + + - Each numerical column in the table becomes one boxplot item in the chart. + - The min/max/median/Q1/Q3 are calculated from the raw data. + - This is inefficient as a lot more data is being passed than needed but useful for toggling an existing data set view quickly. + +```sql type="boxplot" server="localhost:5000" +([] gold:10?10; silver:til 10; crude:desc til 10; slick:13-til 10; copper:10?3; iron:10?8; diamond:4+10?8; rubber:6+10?10; lead:8+10?12) +``` + +## Metrics + + - Two or more numeric columns are required. + - The values in the first column are used for the X-axis. + - The values in following columns are used for the Y-axis. Each column is displayed with a separate color. + + +```sql type="metrics" server="localhost:5000" +([] gold:10?10; silver:til 10; crude:desc til 10; slick:13-til 10) +``` diff --git a/notebook-examples/sqlnotebook-docs/pages/Database Demos/kdb+ Simple.md b/notebook-examples/sqlnotebook-docs/pages/Database Demos/kdb+ Simple.md new file mode 100644 index 0000000..612d048 --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/Database Demos/kdb+ Simple.md @@ -0,0 +1,135 @@ +# kdb+ SqlNotebooks - Simple Examples + +SqlNotebooks have particularly strong support for kdb+. +Examples of in-memory queries using kdb+ for most chart types are shown below. + +## Example Time Series Charts + +```sql type="timeseries" server="localhost:5000" +([] dt:2013.01.01+til 21; cosineWave:cos a; sineWave:sin a:0.6*til 21) +``` + +```sql type="timeseries" server="localhost:5000" +([] time:10:00t+60000*til 99; Position:0.4*a-mod[a;8]; Cost:a:100*sin 0.015*til 99) +``` + +## Bar / Stack + +```sql type="bar" server="localhost:5000" +([Month:2000.01m + til 12] + Costs:30.0 40.0 45.0 55.0 58.0 63.0 55.0 65.0 78.0 80.0 75.0 90.0 ; + Sales:10.0 12.0 14.0 18.0 26.0 42.0 74.0 90.0 110.0 130.0 155.0 167.0 ) +``` + +### Bar Horizontal + +```sql type="bar_horizontal" server="localhost:5000" +([Month:2000.01m + til 12] + Costs:30.0 40.0 45.0 55.0 58.0 63.0 55.0 65.0 78.0 80.0 75.0 90.0 ; + Sales:10.0 12.0 14.0 18.0 26.0 42.0 74.0 90.0 110.0 130.0 155.0 167.0 ) +``` + +### Stack + +```sql type="stack" server="localhost:5000" +([Month:2000.01m + til 12] + Costs:30.0 40.0 45.0 55.0 58.0 63.0 55.0 65.0 78.0 80.0 75.0 90.0 ; + Sales:10.0 12.0 14.0 18.0 26.0 42.0 74.0 90.0 110.0 130.0 155.0 167.0 ) +``` + +### Stack Horizontal + +```sql type="stack_horizontal" server="localhost:5000" +([Month:2000.01m + til 12] + Costs:30.0 40.0 45.0 55.0 58.0 63.0 55.0 65.0 78.0 80.0 75.0 90.0 ; + Sales:10.0 12.0 14.0 18.0 26.0 42.0 74.0 90.0 110.0 130.0 155.0 167.0 ) +``` + +### Multiple Bar Series + +```sql type="bar" server="localhost:5000" +([] Continent:`NorthAmerica`Asia`Asia`Europe`Europe`Africa`Asia`Africa`Asia; + Country:`US`China`japan`Germany`UK`Zimbabwe`Bangladesh`Nigeria`Vietnam; + Population:313847.0 1343239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0 87840.0 ; + GDP:15080.0 11300.0 4444.0 3114.0 2228.0 9.9 113.0 196.0 104.0 ; + GDPperCapita:48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 732.0 3359.0 ; + LifeExpectancy:77.14 72.22 80.93 78.42 78.16 39.01 61.33 51.01 70.05 ) +``` + +## Line / Area Chart + +### Line + +```sql type="line" server="localhost:5000" +([Month:2000.01m + til 12] + Costs:30.0 40.0 45.0 55.0 58.0 63.0 55.0 65.0 78.0 80.0 75.0 90.0 ; + Sales:10.0 12.0 14.0 18.0 26.0 42.0 74.0 90.0 110.0 130.0 155.0 167.0 ) +``` + +### Area + +```sql type="area" server="localhost:5000" +([Month:2000.01m + til 12] + Costs:30.0 40.0 45.0 55.0 58.0 63.0 55.0 65.0 78.0 80.0 75.0 90.0 ; + Sales:10.0 12.0 14.0 18.0 26.0 42.0 74.0 90.0 110.0 130.0 155.0 167.0 ) +``` + + +## Scatter + +```sql type="scatter" server="localhost:5000" +update GDPperCapita%20 from ([] Continent:`NorthAmerica`Asia`Asia`Europe`Europe`Africa`Asia`Africa`Asia; + Country:`US`China`japan`Germany`UK`Zimbabwe`Bangladesh`Nigeria`Vietnam; + Population:313847.0 1343239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0 87840.0 ; + GDP:15080.0 11300.0 4444.0 3114.0 2228.0 9.9 113.0 196.0 104.0 ; + GDPperCapita:48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 732.0 3359.0 ; + LifeExpectancy:77.14 72.22 80.93 78.42 78.16 39.01 61.33 51.01 70.05 ) +``` + +## Bubble Chart + +The first numeric column is x-axis, 2nd is y-axis, 3rd is bubble size. Strings are used as labels. + +```sql type="bubble" server="localhost:5000" +update exports:(0.1+9?0.1)*GDP, exportsPerCapita:(0.4+9?0.1)*GDPperCapita from + ([] Country:`US`France`japan`Germany`UK`Zimbabwe`Bangladesh`Nigeria`Vietnam; + Population:(0.9+9?0.2)*313847.0 213847.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0 87840.0 ; + GDP:(0.9+9?0.2)*15080.0 3333. 4444.0 3114.0 2228.0 9.9 113.0 196.0 104.0 ; + GDPperCapita:(0.9+9?0.2)*0.001*48300.0 37000 34700.0 38100.0 36500.0 413.0 1788.0 732.0 3359.0) +``` + +## Candlestick Chart + +```sql type="candle" server="localhost:5000" +([] t:09:00t+600000*til 22; high:c+30; low:c-20; open:60+til 22; close:c:55+2*til 22; volume:22#3 9 6) +``` + +## Heatmap + +```sql type="heatmap" server="localhost:5000" +([] Continent:`NorthAmerica`Asia`Asia`Europe`Europe`Africa`Asia`Africa`Asia; + Country:`US`China`japan`Germany`UK`Zimbabwe`Bangladesh`Nigeria`Vietnam; + Population:313847.0 1343239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0 87840.0 ; + GDP:15080.0 11300.0 4444.0 3114.0 2228.0 9.9 113.0 196.0 104.0 ; + GDPperCapita:48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 732.0 3359.0 ; + LifeExpectancy:77.14 72.22 80.93 78.42 78.16 39.01 61.33 51.01 70.05 ) +``` + +## PieChart +```sql type="pie" server="localhost:5000" +([] Country:`US`China`japan`Germany`UK`Zimbabwe`Bangladesh`Nigeria`Vietnam; + GDP:15080.0 11300.0 4444.0 3114.0 2228.0 9.9 113.0 196.0 104.0 ) +``` + +### Many Pies + +```sql type="pie" server="localhost:5000" +([] Continent:`NorthAmerica`Asia`Asia`Europe`Europe`Africa`Asia`Africa`Asia; + Country:`US`China`japan`Germany`UK`Zimbabwe`Bangladesh`Nigeria`Vietnam; + Population:313847.0 1343239.0 127938.0 81308.0 63047.0 13010.0 152518.0 166629.0 87840.0 ; + GDP:15080.0 11300.0 4444.0 3114.0 2228.0 9.9 113.0 196.0 104.0 ; + GDPperCapita:48300.0 8400.0 34700.0 38100.0 36500.0 413.0 1788.0 732.0 3359.0 ; + LifeExpectancy:77.14 72.22 80.93 78.42 78.16 39.01 61.33 51.01 70.05 ) +``` + + diff --git a/notebook-examples/sqlnotebook-docs/pages/concepts/Markdown Blocks.md b/notebook-examples/sqlnotebook-docs/pages/concepts/Markdown Blocks.md new file mode 100644 index 0000000..9e9566e --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/concepts/Markdown Blocks.md @@ -0,0 +1,113 @@ +# Markdown Support + +SqlNotebooks supports a wide range of markdown notation as shown below. + +# h1 Heading +## h2 Heading +### h3 Heading +#### h4 Heading +##### h5 Heading +###### h6 Heading + +## Emphasis + +**This is bold text** + +__This is bold text__ + +*This is italic text* + +_This is italic text_ + +~~Strikethrough~~ + + +## Horizontal Rules + +___ + +--- + +*** + + +## Blockquotes + + +> Blockquotes can also be nested... +>> ...by using additional greater-than signs right next to each other... +> > > ...or with spaces between arrows. + + +## Lists + +Unordered + ++ Create a list by starting a line with `+`, `-`, or `*` ++ Sub-lists are made by indenting 2 spaces: + - Marker character change forces new list start: + * Ac tristique libero volutpat at + + Facilisis in pretium nisl aliquet + - Nulla volutpat aliquam velit ++ Very easy! + +Ordered + +1. Lorem ipsum dolor sit amet +2. Consectetur adipiscing elit +3. Integer molestie lorem at massa + + +1. You can use sequential numbers... +1. ...or keep all the numbers as `1.` + +Start numbering with offset: + +57. foo +1. bar + + +## Code + +Inline `code` + +Indented code + + // Some comments + line 1 of code + line 2 of code + line 3 of code + +## Tables + +| Option | Description | +| ------ | ----------- | +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | + +Right aligned columns + +| Option | Description | +| ------:| -----------:| +| data | path to data files to supply the data that will be passed into templates. | +| engine | engine to be used for processing templates. Handlebars is the default. | +| ext | extension to be used for dest files. | + + +## Links + +[link text](https://github.com/timestored/) + +[link with title](https://github.com/timestored/ "title text!") + +Autoconverted link https://github.com/timestored/ + + +## Images + +![Logo](https://www.timestored.com/img/logo.png) + + +[![qStudio](https://www.timestored.com/img/logo-qstudio-text.png "The qStudio")](https://www.timestored.com/qstudio) + diff --git a/notebook-examples/sqlnotebook-docs/pages/concepts/Pages.md b/notebook-examples/sqlnotebook-docs/pages/concepts/Pages.md new file mode 100644 index 0000000..aebf846 --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/concepts/Pages.md @@ -0,0 +1,13 @@ +# Pages + +# QStudio + +Each markdown file within the root folder/pages becomes a page. +By default qStudio launches the webpage at: http://localhost:8088/ . +Pages can be nested within folders to any reasonable depth. + +For example: + + - ``pages/index.md`` would be accessible as ``http://localhost:8088/markdown/``. + - ``pages/company/pnl.md`` would be accessible as ``http://localhost:8088/markdown/pages/company/pnl``. + - ``pages/company/index.md`` would be accessible as ``http://localhost:8088/markdown/company``. \ No newline at end of file diff --git a/notebook-examples/sqlnotebook-docs/pages/concepts/Sql Blocks.md b/notebook-examples/sqlnotebook-docs/pages/concepts/Sql Blocks.md new file mode 100644 index 0000000..912dc4c --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/concepts/Sql Blocks.md @@ -0,0 +1,9 @@ +# SQL Blocks + +SQL markdown code blocks are used to perform queries and display results. + +```` +```sql type="timeseries" server="localhost:5000" +([] dt:2013.01.01+til 21; cosineWave:cos a; sineWave:sin a:0.6*til 21) +``` +```` \ No newline at end of file diff --git a/notebook-examples/sqlnotebook-docs/pages/concepts/index.md b/notebook-examples/sqlnotebook-docs/pages/concepts/index.md new file mode 100644 index 0000000..a653814 --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/concepts/index.md @@ -0,0 +1,12 @@ +# Concepts + +SQL Notebooks are a single markdown text document with additional support for SQL and no-code components that allow data teams to quickly build beautiful reports. +Blocks + +Notebooks are made up of a series of blocks: + + - [SQL blocks](Sql%20Blocks) are used to write SQL queries against databases or other data sources. + - [Markdown blocks](Markdown%20Blocks) allow you to use markdown formatted text. + - [Chart blocks](Chart%20Blocks) Allow taking an SQL query and visualizing it as various charts and visualizations. + - [Input blocks](Input%20Blocks) are interactive widgets that capture user inputs, you can then use them as variables within SQL queries. + diff --git a/notebook-examples/sqlnotebook-docs/pages/index.md b/notebook-examples/sqlnotebook-docs/pages/index.md new file mode 100644 index 0000000..7fafb61 --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/index.md @@ -0,0 +1,20 @@ +# What is an SQLNotebook + +SQLNotebooks are a code-driven method for building data applications with SQL. +This includes reports, analysis, monitoring and embedded dashboards. + +SQLNotebooks allow someone that knows SQL and a little markdown to create beatiful fully interactive data applications. + +# What is qStudio / Pulse? + + - [qStudio](https://www.timestored.com/qstudio) is a Free SQL Client. + - [Pulse](https://www.timestored.com/pulse) is a self-hostable platform for creating dashboards or SQLNotebooks + - Both products are produced by [Pulse](https://www.timestored.com) a company that has been supplying data tools since 2013. + +# How does it work? + +1. A user creates a markdown document using SQLMarkdown syntax. +2. The engine allows a user to view the markdown as HTML in a browser. +3. The engine takes the SQL Queries defined in the markdown and runs them against its' Data Sources. +4. The results are rendered as Charts or other output components. +4. A user can provide input, for example by selecting options in dropdowns, these can change Variables in a query, which then refreshes the charts. diff --git a/notebook-examples/sqlnotebook-docs/pages/setup.md b/notebook-examples/sqlnotebook-docs/pages/setup.md new file mode 100644 index 0000000..a453fe0 --- /dev/null +++ b/notebook-examples/sqlnotebook-docs/pages/setup.md @@ -0,0 +1,16 @@ +Sql notebooks are available within both our free SQL client [qStudio](https://www.timestored.com/qstudio) and our self-hosted server web application [Pulse](https://www.timestored.com/pulse). + +Click below to [download](https://www.timestored.com/qstudio/download). + +### Single User - Desktop Editor + +[qstudio](https://www.timestored.com/qstudio/download) + +Works on Windows/Mac/Linux + + +#### Teams Edition - Hosted Web App + +[Pulse](https://www.timestored.com/pulse/download) + +Users access via their browser \ No newline at end of file diff --git a/notebook-examples/sqlnotebook-docs/pulse.png b/notebook-examples/sqlnotebook-docs/pulse.png new file mode 100644 index 0000000000000000000000000000000000000000..b9da0ec5041cf2458aa06b23d0bf188ff41342cf GIT binary patch literal 3570 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 NOpP#xH3qJ@{{zV>bGrZl literal 0 HcmV?d00001