From 427bd79a138bc13f53e071c8485d8726aa19d1dd Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Sat, 18 Jul 2020 21:01:17 -0700 Subject: [PATCH 01/27] pbi connector --- sql-odbc/.gitignore | 2 + .../PowerBIConnector/PowerBIConnector.mproj | 118 ++++++++++++++++ .../src/PowerBIConnector/PowerBIConnector.pq | 68 +++++++++ .../PowerBIConnector.query.pq | 5 + .../PowerBIConnector/PowerBIConnector16.png | Bin 0 -> 689 bytes .../PowerBIConnector/PowerBIConnector20.png | Bin 0 -> 914 bytes .../PowerBIConnector/PowerBIConnector24.png | Bin 0 -> 1163 bytes .../PowerBIConnector/PowerBIConnector32.png | Bin 0 -> 1688 bytes .../PowerBIConnector/PowerBIConnector40.png | Bin 0 -> 2139 bytes .../PowerBIConnector/PowerBIConnector48.png | Bin 0 -> 2430 bytes .../PowerBIConnector/PowerBIConnector64.png | Bin 0 -> 3252 bytes .../PowerBIConnector/PowerBIConnector80.png | Bin 0 -> 3618 bytes sql-odbc/src/PowerBIConnector/resources.resx | 129 ++++++++++++++++++ 13 files changed, 322 insertions(+) create mode 100644 sql-odbc/src/PowerBIConnector/PowerBIConnector.mproj create mode 100644 sql-odbc/src/PowerBIConnector/PowerBIConnector.pq create mode 100644 sql-odbc/src/PowerBIConnector/PowerBIConnector.query.pq create mode 100644 sql-odbc/src/PowerBIConnector/PowerBIConnector16.png create mode 100644 sql-odbc/src/PowerBIConnector/PowerBIConnector20.png create mode 100644 sql-odbc/src/PowerBIConnector/PowerBIConnector24.png create mode 100644 sql-odbc/src/PowerBIConnector/PowerBIConnector32.png create mode 100644 sql-odbc/src/PowerBIConnector/PowerBIConnector40.png create mode 100644 sql-odbc/src/PowerBIConnector/PowerBIConnector48.png create mode 100644 sql-odbc/src/PowerBIConnector/PowerBIConnector64.png create mode 100644 sql-odbc/src/PowerBIConnector/PowerBIConnector80.png create mode 100644 sql-odbc/src/PowerBIConnector/resources.resx diff --git a/sql-odbc/.gitignore b/sql-odbc/.gitignore index 3dd5ca542e..577f2c8f74 100644 --- a/sql-odbc/.gitignore +++ b/sql-odbc/.gitignore @@ -56,3 +56,5 @@ CPackSourceConfig.cmake CTestTestfile.cmake /sdk-build64/ /cmake-build64/ +/src/PowerBIConnector/bin/ +/src/PowerBIConnector/obj/ \ No newline at end of file diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector.mproj b/sql-odbc/src/PowerBIConnector/PowerBIConnector.mproj new file mode 100644 index 0000000000..2679eca602 --- /dev/null +++ b/sql-odbc/src/PowerBIConnector/PowerBIConnector.mproj @@ -0,0 +1,118 @@ + + + Debug + 2.0 + + + Exe + MyRootNamespace + MyAssemblyName + False + False + False + False + False + False + False + False + False + False + 1000 + Yes + PowerBIConnector + + + false + + bin\Debug\ + + + false + bin\Release\ + + + + + + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector.pq b/sql-odbc/src/PowerBIConnector/PowerBIConnector.pq new file mode 100644 index 0000000000..45bb2ace90 --- /dev/null +++ b/sql-odbc/src/PowerBIConnector/PowerBIConnector.pq @@ -0,0 +1,68 @@ +// This file contains your Data Connector logic +section #"Open Distro For Elasticsearch"; + +[DataSource.Kind="PowerBIConnector", Publish="PowerBIConnector.Publish"] +shared PowerBIConnector.Contents = Value.ReplaceType(PowerBIConnectorImpl, PowerBIConnectorType); + +// Wrapper function to provide additional UI customization. +PowerBIConnectorType = type function ( + Host as (type text meta [ + Documentation.FieldCaption = "Host", + Documentation.FieldDescription = "The hostname of the Open Distro For Elasticsearc server.", + Documentation.SampleValues = { "localhost" } + ]), + Port as (type number meta [ + Documentation.FieldCaption = "Port", + Documentation.FieldDescription = "The port the Open Distro For Elasticsearc server is running on.", + Documentation.SampleValues = { 9200 } + ]) + ) + as table meta [ + Documentation.Name = "Open Distro For Elasticsearch" + ]; + +PowerBIConnectorImpl = (Host as text, Port as number) as table => + let + Credential = Extension.CurrentCredential(), + AuthenticationMode = Credential[AuthenticationKind], + + // Sets connection string properties for authentication. + CredentialConnectionString = + [ + AuthenticationType = "No Authentication" + ], + + ConnectionString = [ + Driver = "ODFE SQL ODBC Driver", + Host = Host, + Port = Port + ], + + OdbcDatasource = Odbc.DataSource(ConnectionString & CredentialConnectionString) + in + OdbcDatasource; + + + +// Data Source Kind description +PowerBIConnector = [ + Authentication = [ + Implicit = [] + ], + Label = Extension.LoadString("DataSourceLabel") +]; + +// Data Source UI publishing description +PowerBIConnector.Publish = [ + Beta = true, + Category = "Other", + ButtonText = { "Open Distro For Elasticsearch" }, + LearnMoreUrl = "https://opendistro.github.io/for-elasticsearch/", + SourceImage = PowerBIConnector.Icons, + SourceTypeImage = PowerBIConnector.Icons +]; + +PowerBIConnector.Icons = [ + Icon16 = { Extension.Contents("PowerBIConnector16.png"), Extension.Contents("PowerBIConnector20.png"), Extension.Contents("PowerBIConnector24.png"), Extension.Contents("PowerBIConnector32.png") }, + Icon32 = { Extension.Contents("PowerBIConnector32.png"), Extension.Contents("PowerBIConnector40.png"), Extension.Contents("PowerBIConnector48.png"), Extension.Contents("PowerBIConnector64.png") } +]; diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector.query.pq b/sql-odbc/src/PowerBIConnector/PowerBIConnector.query.pq new file mode 100644 index 0000000000..c0821957ad --- /dev/null +++ b/sql-odbc/src/PowerBIConnector/PowerBIConnector.query.pq @@ -0,0 +1,5 @@ +// Use this file to write queries to test your data connector +let + result = PowerBIConnector.Contents() +in + result \ No newline at end of file diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector16.png b/sql-odbc/src/PowerBIConnector/PowerBIConnector16.png new file mode 100644 index 0000000000000000000000000000000000000000..95578aba5146c75e75329e8a278fe08a3b5ba14d GIT binary patch literal 689 zcmV;i0#5yjP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L0!B$hK~y+TWBmXB zKLZl@^Xcc`Pe0jZ_@2J{eD=aqT@5iY5gu+XHmEcZ05!nD?~gy8R2;tPy88doXKRk$ zVc;lNGV3?@ntk`~>%ag0LDVoo^#Q@FkN=pMf4%tn`^|TT$Di2w*%;WFIk?$Ae);7c zv3Ta9Ge9jMWguNIKKw6P_FpUo$ozWi{p&S1|9|=Y?%VfCb5F4ImWZmh>bXo;GU>l@ z`xQ_D*bm2VGi1(T5aeZ$4@ck#l z>$WV{l0kp z71QhIU)OeCUDJKz)=QM|MFyJ6BK+KJK*v9R`k9I0AJF4W%>V!X{|RJa2TaUNj7&`b z85#cn`@F0|Q=WMs^lvb0q-=DIPmz z!8hN2GXO*8*B>QW{>>}nAgVzCXah2M_x0D!S6_gP*Ka-_IC}5-%a1>P{DDY;!2kaM XM=duv8ux>J00000NkvXXu0mjfG~rBm literal 0 HcmV?d00001 diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector20.png b/sql-odbc/src/PowerBIConnector/PowerBIConnector20.png new file mode 100644 index 0000000000000000000000000000000000000000..cdcca25637e7e55351322655ea1d02f77aed9bd7 GIT binary patch literal 914 zcmV;D18w|?P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L11CvDK~y+TeUwQ| z6Hyq)-^{c#bfcv}OIZRaLQ#pRY(Yh1ToOS&sEsQ}m!L78G=_LEK@&U>aEYb{iQ54T z9>8eO1f!sW0Ynr?DS@&TD6~+f%XBs$bQ+XWf0xO7@Bhnt^S*Be;dvee!H^V!p_oKW zy6K<2lkqVMtwv7ZB4IheN*NBw=26Eh6GC7KH}X3s?K}1xwOU1nK00S}Lg|$PA-4o7 zJOgkZX1>Y7JAG8Y!`Ez)N6T~?gyX>S#>Iqp|DIYPy?@m`o?6^_pmV0dXzrpS{%=Bx4V#q;g6DXbhk^Hxl1}Qwi(zw{ zy}8;nZk`uXArNC|v|7f}9EKsbSvLyXf@e`ggupe1@n=GVB2eRC76Ba8f7g@9q$iKzv#2xS>g6D3=GXMJw;!Ha3WJaygpff|E7Yz_ZF2&Q< zMhc~>9e3UMHFvw;`EADIp9zLxxm(xY#OcB*FS8~oA|*K>cQ|}3hvr5~D+b7=uVW>o z*Oy;p+^}mML15#P&Mg@_nUoOZ{Kzl`%C+0w54J>*UZ(QXNX>UE2LMIUZC#^BPd`^k zE_;2PDqPavJAHUh%H6U9&{}Si2{$uMbD2u9p{Bd8WehO@iK1oXosm zUgS3+D}M%%`XAP7jpm3jQA0`A?1+8);hI>TJUb&cCp+Q%nJgi+#40kx;h}L1mEoAz o>l?Jp!IG*~5)4~D<{|+60dZGd2@Q*MRR91007*qoM6N<$f(!7I9RL6T literal 0 HcmV?d00001 diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector24.png b/sql-odbc/src/PowerBIConnector/PowerBIConnector24.png new file mode 100644 index 0000000000000000000000000000000000000000..81e49796f4dd4530e3e534584edc39725815ba84 GIT binary patch literal 1163 zcmV;61a$j}P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L1RzO7K~y+Tjg?(c z6IU39&)Kt^-OV2fkPt{22bqu|v|zCyGS*s)wJCOn+EMAKopGkU=!H{nonG~(z3JGC zUUYh)pdAWr$Dhv7saEUs0;NjT7G!EbRFIGa@1(?SU+V{MzScGbi8s&e=EL z_XTR22G&9Y8qO++XUJzchsVa_Jc~-57M7*+1uIzFNEPJS^MUMW(pcvxJmejpnr%DU zoyq2EYh3j&xmsJiwZ0O)bP-B_J_9ipexDGoP2y-ad0|8voZ-xz$;i?)y8mFNqv!9I zL+1wm3F_60tYJhhDTmS!0c0{@1>#8oLrql`0HNK+*=(|~nolHx*W|>i1 z1V8=>y84K~va1}Gn50mO^%U^i+)%}q0$vnz!LVR3(6XG{zS|Rw&b@iytgc;_(Uy~- z%m$uD!KtHQPpvX5Wgo`*N;_@mNbtcafn!l~>zUEPsjWLJ5d{&V`frb4=sftYzlNw6 zje-f_IRTFB0GS+!CBS#bL9uoId=
  • HWugELM(!kmJz3p-9g+@3ro!T6{IP9Uusv z#=y`x*ipTn3!%pAyx7@(=jIcJrX>lxoaWxE0gUl88C^LEHao!9O7Q7^{bU_{RZhR( z`*TI9C(dgaS`BQ

    CaG%xM&nsZ5|vxOP9?&kl+^|>&49OEo9V+8{^ zZyHZzsQE_55Kt6_$aDeHcmE3r5DkeAlG{OmHB7NQ{mNdK$wmPRzWhdsqm0)}HzbqE zg(4{$A(8|IL6P04hn-4DtO^aqhJ4*~5z^w$wlicf@?l@>SO}Y7v9kk6{bVrq(Vgl1 z$;Q08?{q9KlcdN>c+uyq^*NXN=tzGwCWEm#{MATuVFj$q^&5`{hr*l6tt!@JS@C%s zCKIb0MMXt}sDwk+R`ymb7njxi`D%Kv1&*Egxv^;zu^>w>G9$G4ePmpghSuK~DKt=% zqVk2$)?CaFN77eE5_`Qx)lMUsfCr;d15bH8U$O;kU1PbXY9#6YzOn02!rEh-S~a~XSwXAXA_2?^Qm;BOpnC`H=aA9RmCin&UxwgQf{9?hU|Sg7_me);}z zUcQtOhp4wojl@O4TG#EMAYtIPBxW+*cSAfw1{##PtY))8l2o2&`g`v;)VnX8YuCkV zZb+Jf+be7!r-GCS7;0Blp`^}VTa?szY%ZD11Rh6I!skDHdw`*lt|2P@xt#Z#+?tF# zhNnNSFWp^X4~CLtVOuP8L!EoumKXdjRc6b|`CiIsHG-sA7yf)yRSi$iF${7P8OiUH d|8^Mw{09}<)nzU7go*$F002ovPDHLkV1kk@B&YxY literal 0 HcmV?d00001 diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector32.png b/sql-odbc/src/PowerBIConnector/PowerBIConnector32.png new file mode 100644 index 0000000000000000000000000000000000000000..9896675643c59e59da1a663458c3b9edf4b59e13 GIT binary patch literal 1688 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 R$~yo6002ovPDHLkV1gaZ2;=|& literal 0 HcmV?d00001 diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector48.png b/sql-odbc/src/PowerBIConnector/PowerBIConnector48.png new file mode 100644 index 0000000000000000000000000000000000000000..6c763dd4081caca864d57f7d6fc7033b8e9ffbe0 GIT binary patch literal 2430 zcmV-^34!*BP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGqB>(^xB>_oNB=7(L2@^>~K~z{r&6o>t zR96|t&%Jl=-DmcdO*Rh*J0U=Ll%{nksY;Yb3ly!|R%!=Q%5*AqTEW2X2Uw;Z!(iT-#L5F z|DN-G-}%mBvMi(jCq^v@zJ;kDhw%Ah`wm^Ul<2CQrYdL2*lKHuiBkJU%xDBfK5#P~ zL5$KECfkio)v6VtPLF@_ig#nNxIs@*6joVYGG$Wvb4%`XjkT#GMnGYLI8XT2`csG# zaVv#niTBcmnUxhkn1K;E^tyWj&#XKcp?M8~OOhPtg;h{li(Dm9Ya~^1@(rU@% zbMAohppi4U>k>xcJF&ZbP5mz-b2+`g+WGb z1F$1uPB+Ct=rl@8M!XA&;Qzw^7Sc^vG7UY7aVk zK{X;Y=8akUX%2xFgjigpc_A9NJX&l0`uJooMG}rugDA)>CxoLM7Z;ND3_z{LtnKO! zl}+8Ino`IW_QzY%jz1zcj;toc@@OE0R?I`s&Q5xdEJ(~HAN#2vH)trA+0am){8AFg zjqaY{EpMc?{r3LDZ44vWZF;pY9URAQ+zfqVe*Ifp7UC&8ol8*TdQ@dYI#P8CaK$i# zUj7Q2Jyji`yd}ib9sLEN)~o&7cAh+Nxb2?FTN#<=V^hlk)ev2M#>dip}DDTkma z2f+a9)n;;Hl0dwyh%1~imFC00ermkS9;4%`DFvgR42HQ)+fS(N9D?ecC_<|`h7km0 zq>u)Lj)uD0(w5B&;t+sYuLSR1QD*wpZ_lgk9D*7rpfPsjk0OXkSY*gL42Lut^!UtC z3j$mGt!y_+LSSAbzmB^W8VE9p2gT&i3~9bAxI} zQJGX*T5dOr*@7_qW`86ePZ6}?v6CGa10pBFVH6(Z4!qv>uVY@duXyNnq{CqpgiObU z74rG$C=*u&eYD@>s4|$$6iz_$#7UB0*IU5>HaVb(R9BQRiGnT_a3hu%IVg^y z!9;m)XVg%lN%b{I52AnuZY09Ks7#$$M$>#o>V@+aY6Onu6+yCuB&9#&c!H)3+o!gQ z2V4P!;VL)-SyluY%%r2zz%oL*Y8j4bM|JMv;cmF*@xu`|d|D=f7D?iyR-^jRoFz2_ zo){AY_g5-DNtC?qXx)7_N3|h2ponz2{U$w?vGOpZjwE!{kRb5lm-akRUZVr45CWu@ zn77n5=c#eY-Xao-vbP2zuo!B42tkq^rACuUn|5@-^7wigj+N|At z+wFUJDVfhTT zoh|4grw-&Wl9Zesx)bG{{N*x=N(sqGTx9YWagf{K9=&_tg$a!kwHtMb%YO!N zA`m3LW5YuZyHPcPmt@z}5b!%Yqai_pVuTaqfFP|HXMAD|oFR(H>wb3U*}k)VQ4@(z za~ihJA3rP;%B#!m{hwU*dU}HGoxW4&`m7eMUQg!SYJ$L8+XgnSZCd^9&#R^cxr_Xp zjQ9^9`}aYv)~IQ;Yrjwmp`kE9$LroW6NZR`+z(%jiw{pJ`~9+Mro;`&-4keD`JUg; zz*QHDDjkGF-fhO*-TsDY7032BtA-)++&c1reeXEZYY?2(!vxqRGb{IgOS$%Yx`WND z4#LG5PR3+sP9S{Y#zbKmh2!mrz?Ca@DuO)8u63FcP6l)4S|2b$d3xIyo#3)w{PXiIo9C+?xhO!82FGSL zI8ivBSO-|D#8gcD@##(zm2{efeF*4;L;(stH-dV-X8Ds1`*uBX&*ZcpxUwnCslCzo ztX=1?xAvn_gR*_Sk=4tmZ(mfG?Dg~nmVQ@pYRI8*%Zt*y-_M4;!C&lLyl`G^b%iB4 z?9LP>C`o6K`{4<9wMqB-T$gG}(A6Die(_*j5DhxgX4Oug?3~wB+tipg<}(?MpnOCk w+^O@u&N8FbtTUJBY?j<^duNI%s0bkRANW}Qg(0BQod5s;07*qoM6N<$g1MfLW&i*H literal 0 HcmV?d00001 diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector64.png b/sql-odbc/src/PowerBIConnector/PowerBIConnector64.png new file mode 100644 index 0000000000000000000000000000000000000000..4450a97f3de7dbd88017f61c0b87a592c37d8dfb GIT binary patch literal 3252 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Connect to PowerBIConnector + + + PowerBIConnector + + + PowerBIConnector + + \ No newline at end of file From 401a05360a74b165b372f274e1c01b61a5c06ebd Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Sat, 18 Jul 2020 21:21:22 -0700 Subject: [PATCH 02/27] update names --- sql-odbc/src/PowerBIConnector/PowerBIConnector.pq | 13 ++----------- sql-odbc/src/PowerBIConnector/resources.resx | 6 +++--- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector.pq b/sql-odbc/src/PowerBIConnector/PowerBIConnector.pq index 45bb2ace90..a4a9b4e26d 100644 --- a/sql-odbc/src/PowerBIConnector/PowerBIConnector.pq +++ b/sql-odbc/src/PowerBIConnector/PowerBIConnector.pq @@ -23,22 +23,13 @@ PowerBIConnectorType = type function ( PowerBIConnectorImpl = (Host as text, Port as number) as table => let - Credential = Extension.CurrentCredential(), - AuthenticationMode = Credential[AuthenticationKind], - - // Sets connection string properties for authentication. - CredentialConnectionString = - [ - AuthenticationType = "No Authentication" - ], - ConnectionString = [ Driver = "ODFE SQL ODBC Driver", Host = Host, Port = Port ], - OdbcDatasource = Odbc.DataSource(ConnectionString & CredentialConnectionString) + OdbcDatasource = Odbc.DataSource(ConnectionString) in OdbcDatasource; @@ -56,7 +47,7 @@ PowerBIConnector = [ PowerBIConnector.Publish = [ Beta = true, Category = "Other", - ButtonText = { "Open Distro For Elasticsearch" }, + ButtonText = { Extension.LoadString("ButtonTitle"), Extension.LoadString("ButtonHelp") }, LearnMoreUrl = "https://opendistro.github.io/for-elasticsearch/", SourceImage = PowerBIConnector.Icons, SourceTypeImage = PowerBIConnector.Icons diff --git a/sql-odbc/src/PowerBIConnector/resources.resx b/sql-odbc/src/PowerBIConnector/resources.resx index aadc0c45ec..8fe822c55c 100644 --- a/sql-odbc/src/PowerBIConnector/resources.resx +++ b/sql-odbc/src/PowerBIConnector/resources.resx @@ -118,12 +118,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Connect to PowerBIConnector + Connect to Open Distro For Elasticsearch - PowerBIConnector + Open Distro For Elasticsearch - PowerBIConnector + Open Distro For Elasticsearch \ No newline at end of file From 11856cdce473256a3048d967b447b43197181604 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Sun, 19 Jul 2020 19:42:45 -0700 Subject: [PATCH 03/27] - add mez file - add docs --- sql-odbc/.gitignore | 2 +- sql-odbc/docs/user/img/pbi_auth.png | Bin 0 -> 12324 bytes .../img/pbi_connection_string_options.png | Bin 0 -> 11071 bytes sql-odbc/docs/user/img/pbi_data_preview.png | Bin 0 -> 102916 bytes .../docs/user/img/pbi_select_connector.png | Bin 0 -> 48760 bytes sql-odbc/docs/user/img/pbi_settings.png | Bin 0 -> 39406 bytes .../docs/user/img/pbi_third_party_warning.png | Bin 0 -> 29390 bytes sql-odbc/docs/user/power_bi_support.md | 48 ++++++++++++++++++ .../bin/Release/PowerBIConnector.mez | Bin 0 -> 19463 bytes 9 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 sql-odbc/docs/user/img/pbi_auth.png create mode 100644 sql-odbc/docs/user/img/pbi_connection_string_options.png create mode 100644 sql-odbc/docs/user/img/pbi_data_preview.png create mode 100644 sql-odbc/docs/user/img/pbi_select_connector.png create mode 100644 sql-odbc/docs/user/img/pbi_settings.png create mode 100644 sql-odbc/docs/user/img/pbi_third_party_warning.png create mode 100644 sql-odbc/docs/user/power_bi_support.md create mode 100644 sql-odbc/src/PowerBIConnector/bin/Release/PowerBIConnector.mez diff --git a/sql-odbc/.gitignore b/sql-odbc/.gitignore index 577f2c8f74..849c3e99b7 100644 --- a/sql-odbc/.gitignore +++ b/sql-odbc/.gitignore @@ -56,5 +56,5 @@ CPackSourceConfig.cmake CTestTestfile.cmake /sdk-build64/ /cmake-build64/ -/src/PowerBIConnector/bin/ +/src/PowerBIConnector/bin/Debug/ /src/PowerBIConnector/obj/ \ No newline at end of file diff --git a/sql-odbc/docs/user/img/pbi_auth.png b/sql-odbc/docs/user/img/pbi_auth.png new file mode 100644 index 0000000000000000000000000000000000000000..12e1af8ed6edd18d0c6f8ca760fc632a1972ce57 GIT binary patch literal 12324 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%0A^R@z{F#$|;MyRSUfsmLsM32KkYVqEaC3v7>` zeftaKvD0~#3w)^j;jjCjbxs7HsT^`R+w;DgqHSD{LUkBn3U71190VAnX|=J_d7<-=MukKE(c1Tle$OWi+z{wG*Yk$71A@f+(>lk|NVBCl1W;5__q?B zSAG{(9mI0(_q#&#cXvIhuf2GVGdT-lJ_a}l@Ph!CMaExNkNAr^!URXDyUb*vxQ}q7 z%+0H24}z(eId0~%+Ew{ZYQ)y8;p@V3gJWaC$CTX4zg-B+>IaQX9g1s7|8A}|0+ANp z7-&2Dq5NSwV#Gq~je>efPfWk1JOnDU>S-Vrfp3#eOHyfSstH9l^(6xKY7RR(bV;l~ zW9EX2-my#SZi=4+?;53lTJ7jM1G(EMK=UDd=xi)-8di({8e)=sp0W*q*`-d7)VDcw zW}nlG=MI)f~X-b1d-9qe|z__g~k?&O=IDriTSy8LC`G`HK1 zhJdersG7IglrWc5c5&uKx)0grvUloa#l6Dvg(&R)z--kLA)<Hv2y4{L`h#N(0h)9zzU8xGvdkH->AxH@b1dzThfOIJV0s?}eB@k+Y1PLmlbTAMC zgrf8S0qGrnUvzuUJ@=mDzHhuY-gx8jH%Y!(`II&1nrp6gId25c8DEKYos)G7@MNKM zSUs9E%MXrN+XB_wsmqJD-45`x)1R@^>0|_MfaMb!BLTA|qGyMqjt<-hq_SDWS%JRw z3$5_=0XikDX2fX^_2`dGotEy$FuGfZQl9xsWlpFvaux||k%Fv&ScW5){{ReQ`dDi> zQzURvjfyXJG6t3w65lHPQ{pxdow=HAToLN`5lL$t@_BY}aA>H@#HvZ#Bcv?UEsn;^ zg54)ds|bZ6#*&~?%v~mq8R7HwTK=fqR`9wAMT2tVDNWdKb*KjwX2QWmtEkLzIyh;+ zgE7SyULJ;TKRoz{3X#^(v2@1~v-WjfrVT)!Z5&*g2cJ}qBLhmeIwLL*4u0h@NH@pb zA(b%(VWSxH^nPZTkzz(0*F~z_haPm8DhC&MBM$H@w3QS=mv++^svB{s~J9;8tY+* z79RGHnY?#$mW2Z*4A>xb{P_ePuGru^zd*M31At$W9R3dh=dm!PvL;usE$FUAutnH| zUDpv*JEIT%I}6k6oYhjkmTZb~lT?U|W4d$28Oeokt!QK(UQ)T20qzC}Ns*O`wm_%p z+Oc0i;AhRDS^*&7kh-MsVnAaIr4UDPiB@@)FV2zxI`W!X(&A#BP<*MXl=y6m6>dR^ zsk>QMk$41lSLoKQ?uU2mL|7Aj{qtUn191a%zrVuKyM17@-u)GYa1+Mi+?K&0N*DcGcd!nyIF0}c+aCg5!~epq955S)Y$^XBJAi+> z_gn41<$(S#LH>Ww>-_(b`^bI-5E|A2)OR&$7YCCH^omKlDFsLWx%*09SI+P59Z((g zg%*qR@8A9m0#tyD#%aFws^paW=4o>W#oxBmOU9SW`LUlXta2`+crVSEByFp^v(}q} z(Ly&E`YD@%EhK(^Lq&(i3>+BK@x5tzJ@#BTS)1Bc_`)gp0c4-IXT2mXtG6tA4jQQYQt~8@Cu@UWpt*^-z*_ysit2c9k@6$Bz9@b9+u2kfJ|GO=w zCkGUo2SCNFnxKZ&+iOvK(@;g`)~e#v!gKU^YXYevm=@VK8Xs~ZBuVY^2)O=De9K1! z6{7~ek!6X=m)LXVx;G+zUIlZyJeJ`6r@LKCz*U|Ilozbgb6{759)* z(&K}L$>vz}i4UbJ{3+5;$!ZeZ%VqdBkzjTxb*PFt56@H|WZ*s&K;@zH`a&3-h}v@- zBiuyTI-f&*vKR1|*Oi8RRRa4a#jtHYwja5ZU2kg~*pA8*eCB;Rv&p3Y@Fk6P%{R}! zDS`iVVMSp%YX@OssMYuAXN|nNBb4PXpC6QNi_(<0qX zXo(jwuPtRgA5)Ps43egzHpcGBDH|^a@H7P;e2KMR`_?F{kV=lZ4)jp@ zOO1$Ng!x){Ctq8`#Popm2vRE#ZqeK^)0>j{G+QaTqn2CK>d5Ye!^;N@l=0Ss*-xo| zai1e5%EVD`^iFaHU|84ru3RT+jXlCAgv#lTEgN%WAN3lk~YsCRA;o8tqLyqd{G-UsBiZ zw5#DO)XD4{It6|jb9FvOYaUxy|kW3tts2jSKz9cac zhHY@eH)Xe&K0zGL?b1G{<867#9z56@(mtbQ;AS#OmK!>gn&)vUJJSUAD$>ppoRVFZ zrN$#bRp9cLHhVtjhU<;iE|yM%ynD zCLngsCQMjIw!!ZC6`Q8T_z0rBz*cjS{Cf*>-gVt@13l`Bw1Ab3Z@HHMNklE=#8}b& zxC#@uAxV}e1)p9uEd{R~Nxvl>bX3jv53%jb+4G6Ja3opmGnB?EXl?BWCgok1)_NN9 zhESI zLHMMmT&z&$ceZ_{ceiPKq5qrS-0`H#)Z#o!d*r*JQ@ugRUyfmMH;Nf+Ey;~GY20=^;o-NC>UMH z-S3FlZjA`AeAI5T8298Y{%VGxRf1~W)@3Ply^(3%7J+Yc1zm`> zFTswRH7R{J?M7Q&cOuyirj61bV9t)QZxm+*AJi_$Y2GyhK9HspjzD?BodTPj@*}UPbeQn*tzxsN)o9t|Fl( zTyuorYh%I&f;gxaB@g88{E1LFV)NVujq;@ukwd;dVw_RM+Rjo;m8rJ~&-oSD<|DO= zl2jF|PK@{zSH9dj2?T3krzKJedzye7JTzheEf>q&kisM(s|nX9_#+aLhM|&(Q;AtK!nad=ZZ3drKIgAmemqio_m)4CCldXUcZ$DaU1aVn_J$Q z-A0qTS#w=@&b*J|253DbySUTW?pUAGi5<^GCs`Ulo;YJ;J@#W!iE;^z$nVY)=|JY9 zySD|rh<^9&O5VSJLo}bmwvCcg8muz4d02;?`k0g%98kQO8JAO+6t9RwB&n02je^py zvfw_L+QAA!^a{fw(ag?9#%v(RJ_V4jBLRL`TpXYPFyM@WmTrIU_SQ=0XD8I*uih$WJo?DSICv{#qEtUyD?z4gslc>ef{>xYkg-Bs&k1xz9>Lw!z{`(% zx!G-MCN=AYTCOe$)t#LH>20tv_;i~P^r6~ZXdd|1dxyts^hEjPIqgIaVx|x#jB~3J zyxulwTro($oCMrpx=S~BnSKg7usO-eVH*VU|Ewm(G=3Kyy);{0VDLTCx;BU+nm?oXolgSQ8uh=nRK)XacsuTQO*EL{TT+nUp5K+EwXDNZ*Wx!@uh`sJ>I@J0B9rTd0VnZRSj7rwvgb?Jw0jBkWQ%`&(_-_I z0K@XfI>3ozt)iE56Yaj?;0wxZ5%yJa?)Q?g!i`VCB?KM!wIqs3D>%ujo@jVJAK^xN zbB^0ChjNl)XLqR961A^CAW7r{eb(}pBMDw8O`w>Mq^5f$ok_%~`|!H>zalHqn*>vjFPV$a+KF0=_r#Iw%U2rIDWG(RJO5n75Xz( zgwq>DA~a6Sgt?~~K*_m9SFT!?>qMIb+@|nR^5 zH9p=zV)e}Oh6~gEOudiK&1yfwy3s6&eVJd+W!LN3a?b=`HfwnBi4_<3FE#ETCm^uP z`2c*mq?oh@*p~X5Chsm7ZfYIPe+CrUPgZX{MV2!I*sbRmFOLKWhZIK11yjI;M5wlL z1SjeQ&;Yit8+o~6;Q&g^50@pB`TR>KCmd^E&k^e4VoEuy`y=xh5?M+{C}+M|KnTtha-bu z*Tf&+RxhX5$iDgcQ>gOg8Ya4I+0*3?BSxm@8v4LB!X;R%CXfw5>W2K^KbV{{QQ@4R zeFNfomGCJYZ4>ltug3c}l#?>n>e+LN$+-WdTKHZIr^cMWmu08EWySNQ_{gUkbW~rPvh@$kiQlr1=!c7B;#kGg5_Dpq{1rt zQ`=ADG@`vOsjX3k?*aD0?%!X{_OoLd`UCs_b*PF0eqVIi_pXw|{-mgTAE)#4bYc-Y z<#_FS31?qLE6zPtckH7uFRlbxci9tv!Z7`bh-nAza? zR(`^%qt&0sRgLtpI>6f%T*4B)IFyKKvcKj;#O-7JRmwd_2VxuJ4z;oVniKhjPUHt| zAu7B$CdU<`Nq6ePuRr#GDQWnBgWvGQZA_io;4V|y^P4>N=BD6Hh=L3*tY`$`hyterIU?NPe5Bzb~<@(Z1Q zzc(v$B3U{#(Ycig>J4zJTW?h}BWv{uij3z>0$eWuU)kJU*F$%5g#VV=gV#Wb5@#D$ zaLM(%lI4;-SLW_>H2r&uC#6sWktjtqLe=WKho27KUfP-R+?TEn`n;!cP7zFB;8jyQ zRsHp@dwQ;0a`TKM{d$+!nSKXo|)=)9B-_f$iD**Rm5`-^5b|7pa)G=wG z>u+-Rd~#lPr*&)e7{wtnbB)+x3&`kFVR3$I+V%Ip>lJjLRG}+S%P0Z!23o@1$_N-| zaity8wm~f8BvY}7cMu19@7WgdOhIQ}f%=*)Uwtzv+^#a8zaO-D;Sn@bc-vgh1BS0$ zQ!SLAzpVq%%w}kXA+sajMTsF1$lz7C*e1}NKpF=)hY^b6s5FY{#~Q5b;5QK1c1YES zYa1Y0UQHFwTH9QPer)MEc(14~@6d0lNqob&;3cA|s1_h$1jm>w}CpD*z0#el4 z8(iCN!XZDS8GK5kwzR8Pab~94sk?3#>0h#Bm0Mcsbf#Z{_bPZNd_P(x)H9%D6^>5! zAd^8fViYu&FA}?QTZX&pXaG-GQ0nx|Mj}ox`}Fby{xjlrg%BZ|YxEAXlD>k5M$Qx= z*|agud%V7LReHCA5+~43XKHGs#*^pz-s(EUiy#L%1+zmmF5hf^Vs)RDDSkYm^!s;# z7&)G!$QU5}pqcRbV&U~7h5o^_yURKEz9HlKSuhZF z9fUNrnsiNI$h@CNZX0nbfF^&u0v7U#oeS5Hf3PSXt=`Ow!A5M^Li@oN-yg6{nzWXNEzdk9BHL>GO_Dnoh zio5Bzkys48c_s`uKc&BZZ))k{*6z@{%cLwLqLFFzC|~`(&OMRjgv6@oy36G8{bmW0 zBV0|s(y0=^Bo>dAyCoAU{lt3LybJD+$e+o(|%rBmQhCItR6l2(hBi?( zog$ELI&||}T%o6pag+!39ZS^6Du_?3auU3Br1C!erYkxdXFmjLhxTe z(kF;cB0+B_4n39)&Ag6<*K}VU>K|{nS;-0bw%MQb&Nl%T*}(CyOFV5AyDMewt%E@W$9so$z#pdgbj z3^X%x&Zg(wO`WkE$+xI#{y-1*br?Z;Q`{GA31M^BW|l$O7-b__$f`1RDR1iH3aK@f z>1452P!2rQe)mbXzu9(>&+iWvY86E%LGRa}5MGf?RAU!bD-u>qr3PW0$&PCBJJxfd=kaHrqueflcyV+r)p?)Bcjd zeovN%@$CNl@|X4w7!r{m@xR%yQ5tuu&%(#$AT%++x17%FY65rN0~>v0A|zM=M$ygL0IJ!9+U+fPPPs5qRp_Er|Tim-#-hm3qGVBOe^A7lR8Da{9?H%NPXZB9||)ZFoo&6{A;}O z6MuOD%kJ#yUn;>f|G3vC5EXld>@Mj0yDb5T@LOTl{cn3sT%i-YOvsBbc1FTY%4p7q zDcIIAhD-L}J%rF8UteDK`S8nJ%Zf&&P3vW46Y1IQVvsdYC>*$b@BO79udaJuwLh2F zuV?@DNM1{OkiAxgTj%Hz$N3}K?2Y3>(?%=T6<1EJ+zNO=9rau85S)ORir!{@XUj&@ z^y)n6_SGhERNkf6jne%aPQWiHM>y-~h53i-nj}Pm{C#6c{yNSLpOGhwdSLs}Pp8~U zw7^u(g>{XcpUcDF>vu}AVSc!H=D7@(shdMkNlT<@E{+!tktf~hG>Ip*xI!(8t4pyL zSOX8uizWs;Mnw+rv0F*TR3+ zcT$vz*v&$WACcvs&ks^eQf+s7te4A3{i;Z1_sH30yWxPJ_ zJ(j9{dKiD)WLkZp7c&>oqcT>r^yJ8T{NnsOPv74vQvfcdc<>gA-6)k=gM8IL+(!id zDJVCCWR-3GsBLvKOq5;SYFKQF_IPji+`|Afa5wp&Cb`@W(==_9@?M241bgLDW=dbx z_LT|po8yNyEBWhs6J{xI#J9h$e1U5Em1{Nvjx z&8rU{$h6N6Pqb!BB_$F!?rE{sXS}gUAOFoNFXgpi>QE1JUT}s3qXWCxi0MfOUp1d` zW}4d*++E+1X(#jZ(rtCLCf28dpKn{C(x)C9fb-o@7A=pr{zQ2j*w>Qnvk@+0oS1u; z-%WiC7j1PG5i@(hva1<&<+3E5E%YEdUV3@KXU8~4mf|0n@{(W5OWU_pnNF6OhurBo z>KkouQh;N2bl%UR6^k*-#)r2qV!I&!2}}C@m-CTTEhLwiVO!g z=PibyR*Wt#>WfRBPn+ZFnOLRhKAZ?tHZjRBNY8U7SKA8nLKSQ8DYlJ#=x29&uUB6> ztdr{g`%lK;UKnyLqI@l{{YK!zr>?{|y8N)Ar_Af2Kz?K?`C`T~9vLmd zvtV77gwyJ_$t-4J-o++#$-qdH3>IE0`_R~&5q*Dt# z(qd3zK?Qhc=To@MD@s^Hpa^=yq-xbcrcGH}FwV{e)*k%T%k*o1`J-5%Jwfo3V#TPl z--_}K`sj4c58hYA5awV%yz4Dxaix4nMulW$3hFF1$6`q=@oVkO9`jb!yr%D0ggJGo zMG_S?(L9#~Y($P}%TL|rKihtAmlIRQ)%aHt!pj5-HYGO5dhH2f{#|IuNxpSrJ+mZi z;)ec+tNMD$b~@^QDZn+DyskePOpPimwGO9}6wZLi6 ztW3*bV}#ul+B@ZnK0Mi##LJUJ$erh+;yTTOSnv|v7s`qT7sDnTuBh*yWMGIpqUJcT zhTpmilqixFy2r5vboL@E`qztBMm&!cT^msq#Gp?T5&kf91fyG}OFLI~kvA{CM5#U? zvTfCuznyC&43%#pRmo?kuXf69JE38l96UiRZU@dKnZ`_^cJr9)-Pj7GNCJ-L5FS{R ze^o3*oN(EcC1sCq0Vnmbamb^1GE`NVjTbL;-hD~GH=fJ0~ly?$C}R_|Vi zBe=~*`mQ-%lX7DKDJG^zYf8Wd+6rXc#nvUX3ZNc&KrK1=tfdQ4n6HW(p}<)ygU{FQ zPme`X2tUiBhc7j=*_cHIUTI&(WPL`;Z6BI7dbJm$7gG7&pIxMj`vbODq|SQ4aF?N` zH^;qIjZ9BhSxT+gVW=C!;5tzfvtgn>Oi3dq^}qZ2JlR=228U=4M7Z`BwC6va$r<@3 z!{@ddIKQ!3l{oU}=s3h`w!ESegSOJkEdi9niG;f{7gQxyOp}f~`pPx1MuhBYEn39( zwpw{8pW<|Vws#3vqS-1emyttkz8dy(l^yQee)ZLzA>n6hmq+sRs!&Uvw0NuNkvQ3A zUfhOf$An)$O-*jyan9bRB1m+&vwPC`M4lzd;RYcO7fnh+IQ!-^-+fL0SPrqxIT9_@c-acW4>tEOoo}@{UtoFm4SdJ8g46Vs>FX#DW6FAS|yuFF}Dlq%TYI{X!pjqOS@@uBTU>YC~UPDlYTG|2? zkm@maY&%15k-K{&RB*wr%e^E@J}n zf?EE%l6p63QVcAhwZ%+z(7eXUcgDrB+_-&sswd^TcO9c>3|jv_xQ5WC4Gq_9&4)+9 ze;iMTUuWDNI=ZIdup9BcX|Q_xc~z&L!o~cW&9yxp3&^&Mb7+qBR*3uZMVINWA!7G1 z6Lr){;muQlSrJ{ZzS+f0VzaMCkU0GGD+x(uRNx=htuiH5oaHkzP_5Q6h+3ujHJUX} zep}b|RZEDHBe?p~E3ucTX*E;6e*Pu+xP)AS0EOGzo$m8JoTLe!p0``E3;`Tf+~ZlQ z+dVT*0}6{8GTS{`Nfbf9u*ofYwKP0zNKi0|-_59Xb-@LmN|I)7tk^djSS>Wf+vg!f zP;Itel$o==14UquJcP9iZ@b1uIi8>J=zL$kW!{cz+MDw|Wbln>!}!KbACe95_%MmkRc9cVhaCG3F##68 z7jyar*_}Y}O2{ADIU?ZQ(~N+YQZE_}3I-c&J)Gm#Do7{wRt<(iZr$_uiwl5z;|wUA zlBI@~gA%ar6Ygm1ch{}FX#oQ5O0qQrgbMS~r)VTjo#`_xeCZP8qf1jujDS2YN;X4V zwnHffO0-YZ$#)$|=_hF82g|-DvWce^rsP=Q8p6uO7(via)z2FwBRu3rHp_AG?F|U6iV6mOfUHd{t3|Rkh_VI8yPksA19B#eSP@5?J0b*az7#w65{nIoSoVfjx zOObDLp&)Lx*}0U*=-rUyKg6rz^cw8e$|4E|Z5Qms%SXZ$2xTfii=)DwbdLka_Flx) zrE8x6+K|7){{Jtu>QYO#6V^v6zh?LSaWEa~SAD@UW8)V8;Aei|#b4B_{)fth@zP&o zz|?{@oufmq+E}(2lVqccdpNM+cPRDVjf>NnGm+o zt2D0E?pOtm7h&#;EqhzPWl|}vn^ z_bVk87_d?hb2@dx0_P--ncJtugSIW^;PT)b3Ij8zfM2KO8e z?L-h_RqE6f(B0DNbTBLTQn7&GkBv1>YH;k3s}Beh*4724>?J;OTpoz&PHAq+bWu#Y z{kME;=NS3Yx%X-ORjJ|2#z)yHv#y2uHUq|MR<7pbGT-h_d&2p+UNv3VH2hr7Yx%6j zv+L;`MPFGZK;i2QUIzb2i#wI*M9mUIiFdTOH?Q-154n$=yUls_AASBh z_npYwWjB+tBOlf$yJwE`!2H^oe=3&bQav=b?+s*i&xi!&SU((^SxPjrc0}rIXUz(+ zdhUK0K5@CrApgxici?D0+A~NsIQSjDkaI5_&7878l6loBb=_wr%^YNOe;UUiWeQN1hy!y zHMybHQcPakfP?-2AX^4t>thcK!d4@oxnhf|sPz z?dS13yXGNX6NvuQf(95^_hIDO%V*BNkJ3tz((WY}t(N*?x@pRu(;tsj8(&X7ioGSg-aM#nCl~?}OMP=HG+`1S zv|lr^=3jG8Ymt#IeXR#5E#Pj;S1g%)r%e6_>$yA2*l>?4o87c0a}%+iO&H8t!k4-~ z>!=W7^6%l$y2{4~00MI>YD*aFv)RJ7?f;whjlTXr3b-s1L^?IyJii^v#}q=Un%oC2IJ zd@4`Cx0*Mvu-zJIIXZ`cEi%mBWSJGJBRB-!J84@fYtOV$z>+V~v0F83z#0RjV;|l< z3J&cn(NOHa1u!kAwXN6NRec$q| zeP-}rd?n${C9!-^$7L=w*}A}5wi-wmt=ceCc8LIJHG2(Zi1_X2;ylnJmIDH?4T~4O zGaK;>rQn>9rJ$mKlR9?fjx+M6mXJ)@>FD4m&#j#4bHP_3J=l3Y=8SJC^K7eda7|m+vTvSO$|TCoTbwWT zvx)98ccgc0slcxG`|BLewMk;oRyhP>ML>MVSE97CP93kLo*5VW>R+N;<1o_vQmd?= ztvq7Ao8IW+R0xnruPzRHN#-ruh^e*VO^o9`*`_uDqboHlYi+~j^9n6~fD=G& zh9i6WsPb7>(PSpq^_y~ z>ERl`?V^gR;8b-l%>AwZy{-w^KFK*^R#W-NXVAbwNKrRrD_&iyk>dZmG~iu~O;G3*oV2Cvcaz@KDB^+NzZDHE^u&+OC?AYv2rh;?&Vpled$27+2+P zp4zn$lKVNNhr_X^705Y*p6k-53|O!$6<|+2EAG!l{bS*CDzMQCtyIz~U+M?y0Qxs? zohS?XN@1xI8Q?B5rWlgUdpd8gem*@^)l(?^x$0c|0CSCdY{+qQ{cOi3X2u@Pq9PMD zA4Elw3m?PG5mbjtB+WXK!6BtRiDr+z`MA@kl;i-LRWbd1?$gM{p(IcNz_)Yo4y*ZN z^oOBJxXk+0iaJs_VjAKTJ(kDxK+U8l_Jw;p@k)>`_0e2_X6>9$<|i^L>wKA5AVnWk za<+Z+LY1t3jdiMiYwbx&J=Z$M;Ic*g`&smiYHXEP1F6El4i-o4I9E#(4~C}{UZh)x z%iHvlbqhue$BLLs7Ya(!PJ-qsMn@i^YWu!YB}!*ad8{at*z>CEA_edu3;DZ1?Oa)G z{XxSNY+dlbZX8eAM|-vNNi3>OgT1w#e9gdAI>yEMR}G#z1kqgVRiy!Z2kghbCRs%6Hv^vE@CMz{FM*nh(X3|`NU#saY?8`JQFFFzpf6__MHxO{r<$dr zjqOsdX{}AB&xCA+Hy83Z_@OdVCT%HH4r2kytS?*fjx#Q7{laa^@NH4;SoiaikG4P$ zvA1*$fyN$H=u{)vxK1|gp?5Rj{%|Z~1`;-fswsXz+MHc>1RFru28tab#nHomaL+r2 zOy7Lh_eifWDwsE?EqJIBZUQr>0-FfH{&leC7V;%}89eAt{(jto4K3Jtx+=eQv5|U6 zK@D`uKg@i5DsA2kW9eUAyM!_GyMW2p*%ssNF#)w^Zrrs*_HqhQEmynIt1r1%)5-ju z+ylDe$}4PW6Bl)(#WD>5eW{Q5{p{n2h?Z5|s#XA^FTz!_!Q?qvCpj+JlfU($c zy|l9kCAyTA1-)&)Nz|?mI~Z071FiEcC4a4R*}f;8D~-ej=@?CjwPidRwZ9 zk-K~1%1P6+uD;L@S0P&!oPmxLCWshit^-9vTU|-zcZB$Hep5QGM|W6rurJK7ePVN+ z{Ndw}uxs0D18(j*7u&+{8stQ^mwMy2<~i>5s;0J}y;cXuKq^8MyLS6$?6Voex5=-9-3Fq4O*#80~?M zY9S50-vvI3r=2QVyE(><_xuNXt>S21%CP1uRLs_OTn`d#cwb8_ST+BHV2U7iwoe^T zn{`kxRz)ajXY!8x(D_zpYZ^i##6^C?XBg!biZ(-OPiH@)ZR)L?Q_rF~ zT}T+|!<1D`)j6!o=H1Gdopt450d)o>21CW)&@@SgIqDcdd)mQv=KJs+h?8 zLley@UUw~dh`#n3Lk$O!e$kfc=lnR@9pjh&@`Hnp2xcMQb2d3tzJCWNJ3Vxa)FP-uRNV+s!ySDJLez`;?o(mx3(5dxGjUJz5-!HDb;7LDKpG&I6g0H7!qU!vT?yoBIs_e=Ms0{yJ zjpdXoshkeT(@aR6t)HOG3|TtfCu7}*yxZN-A*HcPm%B6DeXsEpO`%;fTr1@xN4e3Z+)@l&zA6x&bB$6V7YM>+_Y8!I9TXRX7pk| ziZz@{Z#|J1G@{eQhxK$rXrsksI~|4*FS7X2FvlokvCzm|_7Y!GoC~y;NFBIlj;QeR z7I*uroY8V*;2NT;!~zkdXodmHlvep?mk)q$*1XXGa_KU$YItgEs(+quVr|}m`l+DW zoVt8XnEZ`<^j$LTLkkxh^4>TXHYgQKI%OZNQD? zqSsyV(7?keyF|}tKx!R6Hm~mE)NI-FvmjXw*i~((_133uF+sr=1@`#RSE~yRqrv2S z@ysGWXI}qV-&?rO5PFT(8{x$jopYnIRQj7@(&nGczK~THbhY~xQm5OUBCPf+O6KXB zrB6i?L~O9^z1n(BI(i-IaH%jaVH}vy)@!`1`>6|d&qg}55tGa35>a;Me$xOW`Syy@ zi&$RXoHLA>xI7MJ*hoxoK7D2KFWA^F`DzDuF`-*izNaNMO&d&Y*7#p&?{@>M)waaT zwWX!TS0}5DGCQ9nzkT5~hjq04Q6qfE-Yz)!VITrI{`q(P+g;_sJg=Qm6gKBdic zsRQ>{(?}t$WWqzz8~qOk5okPKol;%a9SC_IJ*TD#ei8D;cw(vHkO<)r2=~q^f&uP&t<*+xKJ~3|H*?*l+$w_qrstMbQj@ehsy3^U*qTK;c~;U@ zZ^61Kb-Sr9JwI84cdDQZg1+03U%Q7t@k~I! zyQPf?DXK~epO}#348Sth<+fP10RF zB*mha3yihgoQA=CIFnk?UaC-oKxz_E+1-i2rzL$s(_mZraAu#ZY^-Lu;VF z4LB@3Qc`5||K4jDcK1riRsmFCL{o@%$a<|`Ffdq7@qy{Tvdg};Z|1MPfb^`Y`3Xte zoKS=-Kkz;X{@-Z4(#*WqI;A^zS4DzG>$jGi_Ig7@Ht3Xe-Cn$28*m*H46AhN{Aj8q zRq1?1)*}2Ar-@QK|B^+K-*jQvg%22I;ud|+w1AFd8Zg~cf6#i-bLj7)2p+6inFt0dwc!y zJ08|S53)lZL;%Ay03D#^Q>5u1>|{naz#^jox^<-Z+1t(d>hwZ^d(H%d+|uGe=EFD7 z+z0KtiJZK7s&+#c@|8XnYT{DC-&1wNKbfYXADVNj`t;T{W%umveqM2L881)j?m)S)n;>sRQ% zA5KoN&r>U%+43t#>R}C`yL$W0Ox8=Cd+$Ced<)&^7THXbkQ+VSSv%AQgIhMeM#`e<89N^^xIWtPrBmKSEE2Rt>kV&l3Q)=)UD$*^WeWSG@M!^1zI}ssGtpe-tb!WvJ#OyM2KHoG9l)zHHSg9I zgc?DU_!A0K@a`0*j{(Pb5$3(#k(hK3<10Z?#71ed4K}F#k(={dd4jzM`Bg7_#f|Lm zLb$9jKnNGe4bTs+@0Le_sqYj^9C#_5&n7h-u?4Bo5--TIj##;O*A&Dm8B}CyCRAEP zV#=3+MFks&V~|$4vkEIhYRgtQ^C!*juHHhsph9jm#{(W_@a$pl_dfFM>~gR^xCq ze99VZPEOE6V0vyerkKk>wzjK7UM~23K5IX)-enbiDrqei4CwXm^t8MlhS5eFC#ae^ zewm-wU)C}~LHlTojk3+{^SMwYvoCC~Lw&4yYXUe5J=0h`k1l=LL~?tpLu=ti+hC zS&*pUqKtNyaKldph;o)uCJV_%)C#yw7VfxNb^h$SB0f;mn*oXd63GgohV&m0IW zc5BFF1K6$Unz*KHqUe1Z%Na+;9Nc{%O~Qpdwb zGiQS=PK}A-tFp5ZPm5pjqn{=@m?5-a&?wdk`fagHO+oAWa71qXFisDyPS@@F$|!Dr zpab%5+({TXi~8)<@%u10MQ)Le(^kSh9-X;dNpq^@3*+)5!Tu{JT7*J2w=UV8c=N=& zB0q4bIA+`QOKMT6d%)S<=?WzKtv|b}&FchONz*M+C0mz86c3Buoh}qwX*HOWea>mD zwwk$h<%v(~RcYG>-_k~f1_n}g+k;?<(y`+T(vZkzRBtpUSLoDw=F7l$UlRbZcjih? zS{Z&ysss+5%C2|w0Q_ZZ&G*JVQ%QBlwJR)DSH*6Co(#C;B`VY*<7c`iE?gqy3eH#z z2q5NhnqJ%}fkHTImo)!b1SEI6rHjh7)q=fHK+|*+0e%pI+rVlUvwU+LIB62=aY0a0 zy6vEmOdXh6=Z*iAcp!11#+L`a+lTSv(-?SA^l=OMMscn@j0{4RLFaoU7KEga zviSM*#JF80B?vh%= zW*81dcL)+ zCR&nJvxU-EyGz{r3SMAq6OA>npaHd-LD+bjAPJ{29kSJGxOzD>b4HA8_L#@uyuOb| zO?tVu5BWLu1`{c^-S8gj?k>NatkkI-KwJ_t(0wiI&G>k*27`We>9w&JUvSEN(Od01*gqoOY)~cWoKlr)jaCZUweN9%^#5V+y`!4ix;9>q z9`y(!7K#)>q!S1T0tx~GBE6F!B_LgT2k9z;Qlvu&2nf;xL;|4~r9&tRgkF@Mgn;x8 zcY~*V@BQA-_q$`J%f=Y)GxR&1?2KKNJmD zhVh&$b^N%8{?8N0YE|?dRvN3wNdz`>Rw0%2@e7*o9AY|)19MCH#@>VS#2#V3P~=om z(G?Y?8rC{yiRIUHyhwNupXuk}7L5nvWhvv`My)bgI~WI1;6m7iOK*XP5*Lsdw`AR` zp6Zp~+luaU=MIfE=|3aZ-lYYK5_jDnjx$8wD{g2Q3UZ5I4I3qh@u#|5Gn2nw66142 z+{r_IW-G^WgB|?NhIR4yGQh;w32Z*G%p>(Qer=N2t|%rV8k?G>?- zq*b>Gd*dPUR`wR4A>G{RloR`D^}a~=)PKJufOv!RkpF0Xfs*N-%MA0;H1q!8^1jsJ zu&mTgkXryy+>bE>tP0EurC;T#eJ^e_5TS5*6BxkMlrC3JxLg@jFQ^@%iWxZwr!VSn zQMO1eu=6o0==T|Yn-uy%X#IJ65F6b+%Rg|B*wB7?WktbtG~*n6%N71KJ#Nq`#nKnR zQQ00Pmat}XaLul+-!sd#(Tccz$QVqRC=ha-qcG;~O05{1nny{MSD>@4EkI#YDo62J z@kKP}upaDrFKv*9COn4ag`>HfDeF*1NRh+eC67C;ZFzP`MT=d9lB#o-MiFftah7XN zZNM>4W(Q>$_wC4qjMtsI%eMVUb*GZCvm3~0@%@qTANq#AZEyC=bx0lky4WbQ3&WBf zvRI=AVy5$umTSD9phP2QMPY&=4XWm)R&Rj{U$U=FgY8#Ei-pIcs}`_oEg?8+Zb`h| zP<0OI%NP&8V)=o7L2tdWO|cEknB2k=eN6S3D_*6vO8bc)0Ji@}6E}{KwnwA&Tk3}^ zly%cN$Gy1^CIzy_(}wQeUMOcBA0#i z?a9i@5;Ys)9^C4}QSq^lfHt4dUEV*Fi&FSIq5Oq1=5rn7=O)z+i6v@nKRdHBX zYVf`LuwCKs1j&M5BK6fog13K925orl3O!3=e;v*Ip4Hfp$)n08EUnU?A7-f6SBj38 zbIv|e%2U!M53~U0CTR?=7bYTT5kEJVsv{hm+C&(TFV4CJqZ1g%x6x*fc3=#CgzprYrJTiamg^mkxQuCW*z)K$xDf3IrSR{;DlPrS z8Ik@A?3Rp6uQS!ubgf-RlcHf`fLHIOjZibcUG9QWc3A3i=KWIU>h+HymhDgdyDKI8 z!W2EBqMLa|t|?k)u!A1He}+85XJ*~Zg89ygdMcz+uroV(U`u(>F?smOJzySGZyk`8 zzJI(eVqv>s9QG`O%rIE+hTR>$(T7~UK`?RkbwhiE`{4Oq)5)7`x=Ame(!QZ{FWhs= zTQ=Yf3j)h-zPqx!%!6p(H6Kh{hHW}#FJVVB@p%fy&zH2e9Kqe)EfAU;!h(I*sL6ah z6;76hi;7rJ^)_EUj+VV?VeCmbFuEMIvo+7Fgp=r?r3HL1Xjlh(zRRCg5 zycboiVO=K(6WcUhpS#;HsthysE|%o^X1=hc)ZfQa|MDH$;sNVafbQO)Vi37ZgQJJHO87I+^CqH@?y2prX5T zmS^l~@YCE>5MRj@6|1Iu5Kw@@CS-Hf<)$zzWcUiJsE+0fI}=VMxVXKv(LF2u#R3nB zyJtOjgzd(gcD54d_}Tv6IZ4vC4I0(l_b&N(C<84Ik60izKKX9IY_eLHTqo=!sjH)d z(c$#3+3`15qp6Pun=11qt1o0ewb)XmNfw6eC5IRFwlAS3<1@*i$2 z3$vHR3&VMY_K9^m8zpnk+n>Ea#hHg0-qX*H6zBu%s@{xq-+&+p{_VHb0 z9k>$jN=mvPJ!|8J-xsJ2aZHeO>hy}wG|2Kbey@wwr4Hj(lI3ro%Jx&Rd>Y%2Z#b2J zvIJYc9Ifh~66uVAB=5+xKylQ5ii2V5!@X`!LZw&OJtx6dQvk^)oSFJ65u3v7iROts(Xv1~e_wEU$hgkO(wYYuS`SQDV9T3)ooQG$XLV{L6 z#*cO6DQ+D-ia~Pq!m1@5$BVr4pGbq?>$^2z>{n$VV4HjnBme*ql4YN$>53fH^S%&z zW@PD%ltK(>&0-lLX_{~y3g3&+M=Nwy^+D9bobCcM@pYnP*VMhYzGdD@%^%=UQOda{ zQP90too795^*Xi$k^KW7#kKSol$dep@Kk4W1JM}arz)-n@R~3ZegD=&^R`frW*tsH zYx@P6YgV7bLE79#Dsf8%%%GIVomYgurg0i(ZDL5bNLOFW01?t4JW)s!_-hLAY6mtL zCs+*upclHu9QnXw>Ep~09AwAl@<$C^tA~8+# z>xkYR&%_N|?`S^XoZmAC{}IQ;WfkZf{{i0q+0*@}O!XRjlLhbf@rAp;dFwe~E&M50 zm{|efn8*L#)q3Vr_TS$-lgRb&ovgn-(f-d;)u}%Pw*R4p&B+eI`qYWu_W!V6_}@Fv z{Jb6O6R+vVV{l6u;<)8X@BiO^=Ff88@+J9+fS%xE!Er9^Kh!bC+J?Nn#!*+(@^=lb zf#E)Xd$|T=_jmULU2o4eUD7dP#p^;orscZZYr3m3*Ty!h544qlDlbm!?2;)Vs5 zwhPMsmWY_yZjjlzHsPG(tEKN3xqf1r4DU)R`!T`rCi%Jj_%*`U67@Wue&+d5xvUgi z&oj~94(2(h#A67n&1?<>2!J{NX%PMU=0;o;^aJcRef?L{MGHxi49tub0Sl5UszbT#BXD=f#wXX^g%ogII<4tb5IAe}^$A|3#o%z=u*HSzp;DYUwiXvt8{ZGPp@pkL|}jZR6Sp{{sf6~PD;kP{G#I)3x07t6&leh z>#a1DFUGf5G|;JHitcUJ9m`6RW9+w4#(Sja-8iBa^6Z+RKlKRxZCgfliLJzoKyfo* zy^;rJNpds)$z!SODqCXS7#g9}GZh8Ny>+wl^TLDNx`+Dmkwbaxtx=R3k^pAO=dkc@!z`-XYUy5Lxc^S#F5ZMzA?G5DxozihKjv3eTONOWV*#EtmHL|KjH z&SDWE7HuTEb^1w8ek(0uCVe=R(*m333rjH!Jk;4#@d021xo(p%wdx)_;>1d%{TS1Z z*a8y)I3r#x0GBP=PdUbL-N<5BYWV&&A)g~LWd=CJfdZfwz|#%5j_(6JSk@ZKVR(Xf zHL_pat-s;oEs2g$k;ymI=SE*KSPnssi^~GAA?Wo@+O15!{)1heN|00(sC+}vOij0H z`$oVxL5viHbu%o|a^`ZREyjycB|`IqX6LSvAM`gxbY{((yyO_(8smRj;wNkK#O;2Ejjy7d?cnk(A5cf08=&-9evTJ3?8^$h zesRwN%VMoK@$Jyn)~A)tv%W4(rI@5U>4}f+AJi4@3+;;s`_G`p4YO*UfF3ni^8E5F zUE)^_xiTreM1)tbeOh$4%3OuFP=eh{?xfdTB0%ua^X z4pW1z7ryH=mKIDSB1kQ&p_C1?M4FdR7me}_INIOzr_AtJ*qQ_{jt5EO<%j>Y2p-qd zJF(zP05!eV01;~?i->&Bp6u8}7HCo*zQ%`l>I3AGxpF@Dvw8$$q_obs24k#$Qynjz zdqZ#Y*8VK#;8T9XY@x7QXeDJRQB#QB@`FVlw@Zw}o*3ea95nk*pTzUqRDg$aE<(g7 zqJ0|7-SaMJ^G+ue|4}bC&LMwt9ef;bf6oz8yRW`A^P-ZbxhHhlC!=1ofvTV=i_by6 zfSEaw)(4Q7kW%B1$pLiZv_dX7=a0=2trKh#+ACA<`gLbLlpQuUe(zen4;kzk)Gg_k$fSMG-(y&p z1R0?@Ll0sbr%moE-%cDt;FcX7R*8{{T9yR1NdMn%~a+Q^uw9mAQac^G!{sY2z z2Pge_H9X+ZT&t!SZ`GHhqHB|Aisd~>l=9mBMy zf+pM_O$IJWmO>6tRsQMnLf$~7^G)wN(|c2rjqDcRU#1r$zRL94d%0}Qj3w zR?fQ7&Nyy2(%U?!oIOMi$9HDDDH!X%i($%Asar;O#m*v%W9Ix?It*Y{RHwv`{pjKB zY9c3IGhQ(|fDfazIqo1dT4l9=uK9*b&qr^Lz1P42eU^Cg*u|KqX>PdNo{>rk1}6Uh zg>7>@D1BvmS0#kCD0NmV*q7a6Ks=&_cl!BCM(Fr8QeLWKO$;BwH`jz>qo{Q(;+B1oDg%5EjCbUj+E!d{Mb2QOJP zb8xc3G!33q6M6D9{R;gr{R71;Tkm@t|I@Wn`6?4v(yz4)JuWZTqGp^_m9Hb>f7a*! zNY(ddfH{!WQ6kbUXO!%Z&_RH_)4gubOOROAOR19!d#5 z9%ERV_}nR#vF~^5EMNY6=4GX?ve+wXRRztn)OKwB_|=%UtPX|bO^HDR@YHSyMmJeT zt2#}yF@EG}=)W!Qw>YnCvqg=rWxuxWi&K$2ckK7M)H*eigH1LQ$7 z+W43G3!s+l%(Ra>RFmrRj|rZW^%DZGs4TXD|AS$}@0@_RRQZ2VTsn(Zb=V~bxEa4o z2wyyIi^&+#T;6*9Io(~x)O|-PGb?r0+}g|H?-^sU82F8lu4xw-F?^iC6v? zxn=1+Kh2fC`0Se_XH6f$h?4K8_6FKb)3H$!R<91Ll`PSc!yEHH@Pp*My;TuwZ=Np_ zuS9|_G0d&5`=;La`(j)HiXlG#{Hx{=KWDjPs)*0k7>A}eA9^%dS~O5^y~MD~#tRzGo@4#9#JlZzIpEF-7NVi`jpDEI;i8G$UcH1Gq`Q zroPYvsXp67E6&O88*FTa{s5`Us(37Y0EL$?TN%F^#RM#Dzba|CYk2O0Vowl7;To&> zqdRs0O8@wCllre#smD!Dk3VI6Ck!Bfv@iOf%QODp)3Ngxmcjqq{E$%C{@{nD3ay;%5qU5X4i1(z^hC2C>-IZ zVKBSY@Z+xL-gCJ}5;ph&0M?jCUpiA2D1c?rYG@6V9Y*ig#dkW|Ddy!u3L?Uz z9|(o4qXhcmm8NpYt~WMUc_7A45I85 ztQQ{T$t#!l`H@|l82D(hgQ2uAs+8Fn>Rwdrjm6@&;%u{MVek#b@c;wDu(O+NmX^+# zo+zIyt}fY*{|vp&q}itt9OeE(ng9^g^5v9DN;|@} z)WY|DbB*u4<;&7!{Kl_gCfFvc?uKzI(n`S?t~2mP)#@fJc8F+it%mLw)*1E97W}wx z=LgoSX2MAR?BfBlTpA(sDN_fy2QCDLMP>DOlJJSZ;Zd}&4Pd!gw`{hm*yL)JyBO3i zLuHU}`ABz8A8CO(2y=5^aES~CErWDy)IAKwwWtPat9P|hDq7mLwqkBol1q0gl6#Zx zSG_984Ss5CY5A_*1`^66o{VsIsT>s;y4j8%@aZyK?#;LNMBDh}1L&5Un*)8G3@5cT z0K&A;UwH)U_e9&Vr0k_yvZuN6P?mc-NZfhXEk<{{Vu5~37(~5gWVv$C91m_aM4}iF zSq?FEXfC4dmINEbLdqq!H`F^K5qd4GGH#k<4{TmB zLG>(fvL+LC&IZsW0dZP`FO*lrLxbu(Djn5l_^;zEHm8%7GJ4$4*$pkl4_Vpq?P=2$ zMP5H`El#QDf<|Ky5w-Wf4su%50vj`w1<-r8IhnnOdY6Ii_^@1X?bx)kWa+M+;myWZ z$+LvIyiP~$ym+pwU4}s85jb5%PXxr2d45 z+-|5*0SuW>4$HXFpwr){Q)r3<-{YO!8SyE|sdY21LR1;)#w~v-FfvfI^if8+@UiE< zw0Vs;?2t{2c&9%JPT#|~>eZaCDgqn$eKNoQ85eGmUmdKp=e6LV0u{?fs2B2!Z$8Wf z+K1SbzpsGAjK2Q@o{(;*&}OhiC$ob)YI*Oo6RuzjWc{rT9lVP z8T&HKBwj~66!Y`hs*iG?p$A0fgZ#X(4!+mbF4dED7HtIu8F~%DBWI)A-d@>JGZnsV z2a1i~gjRl0iq;*|bLW1sjJ(nc)h=1nu?~2949_vOweC`@hdv_v*N!QKdsky<+{U*} zG@@pwN|Jo&j6x=G4?>p*Rgl-t@x?EtxUC>{;o~t6ir|G716nkkH#)-g({81#N4L|3 zYm`iA3EHfHUbdKP5{RsC88^|F{GCJVVPHm;j(yQRHbDhowkw5|r~ z*X^RJw?#nZANhV_wXMy9}BdwUXL>#dOU@Jk;aZ2J=ltK&ZSdxK;3zXZwGq z0cU$^EvXlvxG5N6R7kT@Wa z1d^Rxw8*$PqTt20b6-&(u?>wIyAOXlpM0T8If*)sX{G)if4b1^Y0XkG{^1gR8`rgXH4$v#T&17kQm7u?-FY`wm}(G{S{!R64?T3D6)9LR8nxotCCgAl-w|vq zqs4bH-hmYNnlyH1i9F0M81S^$;{jT4G z53MFHz0&b?tniq7RO~xg-2IXOFjfNW@0oJT-tfb@sAhDs(!ScnarWp&3$N1E?acyHzzAee(hKKY%sW` zI3H2=pise4yOv($I}u)BTOy`XU2xGv+(u_tL~a9Urz3VI8aVXKLUzpTc~pKCbdN2N zZ0yWtaaEemKNlMXcqQURMB)5v36 ze&TBsdh840%qOf`%jT2Ui8Ey*)IW3`61c0~WUQ&RXH$D)7MaXB5*Z|fA__Tn^Qg`? zr*wtezfJ&%M;+wQLw(iZ1#CL9pGzk>Rq`S}V3JPK9c=(c`JW!64 zIrQ8&htuw~Lwivh%s@9oK(3SYS}gPuow1C_mMtO+R=X%V5W7Foac2KJ0WE9553(#Y>E?4aO<)mW}YfMT$W<42^HbWuPf|j&g{8>hJ}<2_$ZA-q!2bH|~c z2b(2J&(V9SCkM~M`q`9HrfJFDrOH1wA?HbpNdD_PwOx||XqWGjSN`g{x^0=)TKpXa zvs~|OEiBA|^WV?1e`F$SSk^&NxcdU4?|JL>61&8?DrIbQvXwGbw69l zd}y=G47@73=y6Zvm?+t`_Cd%2Z5fZy^s&hq801OHp1wX`4YMq6UF?Ss*O}|9@(g}d zer2jx!e1;Se~?)B;gg{b=orJKB3^DJ>Py<~)e?7)PlyLmgMLD(WSvBn%U2E)1Uv=) za>D{$S^T!fX-miea0(&yRVKsI*Wp;!KBl!ZA06*m$QA@vKc9VsZ0|CU^tiBR;scyC z2tkf6=bh*AdjfM#o;C)x-(UntOB@kJggHx{>sD*?j_}^*$WH2VWIEKa|K72;_E+!c__CH&xJ`{U8W1j+h(R(-(K0{zp}GL@W_Mvo!mbFM`j^2=Hu$Viv7 zB4&AM2==@bFw*Tf0>VQ_Sz^eo98;=d6Yz2jy)Demo3@nkF*gD^L_NRBNteOyY4SN- znRXS~c z^1ATDt0axb)nHi`efrI-KbK2^T?1tFlGI<11%SM)GZnY)pIT(lLLe*gLrbR<7z!=l zAf9ZN9r0P)jW2}N2MN*My_j%hciZ3tv+-l5pFoS^5@n^y5P4t631qvDljqyNmkAEG zT5g%%iOWKt7Xek|#aG(2s5>7M4)&Ah)ZY60nt1)qA8N0?hAlTeO7|!zp92^~Xa8al z9iKUVm+7?<{ivrf!kkkmsgaJhIK|rXTP7N6RZPsuJ1z_F(fxkq-bWs;K2<}d zi_!I$Qw%y#k^HE3?u+?in)bedy(*`U4@$%9w($sYHlI}c@H1ET8pg*6(_P<%b^(H5 z@t>kq_5C$P*Rh@uA7RARr6T8(4chVXSnN?k=^<#KGH{d4Z*@K7P-BB7ya;+Rzsx#- z3h3f;RChb=tLP@{ou-=^mm*p}k&?$CdPX!^j=PDY9RSN5|)EuZJw(IdaX)v^UTTI70d@VP-g&p@O9YZp6#-9*xn%>lx`{YL=%nf9)PR9uN2S zy&Jijv}E7ixzOBk@mip&E%B~1c!+1!eAW5>+Pg=DU+VFcxW{)w8@ZUZc97mmgP*gG2%5IzLy^qcDYt`29hK6+tq)A z>OO`&KV`w+a7u?}6nr}MA1g5a#AY>N7{YFlSY&!XJ^1wlZ8;bG2T)KG_;pw>)8OdS z+kq)&{BIXSe_7LDZTH+!@yr>PU*f<3VN(8=j3A(C#IbVyar+cU=--CE(3IxQza}v2 zQ`eb)J>36e^PT@?Pn}OKVF62kfs0?_?jWbyJAXm8mLC8+jJ4vbj z`*{K&NFJA9eDHkhd#dNWw7bdZC)?={Y6YW2gB_6!hXq#i+{4qi-w||rinU79dYhN| zWx(b+FnYQmXb24E?!hZnT|6jJke1SHq(YGx3zRBXbtW6kM66`$)RLQ1!r~G5TE65% z%jPg`&}Fqf1>S^?FE9!%xrvITaQzV>mJFA@ETbGoEcW3r(j2TzvVMlwR6hK%V0a{m6|92;04!1t_`bK z6?M|OGpEXuL}sPldvqD{9Ox|L)qCp@OM-i!p_JK=kW?g;+sbrC9{ZBJ#V}|sYiE{e zY@mh5@leZf?WCH+qxAB<>ajnb@B;W8Y)6XQ?u-+6^tx5D1k{Z`KGuqmJPRg$`*iTZ z0L`Jy&f~}!uT}ptYkH)7&5mM{cQlJ$d8oW!;?2dPu;`sw?UsY*t7gm<(;Ruo5SbdiFM9$dZg89<*Be{tu^mK(Zplh+;L z@ES~UM{<3*Q=lZ>aixdD)h(uv$7TNPvzNq@=P$*8Q>5q)d}NXlsH?|zm=JyO#|Ic% zGMtzV#uA3mH}9dIH5k4ZDshEBaCJk+vLKA3x^R}-&>!L36<_}O3voER7Z2P*_fT#3 zB}042p?Oht$1EuZMy+yOUidiv&lYgU?Nvru@U95TNOM7gVf>eme3ExLy`9VwR!qPMMw`?7jh8~4yW_nO86gft9?;{7Po~l% ze$H}hLe7=>9)+!h@Yqy+>&U7!H>*Ax#Qn4@797+V_PVls8gUi4NUaiQ8bjM}T{Vzs zZNiz+2R;B|>Y?>l!;R&J2nqu#f9x z&uuFv(vJ%u=sXnrz974`VAV~LRZ??7)nVt8%HkUmrakLKc`8@D z(dbGs17Pj@&4P*cXBEova5&Fmz0)pi{yH*Z>YBye8EX#gO6}%Z7JR1r9-2!?23)Vn zJtB{v3fox2eu2HlZW??qnay?!Y3L9&53%XJY;6#S4OungyBCqZ+aaudhMf*zy0!Pa zF}H85)0J_iOcRE&N@8a$fp$$M_Ygu2%%Fys*E%#2Wwk|;fN#Re5q%oWss!a&g>ZxJxXQoLY=x!|!mSx1xMTF3 zpYh`dU4?bd$1}lGixDL#wq2bdpfqZ>CjPFDAd&3@JAZ5K(j1Te_Sccq@lpE)Szq)o zT?X0#K$}yGRgVHT59c?^tW+2G4uhXdU%$xIma2TnQ1|TeRkJ@hhFaKIZ~XrG8C$IM z!qV?MuPV-`yzskCmpjWEXzktW&>WH>8DfBcA*^86Q$!^e{ESBB;|()8^hLc5okC2i zF~ldJThDgTh`8qOT;Yk@UD3g51HD4(a5?p&6R^7)HAk>3J5s;P1FgI!K@pi7@*9Ck z0fy{y@xL3`4zy)q0$6U;WGcBzRMvifPq1&E@kArFOwndwot_L1^J$@atwHdEXsVDJ zL-?f@Zm|;bal`6I!b26@?9&_BWlkyX$r=`+F(aiHE0Pyif^y>IUj>BXTOZ}Br*Use zi})`ZI+b+1++<`^C%w%CL6w|SuZ9eeTfHg`J{^LI@2|Ymenhj*vB%8Aqyj=!eJi^p zbUokD1Jqs&8daoB=E7g@(|4sm9dzo$o1U%;v@>A=6d>M|qH1ZkQx@FUMsv%|oQM?P9j@_N!)f-8eRg&4hSI~uik?h-<8OX!q z=TR)$O}h+clwWdkJ=$~p{jXSZ1sCX4wFH zdxbTflj!g?d5=Qs<-^-%$%$5aWJ_+j^~ZROZ?R^5HJwy_ z-2J33FyGd}Rw^)t1~$98-akP4PA@e9eoMP)NwxAd9CO(+)(v3j$_-dhK7z)ofZ_gG z^(3QFKjV(I^&kc0;~IGBR{`ysYNvNDVaY!CeVN;iSndLZfE^=uHdp|xYdLSnE8fNj zw+l{#ak|@|k4BQvdzSXe7$Uu^#zu?jD$HZFs-dG-Cok1yHlf^#FdaT zs{{=2+s>rLn6}<0lsaO_j}S?1m{`(CMz^W0NlVMsap_hF<(S&$cEdIF`Bwo^ zL#^Qfe*_WNr88l^C3YPN&H0!C!^Gz5MY_4~b@+9z=A!=60<+go14Dy4AIKHj_u(() zH?fzyM@ehXmMImj#&J-TyqPT_OkQ{#3NsO%dfI}WFRT$ClCjaj@+=jE&zv3-6jH4< z6lxc{Ch`6b?~&QGzccS zyiePr@lcqy&*D33!-3#}E#+aWN&W2fZfTLmXMAAq>$}V_vSO`SU?k{oNJfPXq`Ziz z9!+ZH`Nn~6rA>{xe`iWaF_optJV1a(F92HxoEitk*+&lDQVs?g1eJ=E-B-+6$~-^W z>YOs=;LtgSF4kX`hPdMFyM(yJAR>XPNJ<8Wt5zZn**d!HXL6$s-h60Yw^@8#rhd&6 zn*A;Kk_87kUt>-EaKaVo{+SkYE9E^`qq`06jmgTAAOoEha8Po|V(IXiXY6qxQnpi= zd&SN#`R<%QEPZfliCDvGU30NLfHp7yeLCv5OIG|takIns1NWTfu~I*B&YpHMW>lO!1^j@0?JGZ|@7IA}bycyKZ4^zI zTFpM(9jgD#8^En!YkMPL;ce^0)Y5L#$pBR=6`G^8Njc+Lw}0m3ku*oIQ$+21evZEL zFF(Y@YIb{jJ0K_c)%XfO=~=C3MYW{R$=r2~6u#r>KaT?J#k-=f6V4S{A1UneA2!zy zNpc5lzYYL?vo;x#5S=}`yW@H!uY0(h_u%9rzNcuLr-?E{1qP-D%RsW?RZ%^6>*)12 z1+lN)i2?JThjWwr$%VOQ)?bq98l%@U7+2~xUv14tWYVJ21b+nIjj8)BhVom+Ghf&r z$?nQ_L|AdjT}sbE!>q8grR|IQ!8htrJ~Be0}{rhDD{0Dn3jR@`X9bJ9g%tTgVTwP!uQ-s_|H3O z{uBBky?3vxZNYzs=~965$Uf!wgg~=<($Ile>%IC!WJKcNwC(tVvW}1v(ss##qzzR((8Hf4@u3-Bb6+V6M?8@846a&iXa+fQ{pUd$07)Q`N~m1@H98FlI(YxUJ8OU1a12 zcWI>nwX8am(V4V!^1Y(JzOUnVG0}tVfaqxK)7rh+kt&9LQ7Rs@>E}03avO#uyd+gr zi8Gu6ZtS=AUyhPM{rM+T(WQ(WqMN@zL)tcz7^}8-$KPFtCt$5`pAI)Heb{OjE{Z2n zoQlYFd_Hrgf{V$Rw!w1z>ZrHwB5yZPDo1;=zyjlDU%Jrs2W@~p`5k%j7zf=`-Jg%& z?*H+{qc>wzJcIi5zx<9b+s^8;px_Y=+gSMiUQzex6mxB$S}IKufi;p}rRC>;hhek8OKni+tZ> z4B<(?K?l7~WwlQx7%$pJ_uhfERVJ?-w2%8v&`8w<5(eAn7iX-$=dZTXUfo3)RXXY& z;)nrOwtF_H$VNLBRGl9BTNHCja1M}sq5Ba~cojefLqxZkfYF{RHaLtGe1S3>b*4IYu zm#L+cx!*&VeIA(%S^Tzc|IDAp)n$*M$^2HAQ15#nwsDl}n^nEvr_5yBCh?4>-9GK0 zBI_V?16p-wEIqAb8``g2nSnNw!*VFZHV(?Jj&wYjR)wG z5)Vd+Nv#h&5za~)H7@|ud-S6o^3{NgCwtSrh|E35^wkf$8_5UO7}9yv$Fh7QKWq{_ zU#w&EYW?B6LAoa0y^ezg;|B`(;@gvTzx1UE>1MK z?(hBjE<4x617J^9@OjNt`j8S>)J}DJ5~AG>gX<2nM`-5YLwkh$xQYwO;>{^j>c zTbXAcnpKhzFOyo`Uulhq70HFUM|TB6>=645KEHoW;hB*2^<~km7bZ1;;#cEC3VZ!m zgA_l!4X)g_#JrZPRS<9nDjVdrB4ef^wW~b* z)LCXZ1i$8)@*p7KY9ZbLTH;7;mfSuc@IH1fV*s8bePmr|MF zwGe_M1X&jwDa^VeFZBE7%Cb1U z+O*B8?-8f-zIN?G0@GvVlex8E*jCKrk;JI%!RB%Z&GgmmwsVMgdCig419i&U`0p8u znGhy9UBo+G15NAsTXu523Wt1d$nJ0=@5Ub{RTBA^&A7@+0Q<^$FeO zm9xqYHfGh0q=Th8a3FspjTYp!Nv9`q1c=of6E#Us2VcczpPk!hudq8)=#G2(w7jy} zh>D}4JZ{@Z#k$hi*vEiKuxs#em?cj^unk76^Bazcg5gQX-ZP@Mnu3vqxsQfzea>{K zz0)<4q#IT^s?g2X7Idzp!u8%4h3$ga=Lv8%(pS9_rBPz|EdS@_w(l+ zq{JguK*RE*{t~yf+GYYR0Bc^OO-04hFeLzee z?fy=Ds9K+xblt-?Has^Jy<-jpg_7Brt7>a~+m`cSQI{|3OJP^w9DJf+yWg4Zig3Fa zr)qgMVe|PSWWotWPjTan0x>I7?N;<9-KpGAWk+JdONCwwEpGOZieeU#pu7+>B~U7h6n zOC-@{QYY0Zz(;wDh+EHSYg^ADl?G_snjG;PZR>hRwz z1<<4K-MJtJcCUA=~#=ZGZAWH;dm7 zrOJpb>v|MsFZ&qsBOOAeM>o;m*h))NYq0y3bkwPv?whQiEZ>Ey(Tmh(3CZoDwk}{6 z3!KOwO;jqK-+C|P_C|vYo&GwEBBiLN@PJVP-Llt9Ok)2+!rt`GQ3_q_Vjy`XX1-}J6#Dl@E#lNclJ)`B-iH1;BKysQTvE*bX7v6t@#D9>$s-q zmNF7l^!k@OaV|bt-ojdTG{(7FeLX#13{Bx^%yt{k!|+H?Y9?ca8PC##Bs-nyf=R9H zP^B=E7_+74Y!{EM5G7gi>)qc+$YMA(i1!JW-owFHZ$+BqKa#BmjcUXu6~;p6iTOZ` z&>3tO4rUgWL=GfN`?v2Sh~8g&e67Yl&kcjB=d+7ijER})NfuEgJ5pv&MO;5t3jn4Lx z%cw#Qk*!$#`C*X>PwVD*rq2Q;!nEX`wen*vgierRF2CTQO_6b(pD}p%L$)*2d)2y; zq^~-*|CVDC8KZThW*Dm~mDXCQe~3hz<%X{CTQ(i z#;nL>_RyH0Du0EZWg)IE+vwJ-qEh#92d#9EOlDIZ;etCpadvfF2j%__y0Mb9V*`su z5armBD5yOB#@_mB!rQU@^N@!A?72&VDwtVRm$_jPu)Rf|^dUhqS=4q}S+ z%A3k2a6U`C%T8NAQauOf|Jqcw0y%?k(F{Bw$vMFI{2=g0tBpz^EouFk1vplg)HIGa z8BD;^{`gb;V+IncABY%!PB?Ip11GivJ-_VML7;TuG#lKGc0jciSk^-;|`gKtN8wlb8V>r8OtdF1i0Nh3j~b{LfkUpJCX3 zwi<9i!tw(-lo5Yjz`-n>f6^bu|6|j9O>OLBkEhhT6wPp7!0KTAQ)(grL`%`DUo|~x z{V)EdL|4l9wtr8k8Rj8YE_C!G>)7MM*yXa0ave6F7+RxX_*rpve+ccIF6;0&1^q-r z!xt*sO%x1cl)DCQ?FQL=pX|4W>6+UXR?f->9PxM#&PDEx@cXpjCu?gZFO>w^;R$F{HP2L^oBVTtWsJ^z(ztFD-9RJM1>>RJdvd##_@;XG)sm8=O%rS-4Umy;cjqwZAFRTt1z50i@;StKDOKb z=O({Lm+sxRU+o17;)#=%llB_$$ZtwrDku*1!wg;*J;)vk`nZiSSpH5Kbuf=G4DV|1 zN6M4Jw_e=u`q8=G(UHJGs^>r)-_{avTiZesVgm49@%l;bNW;6{k3stJ1Pst2n2 zpwRrpdxOTtt%Vg<{CM89C(eNxxP_oL%cxd^`I{aIG(%90xKO(m&Wh;XTM1Ec$|#p}FKE;iH+Ecfbwn zMF*lbZp=jB?^rrGaX!AEL0g*h6VNRuyZFu6WWl#0^m7@>!um0q^erfhJ*INx!wFR& z;bIoIr^}|*$8+^Or0UhswU>as!TO)aimhT=3*xRO&t@k-NCOPlMv}@+cA2eL~{$X$uia?Yql}A znK8qRQpnCQGYmtrgt0GU9ln>kyPxOt{jA6F`y9vbc#h-y|Mkb5?>W!wdcWSU<;)VC zE6EJ4li)KINqjXZctxq$8&zEcjE=N+YWj81NP%Bxmi{XDQ_Ygd&a@n(2}6ZEOStDp zdptT#S!h5(%9h7ke;;URx8UffQuwtqu#>QB;@~rxK98ZItMKPm>wK`jFlXgAL#9*d z?zWlgH9i^J*&1rqsS+CHtzj{hzQ=OXe&=lRnQgzl#(nHuqb2H5K%EAzSTzVNWG{)y zcMtaD3h3c-!h7?uaNjUiKph;<0YnqDXclYxd`BlR{a|^0Unb=H;sFou?**1u15Yb3 zbEBZb;qsHR^2OpX_M}0rO1G)JY>IOiqA zUy4NxETft!IGvYgm9<~CW2Mw-fjVt8$l?`SyBt58Mv*%k4>?W)mvCP(+ZsO=I4^k_ z0UEbO6lI_lxY;r_fkyJ(Sd>H5-)xi*zj$3P!vQ;m?@U`8$vERX6q108jkOeAQl6i( zS^8w#p67hO;P*`aAf;&z5wKp50lQY9@s0E2-76*_qkF06a{ly`$l+_zw7l^O5u-^u zARR8TsHBz)KhgsQCAPSDd=tt-YQj8o@gLSI1+KCfr+b&V;knJNb<|{v&snlRmz|8~ zHzkfFwDMXnj5%IKTM~!f&7ENJop)y`Eczrh;fUXHB&`-6NcNV^n0J^uRdm630191B z%A>l!_U?QF;iU$(@-23>MGY9&HjtleFD8KJU6CPFA3afX!7RvU)ap(e25St;fiM26svT zgPI9-HreyGZ=Wf?B*m!kSY$lgP85Jav^PYkSCwdwKuOrWRBs>7}gOme$Bm9gObvMa<%!xwKpsd-ixq#iI;~(I0tkE^1 z8UC<&Azgx);(dz!5Uk!7gmA7tXVQO5xd3-!RG4q_Ng}I0^3%2Re^^zgvPQfpKHngL zSi_AJ)+IZv99`>rkg!@ zuiGaI9?Uu?e}qQ8`7k)NomdRZ72)3)k(ZlCzdj0n8^gn;?r;#*aGH(IJV~`jYsmMJ z(T~iH;wR<=$zzk=vH{hkwC$!1lU}P$Hq@M+*;cf`165e8qHB{$4~v)2@x(PgHa z_SJ^I+sz`n(P9vy+?m2>*V#ctZc01zF);EyTwz)Gr3Ge=%*-bojZL!-sk9HvkbK8q zPf_Z4K!vgeIEJbOUMx7sdYO@*Ex>}?L8J314q?}XbRjUA{BIx^-sszp6yfhLoydtC zi4O7`G*|g^Zv4_pQQ(WF$Bp8^jmk~J*4TeqYwu+smPek@oHl&l**4hQjA%-lq#M${ zja2LIC)KD#$g{`KFB=vbZBz^9<~zAcCRmO2I4mfue&gl z9YZg$A8f0#J3Vv;wNo65&r-|U4@mqWY59lNN+G0M;Z_Q8;nh>#^%m;UV{rshS&z@3H?miRl>X)eflp8*+b z?DIKU?R-lpMwe9F@q6P?)K&GGLNn%xY4Cz5mx+(Ofzi36rrIK5o!`rhF+{y0YN(G> ziT0#ab9H5T#&Zt=muEk4F?nR=YS4?ohl3E{lXPVj)<&@TRmJx^;!{G+ES~d9TX!lO zl?FTc0S1}ZqGLJDaN&2eex04jExq|AK-ci^sp7r9H{$Y?EqSC@yhA=jZbNfKi;K5D z?%H}&k?y}IF!yL1FaU2)4+(6X*B(^^1R8Zb$^QX&_M6oI2zvbgjlfk~zssac)@?7X2Gl%T z1lZgY1}Ba*&Ef%`A@i?shURQZ?NHzbgYI)g>=mwN!R}Xgbyp#NjwcVk#IO)WR&!Ix zCet|aKW9tf6XkM#sY%*$$-xw#=J}nT(8S%geczu7<+?8QJft&tWO@&U1$=Kd-?s8` zRo({7Fps_}0Vfn!U)ii8z0{<&+h3&|9`zGT&N-&4H&|=dID$Mx53<_zbfJ3u(025+ zllWoibqkWk=R83Wg+@Na=}lrXTaBUeAwAiBT`UQ7-oaYlR4p4zH>J^z@O!j34~ebf z`!m77aeVeqtY%4_fcQLV1cXT>W2ocuJ|TE`SqcJWLr;VlWY>I ztGtkzSZLov7;_$;&etR77Y^O%)EjdmT5bZ#?XZnlKlu?$+J*I-^?;SAzcbT_*R*+A zWL5})A?8Ky3~~do0Yt_LSj+!Z!(iX|Rm@8P;u6m|n3}@v{J$~tx-25S-Z?;^XPI-$%GNKu)?f<6frz+Evx1%=YFxuxG>Z zvx!B>;rw>;ckR+o{5hFlJf?8bT|33>1gb$B@49F6C`;j@nTZRa-n)=_X(}}DrsML1 z92@s?bDt?^ACX;|X`~s!%0Y_1k|PIg<*GqDm?Mi&motIDqM#_w5?xv6X6Dxu%^<4V zx$Z+|(Adl`z_*51@EFTYVL%f}{_0o$3(+giYAFyVPYeaNcFtL_r%%Pt2q+2bHW}r7 zmN5TX{G!=_oN%_pq)2Dc3ri`wtBeqNenPxG4RUwDdx>^e#9I$EWPyov3ssVqHqOes zT-+$)<3>sM^pG;N(Am#he>U-HU9j~h9cOW(F%jSN7_8w&vL-NN&U!oK{3g@_kkD1g zfKrndV}7*GR&%n-9?m#@6ajD^G2 z8{JaAePZSqzf&!B0xk|o5Z**xLw(b?NnDq`6F%#xBz(K;PuD^?5FN#-Y94xV(-z9p zNufnGP*=;6A+zKvxK4|Ru#TL0=gN|HblCMBNG{ zUZAej$1<+n5PLMB`>30403yD(*-Th2fbD3Sc*!4B3%Ao#pC!HFvtVz9#&1K1(Y1OH zxj%ewOe_fQWJOEe1}i=mHZGU0f6jPzFHe`h6v3mRwO_lN=LKqa<&ST-++B`Z2%ZC=J>fVPn2A3se!M$at`y>@cd) zwGz1Mq#_d%V{i#L7hPZd4F9H7{rJJwCiKql3mK^G7WcZ!QR|UhInmaL0WLw3S#aUq z1ncC1Bzt3i*W(JDWQvG3!Thq_L2U?Vmznc&e(h5y7PR5`DH8kbZfl2D)b$hzBi>A2 zF_S*&Hj<1X=7ij51U-+=akUmLcJPPg{2oYq;DkqG${eJUem z6T1~C<|)SrL1R|kDt7xJQzcGpmy^Lw;}9<#!t}`QrR$fwJA-VnC<9rXI3)?sMj-5FN!nr_Vk_H-FYHktvNkwY9r* ztLy-74m~$5LXRis&eZ!Hb*5;q>NL&vk49f&$j?Uz#mgH(zjaX0`aF<7&I1l%gs!^= zp4vmA2Roy}f2nH5E>AHoYz1xb$b5X2;hC*8uY+N4kv%6*gl*mt2t>SAmL@-s=2wnHY7(`(xgq-~*GcKJ}X zZpcZ?;&?X&yzuYurshUxb(Ma++BkJ>|*WALB{9ZZr(U(rhdGsRUpGmRR zF>PK{S1MPW7^zl9fv>=;@j56@M4?QtlJ zqTca|EoicWqiYe;ZJYW)+_H393SAAEhPlVT=1%=G)LH^s3-BtdwSrFrfd#69Wyxt9 zHx()Rr+BY}cNfFJJF_!4&HpWb_pv?xJnXE)k{LI;DZ9Bv)!MgW?$UMV54DIG$>SKG zi6X@~iv$DyVn7xz5qVD(nL5m(mo{dLsJu~WCPz{iGf%u5kjm|UrrU}~ij9Kk_$>EQ zQ54~QnVtGP!RxWZK_fm@tsg~s+Lk;ND9`ub8rzT+s2zqy;8B=!)g;id8Y*FJ$Ax$AhtwB}*P9fr|-}bcp+feX1|l zgc?A=HC zCR6VuITA9FLhbWd{$bvZ__pOw`0b$!WnGs~Gwh-iNZfawXJ)vsGszEEFD&bKyd~p- z1c}@+4Vgi3@^B_o5*O?^x9XW9J{Bh5TH50HsW(-`*zOc}Wp7YoT4uh@+bG2C5L1a< z+9Ph$HM+z^{eVRuJ0>jk7?c5``=@`P^#QusB`P9aC zgKse!2fcuM9|!X0mYi9dc-hR`$(&{0_nM6#MXdA$yLS#xy>eET%Db`FQ>+;z1!<-L zw<;y?KJgRuN#1dE0=x@G27{UPA@Bb$@=ZIyq7BrZhPB|ZmT(h-TV#~S zP>Zgv%xb1S$Tif=wFm?UgE0;@SCgGjw3 zSSRmmZBfb%76Yzf^>fDCd(Dp>)XK&}4aGMz=!Gx)^=O@Q6-Hcz?>rN{&#>p7SxZ7S z^a=~3ck=5I%~FMr{1z#K1umxVapbfI?aKR4+hx_4v=xloP9bmrW9JbSbQmoC)%4oXyjx91$$;r+L-pa9 zu1=Zu)gS}nQnv;|2e zvRju-#ot-nJ}r1nVxg1 zGttra_)Uh*S3q2`^(u#)hRvZu8TsR9dIlnhl<~?K=lq;}ixf^=aU&~Qn%%4XUgfIxQ9E~7I%p9=DCJ)@T5Z>$IV9PViazS--DjuLbibNZ$pK6=E$?NiE; zXfr;I$F;e@bm#NK?dpDy_+ zyo-MjGAhC0V+vy%*e%!TM4uH8npKUVYOLWV(By0IT_GF@H<(r$gq`y;)LAM`S0E2* z;3l&&`ws}qU7lBOKF`SJ@~|5yEEvy0L@TE2)x-M>CyU1`5%)%?pJJZ4m$}W2OCjdA5?57rDn&T-m_&{jCo)|QBU(+~c zM+7ajjAcWoY?nY5$3WA|eTlXJnYW%2n*(cY%7ERr(h@7w!J?YPV2)fxADVh7`5m1y z5~X!kW^31bTY3|xQXKQhW0%exQymZ)?tnOHU%d^wo#HS=yIaW_Tg37W=iS`1KP@d- z)N;Iu3^#HLeO?yuaTL@?B!f_*C)u)+pG z>-?21km7f3H|w4`Un7^|yWElP)483>R_B9RxYY7lz%%2X0?C79^gF1yv~K-)1t0_)-*+ z8jtO=*S45N94cU(QY?12f3r7b`8UqfW=&$t4sLzY*Qe&5WX3?#!gL{Sju#|4z{gqB zB0_9DC3#$0UoY4rtEeg=(&#*CdqW~NXJgi@J0PQGKq&swNWE62={=QzjFDAT;qv|n zzxV2*z%KQo1QT5K4_hC-#9J+s6RX!8Gb3~#baxMklLD8LFSj{HXDu4 za}Bz{!8bD`$Z5zffO787+p8fn##c5pUBNj@M*Ufom?c z-$Z{tF}t*Yg4*qTzvi8|={HcyC1PHXmkt7|SMdb@0w-ZiygJrG9=yf~*{5ijPCsj8 zi~DjNb>}@MCRb$UmL;Yvg-Y$Tn(+kKeg1<}_|yUOl&h&mWw1x2fk%0@vR5mOvMS?> z?Y~9k;zfu-xz`VVX#NijtY%DcXK`|MJfqZH2ZL!_Wmaxuri!igD8sI_o<=evrX<_U zQAo=AMK|aKadPH$uXtxQMuT2*=3Ql&kUgoag&`vf)#+YE$%6 zc1RgAQEch4w3-u9G{mobU`+ODw9qXW(Koz~b&&G4%RPS%=<~tV{gtJ>~d2M=IlQXbmuX zT%s=X&WNeLYd@>0%x{9JuJoKkm#CCx=0VL%`R_RA?f;)RVWTfkE$j&Ek1Eb!##PpS zGdH(+M!H?sn2n0!^-lotJLDBq7WvsO1+akfGMJohmM=E0r%3?v!wlF{-fNio1Qq%t2yVpy)dJAt?+fWIx?7zBadXn08!okD}b5#_#+|(6Qcx z6z5tUY~5_|YnTi8*ko#G?~t6NMEELzf&b(qP2CI06NbxlsOdIgrWM43w6ZG<*>+&D z@mIa6y_QqzV&oZ+d&h+~$U*Z9vq54IEOlSYtc1&ik6fTFY@FDDbk3?Oe55{M?K(EW zUSIO9ual5UuQ+tMcwc;Lp7oSR4aH|Xq>9?<4sQ=+i&~49<8lOgk5|U-o{wWA=J)^l ztR!BZ+BB|VR)zBpnU3jHR)jI(Nrw8D6caLs-a6dG3^QN&4G(eS^*~y%KPL34%4`yJebRleE}?Idwu* z;y9S3@I3Q_Dh85xLgcQmoT@=RL~I6yL>v&=zDo5crRGT(QN~BP%%8o|AbGmj4ft@| zNxgHvl9Mh6Un}w=q%0F`etp(Sbw$_XK5_ou_^9QR8ZAdx@_Y^ z84# zNESw_CkcDaK~TCp_v*NU9+wwh4nMO!19z_uWGq&2l0--q0Mx#W{SDowS7}NX{mY)a zjYbWT@|$N&r+PVvp2)7#3D|SNCT}Ewm*H!|@N6=Y?=Kly`eT0leQTqrbqOj&9=b+t zkeA5AwQawYoVgiD*Ee0fvQqP++2b+Ep3hx<6QL~Tjgq|H+7$XwaI5I{x}r>xyEEic z@g4dX$AjUisImZ3)Kv>p-$=`cGDSRP)UCc$R?`yOU}mZ7pm$o}(fq0x2?@d_4HLE_ zNX(OgKYEY0RmGccUV4mhbV;u1n|7g#b!bRRxdLQoR$rb{y&EEZ^!EYmV)_%Xu>W)YX)zO)7N}fQ@^wTOct!>=HMDq z<;>2E^SKHT%rwj}F zu_R3@4%eHcYp)xtIQJj5>S}N}0RbiA$ zEIwfO(CsYSyK0Z%pqYrK+iNz(A*+nd>uqP3Hq%LGoxJRWw`=@bGAm?bTd(h}r z|1(OG^0=wo(NxqKoE?$^$H2<`9I?S$IL?`eqo0!&Ck_W(WC-GR`h&nLHL3gbf#JI2 z^KX$T3`99>eGKSaPJ8nn{iQu{0=gDI^%F>3UT-a_#Q@3}!Y74sjBL&!aJ|-ad^7Pu z@oG%_Ix5GR`_R?OAT#9+^^6_WJQ4l1Lp&$5H*a06lSMB6<>3q#-}Su32*V;@Ch8Xg$unqvsztZ^Kt z2Hl#;Z9WxS_e(1tMV+&w!}_6Maut#+R#x)Jpa$%YpBcLZN(1Goj3F&&y|bZ1)x^_ibtERd&dJSi`(SJLr)ww47zx)LRNACSYfnTQL;B` zH_g7|?pHGKw_P1|%HQ*F25m^L@rcWgxLOig{mQzf0DBN)olB_!(9gEWYHJ_FB;~bF z#@#G1kk@#wbT5IiOo48(Y2w|NcoGH1i<8GaT6rcexsV7Xu8Kro4R-%Ysra;(2c|jh zNmVAYo=!m}C%K;hNwa{5Q_be@sS7pEJFvTbDA3MajI*{9se@$|=chs{8OgRBSE4dd z0cz44170&n1HA-1Vk{hmAr^&Hd@QSt?WC9U{i$y;M@%Hh{id!lC+hl~`Z+NjLC5*o zQChHjy0XiGQZB;1V0{Cy^o6cJ%w&~oNw$LR-nU!rxNqxNHkq1~M3r19vF*%#c`xP0 zZz^H|fqXrLR;*EB-J%ZFfY9j-q<~OpVt(;(2Pp4V%d;^IE2tUyilutp{DVuLTmwE0 z5F?_6uhZ#EY1b(`)J%{<~uLVj`^;#!5!Ll9?<>Tau1aslGui zVOaQLuLzt1X-v;_y-Vktb@LoFuerZRp&kwhktw-Q{@)O&eG6pjRx`+hG%Y?*%g4P5 z^ZTww`t6d2w%S-_u)O&a$%|2SJSiuc*C^|#_X{Jp?AZf+cOFc96LLfbm3^#U>Nd@% z^P5a8$ifqLwA_({+ahBRnW3$ zS}H^`pW#012rX|MOIxxxz9ZbZc~)Xd{Dq77aVpBS#P?w@0u1uJ*-V}R zBkPT%sFOY(dp^Rw{H1kaAdSaxxAnWrpz+u4WVG@=%-PWij=_?OcS_vNm%WTF1mUr` z=y-a;y{z}W+SqB^b+x=7LiO+&iF{YH~UO~LhuMC zzKo!o(W-;Cp)2)e8DhZkp#YQGC|eR^?^ted8#ydVwH{3X1i!Bm0uf`aSdL#!R)#-6 zzOIo0G0*gai%YwlcAm9fWLZCBu7&)49uIg&5 z3gb()a?c(r?RS;W9I3XME7ttw#ii6WDAS#GJgyo)xl3+f%s(opD zzkBa^DC-^gWETvXunz`Ld;03)rp#d*pR67d2KBo4n9<_mF_#Qee7c=fsy@;~I;A(q z9c?{mK5Wf89zF}&IGH0n(zrL2_<}JHK@3t7wt1ib5dF*msIhq3Izc`b;_%6%!dvQN zZlp+o_)-dkgT|GNiv%md&wAFS>zP0fF*PJJB53_ZM0X zxLObJ%JZ~y6w;SGW5jN2=1gBll|yS{r1vb6-RlGbIV<5@beI;rollZq46Z)(L? z;@3ZP{#ZCNXSc=u-*T*r?G>z2fJ5?Hbd;p<)Xilbj)9METJhgIdeE=%vUF78Lgc(-*Lw?5S#vpEznKR)`Su01+BmhCS+rH*Nx?(K z)s;j&&Eyo+2R*BncG6~l#9_Y08+)$;qhY-@n%m!EHI;audDPt{5mEK@8CeSYQ5OBt zU4|*RR|^*1RW36wpC~Xa3F}@$=b4Om@2E4#zMU_Q@@MpxrnKLi^;W3VuX;)>nD&oC z$4GIRfzJ}YSQYyPGa-Nj($Q1SKgN8|0eQ0>7dX^>QQ=8tGCf$?Bg#~KHjLX2c|Y3J z5ZZ3XzHk|6B;Jgr<6nD>E=)amo1pr#9Rmr1+dW=WuLI(lA}l1?O7kt~31WzvGA9Dj z&`ppdwBCR#Br&KjkRV7wGM!TG^^*YApx z=yPMY02_|0v$REIn)WX9bHoe2MPZ;G5m#Bm*NJ{y(JlzmL>36aJw^Rp>|71#SE= zH_{|Lk5&Zw9BfIRI81UYL=GTs$ubqQ^|2A<4pnZWBv6ap6`YUP4 z_pS*s?xOHHF`>lfrv}EY0Yb*oZ{{rf%JpW`>+Uv^g~xEykx; zGv2n1v-$+IjF>0=iNtBXdi3Pro25L?aOAM;@L1k3%5_?W@b$Uoi@M>Z^s-%O>1^>& zx$2H1s-ge<)XlLQh^01n)zwSdj)oOV1uwx71IA-C6P214+w}QW46MN6v%7&%4WIU< zfqwYPq^wqiJN2GR1g`Rwql;X2=~Y>L21>q}ocDQ3d^{rK)ESR=zCe-$E#miI^T7>G zA_Lr8`$p&VTIcV09h;UhTUNqK5|`Ov-$SqQ?Bs6C+tKG8mrQM!qHtQW^A0?Gl9{P9 z#roRK{iEmm)2F7kKKZZ=Eb}?E8O!$|JjYhBxe%r4(8aNijm_26f$!IN`zn3oRS2)2 zd=osgBdE2dO-Fb;XREA*V>cb)c|lBz9Xs8)cC{}r>%4eWw!z%Aa}x4hYq)_d*r>EL@tnLwDGfV z$8&+kg@1UiL+$A=4J)9ILJrSJ76jcu=rep_k7q?$jLAWr`XaVtRZgS(Yqz*zdchf$ z2E2)xTCeM5GmnkeDAlqax?3l}v_CWvs06I&No{;-9-3(;8i-<@=~w(gzsleLA!nWc zxPqQhK>;M9ezN|p3bi*XA4q+DWxss0e_mnhl%lx znWQAYb_hk+O~IRVuxj*`8z$?2<@IjpPkm<) zKNB2mw3c~qc|YAcza51X(@Q;G5+?t^xN9C0Z^QVlUvEf9Z|6yz`)wlH&{-6br0ZNV z%^(Ln?=orXZjL=Zdma=P>3N-VQuEO34wrAS^H)Y{`fsG<(H|6LpQSS`dJpq9S44KD zV!R>r&3!%C^_M{}&K7`l=)rDTExgedN7oj?m)Vy!4_d7+Xhik<)1TzO14zJ=t_v2q zLd5|!Q|se}_e1nCmVH+|#Qg&KNbX5ig^ApIdRTb_atZs-U&`>w+$HIe0*GqZ)e5FMx&fZO=({6KSg6EZKyn+Pw~*HvA-S&A$L z1`lQg&z?9c-}W%2)ji3=WaHsk@ab~qurC?M&uVGNd>b6c0Lk0cP=%r2i)?j;k66O* zBxW0#nxV|d^q3eJ3Cd%{eP6j$^sZ5=liAg?I{SG7NSwHPcJSDNgW4MeFpHvSYP*+k zUVz`5T&@5%AF^oxj@+)LaTVrr|1nfS2Qy2IQGR=D2n-aDe^=b{AIvGodF^z0ljWl# z<1aU6SK;XpQLqH^qwCY4S(KUMnJsrQY1>8am(B8YR{L&e#NAgO4yT=p)NX;LUKWlrUlp4}PuUidacdEy01MXv?C z9sG?Jke&V!%=v{e%L7Psz%Wkb-+2 zwt86yY_PE{n}4`Oy@1S8&GGu}chiDP*tJ(REiKPKQ$PcM?#NqF9_E9Nn{kr>SsNiL zWxL}NcXA_++MaeG(=CC|l4ng_mdp%PgU!}+Xm{VXA3Uc}dU-q@?x);sfD=ZmA$`O# zmB)cgAX(D^$g3OCglI zfEgRF^%s7{p=vH)UVuCPX_frgF2X{s9I4~a^ARt|9QbB;A-DKU7!F^QBY1=9H35Q2 z#B2w-aVXPGTU|bF-r&7j^7Yw(f=LnvX=PLnNsH3)$~Y4v=gnTPbk3r|JD}?zI8_NL zD|?q&>zl|YN7Qd`nlGuElXS~8zMmqzgbEeG+=JP)c;5aM*t7AEz#a}BZA$U@Y)|d; z3H_Bk=8e0prgIp7*JjCWj4mz*SAc9vrK?`S4+6+LuEj2zqY) z_V%1`UQ6%ujF@5)W1N2$xHXc;WaB(^RRUK17KjeJwe&%1n17e{OS>LGid*q#g6hIH z1t-`^W@pX&Tk3`Z`(oefYhM3dkrLdNmU**fWV1)qOs-B|H$u<)gm05+L{RsE9H2Iz zwRBGKe+*g?(u{7`=pS0isY$!52A+`{of2z$#Ut2w<-xHV=jsnx9J8${S}ed_?6?Kr z{`w~#Brr~t?|_jS~Y3_cXuL=?-KL4p9L> zYpo)SE8krz{6jF;38GX$Z9w`{#pURCMaAZ(2NZIBCA4+Eq*s-t&Qz3#8o~x8)j^Ht zY_?3BA9*^};8|qd-wZ!6+EnoNK7fD<&*mQF*wbvh4^(S2;}5L-1-c-<{IuW)tF6Hg zvqPTQ?Jf)z2fxXCzfoQq!@^;2SgiMW)y~>=4dMm0t4mJVR<|Tr1PaIL78bEPLSdm~ zQIbxp&QLeF+!xMiFOu8LO0Gi2E!<1g_%iLxRBuskzdy>vtz0K( z_0nf9P?{_D-g3|7E9C}~4+?mWv8BDTOIAl@=2@YRWqBXW9aY}X^Ih{$?}#t)%9&y# z8H-bD8iTr{dKgi8Q@PB*SMw4~SDf2I5^wqLc@+&xf9S)`LUL{9i0 z86cfAkriAQnHS7+nPlSr=ufA-_IbrIOy)C3wj?z}29ftKDOiGD+D)~vBH(X5Q?lK= z$nD^8I*BlBfvzM1A&)xKd2it?SCV~9XNx)>BCqj`*8}N324|n@HqS|%ZwwqCv&^Z} z_&clyNQ6RqydOZixMc@FtK32BmCBV)Ws{m-7U4xaycM~rb%$!xQ??t$?Z8>uIWEh9 z$ZXseT;hznvSAe2MVhTVN}Bp^=V<3%cph%>j)84e zc2Hk#aE_x=iowIp30$n?%nTS8Uvs&C8Xs79+0@9*T@=RM0N9ml0GR6$V_DXo*Ac&4 z3Y%uM$!9&F6ms2lUcB;6!=V3I%*1z$Nzxqu%XDU|mX6#>~!H=EBwbJApTLU_4=*zzhNqY%9`9hgMc4x#R z{&tTh_|N1SlI5IOoxl8Ik}pN*pVNBu40eEAmDSzmBniy!G| zplwd&t5VkG?KWwy1IC zs>hSiCs{gui=|%#th@UM%tZWBP&2$dH|yBi5ZB@$@V1ptqJhcqo3l+x8&yqf+W5=(O-|ZeVb`8wJe%i83bgs zc0bA6X{8`rL)r#*ZYX-nZ;Y};9%4O$C zEx*>BtaW54#tE=-vL~NTP=RC^bn7y|d}VTHSub0tWD>udU3J>}f!}pj<4YOVhy~Kb z%x9WCpqOo3OaGZYD?s$n-sP~pb}W6hBuPD4Z#QKasYcfC@#>~+NK`gWfxE1HEDuF- zA$(0JLY7s&mX%vqQu+^67PCYaie^Sm3TAH<&2?->inUpFc=cW6LyQ(Q`)A6{Y{i%0 z3+I4TwROwRA?QCbbj7^JyGd@r4osE|7b~jLVyRF&Zc*X(_M1{M?HwtYxcZVc99k&i z{SvTr_S5qNK$fUBjo#As-! zsLKTkn~pQR`m8uvU5?eX++oRMhV71T(UXe++68%h_ZflfV3X~Nt1<_h_lQk5^5Zu5 z0?lZ=39IO8xuHJzwGbR4VvnuuM>pmQGgnX4z_gL}96B2hAFn+0921+)c@ga7D-F<{ z2?0gzcXx`ZO%GwSEntjEYt?g>644cw2U!|Dw7u2(y@4OAq1Tjs|278Yy zm4J0=IcCyZ+_T@XEui=7*|tm2Q#T92lVTn*?Gw*ACL!{VvoKP_U1Fc>tv$%WHm&^Y z5O+b9mxOCoQG;BiYADy!pRGPa%sFIo!s>=njz-eVlVT*@@Pv3Y3u%yjqn~;`ph>Do z_%#a!B@@xrdBVnjYO%_wpKH@+!eSyz$h4Rvzrmjm-ic6MFJHX;4R8&6sT5iE-&^yn z7FA^C>U!D*P#K%McTQND>{86Xw!fk%qgyqGgDOR-%>z zhlRa-YpuEC{^OSUZ(Vx(vP}IsZPpQ3F`GJcmiOTiM+f>L*K5bO68wZ{0Hs`pc~z$V zYrDR`pzVS5nlmHScK2uApLzfx)S;rZ}LskC=CBH{Q7&a~G>x2S0?RW*d6 zqwl!49xkS)qDFY49Sl9&azBv1E zRZr4bh)IdEDIWUcxUuxixYK=+9O?%Qc>R*^Y&Hxao<|J>5j9D=c_e;mGYLg>9(KvE zt=|2Y*mWca*lVdzWRT(3FK*ZAq|J*rw)dBm$LqoIZcY}rnI()u_G?~bLAa6o+p7Z8 z3)suYH`A*hovs-}hbw}v!X+(HfDNK(PVenPwW7u>^_dXV;k{e;mF#N<@2Tl_zD{af z-@g2;7+orQ`bzN;mki#{xM?mk<)Ti&YmcFIgqNp{GAzqyl0SOkid6CCO; zj!4IY4xjUfT{=;4e05}X^&%ks-BRi=4jziJK)`a2aOKSZo zvi3b=U5wnLWJ|Se<%mM}gPgBgk^wI<0Ew;#*7 zUKx%`8eF&*Pu^HogQ^X#pZpSE7P=WWwD>K4fQxui21TSZZ^`qKXq$%uY<$#|({A;5 z;a|WmY}{ww@bQ)7Z0ytkGJjOXU_9Z5JOQHO+fR~;;jIF_7=Z^!W95_+CKfXabhZhF zwqA}DR~oFhOy%cx`VD(%C4+tL+^?3Um`8g)YwWv%pK;XU3Tw?yAh-FFCJRsPkyxM6 z+n8;{jX!!1gub{ut#OYxjBw$OFYWCNNO}6>8CvU|bNXFU?4KZ^oCmdO?`pVxfN+X{H_L`mwcE~14m7^gUa9#H@jf@G3Nba>lI?TI zBjwgLRbFXClVi}I`uWYv_0~vL?3qbTs;R5X9e=gNdOZA^Cln}|BLW73!ADnp zY8*DA1xyPmB%euYkfc<1+f5(kZ}sYndM3!4%DiN5uw(A;sjfkMnWT5hNrY19As$SW z1;TPp7IM5QR`_XAicwsNZ&tYZcl1CwFG7;MS(xrhd(!nt>aTZ_SEU=bB<6Wd=r0xO z(3Xexz*+^uFc2(i0V^2{kLLw=={bK~voBU^UQT3uhdSmg$qN(B41&|Xxi}kV*SrH2 z3>2EOkm?6@SbS-*r7ncPErL}EK36s79kSKQ8nm@xiZka#TTqj9ltyAwH+ovB;r)lq zXF|8IVu5kkq05q^Q&nPv1ZsM(~xc-YgTp))IFvtxU5N-E%oqAM|W5Bp*rFg&{;S;QdeL>xkWw>ed^ygGqEM;KoEKz9I z7QG!FiOA%nuFZ86^GX+XSI%^lPtUncy{F(_Hy7TUvuF?kb7ghzpL+BOKjDEluyqLha1ncGR4LOJ8Q2;uIj2ZVYx6|F-kv{+_*r zieUbjWqkue2&zM;bpCP4(nMbcMuxc<_WfsyExY0tf5^-mcx{`dzT=<2E`s^VA3yM4 z8h>NJyMmt@o?5?=X$Sv5?Y(zYQ(L<(?%r-iML&6@B2RQ^GE{xwuABHt-7@XmLtE2s`i{a7Eg8JAje4hkr%)HRAKp<=KCaQ61RqL zXQ`289|P{)aWeucy|lbl7y0Y=$(R0E`d-6bg|+rRkk$eClKyX?$^Gv_lb8B`vgSU^ zW@T?{r0O~}0Uy-srpW=bE>LLJ^EvM7f6?TIar_Hx!7@oC3)t@JPrJM3^JW1+g4Bvz zT9`8u>15cHswFT6h9fuAhVntDk_RX4WcIe|e1D2mg(vwn`{2U;zY?bAf~@2=U+nlV z9eJHt&F4G0ShsTE`~)};VkAGQ`-gZS##;5REx>oTS*+U1aoP zNb6iX8%y;O1cvGUk;9#W3lQdjphIg57s>_MicIb06fqW<$*bon+7{6Ag^(Q^E)=B6OS}#WXx$zc#!B;r@_c zK3Br+<#?rBM0wOHmu=xSb~MmME|?wP&;GXG;_cvoj72a;`6zql_@N*=tKXXgI%Bo8 z&$8SbXY1fz+T~#DT+<#J4sic!hQxUBA4H*ZlrXCmS?1^#2Jj9s%R*?wjv{o^JEe6_ zWgu3##P_v*DriN1XR&CKee;a$^J<#p4N~>0|39b50$|(KjVS_d3S^%AdN>0;5D(x9 zdl@&gmPcocQ;J7aV!3zRU4i(czL9PPU-fE2Z9m+DOr=PAVl3x-O~7x{TqJlw#OXO) z)SzUn-o?Re)+TWw766>K+BRa!4dqP3Gwp7k%n}c^&A-U1fbre<1`tITuFX?wYFZMiQX!e6%8& zFc@9qP;(xxktqwFJF86FaKD^M1m=slU^JgFBGz;vY3Pu$SY={`0@__x??z?nE~GS9 zO#Ajkb!uAn<&3h@Ji$y2<-!fgb1v$E$^osxXo=f;NGU9;?+-BXV%!DVbG9~$f=sHe zSZ74{Q!za+%pj?2kWoV63nJ_bI-^tPZF( z5~0O!P&)*#b053Z3;3y^fwgxl$-o*$~V6#UBU0E0cZKB?F?IB!6Kz9F#CS?clGJ89bOpaiqJAq4?e# z)u=vKu}F>2!N;2|CUYe+Y*$q4Fut?=vk!!w>o2G;eaEEs44Eo3vGBh|TJU9LN!{ zs8#XWoDlO!l1gQ{hw6>0TA^~IqSRI4W&BG81L9!m{qk$<5XtE8t1IyZ>DIpBYX-Jg z2kp-c-W^h6@fehwk4Tk&k-e(wl6zXGB$#(_TkV=-kb!cyyh`bKt&j|BcRRn(<%`yq zQhLKl>Q{RqP8{)ojAR1%B2L4LK`>fs5*lA@THxE-s}sU3-K!$ZaS|;a%QcUah@!tT zl;^bfASBZgCbE?7<281S*mt_*)xm?B$1$5_kveIk2@G}05K$<*pM6H*)iRMYJ+6-F^!ZxB zvr#cB7_THH&Wb1>FL9LPO=!)SS$M6*TyAWp+hdrsoJQT?CcM51Yi6R&TJ_Fd-2kkV zeoeCl`swmBX7w-vQ-`6v!1>cFmRFeOH5hu|W3l`DT^- z$k|Gn(3ph)3?a|E{E&h+r|AWUz7unH1)^0o5)gndbg9_h#(VevBEHiLaePem_T*tN z+x2kX^6fyyYs!KT~Ua*5rZ&E8Dj7l!4(SZvjNHx4>g z^Vu}$w$y>&iDr4TDRt;P{O^l%9w+t~T~OyKwge6Ela4$@Hd8;rSYhV8W)EdL9f3af zni2jhg}6G=b2>1|PqTfu?NFgj}LzDyM<&8PtRxtp4p11{#e1k5d-Ax0J?44jGzP@t)%H0K~qc!<)BqwYD_4)RA z6A<>lKbM%+CB`DcbZPW*xo^}*En~UmfT+7!&ag*^hT9SR4f708fUrcMD6+i!jpVSR z_Q%7Uo43`iifO~HdS+RbIg4ApT$j zXUh|g&jI{T6@(9C4}R=|ho-o%dp$=pG*fQ;VBrE}5kc8xbr*EhrtsP>-#j>hLZ=VH zB$1!fUK!3`F4?RyUw!!4BS*dAF_usFO)w_!KXFR2!H|H_x1Eq1xd?+Ww0hdo`}Vkj zcNr>E+HlMy{?QYe=`*pcs77iLTX7JhNDpMUM4G zTe{NKnHjheb801$D+0{_TW?((swSIb0rKzpBlt?Q^{7K`n>6Uc0xhmFBxJedLneOt zbxyam7dclAomr&kK7d-U-K%&v+8YAPZ8b*%L%v`U$3AmSv3Kd2(dU5OBy@tnwq;V0 zVj^v1{U^y>*|hvk(e5@E_|bhL;nfb+wKGNw>7h=x58{kyeMHw&-^O6g#?Ry5I@073 z68kjyaLO@ zE8+FNBE-twE7Hsz*;YjKjTgu(64rC*-!3W-S&_!57PI0TJbgaApsPG?hQ@JMR&+ft zC`Viwe3N%;6giUIAjj=ydnr*{GQgMVE>9|5DSTr>c1b967I0U@scRss|E%f~2d)dfQvQJL%;q73FgWq)u$`a^uKMTm6G9U_B0Q|>`{*ApejU-bI%)_D%r zo)cAI>Czv_wYJN6o~R~qb@?8Uo_l?}!n1}jNx87kLS7&RpDkJ=-#pYOzS#YC_|Byij9ry? z@5&P{GgW6m)Mv|4xJ*zk131+3*hppwi=vNgo0%p!1*EYgwR^v4w#}4X7`jt1Dmed& zFrbs*yr=TcJVmn_5iu+-8m2RRB6;XVz(9asvG#n4G%s8cxe6glEzXz8E>{74=*QK(c}s*OHC18M zbH#>FvL^OqSN460G^tOnDAUCoZGTE_#k!6TTT4REDO?j3?Mi#eo9)7_5^}#l1)TI@ z3d#Iu*r1s)W8l|2IkV?{1k64H+6)%xg6ApFwl7fZgma4C}HJJ=9>5m{(6e!kCY) zwUxC+Ui=D;BDt``p`~SZ8Ivn_?j7xyDnjJMrE9@`5^=aecp0nPyxt`>6eLsMa8xf zBlAa#n9?jqjR43#S7zV$2j~dJr;nZ1&5N~NSe(06a=&=9W_|LEa@ozWw9^_8VRZ;W znOE?}Z7*m!v5R&aqx2U2=BG0{Yl@Q`M2?|84H)%%OUC`7-LCZSD)Q*4wCeLDm7Jnw zuerbBBI4G@W1#i2&<#MK*CC61Fwp2p#S!72#QyVmGJWF4eZO~3rhIyytxbOXJHrul z7Z-cZ*55C3G6aDxnx@M;y&YT$)y=xqQeON!g zB@Drz(Qy>8TlO_ym1!Ps_@xlTDvGIPpZ;Nic#mjwQ+_dq5N+1VQh3tPZ`4feWb0K)7lox4ggEVCeyUyhil zL6ftijkCl~8h2_B$i)Z=>R_agvE1LvB)l~p*+3P{xvJ=YY?V*XY8uE|s3T}VpSYVb zbMJX&Zd{K_$5s_Zu%xHDNol=Q?~*W3ENQ*mjYuemtU^qOERd6#e3riIupHP=w*BX=k%~Q{#K@4yrmRx{9EE4w zIG&n`bPQ1UyFNOrgjwX#C7_$Wi=W|pT8~?5Aw1%eUnL7*U*n5GA2(w-Ev7ji9iJ_U zGzKV=?b64U^GiK5W7)AAB8+qNv3fH_r)Fo}@J*P8lI|qZvYV9l_#Ls#jhj)44wsaU z=Q20O9C3lvYpLJ9WTQ)fOC9FE!9UCBqz*xIivQvdQ+{#@0P&3R4zN13ng*|*50xDX zDJV2z*Jb03FjIDKTng&1z(PHhB7!2XnyqECu&*<^fQK0(Gof%$$y51~kEN<-ghQQG zb}CKreFD)?D7?nfw0=q4*VSk>MUCXo6?;w9*#RZ_*hrKp#WY~Lb8JpZEnB)iPd@gGx7nHV z;qABOvM*FbGO!0RTE1^7W(!(9Ep=KUkEOv=Z$b<5Jj_9LXN{Haf}J^l@pcvL*>E#2 z^zo9QH3P(S0-JsVj_JuO4eE}G_ZB`ir6s;^--(N$h^0*2&2_Qt43y1C8yvgVK=K&m zySQxRD}}8WJjFn)g$mNLi?rFK88<$C=>o7$@W?Vr7MMpfoSuHJc?Eb^YXGvM1<||S z5eL~zKAfy0VIe?A^DZhBp?feGQp9GH8+v&!a7j=d+Ujqt0pPZg8k=~eIDB$7Q80H; zZzSdvA-W}-UO;v}4vsF*S9b=9?x@U}2Jni8H5k@eSQlo}Hi#mE{QhEb)(J~*XK?I=h0%#?pTctQn3XTr6Pw&*cj-n=5=eC!&SnV~S)5K& zeWUVQd2wI)0=U!oT=sAe^0Z7xdi=6u*ecS#1G~A1cz|Ky$#UH8N@*iR;&IOOEI|E; zQq91Xi&iUreB&HpA|U&W?Y8D8=BANYbX0UOIa{uH&aonct`v*~`>Gy`ce*A%Rgq#r zNYz`audw&|VpV+N%HfxpTepUrm>MH|#Gpqe>2X}U>ZaCvf`c#Gz3+mw>lm#Wi7x#J z9o|ZmIgd%Hq1Q-nV-{{2-?yA}KY2i|^r_tYf%AfcS4Uk@v4o3X%7knU^@faQE%CEQ zvY-5ry7_G*)$i4XGb!@G)_84gBXsooffeRXi4ik@F$sIWo24?uI7lKt@ija41Ib#5 zy!mg;Bg)MVKG2bp?Y+MnY;J6e`Q-->+&(^+;`Uw-dctXKcVY!{$z2<+0c>nA@u)U}T81;IOI0yp+g*+-hgTs9fF@2dJ$R7m5zdZdn#_hA<@&BiX z>t7Pgg)cqsnWWeKInf4`$;TnalJ(H5&FH4d(lB z!uLxbPEA1*kQ#aU*x%OX_(dCMeIYfeBI7uFghVyZGImy zP1`OeHox;yGuii_c%O=?vZ^zqZ=4GUT+`cI``mg3^_aI)Zm~Ap z@E@o?A#LYrn!lC}Nv<2Y8av!)Q)tVxQP<+QAmXLkV?G|D1*chYzT>X9`Pp<}Yd8e! z0b;2)=aS~9Gwsit4;QKSyX30~s0`Fj<_c)s|l=g0sR;O zchRpA5^5WlYX-stDu{ZHug2^Hi%r44l0H=RbL7_+w%HE)6h&aG{5vtT7e2h0^q6RF z*xKnt{@n@oO!XaLLIxBe3Ro1d@wQeB3*H+t15P#XNMw-EOxvzR(THMn?D&*6Hs1kT z%g3tinCQfpdmbH9P#^!|O#U9nUfo;ctq!P5^+4WlOx&4#>>X^MHI)JRa;)8h%4L-d znH(zs=PYx&$3D$6ztU(>_$4Lhx`%#?-R}I-_q-IfLWQC$t!k_6vDeq-W^ejoZ?3Ca zrl8*siY$obfY4yUsbn4%S#_yj(0TPY7n_tu2rjs zylLSp0Zdc)xR)LvX3Bbi8vr7o6PtS5W+>OnkVOOI=uU3^^84s+L5#K;AJKND)Kn?F zgtq51{5cKXh|)c1(N1*B3yoLR*9`>g!8cj)bZJ7dha>=oXocC{go;N*;}cQcI{w3_WD$QWi#SL zmxuPliX)DomZoahLW$P%jK-72G`#Mg9xfmwG^Z%JPLXPGvDGgI!}hfY1*OE-riHy=C&3wZ>jJQu^zm6#WrJRChT z5~~R{F_H3%25q=$LefrfazKOdK+K2E%aOBFxBS@mA~fd}=a7zP)o15buIXGjap)44 zT+O@JVPy+$_Q_G?99#Yn!E`u%eVo!Lmt?E;WxwyV+ph=U5yeyS#ltePrX%Pgtw~2$ zqs?@4z%TxO?i#yZQpi9Qxn{m%w6?BykDvLxVF3{2CRu8q z&Fpn@IHu=jw;6wHkCdm?{x;&vx5(FkjVSiST=xK9%@~%RNEE5AreAWc&d5CH%D(67 zv0!F`GFTAAFjquS)YERJ_3_3#9@{MOT^(#e#uNOs%EjXG*~M_f@5W|ZoG$8mUToW!bRN@+5rUVoR;r)Zk+M`3VC$QvL4Xux=0zwe}Wie36# zhE&%IILjORd#^_Gy+Qgf$5jaF*MhrR=InZS7M(qSTx)v>pB+}4 zup3=zUYTGe36-o;<1tK3c$da2L=rG@;(dBE5yFh3_=g|5bPbr-SDIzEe%?ldjCt!m z%Qt%%z5=1SQlp}hw<D@P3=p~22BI_4d-WAWTTLj#6v%8ZLAmn~!T}%yk9po$Z z&$>0mfV!BK^!SJ~p>vVS;ais{;KRFE!@WEDIK$$c#qkksHK_0|x9ptNyQKTm1>m?P z)mgdZ!J}T~$}JlW?f0rLsGHuNy|0>_(9U)_@b^bCfMe&wrfy3MWI$9Cxu>=LX&Woa zpRcJh9+6>4Q7cPMa^a{?xsIY4`H&JHm1t>NS6AwgUxNs+zTT-5^BQ}3MUlr{{!3UQ zis4iso+apF;8^-+^~)W+4X>qHqz6PwfA@2!sPNo+Nu8*Z$xL(yJJC~s7K#Q-dLhI$ zRkUZo(cZR{SG849mzQ^L5j_BCH;IWf;`56i`{5xXH`WxFGm9omA+y$7cVh_)80)W- z_kPb2*doO6FdF0Ya47T6bU+{)-uu?tmSx*$_M7cx*~F=}^V&_Z5`;axcoCfLS!!3BX6rMIPci0IuN!KA zDxpKAMsarwl_6SHdgmOIjc=FtGdaLbC6zHF`a(!+)h~TZw|yf4)#q_l5TiT#4dZLB zV5#DiHxB2#^qI@=RkXF;4IIu_!)c?`FQiae20zrUrTzk^17WIc*W%m-;A~(fxwz4f zrZGSSyMj4#>Z;zdjfO1I ziWnK@Y|QOwtYl(U&2|8KgHMdZOV5wn2K80*^%!iZWjaY&xSO=YokYA}U-N!lkkl99 z22TlreXTN%2Ajt}Q%(d(pz2Xb8@^0GGm-X|_rAu<<@=OJ7E4=)4)Qqx^gXlib?NO@ zd;{qHp{=rkFk#Zo6ix|G8{>SDO%_A+D8lj(@y#L7Y^j}$?|JEA) z4~FX}{czc}zqp6z1v=`7#hHF?D?g%7Zjxv+aVpjV0F(cXan?`quUU{QLxQ#{Z+fcS zuX@e^_+2jiZCiT$B+YMc#PQ8)1U#Ne-=chDqo4%y>Fmqey9?rRU;AJ@3bybiVQ!d> z=r**~c(bvi&2??iXH%^7uElIg%<+^bj51YCbICj0cA5lHfUc;E5!x#;rOM{mE(xmM zP`5nehp3#f9pG7q3-Sp`PJ&U>2;|{y(Y}*Q36o<17aw-DZxRB;{N5l|0o@UZ_Gx{7 z<2`>_2FKmn#R|dx;^$5fSO4>AvP-ylR6@c?2mTMI$ZOBNRktmv>^Cz&>Za~yu;$N4 zg{m7vCd`@-E~vtb7xeftQ^{(Tu|!2hu-?Gk5>=n6LG!z6(9^5PJn{CqyO2;?(HqEi zzokN>0*$pW#LnUBq`FmM32f_b=Y1=pR_rakFk;Atr>eY&PRYRkVr*d2fQ6@tQqChap_pKE zY0aJ2U3VIDR~uq#EYLBOet6^pp08c6sJKd_AVWfjQQb?wQ7c5HfVrYK`_04m03p+5 z01}#B%an3Jy=McsLGjh;cy|0EOCB7+!98j3+kVZ7TEKLSOIfWpZ9ip)xYm?cm@c8L}! z0k!+sgh1M1PhC4FMwju9o%4b0)2DtB6_LjeVE$%n_q?~X7x?$?s=T{in6Y<##w56z zA$UE#rW+i?scW*NUGhDv$VmHKMJ5EyF(AZ0TXE7l%OqcS*D2q-O@7ByQOtQmMx`F| z=p+B`E$#GXiKUmJA6fEgE#e7_RpaoC2DJ{Qd^Lx1!<}qZl#P(|)+4u9j}gm3W1AW7pFrudhOxCGSc^kQF$$iixNgcX9kW2SJ;qo)$EXrAbo zYm(Z#UFxETbg2O$Xgw`%w5-;)*#K;jVpe%xXR0FKDKJR)k6D`+3x@+gLLTC@P;|rV zPo~l?Y5)X|C^W0nmXNFWJIy`+&fQ}z8 z)wbMwiy^?tamrmcOO}FEj{~RNb7(dq|J|SKd=t*$P_B(e5ZiIpio3XRb;Opfi3yRZ z@*em23tY1x=Jx1l+N6&v^V$%hLHLUCY(lbl@}gzM%R`wawuxE3hCXxGTJ2b%VWkjr z8xC%>64jj6Al8sdTG8um3C8a>Fq>kyw5I{dC4Cn8YQp7)#bBlzcRy`>Z)q=n^gk{G z6HbjD)$NskDh(Mj+_mYeJxA|a+3FfId57x*lupudOqmVSd+()7-CHR`mf_C30by4r z&PTUOY@>W{PT=hx9<5m}@zl1w$D-GR&rj~J#H8W!?rzpEI+S9e-0%#wmbX{9GFFI| zv1iX|JGInzz;n1f5Q*V!!@W6fZK&C6!zHScJ5NM_m?U5!l1iQaV&u_~i_o8E0Q+d_ z>H1}RxR%ngI6oW-U;%~Cvz8rQ{KL=Z#&%IMPpl5U1; z-kL9SK#o>Y?oBIuD;3gB&Cp8zFA`N}cC*ibZn!V_BoIDv>afrt)C$JF&CYnsnBAAd zw-ozGq|pG>MW3v7R@a|pW{$S#Zx=!`dI$dEx%Jds0iuswrLTtcTKrjxuLsniouMo3 zEj6}pbW1lHm%#eEt@4UGQag2s$=_oUsM) zH>%XI|7AOh!&Hr{fn!=}iG(3-g)kf;Z_Got`dBtR^^ez)IUci+hRN190L@pdKwmo6 z?~(HQ@gd@smky4DUCwkubH_5aHFmhb%2tR6C_69Ps ztFm~w;LZla{8N$J4)JHdDDNaiKiKn~=T}$MQ>gL0pW%-=3N{KdVaJ6?lqu*gSVXTJR;%tc*3M^_nNc3TpE6{wkxe6 zHk@$%j7nHpr#q#1R_?a%AioRY^0~yYg{PVql-+n^GUJPV9EKBzYo^^^K;yO15VC?c~uFuXtxGm#IeLE3X{L zKs(>-CtJ=Dija*fdRIiXuea!Jm?E`CuxyRC+E-D#S()sjV%6VDLbbbnJvx1Qk3QME z6l}SXt<7-J)_$79vckV1iOvC|J5%PUH$I(Ta7W3Y3m=0S$#bKl+OaK?4ZaF>lEDY) za0o!9xQV5d(DO@{$nO-Z_Kd1nB%4U?l`rFPry|ksGF}G6sv_?xn^qbFnIr}|F5!Lm zC6t6#2p1O8*yI=od$;=wakcBFIKmzutJWK$2&2%t0j}N+CH0IA74}psVK)( z^RYb5P^~Xse~-J}cFly=fjrOmhLg;i0r1zv46~EvioD{{H1!Z~c1NaRf!IJ>qdY!9 z<8x-$!JSq0gyg&6fh&mByh^&&U7P$$QK54+VXTV)E0~&sWly0oCbeaVoc*4c>wb+i zN@?a(IPWA@M3+rGuR*O zXFpQ*Vt%pCvdy3ay25`D_+esGP8`J%li}H!8JN9w{hHJoypZg}vQ&xT5ttD!cUirb*8de^P z^KAwCGYAP>nj0&&`2L+ZW~M)}g0e0B;HI%E4<&JJhld7s_fk-OrUE2L2>eVs;UYPKwUJu*`zh&^MGA$ak7aiw83`x%%Hb{YdMmnHqu}+ zVwQ63Z}!Tg$E&v@pk76HNE{<9-%?PZfA~!qvMPV5kp=k8iNF2k&(+^d&;F8a;rBd0 zJ@$`jo0tEyXCwYg!m3KFKh;;OZiS}*O?s8*ryt-)D&`jFKFAvQ*bmaB{6U3B0G8nX zU*96XQPGnJ5j@{B`@k{agZk|=%@D!ytwB?dc}?NQ9Q$2-#{Oj=QbwrVJOWty@}*)<>|&{G{BdO)hk3^&4$AzZ$_ zKT7Ul>6A6f>e8MjbeA$2noNlw-2rMxlR-ceXv}IzM$E!y#&$m%5w<_hiBCB9M#=RQ zp}pO1*cydQfz!n>r$(Qtl{)xT zEML`gpd$3f63N-CrD|_mlDrJcai(^97wJ*pd=!%wA}E6T#N z9X|!CwVScGYl2}C)#|qg23H<#Hm+IV7^Ha0_wVsAM|7xRWUcRa;5KIu+6x;~#>?^hP~&!~2=X*}6}_YpUkd8Hq)ZV-ZwH~;|MZ^p_WOusXd`-S8Dgq1$FxQk+q>^JJ+Tn`1CG_0@?epsphg==p?&vHJ1h$61)98 zX|HaMSxPr$4rT$gP)UQ3V{q%HLlJi_jgmykEc@VZkSVt27-9>}L_%b`Cpk@O(;I$- zHr{U5K#JrmF@D#Hpg(#Pf3zEEOv@FRsOVrYv5=DB^!1c{qt=m(+Z73zM-Evp@V4G! z7FkRaOrPGYOvrd#V$Z~_bXR%V#?W5;xNag0nlJ;7xLiuAtJiJ@LOhhfvQ6@#8kijN)fc2}uEmMIp;zb-Y z>i24rpB4PMp-KGX;d8*0#O?1Ku6^O_n&e>Vm_=0kGpYIkM3XqU+%(sn<(BNMo^htb zu`1ooy1qt<#cY%wUug*jW3lPo=V<0*Dq*c3j4-aiw`NG4Ol~*j^Jv9amguq%>Pg&Y zk{8muT|VM(f986Me)lLhsGvIRO8e2L+F-+%-B=q;(P$4pwnG0*YL;I8;GvA3p2IC0 zY_6(bn`+LddGuEp=g_`SNAg`mHFqV|4pk*-gZVS|*lOrUW|x}w^a!@C=cF&X+t@8c z#n>u%J~fGAo|Gga+_Z)pRP1Ec8K0J8Ak=kz_TbU8BX_dE86yJZM2?$bE~NIx-CW?z zav!%!3uE2sS@^9ETj3D;f#b z0JpY%O`-^RGoG(``aa0`jz}|f`R3_Csr9$49y@C8J-XPFJlTA$O%{8Fe6Jq5T17K| z;^mSSpK$3llUSFN&l`>uF?Gi1=qc80%eC>v^uMbAE$E@J%AO1DMC^s8e!Fu7#d_{$ zB>!78$cFvZaBxzHY+UYL4S3P%3^j4}z`5y$-j}qp+86M}o~Ro4a(YJKX*y&(PJMkP zLOAyaKc!Q+jya*WcB0v=n0Z(v0>IxQ@d)3 zM>=2>{B~4Gb;u{0Pw96YqV089I;EG}ONX3>@Fy7E#2#S0urX!&_!yV-2G3ZKK-)H%nrBRka9uEGF+r142KY20Q_4I>&vZ*2FTK;P;Y|KlYw8Q7W+Q$3F+4a*q}cM@CfUrsNUEOc6~ zb`nFKDM91As~BsZo*~_Cu!Q90u~~O@rZQ!Io$EdMUf`+ieE**YVcciR`v&^c$`@4< z1*75@<@3#6`exIM`ak*@O9(1Km?4&`A_F@+8Gs(#q}}g91F*{x*~wm%)dF%qtE4cj z5$HuMn!-S~biRI`Ui-}x`?SRPw3x#F;^ea4dr&7coRHo$4MI@#kqqUcP_3lbn&C{& z$vd|)7VNp9lb^nS=vWBbI|=EfVT`%~gB|}w&v+vBx~BN6lp@otLaQjfoLTzo8gCq# zzMKa2R&fuC(eJ6&nu}ZlNVRA#t|Mmxcq62wZ}aChhOpMf&voCunv!tS(>&(d;Zj>q z`p4%E%UsltD;c{wnOb?(fFR9MuL5-Co5KG2iJMJXn7seGSEcNXJ__pa2dPeEs1iu` zZr2xZQ2rC?-8OTBUHroQE&ILpPGdA z5jbLrna8+trkk>5kf}g7RvEt`8}|)El!V@4|1;>tLpc|er?>3`?3c(>j;{nX ztJB}=o9yHye0gw2FzPk%(i_&rH?(g&_*^EmEuhth!8evXc8?)e+|8)RHfIp>%Z>*W zI{Rg_sW(J+WcF>u9Ibvm_gPAN>;2Jp%(7cs{FPshF?o}{?JbQf@sHwRH(Hb!8G-&j zxw!v2Emy(>Q#N5Mqa=Px-{@ndPT-(4fGLCc$p7eXt8%A_XPOSadExJXG`~%pn3W&Y*NiN#{c~QUXOZK#!)h%&_g~`pBw!6MopPgS>Ip3s&O;Qa@v_MVbTV_$a>Fq!WKF(aeIJ~!4#arQrjoP)6=MNGB4?In6IX@>>d zd;6pi!-0!7>dcU7>PhSU>w|;d_!7k*wzWj2fn{x?JiTex4U0WV7-e*qfs%q=Spbnz_E;#lWnY`i3B;<7X=9nk)PEk2%MR_2B5+V` zjQ)pz0YMtKKY;J36*KK8I~;JP{6Bb52Rggo(a-ZR+E8_kfd#YSG@j<8zc+!>M0v!L+Q(l-U&WETv;760{wukHgUi z9r}jCiyi}tJpoaO=snj`SpIp~G7YSYuj3c|wX!9A9r#%aIRm{OOU`O>r4U_9D?WPO z{NqpocK^IFPNV0b-IWdD>kKJM!uYXMhpO~{w90jMBMbAZ zWt*S~a{Stig7l@|pWz%kF9YrQW>&qWTXBH5-TbbE0X=1_why{CQB!g-6E@ndi#-0|lOK5{qECWUG6?PfMr-SV z#Qr`m35qZ$P5xsgA=UGLuY^La1Q@QrSAylI4*5YPs+W|7q10KU|LrpvWp@hb-Exe% zFEHi@d97ws_qjSz6nn4!T@i2=#@vBoEAV=HF^K^s5_Gzd^^pw$umNe|mUk z@hi1X`^F6L0kr4PGbHNA&{F>Zt}1Fa&5!FD(-?4vAJ_8LpXGr+&8Z@9Kd#TgR2R{Y z>&fY#n?LZUaNSSP_|N0i&m#X-`Tsq`^2m~cg>8*abP}_;rh-VWWE_PVHnOHU_>p~F z-ftBo$h)7KO`X|CmWyh{NQ#5<_LaruP|(s^)$ZnQu9W!Js9cbh52 z>7;k1Qph_SYl(Fw`mWJ52a86iEvXqwtrqkW*($mI|EsTSC@CNkEsU4~d^Db8+n|oP z>Dc^g7?jXSDTmEbKUTab8vJFIDWg&RPK3i~@-U2?vcp7fDHy~uc<0I-Jcs*pkqw$= zy)-(0Z)b_Lh`t{hSf4UVO6&V}(x!`vO_2voLWsu3?ri(_ri6VcrbK?;neJT}`FUtP z^h|QR!#ZrIK72irJR?aN0&S#5Ha}+Dsk<}w=yx&!y(&!J25q(t%sjufy5{F6o>?#wvZ6Pcjti0X1v93>k z;k;WaJ3n1MCCo}$L+=vyMvr_9^9FD3WL>%w%h8Rn-fJ!2C=e_KIiA@d6?^h3#cw>? z4l9A34tft>n(z!QUxR7By2XY?I!-KEN(Zn@_wVg@X?e>cK2_2RB<)g7L=-o*cn6n$ z+tD8&1{`dBRj0kUeR@+!-?la>-7tN2NlGH6AGEDW8h~w#=AnRo4C7Ui)us@KroK{8 zgv4|eY~94<@U2QGy@gBe2>zzZg}edQ-TaR&wTo=}q5kbTQ=YnJnr}9ZqLEsRRc~{J zdmfH=+;Tc@K1fL#-D_WXU)<&lo`1Yb0RE6DG~NjB!KQ%j?QI_;P*y&eDZthf2OYVv z3-C<8L5`%WIr!COV5Wem5z%azFO#Ii`YveVpH|3hxQDoC}>St%U`o;mOskq_rKiPj2Y5sbV}Ezwr7%A*jYQ%D+`A zAGD$tnvT6#TshqjMVeN=G7V<<3W#I zrG$T4+-rb0cE@$n5WI=zY7h624N)h1u6?^#!54&vX|SrHzl0aF+PHo&a2CBkzQhBE zx-gJPx92*QvQ@uobIxh4R&YanNr#m%Pi=ME*uCzu(bxan*FOi8iw>lb(`lLt9|;b0 zewYfo6;VPN57pj?2h8{K^a|f6oMtofe%F~wcEdH~kXb;qd|QCB7Wn<7CtAQR zSd$biJw!1b@y>Gy6KE~`4&@EUnNMF*#x*CNE_K(Ae{1wz-zLVWv0^;jqdhQj8+cmt zRP8DSh%4x_GzA@AI8fD;zSbQl3i2Iy3TWwM_m{*d=)2h8W1 z%Bh3bcITnHR%fA-s{)H|;-Fr&xP*Xbqev8A=j%5)KCM$cY` zk+vqMyA8N`pDy;GxAazvR)T#jE1q&KS)4FOA3<%%=jVFrp3Bi` zV%eLK#EfD^B^U{C52~dWtx_>ZzmKgaz+7PG; z#`doZR#_0~VKZ1_W2CLpBbKC*)wu-B2QXEx>OE1~#xcNGu952--ex#R@^oida_6+y m{`XteQ5cy{LWQ|dEJIM|`!`m@0nyYilod4Y=F2~L@&5rYvuA7o literal 0 HcmV?d00001 diff --git a/sql-odbc/docs/user/img/pbi_select_connector.png b/sql-odbc/docs/user/img/pbi_select_connector.png new file mode 100644 index 0000000000000000000000000000000000000000..c9d3ec8c4dd484e33b17ff777d940aeafbff1c77 GIT binary patch literal 48760 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

    -k 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 literal 0 HcmV?d00001 diff --git a/sql-odbc/docs/user/img/pbi_settings.png b/sql-odbc/docs/user/img/pbi_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..0f1dcac98b905f434130c7d966bb6cba87247c6a GIT binary patch literal 39406 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 literal 0 HcmV?d00001 diff --git a/sql-odbc/docs/user/power_bi_support.md b/sql-odbc/docs/user/power_bi_support.md new file mode 100644 index 0000000000..ee89757e58 --- /dev/null +++ b/sql-odbc/docs/user/power_bi_support.md @@ -0,0 +1,48 @@ +# Microsoft Power BI Desktop + + +**NOTE**: **The connector is under development. All connection options are not available yet. There could be issues while loading data** + +## Prerequisites +* Microsoft Power BI Desktop +* [Open Distro for Elasticsearch](https://opendistro.github.io/for-elasticsearch-docs/docs/install/) +* [Open Distro for Elasticsearch SQL ODBC driver](https://opendistro.github.io/for-elasticsearch-docs/docs/sql/odbc/) +* [PowerBIConnector.mez](../../src/PowerBIConnector/bin/Release/) + +## Setup +* Copy `PowerBIConnector.mez` file in the [Documents]\Power BI Desktop\Custom Connectors folder. This will let Power BI access custom connector. +* Open Power BI Desktop. +* Change the security settings. Click on **Files** > **Options and settings** > **Options** > **Security** > Select **Allow any extension to load without validation or warning** for Data Extensions. This will allow the custom connector to load data into Power BI + + + +* Restart Power BI Desktop. + +## Load Data + +* Open Power BI Desktop. +* Click on **Home** > **Get Data** > **More** > **Other**. Select **Open Distro For Elasticsearch (Beta)**. Click on **Connect**. + + + +* You will get a warning for using third-party service. Click on **Continue**. + + + +* Enter host and port values. Click on **OK**. + + + +* Select authentication option and click on **Connect**. + + + +* Select required table. Data preview will be loaded. + + + +* Click on **Load**. + + + + diff --git a/sql-odbc/src/PowerBIConnector/bin/Release/PowerBIConnector.mez b/sql-odbc/src/PowerBIConnector/bin/Release/PowerBIConnector.mez new file mode 100644 index 0000000000000000000000000000000000000000..5b397196c0c0119ed5856c1a8bd1095d52bb7079 GIT binary patch literal 19463 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 aY&^H1EQHqnHy Date: Sun, 19 Jul 2020 19:46:49 -0700 Subject: [PATCH 04/27] nit --- sql-odbc/docs/user/power_bi_support.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql-odbc/docs/user/power_bi_support.md b/sql-odbc/docs/user/power_bi_support.md index ee89757e58..61f620f44e 100644 --- a/sql-odbc/docs/user/power_bi_support.md +++ b/sql-odbc/docs/user/power_bi_support.md @@ -10,9 +10,9 @@ * [PowerBIConnector.mez](../../src/PowerBIConnector/bin/Release/) ## Setup -* Copy `PowerBIConnector.mez` file in the [Documents]\Power BI Desktop\Custom Connectors folder. This will let Power BI access custom connector. +* Copy `PowerBIConnector.mez` file in the `\Documents\Power BI Desktop\Custom Connectors` folder. This will let Power BI access custom connector. * Open Power BI Desktop. -* Change the security settings. Click on **Files** > **Options and settings** > **Options** > **Security** > Select **Allow any extension to load without validation or warning** for Data Extensions. This will allow the custom connector to load data into Power BI +* Change the security settings. Click on **Files** > **Options and settings** > **Options** > **Security** > Select **Allow any extension to load without validation or warning** for Data Extensions. This will allow the custom connector to load data into Power BI. From 4158974559d9fc35e6ea0a610aaf0063ad0397fe Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Sun, 19 Jul 2020 19:49:26 -0700 Subject: [PATCH 05/27] nit --- sql-odbc/docs/user/power_bi_support.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-odbc/docs/user/power_bi_support.md b/sql-odbc/docs/user/power_bi_support.md index 61f620f44e..fa994a9a56 100644 --- a/sql-odbc/docs/user/power_bi_support.md +++ b/sql-odbc/docs/user/power_bi_support.md @@ -10,7 +10,7 @@ * [PowerBIConnector.mez](../../src/PowerBIConnector/bin/Release/) ## Setup -* Copy `PowerBIConnector.mez` file in the `\Documents\Power BI Desktop\Custom Connectors` folder. This will let Power BI access custom connector. +* Copy `PowerBIConnector.mez` file in the `\Documents\Power BI Desktop\Custom Connectors\` folder. This will let Power BI access custom connector. * Open Power BI Desktop. * Change the security settings. Click on **Files** > **Options and settings** > **Options** > **Security** > Select **Allow any extension to load without validation or warning** for Data Extensions. This will allow the custom connector to load data into Power BI. From 586793f0d70894c6042fd9177e83c88f24cf4164 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Sun, 19 Jul 2020 20:13:33 -0700 Subject: [PATCH 06/27] image resize --- sql-odbc/docs/user/power_bi_support.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sql-odbc/docs/user/power_bi_support.md b/sql-odbc/docs/user/power_bi_support.md index fa994a9a56..42163505eb 100644 --- a/sql-odbc/docs/user/power_bi_support.md +++ b/sql-odbc/docs/user/power_bi_support.md @@ -27,19 +27,19 @@ * You will get a warning for using third-party service. Click on **Continue**. - + * Enter host and port values. Click on **OK**. - + * Select authentication option and click on **Connect**. - + * Select required table. Data preview will be loaded. - + * Click on **Load**. From 9cb48a4fffa2aa88b59917da2961cba7e4849580 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Sun, 19 Jul 2020 20:17:21 -0700 Subject: [PATCH 07/27] resize image --- sql-odbc/docs/user/power_bi_support.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sql-odbc/docs/user/power_bi_support.md b/sql-odbc/docs/user/power_bi_support.md index 42163505eb..9476eee5fe 100644 --- a/sql-odbc/docs/user/power_bi_support.md +++ b/sql-odbc/docs/user/power_bi_support.md @@ -23,15 +23,15 @@ * Open Power BI Desktop. * Click on **Home** > **Get Data** > **More** > **Other**. Select **Open Distro For Elasticsearch (Beta)**. Click on **Connect**. - + * You will get a warning for using third-party service. Click on **Continue**. - + * Enter host and port values. Click on **OK**. - + * Select authentication option and click on **Connect**. From c234b8829b0f5b1864bfe500f2b9053c79c7b12d Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Sun, 19 Jul 2020 20:32:00 -0700 Subject: [PATCH 08/27] remove extra lines --- sql-odbc/docs/user/power_bi_support.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/sql-odbc/docs/user/power_bi_support.md b/sql-odbc/docs/user/power_bi_support.md index 9476eee5fe..98bc4a2c56 100644 --- a/sql-odbc/docs/user/power_bi_support.md +++ b/sql-odbc/docs/user/power_bi_support.md @@ -1,6 +1,5 @@ # Microsoft Power BI Desktop - **NOTE**: **The connector is under development. All connection options are not available yet. There could be issues while loading data** ## Prerequisites @@ -41,8 +40,4 @@ -* Click on **Load**. - - - - +* Click on **Load**. \ No newline at end of file From 0d0c0509eea739936f4ee4b81307d0566cb39dad Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Sun, 19 Jul 2020 20:45:54 -0700 Subject: [PATCH 09/27] nit --- sql-odbc/src/PowerBIConnector/PowerBIConnector.pq | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector.pq b/sql-odbc/src/PowerBIConnector/PowerBIConnector.pq index a4a9b4e26d..f4836f7fed 100644 --- a/sql-odbc/src/PowerBIConnector/PowerBIConnector.pq +++ b/sql-odbc/src/PowerBIConnector/PowerBIConnector.pq @@ -1,4 +1,4 @@ -// This file contains your Data Connector logic +// This file contains Data Connector logic section #"Open Distro For Elasticsearch"; [DataSource.Kind="PowerBIConnector", Publish="PowerBIConnector.Publish"] @@ -28,13 +28,10 @@ PowerBIConnectorImpl = (Host as text, Port as number) as table => Host = Host, Port = Port ], - OdbcDatasource = Odbc.DataSource(ConnectionString) in OdbcDatasource; - - // Data Source Kind description PowerBIConnector = [ Authentication = [ From 50d4ccf583d527b263bd8465d29b80f32a9f0a62 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Sun, 19 Jul 2020 20:46:55 -0700 Subject: [PATCH 10/27] update mez file --- .../bin/Release/PowerBIConnector.mez | Bin 19463 -> 19456 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/sql-odbc/src/PowerBIConnector/bin/Release/PowerBIConnector.mez b/sql-odbc/src/PowerBIConnector/bin/Release/PowerBIConnector.mez index 5b397196c0c0119ed5856c1a8bd1095d52bb7079..4d3f794eef542c28d1be8e922fdf567242eaee5f 100644 GIT binary patch delta 958 zcmV;v13~<9n=5|e;Q6@Q&o+iu!G z5Pe7DA4cvANYo@0MQtN06-X4+v`GtTA0i$Wdw`Y9uC=>PlUDh%KJ=6N3!U)=a|;di z%i6nVXV087JO1bT~ww)`@Z6=SCT^D`KJzJ#lOx0lavN|$o! zq{GHa%BzzOE7GliuEI&cea5DJhM+v*mz}4!$u-wos;6R{=6}5)?SNSj;PwS!Sw7pc zmJ+;AsGby=A@V|7k%q;Wf#j5K$GJ;+GM8e4Y|Pm`wKU6KUuqF%oNHd0P>S;?i}5a^ z)S2R}Z?Y|W85a$qn>3F%t`fx!Vy_O5g?|`S$Lgatcw<--Z|+=d-!_|?%05i1-k(V~PbR+9&8apoakc)N1L!9D&RonX89iRBInyst!G`e+k5W0N` z`c*4KFTLPQUbUW`NwNQVr?n5tr2YC3^hvwOBs1+VPz*~01QY-O00;ohrSr2r10+Tb ztEKZ$TnA5@`2qj{?2~RuGat>R^H4va@Ikf$006N9000&M000000000000000DU-lS zLjn^9lK~17lNd@b0^SLe0SXwCVM;0iqLYkDLjiM>&`LuB2Og8rN)wYPOD_VxCzIhP g7?W{JDgvuClg>04leJ4K0S1%cOCbhMNdN!<04g)I)&Kwi delta 949 zcmV;m14{gWm;r~F0e?_S0|XQR000O8e5&$LaXF&u00RI3_Xq$05&!@IP;Yl-azaT% zZ*Fd7V{~tFE^VDv!EV|>5WOSu4gG?0+nPD)H zLSSH|f>$TuIoyA;7+wc7RjW@O1MoeJ{TM+xtpfDPG@Rh|W`d=`KS%8y=1RGWK zXqm*VEe?V=3^_exG2DzGNVSnm{)5pYzh2wL zYh@X_tk@d$8sxtVsSPj<4TmszZ(xbm^4k(Zzo87$r7bbr=A2_34p`#Idf*X>*ZSv* zA?iT!)v8H^5ZRT2EfM4#jJ@9%Cumf6sQmpqjhXcqU4IOe$4~HL8L*f(^5C&tIc=`d zTuZg)f=HJ$YyROr5Y7MjkdT098UXgBs8k3p7GNn4wBt?Z=xEc2?0?~TIaO%+@FT-5nsqHIthl=hX8}zb?Iw){(*wVpJ&mf` z+;J|R;&8s@6T!{Fj0k9mL0C4?wz;Jd?^D}V!bZaKc3U%uBH#h1!fvN|R(ai*Y=#ui z*}WZXni9X1EX;H_ys{{V^K2zq$Q7Y>J|)@oq{l4AawT-^s7#WUS&a*yy`r=l4AYycIzHgN%!?3=#y?y zNfz2)P)h>@6aWAK2mp4W@v}AqBt{K XLjkgrl}keb4U^eRAqG`R000005EQv( From 023fb674a86c080f802c32fcd46f11c5bfeadba8 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Tue, 21 Jul 2020 10:39:34 -0700 Subject: [PATCH 11/27] rename connector --- sql-odbc/docs/user/power_bi_support.md | 2 +- ...or.mproj => OdfeSqlOdbcPBIConnector.mproj} | 25 ++++++++--------- ...onnector.pq => OdfeSqlOdbcPBIConnector.pq} | 26 +++++++++--------- ...ry.pq => OdfeSqlOdbcPBIConnector.query.pq} | 2 +- ...or16.png => OdfeSqlOdbcPBIConnector16.png} | Bin ...or20.png => OdfeSqlOdbcPBIConnector20.png} | Bin ...or24.png => OdfeSqlOdbcPBIConnector24.png} | Bin ...or32.png => OdfeSqlOdbcPBIConnector32.png} | Bin ...or40.png => OdfeSqlOdbcPBIConnector40.png} | Bin ...or48.png => OdfeSqlOdbcPBIConnector48.png} | Bin ...or64.png => OdfeSqlOdbcPBIConnector64.png} | Bin ...or80.png => OdfeSqlOdbcPBIConnector80.png} | Bin ...nector.mez => OdfeSqlOdbcPBIConnector.mez} | Bin 19456 -> 19589 bytes 13 files changed, 27 insertions(+), 28 deletions(-) rename sql-odbc/src/PowerBIConnector/{PowerBIConnector.mproj => OdfeSqlOdbcPBIConnector.mproj} (86%) rename sql-odbc/src/PowerBIConnector/{PowerBIConnector.pq => OdfeSqlOdbcPBIConnector.pq} (54%) rename sql-odbc/src/PowerBIConnector/{PowerBIConnector.query.pq => OdfeSqlOdbcPBIConnector.query.pq} (63%) rename sql-odbc/src/PowerBIConnector/{PowerBIConnector16.png => OdfeSqlOdbcPBIConnector16.png} (100%) rename sql-odbc/src/PowerBIConnector/{PowerBIConnector20.png => OdfeSqlOdbcPBIConnector20.png} (100%) rename sql-odbc/src/PowerBIConnector/{PowerBIConnector24.png => OdfeSqlOdbcPBIConnector24.png} (100%) rename sql-odbc/src/PowerBIConnector/{PowerBIConnector32.png => OdfeSqlOdbcPBIConnector32.png} (100%) rename sql-odbc/src/PowerBIConnector/{PowerBIConnector40.png => OdfeSqlOdbcPBIConnector40.png} (100%) rename sql-odbc/src/PowerBIConnector/{PowerBIConnector48.png => OdfeSqlOdbcPBIConnector48.png} (100%) rename sql-odbc/src/PowerBIConnector/{PowerBIConnector64.png => OdfeSqlOdbcPBIConnector64.png} (100%) rename sql-odbc/src/PowerBIConnector/{PowerBIConnector80.png => OdfeSqlOdbcPBIConnector80.png} (100%) rename sql-odbc/src/PowerBIConnector/bin/Release/{PowerBIConnector.mez => OdfeSqlOdbcPBIConnector.mez} (87%) diff --git a/sql-odbc/docs/user/power_bi_support.md b/sql-odbc/docs/user/power_bi_support.md index 98bc4a2c56..cfd8df7c5f 100644 --- a/sql-odbc/docs/user/power_bi_support.md +++ b/sql-odbc/docs/user/power_bi_support.md @@ -9,7 +9,7 @@ * [PowerBIConnector.mez](../../src/PowerBIConnector/bin/Release/) ## Setup -* Copy `PowerBIConnector.mez` file in the `\Documents\Power BI Desktop\Custom Connectors\` folder. This will let Power BI access custom connector. +* Copy `OdfeSqlOdbcPBIConnector.mez` file in the `\Documents\Power BI Desktop\Custom Connectors\` folder. This will let Power BI access custom connector. * Open Power BI Desktop. * Change the security settings. Click on **Files** > **Options and settings** > **Options** > **Security** > Select **Allow any extension to load without validation or warning** for Data Extensions. This will allow the custom connector to load data into Power BI. diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector.mproj b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.mproj similarity index 86% rename from sql-odbc/src/PowerBIConnector/PowerBIConnector.mproj rename to sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.mproj index 2679eca602..0987401eb4 100644 --- a/sql-odbc/src/PowerBIConnector/PowerBIConnector.mproj +++ b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.mproj @@ -2,8 +2,7 @@ Debug 2.0 - - + {75a2dabe-6c5b-498e-8df1-e85d4483a7dc} Exe MyRootNamespace MyAssemblyName @@ -19,7 +18,7 @@ False 1000 Yes - PowerBIConnector + OdfeSqlOdbcPBIConnector false @@ -37,37 +36,37 @@ - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code - + Code Code - + Code diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector.pq b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq similarity index 54% rename from sql-odbc/src/PowerBIConnector/PowerBIConnector.pq rename to sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq index f4836f7fed..6b9abdba5b 100644 --- a/sql-odbc/src/PowerBIConnector/PowerBIConnector.pq +++ b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq @@ -1,11 +1,11 @@ -// This file contains Data Connector logic -section #"Open Distro For Elasticsearch"; +// This file contains your Data Connector logic +section OdfeSqlOdbcPBIConnector; -[DataSource.Kind="PowerBIConnector", Publish="PowerBIConnector.Publish"] -shared PowerBIConnector.Contents = Value.ReplaceType(PowerBIConnectorImpl, PowerBIConnectorType); +[DataSource.Kind="OdfeSqlOdbcPBIConnector", Publish="OdfeSqlOdbcPBIConnector.Publish"] +shared OdfeSqlOdbcPBIConnector.Contents = Value.ReplaceType(OdfeSqlOdbcPBIConnectorImpl, OdfeSqlOdbcPBIConnectorType); // Wrapper function to provide additional UI customization. -PowerBIConnectorType = type function ( +OdfeSqlOdbcPBIConnectorType = type function ( Host as (type text meta [ Documentation.FieldCaption = "Host", Documentation.FieldDescription = "The hostname of the Open Distro For Elasticsearc server.", @@ -21,7 +21,7 @@ PowerBIConnectorType = type function ( Documentation.Name = "Open Distro For Elasticsearch" ]; -PowerBIConnectorImpl = (Host as text, Port as number) as table => +OdfeSqlOdbcPBIConnectorImpl = (Host as text, Port as number) as table => let ConnectionString = [ Driver = "ODFE SQL ODBC Driver", @@ -33,7 +33,7 @@ PowerBIConnectorImpl = (Host as text, Port as number) as table => OdbcDatasource; // Data Source Kind description -PowerBIConnector = [ +OdfeSqlOdbcPBIConnector = [ Authentication = [ Implicit = [] ], @@ -41,16 +41,16 @@ PowerBIConnector = [ ]; // Data Source UI publishing description -PowerBIConnector.Publish = [ +OdfeSqlOdbcPBIConnector.Publish = [ Beta = true, Category = "Other", ButtonText = { Extension.LoadString("ButtonTitle"), Extension.LoadString("ButtonHelp") }, LearnMoreUrl = "https://opendistro.github.io/for-elasticsearch/", - SourceImage = PowerBIConnector.Icons, - SourceTypeImage = PowerBIConnector.Icons + SourceImage = OdfeSqlOdbcPBIConnector.Icons, + SourceTypeImage = OdfeSqlOdbcPBIConnector.Icons ]; -PowerBIConnector.Icons = [ - Icon16 = { Extension.Contents("PowerBIConnector16.png"), Extension.Contents("PowerBIConnector20.png"), Extension.Contents("PowerBIConnector24.png"), Extension.Contents("PowerBIConnector32.png") }, - Icon32 = { Extension.Contents("PowerBIConnector32.png"), Extension.Contents("PowerBIConnector40.png"), Extension.Contents("PowerBIConnector48.png"), Extension.Contents("PowerBIConnector64.png") } +OdfeSqlOdbcPBIConnector.Icons = [ + Icon16 = { Extension.Contents("OdfeSqlOdbcPBIConnector16.png"), Extension.Contents("OdfeSqlOdbcPBIConnector20.png"), Extension.Contents("OdfeSqlOdbcPBIConnector24.png"), Extension.Contents("OdfeSqlOdbcPBIConnector32.png") }, + Icon32 = { Extension.Contents("OdfeSqlOdbcPBIConnector32.png"), Extension.Contents("OdfeSqlOdbcPBIConnector40.png"), Extension.Contents("OdfeSqlOdbcPBIConnector48.png"), Extension.Contents("OdfeSqlOdbcPBIConnector64.png") } ]; diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector.query.pq b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.query.pq similarity index 63% rename from sql-odbc/src/PowerBIConnector/PowerBIConnector.query.pq rename to sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.query.pq index c0821957ad..7b2a564376 100644 --- a/sql-odbc/src/PowerBIConnector/PowerBIConnector.query.pq +++ b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.query.pq @@ -1,5 +1,5 @@ // Use this file to write queries to test your data connector let - result = PowerBIConnector.Contents() + result = OdfeSqlOdbcPBIConnector.Contents() in result \ No newline at end of file diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector16.png b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector16.png similarity index 100% rename from sql-odbc/src/PowerBIConnector/PowerBIConnector16.png rename to sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector16.png diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector20.png b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector20.png similarity index 100% rename from sql-odbc/src/PowerBIConnector/PowerBIConnector20.png rename to sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector20.png diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector24.png b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector24.png similarity index 100% rename from sql-odbc/src/PowerBIConnector/PowerBIConnector24.png rename to sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector24.png diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector32.png b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector32.png similarity index 100% rename from sql-odbc/src/PowerBIConnector/PowerBIConnector32.png rename to sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector32.png diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector40.png b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector40.png similarity index 100% rename from sql-odbc/src/PowerBIConnector/PowerBIConnector40.png rename to sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector40.png diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector48.png b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector48.png similarity index 100% rename from sql-odbc/src/PowerBIConnector/PowerBIConnector48.png rename to sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector48.png diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector64.png b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector64.png similarity index 100% rename from sql-odbc/src/PowerBIConnector/PowerBIConnector64.png rename to sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector64.png diff --git a/sql-odbc/src/PowerBIConnector/PowerBIConnector80.png b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector80.png similarity index 100% rename from sql-odbc/src/PowerBIConnector/PowerBIConnector80.png rename to sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector80.png diff --git a/sql-odbc/src/PowerBIConnector/bin/Release/PowerBIConnector.mez b/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez similarity index 87% rename from sql-odbc/src/PowerBIConnector/bin/Release/PowerBIConnector.mez rename to sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez index 4d3f794eef542c28d1be8e922fdf567242eaee5f..02d8c023aeae94935c8962caf72a1921977033ca 100644 GIT binary patch delta 1702 zcmZpe!Pq*Ju|B|?nMH(wfq{cTAmnR+n9uxL24)6^5>5sNNua2IN?K}gVUB-FQgVQk zr*nQ@UTShlevw}8+)&^ATMhzyl|Rb6*)_WOIxSw2>#~%ovuW0}Efc;86h^#ZUBBhc zuHCOSGN;C0bFL5i@09+hvGJJ7fz-FD&)&}do_4&x{(t87`a~g4?qWqtmMBZLDXr{t zB_s@vFIYeIQR8K{C2<`K;x_+K+tL(h@%*uTk;u8G*Y^rU%fi-Q&E7u6%B`p2w|pzt z?l{*i*PC9asI~TLIsdUaF#FL>L1UXWR=19;AD_DULTkQ{+MWNWl20<(Rd!S^R?6Jb zle(H~qR{Mg2i1js_j&8Plk*bht?*%5u4wkluSF(8g6meYP+psW%C(nEf1J!Xz5aUH z0p)P_(_C8u*E{~(edQYC<_jLmGW*LnJb7_4SJG*JBi|&|Yjfw8DemC;t>bra*8{s4mS2XYgRXk`l(b{GV2RAskiZ-2jdhPDL9>z+35oQ~p?YlIu0o?%JYS-ABeY#Yje z9`eY!>F&}CQq#8Io#phTk%J|)%=)bD>Fixe#(w|i+<$y!^OHYQ(-PhGKAc**v`|jW zxVB5buYR?~>UePjA?;{}%4(Y2S_?n_KM);*{D?e4PZ$FUrjS3l5i>7F!GzodHI zS?zswnzvX_`^#cu>MILxl`t77*=)66a3NODbSz+|~k31st zlmvbauwU@OaT^l@!$u&MMaw*!eV8vYDS%W}Y981z9hk)?0WpRuGqz34U{&)zMeHgJPm%zcm5Dml_s-}rnbAVN) ztXX=c8JO+sfEYuSmfSo}uqtumlXG_RFfeQZVhmLe)vxe?RS9i7o~+Ktz@P-g7^=>h zIPo#>4*t4X*x8*;4_m1N3_B!%Tn0^U^pw=Y7S;&$=D=`8(Q?pJwjNu+BeZA$gAZ8? zQb}iIpjVKW9^lQ$B*FkGCP7A_#}2}%U%=4AG-|THmpItj=n;m{coY~^$Qmd2ddY&d zpvN9U%Un@3Ef>8YK1Gj8gcb`qR4qt8HL<|vQ}p;o81+pZn^BYFy&*nDPXY*yuS`%i fPM+&63rY`@_j*e+`b@s*Ez5Nqn1iNxg0uht=DT}% delta 1603 zcmZpj$=EQ1u|B|?nMH(wfq{cz_0rD)G3@@celjsIyy0MA5CVz@%wIe9wg=jEj) zm*f}e<<1Sgop;MYpw|77yxTi&k1Hx7uDQxuq8=hwws>-9$}7oiQn++r|Qu-<9GRN3l(rX}uWi&3BKaqH)|S@YLdBwLl~@w9DVU1;8ZD)PmFa6#1<^#?7482jXs z*5oc?@3zRwIhv61S7e5MJ?F=>9TslPmt9gjt#~(HEH`oyNYtqGb15)xP}u0F|AhZw zaNX8T+Ikm@Y;+c1T_t*AK6kDx2lrNyhac`8Wb*uUTj-E~Jp0L}pfi1z(*@{cJbma zzMIu{6FB^QUa;k*?U(x|TK?-qMocduh~T_MVPV(Ik=sfm#R`Y%iFr5;o& zQC)5$At+^axTs{?AEQa4$;*s|KT1vU?-&t1Olr0MnORm+p+Jlm`AwjomB!8g{#NW0scrU~uwUolT)rs5~3 z=!tDdr#C*Cl6QQkccszvq^6uRH*L3?oQ{jn5=@(u9XB(e>$67pN4-T?W3XhjsGi`Z{)vVJ;g3!weusNWbUX!6q3Bl-B*LwJrgeO{0MrA$?r5nnThLD4nuq>6K7r-z;0^rhP@;Oh*Y;1vrP^bwEAM}#O&`hr&FFnAUkx7IBQa)h| zQG^-7z)*tNm*6F0dL9X|O^)-C<(dOb?0%jgVE~6iO%4D6 From 0b857c003716461562dbce6fa10df6090eeaad3d Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Tue, 21 Jul 2020 10:40:37 -0700 Subject: [PATCH 12/27] rename mez file --- sql-odbc/docs/user/power_bi_support.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-odbc/docs/user/power_bi_support.md b/sql-odbc/docs/user/power_bi_support.md index cfd8df7c5f..38b8259a42 100644 --- a/sql-odbc/docs/user/power_bi_support.md +++ b/sql-odbc/docs/user/power_bi_support.md @@ -6,7 +6,7 @@ * Microsoft Power BI Desktop * [Open Distro for Elasticsearch](https://opendistro.github.io/for-elasticsearch-docs/docs/install/) * [Open Distro for Elasticsearch SQL ODBC driver](https://opendistro.github.io/for-elasticsearch-docs/docs/sql/odbc/) -* [PowerBIConnector.mez](../../src/PowerBIConnector/bin/Release/) +* [OdfeSqlOdbcPBIConnector.mez](../../src/PowerBIConnector/bin/Release/) ## Setup * Copy `OdfeSqlOdbcPBIConnector.mez` file in the `\Documents\Power BI Desktop\Custom Connectors\` folder. This will let Power BI access custom connector. From 06ae48656b35034cd62dd826569b08c9b075a3d9 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Wed, 22 Jul 2020 20:04:10 -0700 Subject: [PATCH 13/27] - add basic & aws auth - add unit test - add errors - enable direct query --- sql-odbc/.gitignore | 3 +- sql-odbc/src/PowerBIConnector/Diagnostics.pqm | 275 ++++ .../src/PowerBIConnector/OdbcConstants.pqm | 1253 +++++++++++++++++ .../OdfeSqlOdbcPBIConnector.mproj | 6 + .../OdfeSqlOdbcPBIConnector.pq | 194 ++- .../OdfeSqlOdbcPBIConnector.query.pq | 315 ++++- .../bin/Release/OdfeSqlOdbcPBIConnector.mez | Bin 19589 -> 33501 bytes 7 files changed, 2030 insertions(+), 16 deletions(-) create mode 100644 sql-odbc/src/PowerBIConnector/Diagnostics.pqm create mode 100644 sql-odbc/src/PowerBIConnector/OdbcConstants.pqm diff --git a/sql-odbc/.gitignore b/sql-odbc/.gitignore index 849c3e99b7..4f4efe708c 100644 --- a/sql-odbc/.gitignore +++ b/sql-odbc/.gitignore @@ -57,4 +57,5 @@ CTestTestfile.cmake /sdk-build64/ /cmake-build64/ /src/PowerBIConnector/bin/Debug/ -/src/PowerBIConnector/obj/ \ No newline at end of file +/src/PowerBIConnector/obj/ +/src/PowerBIConnector/.vs/ \ No newline at end of file diff --git a/sql-odbc/src/PowerBIConnector/Diagnostics.pqm b/sql-odbc/src/PowerBIConnector/Diagnostics.pqm new file mode 100644 index 0000000000..ca10c3cf98 --- /dev/null +++ b/sql-odbc/src/PowerBIConnector/Diagnostics.pqm @@ -0,0 +1,275 @@ +let + Diagnostics.LogValue = (prefix, value) => Diagnostics.Trace(TraceLevel.Information, prefix & ": " & (try Diagnostics.ValueToText(value) otherwise ""), value), + Diagnostics.LogValue2 = (prefix, value, result, optional delayed) => Diagnostics.Trace(TraceLevel.Information, prefix & ": " & Diagnostics.ValueToText(value), result, delayed), + Diagnostics.LogFailure = (text, function) => + let + result = try function() + in + if result[HasError] then Diagnostics.LogValue2(text, result[Error], () => error result[Error], true) else result[Value], + + Diagnostics.WrapFunctionResult = (innerFunction as function, outerFunction as function) as function => + Function.From(Value.Type(innerFunction), (list) => outerFunction(() => Function.Invoke(innerFunction, list))), + + Diagnostics.WrapHandlers = (handlers as record) as record => + Record.FromList( + List.Transform( + Record.FieldNames(handlers), + (h) => Diagnostics.WrapFunctionResult(Record.Field(handlers, h), (fn) => Diagnostics.LogFailure(h, fn))), + Record.FieldNames(handlers)), + + Diagnostics.ValueToText = (value) => + let + _canBeIdentifier = (x) => + let + keywords = {"and", "as", "each", "else", "error", "false", "if", "in", "is", "let", "meta", "not", "otherwise", "or", "section", "shared", "then", "true", "try", "type" }, + charAlpha = (c as number) => (c>= 65 and c <= 90) or (c>= 97 and c <= 122) or c=95, + charDigit = (c as number) => c>= 48 and c <= 57 + in + try + charAlpha(Character.ToNumber(Text.At(x,0))) + and + List.MatchesAll( + Text.ToList(x), + (c)=> let num = Character.ToNumber(c) in charAlpha(num) or charDigit(num) + ) + and not + List.MatchesAny( keywords, (li)=> li=x ) + otherwise + false, + + Serialize.Binary = (x) => "#binary(" & Serialize(Binary.ToList(x)) & ") ", + + Serialize.Date = (x) => "#date(" & + Text.From(Date.Year(x)) & ", " & + Text.From(Date.Month(x)) & ", " & + Text.From(Date.Day(x)) & ") ", + + Serialize.Datetime = (x) => "#datetime(" & + Text.From(Date.Year(DateTime.Date(x))) & ", " & + Text.From(Date.Month(DateTime.Date(x))) & ", " & + Text.From(Date.Day(DateTime.Date(x))) & ", " & + Text.From(Time.Hour(DateTime.Time(x))) & ", " & + Text.From(Time.Minute(DateTime.Time(x))) & ", " & + Text.From(Time.Second(DateTime.Time(x))) & ") ", + + Serialize.Datetimezone =(x) => let + dtz = DateTimeZone.ToRecord(x) + in + "#datetimezone(" & + Text.From(dtz[Year]) & ", " & + Text.From(dtz[Month]) & ", " & + Text.From(dtz[Day]) & ", " & + Text.From(dtz[Hour]) & ", " & + Text.From(dtz[Minute]) & ", " & + Text.From(dtz[Second]) & ", " & + Text.From(dtz[ZoneHours]) & ", " & + Text.From(dtz[ZoneMinutes]) & ") ", + + Serialize.Duration = (x) => let + dur = Duration.ToRecord(x) + in + "#duration(" & + Text.From(dur[Days]) & ", " & + Text.From(dur[Hours]) & ", " & + Text.From(dur[Minutes]) & ", " & + Text.From(dur[Seconds]) & ") ", + + Serialize.Function = (x) => _serialize_function_param_type( + Type.FunctionParameters(Value.Type(x)), + Type.FunctionRequiredParameters(Value.Type(x)) ) & + " as " & + _serialize_function_return_type(Value.Type(x)) & + " => (...) ", + + Serialize.List = (x) => "{" & + List.Accumulate(x, "", (seed,item) => if seed="" then Serialize(item) else seed & ", " & Serialize(item)) & + "} ", + + Serialize.Logical = (x) => Text.From(x), + + Serialize.Null = (x) => "null", + + Serialize.Number = (x) => + let Text.From = (i as number) as text => + if Number.IsNaN(i) then "#nan" else + if i=Number.PositiveInfinity then "#infinity" else + if i=Number.NegativeInfinity then "-#infinity" else + Text.From(i) + in + Text.From(x), + + Serialize.Record = (x) => "[ " & + List.Accumulate( + Record.FieldNames(x), + "", + (seed,item) => + (if seed="" then Serialize.Identifier(item) else seed & ", " & Serialize.Identifier(item)) & " = " & Serialize(Record.Field(x, item)) + ) & + " ] ", + + Serialize.Table = (x) => "#table( type " & + _serialize_table_type(Value.Type(x)) & + ", " & + Serialize(Table.ToRows(x)) & + ") ", + + Serialize.Text = (x) => """" & + _serialize_text_content(x) & + """", + + _serialize_text_content = (x) => let + escapeText = (n as number) as text => "#(#)(" & Text.PadStart(Number.ToText(n, "X", "en-US"), 4, "0") & ")" + in + List.Accumulate( + List.Transform( + Text.ToList(x), + (c) => let n=Character.ToNumber(c) in + if n = 9 then "#(#)(tab)" else + if n = 10 then "#(#)(lf)" else + if n = 13 then "#(#)(cr)" else + if n = 34 then """""" else + if n = 35 then "#(#)(#)" else + if n < 32 then escapeText(n) else + if n < 127 then Character.FromNumber(n) else + escapeText(n) + ), + "", + (s,i)=>s&i + ), + + Serialize.Identifier = (x) => + if _canBeIdentifier(x) then + x + else + "#""" & + _serialize_text_content(x) & + """", + + Serialize.Time = (x) => "#time(" & + Text.From(Time.Hour(x)) & ", " & + Text.From(Time.Minute(x)) & ", " & + Text.From(Time.Second(x)) & ") ", + + Serialize.Type = (x) => "type " & _serialize_typename(x), + + + _serialize_typename = (x, optional funtype as logical) => /* Optional parameter: Is this being used as part of a function signature? */ + let + isFunctionType = (x as type) => try if Type.FunctionReturn(x) is type then true else false otherwise false, + isTableType = (x as type) => try if Type.TableSchema(x) is table then true else false otherwise false, + isRecordType = (x as type) => try if Type.ClosedRecord(x) is type then true else false otherwise false, + isListType = (x as type) => try if Type.ListItem(x) is type then true else false otherwise false + in + + if funtype=null and isTableType(x) then _serialize_table_type(x) else + if funtype=null and isListType(x) then "{ " & @_serialize_typename( Type.ListItem(x) ) & " }" else + if funtype=null and isFunctionType(x) then "function " & _serialize_function_type(x) else + if funtype=null and isRecordType(x) then _serialize_record_type(x) else + + if x = type any then "any" else + let base = Type.NonNullable(x) in + (if Type.IsNullable(x) then "nullable " else "") & + (if base = type anynonnull then "anynonnull" else + if base = type binary then "binary" else + if base = type date then "date" else + if base = type datetime then "datetime" else + if base = type datetimezone then "datetimezone" else + if base = type duration then "duration" else + if base = type logical then "logical" else + if base = type none then "none" else + if base = type null then "null" else + if base = type number then "number" else + if base = type text then "text" else + if base = type time then "time" else + if base = type type then "type" else + + /* Abstract types: */ + if base = type function then "function" else + if base = type table then "table" else + if base = type record then "record" else + if base = type list then "list" else + + "any /*Actually unknown type*/"), + + _serialize_table_type = (x) => + let + schema = Type.TableSchema(x) + in + "table " & + (if Table.IsEmpty(schema) then "" else + "[" & List.Accumulate( + List.Transform( + Table.ToRecords(Table.Sort(schema,"Position")), + each Serialize.Identifier(_[Name]) & " = " & _[Kind]), + "", + (seed,item) => (if seed="" then item else seed & ", " & item ) + ) & "] " ), + + _serialize_record_type = (x) => + let flds = Type.RecordFields(x) + in + if Record.FieldCount(flds)=0 then "record" else + "[" & List.Accumulate( + Record.FieldNames(flds), + "", + (seed,item) => + seed & + (if seed<>"" then ", " else "") & + (Serialize.Identifier(item) & "=" & _serialize_typename(Record.Field(flds,item)[Type]) ) + ) & + (if Type.IsOpenRecord(x) then ",..." else "") & + "]", + + _serialize_function_type = (x) => _serialize_function_param_type( + Type.FunctionParameters(x), + Type.FunctionRequiredParameters(x) ) & + " as " & + _serialize_function_return_type(x), + + _serialize_function_param_type = (t,n) => + let + funsig = Table.ToRecords( + Table.TransformColumns( + Table.AddIndexColumn( Record.ToTable( t ), "isOptional", 1 ), + { "isOptional", (x)=> x>n } ) ) + in + "(" & + List.Accumulate( + funsig, + "", + (seed,item)=> + (if seed="" then "" else seed & ", ") & + (if item[isOptional] then "optional " else "") & + Serialize.Identifier(item[Name]) & " as " & _serialize_typename(item[Value], true) ) + & ")", + + _serialize_function_return_type = (x) => _serialize_typename(Type.FunctionReturn(x), true), + + Serialize = (x) as text => + if x is binary then try Serialize.Binary(x) otherwise "null /*serialize failed*/" else + if x is date then try Serialize.Date(x) otherwise "null /*serialize failed*/" else + if x is datetime then try Serialize.Datetime(x) otherwise "null /*serialize failed*/" else + if x is datetimezone then try Serialize.Datetimezone(x) otherwise "null /*serialize failed*/" else + if x is duration then try Serialize.Duration(x) otherwise "null /*serialize failed*/" else + if x is function then try Serialize.Function(x) otherwise "null /*serialize failed*/" else + if x is list then try Serialize.List(x) otherwise "null /*serialize failed*/" else + if x is logical then try Serialize.Logical(x) otherwise "null /*serialize failed*/" else + if x is null then try Serialize.Null(x) otherwise "null /*serialize failed*/" else + if x is number then try Serialize.Number(x) otherwise "null /*serialize failed*/" else + if x is record then try Serialize.Record(x) otherwise "null /*serialize failed*/" else + if x is table then try Serialize.Table(x) otherwise "null /*serialize failed*/" else + if x is text then try Serialize.Text(x) otherwise "null /*serialize failed*/" else + if x is time then try Serialize.Time(x) otherwise "null /*serialize failed*/" else + if x is type then try Serialize.Type(x) otherwise "null /*serialize failed*/" else + "[#_unable_to_serialize_#]" + in + try Serialize(value) otherwise "" +in + [ + LogValue = Diagnostics.LogValue, + LogValue2 = Diagnostics.LogValue2, + LogFailure = Diagnostics.LogFailure, + WrapFunctionResult = Diagnostics.WrapFunctionResult, + WrapHandlers = Diagnostics.WrapHandlers, + ValueToText = Diagnostics.ValueToText + ] \ No newline at end of file diff --git a/sql-odbc/src/PowerBIConnector/OdbcConstants.pqm b/sql-odbc/src/PowerBIConnector/OdbcConstants.pqm new file mode 100644 index 0000000000..144e525413 --- /dev/null +++ b/sql-odbc/src/PowerBIConnector/OdbcConstants.pqm @@ -0,0 +1,1253 @@ +// values from https://github.com/Microsoft/ODBC-Specification/blob/master/Windows/inc/sqlext.h +[ + Flags = (flags as list) => + if (List.IsEmpty(flags)) then 0 else + let + Loop = List.Generate(()=> [i = 0, Combined = flags{0}], + each [i] < List.Count(flags), + each [Combined = Number.BitwiseOr([Combined], flags{i}), i = [i]+1], + each [Combined]), + Result = List.Last(Loop) + in + Result, + + SQL_HANDLE = + [ + ENV = 1, + DBC = 2, + STMT = 3, + DESC = 4 + ], + + RetCode = + [ + SUCCESS = 0, + SUCCESS_WITH_INFO = 1, + ERROR = -1, + INVALID_HANDLE = -2, + NO_DATA = 100 + ], + + SQL_CONVERT = + [ + BIGINT = 53, + BINARY = 54, + BIT = 55, + CHAR = 56, + DATE = 57, + DECIMAL = 58, + DOUBLE = 59, + FLOAT = 60, + INTEGER = 61, + LONGVARCHAR = 62, + NUMERIC = 63, + REAL = 64, + SMALLINT = 65, + TIME = 66, + TIMESTAMP = 67, + TINYINT = 68, + VARBINARY = 69, + VARCHAR = 70, + LONGVARBINARY = 71 + ], + + SQL_ROW = + [ + PROCEED = 0, + IGNORE = 1, + SUCCESS = 0, + DELETED = 1, + UPDATED = 2, + NOROW = 3, + ADDED = 4, + ERROR = 5, + SUCCESS_WITH_INFO = 6 + ], + +SQL_CVT = +[ + //None = 0, + + CHAR = 0x00000001, + NUMERIC = 0x00000002, + DECIMAL = 0x00000004, + INTEGER = 0x00000008, + SMALLINT = 0x00000010, + FLOAT = 0x00000020, + REAL = 0x00000040, + DOUBLE = 0x00000080, + VARCHAR = 0x00000100, + LONGVARCHAR = 0x00000200, + BINARY = 0x00000400, + VARBINARY = 0x00000800, + BIT = 0x00001000, + TINYINT = 0x00002000, + BIGINT = 0x00004000, + DATE = 0x00008000, + TIME = 0x00010000, + TIMESTAMP = 0x00020000, + LONGVARBINARY = 0x00040000, + INTERVAL_YEAR_MONTH = 0x00080000, + INTERVAL_DAY_TIME = 0x00100000, + WCHAR = 0x00200000, + WLONGVARCHAR = 0x00400000, + WVARCHAR = 0x00800000, + GUID = 0x01000000 +], + + STMT = + [ + CLOSE = 0, + DROP = 1, + UNBIND = 2, + RESET_PARAMS = 3 + ], + + SQL_MAX = + [ + NUMERIC_LEN = 16 + ], + + SQL_IS = + [ + POINTER = -4, + INTEGER = -6, + UINTEGER = -5, + SMALLINT = -8 + ], + + //SQL Server specific defines + // + SQL_HC = // from Odbcss.h + [ + OFF = 0, // FOR BROWSE columns are hidden + ON = 1 // FOR BROWSE columns are exposed + ], + + SQL_NB = // from Odbcss.h + [ + OFF = 0, // NO_BROWSETABLE is off + ON = 1 // NO_BROWSETABLE is on + ], + + // SQLColAttributes driver specific defines. + // SQLSet/GetDescField driver specific defines. + // Microsoft has 1200 thru 1249 reserved for Microsoft SQL Server driver usage. + // + SQL_CA_SS = // from Odbcss.h + [ + BASE = 1200, // SQL_CA_SS_BASE + + COLUMN_HIDDEN = 1200 + 11, // Column is hidden (FOR BROWSE) + COLUMN_KEY = 1200 + 12, // Column is key column (FOR BROWSE) + VARIANT_TYPE = 1200 + 15, + VARIANT_SQL_TYPE = 1200 + 16, + VARIANT_SERVER_TYPE = 1200 + 17 + + ], + + SQL_SOPT_SS = // from Odbcss.h + [ + BASE = 1225, // SQL_SOPT_SS_BASE + HIDDEN_COLUMNS = 1225 + 2, // Expose FOR BROWSE hidden columns + NOBROWSETABLE = 1225 + 3 // Set NOBROWSETABLE option + ], + + SQL_COMMIT = 0, //Commit + SQL_ROLLBACK = 1, //Abort + + //static public readonly IntPtr SQL_AUTOCOMMIT_OFF = IntPtr.Zero; + //static public readonly IntPtr SQL_AUTOCOMMIT_ON = new IntPtr(1); + + SQL_TRANSACTION = + [ + READ_UNCOMMITTED = 0x00000001, + READ_COMMITTED = 0x00000002, + REPEATABLE_READ = 0x00000004, + SERIALIZABLE = 0x00000008, + SNAPSHOT = 0x00000020 // VSDD 414121: SQL_TXN_SS_SNAPSHOT == 0x20 (sqlncli.h) + ], + + SQL_PARAM = + [ + TYPE_UNKNOWN = 0, // SQL_PARAM_TYPE_UNKNOWN + INPUT = 1, // SQL_PARAM_INPUT + INPUT_OUTPUT = 2, // SQL_PARAM_INPUT_OUTPUT + RESULT_COL = 3, // SQL_RESULT_COL + OUTPUT = 4, // SQL_PARAM_OUTPUT + RETURN_VALUE = 5 // SQL_RETURN_VALUE + ], + + SQL_DESC = + [ + // from sql.h (ODBCVER >= 3.0) + // + COUNT = 1001, + TYPE = 1002, + LENGTH = 1003, + OCTET_LENGTH_PTR = 1004, + PRECISION = 1005, + SCALE = 1006, + DATETIME_INTERVAL_CODE = 1007, + NULLABLE = 1008, + INDICATOR_PTR = 1009, + DATA_PTR = 1010, + NAME = 1011, + UNNAMED = 1012, + OCTET_LENGTH = 1013, + ALLOC_TYPE = 1099, + + // from sqlext.h (ODBCVER >= 3.0) + // + CONCISE_TYPE = SQL_COLUMN[TYPE], + DISPLAY_SIZE = SQL_COLUMN[DISPLAY_SIZE], + UNSIGNED = SQL_COLUMN[UNSIGNED], + UPDATABLE = SQL_COLUMN[UPDATABLE], + AUTO_UNIQUE_VALUE = SQL_COLUMN[AUTO_INCREMENT], + + TYPE_NAME = SQL_COLUMN[TYPE_NAME], + TABLE_NAME = SQL_COLUMN[TABLE_NAME], + SCHEMA_NAME = SQL_COLUMN[OWNER_NAME], + CATALOG_NAME = SQL_COLUMN[QUALIFIER_NAME], + + BASE_COLUMN_NAME = 22, + BASE_TABLE_NAME = 23, + + NUM_PREC_RADIX = 32 + ], + + // ODBC version 2.0 style attributes + // All IdentifierValues are ODBC 1.0 unless marked differently + // + SQL_COLUMN = + [ + COUNT = 0, + NAME = 1, + TYPE = 2, + LENGTH = 3, + PRECISION = 4, + SCALE = 5, + DISPLAY_SIZE = 6, + NULLABLE = 7, + UNSIGNED = 8, + MONEY = 9, + UPDATABLE = 10, + AUTO_INCREMENT = 11, + CASE_SENSITIVE = 12, + SEARCHABLE = 13, + TYPE_NAME = 14, + TABLE_NAME = 15, // (ODBC 2.0) + OWNER_NAME = 16, // (ODBC 2.0) + QUALIFIER_NAME = 17, // (ODBC 2.0) + LABEL = 18 + ], + + // values from sqlext.h + SQL_SQL92_RELATIONAL_JOIN_OPERATORS = + [ + CORRESPONDING_CLAUSE = 0x00000001, // SQL_SRJO_CORRESPONDING_CLAUSE + CROSS_JOIN = 0x00000002, // SQL_SRJO_CROSS_JOIN + EXCEPT_JOIN = 0x00000004, // SQL_SRJO_EXCEPT_JOIN + FULL_OUTER_JOIN = 0x00000008, // SQL_SRJO_FULL_OUTER_JOIN + INNER_JOIN = 0x00000010, // SQL_SRJO_INNER_JOIN + INTERSECT_JOIN = 0x00000020, // SQL_SRJO_INTERSECT_JOIN + LEFT_OUTER_JOIN = 0x00000040, // SQL_SRJO_LEFT_OUTER_JOIN + NATURAL_JOIN = 0x00000080, // SQL_SRJO_NATURAL_JOIN + RIGHT_OUTER_JOIN = 0x00000100, // SQL_SRJO_RIGHT_OUTER_JOIN + UNION_JOIN = 0x00000200 // SQL_SRJO_UNION_JOIN + ], + + // values from sqlext.h + SQL_QU = + [ + SQL_QU_DML_STATEMENTS = 0x00000001, + SQL_QU_PROCEDURE_INVOCATION = 0x00000002, + SQL_QU_TABLE_DEFINITION = 0x00000004, + SQL_QU_INDEX_DEFINITION = 0x00000008, + SQL_QU_PRIVILEGE_DEFINITION = 0x00000010 + ], + + // values from sql.h + SQL_OJ_CAPABILITIES = + [ + LEFT = 0x00000001, // SQL_OJ_LEFT + RIGHT = 0x00000002, // SQL_OJ_RIGHT + FULL = 0x00000004, // SQL_OJ_FULL + NESTED = 0x00000008, // SQL_OJ_NESTED + NOT_ORDERED = 0x00000010, // SQL_OJ_NOT_ORDERED + INNER = 0x00000020, // SQL_OJ_INNER + ALL_COMPARISON_OPS = 0x00000040 //SQL_OJ_ALLCOMPARISION+OPS + ], + + SQL_UPDATABLE = + [ + READONLY = 0, // SQL_ATTR_READ_ONLY + WRITE = 1, // SQL_ATTR_WRITE + READWRITE_UNKNOWN = 2 // SQL_ATTR_READWRITE_UNKNOWN + ], + + SQL_IDENTIFIER_CASE = + [ + UPPER = 1, // SQL_IC_UPPER + LOWER = 2, // SQL_IC_LOWER + SENSITIVE = 3, // SQL_IC_SENSITIVE + MIXED = 4 // SQL_IC_MIXED + ], + + // Uniqueness parameter in the SQLStatistics function + SQL_INDEX = + [ + UNIQUE = 0, + ALL = 1 + ], + + // Reserved parameter in the SQLStatistics function + SQL_STATISTICS_RESERVED = + [ + QUICK = 0, // SQL_QUICK + ENSURE = 1 // SQL_ENSURE + ], + + // Identifier type parameter in the SQLSpecialColumns function + SQL_SPECIALCOLS = + [ + BEST_ROWID = 1, // SQL_BEST_ROWID + ROWVER = 2 // SQL_ROWVER + ], + + // Scope parameter in the SQLSpecialColumns function + SQL_SCOPE = + [ + CURROW = 0, // SQL_SCOPE_CURROW + TRANSACTION = 1, // SQL_SCOPE_TRANSACTION + SESSION = 2 // SQL_SCOPE_SESSION + ], + + SQL_NULLABILITY = + [ + NO_NULLS = 0, // SQL_NO_NULLS + NULLABLE = 1, // SQL_NULLABLE + UNKNOWN = 2 // SQL_NULLABLE_UNKNOWN + ], + + SQL_SEARCHABLE = + [ + UNSEARCHABLE = 0, // SQL_UNSEARCHABLE + LIKE_ONLY = 1, // SQL_LIKE_ONLY + ALL_EXCEPT_LIKE = 2, // SQL_ALL_EXCEPT_LIKE + SEARCHABLE = 3 // SQL_SEARCHABLE + ], + + SQL_UNNAMED = + [ + NAMED = 0, // SQL_NAMED + UNNAMED = 1 // SQL_UNNAMED + ], + // todo:move + // internal constants + // not odbc specific + // + HANDLER = + [ + IGNORE = 0x00000000, + THROW = 0x00000001 + ], + + // values for SQLStatistics TYPE column + SQL_STATISTICSTYPE = + [ + TABLE_STAT = 0, // TABLE Statistics + INDEX_CLUSTERED = 1, // CLUSTERED index statistics + INDEX_HASHED = 2, // HASHED index statistics + INDEX_OTHER = 3 // OTHER index statistics + ], + + // values for SQLProcedures PROCEDURE_TYPE column + SQL_PROCEDURETYPE = + [ + UNKNOWN = 0, // procedure is of unknow type + PROCEDURE = 1, // procedure is a procedure + FUNCTION = 2 // procedure is a function + ], + + // private constants + // to define data types (see below) + // + SIGNED_OFFSET = -20, // SQL_SIGNED_OFFSET + UNSIGNED_OFFSET = -22, // SQL_UNSIGNED_OFFSET + + // C Data Types + SQL_C = + [ + CHAR = 1, + WCHAR = -8, + SLONG = 4 + SIGNED_OFFSET, + ULONG = 4 + UNSIGNED_OFFSET, + SSHORT = 5 + SIGNED_OFFSET, + USHORT = 5 + UNSIGNED_OFFSET, + FLOAT = 7, + DOUBLE = 8, + BIT = -7, + STINYINT = -6 + SIGNED_OFFSET, + UTINYINT = -6 + UNSIGNED_OFFSET, + SBIGINT = -5 + SIGNED_OFFSET, + UBIGINT = -5 + UNSIGNED_OFFSET, + BINARY = -2, + TIMESTAMP = 11, + + TYPE_DATE = 91, + TYPE_TIME = 92, + TYPE_TIMESTAMP = 93, + + NUMERIC = 2, + GUID = -11, + DEFAULT = 99, + ARD_TYPE = -99 + ], + + // SQL Data Types + SQL_TYPE = + [ + // Base data types (sql.h) + UNKNOWN = 0, + NULL = 0, + CHAR = 1, + NUMERIC = 2, + DECIMAL = 3, + INTEGER = 4, + SMALLINT = 5, + FLOAT = 6, + REAL = 7, + DOUBLE = 8, + DATETIME = 9, // V3 Only + VARCHAR = 12, + + // Unicode types (sqlucode.h) + WCHAR = -8, + WVARCHAR = -9, + WLONGVARCHAR = -10, + + // Extended data types (sqlext.h) + INTERVAL = 10, // V3 Only + TIME = 10, + TIMESTAMP = 11, + LONGVARCHAR = -1, + BINARY = -2, + VARBINARY = -3, + LONGVARBINARY = -4, + BIGINT = -5, + TINYINT = -6, + BIT = -7, + GUID = -11, // V3 Only + + // One-parameter shortcuts for date/time data types. + TYPE_DATE = 91, + TYPE_TIME = 92, + TYPE_TIMESTAMP = 93, + + // SQL Server Types -150 to -159 (sqlncli.h) + SS_VARIANT = -150, + SS_UDT = -151, + SS_XML = -152, + SS_TABLE = -153, + SS_TIME2 = -154, + SS_TIMESTAMPOFFSET = -155 + ], + + //SQL_ALL_TYPES = 0, + //static public readonly IntPtr SQL_HANDLE_NULL = IntPtr.Zero; + + SQL_LENGTH = + [ + SQL_IGNORE = -6, + SQL_DEFAULT_PARAM = -5, + SQL_NO_TOTAL = -4, + SQL_NTS = -3, + SQL_DATA_AT_EXEC = -2, + SQL_NULL_DATA = -1 + ], + + SQL_DEFAULT_PARAM = -5, + + // column ordinals for SQLProcedureColumns result set + // this column ordinals are not defined in any c/c++ header but in the ODBC Programmer's Reference under SQLProcedureColumns + // + COLUMN_NAME = 4, + COLUMN_TYPE = 5, + DATA_TYPE = 6, + COLUMN_SIZE = 8, + DECIMAL_DIGITS = 10, + NUM_PREC_RADIX = 11, + + SQL_ATTR = + [ + ODBC_VERSION = 200, + CONNECTION_POOLING = 201, + AUTOCOMMIT = 102, + TXN_ISOLATION = 108, + CURRENT_CATALOG = 109, + LOGIN_TIMEOUT = 103, + QUERY_TIMEOUT = 0, + CONNECTION_DEAD = 1209, + + SQL_COPT_SS_BASE = 1200, + SQL_COPT_SS_ENLIST_IN_DTC = (1200 + 7), + SQL_COPT_SS_TXN_ISOLATION = (1200 + 27), + + MAX_LENGTH = 3, + ROW_BIND_TYPE = 5, + CURSOR_TYPE = 6, + RETRIEVE_DATA = 11, + ROW_STATUS_PTR = 25, + ROWS_FETCHED_PTR = 26, + ROW_ARRAY_SIZE = 27, + + // ODBC 3.0 + APP_ROW_DESC = 10010, + APP_PARAM_DESC = 10011, + IMP_ROW_DESC = 10012, + IMP_PARAM_DESC = 10013, + METADATA_ID = 10014, + + // ODBC 4.0 + PRIVATE_DRIVER_LOCATION = 204 + ], + + SQL_RD = + [ + OFF = 0, + ON = 1 + ], + + SQL_GD = + [ + //None = 0, + ANY_COLUMN = 1, + ANY_ORDER = 2, + BLOCK = 4, + BOUND = 8, + OUTPUT_PARAMS = 16 + ], + + //SQLGetInfo +/* + SQL_INFO = + [ + SQL_ACTIVE_CONNECTIONS = 0, + SQL_MAX_DRIVER_CONNECTIONS = 0, + SQL_MAX_CONCURRENT_ACTIVITIES = 1, + SQL_ACTIVE_STATEMENTS = 1, + SQL_DATA_SOURCE_NAME = 2, + SQL_DRIVER_HDBC, + SQL_DRIVER_HENV, + SQL_DRIVER_HSTMT, + SQL_DRIVER_NAME, + SQL_DRIVER_VER, + SQL_FETCH_DIRECTION, + SQL_ODBC_API_CONFORMANCE, + SQL_ODBC_VER, + SQL_ROW_UPDATES, + SQL_ODBC_SAG_CLI_CONFORMANCE, + SQL_SERVER_NAME, + SQL_SEARCH_PATTERN_ESCAPE, + SQL_ODBC_SQL_CONFORMANCE, + + SQL_DATABASE_NAME, + SQL_DBMS_NAME, + SQL_DBMS_VER, + + SQL_ACCESSIBLE_TABLES, + SQL_ACCESSIBLE_PROCEDURES, + SQL_PROCEDURES, + SQL_CONCAT_NULL_BEHAVIOR, + SQL_CURSOR_COMMIT_BEHAVIOR, + SQL_CURSOR_ROLLBACK_BEHAVIOR, + SQL_DATA_SOURCE_READ_ONLY, + SQL_DEFAULT_TXN_ISOLATION, + SQL_EXPRESSIONS_IN_ORDERBY, + SQL_IDENTIFIER_CASE, + SQL_IDENTIFIER_QUOTE_CHAR, + SQL_MAX_COLUMN_NAME_LEN, + SQL_MAX_CURSOR_NAME_LEN, + SQL_MAX_OWNER_NAME_LEN, + SQL_MAX_SCHEMA_NAME_LEN = 32, + SQL_MAX_PROCEDURE_NAME_LEN, + SQL_MAX_QUALIFIER_NAME_LEN, + SQL_MAX_CATALOG_NAME_LEN = 34, + SQL_MAX_TABLE_NAME_LEN, + SQL_MULT_RESULT_SETS, + SQL_MULTIPLE_ACTIVE_TXN, + SQL_OUTER_JOINS, + SQL_SCHEMA_TERM, + SQL_PROCEDURE_TERM, + SQL_CATALOG_NAME_SEPARATOR, + SQL_CATALOG_TERM, + SQL_SCROLL_CONCURRENCY, + SQL_SCROLL_OPTIONS, + SQL_TABLE_TERM, + SQL_TXN_CAPABLE, + SQL_USER_NAME, + + SQL_CONVERT_FUNCTIONS, + SQL_NUMERIC_FUNCTIONS, + SQL_STRING_FUNCTIONS, + SQL_SYSTEM_FUNCTIONS, + SQL_TIMEDATE_FUNCTIONS, + + SQL_CONVERT_BIGINT, + SQL_CONVERT_BINARY, + SQL_CONVERT_BIT, + SQL_CONVERT_CHAR, + SQL_CONVERT_DATE, + SQL_CONVERT_DECIMAL, + SQL_CONVERT_DOUBLE, + SQL_CONVERT_FLOAT, + SQL_CONVERT_INTEGER, + SQL_CONVERT_LONGVARCHAR, + SQL_CONVERT_NUMERIC, + SQL_CONVERT_REAL, + SQL_CONVERT_SMALLINT, + SQL_CONVERT_TIME, + SQL_CONVERT_TIMESTAMP, + SQL_CONVERT_TINYINT, + SQL_CONVERT_VARBINARY, + SQL_CONVERT_VARCHAR, + SQL_CONVERT_LONGVARBINARY, + + SQL_TXN_ISOLATION_OPTION, + SQL_ODBC_SQL_OPT_IEF, + SQL_INTEGRITY = 73, + SQL_CORRELATION_NAME, + SQL_NON_NULLABLE_COLUMNS, + SQL_DRIVER_HLIB, + SQL_DRIVER_ODBC_VER, + SQL_LOCK_TYPES, + SQL_POS_OPERATIONS, + SQL_POSITIONED_STATEMENTS, + SQL_GETDATA_EXTENSIONS, + SQL_BOOKMARK_PERSISTENCE, + SQL_STATIC_SENSITIVITY, + SQL_FILE_USAGE, + SQL_NULL_COLLATION, + SQL_ALTER_TABLE, + SQL_COLUMN_ALIAS, + SQL_GROUP_BY, + SQL_KEYWORDS, + SQL_ORDER_BY_COLUMNS_IN_SELECT, + SQL_SCHEMA_USAGE, + SQL_CATALOG_USAGE, + SQL_QUOTED_IDENTIFIER_CASE, + SQL_SPECIAL_CHARACTERS, + SQL_SUBQUERIES, + SQL_UNION_STATEMENT, + SQL_MAX_COLUMNS_IN_GROUP_BY, + SQL_MAX_COLUMNS_IN_INDEX, + SQL_MAX_COLUMNS_IN_ORDER_BY, + SQL_MAX_COLUMNS_IN_SELECT, + SQL_MAX_COLUMNS_IN_TABLE, + SQL_MAX_INDEX_SIZE, + SQL_MAX_ROW_SIZE_INCLUDES_LONG, + SQL_MAX_ROW_SIZE, + SQL_MAX_STATEMENT_LEN, + SQL_MAX_TABLES_IN_SELECT, + SQL_MAX_USER_NAME_LEN, + SQL_MAX_CHAR_LITERAL_LEN, + SQL_TIMEDATE_ADD_INTERVALS, + SQL_TIMEDATE_DIFF_INTERVALS, + SQL_NEED_LONG_DATA_LEN, + SQL_MAX_BINARY_LITERAL_LEN, + SQL_LIKE_ESCAPE_CLAUSE, + SQL_CATALOG_LOCATION, + SQL_OJ_CAPABILITIES, + + SQL_ACTIVE_ENVIRONMENTS, + SQL_ALTER_DOMAIN, + SQL_SQL_CONFORMANCE, + SQL_DATETIME_LITERALS, + SQL_BATCH_ROW_COUNT, + SQL_BATCH_SUPPORT, + SQL_CONVERT_WCHAR, + SQL_CONVERT_INTERVAL_DAY_TIME, + SQL_CONVERT_INTERVAL_YEAR_MONTH, + SQL_CONVERT_WLONGVARCHAR, + SQL_CONVERT_WVARCHAR, + SQL_CREATE_ASSERTION, + SQL_CREATE_CHARACTER_SET, + SQL_CREATE_COLLATION, + SQL_CREATE_DOMAIN, + SQL_CREATE_SCHEMA, + SQL_CREATE_TABLE, + SQL_CREATE_TRANSLATION, + SQL_CREATE_VIEW, + SQL_DRIVER_HDESC, + SQL_DROP_ASSERTION, + SQL_DROP_CHARACTER_SET, + SQL_DROP_COLLATION, + SQL_DROP_DOMAIN, + SQL_DROP_SCHEMA, + SQL_DROP_TABLE, + SQL_DROP_TRANSLATION, + SQL_DROP_VIEW, + SQL_DYNAMIC_CURSOR_ATTRIBUTES1, + SQL_DYNAMIC_CURSOR_ATTRIBUTES2, + SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1, + SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2, + SQL_INDEX_KEYWORDS, + SQL_INFO_SCHEMA_VIEWS, + SQL_KEYSET_CURSOR_ATTRIBUTES1, + SQL_KEYSET_CURSOR_ATTRIBUTES2, + SQL_ODBC_INTERFACE_CONFORMANCE, + SQL_PARAM_ARRAY_ROW_COUNTS, + SQL_PARAM_ARRAY_SELECTS, + SQL_SQL92_DATETIME_FUNCTIONS, + SQL_SQL92_FOREIGN_KEY_DELETE_RULE, + SQL_SQL92_FOREIGN_KEY_UPDATE_RULE, + SQL_SQL92_GRANT, + SQL_SQL92_NUMERIC_VALUE_FUNCTIONS, + SQL_SQL92_PREDICATES, + SQL_SQL92_RELATIONAL_JOIN_OPERATORS, + SQL_SQL92_REVOKE, + SQL_SQL92_ROW_VALUE_CONSTRUCTOR, + SQL_SQL92_STRING_FUNCTIONS, + SQL_SQL92_VALUE_EXPRESSIONS, + SQL_STANDARD_CLI_CONFORMANCE, + SQL_STATIC_CURSOR_ATTRIBUTES1, + SQL_STATIC_CURSOR_ATTRIBUTES2, + SQL_AGGREGATE_FUNCTIONS, + SQL_DDL_INDEX, + SQL_DM_VER, + SQL_INSERT_STATEMENT, + SQL_CONVERT_GUID, + + SQL_XOPEN_CLI_YEAR = 10000, + SQL_CURSOR_SENSITIVITY, + SQL_DESCRIBE_PARAMETER, + SQL_CATALOG_NAME, + SQL_COLLATION_SEQ, + SQL_MAX_IDENTIFIER_LEN, + SQL_ASYNC_MODE = 10021, + SQL_MAX_ASYNC_CONCURRENT_STATEMENTS, + + SQL_DTC_TRANSITION_COST = 1750, + ], +*/ + SQL_OAC = + [ + SQL_OAC_None = 0x0000, + SQL_OAC_LEVEL1 = 0x0001, + SQL_OAC_LEVEL2 = 0x0002 + ], + + SQL_OSC = + [ + SQL_OSC_MINIMUM = 0x0000, + SQL_OSC_CORE = 0x0001, + SQL_OSC_EXTENDED = 0x0002 + ], + + SQL_SCC = + [ + SQL_SCC_XOPEN_CLI_VERSION1 = 0x00000001, + SQL_SCC_ISO92_CLI = 0x00000002 + ], + + SQL_SVE = + [ + SQL_SVE_CASE = 0x00000001, + SQL_SVE_CAST = 0x00000002, + SQL_SVE_COALESCE = 0x00000004, + SQL_SVE_NULLIF = 0x00000008 + ], + + SQL_SSF = + [ + SQL_SSF_CONVERT = 0x00000001, + SQL_SSF_LOWER = 0x00000002, + SQL_SSF_UPPER = 0x00000004, + SQL_SSF_SUBSTRING = 0x00000008, + SQL_SSF_TRANSLATE = 0x00000010, + SQL_SSF_TRIM_BOTH = 0x00000020, + SQL_SSF_TRIM_LEADING = 0x00000040, + SQL_SSF_TRIM_TRAILING = 0x00000080 + ], + + SQL_SP = + [ + //None = 0, + + SQL_SP_EXISTS = 0x00000001, + SQL_SP_ISNOTNULL = 0x00000002, + SQL_SP_ISNULL = 0x00000004, + SQL_SP_MATCH_FULL = 0x00000008, + SQL_SP_MATCH_PARTIAL = 0x00000010, + SQL_SP_MATCH_UNIQUE_FULL = 0x00000020, + SQL_SP_MATCH_UNIQUE_PARTIAL = 0x00000040, + SQL_SP_OVERLAPS = 0x00000080, + SQL_SP_UNIQUE = 0x00000100, + SQL_SP_LIKE = 0x00000200, + SQL_SP_IN = 0x00000400, + SQL_SP_BETWEEN = 0x00000800, + SQL_SP_COMPARISON = 0x00001000, + SQL_SP_QUANTIFIED_COMPARISON = 0x00002000, + + All = 0x0000FFFF + ], + + SQL_OIC = + [ + SQL_OIC_CORE = 1, + SQL_OIC_LEVEL1 = 2, + SQL_OIC_LEVEL2 = 3 + ], + + SQL_USAGE = + [ + SQL_U_DML_STATEMENTS = 0x00000001, + SQL_U_PROCEDURE_INVOCATION = 0x00000002, + SQL_U_TABLE_DEFINITION = 0x00000004, + SQL_U_INDEX_DEFINITION = 0x00000008, + SQL_U_PRIVILEGE_DEFINITION = 0x00000010 + ], + + SQL_GB = + [ + + SQL_GB_NOT_SUPPORTED = 0, + SQL_GB_GROUP_BY_EQUALS_SELECT = 1, + SQL_GB_GROUP_BY_CONTAINS_SELECT = 2, + SQL_GB_NO_RELATION = 3, + SQL_GB_COLLATE = 4 + ], + + SQL_NC = + [ + SQL_NC_END = 0, + SQL_NC_HIGH = 1, + SQL_NC_LOW = 2, + SQL_NC_START = 3 + ], + + SQL_CN = + [ + SQL_CN_None = 0, + SQL_CN_DIFFERENT = 1, + SQL_CN_ANY = 2 + ], + + SQL_NNC = + [ + SQL_NNC_NULL = 0, + SQL_NNC_NON_NULL = 1 + ], + + SQL_CB = + [ + SQL_CB_NULL = 0, + SQL_CB_NON_NULL = 1 + ], + + SQL_FD_FETCH = + [ + SQL_FD_FETCH_NEXT = 0x00000001, + SQL_FD_FETCH_FIRST = 0x00000002, + SQL_FD_FETCH_LAST = 0x00000004, + SQL_FD_FETCH_PRIOR = 0x00000008, + SQL_FD_FETCH_ABSOLUTE = 0x00000010, + SQL_FD_FETCH_RELATIVE = 0x00000020, + SQL_FD_FETCH_BOOKMARK = 0x00000080 + ], + + SQL_SQ = + [ + SQL_SQ_COMPARISON = 0x00000001, + SQL_SQ_EXISTS = 0x00000002, + SQL_SQ_IN = 0x00000004, + SQL_SQ_QUANTIFIED = 0x00000008, + SQL_SQ_CORRELATED_SUBQUERIES = 0x00000010 + ], + + SQL_U = + [ + SQL_U_UNION = 0x00000001, + SQL_U_UNION_ALL = 0x00000002 + ], + + SQL_BP = + [ + SQL_BP_CLOSE = 0x00000001, + SQL_BP_DELETE = 0x00000002, + SQL_BP_DROP = 0x00000004, + SQL_BP_TRANSACTION = 0x00000008, + SQL_BP_UPDATE = 0x00000010, + SQL_BP_OTHER_HSTMT = 0x00000020, + SQL_BP_SCROLL = 0x00000040 + ], + + SQL_QL = + [ + SQL_QL_START = 0x0001, + SQL_QL_END = 0x0002 + ], + + SQL_OJ = + [ + SQL_OJ_LEFT = 0x00000001, + SQL_OJ_RIGHT = 0x00000002, + SQL_OJ_FULL = 0x00000004, + SQL_OJ_NESTED = 0x00000008, + SQL_OJ_NOT_ORDERED = 0x00000010, + SQL_OJ_INNER = 0x00000020, + SQL_OJ_ALL_COMPARISON_OPS = 0x00000040 + ], + + SQL_FN_CVT = + [ + //None = 0, + + SQL_FN_CVT_CONVERT = 0x00000001, + SQL_FN_CVT_CAST = 0x00000002 + ], + + SQL_FN_NUM = + [ + //None = 0, + + SQL_FN_NUM_ABS = 0x00000001, + SQL_FN_NUM_ACOS = 0x00000002, + SQL_FN_NUM_ASIN = 0x00000004, + SQL_FN_NUM_ATAN = 0x00000008, + SQL_FN_NUM_ATAN2 = 0x00000010, + SQL_FN_NUM_CEILING = 0x00000020, + SQL_FN_NUM_COS = 0x00000040, + SQL_FN_NUM_COT = 0x00000080, + SQL_FN_NUM_EXP = 0x00000100, + SQL_FN_NUM_FLOOR = 0x00000200, + SQL_FN_NUM_LOG = 0x00000400, + SQL_FN_NUM_MOD = 0x00000800, + SQL_FN_NUM_SIGN = 0x00001000, + SQL_FN_NUM_SIN = 0x00002000, + SQL_FN_NUM_SQRT = 0x00004000, + SQL_FN_NUM_TAN = 0x00008000, + SQL_FN_NUM_PI = 0x00010000, + SQL_FN_NUM_RAND = 0x00020000, + SQL_FN_NUM_DEGREES = 0x00040000, + SQL_FN_NUM_LOG10 = 0x00080000, + SQL_FN_NUM_POWER = 0x00100000, + SQL_FN_NUM_RADIANS = 0x00200000, + SQL_FN_NUM_ROUND = 0x00400000, + SQL_FN_NUM_TRUNCATE = 0x00800000 + ], + + SQL_SNVF = + [ + SQL_SNVF_BIT_LENGTH = 0x00000001, + SQL_SNVF_CHAR_LENGTH = 0x00000002, + SQL_SNVF_CHARACTER_LENGTH = 0x00000004, + SQL_SNVF_EXTRACT = 0x00000008, + SQL_SNVF_OCTET_LENGTH = 0x00000010, + SQL_SNVF_POSITION = 0x00000020 + ], + + SQL_FN_STR = + [ + //None = 0, + + SQL_FN_STR_CONCAT = 0x00000001, + SQL_FN_STR_INSERT = 0x00000002, + SQL_FN_STR_LEFT = 0x00000004, + SQL_FN_STR_LTRIM = 0x00000008, + SQL_FN_STR_LENGTH = 0x00000010, + SQL_FN_STR_LOCATE = 0x00000020, + SQL_FN_STR_LCASE = 0x00000040, + SQL_FN_STR_REPEAT = 0x00000080, + SQL_FN_STR_REPLACE = 0x00000100, + SQL_FN_STR_RIGHT = 0x00000200, + SQL_FN_STR_RTRIM = 0x00000400, + SQL_FN_STR_SUBSTRING = 0x00000800, + SQL_FN_STR_UCASE = 0x00001000, + SQL_FN_STR_ASCII = 0x00002000, + SQL_FN_STR_CHAR = 0x00004000, + SQL_FN_STR_DIFFERENCE = 0x00008000, + SQL_FN_STR_LOCATE_2 = 0x00010000, + SQL_FN_STR_SOUNDEX = 0x00020000, + SQL_FN_STR_SPACE = 0x00040000, + SQL_FN_STR_BIT_LENGTH = 0x00080000, + SQL_FN_STR_CHAR_LENGTH = 0x00100000, + SQL_FN_STR_CHARACTER_LENGTH = 0x00200000, + SQL_FN_STR_OCTET_LENGTH = 0x00400000, + SQL_FN_STR_POSITION = 0x00800000 + ], + + SQL_FN_SYSTEM = + [ + //None = 0, + + SQL_FN_SYS_USERNAME = 0x00000001, + SQL_FN_SYS_DBNAME = 0x00000002, + SQL_FN_SYS_IFNULL = 0x00000004 + ], + + SQL_FN_TD = + [ + //None = 0, + + SQL_FN_TD_NOW = 0x00000001, + SQL_FN_TD_CURDATE = 0x00000002, + SQL_FN_TD_DAYOFMONTH = 0x00000004, + SQL_FN_TD_DAYOFWEEK = 0x00000008, + SQL_FN_TD_DAYOFYEAR = 0x00000010, + SQL_FN_TD_MONTH = 0x00000020, + SQL_FN_TD_QUARTER = 0x00000040, + SQL_FN_TD_WEEK = 0x00000080, + SQL_FN_TD_YEAR = 0x00000100, + SQL_FN_TD_CURTIME = 0x00000200, + SQL_FN_TD_HOUR = 0x00000400, + SQL_FN_TD_MINUTE = 0x00000800, + SQL_FN_TD_SECOND = 0x00001000, + SQL_FN_TD_TIMESTAMPADD = 0x00002000, + SQL_FN_TD_TIMESTAMPDIFF = 0x00004000, + SQL_FN_TD_DAYNAME = 0x00008000, + SQL_FN_TD_MONTHNAME = 0x00010000, + SQL_FN_TD_CURRENT_DATE = 0x00020000, + SQL_FN_TD_CURRENT_TIME = 0x00040000, + SQL_FN_TD_CURRENT_TIMESTAMP = 0x00080000, + SQL_FN_TD_EXTRACT = 0x00100000 + ], + + SQL_SDF = + [ + SQL_SDF_CURRENT_DATE = 0x00000001, + SQL_SDF_CURRENT_TIME = 0x00000002, + SQL_SDF_CURRENT_TIMESTAMP = 0x00000004 + ], + + SQL_TSI = + [ + //None = 0, + + SQL_TSI_FRAC_SECOND = 0x00000001, + SQL_TSI_SECOND = 0x00000002, + SQL_TSI_MINUTE = 0x00000004, + SQL_TSI_HOUR = 0x00000008, + SQL_TSI_DAY = 0x00000010, + SQL_TSI_WEEK = 0x00000020, + SQL_TSI_MONTH = 0x00000040, + SQL_TSI_QUARTER = 0x00000080, + SQL_TSI_YEAR = 0x00000100 + ], + + SQL_AF = + [ + //None = 0, + + SQL_AF_AVG = 0x00000001, + SQL_AF_COUNT = 0x00000002, + SQL_AF_MAX = 0x00000004, + SQL_AF_MIN = 0x00000008, + SQL_AF_SUM = 0x00000010, + SQL_AF_DISTINCT = 0x00000020, + SQL_AF_ALL = 0x00000040, + + All = 0xFF + ], + + SQL_SC = + [ + //None = 0, + + SQL_SC_SQL92_ENTRY = 0x00000001, + SQL_SC_FIPS127_2_TRANSITIONAL = 0x00000002, + SQL_SC_SQL92_INTERMEDIATE = 0x00000004, + SQL_SC_SQL92_FULL = 0x00000008 + ], + + SQL_DL_SQL92 = + [ + SQL_DL_SQL92_DATE = 0x00000001, + SQL_DL_SQL92_TIME = 0x00000002, + SQL_DL_SQL92_TIMESTAMP = 0x00000004, + SQL_DL_SQL92_INTERVAL_YEAR = 0x00000008, + SQL_DL_SQL92_INTERVAL_MONTH = 0x00000010, + SQL_DL_SQL92_INTERVAL_DAY = 0x00000020, + SQL_DL_SQL92_INTERVAL_HOUR = 0x00000040, + SQL_DL_SQL92_INTERVAL_MINUTE = 0x00000080, + SQL_DL_SQL92_INTERVAL_SECOND = 0x00000100, + SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH = 0x00000200, + SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR = 0x00000400, + SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE = 0x00000800, + SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND = 0x00001000, + SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE = 0x00002000, + SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND = 0x00004000, + SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND = 0x00008000 + ], + + SQL_IK = + [ + SQL_IK_NONE = 0x00000000, + SQL_IK_ASC = 0x00000001, + SQL_IK_DESC = 0x00000002, + SQL_IK_ALL = 0x00000003 //SQL_IK_ASC | SQL_IK_DESC + ], + + SQL_ISV = + [ + SQL_ISV_ASSERTIONS = 0x00000001, + SQL_ISV_CHARACTER_SETS = 0x00000002, + SQL_ISV_CHECK_CONSTRAINTS = 0x00000004, + SQL_ISV_COLLATIONS = 0x00000008, + SQL_ISV_COLUMN_DOMAIN_USAGE = 0x00000010, + SQL_ISV_COLUMN_PRIVILEGES = 0x00000020, + SQL_ISV_COLUMNS = 0x00000040, + SQL_ISV_CONSTRAINT_COLUMN_USAGE = 0x00000080, + SQL_ISV_CONSTRAINT_TABLE_USAGE = 0x00000100, + SQL_ISV_DOMAIN_CONSTRAINTS = 0x00000200, + SQL_ISV_DOMAINS = 0x00000400, + SQL_ISV_KEY_COLUMN_USAGE = 0x00000800, + SQL_ISV_REFERENTIAL_CONSTRAINTS = 0x00001000, + SQL_ISV_SCHEMATA = 0x00002000, + SQL_ISV_SQL_LANGUAGES = 0x00004000, + SQL_ISV_TABLE_CONSTRAINTS = 0x00008000, + SQL_ISV_TABLE_PRIVILEGES = 0x00010000, + SQL_ISV_TABLES = 0x00020000, + SQL_ISV_TRANSLATIONS = 0x00040000, + SQL_ISV_USAGE_PRIVILEGES = 0x00080000, + SQL_ISV_VIEW_COLUMN_USAGE = 0x00100000, + SQL_ISV_VIEW_TABLE_USAGE = 0x00200000, + SQL_ISV_VIEWS = 0x00400000 + ], + + SQL_SRJO = + [ + //None = 0, + + SQL_SRJO_CORRESPONDING_CLAUSE = 0x00000001, + SQL_SRJO_CROSS_JOIN = 0x00000002, + SQL_SRJO_EXCEPT_JOIN = 0x00000004, + SQL_SRJO_FULL_OUTER_JOIN = 0x00000008, + SQL_SRJO_INNER_JOIN = 0x00000010, + SQL_SRJO_INTERSECT_JOIN = 0x00000020, + SQL_SRJO_LEFT_OUTER_JOIN = 0x00000040, + SQL_SRJO_NATURAL_JOIN = 0x00000080, + SQL_SRJO_RIGHT_OUTER_JOIN = 0x00000100, + SQL_SRJO_UNION_JOIN = 0x00000200 + ], + + SQL_SRVC = + [ + SQL_SRVC_VALUE_EXPRESSION = 0x00000001, + SQL_SRVC_NULL = 0x00000002, + SQL_SRVC_DEFAULT = 0x00000004, + SQL_SRVC_ROW_SUBQUERY = 0x00000008 + ], + + //public static readonly int SQL_OV_ODBC3 = 3; + //public const Int32 SQL_NTS = -3; //flags for null-terminated string + + //Pooling + SQL_CP = + [ + OFF = 0, + ONE_PER_DRIVER = 1, + ONE_PER_HENV = 2 + ], + +/* + public const Int32 SQL_CD_TRUE = 1; + public const Int32 SQL_CD_FALSE = 0; + + public const Int32 SQL_DTC_DONE = 0; + public const Int32 SQL_IS_POINTER = -4; + public const Int32 SQL_IS_PTR = 1; +*/ + SQL_DRIVER = + [ + NOPROMPT = 0, + COMPLETE = 1, + PROMPT = 2, + COMPLETE_REQUIRED = 3 + ], + + // Column set for SQLPrimaryKeys + SQL_PRIMARYKEYS = + [ + /* + CATALOGNAME = 1, // TABLE_CAT + SCHEMANAME = 2, // TABLE_SCHEM + TABLENAME = 3, // TABLE_NAME + */ + COLUMNNAME = 4 // COLUMN_NAME + /* + KEY_SEQ = 5, // KEY_SEQ + PKNAME = 6, // PK_NAME + */ + ], + + // Column set for SQLStatistics + SQL_STATISTICS = + [ + /* + CATALOGNAME = 1, // TABLE_CAT + SCHEMANAME = 2, // TABLE_SCHEM + TABLENAME = 3, // TABLE_NAME + NONUNIQUE = 4, // NON_UNIQUE + INDEXQUALIFIER = 5, // INDEX_QUALIFIER + */ + INDEXNAME = 6, // INDEX_NAME + /* + TYPE = 7, // TYPE + */ + ORDINAL_POSITION = 8, // ORDINAL_POSITION + COLUMN_NAME = 9 // COLUMN_NAME + /* + ASC_OR_DESC = 10, // ASC_OR_DESC + CARDINALITY = 11, // CARDINALITY + PAGES = 12, // PAGES + FILTER_CONDITION = 13, // FILTER_CONDITION + */ + ], + + // Column set for SQLSpecialColumns + SQL_SPECIALCOLUMNSET = + [ + /* + SCOPE = 1, // SCOPE + */ + COLUMN_NAME = 2 // COLUMN_NAME + /* + DATA_TYPE = 3, // DATA_TYPE + TYPE_NAME = 4, // TYPE_NAME + COLUMN_SIZE = 5, // COLUMN_SIZE + BUFFER_LENGTH = 6, // BUFFER_LENGTH + DECIMAL_DIGITS = 7, // DECIMAL_DIGITS + PSEUDO_COLUMN = 8, // PSEUDO_COLUMN + */ + ], + + SQL_DIAG = + [ + CURSOR_ROW_COUNT= -1249, + ROW_NUMBER = -1248, + COLUMN_NUMBER = -1247, + RETURNCODE = 1, + NUMBER = 2, + ROW_COUNT = 3, + SQLSTATE = 4, + NATIVE = 5, + MESSAGE_TEXT = 6, + DYNAMIC_FUNCTION = 7, + CLASS_ORIGIN = 8, + SUBCLASS_ORIGIN = 9, + CONNECTION_NAME = 10, + SERVER_NAME = 11, + DYNAMIC_FUNCTION_CODE = 12 + ], + + SQL_SU = + [ + SQL_SU_DML_STATEMENTS = 0x00000001, + SQL_SU_PROCEDURE_INVOCATION = 0x00000002, + SQL_SU_TABLE_DEFINITION = 0x00000004, + SQL_SU_INDEX_DEFINITION = 0x00000008, + SQL_SU_PRIVILEGE_DEFINITION = 0x00000010 + ] +] diff --git a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.mproj b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.mproj index 0987401eb4..543b5652c8 100644 --- a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.mproj +++ b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.mproj @@ -66,6 +66,12 @@ Code + + Content + + + Content + Code diff --git a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq index 6b9abdba5b..86ff0efef8 100644 --- a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq +++ b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq @@ -1,6 +1,12 @@ -// This file contains your Data Connector logic +// This file contains Data Connector logic section OdfeSqlOdbcPBIConnector; +// When set to true, additional trace information will be written out to the User log. +// This should be set to false before release. Tracing is done through a call to +// Diagnostics.LogValue(). When EnableTraceOutput is set to false, the call becomes a +// no-op and simply returns the original value. +EnableTraceOutput = true; + [DataSource.Kind="OdfeSqlOdbcPBIConnector", Publish="OdfeSqlOdbcPBIConnector.Publish"] shared OdfeSqlOdbcPBIConnector.Contents = Value.ReplaceType(OdfeSqlOdbcPBIConnectorImpl, OdfeSqlOdbcPBIConnectorType); @@ -8,12 +14,12 @@ shared OdfeSqlOdbcPBIConnector.Contents = Value.ReplaceType(OdfeSqlOdbcPBIConnec OdfeSqlOdbcPBIConnectorType = type function ( Host as (type text meta [ Documentation.FieldCaption = "Host", - Documentation.FieldDescription = "The hostname of the Open Distro For Elasticsearc server.", + Documentation.FieldDescription = "The hostname of the Open Distro For Elasticsearch server.", Documentation.SampleValues = { "localhost" } ]), - Port as (type number meta [ + optional Port as (type number meta [ Documentation.FieldCaption = "Port", - Documentation.FieldDescription = "The port the Open Distro For Elasticsearc server is running on.", + Documentation.FieldDescription = "The port of the Open Distro For Elasticsearch server is running on.", Documentation.SampleValues = { 9200 } ]) ) @@ -21,22 +27,174 @@ OdfeSqlOdbcPBIConnectorType = type function ( Documentation.Name = "Open Distro For Elasticsearch" ]; -OdfeSqlOdbcPBIConnectorImpl = (Host as text, Port as number) as table => +OdfeSqlOdbcPBIConnectorImpl = (Host as text, optional Port as number) as table => let + Credential = Extension.CurrentCredential(), + AuthenticationMode = Credential[AuthenticationKind], + + // Sets connection string properties for authentication. + CredentialConnectionString = + if AuthenticationMode = "UsernamePassword" then + [ + Auth = "BASIC", + UID = Credential[Username], + PWD = Credential[Password] + ] + else if AuthenticationMode = "Key" then + [ + Auth = "AWS_SIGV4", + Region = Credential[Key] + ] + else + [ + Auth = "NONE" + ], + + // Set host & port in connection string. + // Do not include port in connection string for aws server connection. + Server = + if Port <> null then + [ + Host = Host, + Port = Port + ] + else + [ + Host = Host + ], + ConnectionString = [ - Driver = "ODFE SQL ODBC Driver", - Host = Host, - Port = Port + Driver = "ODFE SQL ODBC Driver" + ], + + SqlCapabilities = Diagnostics.LogValue("SqlCapabilities_Options", [ + GroupByCapabilities = ODBC[SQL_GB][SQL_GB_COLLATE] + ]), + + SQLGetInfo = Diagnostics.LogValue("SQLGetInfo_Options", [ + SQL_SQL92_PREDICATES = ODBC[SQL_SP][All], + SQL_AGGREGATE_FUNCTIONS = ODBC[SQL_AF][All] + ]), + + SQLGetTypeInfo = (types) => + if (EnableTraceOutput <> true) then types else + let + // Outputting the entire table might be too large, and result in the value being truncated. + // We can output a row at a time instead with Table.TransformRows() + rows = Table.TransformRows(types, each Diagnostics.LogValue("SQLGetTypeInfo " & _[TYPE_NAME], _)), + toTable = Table.FromRecords(rows) + in + Value.ReplaceType(toTable, Value.Type(types)), + + // SQLColumns is a function handler that receives the results of an ODBC call to SQLColumns(). + SQLColumns = (catalogName, schemaName, tableName, columnName, source) => + if (EnableTraceOutput <> true) then source else + // the if statement conditions will force the values to evaluated/written to diagnostics + if (Diagnostics.LogValue("SQLColumns.TableName", tableName) <> "***" and Diagnostics.LogValue("SQLColumns.ColumnName", columnName) <> "***") then + let + // Outputting the entire table might be too large, and result in the value being truncated. + // We can output a row at a time instead with Table.TransformRows() + rows = Table.TransformRows(source, each Diagnostics.LogValue("SQLColumns", _)), + toTable = Table.FromRecords(rows) + in + Value.ReplaceType(toTable, Value.Type(source)) + else + source, + + // Add support for `LIMIT` and `OFFSET` clauses (rather than `TOP`) + AstVisitor = [ + // format is "LIMIT [,]" - ex. LIMIT 2,10 or LIMIT 10 + LimitClause = (skip, take) => + if (take = null) then + ... + else + let + skip = + if (skip = null or skip = 0) then + "" + else + Number.ToText(skip) & "," + in + [ + Text = Text.Format("LIMIT #{0}#{1}", { skip, take }), + Location = "AfterQuerySpecification" + ] ], - OdbcDatasource = Odbc.DataSource(ConnectionString) + + OdbcDatasource = Odbc.DataSource(ConnectionString & Server & CredentialConnectionString, [ + // Do not view the tables grouped by their schema names. + HierarchicalNavigation = false, + // Prevents execution of native SQL statements. Extensions should set this to true. + HideNativeQuery = true, + // Allows upconversion of numeric types + SoftNumbers = true, + // Allow upconversion / resizing of numeric and string types + TolerateConcatOverflow = true, + // Enables connection pooling via the system ODBC manager + ClientConnectionPooling = true, + + // These values should be set by previous steps + AstVisitor = AstVisitor, + SqlCapabilities = SqlCapabilities, + SQLColumns = SQLColumns, + SQLGetInfo = SQLGetInfo, + SQLGetTypeInfo = SQLGetTypeInfo, + + OnError = OnOdbcError + ]) in OdbcDatasource; +// Handles ODBC errors. +OnOdbcError = (errorRecord as record) => + let + ErrorMessage = errorRecord[Message], + ConnectionHostPort = errorRecord[Detail][DataSourcePath], + + IsDriverNotInstalled = Text.Contains(ErrorMessage, "doesn't correspond to an installed ODBC driver"), + + OdbcError = errorRecord[Detail][OdbcErrors]{0}, + OdbcErrorCode = OdbcError[NativeError], + + // Failed to connect to given host + IsHostUnreachable = + OdbcErrorCode = 202 + in + if IsDriverNotInstalled then + error Error.Record("", "The Open Distro For Elasticsearch SQL ODBC driver is not installed. Please install the driver.") + else if IsHostUnreachable then + error Error.Record("", "Could not connect to server. Please check server is up and configuration is correct. ") + else + error errorRecord; + // Data Source Kind description OdfeSqlOdbcPBIConnector = [ + // Required for use with Power BI Service. + TestConnection = (dataSourcePath) => + let + json = Json.Document(dataSourcePath), + Host = json[Host], + Port = json[Port] + in + { "OdfeSqlOdbcPBIConnector.Contents", Host, Port }, + + // Authentication modes Authentication = [ - Implicit = [] + Implicit = [ + Label = "NONE" + ], + UsernamePassword = [ + Label = "BASIC" + ], + Key = [ + Label = "AWS_SIGV4", + KeyLabel = "Region" + ] ], + + // Enable Encryption + SupportsEncryption = true, + Label = Extension.LoadString("DataSourceLabel") ]; @@ -46,6 +204,7 @@ OdfeSqlOdbcPBIConnector.Publish = [ Category = "Other", ButtonText = { Extension.LoadString("ButtonTitle"), Extension.LoadString("ButtonHelp") }, LearnMoreUrl = "https://opendistro.github.io/for-elasticsearch/", + SupportsDirectQuery = true, SourceImage = OdfeSqlOdbcPBIConnector.Icons, SourceTypeImage = OdfeSqlOdbcPBIConnector.Icons ]; @@ -54,3 +213,18 @@ OdfeSqlOdbcPBIConnector.Icons = [ Icon16 = { Extension.Contents("OdfeSqlOdbcPBIConnector16.png"), Extension.Contents("OdfeSqlOdbcPBIConnector20.png"), Extension.Contents("OdfeSqlOdbcPBIConnector24.png"), Extension.Contents("OdfeSqlOdbcPBIConnector32.png") }, Icon32 = { Extension.Contents("OdfeSqlOdbcPBIConnector32.png"), Extension.Contents("OdfeSqlOdbcPBIConnector40.png"), Extension.Contents("OdfeSqlOdbcPBIConnector48.png"), Extension.Contents("OdfeSqlOdbcPBIConnector64.png") } ]; + +// Load common library functions +Extension.LoadFunction = (name as text) => + let + binary = Extension.Contents(name), + asText = Text.FromBinary(binary) + in + Expression.Evaluate(asText, #shared); + +// Diagnostics module contains multiple functions. . +Diagnostics = Extension.LoadFunction("Diagnostics.pqm"); +Diagnostics.LogValue = if (EnableTraceOutput) then Diagnostics[LogValue] else (prefix, value) => value; + +// OdbcConstants contains numeric constants from the ODBC header files, and helper function to create bitfield values. +ODBC = Extension.LoadFunction("OdbcConstants.pqm"); diff --git a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.query.pq b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.query.pq index 7b2a564376..7632a6884a 100644 --- a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.query.pq +++ b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.query.pq @@ -1,5 +1,310 @@ -// Use this file to write queries to test your data connector -let - result = OdfeSqlOdbcPBIConnector.Contents() -in - result \ No newline at end of file +// This file contains queries to test your data connector +section OdfeSqlOdbcPBIConnector.UnitTests; + +shared MyExtension.UnitTest = +[ + // Common variables for all tests + Host = "localhost", + Port = 9200, + + facts = + { + Fact("Connection Test", + 7, + let + Source = OdfeSqlOdbcPBIConnector.Contents(Host,Port), + no_of_columns = Table.ColumnCount(Source) + in + no_of_columns + ) + }, + + report = Facts.Summarize(facts) +][report]; + +/// COMMON UNIT TESTING CODE +Fact = (_subject as text, _expected, _actual) as record => +[ expected = try _expected, + safeExpected = if expected[HasError] then "Expected : "& @ValueToText(expected[Error]) else expected[Value], + actual = try _actual, + safeActual = if actual[HasError] then "Actual : "& @ValueToText(actual[Error]) else actual[Value], + attempt = try safeExpected = safeActual, + result = if attempt[HasError] or not attempt[Value] then "Failure ⛔" else "Success ✓", + resultOp = if result = "Success ✓" then " = " else " <> ", + addendumEvalAttempt = if attempt[HasError] then @ValueToText(attempt[Error]) else "", + addendumEvalExpected = try @ValueToText(safeExpected) otherwise "...", + addendumEvalActual = try @ValueToText (safeActual) otherwise "...", + fact = + [ Result = result &" "& addendumEvalAttempt, + Notes =_subject, + Details = " ("& addendumEvalExpected & resultOp & addendumEvalActual &")" + ] +][fact]; + +Facts = (_subject as text, _predicates as list) => List.Transform(_predicates, each Fact(_subject,_{0},_{1})); + +Facts.Summarize = (_facts as list) as table => +[ Fact.CountSuccesses = (count, i) => + [ result = try i[Result], + sum = if result[HasError] or not Text.StartsWith(result[Value], "Success") then count else count + 1 + ][sum], + passed = List.Accumulate(_facts, 0, Fact.CountSuccesses), + total = List.Count(_facts), + format = if passed = total then "All #{0} Passed !!! ✓" else "#{0} Passed ☺ #{1} Failed ☹", + result = if passed = total then "Success" else "⛔", + rate = Number.IntegerDivide(100*passed, total), + header = + [ Result = result, + Notes = Text.Format(format, {passed, total-passed}), + Details = Text.Format("#{0}% success rate", {rate}) + ], + report = Table.FromRecords(List.Combine({{header},_facts})) +][report]; + +ValueToText = (value, optional depth) => + let + _canBeIdentifier = (x) => + let + keywords = {"and", "as", "each", "else", "error", "false", "if", "in", "is", "let", "meta", "not", "otherwise", "or", "section", "shared", "then", "true", "try", "type" }, + charAlpha = (c as number) => (c>= 65 and c <= 90) or (c>= 97 and c <= 122) or c=95, + charDigit = (c as number) => c>= 48 and c <= 57 + in + try + charAlpha(Character.ToNumber(Text.At(x,0))) + and + List.MatchesAll( + Text.ToList(x), + (c)=> let num = Character.ToNumber(c) in charAlpha(num) or charDigit(num) + ) + and not + List.MatchesAny( keywords, (li)=> li=x ) + otherwise + false, + + Serialize.Binary = (x) => "#binary(" & Serialize(Binary.ToList(x)) & ") ", + + Serialize.Date = (x) => "#date(" & + Text.From(Date.Year(x)) & ", " & + Text.From(Date.Month(x)) & ", " & + Text.From(Date.Day(x)) & ") ", + + Serialize.Datetime = (x) => "#datetime(" & + Text.From(Date.Year(DateTime.Date(x))) & ", " & + Text.From(Date.Month(DateTime.Date(x))) & ", " & + Text.From(Date.Day(DateTime.Date(x))) & ", " & + Text.From(Time.Hour(DateTime.Time(x))) & ", " & + Text.From(Time.Minute(DateTime.Time(x))) & ", " & + Text.From(Time.Second(DateTime.Time(x))) & ") ", + + Serialize.Datetimezone =(x) => let + dtz = DateTimeZone.ToRecord(x) + in + "#datetimezone(" & + Text.From(dtz[Year]) & ", " & + Text.From(dtz[Month]) & ", " & + Text.From(dtz[Day]) & ", " & + Text.From(dtz[Hour]) & ", " & + Text.From(dtz[Minute]) & ", " & + Text.From(dtz[Second]) & ", " & + Text.From(dtz[ZoneHours]) & ", " & + Text.From(dtz[ZoneMinutes]) & ") ", + + Serialize.Duration = (x) => let + dur = Duration.ToRecord(x) + in + "#duration(" & + Text.From(dur[Days]) & ", " & + Text.From(dur[Hours]) & ", " & + Text.From(dur[Minutes]) & ", " & + Text.From(dur[Seconds]) & ") ", + + Serialize.Function = (x) => _serialize_function_param_type( + Type.FunctionParameters(Value.Type(x)), + Type.FunctionRequiredParameters(Value.Type(x)) ) & + " as " & + _serialize_function_return_type(Value.Type(x)) & + " => (...) ", + + Serialize.List = (x) => "{" & + List.Accumulate(x, "", (seed,item) => if seed="" then Serialize(item) else seed & ", " & Serialize(item)) & + "} ", + + Serialize.Logical = (x) => Text.From(x), + + Serialize.Null = (x) => "null", + + Serialize.Number = (x) => + let Text.From = (i as number) as text => + if Number.IsNaN(i) then "#nan" else + if i=Number.PositiveInfinity then "#infinity" else + if i=Number.NegativeInfinity then "-#infinity" else + Text.From(i) + in + Text.From(x), + + Serialize.Record = (x) => "[ " & + List.Accumulate( + Record.FieldNames(x), + "", + (seed,item) => + (if seed="" then Serialize.Identifier(item) else seed & ", " & Serialize.Identifier(item)) & " = " & Serialize(Record.Field(x, item)) + ) & + " ] ", + + Serialize.Table = (x) => "#table( type " & + _serialize_table_type(Value.Type(x)) & + ", " & + Serialize(Table.ToRows(x)) & + ") ", + + Serialize.Text = (x) => """" & + _serialize_text_content(x) & + """", + + _serialize_text_content = (x) => let + escapeText = (n as number) as text => "#(#)(" & Text.PadStart(Number.ToText(n, "X", "en-US"), 4, "0") & ")" + in + List.Accumulate( + List.Transform( + Text.ToList(x), + (c) => let n=Character.ToNumber(c) in + if n = 9 then "#(#)(tab)" else + if n = 10 then "#(#)(lf)" else + if n = 13 then "#(#)(cr)" else + if n = 34 then """""" else + if n = 35 then "#(#)(#)" else + if n < 32 then escapeText(n) else + if n < 127 then Character.FromNumber(n) else + escapeText(n) + ), + "", + (s,i)=>s&i + ), + + Serialize.Identifier = (x) => + if _canBeIdentifier(x) then + x + else + "#""" & + _serialize_text_content(x) & + """", + + Serialize.Time = (x) => "#time(" & + Text.From(Time.Hour(x)) & ", " & + Text.From(Time.Minute(x)) & ", " & + Text.From(Time.Second(x)) & ") ", + + Serialize.Type = (x) => "type " & _serialize_typename(x), + + + _serialize_typename = (x, optional funtype as logical) => /* Optional parameter: Is this being used as part of a function signature? */ + let + isFunctionType = (x as type) => try if Type.FunctionReturn(x) is type then true else false otherwise false, + isTableType = (x as type) => try if Type.TableSchema(x) is table then true else false otherwise false, + isRecordType = (x as type) => try if Type.ClosedRecord(x) is type then true else false otherwise false, + isListType = (x as type) => try if Type.ListItem(x) is type then true else false otherwise false + in + + if funtype=null and isTableType(x) then _serialize_table_type(x) else + if funtype=null and isListType(x) then "{ " & @_serialize_typename( Type.ListItem(x) ) & " }" else + if funtype=null and isFunctionType(x) then "function " & _serialize_function_type(x) else + if funtype=null and isRecordType(x) then _serialize_record_type(x) else + + if x = type any then "any" else + let base = Type.NonNullable(x) in + (if Type.IsNullable(x) then "nullable " else "") & + (if base = type anynonnull then "anynonnull" else + if base = type binary then "binary" else + if base = type date then "date" else + if base = type datetime then "datetime" else + if base = type datetimezone then "datetimezone" else + if base = type duration then "duration" else + if base = type logical then "logical" else + if base = type none then "none" else + if base = type null then "null" else + if base = type number then "number" else + if base = type text then "text" else + if base = type time then "time" else + if base = type type then "type" else + + /* Abstract types: */ + if base = type function then "function" else + if base = type table then "table" else + if base = type record then "record" else + if base = type list then "list" else + + "any /*Actually unknown type*/"), + + _serialize_table_type = (x) => + let + schema = Type.TableSchema(x) + in + "table " & + (if Table.IsEmpty(schema) then "" else + "[" & List.Accumulate( + List.Transform( + Table.ToRecords(Table.Sort(schema,"Position")), + each Serialize.Identifier(_[Name]) & " = " & _[Kind]), + "", + (seed,item) => (if seed="" then item else seed & ", " & item ) + ) & "] " ), + + _serialize_record_type = (x) => + let flds = Type.RecordFields(x) + in + if Record.FieldCount(flds)=0 then "record" else + "[" & List.Accumulate( + Record.FieldNames(flds), + "", + (seed,item) => + seed & + (if seed<>"" then ", " else "") & + (Serialize.Identifier(item) & "=" & _serialize_typename(Record.Field(flds,item)[Type]) ) + ) & + (if Type.IsOpenRecord(x) then ",..." else "") & + "]", + + _serialize_function_type = (x) => _serialize_function_param_type( + Type.FunctionParameters(x), + Type.FunctionRequiredParameters(x) ) & + " as " & + _serialize_function_return_type(x), + + _serialize_function_param_type = (t,n) => + let + funsig = Table.ToRecords( + Table.TransformColumns( + Table.AddIndexColumn( Record.ToTable( t ), "isOptional", 1 ), + { "isOptional", (x)=> x>n } ) ) + in + "(" & + List.Accumulate( + funsig, + "", + (seed,item)=> + (if seed="" then "" else seed & ", ") & + (if item[isOptional] then "optional " else "") & + Serialize.Identifier(item[Name]) & " as " & _serialize_typename(item[Value], true) ) + & ")", + + _serialize_function_return_type = (x) => _serialize_typename(Type.FunctionReturn(x), true), + + Serialize = (x) as text => + if x is binary then try Serialize.Binary(x) otherwise "null /*serialize failed*/" else + if x is date then try Serialize.Date(x) otherwise "null /*serialize failed*/" else + if x is datetime then try Serialize.Datetime(x) otherwise "null /*serialize failed*/" else + if x is datetimezone then try Serialize.Datetimezone(x) otherwise "null /*serialize failed*/" else + if x is duration then try Serialize.Duration(x) otherwise "null /*serialize failed*/" else + if x is function then try Serialize.Function(x) otherwise "null /*serialize failed*/" else + if x is list then try Serialize.List(x) otherwise "null /*serialize failed*/" else + if x is logical then try Serialize.Logical(x) otherwise "null /*serialize failed*/" else + if x is null then try Serialize.Null(x) otherwise "null /*serialize failed*/" else + if x is number then try Serialize.Number(x) otherwise "null /*serialize failed*/" else + if x is record then try Serialize.Record(x) otherwise "null /*serialize failed*/" else + if x is table then try Serialize.Table(x) otherwise "null /*serialize failed*/" else + if x is text then try Serialize.Text(x) otherwise "null /*serialize failed*/" else + if x is time then try Serialize.Time(x) otherwise "null /*serialize failed*/" else + if x is type then try Serialize.Type(x) otherwise "null /*serialize failed*/" else + "[#_unable_to_serialize_#]" + in + try Serialize(value) otherwise ""; \ No newline at end of file diff --git a/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez b/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez index 02d8c023aeae94935c8962caf72a1921977033ca..c1c08cf92b3eadc3dd16c49bac91a505f740c022 100644 GIT binary patch delta 15016 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 delta 989 zcmccH%G5fOQ98hznMH(wfq{cTAmnR+n9uxL24)6^5>5sN$;lt>rRw!^=Z5;`-*OPx ztNc;k&92eK*J<&JT$iOxolUc*ZJF>*pfKVM>-sHkcI|$xkvTQ~nsa^7f2Z_6jg7}t z4y3+KefD8ZWagiR)MpxA}+K zmZm_9=a1!!M9ww6zE>bx7PkIsefIV#R&G5FzvWxGcE`DHx!&|TMXj}0%lVJZf!U94 z3L4w2vAT6!{rJ?)7h3au)b9L0m3)%PuCk+Yu~O!ap48P`6NP4{JE$)7yU*L5oR=_f zg%8tmMYCUiEiw@jT(^>i^4bJcuDx9P<7CF^_1DV|D2KbB=Gqdt-tph=E7uq|U+}0` zmf2sv;mM1Wxsp!%8~G-wUYk3&OmPR#ZympbyB-L3T(2@qK9HMmL@QgUu)`pDqbj>C zd;9yvGqfc*UiY+d=X4aGTqE50^bAYF&Yh2s-LJhgW8p2EuWdfRSm#|~oLn-2y+8HY zmYrWu9i0cbSsC_tsnrL1tzcDnGOuXQTN&BhR}*ZXb9X(s z!SnuQ+1J?{=ASfvvadVuN$SnZU-rG*A4c7cYw3^lIOE1J!cXtuj27 zy>k^qcm2Pa#=_~|!Y=;Y;9n8zV#oFK-{))3D0;c<^fi0U^?AG2Xzmbmd3rHn)60ZI z0k=M!4!nBf*{u50dLg36BJCtEdCqKPIBU&uT5naz_K-);O?Q`Gkeasr?kuM#jT|hY zW!7hHPiOB+GWPp7=lo1grdnwIFc_uCx zbw?c2gyt2$Ha;$X%Vx>8q*879>dxXQ-;8O2$L-JB@(cMDt-pCovcBYG>KoIC8!xcT zj;_7bc3)!BvF-68cvH5-xPZdpj!=uHz?E2%&x<|Xt$1Z+#xw7Wf@vMz2A8huVyV!Y>AD>6n-IJ5T zo&`=_Z~Z$g^1z$YZzmN)=k2jn;CT6E$qJ*-f8;j{TV}e+W8@KF&Orj895dOlL5Inl zd9q@Y Date: Wed, 22 Jul 2020 20:21:15 -0700 Subject: [PATCH 14/27] add connector --- .../bin/Release/OdfeSqlOdbcPBIConnector.mez | Bin 0 -> 33492 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez diff --git a/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez b/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez new file mode 100644 index 0000000000000000000000000000000000000000..39d72b741d5976d7e6721e9bedc86eda9d8b5168 GIT binary patch literal 33492 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 literal 0 HcmV?d00001 From ad73d915d13dce97ea855154d9428e67b09368a9 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Wed, 22 Jul 2020 20:41:43 -0700 Subject: [PATCH 15/27] update doc --- sql-odbc/docs/user/img/pbi_auth.png | Bin 12324 -> 14496 bytes sql-odbc/docs/user/power_bi_support.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-odbc/docs/user/img/pbi_auth.png b/sql-odbc/docs/user/img/pbi_auth.png index 12e1af8ed6edd18d0c6f8ca760fc632a1972ce57..0795d63d95d0721d7c11ebc505c7573191a75b7d 100644 GIT binary patch literal 14496 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 XskAlMEj>}KwtprkVuyj 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 -* Select authentication option and click on **Connect**. +* Select authentication option. Enter credentials if required and click on **Connect**. From 91d5cbebad32016daa6445db98ad0fc938a0be65 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Wed, 22 Jul 2020 20:59:03 -0700 Subject: [PATCH 16/27] add ssl for auth --- .../OdfeSqlOdbcPBIConnector.pq | 18 ++++++++++++++++-- .../bin/Release/OdfeSqlOdbcPBIConnector.mez | Bin 33492 -> 33557 bytes 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq index 4ac49de19b..b296d40d67 100644 --- a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq +++ b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq @@ -50,6 +50,17 @@ OdfeSqlOdbcPBIConnectorImpl = (Host as text, optional Port as number) as table = Auth = "NONE" ], + // Sets connection string properties for encrypted connections. + EncryptedConnectionString = + if Credential[EncryptConnection] = null or Credential[EncryptConnection] = true then + [ + UseSSL = 1 + ] + else + [ + UseSSL = 0 + ], + // Set host & port in connection string. // Do not include port in connection string for aws server connection. Server = @@ -140,7 +151,10 @@ OdfeSqlOdbcPBIConnectorImpl = (Host as text, optional Port as number) as table = SQLGetInfo = SQLGetInfo, SQLGetTypeInfo = SQLGetTypeInfo, - OnError = OnOdbcError + OnError = OnOdbcError, + + // Connection string properties used for encrypted connections. + CredentialConnectionString = EncryptedConnectionString ]) in OdbcDatasource; @@ -163,7 +177,7 @@ OnOdbcError = (errorRecord as record) => if IsDriverNotInstalled then error Error.Record("", "The Open Distro For Elasticsearch SQL ODBC driver is not installed. Please install the driver.") else if IsHostUnreachable then - error Error.Record("", "Could not connect to server. Please check server is up and configuration is correct. ") + error Error.Record("", "Unable to connect. Please check server is up and configurations are correct. ") else error errorRecord; diff --git a/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez b/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez index 39d72b741d5976d7e6721e9bedc86eda9d8b5168..0e382074468eb460d49c6723d22afe2303a2b510 100644 GIT binary patch delta 3189 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 b0{&`~p@12ae1b3mV3VzaAqJ>_00000u_Xs+ delta 3131 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 V8I!$&FaaNv?t&o(XMX?y0027R>Mj5P From ddc725bd3cfd70d3501ae325871eaab73b669fd3 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Thu, 23 Jul 2020 09:25:05 -0700 Subject: [PATCH 17/27] update docs for errors --- sql-odbc/docs/user/img/pbi_error_conn.png | Bin 0 -> 13047 bytes .../img/pbi_error_driver_not_installed.png | Bin 0 -> 15118 bytes sql-odbc/docs/user/power_bi_support.md | 17 ++++++++++++++++- .../OdfeSqlOdbcPBIConnector.pq | 4 ++-- .../bin/Release/OdfeSqlOdbcPBIConnector.mez | Bin 33557 -> 33555 bytes 5 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 sql-odbc/docs/user/img/pbi_error_conn.png create mode 100644 sql-odbc/docs/user/img/pbi_error_driver_not_installed.png diff --git a/sql-odbc/docs/user/img/pbi_error_conn.png b/sql-odbc/docs/user/img/pbi_error_conn.png new file mode 100644 index 0000000000000000000000000000000000000000..87f908a39710bb316c0d42765fa8e60b1a90d3e0 GIT binary patch literal 13047 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 literal 0 HcmV?d00001 diff --git a/sql-odbc/docs/user/img/pbi_error_driver_not_installed.png b/sql-odbc/docs/user/img/pbi_error_driver_not_installed.png new file mode 100644 index 0000000000000000000000000000000000000000..b5059bc0b4af3bdaba5e969703d0da02a1a187d5 GIT binary patch literal 15118 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 -* Click on **Load**. \ No newline at end of file +* Click on **Load**. + +## Troubleshooting + +* If you get an following error, please install [Open Distro For Elasticsearch SQL ODBC Driver](https://opendistro.github.io/for-elasticsearch-docs/docs/sql/odbc/). + + + +* If you get an following error, + + + +1. Check if host and port values are correct. +2. Check if auth credentials are correct. +3. Check if server is running. + diff --git a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq index b296d40d67..36caa6184e 100644 --- a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq +++ b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq @@ -175,9 +175,9 @@ OnOdbcError = (errorRecord as record) => OdbcErrorCode = 202 in if IsDriverNotInstalled then - error Error.Record("", "The Open Distro For Elasticsearch SQL ODBC driver is not installed. Please install the driver.") + error Error.Record("", "The Open Distro For Elasticsearch SQL ODBC driver is not installed. Please install the driver") else if IsHostUnreachable then - error Error.Record("", "Unable to connect. Please check server is up and configurations are correct. ") + error Error.Record("", "Couldn't reach server. Please double-check the host, port and auth.") else error errorRecord; diff --git a/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez b/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez index 0e382074468eb460d49c6723d22afe2303a2b510..b4d89870c0d89b7e05c3f71c4bbdafc31066d37b 100644 GIT binary patch delta 3188 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 delta 3187 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 Date: Fri, 24 Jul 2020 13:09:56 -0700 Subject: [PATCH 18/27] - remove sqlgetinfo & sqlcapabilities values from connector --- .../OdfeSqlOdbcPBIConnector.pq | 11 ----------- .../bin/Release/OdfeSqlOdbcPBIConnector.mez | Bin 33555 -> 33422 bytes 2 files changed, 11 deletions(-) diff --git a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq index 36caa6184e..dfb1295da2 100644 --- a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq +++ b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq @@ -78,15 +78,6 @@ OdfeSqlOdbcPBIConnectorImpl = (Host as text, optional Port as number) as table = Driver = "ODFE SQL ODBC Driver" ], - SqlCapabilities = Diagnostics.LogValue("SqlCapabilities_Options", [ - GroupByCapabilities = ODBC[SQL_GB][SQL_GB_COLLATE] - ]), - - SQLGetInfo = Diagnostics.LogValue("SQLGetInfo_Options", [ - SQL_SQL92_PREDICATES = ODBC[SQL_SP][All], - SQL_AGGREGATE_FUNCTIONS = ODBC[SQL_AF][All] - ]), - SQLGetTypeInfo = (types) => if (EnableTraceOutput <> true) then types else let @@ -146,9 +137,7 @@ OdfeSqlOdbcPBIConnectorImpl = (Host as text, optional Port as number) as table = // These values should be set by previous steps AstVisitor = AstVisitor, - SqlCapabilities = SqlCapabilities, SQLColumns = SQLColumns, - SQLGetInfo = SQLGetInfo, SQLGetTypeInfo = SQLGetTypeInfo, OnError = OnOdbcError, diff --git a/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez b/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez index b4d89870c0d89b7e05c3f71c4bbdafc31066d37b..92a05ca59ea32cf1f4974874d0bffe0bd59f557e 100644 GIT binary patch delta 3368 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 N)^RY95c=iKwY(T|xZp-eCXJeU~{0)f~-Yt*d@ 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 BapV91 From ed0afb91caaf7daa2e14c71f9ed8ee636969932b Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Fri, 24 Jul 2020 14:20:35 -0700 Subject: [PATCH 19/27] adding EncryptedConnectionString --- .../OdfeSqlOdbcPBIConnector.pq | 2 +- .../bin/Release/OdfeSqlOdbcPBIConnector.mez | Bin 33422 -> 33427 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq index dfb1295da2..f1af5f74b6 100644 --- a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq +++ b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq @@ -123,7 +123,7 @@ OdfeSqlOdbcPBIConnectorImpl = (Host as text, optional Port as number) as table = ] ], - OdbcDatasource = Odbc.DataSource(ConnectionString & Server & CredentialConnectionString, [ + OdbcDatasource = Odbc.DataSource(ConnectionString & Server & CredentialConnectionString & EncryptedConnectionString, [ // Do not view the tables grouped by their schema names. HierarchicalNavigation = false, // Prevents execution of native SQL statements. Extensions should set this to true. diff --git a/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez b/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez index 92a05ca59ea32cf1f4974874d0bffe0bd59f557e..dc5ae9d8ab9ea6ac503ccbca2935edfc00ae4c4a 100644 GIT binary patch delta 3030 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 TA%aQ)*^_L7AqF9T00000h`zSF From 82e9a728bfbb17876121a65e4c46d0018c4d8bc1 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Tue, 28 Jul 2020 10:45:59 -0700 Subject: [PATCH 20/27] add data type for columns --- .../ITODBCCatalog/test_odbc_catalog.cpp | 32 ++++++++++----- sql-odbc/src/odfesqlodbc/es_info.cpp | 40 ++++++++++++++++++- sql-odbc/src/odfesqlodbc/es_parse_result.cpp | 31 +++++++------- sql-odbc/src/odfesqlodbc/es_types.h | 32 +++++++-------- 4 files changed, 93 insertions(+), 42 deletions(-) diff --git a/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp b/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp index 50ec11743a..81a7c0015a 100644 --- a/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp +++ b/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp @@ -85,6 +85,9 @@ const std::vector< std::string > flights_data_type = { "float", "keyword", "integer", "keyword", "keyword", "keyword", "date", "keyword", "keyword", "boolean", "float", "keyword", "keyword", "keyword", "keyword", "keyword", "keyword", "keyword"}; +const std::vector< short > flights_sql_data_type = { + -9, -9, -7, 7, 7, -9, 4, 7, -9, 4, -9, -9, -9, + 1296, -9, -9, -7, 7, -9, -9, -9, -9, -9, -9, -9}; const std::string flights_catalog_odfe = "odfe-cluster"; const std::string flights_catalog_elas = "elasticsearch"; const std::string flights_table_name = "kibana_sample_data_flights"; @@ -355,16 +358,17 @@ TEST_F(TestSQLColumns, FlightsValidation) { binds.push_back(bind_info(2, SQL_C_CHAR)); binds.push_back(bind_info(3, SQL_C_CHAR)); binds.push_back(bind_info(4, SQL_C_CHAR)); - binds.push_back(bind_info(5, SQL_C_SSHORT)); + binds.push_back(bind_info(5, SQL_C_SHORT)); binds.push_back(bind_info(6, SQL_C_CHAR)); + binds.push_back(bind_info(7, SQL_C_SLONG)); binds.push_back(bind_info(8, SQL_C_SLONG)); - binds.push_back(bind_info(9, SQL_C_SSHORT)); - binds.push_back(bind_info(10, SQL_C_SSHORT)); - binds.push_back(bind_info(11, SQL_C_SSHORT)); + binds.push_back(bind_info(9, SQL_C_SHORT)); + binds.push_back(bind_info(10, SQL_C_SHORT)); + binds.push_back(bind_info(11, SQL_C_SHORT)); binds.push_back(bind_info(12, SQL_C_CHAR)); binds.push_back(bind_info(13, SQL_C_CHAR)); - binds.push_back(bind_info(14, SQL_C_SSHORT)); - binds.push_back(bind_info(15, SQL_C_SSHORT)); + binds.push_back(bind_info(14, SQL_C_SHORT)); + binds.push_back(bind_info(15, SQL_C_SHORT)); binds.push_back(bind_info(16, SQL_C_SLONG)); binds.push_back(bind_info(17, SQL_C_SLONG)); binds.push_back(bind_info(18, SQL_C_CHAR)); @@ -390,16 +394,26 @@ TEST_F(TestSQLColumns, FlightsValidation) { case 4: EXPECT_EQ(it.AsString(), flights_column_name[column_idx]); break; + case 5: + EXPECT_EQ( + it.AsString(), + std::to_string(flights_sql_data_type[column_idx])); + break; case 6: EXPECT_EQ(it.AsString(), flights_data_type[column_idx]); break; - case 9: + case 10: EXPECT_EQ(it.AsString(), flights_decimal_digits); break; - case 10: + case 11: EXPECT_EQ(it.AsString(), flights_num_prec_radix); break; - case 16: + case 14: + EXPECT_EQ( + it.AsString(), + std::to_string(flights_sql_data_type[column_idx])); + break; + case 17: EXPECT_EQ(it.AsString(), std::to_string(column_idx + 1)); break; default: diff --git a/sql-odbc/src/odfesqlodbc/es_info.cpp b/sql-odbc/src/odfesqlodbc/es_info.cpp index 886ded6615..146ecd5f20 100644 --- a/sql-odbc/src/odfesqlodbc/es_info.cpp +++ b/sql-odbc/src/odfesqlodbc/es_info.cpp @@ -83,6 +83,22 @@ const std::unordered_map< int, std::vector< int > > sql_es_type_map = { {ES_TYPE_KEYWORD, ES_TYPE_TEXT, ES_TYPE_NESTED, ES_TYPE_OBJECT}}, {SQL_TYPE_TIMESTAMP, {ES_TYPE_DATETIME}}}; +const std::unordered_map< std::string, int > data_name_data_type_map = { + {ES_TYPE_NAME_BOOLEAN, SQL_BIT}, + {ES_TYPE_NAME_BYTE, SQL_TINYINT}, + {ES_TYPE_NAME_SHORT, SQL_SMALLINT}, + {ES_TYPE_NAME_INTEGER, SQL_INTEGER}, + {ES_TYPE_NAME_LONG, SQL_BIGINT}, + {ES_TYPE_NAME_HALF_FLOAT, SQL_REAL}, + {ES_TYPE_NAME_FLOAT, SQL_REAL}, + {ES_TYPE_NAME_DOUBLE, SQL_DOUBLE}, + {ES_TYPE_NAME_SCALED_FLOAT, SQL_DOUBLE}, + {ES_TYPE_NAME_KEYWORD, SQL_WVARCHAR}, + {ES_TYPE_NAME_TEXT, SQL_WVARCHAR}, + {ES_TYPE_NAME_DATE, ES_TYPE_TIMESTAMP}, + {ES_TYPE_NAME_OBJECT, SQL_WVARCHAR}, + {ES_TYPE_NAME_NESTED, SQL_WVARCHAR}}; + // Boilerplate code for easy column bind handling class BindTemplate { public: @@ -476,8 +492,28 @@ void SetTableTuples(QResultClass *res, const TableResultSet res_type, // information for its Data Preview window. std::string catalog(""); bind_tbl[TABLES_CATALOG_NAME]->UpdateData((void *)catalog.c_str(), 0); - for (size_t i = 0; i < binds.size(); i++) - binds[i]->AssignData(&tuple[i]); + + for (size_t i = 0; i < binds.size(); i++) { + // Add tuples for SQLColumns + if (binds.size() > COLUMNS_SQL_DATA_TYPE) { + // Add data type for data loading issue in Power BI Desktop + auto data_type = data_name_data_type_map + .find(bind_tbl[COLUMNS_TYPE_NAME]->AsString())->second; + if (i == COLUMNS_DATA_TYPE) { + set_tuplefield_int2(&tuple[COLUMNS_DATA_TYPE], + static_cast< short >(data_type)); + } else if (i == COLUMNS_SQL_DATA_TYPE) { + set_tuplefield_int2(&tuple[COLUMNS_SQL_DATA_TYPE], + static_cast< short >(data_type)); + } else { + binds[i]->AssignData(&tuple[i]); + } + } + // Add tuples for SQLTables + else { + binds[i]->AssignData(&tuple[i]); + } + } }; // General case diff --git a/sql-odbc/src/odfesqlodbc/es_parse_result.cpp b/sql-odbc/src/odfesqlodbc/es_parse_result.cpp index b73e291751..e4aff19264 100644 --- a/sql-odbc/src/odfesqlodbc/es_parse_result.cpp +++ b/sql-odbc/src/odfesqlodbc/es_parse_result.cpp @@ -29,6 +29,7 @@ #pragma clang diagnostic pop #endif // __APPLE__ #include "statement.h" +#include "es_types.h" typedef std::vector< std::pair< std::string, OID > > schema_type; typedef rabbit::array json_arr; @@ -69,21 +70,21 @@ static const std::string JSON_KW_CURSOR = "cursor"; // clang-format on const std::unordered_map< std::string, OID > type_to_oid_map = { - {"boolean", ES_TYPE_BOOL}, - {"byte", ES_TYPE_INT2}, - {"short", ES_TYPE_INT2}, - {"integer", ES_TYPE_INT4}, - {"long", ES_TYPE_INT8}, - {"half_float", ES_TYPE_FLOAT4}, - {"float", ES_TYPE_FLOAT4}, - {"double", ES_TYPE_FLOAT8}, - {"scaled_float", ES_TYPE_FLOAT8}, - {"keyword", ES_TYPE_VARCHAR}, - {"text", ES_TYPE_VARCHAR}, - {"date", ES_TYPE_TIMESTAMP}, - {"object", ES_TYPE_VARCHAR}, - {"nested", ES_TYPE_VARCHAR}, - {"date", ES_TYPE_DATE}}; + {ES_TYPE_NAME_BOOLEAN, ES_TYPE_BOOL}, + {ES_TYPE_NAME_BYTE, ES_TYPE_INT2}, + {ES_TYPE_NAME_SHORT, ES_TYPE_INT2}, + {ES_TYPE_NAME_INTEGER, ES_TYPE_INT4}, + {ES_TYPE_NAME_LONG, ES_TYPE_INT8}, + {ES_TYPE_NAME_HALF_FLOAT, ES_TYPE_FLOAT4}, + {ES_TYPE_NAME_FLOAT, ES_TYPE_FLOAT4}, + {ES_TYPE_NAME_DOUBLE, ES_TYPE_FLOAT8}, + {ES_TYPE_NAME_SCALED_FLOAT, ES_TYPE_FLOAT8}, + {ES_TYPE_NAME_KEYWORD, ES_TYPE_VARCHAR}, + {ES_TYPE_NAME_TEXT, ES_TYPE_VARCHAR}, + {ES_TYPE_NAME_DATE, ES_TYPE_TIMESTAMP}, + {ES_TYPE_NAME_OBJECT, ES_TYPE_VARCHAR}, + {ES_TYPE_NAME_VARCHAR, ES_TYPE_VARCHAR}, + {ES_TYPE_NAME_DATE, ES_TYPE_DATE}}; #define ES_VARCHAR_SIZE (-2) const std::unordered_map< OID, int16_t > oid_to_size_map = { diff --git a/sql-odbc/src/odfesqlodbc/es_types.h b/sql-odbc/src/odfesqlodbc/es_types.h index 7284957569..dcb73398c2 100644 --- a/sql-odbc/src/odfesqlodbc/es_types.h +++ b/sql-odbc/src/odfesqlodbc/es_types.h @@ -30,22 +30,22 @@ extern "C" { #define ES_TYPE_LO ? ? ? ? /* waiting for permanent type */ #endif -#define ES_TYPE_NAME_BOOLEAN "boolean"; -#define ES_TYPE_NAME_BYTE "byte"; -#define ES_TYPE_NAME_SHORT "short"; -#define ES_TYPE_NAME_INTEGER "integer"; -#define ES_TYPE_NAME_LONG "long"; -#define ES_TYPE_NAME_HALF_FLOAT "half_float"; -#define ES_TYPE_NAME_FLOAT "float"; -#define ES_TYPE_NAME_DOUBLE "double"; -#define ES_TYPE_NAME_SCALED_FLOAT "scaled_float"; -#define ES_TYPE_NAME_KEYWORD "keyword"; -#define ES_TYPE_NAME_TEXT "text"; -#define ES_TYPE_NAME_NESTED "nested"; -#define ES_TYPE_NAME_DATE "date"; -#define ES_TYPE_NAME_OBJECT "object"; -#define ES_TYPE_NAME_VARCHAR "varchar"; -#define ES_TYPE_NAME_UNSUPPORTED "unsupported"; +#define ES_TYPE_NAME_BOOLEAN "boolean" +#define ES_TYPE_NAME_BYTE "byte" +#define ES_TYPE_NAME_SHORT "short" +#define ES_TYPE_NAME_INTEGER "integer" +#define ES_TYPE_NAME_LONG "long" +#define ES_TYPE_NAME_HALF_FLOAT "half_float" +#define ES_TYPE_NAME_FLOAT "float" +#define ES_TYPE_NAME_DOUBLE "double" +#define ES_TYPE_NAME_SCALED_FLOAT "scaled_float" +#define ES_TYPE_NAME_KEYWORD "keyword" +#define ES_TYPE_NAME_TEXT "text" +#define ES_TYPE_NAME_NESTED "nested" +#define ES_TYPE_NAME_DATE "date" +#define ES_TYPE_NAME_OBJECT "object" +#define ES_TYPE_NAME_VARCHAR "varchar" +#define ES_TYPE_NAME_UNSUPPORTED "unsupported" #define MS_ACCESS_SERIAL "int identity" #define ES_TYPE_BOOL 16 From 5022f1f01577b4d31fe2a8b57c4a4f06e571feb0 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Tue, 28 Jul 2020 12:36:07 -0700 Subject: [PATCH 21/27] add alternate column size --- .../IntegrationTests/ITODBCResults/test_odbc_results.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sql-odbc/src/IntegrationTests/ITODBCResults/test_odbc_results.cpp b/sql-odbc/src/IntegrationTests/ITODBCResults/test_odbc_results.cpp index f46e160343..ab8c6ec8ed 100644 --- a/sql-odbc/src/IntegrationTests/ITODBCResults/test_odbc_results.cpp +++ b/sql-odbc/src/IntegrationTests/ITODBCResults/test_odbc_results.cpp @@ -100,7 +100,8 @@ const int delay_offset_3_1 = 0; const int delay_offset_3_2 = 180; const SQLSMALLINT single_col_name_length = 6; const SQLSMALLINT single_col_data_type = SQL_WVARCHAR; -const SQLULEN single_col_column_size = 25; +const SQLULEN single_col_column_size_25 = 25; +const SQLULEN single_col_column_size_15 = 15; const SQLSMALLINT single_col_decimal_digit = 0; const SQLSMALLINT single_col_nullable = 2; const std::wstring single_row = L"1"; @@ -936,7 +937,9 @@ TEST_F(TestSQLDescribeCol, SingleColumnMetadata) { EXPECT_EQ(single_col, m_column_name); EXPECT_EQ(single_col_name_length, m_column_name_length); EXPECT_EQ(single_col_data_type, m_data_type); - EXPECT_EQ(single_col_column_size, m_column_size); + // Values changes according to different server setup + EXPECT_TRUE((single_col_column_size_25 == m_column_size) + || (single_col_column_size_15 == m_column_size)); EXPECT_EQ(single_col_decimal_digit, m_decimal_digits); EXPECT_EQ(single_col_nullable, m_nullable); } From f4c706876421ea82de028bf88e79ea42411e996e Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Tue, 28 Jul 2020 12:40:56 -0700 Subject: [PATCH 22/27] reverting changes in catalog test --- .../IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp b/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp index 81a7c0015a..2c8cf732f7 100644 --- a/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp +++ b/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp @@ -362,13 +362,13 @@ TEST_F(TestSQLColumns, FlightsValidation) { binds.push_back(bind_info(6, SQL_C_CHAR)); binds.push_back(bind_info(7, SQL_C_SLONG)); binds.push_back(bind_info(8, SQL_C_SLONG)); - binds.push_back(bind_info(9, SQL_C_SHORT)); - binds.push_back(bind_info(10, SQL_C_SHORT)); - binds.push_back(bind_info(11, SQL_C_SHORT)); + binds.push_back(bind_info(9, SQL_C_SSHORT)); + binds.push_back(bind_info(10, SQL_C_SSHORT)); + binds.push_back(bind_info(11, SQL_C_SSHORT)); binds.push_back(bind_info(12, SQL_C_CHAR)); binds.push_back(bind_info(13, SQL_C_CHAR)); binds.push_back(bind_info(14, SQL_C_SHORT)); - binds.push_back(bind_info(15, SQL_C_SHORT)); + binds.push_back(bind_info(15, SQL_C_SSHORT)); binds.push_back(bind_info(16, SQL_C_SLONG)); binds.push_back(bind_info(17, SQL_C_SLONG)); binds.push_back(bind_info(18, SQL_C_CHAR)); From a76c382c3ead0ef192ed15ba8c37bb32acd0e843 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Tue, 28 Jul 2020 12:47:19 -0700 Subject: [PATCH 23/27] nit --- .../src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp | 2 +- .../src/IntegrationTests/ITODBCResults/test_odbc_results.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp b/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp index 2c8cf732f7..1753707dae 100644 --- a/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp +++ b/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp @@ -364,7 +364,7 @@ TEST_F(TestSQLColumns, FlightsValidation) { binds.push_back(bind_info(8, SQL_C_SLONG)); binds.push_back(bind_info(9, SQL_C_SSHORT)); binds.push_back(bind_info(10, SQL_C_SSHORT)); - binds.push_back(bind_info(11, SQL_C_SSHORT)); + binds.push_back(bind_info(11, SQL_C_SSHORT)); binds.push_back(bind_info(12, SQL_C_CHAR)); binds.push_back(bind_info(13, SQL_C_CHAR)); binds.push_back(bind_info(14, SQL_C_SHORT)); diff --git a/sql-odbc/src/IntegrationTests/ITODBCResults/test_odbc_results.cpp b/sql-odbc/src/IntegrationTests/ITODBCResults/test_odbc_results.cpp index ab8c6ec8ed..5dd6c49623 100644 --- a/sql-odbc/src/IntegrationTests/ITODBCResults/test_odbc_results.cpp +++ b/sql-odbc/src/IntegrationTests/ITODBCResults/test_odbc_results.cpp @@ -937,7 +937,7 @@ TEST_F(TestSQLDescribeCol, SingleColumnMetadata) { EXPECT_EQ(single_col, m_column_name); EXPECT_EQ(single_col_name_length, m_column_name_length); EXPECT_EQ(single_col_data_type, m_data_type); - // Values changes according to different server setup + // Value changes according to pagination setup on server EXPECT_TRUE((single_col_column_size_25 == m_column_size) || (single_col_column_size_15 == m_column_size)); EXPECT_EQ(single_col_decimal_digit, m_decimal_digits); From debe0c5bce13bc52a69a6e1e05fdc7faa91d9a19 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Tue, 28 Jul 2020 14:42:06 -0700 Subject: [PATCH 24/27] revert changes for column size validation --- .../IntegrationTests/ITODBCResults/test_odbc_results.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/sql-odbc/src/IntegrationTests/ITODBCResults/test_odbc_results.cpp b/sql-odbc/src/IntegrationTests/ITODBCResults/test_odbc_results.cpp index 5dd6c49623..61aeaf1002 100644 --- a/sql-odbc/src/IntegrationTests/ITODBCResults/test_odbc_results.cpp +++ b/sql-odbc/src/IntegrationTests/ITODBCResults/test_odbc_results.cpp @@ -100,8 +100,7 @@ const int delay_offset_3_1 = 0; const int delay_offset_3_2 = 180; const SQLSMALLINT single_col_name_length = 6; const SQLSMALLINT single_col_data_type = SQL_WVARCHAR; -const SQLULEN single_col_column_size_25 = 25; -const SQLULEN single_col_column_size_15 = 15; +const SQLULEN single_col_column_size = 25; const SQLSMALLINT single_col_decimal_digit = 0; const SQLSMALLINT single_col_nullable = 2; const std::wstring single_row = L"1"; @@ -937,9 +936,8 @@ TEST_F(TestSQLDescribeCol, SingleColumnMetadata) { EXPECT_EQ(single_col, m_column_name); EXPECT_EQ(single_col_name_length, m_column_name_length); EXPECT_EQ(single_col_data_type, m_data_type); - // Value changes according to pagination setup on server - EXPECT_TRUE((single_col_column_size_25 == m_column_size) - || (single_col_column_size_15 == m_column_size)); + // TODO #628 - Investigate why value differs & fix validation accordingly + EXPECT_EQ(single_col_column_size, m_column_size); EXPECT_EQ(single_col_decimal_digit, m_decimal_digits); EXPECT_EQ(single_col_nullable, m_nullable); } From a80eee8edfbff508293818db621eb8dd7c704ad8 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Tue, 28 Jul 2020 18:20:24 -0700 Subject: [PATCH 25/27] address PR comments --- .../IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp | 7 +++++-- sql-odbc/src/odfesqlodbc/es_info.cpp | 3 ++- sql-odbc/src/odfesqlodbc/es_parse_result.cpp | 1 - 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp b/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp index 1753707dae..8924bdb119 100644 --- a/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp +++ b/sql-odbc/src/IntegrationTests/ITODBCCatalog/test_odbc_catalog.cpp @@ -86,8 +86,11 @@ const std::vector< std::string > flights_data_type = { "keyword", "keyword", "boolean", "float", "keyword", "keyword", "keyword", "keyword", "keyword", "keyword", "keyword"}; const std::vector< short > flights_sql_data_type = { - -9, -9, -7, 7, 7, -9, 4, 7, -9, 4, -9, -9, -9, - 1296, -9, -9, -7, 7, -9, -9, -9, -9, -9, -9, -9}; + SQL_WVARCHAR, SQL_WVARCHAR, SQL_BIT, SQL_REAL, SQL_REAL, + SQL_WVARCHAR, SQL_INTEGER, SQL_REAL, SQL_WVARCHAR, SQL_INTEGER, + SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR, SQL_TYPE_TIMESTAMP, SQL_WVARCHAR, + SQL_WVARCHAR, SQL_BIT, SQL_REAL, SQL_WVARCHAR, SQL_WVARCHAR, + SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR, SQL_WVARCHAR}; const std::string flights_catalog_odfe = "odfe-cluster"; const std::string flights_catalog_elas = "elasticsearch"; const std::string flights_table_name = "kibana_sample_data_flights"; diff --git a/sql-odbc/src/odfesqlodbc/es_info.cpp b/sql-odbc/src/odfesqlodbc/es_info.cpp index 146ecd5f20..648a0d967f 100644 --- a/sql-odbc/src/odfesqlodbc/es_info.cpp +++ b/sql-odbc/src/odfesqlodbc/es_info.cpp @@ -95,7 +95,7 @@ const std::unordered_map< std::string, int > data_name_data_type_map = { {ES_TYPE_NAME_SCALED_FLOAT, SQL_DOUBLE}, {ES_TYPE_NAME_KEYWORD, SQL_WVARCHAR}, {ES_TYPE_NAME_TEXT, SQL_WVARCHAR}, - {ES_TYPE_NAME_DATE, ES_TYPE_TIMESTAMP}, + {ES_TYPE_NAME_DATE, SQL_TYPE_TIMESTAMP}, {ES_TYPE_NAME_OBJECT, SQL_WVARCHAR}, {ES_TYPE_NAME_NESTED, SQL_WVARCHAR}}; @@ -493,6 +493,7 @@ void SetTableTuples(QResultClass *res, const TableResultSet res_type, std::string catalog(""); bind_tbl[TABLES_CATALOG_NAME]->UpdateData((void *)catalog.c_str(), 0); + // TODO #630 - Revisit logic of adding tuples for SQLTables & SQLColumns for (size_t i = 0; i < binds.size(); i++) { // Add tuples for SQLColumns if (binds.size() > COLUMNS_SQL_DATA_TYPE) { diff --git a/sql-odbc/src/odfesqlodbc/es_parse_result.cpp b/sql-odbc/src/odfesqlodbc/es_parse_result.cpp index e4aff19264..e111bb37f3 100644 --- a/sql-odbc/src/odfesqlodbc/es_parse_result.cpp +++ b/sql-odbc/src/odfesqlodbc/es_parse_result.cpp @@ -29,7 +29,6 @@ #pragma clang diagnostic pop #endif // __APPLE__ #include "statement.h" -#include "es_types.h" typedef std::vector< std::pair< std::string, OID > > schema_type; typedef rabbit::array json_arr; From e6490e453455b3eb978977015ad665b864902449 Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Wed, 29 Jul 2020 15:50:09 -0700 Subject: [PATCH 26/27] Update SQL_GROUP_BY value for fixing query folding issue --- .../ITODBCInfo/test_odbc_info.cpp | 2 +- .../OdfeSqlOdbcPBIConnector.pq | 5 +++++ .../bin/Release/OdfeSqlOdbcPBIConnector.mez | Bin 33427 -> 33490 bytes sql-odbc/src/odfesqlodbc/info.c | 2 +- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/sql-odbc/src/IntegrationTests/ITODBCInfo/test_odbc_info.cpp b/sql-odbc/src/IntegrationTests/ITODBCInfo/test_odbc_info.cpp index 4f2e43b8cf..0e8808e4d9 100644 --- a/sql-odbc/src/IntegrationTests/ITODBCInfo/test_odbc_info.cpp +++ b/sql-odbc/src/IntegrationTests/ITODBCInfo/test_odbc_info.cpp @@ -180,7 +180,7 @@ TEST_SQL_GET_INFO_VERSION_GE(SQLDBMSVer, SQL_DBMS_VER, L"7.1.1"); TEST_SQL_GET_INFO_STRING(SQLColumnAlias, SQL_COLUMN_ALIAS, L"Y"); TEST_SQL_GET_INFO_UINT16(SQLGroupBy, SQL_GROUP_BY, - SQL_GB_GROUP_BY_EQUALS_SELECT); + SQL_GB_GROUP_BY_CONTAINS_SELECT); TEST_SQL_GET_INFO_STRING(SQLIdentifierQuoteChar, SQL_IDENTIFIER_QUOTE_CHAR, L"`"); TEST_SQL_GET_INFO_UINT_MASK(SQLOJCapabilities, SQL_OJ_CAPABILITIES, diff --git a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq index f1af5f74b6..c777f8088e 100644 --- a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq +++ b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq @@ -78,6 +78,10 @@ OdfeSqlOdbcPBIConnectorImpl = (Host as text, optional Port as number) as table = Driver = "ODFE SQL ODBC Driver" ], + SQLGetInfo = Diagnostics.LogValue("SQLGetInfo_Options", [ + SQL_AGGREGATE_FUNCTIONS = ODBC[SQL_AF][All] + ]), + SQLGetTypeInfo = (types) => if (EnableTraceOutput <> true) then types else let @@ -139,6 +143,7 @@ OdfeSqlOdbcPBIConnectorImpl = (Host as text, optional Port as number) as table = AstVisitor = AstVisitor, SQLColumns = SQLColumns, SQLGetTypeInfo = SQLGetTypeInfo, + SQLGetInfo = SQLGetInfo, OnError = OnOdbcError, diff --git a/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez b/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez index dc5ae9d8ab9ea6ac503ccbca2935edfc00ae4c4a..f0bc55c93d4a32a1c35945b2f3cec6dbae1e710e 100644 GIT binary patch delta 3160 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 delta 3108 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 diff --git a/sql-odbc/src/odfesqlodbc/info.c b/sql-odbc/src/odfesqlodbc/info.c index a8925d4087..45e1bad0e3 100644 --- a/sql-odbc/src/odfesqlodbc/info.c +++ b/sql-odbc/src/odfesqlodbc/info.c @@ -245,7 +245,7 @@ RETCODE SQL_API ESAPI_GetInfo(HDBC hdbc, SQLUSMALLINT fInfoType, case SQL_GROUP_BY: /* ODBC 2.0 */ len = 2; - value = SQL_GB_GROUP_BY_EQUALS_SELECT; + value = SQL_GB_GROUP_BY_CONTAINS_SELECT; break; case SQL_IDENTIFIER_CASE: /* ODBC 1.0 */ From 9a36d476b7aa71a9a9f0810bbe2cd72493faee8b Mon Sep 17 00:00:00 2001 From: Rupal Mahajan Date: Thu, 30 Jul 2020 11:24:50 -0700 Subject: [PATCH 27/27] removing AstVisitor for resolving query folding issue with data type boolean --- .../OdfeSqlOdbcPBIConnector.pq | 21 ------------------ .../bin/Release/OdfeSqlOdbcPBIConnector.mez | Bin 33490 -> 33240 bytes 2 files changed, 21 deletions(-) diff --git a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq index c777f8088e..fa706a5db9 100644 --- a/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq +++ b/sql-odbc/src/PowerBIConnector/OdfeSqlOdbcPBIConnector.pq @@ -106,26 +106,6 @@ OdfeSqlOdbcPBIConnectorImpl = (Host as text, optional Port as number) as table = Value.ReplaceType(toTable, Value.Type(source)) else source, - - // Add support for `LIMIT` and `OFFSET` clauses (rather than `TOP`) - AstVisitor = [ - // format is "LIMIT [,]" - ex. LIMIT 2,10 or LIMIT 10 - LimitClause = (skip, take) => - if (take = null) then - ... - else - let - skip = - if (skip = null or skip = 0) then - "" - else - Number.ToText(skip) & "," - in - [ - Text = Text.Format("LIMIT #{0}#{1}", { skip, take }), - Location = "AfterQuerySpecification" - ] - ], OdbcDatasource = Odbc.DataSource(ConnectionString & Server & CredentialConnectionString & EncryptedConnectionString, [ // Do not view the tables grouped by their schema names. @@ -140,7 +120,6 @@ OdfeSqlOdbcPBIConnectorImpl = (Host as text, optional Port as number) as table = ClientConnectionPooling = true, // These values should be set by previous steps - AstVisitor = AstVisitor, SQLColumns = SQLColumns, SQLGetTypeInfo = SQLGetTypeInfo, SQLGetInfo = SQLGetInfo, diff --git a/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez b/sql-odbc/src/PowerBIConnector/bin/Release/OdfeSqlOdbcPBIConnector.mez index f0bc55c93d4a32a1c35945b2f3cec6dbae1e710e..a45e425fbf521bf2bfb0647c92d1bebe52be19fc 100644 GIT binary patch delta 2882 zcmV-I3%&Hxg#y@v0P**j4ka`LL0Cpn)02!09L>hlCZM|CSZ`;Tb{~jR! z!-54;DNty~7X)puKERe_M~!1CmV7}W2*!$BNqeQZ%r5E21^M4QGs`zA`GKPRVv5|E zo&C*w=z{|`+epJ!G7!vDVa#P{*nr2J^;H-OFIJibYAwCjuMGT>Dr94SC8pnlvA^^t zr=xt?udiRdeszCvz`kun$c%_ttXQlQ(PP~AB~tPL9&k@E8LpJxa^iL;gMcjsyVEj` zfl?)wawFKa5wy9>h%pIjHYy2xBuKYd@xTc94IBm2A`sjNm(5@w8Lk;n_$m~@POD_S zVVrp!_5(U%IgorEDicf3xEE^uI}Z}k>ALm|!;minft-KDIEf>W3->SW+9N56;Zk^N zD-7@_zM*=jBF00X8M%#u2M{byG$4xvO3SrGFm7=>_w}phM#qF4Av#B8OjV*i;eM8( zf9&kQ-|4YQvJ9lz>|Ele3!DXLbHlapcPZ0_JJ3dKKomm7y%JFX0?r;H(b+*Xf}{3! zaYVxIuPlEv63wFsw7W_|YgB+~q}8qTMcG`gN6br1thVw`vK9bq4|{|S|KvORh5;ul6kK~7FfxCAE3~_Rt0@P#1t|x$^n*Ep0$aqL z9QL!ITy#rpRFon+QM!ajm~5AzjprkRY+i;)gaSMR4Rk)8gduu0uze;re?K}rtb$_i z(?0-2j6T>vpvv|VH3;(WmDjP<3-aDQo&tXo5 zkA#W^I8Zs@#^Bkp1mqzmGhSijwu#-(c}y*fwA#M-)MNo?5ei4s3sp3Cv&&}rfQG7A%-ryrsil3B6TlniZ{y?=t8mCm1% z6+{aVJxn0k!=8_=!}R?;U4dCmrx!r_{z;%epYP$*0H;*N-q`po!zTPLtB?#7R6BpT z(hCw_>?X6p;Lc>>yjW0D)zrQ_W(~zqNc`t-Rsl_5TMkdL^_c#&SUvGOra#q}k7B)l zs~WQkz)kyWBwH=*`JM6LY{;fxFW7i++E1UCT&Btx)}4!Z1XVSVw$`*xvE*h&yOZG`@eF0#6iTPOr}v^OGPbfkfp+T@Bb&~1dAuNQq4BwJ{XB=%2v@xB4& z1mFzu20+!q6W{{2fwCGiSUrCN{^TH8S66U@Hm+io*(P9-pi>TQC027iX1tBqa(hpP zVsAZKo-U#8tD9F}&#_=j+hW3SbUX|2Fi>3zEHW`B+SbR|wivYUiNY)mo>1T|8s$OO zF~dW@u!yFJJIy79#GPfwc1jR*@gUCIw{IQtl1G{JbHJQ3dIg*Aj(mUE>dPrY|380D zH~ioGG+ulB+S~dnfp6SSB9WCm>>uC<1x<&V~go#&r%(CxePlU6L)I*Nx zfm=*FI*oMsCaVwL>}ww0>@N5k8Ly~cZl$;*gCXNGY^_xiK}orMz^78Dae`sxZ)*1Q zNeYdfAJpr?CBKzxo;H8Fc1qOPa-zj8%~r&{@Df@Jp)3TdTR}NLj|j#s8oGS;MI$Jj zg{1?whBQ7nF!K7E2>p;2qfIFwjiXs65kwsT)nsBozpJHZQ*W(4P^k#8Xb?Ph46Ihjch{~q3RilCNU47SncqrIdNmK=yIY$r zwmjr(p{s2Afy8z>=P*ebvrfO9;h`yy!fwEDZfwK=UR$E#}i$cE3K zsAw=&%>qw`vXp-gius?O+t7%k6-{^D_TdTnR6g)eA`i!lSviZ46Qcl^Y>=)1HmQ&?k%R3B{^RIfW3}WT<&^sxqG@Z66~P8V6BlQ|3$nUnRir z9i%z$KO}zzV&1b2JqBwW-DUzel`xS?)wWEy^^bbQ+|AIemHUh4*sD?azNad}9W#3=i2B93ag;wKtXN15Tu+ zC*$T!;({+l&@#0vAFw`%-NVHWTie-u77u$UcTO>ZEMH_NnPvX=c2S1NmJ3O+6Iv{qE`Ib%??&R{x)4oZcXHRw}FyX@&A83zKA!rn!nL=ZtYm&N@H2z22WrNy-- z4Q%2#GXFR@fKmavSqzKr8eBD5x>6m0^S%@10C|u}nSnn5C->r(($#`D+S)|C3#bvK z4pX6^a_K2lnYQ*WDl~vU-+!z@n)zpEmj{2p|L8{Hx(e~5L`R1&A^PwFqF;_IQLbG) z6dv0xxP2g((9u2Q!zi$gsz;nJ+}ynkM)p)$!|CO(R)DGf?u>=mMsOeh z69H;ZV<$)(2ynIkP4J*(iUsH~Uf~t@?6m2_)&g1VMx`QCj>~@mP)h>@lP-W7lNUS} zvpqSmMh@Uw{!mvne2{ty004F)lly;H0uDHnVS*WxZGbQW|2mUlf*F%8JO-1#fGPsf zK9gaB8InK-lL>(;0-QsWVS*WxPJu82bV`$9f*F&UfiMCOQNpMVS-5lBY2anf*=NKegFUf0HeofI{*Lx delta 3139 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