From ad1b6d439fe0e0875e54227e0bc23a74411f490e Mon Sep 17 00:00:00 2001 From: guillep2k <18600385+guillep2k@users.noreply.github.com> Date: Mon, 20 Jan 2020 12:45:14 -0300 Subject: [PATCH] Add support for database schema in PostgreSQL (#8819) * Add support for database schema * Require setting search_path for the db user * Add schema setting to admin/config.tmpl * Use a schema different from default for psql tests * Update postgres scripts to use custom schema * Update to xorm/core 0.7.3 and xorm/xorm c37aff9b3a * Fix migration test Co-authored-by: Antoine GIRARD Co-authored-by: Lunny Xiao --- Makefile | 2 + custom/conf/app.ini.sample | 4 + .../doc/advanced/config-cheat-sheet.en-us.md | 3 + go.mod | 4 +- go.sum | 6 +- integrations/integration_test.go | 45 +++- .../gitea-v1.5.3.postgres.sql.gz | Bin 16612 -> 16783 bytes .../gitea-v1.6.4.postgres.sql.gz | Bin 17346 -> 17517 bytes .../gitea-v1.7.0.postgres.sql.gz | Bin 17659 -> 17831 bytes integrations/migration-test/migration_test.go | 26 +++ integrations/pgsql.ini.tmpl | 1 + models/models.go | 7 +- modules/auth/user_form.go | 1 + modules/setting/database.go | 2 + options/locale/locale_en-US.ini | 3 + routers/install.go | 3 + templates/admin/config.tmpl | 2 + templates/install.tmpl | 5 + vendor/modules.txt | 4 +- vendor/xorm.io/core/.drone.yml | 120 ---------- vendor/xorm.io/core/README.md | 2 +- vendor/xorm.io/core/column.go | 4 +- vendor/xorm.io/core/index.go | 4 +- vendor/xorm.io/xorm/.drone.yml | 216 ++---------------- vendor/xorm.io/xorm/dialect_postgres.go | 6 +- vendor/xorm.io/xorm/session_insert.go | 94 +++----- vendor/xorm.io/xorm/session_update.go | 10 +- vendor/xorm.io/xorm/statement_exprparam.go | 10 +- 28 files changed, 177 insertions(+), 407 deletions(-) diff --git a/Makefile b/Makefile index fe526bb9e4..5df67948fa 100644 --- a/Makefile +++ b/Makefile @@ -79,6 +79,7 @@ TEST_PGSQL_HOST ?= pgsql:5432 TEST_PGSQL_DBNAME ?= testgitea TEST_PGSQL_USERNAME ?= postgres TEST_PGSQL_PASSWORD ?= postgres +TEST_PGSQL_SCHEMA ?= gtestschema TEST_MSSQL_HOST ?= mssql:1433 TEST_MSSQL_DBNAME ?= gitea TEST_MSSQL_USERNAME ?= sa @@ -306,6 +307,7 @@ generate-ini-pgsql: -e 's|{{TEST_PGSQL_DBNAME}}|${TEST_PGSQL_DBNAME}|g' \ -e 's|{{TEST_PGSQL_USERNAME}}|${TEST_PGSQL_USERNAME}|g' \ -e 's|{{TEST_PGSQL_PASSWORD}}|${TEST_PGSQL_PASSWORD}|g' \ + -e 's|{{TEST_PGSQL_SCHEMA}}|${TEST_PGSQL_SCHEMA}|g' \ integrations/pgsql.ini.tmpl > integrations/pgsql.ini .PHONY: test-pgsql diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index 971a99e264..f0829f37b3 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -336,6 +336,10 @@ NAME = gitea USER = root ; Use PASSWD = `your password` for quoting if you use special characters in the password. PASSWD = +; For Postgres, schema to use if different from "public". The schema must exist beforehand, +; the user must have creation privileges on it, and the user search path must be set +; to the look into the schema first. e.g.:ALTER USER user SET SEARCH_PATH = schema_name,"$user",public; +SCHEMA = ; For Postgres, either "disable" (default), "require", or "verify-full" ; For MySQL, either "false" (default), "true", or "skip-verify" SSL_MODE = disable diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index d63eaf8e46..1c03fce3d0 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -209,6 +209,9 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`. - `NAME`: **gitea**: Database name. - `USER`: **root**: Database username. - `PASSWD`: **\**: Database user password. Use \`your password\` for quoting if you use special characters in the password. +- `SCHEMA`: **\**: For PostgreSQL only, schema to use if different from "public". The schema must exist beforehand, + the user must have creation privileges on it, and the user search path must be set to the look into the schema first + (e.g. `ALTER USER user SET SEARCH_PATH = schema_name,"$user",public;`). - `SSL_MODE`: **disable**: For PostgreSQL and MySQL only. - `CHARSET`: **utf8**: For MySQL only, either "utf8" or "utf8mb4", default is "utf8". NOTICE: for "utf8mb4" you must use MySQL InnoDB > 5.6. Gitea is unable to check this. - `PATH`: **data/gitea.db**: For SQLite3 only, the database file path. diff --git a/go.mod b/go.mod index 171a47036b..943eb2a792 100644 --- a/go.mod +++ b/go.mod @@ -112,6 +112,6 @@ require ( mvdan.cc/xurls/v2 v2.1.0 strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251 xorm.io/builder v0.3.6 - xorm.io/core v0.7.2 - xorm.io/xorm v0.8.1 + xorm.io/core v0.7.3 + xorm.io/xorm v0.8.2-0.20200120024500-c37aff9b3a4a ) diff --git a/go.sum b/go.sum index 6363ce75b7..6f9548acf4 100644 --- a/go.sum +++ b/go.sum @@ -760,7 +760,9 @@ xorm.io/builder v0.3.6 h1:ha28mQ2M+TFx96Hxo+iq6tQgnkC9IZkM6D8w9sKHHF8= xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU= xorm.io/core v0.7.2 h1:mEO22A2Z7a3fPaZMk6gKL/jMD80iiyNwRrX5HOv3XLw= xorm.io/core v0.7.2/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM= +xorm.io/core v0.7.3 h1:W8ws1PlrnkS1CZU1YWaYLMQcQilwAmQXU0BJDJon+H0= +xorm.io/core v0.7.3/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM= xorm.io/xorm v0.8.0 h1:iALxgJrX8O00f8Jk22GbZwPmxJNgssV5Mv4uc2HL9PM= xorm.io/xorm v0.8.0/go.mod h1:ZkJLEYLoVyg7amJK/5r779bHyzs2AU8f8VMiP6BM7uY= -xorm.io/xorm v0.8.1 h1:4f2KXuQxVdaX3RdI3Fw81NzMiSpZeyCZt8m3sEVeIkQ= -xorm.io/xorm v0.8.1/go.mod h1:ZkJLEYLoVyg7amJK/5r779bHyzs2AU8f8VMiP6BM7uY= +xorm.io/xorm v0.8.2-0.20200120024500-c37aff9b3a4a h1:hzGd080rlkZ5a7v6Tr3x8PJJnWPfKxGMMl92c8DNcww= +xorm.io/xorm v0.8.2-0.20200120024500-c37aff9b3a4a/go.mod h1:ZkJLEYLoVyg7amJK/5r779bHyzs2AU8f8VMiP6BM7uY= diff --git a/integrations/integration_test.go b/integrations/integration_test.go index bf363f3b4d..138d751859 100644 --- a/integrations/integration_test.go +++ b/integrations/integration_test.go @@ -153,18 +153,53 @@ func initIntegrationTest() { if err != nil { log.Fatalf("sql.Open: %v", err) } - rows, err := db.Query(fmt.Sprintf("SELECT 1 FROM pg_database WHERE datname = '%s'", setting.Database.Name)) + dbrows, err := db.Query(fmt.Sprintf("SELECT 1 FROM pg_database WHERE datname = '%s'", setting.Database.Name)) if err != nil { log.Fatalf("db.Query: %v", err) } - defer rows.Close() + defer dbrows.Close() - if rows.Next() { + if !dbrows.Next() { + if _, err = db.Exec(fmt.Sprintf("CREATE DATABASE %s", setting.Database.Name)); err != nil { + log.Fatalf("db.Exec: CREATE DATABASE: %v", err) + } + } + // Check if we need to setup a specific schema + if len(setting.Database.Schema) == 0 { break } - if _, err = db.Exec(fmt.Sprintf("CREATE DATABASE %s", setting.Database.Name)); err != nil { - log.Fatalf("db.Exec: %v", err) + db.Close() + + db, err = sql.Open("postgres", fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=%s", + setting.Database.User, setting.Database.Passwd, setting.Database.Host, setting.Database.Name, setting.Database.SSLMode)) + // This is a different db object; requires a different Close() + defer db.Close() + if err != nil { + log.Fatalf("sql.Open: %v", err) } + schrows, err := db.Query(fmt.Sprintf("SELECT 1 FROM information_schema.schemata WHERE schema_name = '%s'", setting.Database.Schema)) + if err != nil { + log.Fatalf("db.Query: %v", err) + } + defer schrows.Close() + + if !schrows.Next() { + // Create and setup a DB schema + if _, err = db.Exec(fmt.Sprintf("CREATE SCHEMA %s", setting.Database.Schema)); err != nil { + log.Fatalf("db.Exec: CREATE SCHEMA: %v", err) + } + } + + // Make the user's default search path the created schema; this will affect new connections + if _, err = db.Exec(fmt.Sprintf(`ALTER USER "%s" SET search_path = %s`, setting.Database.User, setting.Database.Schema)); err != nil { + log.Fatalf("db.Exec: ALTER USER SET search_path: %v", err) + } + + // Make the current connection's search the created schema + if _, err = db.Exec(fmt.Sprintf(`SET search_path = %s`, setting.Database.Schema)); err != nil { + log.Fatalf("db.Exec: ALTER USER SET search_path: %v", err) + } + case setting.Database.UseMSSQL: host, port := setting.ParseMSSQLHostPort(setting.Database.Host) db, err := sql.Open("mssql", fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", diff --git a/integrations/migration-test/gitea-v1.5.3.postgres.sql.gz b/integrations/migration-test/gitea-v1.5.3.postgres.sql.gz index 2fcad82111cf00a0fe6368e0bd714c9d5114c043..2380f8dd7fc8550a977291a5b74d4ef8f5ea67f0 100644 GIT binary patch literal 16783 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 C`4?3H literal 16612 zcmV)DK*7HsiwFp9R!m#~17~S;WnnFLF)lSOGcIsvb8&1gb8&0{?R{-?8#l7<_xuW8 z-w$-EWQT8hOX^k~ucJNdT1Vd4^4;wH!WxkyiN_>|J40I5ZtZ`+c%KFaGiYdfXvN{4 zoP;8Qryl^_cx^OZy!h_Li{9U|VtbpXAAWt?n)vqi@}&3ty`63st2Enfd;h05_(}Y<%x0ge-_Di`o;qF6viV|t%YNv8y!!K5|0fN% zo+tTyI?L8KS-xT^ro}dA|0!6?Y|T@>y?A}a3C~!mm)Y&hBHfDQi`(b@B2Dty-E@;| z@A^l*KKuWhWLc!&E7^A`qja-d&$g_P(`&{c<+vh^MUM%duF|4NZbgFoBwsTQGD)7@ zPm6T6%NN@RPU`07r|-V|`Te`U_1;|meDPcF&7XT0zrFcz^`W=fT`w22m(M=_dNI9E zwv3qg_p_hE$#+GXPqR(Bo-XE7CJLQrovc!H;$?OplV!8a62@k?m}8P}@3ZMmGTUbP z6q_U4EM{mr+ca6pVifq~>%}%Ad7f@ETymzkNFE%sSg=}oz^7L=gHNBQ^F^M{kY&x& zWy-pb=^B?fk>-Pf-sIVq@kr;>>pWRA3qa+{^4o}(Wt{*s*CN~HvlOj8%bS8(_%@kl z*Z+gAs6|oi(pXcLnMAWJ*7NiWKF>0_PM0`lH`$UIv-%GvL%K>9%V{#7=d7EPe_^uC zQ`QMQOh2Va?VU5#if#Q_wpwvBWkbuZP&Rm%;45#&Dj~Vf@&vD@$#$E}?!-8T?cS2v zjMv;Y`@}kF#%~yrDah%~&%aIY)9bq|`^36kHomheWPMk#_%NT;xL{de7H)TOITpo~ zcL$$?HU~4!SRWEoBGDDZR)al);z}h4#iZD(J|#+4R8@!^(e*I8VXb<*U^61A+fpvB zXqCLN_2~k{vWN45NZBB3wA4JAePZePL^P(ptbDRNMrIU4b#w_uuIR#(r zvE|pN_*~aX9?Ovnif_4CQxV#WoBrF$A0^1lzvG)+&U5(O7tDXK)g$Ne+vGMvq|EaO zG2*-84sESEUwn%__1?3PQG_n*6zO;J{9 zev7V;YEC>^D{oBoSQ+oqWFDhscIKo|tfRADM{2kHELJ$#{Tf}tX32`2YMS);A<|^w z!-4o7l`Gk8??%&ttvk5FrC&CzXDZN*zs|Oco5d`8zG>%+9A>?luOFhb$}TiMo7hT- z&K99$R=yaMvNFc@I(BBc%EpVG#rNED?h)PmDqBQ-svPU|%T`H?5VmC9M7ECVB&;o` z*y354nJpI&>)AA2C)Z0{_vYr8tIqhWv90NDnZcPKPPzk-;j@XugqQ}>d1Cr-x!)Ec zMOto5x36+UY7E>$j1a?`XNxYp%u-rIOfE4XErT0~R)*O!D{x9Hv&`B2VYyi24O?c5 zRdSU}kc-Teuo3olowC6-rbl=4>QBh*Vnc146j9c3ySa^?;OIR3|8Y53XPoBiWT`jP zgqh%H5cUo=(!Rj{bVPlCT=?QSTia3MtepB!thUu;zs3@`_t#_lB0G0+m&9j^s46=n z>Ik5kEw&HPi?YX54bKQz`=@M{zqqwshRkl0+l1C zOnRdrW>c=rr0g{!Q*1LoYHvYhV*iP&J#Y#ZYcF=@M+kH(=GEJ)i}$^&SATkY0dl{) zeESa#p-!NBLd@%TmmjX)zj||d)zc?a8`k}!aQLQk6-8`CV==U^jf!>&GoDT zBN`El0T0XkNctoVjVPQ&s#wy81dZYxI#u!9Qz zRD}}9L}(0sJXFOo2S;&O>&3PPi*J=jVet;vk0rX|7%V>w7Qq}MRba~FB|KJAt!&{N zgheP9)fF7D-i|@@w_16?5rw4>HvD+z*dq$lKJf4(JBK28d@<+nV5%bwG>#k|JwR&Q z#3I4H=?a>)ag9gR8`d5?vzLuVa~!s+n65_`7Flm!R}jsL1=vo+u=d~%YGZ}?e0~E)|UsuqlF%Hjcj@4k6n`c;D zvujpCEcer}SZZUef}}UhusG6pvjU?$JFzI9O}7f9Z(|OP4|nCN$kv`67PH)bs{n$X zIXoKN9`hhtyJuKbYe%U9YVSA2V6p|e7ftLVp>e?Oj0X+w-C!}x{g(C!4Z1`Z2-)MKx+`brfdr$wg6g!w8>wt{9Az} zt*R3&_*>^kTUMh_y;?gX64?TSAHDa2pJkTs*b_0xQNgD6NNSYn9j< zCx9US`f%~<$BWC?^~*zka9X7QRLPr{l3`4F;R%DtQwH($c{2u4r43?QN5&Xnm;r~5 zL6ytVFrGY=M)4F$!-(#&Gz#0v6qEuEsxkOw@-VV>`w@c;GKA5^DK-k0rwrqn(`*!` zPL0G}3om&rE=!HWRSri;T%H<-i-ioLfyFf6wudXh%01f+{ z+HbSI?!Ei_CEtU4XApk+&LUugC?2oh{qoDj01Q=(11`h>&MTMcme?#gL|-rwI`{l%~{;Y?lWC5pqNp$gohS1?5J|MvEW%`J~F z%T@uibiT`zWpA0RZ+FRUDk^~oJDsOD$!@u2W7jpCM{bf?$|JV&pW(0fi|rl1%?*O7 zT7^)GshA7xEqUvfZBQhs@Akgz^Y41>e~WqVdcj7at*GJ4k8j@|iSN}ENc||kQ#&r! zcdKlk_Sj$PZJK}geW{~9i6Kq3Emd2LGVG}Gn%=u3aAbk0&3`}8;{D=o82Wj8(Px5_c_TQ7VF#RqvPZ6Wda^Z(vx5^P`|?) zZx%AVd#8Q~=(8#SvSqE&tpnYL`1{pxD4C)*D7C%9t*Y}fjaT!&R(sr%Zs$V>nvNQ$yy)E$q~q*mZvw(F zYOS-u2t|#C6%I~UX$=n`@6F_Z%ywlbGBcNtZD9OYpJ|oL4I=X@&&~rT#zz$XFRih1 z=ftrhz1fa2q@Y#Iv-`C;ADv}8#z)c8hA~j%*5Y4j%}-HAQPx9HIVvkeQsZ#Z_hlfi z-1hZAV<=u;ma&)=9)qzL|1>sZJFYaFjXkh54qMKTaDiYndt?&TYO>8P)QH~g6iR*e z3D}cL`$Use2#I3XvV*#9CGx8Gif}N{PF>9^U7b~#urtm?$umUgeSCYWwwzn>zwCu_ z-47sMl`{&hvd^sB*T3s2RViz`*e;ugo^^VUNM#}!+C^NfQ)m1`OxJ1`QLl$cD zas}+s$XwAR6+&ikUUsh8nM5ArbB@$#tj}@iZZU;ySVUDe4R}FuX|2e9mYu+mfgw9_ zN*U4%|9K~+rFbRm$yB_uY3hW;SnByfYq3*#&BdH=Q<;jnLD6g`@&rCOOa*rxZrGn` zzR9_SrgYx*+0ZpQitz?iL0Dg0ZvJC5A;^+04ZK3=xH=oB7Xu^mll%*DRB zggqm2eh?tIkwQlSPr!b7ts>jxLT%{v+@VxwpMX7Sv`;iig^=iVEjy^%RwAEvdz`h1 zblekZMrykGg=scQeH(Y+9KTdIQN5ab_=Vb5xxdj=kh%aFe`aR<^+H3El7K5!7q)95 z@5yK_neEC>Vy0C-&_3m_9>dhmn>4zn@9Q=zn~wM1ICV1?`+Ruf8Y-KQt(X~4eMzgk zY}i?te3QoW1MAkj>3N@5z-@+vbr6f&wY|s4zfIS({9&^dv5<@UpNnmlC%0)e!7RhezFQqNo(0ejQTWHJTlbEB25wu73v&SGyA8i_wEbrmRY%Iv{)TLp2 zt+J~fPU}tt>`l8(@}SOfD;weR8;_?(`q_LR@SG@$rENaaLu2td&C5Bd*}c$T+a4Xo zZZ=EZ)cP`3l{TyWO}6GQ%7LG1O|)!}kd{__`zg)T1>cjQx?)>b0*SGDSwV9(2|NZX zFKW;jtBkr4Z>ZHxdH*R~aKEFf-L)rfY!J@!#rDCrRP&@x#R~ZiMf=P3ZlzxbC~TBG zy=is^fv@m9dQV^FC?DAgO>|}RgjCkO=0m6&Aht`hlGGiCI>)fhB?ZzV%iKkeE6>?(E57Odi_L556;_iCHk}i`hE#2B z?0spjEwyb8(CDv+lcmDy_ZlsR@rdY@8OC=G9N}Tl)ZvY+s#%zjdHy6ZceY&qm`3(Q zf}+;;s)#)*eN{M7wUC)W4MW!wKr){}zzASO)&QfX$KHU!-0&5CQpj7w{7C9yJ)5R$ z9{vKCXLfV@$SWrG76$7is7IbKZltzV#ow1}JVhovX^4+=`USgZ?+;OD#*mTWI zPCd1bRC7^~aPz`IrL+nTkoTtDKxVtL6X~_f$5v|ot4E_%kXagyRxj(sPO56|`bDe| zl;BV+*ui%xHPAxdlLlHc+m)R}1FL+X2FhP+G|+@krqe_7QdEm=`^N1ZbuF}5CCjDf zS2>ri`L+2xpuBG0G(pnc_w@sMg-vm0VAU-~>D*Y_)Mn@4@6q@i$rQCgW{5s+t~u&7 z9;0+(rqh_E^QyWr%&L|T2ZPF0)nuErimV`gzzfuP;xG+0tcgQUR8RV`ytu=1o~?RR zE-`~g;zlO6tX-J1gS{tHcBHng0TL7Taf0TnfA^Sf<;evarL4RL8NY5(SB}F=|76Y7 zwzxy>hN)H0{oP`lE*Hht-W)JrtJ<8-;jNDHSNX7w{i{M=rTMJ~zmb%a$1B`Tb zxmRhqkb>8}^g(IrH8S>O@-@<_YKEi>XyORF0ymwnOAsjuFN2kUt?q;2gIa_y>o<)?`<@mLkyC^$$?0!2C}AfLKY&O9EN%7 zrl{C=Ng*c!&f$anZrZeBHy9#q<=&1$z?nX1&#=;0pBbYy{|f%zI)I8~irOIR1pM6W zZlFx#=?Kh2ax|TQd6yp10U#rRg!ZmHF@PJl*sgk?mpf}srwH0p7h?4+O`Hr z^xek^>bm~jtLO3+Mk+NIXpdNx3V`CS+B0vH+wgF-%J9`#>(O&en<9oBq}jAgm%Hy>4V`>v$z; zoxYnFlL<9lW5#X3z(EVY`(oaRwk@XF77RgD6T8n)lk2}DV4s@rh$g8JI&Jr{tLV8- zRHxzc!Er+M7Jy2(ef_lf9jl5G3{~yofpx-iaJ)whL)HD5S+>4e1RQ^xYe7&!S3+lo z2*CGggg|WTN}w}7msQ2^c!CD#9j})Pp=vM&{aeEm?UCXkT0Xe zwMw5?F&pf2&(}9u{>k(8BYczj&wQ7tK3C1J#&@--oL#tw5dbVASM>oi^Zj*_SHD!Q zq3+kbs!*##p3qe`?@Lfso;StpQ|-M9k2|awB#Peu6xq7AgN;9~0d|Gyb+l$u1n zTrN0xCnrb^(^ zPVSyWq?jBkG|Q~|G6v_E$ctsz86|fC&2m21s7$lO$l#fMrK{^S4+oeKX`vqRS2`KiDnF^FrQB9ywyU{)XzE2edVp~@N zoie(tT#Xb7>eP~Ox60trs3qLMYF0|rwvMv!H51 zO2LK#i91o$D*nFowJMpSHfXfBhMT3tAdOF#@3ZL*>-xx|WR!rBd!$9m6t>yju9)Rw zJ7k-EN}D$WmWjN@HJ@&hqL}d;B)(g#-&1zwWx<2`VUl)YD=zxJEX9@Ez8+|-#LLUF z5tG7WA-mBHThrYx3T8=!e%>x@+i8k#1jv*7-t_~UZE2T;9S=m)!8E2)m{7~R8M?58 z8X0@Ch8pQqHA7+*alKgb=e_K!jL8?7KnUiw4_zIgMa!Q{+UYMFQ%VNyH(rr@sFW~-@^REcRR-*rv>o@V?f{#*pc%d5s+&2xx} zJsRcN`JP+&3{>GRZf=;~rT2`>L+u5pQqP!{Rg#1wQ>kt@I0ALFWxM~~+L(>nuJ>r0 zwr6F-)Qq{)Y?JbdBGpt6K%zGc+#m7^>Zgd1AF9z*;?7jo#^0yv+L9@1 zgHDw_+^lINNaIoL&#ViiTiPqMfI90`fu*%h7OHKPt_!uZq4%V5w$PTvC($zxBdB8P zXODJKItj)C~xxc)`C{dMm0*XZt7=jz8+Kzv?KrC}275tpDmr~3AL zgjHB?=IgOc?wnj{QBM7kH1`UOZ#wf zWu~P(sQc$+`MhssQ3YTNt~|Y+G3_nB_cK;!WS#I<*pFZ@GNQ^LH#Df(3)DE?U|+nE z@phZc?szC2a@Hks6myde!G4x4m&tXe4sVDHV1vh$!ODp$#;S`J(6DjTSLnKz5iHao zL{Gg0k1c@7i73WA<*&1tP;bQLaL{84VrNB_WV6g3M8rn&QW)g866kCQ_Hy4pna}eM z#w{B>rVLh2L^0%+DK&qE8be%WK`_4E+;*We8a9Tr%7Y+nrpnZ`OW+vd<;*=yUHHLK z)0Utyl(jn^itd#CvbbHRDY<33@bN`3dC`TD5ASwT5D6V$2>2FlxB$X$yc7NcIi5b) zl@GI*do`WVm(cP2;r2yS0Xor~c%8v&i+Qk@nz6=>B5glc8{!QgV(oxFgpVyn^~KS~ z!a$D$>XJb0sA5!Kd2A{}`M@A?0ZQN)_U_wy&D2F?5OUrEHI6iRIIW4XdSr~4u|kbu zY(2CUVr<@O>VUVwj%Dw>PSjKe^DqrDe}fyt-FcR!iFf7I4PyQk{Frjoye-jK9+9() z6$wC&Duc;}Vh=*6lk*4IaV4k(3vVie34Kk>-{8h@cLF~*^OjM2$!Sa2IMy(1Z8Pa= zI9KulR7J!UrY=@#uwW)OXBR~>;L(L~LQw{bA+C;hQ3L@TO&{Ev4pCPj!8+iskYmYP zp|G0RitF=B{W3(Oe8AX-X@tBftu0bvOo z%^HN&2vYB&8!3UKsUy3QGEzY&)MKZ{?j`+3>f)9p9H*iq!G zcXb=fP~Ik`EMqLVt8pR!6mTF|&K}Vw; z_M`aXIvC5#n!1)Db~Ja}uehlU+EJI7zJ`rqZhNXWk?v%+6+hF$&a$*a9W`ME8%5dj zDD#v4nZJR3!#Y~%nPs_Y_I`eK^$JJ+&E|z$6B4vDhIU5A?OdVJa2pO398IGRhYF6SRfn7vV>mjcDePFmok_UHjzoG>l6NP{ zyHoPz|Kb;SkHkY}N0wXkk>v|*^)&3C{*`nR?X!<}NpUx1AI>KyCugVUX9MuDsnS|g z89^$4(o{xYgUVR+zizFJ>#5YXeI*D<+g6w1M=br!Ho|xQh>M$6wYKzbJQ7dSNf$ew z;ASc-rhItdNW1;p_2iCB!ji;4;*x>9mZ$#^SA*4O{_nb$`pP9y1FRltYYWoPmh<ED`dd) z2!{OYf%r$5`Q&U+*W>K1KqFj%M*ae+ub)zZ#<&9UZrAiQ!>8Or6I_8NebD0!pK=Qw z;|g@#7wdxGfeoGD3UtDlAL{~*o^pXsaRoa4-4y5ySD-V-`~<6VH3OV=V})>xv+vM6 zw+4JO1*k0e)nvq9|BryQ*8R0Lup%Dc_4OM;QOr>An7_F2o2)i*?=9$)5fnf%j>xmN}JkUNEfU|J^rBsmU2% z9fzjH-(3BTgf)&IRe7okZ?kOPyU+4Z{|nUR@DEs*V^NpKZR&EB-o1SJ64c|!smF$% z!rU+;?k~zaZ=$7y*A3|3_-}Icex#mxpYHPI5e%rL>hz1Q(@ZuoeglNh!Zzu8zF6P# z)&6iao?!l8>J3$Iat6ce?Iu|)cX@iS&W74L)`LSoC}4_ zU_qGboV5m#%6?Yg3hItMam||x@Pw6LUd6XZ1m(V>ci!Y`R!ki>$%EQk)2m7lxa&y9 z=2D+!ST23iv|y9ORE{V5BTvBRr}79&-kmYHjP)j4^Vqub8{Zm=vm5qtYf<-{5I0#6 z%XY#Fmq7&V%2u;Buvwr7WK|XRuD~W=WcgzIAnH#(`!3Jzc1u>-;w^Z&6H$nRJznF< zoNoo_rGC>kfP6*1X3fg0Tohm^r}%=NsI2W>+Phig{6ZH0-Dwha3aI`wvVSx?r(l}U zH0}L8)}S1UN1z5rz8Wl2_RZW>;n1nSIt>Q& zKpl?CIz0R4>Tse}aHQ*S;TvQc z*Wrn_WMj-Hpbk$OM~{KGx{kfo)ikD;F>Rw>E34T8i>rT(dqbX)-fp)+Il16I?K( zt=6N}t29-`W968Q_>Sd_^#&|7`cR8hV`x(}iHfFeEe5S}hy;uEE&AZ+9MmA3^)~xL zbi&3sRH}Nep;J@s)LjQKP-jol*{EJ-xg3y0(F-*=$stC5RoQA2*yS3r|G$&#**v|G z+r>3i-U*)(;4=bz;3jTE=c7YA5pOCuv6iUOK?o#bXfuT&)Wb4Tl7D|(&7Qz4sj=au+%_&0Rma(mb}Mq7I<@7L<5Qo4~-I=B=b_3I{jn9Uj){)t%8 zWP~O{EmKjVfSZWjtJJv{55>8cNvZoZe`7yN$fzP@L@#7q5i;(F8WzTxB5ny2_p0U+ zjyzsv{}r7W9CU%BjUHsLA0oX#%s<9e5JIwTII2$?4hoz$^senZT%NzVo}U zu#v8?G2DT5Dr{s|*iAa0T_@*frzgjg@n|^c*KS_d8=j6ZNNgAC8VEURB^F;75_Et( zLW8zL_6Y^ecuu+DX&$NOa}*VvPidn&aPmv2{3mf+v8h>EZV`Ejx)3q|)N^AjI=quT zh4x!19-wB|7!NQG)C~{+MO`%_5ShJ#m%R{MLf*d4iY`x7F*Sl?&7gyO8 zPsNkVbR9E2)@vKa^v&%$%hSK#Ew*W~NoFbIb;Izt#j_t}7cMFP!iNg05bsky+E`zG z_~$Mu?)Fjyb3E92v!3dEaQ+_0d@>f03-OgHR4%5W|Uu#Zk? zC~tx7qZi_L!^W^58Xk`(Djf!^MFm3gm!QH3VET8!HCfO~wX3@mYE5w^L3KT5Avi!eB@-fn{h53Zslcl z{(Uj~G);xg>FH;I-d*Mvt0(a0L-jaiZ2xKYa|in0o|T^U)u7I!u3lLW%}mtHqq3Pt zeej{q0eT2N40YUsK}{PTTKS2zvKrBNosRq9L$!SemF6BCTKRX<%5v{sH14DiJ_K!f zQ2FQ3Wk20!J}!;4OiLYf8;6ZTmtWn)+)u z^(koT(?0lcXzFjRsn0-DpY_3q$2GMtOy;4jpGaGu%b2F3iO>7s!=bIexwaNT#La%m zpbtMaH*|G{b!h7+-qw8UL(jm6<>nan4tZ2_59?OlhsNGdWAp7yzK_1;aRtQ2xQJHl z{(b1vzrCg(SDSv^ul{|QrGIlRKdH9-q+k8}VD#T!(;tI#FSETi^zX0X|2+VkaURP* zwEI_Y_Y=_WX1{Id-*AiCS3NZJ(`sn-vQ__jaXS_Lx$?M|&dZ)JAJP7YF8(QNz*&t3 zjC>k!nB0GxN^o9L0?EPc2f(+7iT<~y1>(k+R|`g7EqHuqaL|G$tOa~S@5Iyhk9`Be z>h##xBY@x9ZW|o@@t&4CoK)07nZI8jsz0{eM?C1m)6$1i87!o( z3pi=$9s;|{VV97DE<7z=IIHM_ZT=@seZyn4;m|QWU1d10nKuX_r@n5%{6e>wkj>9K zse>+j#d}wSx=Dji8Qh=9))Yz^&JN1(Rh0o;sT~;?(NU9&sA<%?pWru#1>_TJ?@@VC zYh>I+M@=V5!S+7v8$IO)AFF5Owm0H#hx#w38*f&KHn%Zr0x61;Xs_lnuuUE zp|V1m|Vb^LyV>Av}3Vzf4e$m0JT4+iIFXUBuuQa?^W8L1EosHvH4nyd&b zg~O?iLPgRHbQ3&2Y?cet;+8798)d}l>N?HsQ2V^M6g`l5YWSW0B=uQFPOS-G(j_s~ zjdKyhKKLMMsc;wjr!^LFUmNRd@Kx$-BI3tBL1HQjZ6mY#UaCuGCu;v7z^oyl4reDs z5L>&zw2LjiuIuH;GICsf6-EJ$bZ9jyz_Dgn6ICl3P#qQVvjQrP$0g*12vX@6-@-m6 zf;=rD&xjz;jQRvdH0qF;2D64K4})cCx!IX(=*94WF#dW&=Yt0v1HdM&L<3F$V3SUw z0gnM-lPRJBPXOQv1>h+FY_b_N;2E4TPyn6-KoYeX4geyF-VEWR6eNl>905cU%^8jX zB8ln@CjgN|cZSAZny0`Kh$jG%Mte>HB8~Q(0Yn<@IR}U&+A|seL=x>84FMvF_KZeg z8c8!^jp4+U1aSh_c_fI(0Fgv{MkfG~Mte>HB8~Q(0Yn<@F*b8dq&?#SK%|-Q3;`mE z_KZgWkwkmOV}MAaJ>v;LB+;JnF+e2Ip0Tl+6DsXF1&B1-a|RG;wC5Zkl4#Fl01!#E zXEFqcB-%3>0mReL5{~v|CxcnTbm!ftXjC60nAxMC02^ztMx{Z5O{78x^aTkfUxf+{ zd`Pepv&Au_fIBVWn)V{FaA)P#M#I}@)K8YEw?a4@{l3a3o6fQwe@_z`vAKVnEtBNfKaD(D&x@m8kt|tP%Lj>Fa+@}_7*ADfrxF}|A-e3(i(+xTST42?N4-_@ zMSdx;gw#bbFr`Wz00ys`tQYRljU5@ELrOBB&jJIrIYpI zUkY=RXLn4dV#JcN>Pd3_->IrWR^ijxuGnU)sZJn0PnM$o3;3sa=-zQrQKxj)K_35} z&lK#_JC?WCI^x&z=QP@b#!nrzJu}A8K3b@DIG9M@05!rT;dJCRSy-c{S5;( zaoEp1*k7#uX)l$b@x&OGek$N;hQ>K#So*HOFaO}SH;J>o!t)m5xcyR!_9!^W_5Xn|ioC9C@iBVMQ`Pz(>Ycd$J>zM)hp=w3?w*Hg0=>V|5WQuZ zZPN90@#w%XzCbtt7Q9ok%NNYR?y`F~rc?iJyWJE&{_un7U|!BMrmO4W%k6UhLtoX2 zzyH7s8kK?^IU_BHw?JDlGK7;U4=jmjMj)rANj@{vp$$u<5G8T-ht&e74MBsbUx@(^ zxQJR6A(1@KBGiY9Mqa6~EaSENn_&FpngC@7x{H%NTQZxaMZs!%TBQHf{o99&Uq4=4zP?}|u5dlvhl{rt zudjNW+bNrDCu~;wvPid|ljZZiYGg|eueiZrFsO`=7N>3YNsPk#VFslI`SH2%K9~VH zAx_(EGP_%GBk7)(D=WZl##R`~btVHPc2CbIF351TpQ^J3Ay_SRhqWJWuDAfhdAdw_ zuPNWR?4F`mUXbHvnLSKDr4Rey=g10hliM4~e4g*66ZVM$U$KNc6(~kh_+nb6nxir4_${N3Bijmou=9K|D>}$%#Zv6LoC4wz#b@8r3Ltz zx3{||=ZXq4<1c>igBFkz;Iz)Ri+!}CB?rOjW-;5-0>&dPz>ja1>}Mo!Bn5bF@@&h@ zc#kWD8i^sEBJ+MGl@(b*Zsm^8KG;>H1^DIZzV<^LNkLxAG%5Dbk=TNQtoZ)sdY*n^ zHngvmeZ5c&+dQ2w^1Y1yK5-a^{1L7_u>+zI%!=2K8p9*TZ{=LD2TqnC)Cspf=-#lkpl0^^-Q|a?_pjbuB6+=fdv)<%IV8QieESdW zR3V|i>#_g6`uS%73x)Rn_WsQ;uipQo_t%SmaQBPGlX&}BzB|rRKm+rV0D`}Gn@=qp zyWz~C{cMfUFi&%$4iEA>;cMW%oNeJj-qumObI#uddrN|^096WzGKeF2;{(tQ?^Ruu zL$N5X=7`?$59o@wkx<9prVuQHeTMJ45Oh%rTZFF|9ukOh=(B$4V$cnL4e#e}2@mqN zoB$jTgf7@y5_|=yQV5sf%Qnr|$x`3Q;8zJe-*r=-svK{rYUtQyGpQEyBljGu#ur1o zWOPwB3GFKm5E^V9I4!c(!!G+@Skt+oBPixd)1Nc4K+( z_VENlQ9QMeitQfL6=yA=j=4o3$UjSV+q==UU`q~O0{hQS%3zD|mBK?JTn^=rQ@Q|k z!d-!TSwq1=zOH{x)kUZa{;m*TIlM%|Y(LpjEP`vrUC8UV)J+*Ga{T4-)4`QZ zyBInCO`VlTOQg;}h_<>WZmAucd25 z<2Z{xp>&SwjB{O|V2eg_=9AabZK^xYHPcsHbeJ=DrBZ%dop9yIUYG-NicLE}*@P zOQB(&Fl3YEO4SKxAi&GqC4l1J>#X;aarbJOq8RG1Qra1;3!VzwM-++;a+R~8?q))@ zv!I9>kPdmHoyI!hDY3mwf!H9|H$VS2wLGt2;2cf*&E?M*zv1}4et+@m>O$t|J!?dN z#tP(f4(omV@aFQrd)M1MO?%H_jxhUO8U2oqGy}zP-C-&i#v1Gx_D8)@5(b`2s@srVi=46C>n&C+ex zX=j->#I?LRO3k)J#_%mudl}nKwUp}VMTU%R2V=Cd+PIWD>qSN~Zqi^qB#?LdK46>g zs;UsdZr_Yxl-A~g25C0hnQ^RULMhwdK@E~LDH~am&-r}7L9W4>p6&15iL(0PUFxM5 ze7xdf0k9CxT@I@hR;HL@kTpaDerzGIO+jg-erPQ7CNl+BMr0ToBEAl)P1W3% zv1rPaA(ph&>cV1pHdUv6frV;=se%e=+Lw4xTTH$SDU>tg27HUT=jsl6maMOK5NfRr z37P6^ELeTjNEw$)O;3Xc3F?GiiseNUN{gzXLXzbL8?-&S7fJLdD!vW)khy!!#@=Zx z^PtK=x=^YEN3(BSILRMp%dDUrj4P-Wvd&DtOxeVedIeI24e<=EI3(gcP3FtRI;Cc6 z;RdK$X&bmM3e`@8JPl@mqe<7yk2{Rgvg3$hZah^3GZ=o8kRF5$aD+)4h|+F~IG6#7 z%^M;Ti*k6f5Ch!8!xH&&u?idD7+fBLyLMEQQ5&*4&UmJAHMJ=3s8P1Bg$Sw1dwA&f zH5bxICvX*1i=n=Sho8b3Jklz3K*JnE6$vlJWrQppT$d=kB52nslB*R-u@lyo1T=pu zm%k+N9v}INAWHm*0X84POg_7k%t1%C4ia2 z#ULNzYSD282o8AVq=&Lote`@+x73zQRJ40}VY}iHjpE(;~QvL&6TY3S1;t zkv7a#_k!0C^n6Qf9Op7Uo_9ChMcp_O=8o$wC=YUcz(~#wM>kGzgY?U0!6?vGcLP2o z@5Ftu=)*kzGML9t_)ef?M?t*;YcbXl9;$nh{P$*}@)ccLmJ%~eQKoC=N3}l%0mIDd z_NHVe`a?VqE+kq09I+2%g-p2S-kX#Ia4ovc8^n;Xn8O@l_IC;2_{eXGR?IcnIOb(~ z1n)GNcUS8W9myT!2(u@hVS15qtQ%*T7Ord;x*?+u9LF1EKvE~{Pkhi3v}=166V!zG zii`&r(lyasVy?-QnA9shFEWB}XoXikU`1(r71S`(Mw>HuTgHu+Ax8|eU=a z_AMzv4H{&q6V_0yMoyxw&RTq%cs0gUL^Z>hNz3e>VGvfgAH2feM3J(1ml^7*ix4Rt z^bkJi3T+W2CbpN*$TXW!01rV=X~I#jVO%hWqn*^M2ixVXVq3-6tHQp?@=uf|Xv1RI zs-z*Ji-N5Ob2?MAVKGEiQUp<6qz;I3SR_%N6hTxTCv`wo0wc-F#0a{Sm#DqSNWx8* zsR3>W14IQG!x%9%DBLc%Vp(GNk#CmQU}N|OH_E|_pOnk4DlBAM#^u8=yh=pM^-Tp8 zL9=OvBLb!o?kfX4$V>zY#O^1T!Sbky0Z^Bn3=tSbQOtR$DFV<6#p-M-NRjy1zy+;R zj5#=vQSitoc~w}8ril3$H?@<9-EnLc;(g%#= z+t^>0Q3UDr){kwGE`upXYH*27uf~3C4DX;qS7IHK*LtG_ScXbK$ha1$$RTfsMhW{>NCSg6jWm0VQyfU9UjR01Q#__n?dW>;U>wg$OjDB>M)yemSkRXCN-uC zYLIBNL1{d~sk#jrJpS0YQXhG-jT%U6VYIWd8^j9wr0eBq+FC?^gNX-l}+k#l53iTDJ38~QcfoOYR=uZa9M5>Flh$#G zit>Ix>eWo%IacK%L{g?zbjxqmeIC+pf+}lmB^#eUQtBlt&WEuyIypj1U)JXNlXmu6 z(-K#pSm(B*Uab$A#DgwU#C2>zBb~1FO$j!d)Ss~%czK9IPg~(uID3v|%6b-gYL&rs zedKI4F6M|GUA^MnI#Q|<(LSvZTys|vWCFKTS5og2VYZTMAo^~}%s}6THN5qDy z*Ws?jBOk>8EaI5h(5zcQOWUHJ5CNtDS^t!%fuq-2D}kq9wEGV>GU_<3rtZ}HThtpQ z0M^?3mM@LrHb&%*KY>q|hn@``JV$8m4Fy^!6fxwQX_-Tad_m3*U?UGW@`aaaM=PnC zHB{5;sjkod@cJ(ozq~RuB*#~;-rawv8*v6+7A38{4*R+qP|NY-gj5ZQIsc_wWDI`+2(0oUWRwnd<68 z91R0=F@UZI0&Z^UVrt0f#sc5~umK$Gon6eGOq~JFjy51yzS_z7oJrSR{*dv{fli__ z$F=ruIT1^e{9RG0+O3N`tj>BkOD61HY826RbX7~NjXz(zdXX}i0c5|eE*zGvo25t| zWJu7{Mak~=N06EH5d0=5tyD{h{rx#Ls8pS@Q_c)Jb}s+f3-0dh6wIDEIjA3IclM{Z z&@}t-;>7FaA?EpaZrNA!za5NND177e5a@RkOzXw@L$KKqLw79^pudpa4vkf33u{uU zc1pD^b^qnC?5&6T@n(Jx{cM@R&VRDUzCcKqZ;STHv{gS1-z(4V(?jszJ8YdS(U`%0 zdj>FZR1A05z&+-prB1cAFLqV0aN^v8N%hRAGflRTjWjPk7-mw9?ECe~RDJAC7({&k z05sFj;$vQXqe!-{+M?lLx%Gyg`zRuhPq|3Kggk}OHEbD>aq`ynicx=r-_r`3dw)` zo}-O(eKWBheA4Ys)|}!p-c>iLvKQ+|dHiqd+O$t#!P;iiW?ZYnef-iHs=710RVUro z29b4BsqpEv&NR)lReN2dT++Q4h2O8i;gy+K7tP}HQZ>3f)#&C;)k@&=#cAeUqr{8e zmW#!IP0!^{)Q!_a(Cg0FN1H@5{Oz&QtMPFKjb*W5qj~Ucl>B0|_f;=aERjBbyYl~F zH&#pgXjyO&woba9Y@K|pHXm_y%C74P1Sqo!FwSLsSNQJ9o&ofW3&X$0IQ+de?UEAmlPWl48+cBF(88e_v3vc_w;j$ttN% z?B`7_=oPy(Y3#by-p^Wm3p}`aZn8iFkSEpXAS(1f{W71kRmaECU*VOWvGs z2K;;sE){91&U_xej`(N>(~x-2-K7-Z>gCUg*r-HF^OV9$YBo5JC+9ojC0cDzS(~Jo z8m1N#l8hl_wIW%islCxB< zs2VhAypW)utQuv+fM%|hr<&!Waw6&&y}6nzkJl4qUrD9NTb)Tur9XEfQ&n!E8&bag z``yLuMZFJn%9SS_?#fohiC*d^`Y88te>gQ255>m*T6Fz%7%y#C>KQ16C{%H<- zy`($h+0u;i)sgrrh*s&g1dCR$cPq{wq|M@C1#vAV4r41Tcd(<2A-znpuq@YbpM#FMVSj?^XF-Lg}<`e4)a zqA!;vrOiayI^S_)K{mpIZ@QZ%ZuOgHBA^lIf>E4so*+BltBeeAtIxWu{+Q?%&Hi0e zezro02PPvZw|1=Rmd@B|OL_QL7YjlhuFZ}JvsQqxlXsc2x8Bax*HyXd(l%G=N}fDh zHt^ks50rsthS240QBGY$cW2pbsr76n>h8(3OMK^0`-esHzRC?vvnT*6;@+_XZwI>(k(XC9Rr=d6A2bWI@fk=Gv14;R`n)rdq1Ol@hD4b>I?* z*d)kJq!?wt;M+fvxE(s$FGSlv+OFEQcTulD{8fc#B#f;SS-ifHBc65shsn6a-jFB2 zUPQ<$uc(@wi&xgPst3WIl$OBJ+H`_@7Ugnb1uDgDYC`Mx)9C#w{yvPECm&gz95PYWHc6F4c=H8k|_n(B*hJ#H|!`Jt( zr?G70`fa@(gjbdur0HMR!?&o>@=*lc9;o|@K6JFtJ;aUX?GpKxEs}!Xs6poc%$z<0 z*5esq1r}iEGuQ-`{&v*LtMIQrk?9kUTZIg0))GrOOjV(Wnm72F+>utv#}m}PqwY&o z@vu0qt_SXNRO7+y2c!81d6;mbQyBMh3bQgY0r#g=i&gVSz0hPI^+@i*^-NA-E5#!S zbG(xF^N_%~_aN@5EY;%Q38wQ&1O-{qG0UyLLynx;Sv`*~r;}kd^>AUDA6Nv9T(UTS z8$a}6b9=-TCZ^1A@lD(}BZ4bBUhYXK!E!FaR^L_V9lnuu}My(T6j3Ahy9cSK-Y zp5m{-$iz9@H^J*lWzug&V?3E#mteR4C(=27y(bRY>E~iOLV2Tt-Ob@~aUk%(Cmtnh?^< z%{2JOTCNzb+s=<-T4odgFMe9bf&$T-gJhBo)0zn64zie7x!Li3fAZ@8BCxOfem`I6 z!l&jjk>*W-a|a=mmT+1lkdEO_LK+qQ;)hOF^yLpngV@dumJ+U?85oXWIx(OdOhgYu z+b)7G6xHD*r6H6pd0r)ur{(U>%`85401ir_2dQM_rS|}ZD`@L7hAfq4C-+=d5xi(f zC$^lpSoTb~Gg8iVxKj!o$_b<;@7+R3TDf!xGyD%6fSYZOG?WvSj?640si;9jcX|Y} z5tm)arC_;Oh8B=>&Zk;1BJds=7-&$Rbm}!akqw&R-PNSLzwH-3dH? zm-#pFAbI;roIh^Yu-fWu#scGy9m=NZ+7;8mfH|7|T0}lMXUfDu8p*+!Lfz%xRA@$CXEIEk%7;^Z_xqMGeBZbCW_o0e$<+9W*1O%o z3$FX$;P#u`wCr22OD~DKZ?|{=vC?q@PN92SP4(XmX}tNN;iC)pb}gC?ajdpl+o^88 z=`)#p)%&Buy+Y@IA(ovEi$m_(o0I4}oyqt3^=upvCEh7CMsm3T*W$S1KU@pYsXpzm zh>)&?#6)?FkaTYjiKo0v0kp(l{Y&h=uYq0JewU(RD|mJl=QQNzd___C&_o`GviYhG z#WTMWb0Qb+ksuKpCG8?8c8YnKE3@#aQ9KW)%IXgOiol87?}A@++$jO%JDZZKI-HB# zhxj}S;OZ6)Pm`dLe^1AvcZ;6>Evq{iA9BXMX^u!A%;n=+{L}sF;bZ_=|Ly1O`gM2p zVg1{qZM*ib;PB?-yI{SauW8v6{EW-b{>U!RT8W^HAc7r{`zgKFTl#>+{nczRb|1p_ z!N;8-vKyPbpOn*4-?zil`EgWp63%D;=G41=@QZ)f==aG>&@z*tqzA$wPR+`V|JT#` z`)FKr8h*hs%dP*1BlBl`jdbz=ut(=$7m4+#{T!HZc9g?pbb)`ecjFu%@^zI z#zywfVf(qx2i-$f6j*Tws>&KWn&{)s_E(GcUK{d10oz2ti&zs;P4bmhevQ&R1Q)8H zH7;A}b`j+VK(pkP9rTm+^NFKBX&+@yR~gO);C9K!NYaFyK3# z5xNaG3z2?)aV3AdhnIAx8Is~7(QnMhf8IUYCll$P{uv#k-)p1Vrg$sIQ|eU~J_bJg z=LmMOGg??Xxf0haxeV0QvrQ)*|dTvZozY8L{A>twKL zeM^?tB#ihqwMnK{ydH3N`jWxtRN&K3vMQ=$6S=AfU7)1uzi7`DbYP_Q2hi^VSMxIuPt>~)o8UT zSZzEG6k-UjR6aCWvRakNRdD%NJc_B3;JQhUv;)r=YLUBhDi5Nl?g`4Cu(>Ju{GfIC_ycYuJ1tZoz|=lbdO z0VDP+r)ER;KA~FpZq{FAJoDr`I4**z^a82l^u1vZuqFl zExX8&Xc_k3`Fe+lf7wV~Kf(H6+?PMbOTU7rO$rDv*GoowhJhTR3VmT^%!1vTLHHT4 zg#+y#EWw7QN{h-C8%Y(s`OtKNC}eidDE=NJzCRS?El&hPL2gCO(E4-7S|F5Zn7r{80x zWDHA|*Ty!RAu-l3Xz>DwdPY7P$`Blmgqda=EfE71o(#?wBZqHT>+H#W%?q6c7|Y*2 zK4o~^T9kJGP?$L}m-sX4tVP}<3iqJdxbP+q5}QNpQXvolYgY8Ufp=|ZZi;-@boZ|! zYoE@VM`BIVPhin46-`|dZ4=qOk7>;?-l>8UIl_Pz_G zEnmx->OKUtkGyF|!rOLN_$OCo4}@#Q9Wq2~o_$ydB7H0&KPCFZFKG@rO*)gU;zNE- zOqPoEDWPp){*2+UsUIU`sxlAo1w1y3kX=5}JAzPxe>R-AXgLU%?WTttEmP(4)oSkr z+U3BsTT%1PHi}XPI?os@|E0;Xvc75m@#{7e2>A2v?xJkLXCt=Yt!J`SY_q&iC^l_! zcV+oDdF3}mtVL%^C+20&Z3bBna1$UjWIr#*$X(uOiMN5P-R_Dmq9vi$=$c_8jG+%- zL<#~=%acQKZ((JyR2mA%r3cK7e;BH zvj(8eSl31#mC?V~9%N9JI$rFQvB4DL(M73d&T(X@>bB3-d7U2EFE#4*tQli#ebhEK zTg(S?9S~2;TSYoMMl?9%rqD38#U(be4y!1SSNNNTZi2VSVvH;?b0F}R=oF(#aPxyq zczsHoY*+cq1#%0~CI;kTQt385AFN#8wNA+ck>Q z7Gyac7jur=;##G}qU5;>=Q+z>}T3paNc7isb{QLI;D%PHxb(|JNyV!yKYcZ2_YnM=5zLLH5Sp|Kj;?pPMi_70FPq-IhAr=AGJx#Wt!f%$996oXCAVGqVFPOChQXFJ z2jPN}`dFhts$70q`TveAelBXhnPXAP+@@sR{cWpw9_S-yi@8QyG}FX;CIOAKS@~Pt zs{PZVf@-6>dBtcz5@XXW_t(-GRRr7fOt|O1u_pNLTsit6EF1=rO7UfRGVRf)1nddB&Jx_#Xk9BKNz zWd2=`lBKngd)$<4lOB#w>GW^JzSjJ%#WU^oWlJBUc3&4aQV8DcM7&io%B67S{k4k0 zN_!dA)o_a(7&Yr(mMyw^{|pBH;`0>RYEbEGH`<{c%t^|$B&bXX!$zGx<UOJQbg#W8Z~Dz4w`UQ32<=2TMLVLz=!(VjV$kTk6F^}shjU08Ja85+$mU}MGkTu0 z)GZK~^(tR>yc%8b+|(tS#CY_!c{||NMz8h+s^?wR)S6gDeWvl;dqdJeFZ9o%6YlF{ z?x`5npx$c>Qh3CVt#Hvp9P$)uKWxr-9vgIW918=r^AAM8Lw+M-dURWeRLA0587{mk z_VMEQ9HNvUcRF9@eN5z)l~KmF=|`#g7H?(Tl#w)Wm`AsS5RB zbwI&x&0qL!sD*aRMHzDi1J0#;a-CGyS0P5cE=T(Xv{UL`D<1h&lO2whf#@0d_Iw9; zChva$ypoC>ysfF^-2{KUeya~p^N zlcuxa_X1Y}5ykdLOA5FP5qydU$BciLVFU2Eu|WcQMB7v_TS&Z?z=!mg_Y8eX`VY~z z8RFk^U`)zYN_{%bnAb{?~o?RI-EBGlf!+Kwg=XX$6&`xb_~Is1RB_bkkRlshH!-c;)KK4lz8++G0-cGI)ld}iG(wb^~oi= zB0SqIo)4?tQiXldd80=KFk)@OXtCfU{G#76ArR}Fio$W+M{^ZKM$bXo+LFmhZ`yHT zCJ3CD0)@zb9W81&-;%}n7G9?gv&?YFiVaG)0fy7%2R%f&GQ8)I}a8XbdNVi=h_bju$ckrEK-|a(R{yUeBOyFDUZWBWkMRYBrFJOELjdLV)M(R znU##2w!?K>vJQ+RJ_$P6xu^;}Q6evS`tv@bt*`;=% zb|4uQ=C4JwP?-sBt{?ymb#%~hfhUv({t{HMi-IWW1tFdO3ja5Nd=RB@hYS_pf;IlO zcOPD0Prk;)Djt3FnYyj%Hgubm10=^Ts|5?a>2FhlR9u~C7R3!eh4|0b>*tzmzP=tp zq}*Bf?(-E6J`+&0Rp`>}jTVQgAW^)5GA1?}jXXtm=K%Dkj>ck|D*-l^`b^!mw;v zXhgSr<>(}Si(Afnz@NAxxqm^Ru2oBz}3JAo5Uj)b-7OvP8n~=Z0I9^s%{%arO z>yNG>da3L?{*f#OQMlI*;~OdiKGqwNYDzp>F!#Y`oW|Rntt=)qgO{p(|4V@zOzkoq zK)2KpHkpUq_C3Z0+O!-)cUu?i47tzU9}X1c2M8qf7pyJ@8RtBRHc+{dj%j)GPDX zDX<z)Eaa1FH9WC^Iq)&yGR`^ zX9ZfN6N2;aL_P#N;yJp+{D^DE&Q^_TfE-!2UIpepo*a0afLuA~uZl1@8*y6;c4H;@ zY+0*t{Z>SK$&eabs3B#X@ARcC1|IoLP2L!c=$hFCiFz#rT;gSnLUuKgvI|;Tqxl(} zx;*oYbJl3PQFy-Yp%>*^R*9&5S9kJPZaH^nrEP*=;p%3{aUBPo-k*ApzD>HNCSorM z*miFCNvx@cwKHXlAy%z}kaF z+pKdP??gNt%cz;Pt>N`)Fz7cc^v;8Yu-H+uV>!PX@qNCTf7fE&NGcav7p6@(CEFg^ zC$j^y-{`83Uo9;c?AOfFu{AQpnmE4X@y+wFt4*@Mk_XvCHGtEAdv6L>YXWM1xddN| zvUCTk;rH?tWo%gpMVdv;u%n84mw>d*63nFL#rmWI8<^(Q_8 z^|5Q2j{(l&?5(Y7DHL^0eh$6F+9w3dOtoQ_J97M%T6Ap}=r_*$*pK#+kB12D+`X0! zJhNxdUYR>Ej?Z&+6!+(%3PFs_184e|w_wlH#u_bB$#Q^csP{knOywIdKr`|j7t7;z zfRg@NP!JUTYf#uCjvs>fO3_DmN;Gj``kyCAdTezGQ!3x8@~OA}Wtf^2D4Q&SCLok* z4Epr>&+iI(zUNq8_d#F1$KT?8Cm7(d^wu zGWM-Ft^JnQZlO{V;uFkQGU_g|wKuTsJ^_h3fe^ zr^IOmqxou3=^SL6*ni>`#tYL4X)HKKO&SR+NyB)#j1E1GbK>6qU-HLOrwhRPoxYF9 z3wDmlcy&%A+SvT;x1^eUp#nwDCI`6aM3@3&&j0MAr^`L@Op1D#Gd5i8zE(H^e5 z5Yk892v8&nEy#*06UX@G6)}vW<2|N`iVKn{GX47Gjhx&%v1AFe1I8qkEvYKG&F?(~ z9?2%hYuqg8sObO}%E~pDBncJw1gp$_&P!3e6$>L;pYEfi3tre(?UQ(lNN3SPh#B1-7EZ>KGnr3K*`*F!64eF4?x|2&iJm za~fT_0ZqOZ66uvj%3@g_I59fjNs+olQLOOWQyN4rh9-ECT(88^LRp?D@E&d3dr`IK zIJn~~t=HTa*WL)OH5jCCU_(}%QNYRhfiyU-D;gY%Ln30>>M%Nj(_Ol>|9ZDv$vfng z#r+~fcc@~1j9q%jA#F4bRN;;=)a|}~HpnIArUe-D`!<-Qeg8THib9w;rijBCMa(^$ zS+?Z<#E`{44AOQH&Ftr&$ikjgEIESMV49f3JqD|eUj(+vR8uv<<4YL z;O#CblHO!xauj#%Qf!V8(DsTc(ERHo1x!q$DM7$f5(poM0$nKnGe1#J7c)W=>%Zjo zsmh0v@$`iT3vwKksO_qBNg?EQq9J0OmO{(0*%S=qd~QboNzyq?Vm94z>reMS|^84utZZq6kf*?Q`|KPm!H)Z z?Uyrj!h+s&Yf?t?4lXlvO6_wEF2mZB$;?|m6q$KgriL7{Mp8qP-Y|hm9?wM)nKedG zLmciiMd#HPs+RCj3-JY75qYuEt z1rsG4T(zb4f3*`ycX^`FBNhT|i6+)-v_uZyP>UvqvEE{dB2C&Slimk49vIEJ7LFSS z9_*PTd{QR-GMEN-OI1M#!jXl>O5dFXbJpAGd5+&dzaK1xXAf*#WWSUptemXfhv@rq z?U9~P2g~)!`V%Ca9>fQq93&4MnlOv~i2oKr5nVJp%>NBh9-<`_60!b@k(eDq?)g_T zZYYt@n4frbfpB7kO$T%6S)J$@|4tY3iG*azm~kgwoUS^Obr z-i9#FBE(}@I1;i!`S4Yr3wsFGbL&;Klii6-7c+5`{&Ds;Y;*v5P9jIxCPqMKW@ZL3 z!^9-MTl@zRd6YHK<9qN#7I${(Ig{hSauJ&GOO;EmAhMp~YTEs0Onhm^ET`T&%yiW8pQnF&!HUPk+uLBToV=_D28j0T6Xg-Q=-q@JjIC?Zn ziMdPQI+kM{bcOl#`4sUf0u{J6QsMghT&^lITLryYdTCLPj*lEU&shmT`D9f`w8=m$ z-SASR5`E*@bGFPSQA5gN3SuMRD=ouHgsCCRq12KPfx3@E*z)`>T)Wsj7QEp}bT z#Ofbj%jGjsFA_VXxP0>Iw|;Zk4-JVj1y#tMYCT z*f9Lj*?1QDC;X9;{2nSnvGFX^G$SconLT?3M=*7?_03O!{3cQM=uvGC*s4+nNt_xZdjT~tgo79(9%;67o- z4Jhrr?0D>b?VT@W>(}eqrHPzuXEny&H`eQXoIl?7dd)R92N)l$>eqd_Vior_S#dEy zPv9Bq2>j}0g0}d|v{j$!iTtv^l2J&^CtU|?ktey!;Wz+(!KKZ-a-Lg=J0u&Wsy+BN z3Is;#YQFd$5q0IzWp}L*eSkFd7L*NL@#e{z1AY{8R#pGd`+uL6KUz1f)haX0DYSjq z^f34j3jVxvNfONicS?d+?DY$D`_pX#eRGDyp3y%Hv(t`#&ml(#`Yupq-%{S+lG3&Y zW+4>5C1Fj_Eom{9?;sm&9O-}8#Bv@@t{8SupU{nsI@|Mgs*lFHr<+{(CKAOiEt{14 zKnlp-m5zBJiYpHbi52f?;MEx(C$gT3W_qPi2sZVFb&gxyT}hJg{BMFU_~Z4&j^zG$Jk~~pMN|`q+Gn4RidipD%z3lvwVa@^I?T~@x%}; zlW>|Eb7Wg1ivDd^@31~eb_%WZL>iWMSqw*dkp_^}6;9b0HAhKSuacryiLN)niU5y) zG$!prub@WNb(ly84NQoLIPIA$>yqjf&k5Z-^HoT+amG3G)uv z**6zEA;#rcu*Na< z&6<^XpV3;3R#xIxf7EESS{9d*QoD-i`Q#&VAN=LoL*!=7a_wcR@-~*4r&`?KPD#u0 zdr6aP+hF~dRDKM4e_arkIf|&g`iyHa-n?vSYGTu@Y@Gc^?!)zX+yfpYVf((r zZF@k0sRed*c`Z++@-BZZt5}{L*SHWKC@5}Ym&JbD@y7MHFPCsaE`q$ymVRF>?pk8B z^_#~deHAHf6QcH|m)(F3uscM14;l}PizoKjnmWp3J?UafHADYyz;Ohy;v!n}lJfVb zvEgh?k0{}(7gC?d+ z#%5a?)v+i7#{DbVaN&JvL{6+ZYxK83mK|HvaU((niH0OmP}VhW?8I9U&4k1N7Ub!$ zWszf+=sw#Lmt1%&QFx|u@l%}S<+?+8I+1PhPf{bY{65KMl)`#je4ZlrKCu-j`pwcP zC%PdR0Uh(Z_2&ty;okv;pB6Hhw&hjT5Gd`*WM5ao%yf$u!Nv6~u7<+_MF!17wz@X9 zM^%aA!GSdg#7a&E^8!B=YChdCTj*m6H))P#^T2@_n5Bn*2AVu^cb*3A=4?kpTwJ@( zS;dAvmb`gt$)aP-i9FWM1m~`BM>OIzrXEm}-~#u7Uresk+r_F!ItU4EuK;~tzG#2) zVjA7Sq&~}q=AzGdIjx$1`mlQH+teQPA>VpUH|fsIok{jl@5P2%M0c^RIBJ&6;CiD< zVTT7)1M;Rswr*Z-evaH|8_FK5z(zp%_hT)`UM)u`l5Ob{l~eUr>Ewv5lc%Gf8&9_U zXtCizpir~eJ>NQuO{gwotccbmfG`$O;gMiu^GJ44)Y(}l*URMrx-f)ni%nVCm2C8k z1&mBoug}&vT)^0`QQk)+}1K~w93u{ zSE30A`YyrK-<{)a?rT-PU9n7spBMgNB(43+6ohMYkw+~|Zch=L@Lic)CO<39)wWJu z^7c(~(#<_svwl>{2hHkSpO;^5U#~nnYGQ6(_4h^H6ZQ_YIyq?<;McS}KcwyU>KomX zKW_P?>s=;^WDf2Y+-j+_er3++BVY7+;FMAVB_4RGz3;DM0<4wgK+*oN>p?BeXc`R?t{{>HPA(S3`ZDy0Ci$-ljRkQTOZEskF-jpird9VxQPL&m} zJwCEwNpw5pN)wb_ZB+4&Jj`T6jJkkzV*EPn_jZmG9d%KvEQBMm@TYhL&w z^3J0y`dyyeZ!Udu(Ah0ElfLdcrPuXz9a(%D`wK>X3qXJQ3P2FYeSPUZzd)YeM3cV$ ztL>9}n~o>^PT~1XGAp6}^5KRcjwAf`b>s3B5a&`C7kRDhX?v1eZ5;YRAdLH>@bML> z+p?^~Md^O`*=*qzeD;XvkLxK|#gE6&5RXV`qgw2X7x{Ew|55JwDHr*=Il%k=xctuC z{%S7#ewq91Tlf})EH@t{<>c@_-2CAOyXGCjak%^}pL;VecnA%*vvHgA>@be+`GWAy z?g`@Qo>p@Pb~k?@vB_@UnnF`@#l0%%Ap-Cg4UCk659WV(mqTRa&}pDtML~9m+CX)=))J)q1WNscYE z>aQ#Qfq{tsoKnpy z)g_k$j?G$D#z~g#`D&j(iK3!<)-ICb$u^SZPO!Xq?r3D>tfB|C)3I`aQ3Qa9s9HKf zC5>-5XhUQ=G050VGn1Z=ZE`$-j++^~Mv!i2xA4nv76zHdBnWUfb)V;7bihB2x0B}2 zK*iHKFu*V>avNx5%w5%s+Da?sv$O70Y`@~fnk4j7S!8Vas=cQ<`X}RdCIfmKte#SW zNL)fg6dwh~wF7i~MQ#BiH*-S?=&hW4D_bpGDbKy!T9dV{qGH0ue@uE@l2ima%LenQJf?t?F@Dcxr97x=^)ruh zE@+k7mTQ?8T!j|nYUVj^ffrWHId_58AE0>^wu3KP%sFKNo_zBtxe!N=RqS51;hu{% zAE?O??TQE7c-TVS9YO+Pxt_71AribZa+7(0jSwU+vnt_@82ahx^|1vfGt8SmJkLb#`xunQ@PIqfP2r<<6WH4G!8f z5rIA#ELFc%*=-?T!H#U~GdlW218BjU^+gLhbc@rcg{ukhICmkee5~u>^YRIO=$}-9 zU)jWOy`#N5wGSq^rLM-ceR+m|XDxWo%R}5>6OG?dF=v*kgJ&%}vy*3C+gAXzlh7*u z%}mvA`$W@nXE{FU*dgb18#9&;a9=vdA4a6#MTc)U(V~%V^hsAue7GqSc!;|m+Z)u? zEw$Q?v?0N0(E16HyZ>`$d8&y}HxKE*lKzqDG&{u+Q-A+Dm`^&Q8Y(Y-9clj0jD7L^ z&iu)>b@L2dV@P8Ei3`dqrj%@&{+_V7j`}3JGl}@ExM(3Y@WX3<71e3jD|D4^f7}fc zyQ7_~N4uB5=2i;%-pHzbrh)ArpDui_37|{a+M0G`Mkc#$Peb-Qhb|ZiSMacX^2?55 z`r-e|vT?h3JR;kPaNgN_yLal8O`3Dc$=i}ED_$7c-v?ysk`;67=f$Q+Kb)Dkc=HNm z=g3_Hu*=IQkKWEO;0vH;^Cx&%U?wzTQvUH;<VqaKf%?#Mf&_b z{>6|9j37!^x99js`c9iJp3$vb7`LT8(w)c7+8jkZ)!G(Cx$I<_$ZKHMp>JZ;gws1j ztP{Z?P3f*jwxaw-w#WeVY!0nNL?t=CP%>H<#Rr!~$PdS+Zpwi!LwzAo4Jq zpqc(iy23x;hyGaJA5Mvdap76rI4VyzDb8d*b1gT45aJ4{GX445*LRDQilf<$>;sDw ziDCr96l~c^!2jB)wsF;utj{k{eD3S&wy=-8bF}tsnPhhJoWQtp`k(BXbLGj&ns?v`=%cL91tS82a7DbI|y<=NdY|R{8MhJo&>`9UiFK|EH*<{Pr?*}=?9BE!YSq9 zkHt9#*WuYEJUjNW9nZ!1>d-hwM5o7TB1X1?(EIWHMi^_{l}5qa$zoTdix&3rIiC1s z+T@eVC=B`y#wa{2Hq7|3)-UHMQx?=5mydCdKmJvY6H zY9CN84pD`TQ7?gY#zDL35*NeEmewectC#=r`1*M~fB(}E?T)!<`2Q=4f^u+coy_qd zH^>tavtbo79q{~u@q2@)WtH?v$ah`GE1BRK8@r&E=z46FAtGbLnqxZPk^B#Fb&o%l z)e7bK%cEtc*tJuW8W{sG8Yjb%kPf2HCusQ%(M(P|xMeD9tbM&$x09N4SNIn?>KCvw zIAk|n;UAz+*biJgn1EmS{{)F!kdf(AxyJlILAHqdm#|h+5FE4aXKs0fX%;msBX|ZN zL=qd=xJ~UJpTcr9T;26mx^E8(f{CSrlcsSg?!11QwdsO)ewMh_n;mjic5uzG=3%@P zF!i)sug((%vL)7_&0%)$K{a%0Xnf+?QT^WuUPs+W6P+HjOMw!Hk}}CEK4B|q4Do-t z5;HZ>Z+R1izkJrRfT(iZ9s%(SdMO+u;{{7+)-NMkeCy+8e}Q7juvvEw8fL0VXB7-9 z^9Z4^Gu0)ZQ&l$ebcW7^SvXa`XAh6m_%TF8M0!Dqm((E$$WE?-{`?zPlOLYFx`F~9 znFvv{e_gtA$a6-FUE|Bj%mo(|@7KUUMVs+bg?uJ|K37=boRVJIwb)9(8YLLV z;XY@75RMw#ZJF&CQp-2c(Pb25v%G`;7(UkZ?*!&C%ckr|sLP)5G9LS72z2;4G{Fd5 z&dmWd8RnZr8TpwO1Ya{={$K95{$DtLyyDHl(tkre!CO{wX*aN1C%p^{=Q2%x0wG(B zj>B?Xc(LN^n{HYH~8d-)?!iE8(&5c1h%JDbefy?4X{sup;S``lJQjFn?SFW6A3JB*np^iEC3t#*mfo}y?3&oC^6b4sD}jHE z7^1pY6eag9gxjX8Yj*U~xOfV>Cb4?#$q;=QB^#rwZ`Q>3EQQ(o;IVAt#C;OWE9lU?mJm)^FJ>6A;YT{uuQx9krQ*|wzpMAg*!`^&O= zV{iT!7sy*7rWyrk+|gI`96-ntGN);#V)w+!;;GY1qoK~z|LUI$LXzlwj6}R`CYyBc zxtUNY!-~1|T-@FT^#hEr&gu8vf+%Ch_{Ou)DO1PrGtsJ+am2j-S=PG)4dbxc4V=*< zJ@>Jd92v^%*;nb%`dwx3{v7!yunm#LbEa86C!rWoced=xZi)F{oqGsSA6^NIe}!5y zvlLSQrWz(569Rte3^R9lo>ng;JofURUyiZQ*Z2Fubhx^Gy)R0ym%H;*pcqJRpWh2I ztxY8G%`o8m<$M~yAEb%+^Lg*8zFy$d_*P&2ryo?l78T&sE<=1uTaATlMT3--u#&m9 z%+KL9H5{Ye&_<4RN6Rck1#}u1kI)MW#R#UC(w_Z_2BRnEG;UBcKaR>`Wg)NQX<|kdh~Pj#v7gAw>_Xj2k&~zi2OFju zgb}t#lgR&H>^xI+ZeX?aO{?@j!?0TORX%aAYc=VNAoiXeB)Jr$wCO0)3vC_cYB)G= zUs@_N0|NZAmVb0GQItYOXDTKdmJPx{jPX~BP>71oVNg757s6na9<25}S;f9|kpt_5 zG1wuED&a;6wAK@;`gENpGh|Y+2?c~$l>4~|(O{)!3SLAuMvWHocs7f73wNfF5Q-`> z<2IWv4Ko2{!OOBifGRN%MSl9%qEL;}@7f!Y9enmJkugsKH9`n1TvlV_5JXZgQs_WU ztr!g-Zjd%AM-?Hr%6=~?JwCBC=msEM@vlZ{vY>9E7)>2q2;yWAAPn>)7g$Vq-pFWd zW`;2Qv)V8lT}*iKh?s0<1`7DIe1vCA20;ZDF~9i|MKHt&omAfc4Kr;BFhqZvn^>Bd zQF$UbT%t9OxAQPCHDScWq6&r>h}DVzJu~!nq*PqXqyYYElA+o^H!#pQv4kKmCIBKp z!=6X*a$hpFVzARU6To3qQ}EH%Bf-YdgPI%vViI-`k{^5$Eitg!42i~dL+l6rgVk;x zLm9&uJ37aZiJOs~!ndjr$$cpdoT*l%f{n>${iiss)WhutGtc`FCAw{%~iNjyn0}7Z8mZP?V?1kmU1h}3WA)jW83*m;4dv(KB1mk@O z?KB`J2(Qi^2uWb+ZWr6@5mz;Wgp zw2H@1TP#B z%lmclDR~XgATgpUTx^yDqaXxO4aJ2g4PxuYQP+$yyclY)1Jc|?RAqqp6i5K((*~!1 zzRX+#vm-(H&-45A(hh&Z{|oV};qzIW-XTOT<8*SrKHgnD`6Jj>lgUBP8nSm0eDGx3 z7`#R_L7(@?6c2s+H2wz161X)y7HTFi>HPJx*Jknyu3(;ngqpQ81UJP#SjU_IKCYeW z3Zfmb9mSbsYBjvYyiuFDEkk?4P{+b`oYjK9-`NhyH2FpZ&P09{m5ymYG+Flw2|anr zLwaNxp=~gVhwn2Qy37J<;%w594`#F!c@c2o;421i0f~S9zU+sw$?j=>=!!}1#vLNi zj)y;Cy?R6sH6zW4j$F4PelM`P!IrDQ;aG-_?h1Y%TL)N%6`M*LxKb{?glb;`j!?o6 zbGN(Elx*!r?bmu7)QHM0ZvEC?$-iez@Q}7WHpD3EWjd(eCFx)gu#cexC%p#GQ*jU? zG$i0mcoE(fh!fdA@5qi zopco5vcl?^mSXtwU4bmjL2Ggqg7sNxa2^}WR z0Mk`~8M=|UPjU{!#iA*Z(ry7Sp5eyB_FHlTl96Etj5~-|lJpX+bqiAz7AhZ%vI#(Q zrL3QW*dV_FS?f9kZ#N62%P{GJe+(SjZz?oB(_Pr@VM<&Qn&)ku>0tt-h3TtVmAKY? zhSh!yDxo0m)WDfaw6u!hJkDl_Q=ioL+@E--5)Mwy&jQ>`5N-FT#1RS4nbm)#@fIHnKLoT<#W0>RFn(UEA zxhmDB>kfpg#kPcX^`hSJwKu`sRoNUTURyJd#VO#>wSK z6xOge(5xscyFs7q*S*ZN?30Xf$VdWPoK4J(q#aUN}BncE{TUkVPj9vPTV*q8oalg9wUw z#*uauGm<(`?2d9DKE=aTh$YK#z3tq`Bg;6k~HKTTwzQAX0q#WWOS=B zLN9?jEiaj^cGyF;aHETQxgChyLfM-YVA3%xUEs*~Hf_1G3pAWvD-b$=A9K*oVWZ4h zzCl{;f$^P#PepzWk)CM_L~RxUyD$U9J`vV00A7RHU5q3gr+3ga7^gqFOI4W%?yr6s=SN zX=|A4l(+7>QIiesX3$8x0&a6OkQ}3-kD35c4I|0K>w3ggXP=D%5l}Ybq+;g z6tIA@8LYlVv4V|p&Ztsu0PAzoNYl#3na_0EI$)Am*KanXWaEstI&Bxo*3nkVd>eki zHImnX!?eKe!>&X;_{eLb?t#2@{H;^!hrB!iey#t5A0Wt<-6T&a-O=ji*v6>#7VBjyuIw(eSJ|tjHQYS=wV&;A(h;|;$#E}z> zV{RtuZkSt5?$hsAJh%3tXLO&g-~RqdV1|Sna&#MK;*&vB8v}|o4S0E;AHEH*2RwsjoO%*1nz409$v(7@l#(Om}!8YSJDd?X{WG)epV+ z(7s;f;k?@jA~4Ec(aa}<#!z8O6o$UWXm^RePed)hu!rWU<}fG0gPzYt5`Ymmqc>9zlB$IbP%x!2- z_QYxwM;M^3pPtYMX5AcM^av?b=&k{%OyBKvs(o}NB;$c~hS?5KoNpCb9GrlG&jDJI z88OG)5w`6G+jfCXv%$yL|9SQ6D;W@l{Oa|)8t@A<%>VfC>iTBz>fJjGMJF}5c|Z8= u(_h}beODaby+qP}nwmPw5@MHmAE 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 diff --git a/integrations/migration-test/gitea-v1.7.0.postgres.sql.gz b/integrations/migration-test/gitea-v1.7.0.postgres.sql.gz index ed66d41b89d1c0c427f1d5f98c33d01f2d0266db..e4716c6b439480ca5238f6ac98c149b1c6a7bee6 100644 GIT binary patch literal 17831 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 literal 17659 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 diff --git a/integrations/migration-test/migration_test.go b/integrations/migration-test/migration_test.go index c274d482da..6cdfbf7d7d 100644 --- a/integrations/migration-test/migration_test.go +++ b/integrations/migration-test/migration_test.go @@ -168,6 +168,32 @@ func restoreOldDB(t *testing.T, version string) bool { assert.NoError(t, err) db.Close() + // Check if we need to setup a specific schema + if len(setting.Database.Schema) != 0 { + db, err = sql.Open("postgres", fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=%s", + setting.Database.User, setting.Database.Passwd, setting.Database.Host, setting.Database.Name, setting.Database.SSLMode)) + if !assert.NoError(t, err) { + return false + } + schrows, err := db.Query(fmt.Sprintf("SELECT 1 FROM information_schema.schemata WHERE schema_name = '%s'", setting.Database.Schema)) + if !assert.NoError(t, err) || !assert.NotEmpty(t, schrows) { + return false + } + + if !schrows.Next() { + // Create and setup a DB schema + _, err = db.Exec(fmt.Sprintf("CREATE SCHEMA %s", setting.Database.Schema)) + assert.NoError(t, err) + } + schrows.Close() + + // Make the user's default search path the created schema; this will affect new connections + _, err = db.Exec(fmt.Sprintf(`ALTER USER "%s" SET search_path = %s`, setting.Database.User, setting.Database.Schema)) + assert.NoError(t, err) + + db.Close() + } + db, err = sql.Open("postgres", fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=%s", setting.Database.User, setting.Database.Passwd, setting.Database.Host, setting.Database.Name, setting.Database.SSLMode)) assert.NoError(t, err) diff --git a/integrations/pgsql.ini.tmpl b/integrations/pgsql.ini.tmpl index 6265e0d98e..f337d98fb4 100644 --- a/integrations/pgsql.ini.tmpl +++ b/integrations/pgsql.ini.tmpl @@ -7,6 +7,7 @@ HOST = {{TEST_PGSQL_HOST}} NAME = {{TEST_PGSQL_DBNAME}} USER = {{TEST_PGSQL_USERNAME}} PASSWD = {{TEST_PGSQL_PASSWORD}} +SCHEMA = {{TEST_PGSQL_SCHEMA}} SSL_MODE = disable [indexer] diff --git a/models/models.go b/models/models.go index 9eb174e200..74680d847a 100644 --- a/models/models.go +++ b/models/models.go @@ -128,7 +128,12 @@ func getEngine() (*xorm.Engine, error) { return nil, err } - return xorm.NewEngine(setting.Database.Type, connStr) + engine, err := xorm.NewEngine(setting.Database.Type, connStr) + if err != nil { + return nil, err + } + engine.SetSchema(setting.Database.Schema) + return engine, nil } // NewTestEngine sets a new test xorm.Engine diff --git a/modules/auth/user_form.go b/modules/auth/user_form.go index 8ceb961d24..228e17dce5 100644 --- a/modules/auth/user_form.go +++ b/modules/auth/user_form.go @@ -25,6 +25,7 @@ type InstallForm struct { SSLMode string Charset string `binding:"Required;In(utf8,utf8mb4)"` DbPath string + DbSchema string AppName string `binding:"Required" locale:"install.app_name"` RepoRootPath string `binding:"Required"` diff --git a/modules/setting/database.go b/modules/setting/database.go index 8c49ba3c5a..911ac90a05 100644 --- a/modules/setting/database.go +++ b/modules/setting/database.go @@ -30,6 +30,7 @@ var ( Name string User string Passwd string + Schema string SSLMode string Path string LogSQL bool @@ -75,6 +76,7 @@ func InitDBConfig() { if len(Database.Passwd) == 0 { Database.Passwd = sec.Key("PASSWD").String() } + Database.Schema = sec.Key("SCHEMA").String() Database.SSLMode = sec.Key("SSL_MODE").MustString("disable") Database.Charset = sec.Key("CHARSET").In("utf8", []string{"utf8", "utf8mb4"}) Database.Path = sec.Key("PATH").MustString(filepath.Join(AppDataPath, "gitea.db")) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 589506f7aa..a7d8b97d3d 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -102,6 +102,8 @@ user = Username password = Password db_name = Database Name db_helper = Note to MySQL users: please use the InnoDB storage engine and if you use "utf8mb4", your InnoDB version must be greater than 5.6 . +db_schema = Schema +db_schema_helper = Leave blank for database default ("public"). ssl_mode = SSL charset = Charset path = Path @@ -1953,6 +1955,7 @@ config.db_type = Type config.db_host = Host config.db_name = Name config.db_user = Username +config.db_schema = Schema config.db_ssl_mode = SSL config.db_path = Path diff --git a/routers/install.go b/routers/install.go index 7395aeee84..e18adfea15 100644 --- a/routers/install.go +++ b/routers/install.go @@ -54,6 +54,7 @@ func Install(ctx *context.Context) { form.DbPasswd = setting.Database.Passwd form.DbName = setting.Database.Name form.DbPath = setting.Database.Path + form.DbSchema = setting.Database.Schema form.Charset = setting.Database.Charset ctx.Data["CurDbOption"] = "MySQL" @@ -147,6 +148,7 @@ func InstallPost(ctx *context.Context, form auth.InstallForm) { setting.Database.User = form.DbUser setting.Database.Passwd = form.DbPasswd setting.Database.Name = form.DbName + setting.Database.Schema = form.DbSchema setting.Database.SSLMode = form.SSLMode setting.Database.Charset = form.Charset setting.Database.Path = form.DbPath @@ -267,6 +269,7 @@ func InstallPost(ctx *context.Context, form auth.InstallForm) { cfg.Section("database").Key("NAME").SetValue(setting.Database.Name) cfg.Section("database").Key("USER").SetValue(setting.Database.User) cfg.Section("database").Key("PASSWD").SetValue(setting.Database.Passwd) + cfg.Section("database").Key("SCHEMA").SetValue(setting.Database.Schema) cfg.Section("database").Key("SSL_MODE").SetValue(setting.Database.SSLMode) cfg.Section("database").Key("CHARSET").SetValue(setting.Database.Charset) cfg.Section("database").Key("PATH").SetValue(setting.Database.Path) diff --git a/templates/admin/config.tmpl b/templates/admin/config.tmpl index c2793ece9d..c6a23cd367 100644 --- a/templates/admin/config.tmpl +++ b/templates/admin/config.tmpl @@ -128,6 +128,8 @@
{{if .DbCfg.User}}{{.DbCfg.User}}{{else}}-{{end}}
{{end}} {{if eq .DbCfg.Type "postgres"}} +
{{.i18n.Tr "admin.config.db_schema"}}
+
{{if .DbCfg.Schema}}{{.DbCfg.Schema}}{{else}}-{{end}}
{{.i18n.Tr "admin.config.db_ssl_mode"}}
{{if .DbCfg.SSLMode}}{{.DbCfg.SSLMode}}{{else}}-{{end}}
{{end}} diff --git a/templates/install.tmpl b/templates/install.tmpl index f8d1ef04e4..7f7c754bbf 100644 --- a/templates/install.tmpl +++ b/templates/install.tmpl @@ -62,6 +62,11 @@ +
+ + + {{.i18n.Tr "install.db_schema_helper"}} +
diff --git a/vendor/modules.txt b/vendor/modules.txt index 2f36278d75..6b2546886f 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -613,7 +613,7 @@ mvdan.cc/xurls/v2 strk.kbt.io/projects/go/libravatar # xorm.io/builder v0.3.6 xorm.io/builder -# xorm.io/core v0.7.2 +# xorm.io/core v0.7.3 xorm.io/core -# xorm.io/xorm v0.8.1 +# xorm.io/xorm v0.8.2-0.20200120024500-c37aff9b3a4a xorm.io/xorm diff --git a/vendor/xorm.io/core/.drone.yml b/vendor/xorm.io/core/.drone.yml index 4cb2fb4ae6..3c118d4c06 100644 --- a/vendor/xorm.io/core/.drone.yml +++ b/vendor/xorm.io/core/.drone.yml @@ -1,128 +1,8 @@ ---- -kind: pipeline -name: go1.10 - -platform: - os: linux - arch: amd64 - -clone: - disable: true - -workspace: - base: /go - path: src/xorm.io/core - -steps: -- name: git - pull: default - image: plugins/git:next - settings: - depth: 50 - tags: true - -- name: test - pull: default - image: golang:1.10 - commands: - - go get github.com/stretchr/testify/assert - - go get github.com/go-xorm/sqlfiddle - - go get github.com/go-sql-driver/mysql - - go get github.com/mattn/go-sqlite3 - - go vet - - "go test -v -race -coverprofile=coverage.txt -covermode=atomic -dbConn=\"root:@tcp(mysql:3306)/core_test?charset=utf8mb4\"" - when: - event: - - push - - tag - - pull_request - -services: -- name: mysql - pull: default - image: mysql:5.7 - environment: - MYSQL_ALLOW_EMPTY_PASSWORD: yes - MYSQL_DATABASE: core_test - when: - event: - - push - - tag - - pull_request - ---- -kind: pipeline -name: go1.11 - -platform: - os: linux - arch: amd64 - -clone: - disable: true - -workspace: - base: /go - path: src/xorm.io/core - -steps: -- name: git - pull: default - image: plugins/git:next - settings: - depth: 50 - tags: true - -- name: test - pull: default - image: golang:1.11 - commands: - - go vet - - "go test -v -race -coverprofile=coverage.txt -covermode=atomic -dbConn=\"root:@tcp(mysql:3306)/core_test?charset=utf8mb4\"" - environment: - GO111MODULE: "on" - GOPROXY: https://goproxy.cn - when: - event: - - push - - tag - - pull_request - -services: -- name: mysql - pull: default - image: mysql:5.7 - environment: - MYSQL_ALLOW_EMPTY_PASSWORD: yes - MYSQL_DATABASE: core_test - when: - event: - - push - - tag - - pull_request - --- kind: pipeline name: go1.12 -platform: - os: linux - arch: amd64 - -clone: - disable: true - -workspace: - base: /go - path: src/xorm.io/core - steps: -- name: git - pull: default - image: plugins/git:next - settings: - depth: 50 - tags: true - name: test pull: default diff --git a/vendor/xorm.io/core/README.md b/vendor/xorm.io/core/README.md index c2cedcae8c..54436b6893 100644 --- a/vendor/xorm.io/core/README.md +++ b/vendor/xorm.io/core/README.md @@ -1,7 +1,7 @@ Core is a lightweight wrapper of sql.DB. [![Build Status](https://drone.gitea.com/api/badges/xorm/core/status.svg)](https://drone.gitea.com/xorm/core) -[![](http://gocover.io/_badge/xorm.io/core)](http://gocover.io/xorm.io/core) +[![Test Coverage](https://gocover.io/_badge/xorm.io/core)](https://gocover.io/xorm.io/core) [![Go Report Card](https://goreportcard.com/badge/code.gitea.io/gitea)](https://goreportcard.com/report/xorm.io/core) # Open diff --git a/vendor/xorm.io/core/column.go b/vendor/xorm.io/core/column.go index b5906a9874..8f375db594 100644 --- a/vendor/xorm.io/core/column.go +++ b/vendor/xorm.io/core/column.go @@ -37,7 +37,7 @@ type Column struct { IsDeleted bool IsCascade bool IsVersion bool - DefaultIsEmpty bool + DefaultIsEmpty bool // false means column has no default set, but not default value is empty EnumOptions map[string]int SetOptions map[string]int DisableTimeZone bool @@ -65,7 +65,7 @@ func NewColumn(name, fieldName string, sqlType SQLType, len1, len2 int, nullable IsDeleted: false, IsCascade: false, IsVersion: false, - DefaultIsEmpty: false, + DefaultIsEmpty: true, // default should be no default EnumOptions: make(map[string]int), Comment: "", } diff --git a/vendor/xorm.io/core/index.go b/vendor/xorm.io/core/index.go index 2915428f26..129b543921 100644 --- a/vendor/xorm.io/core/index.go +++ b/vendor/xorm.io/core/index.go @@ -26,8 +26,8 @@ type Index struct { func (index *Index) XName(tableName string) string { if !strings.HasPrefix(index.Name, "UQE_") && !strings.HasPrefix(index.Name, "IDX_") { - tableName = strings.Replace(tableName, `"`, "", -1) - tableName = strings.Replace(tableName, `.`, "_", -1) + tableParts := strings.Split(strings.Replace(tableName, `"`, "", -1), ".") + tableName = tableParts[len(tableParts)-1] if index.Type == UniqueType { return fmt.Sprintf("UQE_%v_%v", tableName, index.Name) } diff --git a/vendor/xorm.io/xorm/.drone.yml b/vendor/xorm.io/xorm/.drone.yml index b2198e380a..e9dae78896 100644 --- a/vendor/xorm.io/xorm/.drone.yml +++ b/vendor/xorm.io/xorm/.drone.yml @@ -1,204 +1,14 @@ --- kind: pipeline -name: go1.10-test -workspace: - base: /go - path: src/gitea.com/xorm/xorm - +name: testing steps: -- name: build +- name: test-vet pull: default - image: golang:1.10 - commands: - - go get -t -d -v - - go build -v - when: - event: - - push - - pull_request - -- name: test-sqlite - pull: default - image: golang:1.10 - depends_on: - - build - commands: - - "go test -v -race -db=\"sqlite3\" -conn_str=\"./test.db\" -coverprofile=coverage1-1.txt -covermode=atomic" - - "go test -v -race -db=\"sqlite3\" -conn_str=\"./test.db\" -cache=true -coverprofile=coverage1-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-mysql - pull: default - image: golang:1.10 - depends_on: - - build - commands: - - "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(mysql)/xorm_test\" -coverprofile=coverage2-1.txt -covermode=atomic" - - "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(mysql)/xorm_test\" -cache=true -coverprofile=coverage2-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-mysql-utf8mb4 - pull: default - image: golang:1.10 - depends_on: - - test-mysql - commands: - - "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(mysql)/xorm_test?charset=utf8mb4\" -coverprofile=coverage2.1-1.txt -covermode=atomic" - - "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(mysql)/xorm_test?charset=utf8mb4\" -cache=true -coverprofile=coverage2.1-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-mymysql - pull: default - image: golang:1.10 - depends_on: - - test-mysql-utf8mb4 - commands: - - "go test -v -race -db=\"mymysql\" -conn_str=\"tcp:mysql:3306*xorm_test/root/\" -coverprofile=coverage3-1.txt -covermode=atomic" - - "go test -v -race -db=\"mymysql\" -conn_str=\"tcp:mysql:3306*xorm_test/root/\" -cache=true -coverprofile=coverage3-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-postgres - pull: default - image: golang:1.10 - depends_on: - - build - commands: - - "go test -v -race -db=\"postgres\" -conn_str=\"postgres://postgres:@pgsql/xorm_test?sslmode=disable\" -coverprofile=coverage4-1.txt -covermode=atomic" - - "go test -v -race -db=\"postgres\" -conn_str=\"postgres://postgres:@pgsql/xorm_test?sslmode=disable\" -cache=true -coverprofile=coverage4-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-postgres-schema - pull: default - image: golang:1.10 - depends_on: - - build - commands: - - "go test -v -race -db=\"postgres\" -conn_str=\"postgres://postgres:@pgsql/xorm_test?sslmode=disable\" -schema=xorm -coverprofile=coverage5-1.txt -covermode=atomic" - - "go test -v -race -db=\"postgres\" -conn_str=\"postgres://postgres:@pgsql/xorm_test?sslmode=disable\" -schema=xorm -cache=true -coverprofile=coverage5-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-mssql - pull: default - image: golang:1.10 - depends_on: - - build - commands: - - "go test -v -race -db=\"mssql\" -conn_str=\"server=mssql;user id=sa;password=yourStrong(!)Password;database=xorm_test\" -coverprofile=coverage6-1.txt -covermode=atomic" - - "go test -v -race -db=\"mssql\" -conn_str=\"server=mssql;user id=sa;password=yourStrong(!)Password;database=xorm_test\" -cache=true -coverprofile=coverage6-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-tidb - pull: default - image: golang:1.10 - depends_on: - - build - commands: - - "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(tidb:4000)/xorm_test\" -ignore_select_update=true -coverprofile=coverage7-1.txt -covermode=atomic" - - "go test -v -race -db=\"mysql\" -conn_str=\"root:@tcp(tidb:4000)/xorm_test\" -ignore_select_update=true -cache=true -coverprofile=coverage7-2.txt -covermode=atomic" - when: - event: - - push - - pull_request - -- name: test-end - pull: default - image: golang:1.10 - depends_on: - - test-sqlite - - test-mysql - - test-mysql-utf8mb4 - - test-mymysql - - test-postgres - - test-postgres-schema - - test-mssql - - test-tidb - commands: - - echo "go1.10 build end" - when: - event: - - push - - pull_request - -services: -- name: mysql - pull: default - image: mysql:5.7 - environment: - MYSQL_ALLOW_EMPTY_PASSWORD: yes - MYSQL_DATABASE: xorm_test - when: - event: - - push - - tag - - pull_request - -- name: pgsql - pull: default - image: postgres:9.5 - environment: - POSTGRES_DB: xorm_test - POSTGRES_USER: postgres - when: - event: - - push - - tag - - pull_request - -- name: mssql - pull: default - image: microsoft/mssql-server-linux:latest - environment: - ACCEPT_EULA: Y - SA_PASSWORD: yourStrong(!)Password - MSSQL_PID: Developer - when: - event: - - push - - tag - - pull_request - -- name: tidb - pull: default - image: pingcap/tidb:v3.0.3 - when: - event: - - push - - tag - - pull_request - ---- -kind: pipeline -name: go1.13-test -steps: -- name: build - pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" commands: - - go build -v - go vet when: event: @@ -207,7 +17,7 @@ steps: - name: test-sqlite pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" @@ -221,7 +31,7 @@ steps: - name: test-mysql pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" @@ -235,7 +45,7 @@ steps: - name: test-mysql-utf8mb4 pull: default - image: golang:1.13 + image: golang:1.12 depends_on: - test-mysql environment: @@ -251,7 +61,7 @@ steps: - name: test-mymysql pull: default - image: golang:1.13 + image: golang:1.12 depends_on: - test-mysql-utf8mb4 environment: @@ -267,7 +77,7 @@ steps: - name: test-postgres pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" @@ -281,7 +91,7 @@ steps: - name: test-postgres-schema pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" @@ -295,7 +105,7 @@ steps: - name: test-mssql pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" @@ -309,7 +119,7 @@ steps: - name: test-tidb pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" @@ -323,12 +133,12 @@ steps: - name: merge_coverage pull: default - image: golang:1.13 + image: golang:1.12 environment: GO111MODULE: "on" GOPROXY: "https://goproxy.cn" depends_on: - - build + - test-vet - test-sqlite - test-mysql - test-mysql-utf8mb4 diff --git a/vendor/xorm.io/xorm/dialect_postgres.go b/vendor/xorm.io/xorm/dialect_postgres.go index ccef3086b2..ac6d4fe896 100644 --- a/vendor/xorm.io/xorm/dialect_postgres.go +++ b/vendor/xorm.io/xorm/dialect_postgres.go @@ -901,7 +901,7 @@ func (db *postgres) TableCheckSql(tableName string) (string, []interface{}) { } func (db *postgres) ModifyColumnSql(tableName string, col *core.Column) string { - if len(db.Schema) == 0 { + if len(db.Schema) == 0 || strings.Contains(tableName, ".") { return fmt.Sprintf("alter table %s ALTER COLUMN %s TYPE %s", tableName, col.Name, db.SqlType(col)) } @@ -913,8 +913,8 @@ func (db *postgres) DropIndexSql(tableName string, index *core.Index) string { quote := db.Quote idxName := index.Name - tableName = strings.Replace(tableName, `"`, "", -1) - tableName = strings.Replace(tableName, `.`, "_", -1) + tableParts := strings.Split(strings.Replace(tableName, `"`, "", -1), ".") + tableName = tableParts[len(tableParts)-1] if !strings.HasPrefix(idxName, "UQE_") && !strings.HasPrefix(idxName, "IDX_") { diff --git a/vendor/xorm.io/xorm/session_insert.go b/vendor/xorm.io/xorm/session_insert.go index 1e19ce7a4e..5f8f7e1ee8 100644 --- a/vendor/xorm.io/xorm/session_insert.go +++ b/vendor/xorm.io/xorm/session_insert.go @@ -729,66 +729,7 @@ func (session *Session) insertMapInterface(m map[string]interface{}) (int64, err args = append(args, m[colName]) } - w := builder.NewWriter() - if session.statement.cond.IsValid() { - if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (", session.engine.Quote(tableName))); err != nil { - return 0, err - } - - if err := writeStrings(w, append(columns, exprs.colNames...), "`", "`"); err != nil { - return 0, err - } - - if _, err := w.WriteString(") SELECT "); err != nil { - return 0, err - } - - if err := session.statement.writeArgs(w, args); err != nil { - return 0, err - } - - if len(exprs.args) > 0 { - if _, err := w.WriteString(","); err != nil { - return 0, err - } - if err := exprs.writeArgs(w); err != nil { - return 0, err - } - } - - if _, err := w.WriteString(fmt.Sprintf(" FROM %s WHERE ", session.engine.Quote(tableName))); err != nil { - return 0, err - } - - if err := session.statement.cond.WriteTo(w); err != nil { - return 0, err - } - } else { - qm := strings.Repeat("?,", len(columns)) - qm = qm[:len(qm)-1] - - if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (`%s`) VALUES (%s)", session.engine.Quote(tableName), strings.Join(columns, "`,`"), qm)); err != nil { - return 0, err - } - w.Append(args...) - } - - sql := w.String() - args = w.Args() - - if err := session.cacheInsert(tableName); err != nil { - return 0, err - } - - res, err := session.exec(sql, args...) - if err != nil { - return 0, err - } - affected, err := res.RowsAffected() - if err != nil { - return 0, err - } - return affected, nil + return session.insertMap(columns, args) } func (session *Session) insertMapString(m map[string]string) (int64, error) { @@ -808,6 +749,7 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) { columns = append(columns, k) } } + sort.Strings(columns) var args = make([]interface{}, 0, len(m)) @@ -815,7 +757,18 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) { args = append(args, m[colName]) } + return session.insertMap(columns, args) +} + +func (session *Session) insertMap(columns []string, args []interface{}) (int64, error) { + tableName := session.statement.TableName() + if len(tableName) <= 0 { + return 0, ErrTableNotFound + } + + exprs := session.statement.exprColumns w := builder.NewWriter() + // if insert where if session.statement.cond.IsValid() { if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (", session.engine.Quote(tableName))); err != nil { return 0, err @@ -853,10 +806,29 @@ func (session *Session) insertMapString(m map[string]string) (int64, error) { qm := strings.Repeat("?,", len(columns)) qm = qm[:len(qm)-1] - if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (`%s`) VALUES (%s)", session.engine.Quote(tableName), strings.Join(columns, "`,`"), qm)); err != nil { + if _, err := w.WriteString(fmt.Sprintf("INSERT INTO %s (", session.engine.Quote(tableName))); err != nil { return 0, err } + + if err := writeStrings(w, append(columns, exprs.colNames...), "`", "`"); err != nil { + return 0, err + } + if _, err := w.WriteString(fmt.Sprintf(") VALUES (%s", qm)); err != nil { + return 0, err + } + w.Append(args...) + if len(exprs.args) > 0 { + if _, err := w.WriteString(","); err != nil { + return 0, err + } + if err := exprs.writeArgs(w); err != nil { + return 0, err + } + } + if _, err := w.WriteString(")"); err != nil { + return 0, err + } } sql := w.String() diff --git a/vendor/xorm.io/xorm/session_update.go b/vendor/xorm.io/xorm/session_update.go index 231163e063..47ced66d19 100644 --- a/vendor/xorm.io/xorm/session_update.go +++ b/vendor/xorm.io/xorm/session_update.go @@ -239,14 +239,20 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 for i, colName := range exprColumns.colNames { switch tp := exprColumns.args[i].(type) { case string: - colNames = append(colNames, session.engine.Quote(colName)+" = "+tp) + if len(tp) == 0 { + tp = "''" + } + colNames = append(colNames, session.engine.Quote(colName)+"="+tp) case *builder.Builder: subQuery, subArgs, err := builder.ToSQL(tp) if err != nil { return 0, err } - colNames = append(colNames, session.engine.Quote(colName)+" = ("+subQuery+")") + colNames = append(colNames, session.engine.Quote(colName)+"=("+subQuery+")") args = append(args, subArgs...) + default: + colNames = append(colNames, session.engine.Quote(colName)+"=?") + args = append(args, exprColumns.args[i]) } } diff --git a/vendor/xorm.io/xorm/statement_exprparam.go b/vendor/xorm.io/xorm/statement_exprparam.go index 4da4f1ea12..fc62e36f1f 100644 --- a/vendor/xorm.io/xorm/statement_exprparam.go +++ b/vendor/xorm.io/xorm/statement_exprparam.go @@ -69,10 +69,18 @@ func (exprs *exprParams) writeArgs(w *builder.BytesWriter) error { if _, err := w.WriteString(")"); err != nil { return err } - default: + case string: + if arg == "" { + arg = "''" + } if _, err := w.WriteString(fmt.Sprintf("%v", arg)); err != nil { return err } + default: + if _, err := w.WriteString("?"); err != nil { + return err + } + w.Append(arg) } if i != len(exprs.args)-1 { if _, err := w.WriteString(","); err != nil {