[Piglit] [PATCH v2] khr_texture_compression_astc: Add array tests

Nanley Chery nanleychery at gmail.com
Wed Sep 16 13:43:54 PDT 2015


From: Nanley Chery <nanley.g.chery at intel.com>

These tests check that 2D texture arrays work for the 5x5 and
12x12 block sizes.

v2. add to all.py (Ilia).
    create test for gles2.

Signed-off-by: Nanley Chery <nanley.g.chery at intel.com>
---
 tests/all.py                                       |   2 +
 .../khr_texture_compression_astc/CMakeLists.gl.txt |   1 +
 .../CMakeLists.gles2.txt                           |   1 +
 .../compressed/hdr/array/waffles-12x12.ktx         | Bin 0 -> 5888 bytes
 .../compressed/hdr/array/waffles-5x5.ktx           | Bin 0 -> 30400 bytes
 .../compressed/ldrl/array/waffles-12x12.ktx        | Bin 0 -> 11680 bytes
 .../compressed/ldrl/array/waffles-5x5.ktx          | Bin 0 -> 30400 bytes
 .../compressed/ldrs/array/waffles-12x12.ktx        | Bin 0 -> 11680 bytes
 .../compressed/ldrs/array/waffles-5x5.ktx          | Bin 0 -> 30400 bytes
 .../khr_compressed_astc-basic.c                    | 251 ++++++++++--------
 .../khr_compressed_astc-miptree-array.c            | 294 +++++++++++++++++++++
 11 files changed, 433 insertions(+), 116 deletions(-)
 create mode 100644 tests/spec/khr_texture_compression_astc/compressed/hdr/array/waffles-12x12.ktx
 create mode 100644 tests/spec/khr_texture_compression_astc/compressed/hdr/array/waffles-5x5.ktx
 create mode 100644 tests/spec/khr_texture_compression_astc/compressed/ldrl/array/waffles-12x12.ktx
 create mode 100644 tests/spec/khr_texture_compression_astc/compressed/ldrl/array/waffles-5x5.ktx
 create mode 100644 tests/spec/khr_texture_compression_astc/compressed/ldrs/array/waffles-12x12.ktx
 create mode 100644 tests/spec/khr_texture_compression_astc/compressed/ldrs/array/waffles-5x5.ktx
 create mode 100644 tests/spec/khr_texture_compression_astc/khr_compressed_astc-miptree-array.c

diff --git a/tests/all.py b/tests/all.py
index 7972c84..15881a3 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -4157,6 +4157,8 @@ with profile.group_manager(
          PiglitGLTest,
          grouptools.join('spec', 'khr_texture_compression_astc')) as g:
     g(['arb_texture_compression-invalid-formats', 'astc'], 'invalid formats')
+    g(['khr_compressed_astc-array_gl'], 'array-gl')
+    g(['khr_compressed_astc-array_gles2'], 'array-gles')
     g(['khr_compressed_astc-basic_gl'], 'basic-gl')
     g(['khr_compressed_astc-basic_gles2'], 'basic-gles')
     g(['khr_compressed_astc-miptree_gl'], 'miptree-gl')
diff --git a/tests/spec/khr_texture_compression_astc/CMakeLists.gl.txt b/tests/spec/khr_texture_compression_astc/CMakeLists.gl.txt
index 903d531..a70a3ed 100644
--- a/tests/spec/khr_texture_compression_astc/CMakeLists.gl.txt
+++ b/tests/spec/khr_texture_compression_astc/CMakeLists.gl.txt
@@ -3,6 +3,7 @@ link_libraries (
 )
 
 piglit_add_executable(khr_compressed_astc-miptree_${piglit_target_api} khr_compressed_astc-miptree.c)
+piglit_add_executable(khr_compressed_astc-array_${piglit_target_api} khr_compressed_astc-miptree-array.c)
 piglit_add_executable(khr_compressed_astc-basic_${piglit_target_api} khr_compressed_astc-basic.c)
 
 # vim: ft=cmake:
diff --git a/tests/spec/khr_texture_compression_astc/CMakeLists.gles2.txt b/tests/spec/khr_texture_compression_astc/CMakeLists.gles2.txt
index 89d8279..2f1e1f8 100644
--- a/tests/spec/khr_texture_compression_astc/CMakeLists.gles2.txt
+++ b/tests/spec/khr_texture_compression_astc/CMakeLists.gles2.txt
@@ -1,5 +1,6 @@
 link_libraries(piglitutil_${piglit_target_api})
 piglit_add_executable(khr_compressed_astc-miptree_${piglit_target_api} khr_compressed_astc-miptree.c)
+piglit_add_executable(khr_compressed_astc-array_${piglit_target_api} khr_compressed_astc-miptree-array.c)
 piglit_add_executable(khr_compressed_astc-basic_${piglit_target_api} khr_compressed_astc-basic.c)
 
 # vim: ft=cmake:
diff --git a/tests/spec/khr_texture_compression_astc/compressed/hdr/array/waffles-12x12.ktx b/tests/spec/khr_texture_compression_astc/compressed/hdr/array/waffles-12x12.ktx
new file mode 100644
index 0000000000000000000000000000000000000000..88303a51ff442db1dac95f6a75695283ddb417bc
GIT binary patch
literal 5888
zcmeHLdsGuw8ovR7A%M6RTWx7Uj4kLYD72!j4O^mCtWStMERrD!5!i at 4BF``hT0s;+
zl!{skYef_e#%-;y76;Ud#UivWz7QusAc6t`#k@%F-U;p5J^Z(4|Jpr#$;_GG+;6`5
zUU%;I-I_HaVeX3-{ourWlgY5Mo&pdt=o6y4LjYj20H{FMar6yDR_LI|F&ZGMcLpF@
z#r$A;`O4iZD}W&aLKv-bsVn)K!{G>G_HY0&1gdua?M<(y at Z_cHix*x>c^u(;4-z&r
zopfV}84<!8hGu^1<i at 5fI9heyCCYA7u}87{iGtz|Ou%m#wz7V7#Vt!WJcKx0goj?M
zJCH~aL~_*9F&|kFE)TAa(2hcA8lflx$&>dz^iwaUg%Rk8Qv%JYeYCbR;8<TV)w6SZ
z{-$Erh?B9a&qylGB^dtfx}7Z3S!YccNW>qa1og5hiNtn-P}GJJ3aq=yBf}a#h8<cY
z&vY?PIXy32oCl(Rg%n~(@~7HIDtPYE{lXG%2W`*5%bpKNUn1(hv2DzR at aW6oOJp$3
z+X87kEEz~6eWA96z6ED?+6MH$TKu*3_sI&Ow{eYtPh6A(?sBuqG7MeR8>U=LA|RQZ
zl8|mbztOLUb9bv<`HkDBd^mf7O?^oBCwI$JGstt-^K7R8e-PBUUo+=)ezk>;<zI<Y
z#+)gRuC8wCJ6Uk=Qgb`jz5SN8E!MGd3)B;q_Xl~@Ji2;ry~jboKN+jT at Ro*E9c#-+
z=E5CzZfQ&bzfIZt1c;z<TpyOGZ}5Q%;1)!6XVdl#T!MZ&*x&!+K^7G7Up!SR5kCQ6
z&>lkmz2kj)!MxKIm10SoWUebuZLmJ()qX+jFpOmU#1RI5+(6D=>0s^bOv?=E2G>7F
z(Ip@{q~wN>ZmZizby;a!H=grt>b^|42%jmf&q*?g%<nc^`}@eS?uGf&`7m11HEuG7
zzh832kMP{Ym5!z&dC{t`X1ErDHurl+U**5r+!n3cT{>$&6Xo^0C2O$(6^2W`?(0iZ
ztqdLwg(eDy;OVOj%U9IYt*xnyN|#6l{LaCgr$AUom|xHtfN=jUB at jZ2P5p?J#PCL+
zKkxPuOY>Hl${&6xj#iyGcnkycDpAOw8>~b6b~3iis{rT2XseL^cGK!*vIT#&sY#~s
zFz22I$d0QC3Ykl=lTz at aA&^9mSZItTg3sl<-VQd?&Ou4u)S3M}of{b$8HIk4F|rWe
zpK|>_tPLfF$=;DBak5{}DZHSlD7X1Wh5r(i^~fLZJf)K8$#8$Yi5rRZ at 0#`tD-`aN
zn5B12MwaNl>g+#kMMG+8h#G<>48K0j-Nw^KYPhE$wL2V!RhrxxhXZ2RDY?C2+sje~
z{2}GzR)9Y%r)MLCfhq$daIf<68zJf{d-Kawl>aHXj@(2MmSGfs6z`*6m94AmG`XfQ
zZw$Zvi?fo+*2vv-d&_lIGx6*$z$1-E>V%m`w_Ys~1T%VXZhwB$Vy_XxX7$M#X+^B!
zQjfhOrPz%^j*$D(=91Aezag|UV)%UB8oA@)%JAyiIKT`D!Dr?AFBnKZ4|$4<iaH63
zXKu!al3Ekd+%HyqUyI?pmVah51u&~iH|q>k4@>m3^86hTiK0bPNM!-P=V_}F at Vl>T
z6WB!Rn1DZ^dD08`5E`{Z6dR4JHTU{$#TM&Ys3;82)y+S=;Nj;#m4w-cCRMufZr^ua
z&w`}lbq!451iA8%eE=YK!U%spRP_624}y=ze@%E+7YG%Zv>n7KWr|<U5xOOsW#0x_
z<U^<t at X2ogV{o;_A7hDtCF)#mHRY3K<N075M*cJuE?C_bWoj!Qy{E88_{o~LVx?`N
z5-wN3l%em9rtbpjXOZVWW=79Hzte^6MI^oQ)e{VNxFy={S#_nt=0Q$bTos1fO#`-b
zcf^$B2c0R?*@WQnm0Ny0Z`wmv)QAZR#q;)<voa29N%+DI4twiynG*bwtpuAr(Y`<d
zvTs||y0rE$)cae at 7KiY%l>h|jKoV#I8<qk+j<8;zv3a8~Eh~-9#^`(iz#~7;W4e`B
z(FtUK0bsa?nb8N+jh(HV*|{fRer^|o-Mdq5ns;{{hOZe@=lIy^_CYN~f22PEyH_8p
zE_)bW7GZxH>3b_d9$Rjxge8xdMe{Jc${}FJ0x(tSzED{m**3fPluKzL>sv>k4&j)$
zqEf(@7s`Qj&bWU`Vxm10v4C&Nk<0CEJC&DTsHt)^KTHSYyBHDxbQYH*Tr8JM6aNkG
zm&=LNsg4 at UIM#{Q8yf~OxBAG#n4O}sX3-q>I_u at _+rDjXyz6)_->;`SwlI~@huM6`
zv$J<c^Vy-P#hsB2qoD4tn?Zr>o&V_@;zd)<83_=*64_ at 9<nx{0XL>2E-vt32;Wx3_
z?tAR%m!a^mQ)vJG>-&<0;(`3VA&JZ!526I$*^m5R#0n=;={u9_`{epQxxP=X at 008M
z<oZrbuJ8YM>pKs1{n4tiYuqobHgmb$5^nlYEk_tTEH=PR5E?9HP at pQ~V1$?Oas20r
z_eDoKsB5YdzlP;Qu at 1&SXgh*>;74cPI&J)c{HTZNRax;m>bdn7a+TK3?g6%*r46%O
z)K*S|4W%1bEN3StqB_Hs_x^$2KHtB;#u~U#8`-`ygtzodqj&SGj5~D2K at zA&RrWte
zJytmhv$9FEi}3A6Jv%uylY|6ay0{1(ObjaL;0|<+ij-umdn7N|K+q+QDfRJ!(V)()
zC*L_s!_nWG=2cgx<A(yLZY79JVrzVS`j%LZQ2e~_66vcmz_C%Sew4OXWgvYiicOGg
z)Pv&Tje74D?8Ob?KhhepMD42HL92KOsf3S_RMhi5$Xyku7-1 at s&Z>t$!1$<!(hyJ^
z1&7s{2g_I at Qo&$^MbjD}(hsY^xeZ%rNi;n;GCQU~V*H};_@~|R3#WIbn1%%fN6ZD(
zYt(V-_<P5z&RkOs-sB$6qiS0_OatbD0i<tA;uUg{MOrx$NY~s+NkK`!6Sn&Go6VB+
z{F=1<s&kUy%>q8m+a*sYP#xz3>ghd+@?VMi^tG1fp;;HlyB|C)hO4DaR9mQ at D3&E^
zd2&^S{B0o$^@Pou8=9Hv;}~Y69z_KV78)_2otDXbnar2}Bwu7`(~u>a-FmARBv7b<
zGNDe*MfjJN^!eYVQd&Js&P*lzdZq at ht3z8N5ot?2ol9ryJKxOlB8Uu5L*;Ffr04vM
z^+q<m??>#EsxwA7LdLc}gK;AgWi%V;zTN9d>mVi}2|8<s5Qe3@<os=BXhP`X5Zc$f
zw##u=q+};?(=#QRM9-&mTzNJ=r%>bQ%KQGEq4w$R7o6?Si{n3A=E^H?lz!ucWHq9L
zt at vNpUxq#g>G<CGvs;Pe)ZqD97o~J>clOH&N4Uat2a2mlVKv&jXmp;ta0W6sDiNJr
zJ at t<o?jAr_b5PWX&j0p#cccT_Z at W6U#y1L%!k-LZ at x&7`%@e|7xXHLRwcCix1iQc1
mX(Fb1IKrA`nK|nMv+0aLG!fH0fAs3M%Le?HECC-)#Qy}bq}kj6

literal 0
HcmV?d00001

diff --git a/tests/spec/khr_texture_compression_astc/compressed/hdr/array/waffles-5x5.ktx b/tests/spec/khr_texture_compression_astc/compressed/hdr/array/waffles-5x5.ktx
new file mode 100644
index 0000000000000000000000000000000000000000..c7b1cba579b5464cad6b9134e633df56cdf15403
GIT binary patch
literal 30400
zcmeIbc|6o at _%HsMG1e?ad9)g`7HQuULy|p}dMcGqi=r?smIy-<lBFSuq=h6&B+51;
z(xMgF27|F?%Zz=P&$&K&`kwE3&g;Cs=XK6Mzu)Vao~PGyKcAU<?)$#B_jTRZbxoSN
z&3^K#Rryj93nU0cArb;F0{$1gvZ4?~Y(9eAga1B_{||T(;a~i at 7(T#X`w at hL`pnX2
z2Olihq?()*9Zlz<c8iFKi;*N17KXog=uv&yghgaix^nx+#(a!}F1P2+_1>qM_HMy!
zlVwjisQSY5(G*Ed&D_y`Cm{+CJ>z9_r4|1u<E8U)A{RZLu=#<h0 at -&7`zuXTl7sHF
zymM<dAyrc~rK4Jez(LI|6KZBt(skX~14UA>9`()VqYbYVzD^(RaJ{R|K~sv(+YsOM
zEv2TdO%oMxo15lkNfQueL4Asyo{R~+zpH1_`tOBXRbQNV>|($}sfv;d=8|{Kxo9~V
zD$wCI`!fApn(cmJe0)t9=dt|Npzu at SANr5J<uo<Lb5UA|KSH}s_SQ at M+WBsrhk7VV
z#yGKJoCER*X9<^ETGw}7mN(x`uXVqnLi}LJLmTxZFR$jyxZP|sq8FL)nx(hDFCoik
zr at KTs*^a{b=u7jj-2EYY_RK(Em7s!y8VpwDbkn!y<&JhVHL<wpYrlueG%clLKKaX5
zyfkZRJybAh7@|QxaPp(0`em<{*8TN?>LFKdidmY)g?|d+pczZ}S4!`=d~e&sKa;1$
zLl4KU7CL~Sa>3eVne1B5``ClLZL#j69R$~#+21O-DAo`VAhnC^s}S+ElQ+&q384Z0
z^Oq<Ux at 7J+;JTe_LMT)3SC{rH$u_e!QnTTq1A3B+<jLZfm13i&eqh{S(PwLwJgrwL
zHboqJGB(LU)8a1Bk>#42$;sh!b#eMS7$KLl3}iEt`xn+2bI}+6in~Y(6oh_n(s%SC
z2i^8bDdLE6sxEc6t+ at okMRWZX{}x$*JUY72&5Jhy^x1E8m6JIBwN_arW)Yl6anNE@
zktGxXL*kxZ9Pr<$fd)xcwW5D#ZXcEl=ecxyzk<knJGHo+(2*E8&!vokDoT>(g}R}z
zsvpmQ{#n$0M4?hk_41Q-7Ca8RrkEEg7M7o%TbY}7SDmX-?j>@DdTY(#nARfsUveB1
z{=rO}Y8S_5UefcJSbEDbuMULCIk-)2{;>+DL~$N^u?wUojfP>7sf at y>oX6yjTB=+`
zVPP&dQn#eGr4^}7A<vO}c+dUdiJ-m5IH-T`UiWUgrlx9gTXa$s5A}amQSHvkac1RE
zokQpHP?p*C6(8Lzviow<`}F4UP<tztSD|&PkCGhrBy9)&np;pHL?_)_Pf^$06-MGU
z8?|lJxu1Dly_mk<{f-LvG5O0Y)6hzFW9^Tzl(V;Zs3Qny7E|C^enfRD>O at QH$j9$0
z*Um>@af`%mF4O0sY&+Q?IRy2)qv>-)Py_UMKw-Q;n5tx-oE;rQ=XA~QQ2(++dc2S^
zQ0|d>iih?*b=ug&%Jr!~^OR^ln~SD~%-=4n!nD(4(>6W7!bQ{k=bMt`ktZii*9}+c
z!};U#xh>?8!HSPgCicKT!H2G>T%O3`v!7YgResaABxX{lF>h0tD#*9uh6`0jWt7De
zJ@&UP5`o at f%TI}{r^xJIK6*047UpX>6DO9jT3oGM?PeRDgASf+8)DdO)lltBimn2B
zM}>q)8kUzUd!C4uuGq{$orl|BVf4b+O2fFm;-C-TQ)5Wi<x7bRhRdB;FkbJmk67B1
zoRM_>&X>Pn{zo42A{j-NYPP<oeYD{D_KDVBtGUeC^7QTB9pQYGnT%5;O{L`IN72#n
zeY7?D?Aq^zFJ(qs?l#JDG^9IldC4DP2>u>UFXEcKm~1V-zK}IA%AZ1Y8d_S<zc(!R
zdGXv~ef)`>h9|K971y)Nb51YMy;CcHf(YlMC`sDAZ&}|-JNr47ku9z7Crg8Bm%KPN
zck*}?mBBUPN4L{^_2LuRjJcbK&46Flb}rr>ASX3euwJ)*m at 9^cztU`cQo1}cO|7~0
z3q0RXJQ|o}a#^M43AM|Jt6>)YYEuZy*#528!4HAnEv?Z7Mrlv|&WL!}pM9tA4(G2Z
z at Vjyc`9*YzJruQ%`@W^2gZT6X+i4`F-6gl4gX-j6_(r-q{#rG;e{JL`puhiObJ>+h
zvRevQFy_f?Zu;w$8lfo%^yd^?0P^_o#p!xtSzqQTZ8Y%?y`|My`I68<8*0x)5o1CZ
zYiX4*^qz$v$#v>=<L{<IL4TPJ&_&8EllM0|PxKV>(6lct%$&ZQ{&xaU$21OVKUg<}
zRe*eL7;b6=dY&8Zeud3V)qeRhu&JhmgAR`mjxnM&H>qv_dc%5$-TF3WR{G=~9!b}$
zt>>b3LULwAWrUda>-Gr44(vrK at 2=s;$`aFO5$!j#cxa!A5%HaW*TpzFYB*yp at Pp2X
zywO)*+ouQCIXWA_ewO+&HANSz{b=*cjy%XkMH53pPMs`{$Q|qReW}QKe-!918a}Sa
zKJwGN-V*d_gulP%MJ2&by9&-TkT<FVi8O&RFt%VD|7BlGt7LtZd at b*#>UuBtsCpvT
zq+w!b5WVui>c)iQn`JA39~MiJR+A=U$8?6|_J#0JH;wC;clE2~$)%bhN6TAUs~T*M
zkM2uaZupv#6iMQsJ9^YYgX=a}r=4CdwZop*Y}m1Jjgsjdm9$3b<3G~Ces;vaV;<_^
z({As)z5IGhYh-~@Pn<n{zw-POvR6Sr*xac)KKA`aTX_J3)yd!lM;**EuMyOo*=ApB
z6Xy;3`Ifr9>k;y-<;{pJ83FnoTRv-}+|kylocf<nU_EA}-euQFbQ2>n?Uwx^+~%Ui
zMal$({LW}s<k}WuOKUihe=S>(IZE0uS&gv)FKltWc8bOJId{4?rULZW^6(&4kFz&g
zk=bGz$5wFB#- at +okONA-dWkYO%f~>zgM;f0A8Y1&Jk8KNC&oovgrqGbjF>xWzhi^E
za2ONjSdmsx3N}Y*jecT*eLjmWd8kxrY`WA%ZOH*H+WE7o2{~LmZNJOMVBB0^h1lWq
zf4#*U=b-Uh#I3jNDb&s#P1Vh+;Gxb(4*9iz at Y*OiPTf<K4)hQsT{T|iXse-pDCr0t
z?B|mJ|HC?Dz1WDaqk~gG at 4x_mnwY=DNId4tV7DCeZbK+zPpD~W+F5H><hLAi|A`>k
z)m=Y7pD6nDu8`{x*wBCb({9#eV$nw$dkao)(iJ+%Ty`~O#Z4>)#)~9L+>Bw`5$r&n
z_(jmyONb?H7zhKaUoIB(RbmRpEYn at x*XmXfJ(PvhPgs<r`1}E~+VpIs3J0xA`$4VG
ztp2s|*=SRA7T~GV at xo1a>E9BIB1S&vbI_6|#dl?!_Z^Y3+#9a;1J?&t>LE@!rYa%m
z8ZsO7g-fbuNTvF~LFY5^<1V<o@(oQFJ@>6hsxes;2J2&8xe|tG?8;KDbHC%nL0LH+
z`-pFMlql41^JoKkJI5fIs#%lW8$M at jik0P|E%S|t56!dQHZ7o~<t*T!y7|~_<e?9r
z%J*nd8wC615-{(A_3j+6pe^?Navqwyf<tj<=g?S1&gD5rIjGxEAILl4i}n?<(Qy7f
z{q=3gVI`m^ReuAMhrYJrP;yu??ySp#GXl^T!>)Z}j3^)eTa9(K4e>nmf}eHK$-<!~
zuQO-U1*#zb`4`B>3p_9Ruy-DJu!8YX_X;Bu9KVD~UjqJmog!l(NoGD+9H!R!l>z#o
zbY!=QX61y59d?VJ1Nw3~&G5`ypXWMBH>+-}=Au6SL8MDM2$Ga#<I4m7@(Bn)XgW-4
z>|H9S68M+)qKIApy>5L<%1}%UoDU%^AjF5tG^KuI57KI3{s%PV{U*Q%j1xCxqG9}u
zhLmmA*`%5>6rCvz^m<6q|G05eS=eK(n?rzq&MhKcIWO`eWKy|5G+Ud84lX8LrPuv+
zBJsA*zN~9NA4Sp?F4j3E%9s0PvYXeevA5Y1Nz%ENq+u$nY6|#t-)O+DZw{ho>o$bt
z74Vv$KBm|g=iJVr{^i=k*ve^s^3-S-!H*Of=UeW!^&rTrueSvH!Op{0F8(Ybxux~X
zv7aAR=oaTcrx*G*sPWJP7Hg$b2>J)4wGYsp>R`Qbw5n70X1UjlyjdG7!bL+PgiMKZ
zDXP at Wms<A$-w!Nf-ajt<F#oW-t-~y54!SVVKiKfY)^T;tsX8 at 22X!2B7{m5xYO5w?
zH$=yCP#H|j8Y$f{$iT{7W=U~ThX2AFq!r9tzTHz^GGIT3$AR8^K>uS&@eIIs!$Zzv
zjCrrMlSfx9xpEo!XSi<!vw0oTKAa;T3G`c9>UG`tYwNwjw(zF9B^*?a<bTEF<2S#9
z@!q$hLH<Y4jUp+kQKd%o>I2vSyq`i{VDjNzm26H_Qw<NkKLA;%W<vI at 4O7f4ap9m-
zditVE4f^VkedPiy5%#ZVkbCse<WBF<0qiEo-_jx)<!B(b`d!D3f*X0j4-fSezs2~h
zbbHhv-B`hCM&1O75d2C`oWGr2l~KVFYd$pc@%ETz>Z#;{wPiqWD(HvRLwYM|kA3zP
zl>$F2O2(aF#W`=wxlyNl0 at l+_Ae`P!-q4hg!Lb{get&7l6xM<DVS5BJ;J-8m5SMbM
z{g=_cO}IUhBza*Oz3SaJu9(VlAMdx)^a^5Kdu016+c!6bt0A!>-7M;X&5eUChr4-W
zApevJ5#2p&23YPR?Bohw^Bbw8jRa(=`T1ojtXvxSgPyJuVJfNyP4$l&>xV#puBBW}
zUX}T>E{Apo1N~_)xn(j*{<*Qk!kn<0GA^2#CZy=Qg`&N?JL|OOO&)q`)|Sh{pTmbd
z>eU<XICIewU7=$e&HM-|W+>Sg^g+6GbA?;o#5_J at 5&!|N|0TCb*f51g`+R(JarrE|
z at W?O)@ImLPgrq1g+V`uW3ptAG2c3aWAYX2ty%UTzIR4IQ_?FK@$9G#_6&2aB^hLo-
zRz2toXSbsx*q+qos!6}`qD-LVC(?%%hm*UVx5in5{RxzeBt7oQKiuKBsG<h=0}%^u
zQyh#KQx}9{I&i-JA+s+nB~SHt-!xkW{tPWWKx~(_l6Mn-?`{e3SGO%I#;R=a?;k3X
z0)C&;VX$i}9Cg>FoxpA%=c0VSpg<vQvcJnUs_*xopdW4p1f26SXkXlQLa%ia^#5X_
zC>M6l#$I6l0^B~3u4Xl14%p{Ob-_-UKZnV<v>)bg?~Kfi<~1Wsf5{fRiD#BCI-P^G
zr~Mc5v4*X)^bQ4esXm1HLjnQ_;^Zk=?3gI`66f(fZ{GVO=kU)bMXS{E(BXw71#nKB
zFXRzi39x>->x5FGnDw<Md%Qo27VyxWn<N)WRjnAMj#Ak*UEmLXd3EvWeUh3EHPth{
ziHBM$kgn;eeOEKhWp!KBaUF!MUY%QSz4}S!W+7>}r98A#tYAo3`G<2|j*~40{9`Xx
zB}+s}Nr8Dv{O?ns|Fz!iuBI!q0;9?td!9l(!T-Lb^(UVphDS_1<1Pp78(cJjRWK}b
z*W@(Cd<6Y4Pkf)edYGD9Qa0dyTtCPJNvKiu-G>(~dlbz at +4Cf=<gF+ at Su!2q at AA+M
z(kx1 at d5ws3{z=8>8DKwP?9Lwr{3=)|aD)AdU;kocR(iSrU1wFyKl;G_a9!bhMn9I5
z4tTH+L*{(Y)V5C!&yExY{$C(b^PV`QI>i7YVO))C^~?vmS*#uIltatrgT17RUs)Yz
zCOZ5#HUQ6oeiBz!+@^0wOthw0g6Xm3wIF16=pmLbgj7JEFOaM)k-t$2 at d9`b-={BN
z9(`N&>tIesLv$QZ41F|sqThUSU<#Y!--quTYUm<-;@Ist-#umZb`A%{^7Yvb->23H
z`bV1jk8{NKTm^qFoLwJhe!)i}juSci5h}4Kw&#-1vvOKD_}7F`fB#D)viIFYwot|e
z7~c*EaCE}uXP}c80QipBLsUKJav|?z&L{UUju=roC`9Adue))!8 at ii)xLsD^39gj}
z8x}sa-R+KoKf}nAlx)eUF?Qsvwc2LQ?b4IJt0H#Y`f)l+cxD>TLo=?wVUCpNfbc!D
z4F!2fJWi?>`_Ov(B0*e(pvgmDNZs2#jE&Iv3}?k6Di7Tx&8%>%&7tyZTpFw4{2k8`
zMi{c1+R4MeAYKB`!{0F7%bVN=@~D)*UH`!kc0tZ1)h^fwoad;k1F<b2Tk}ZoyvADR
zX}rK30ZQ;OAJ#s=FEW9`?~UJ&k8j|693!ZLevwf$mR?Do6zupxk?`lCyu~-~kWd->
z<2jGcRIdYl6TxR13FG0h-GfsV+%8gooa(iOt3{I##OC#K&}VlnmUP(h51tmYCb9PO
zn(OC0QEoYtzcHb^f&7;`d_Ir6+wh8wS%0YBn9eASb^7-kChMl>CJ)^*Y5;yYV{^65
zZh4AO^FF_#Sg`jJizGYO4R5bK?Q$k39p`T$AzxKWfzQInHd%6jM|3g2rK)~(x^HOH
z%?d91{q1bIHwDGw?%czGM***14+!wMNcO6|&(^HdZ8_%KijYH8=qAeWm$@?M+pKAR
z0R1@%@>I`Rx&1%J9d{d|I9&moFL$ijNBy}|*WCTXdJbB=AIZwB%q;X6?Qd$h)zT_h
z5nJpNSWfK;Fz);+($e}&;!|3vYM*V$-e at hR4F}B~@<K~P%0kRaoSy95&O=kAyKF|V
z3B{=(fiso^`ewC><o(9GE*_(mbuDe6kNXOHvC6Hl)i*q9VpoE{H|U?0F?ad7Q=@vd
zIK78ag*ahU#68*RgL79Q;CFwinEn2=bu!tpmYeLs-|H%CK>Ulr{~lbzV1xdigBXkL
z)YNusPcJH50_PVfvTm&l(luWyePGBF_=BP$BAg^;t=4VbeFyZ9r{T(Ak|XC?w>&kp
zW*rwzXk2MdwkB_-R=i*K!vXlA!g at hqw@C8RJ7UqMX53(t at K9CHiz_cUH9xZY4tVk}
zKk+X_vDSe8ZNn`wuwLqE3&|kzu8 at nzeZm-km(HEGxE6?LE}K_qTX)<8 at TVSizw!3(
zXDi!o6ik7=AJEW}Fs6%HXHm2-7exYp6!Q&5zKDDaKJr2HWh$&cS%`2 at k?b3rFu=j%
zcg3MXGVZF#<J-at+dqGr<_|fs6=d<#_w_w5fc+PJ80haQ#H5Z6F80lg;GjT%1o3Ok
zj(4wgski*k^dD(tW1Pr6IQ<ng!5<pI<B=K{p9Kla1k9hk^{Z;e2SYCE{0V8WwkwVh
z at TY*kcxav3^=PFKZ`MJr#vDoTSKGy|$O~08S<@y1#}{top|%#+724AaGDGqgG{*U~
zv|goXJxR|yeWtvqe!&{RbCsepCdf*1;%M^7nRnoCwzpMRga2o at iS`lp2l6cSoZ`+Z
z>U;MbV~tz@{Vm0WF&;mY9*gtgp*nrVfdAJ!P32DYjDWrvSYagHZu^TiUgK?AZG_wF
z*}=lUq<cq;`q%={H!{K at W+ETte$hv2i<;sA4;ZWr7W&!Ie`fS$<1z5R`Wl=hOVV!}
zKmBm+Q*kd3?S85iEJ|*v{UGqfvep6p?r$WjU9GVC`1cFvt_&{P-BnwQ>?PRw-Vtr#
zgFhLCghU%!zE+lbR92Ochx<>|wDqf<TkF@`AHE>~eV{(1MljpCELr2-l_R>aKd?U|
ziWBSjIaA=}fjs9^=|(%gofmTT6Uj%X#}&v`k at InfCmrW%!&pb~MzgGOWmHG~mPmQ9
zKl4}D2}K+2CO8LJ8H at tIiAi4O%oz;!Hu|J;65{I^Js`mC9C`9t<0%dY<ZGJ#NRNHt
zZ~Cu1GEHxYrzGc8RkLu6g};z3zyHAbi6UBcQ`Gj{@8uu5vbkt{@153zj$j`c$2%Lg
zf<E{~7#r9P_+kENp#bc^rb`!P6lSp7b?*$z1 at NlO&;rM4dO5GzXA1Z)Z2lSFjT9&0
z1DV1SRS-We9X*7Y4b*y?mJ9hPLA+xvdQG@~r*lxQ5~~X0Qv)9=cONVr at bS05FsyZ_
zrL|hJAV8(Y?8)ce5k;Sc5T7C_ytjT^Go)A)@$APDps$^Hm5GI>+S|6+MNtrcRoqUE
z6SEpCTsLsi;aN1;*K+UcZ<Q^RFN{!a8Gv^N@~>RKACgd;wf(k at cpu2`z?=%oyI=G5
zUbw~#K|Dzvi~hFcU6!tXPN;_k&}&V2J<}bl&|VRT^C0-6ZS at t1W%0^Q5jve;!QTUa
z1N_xZT5sE*7sS*<Jc3LiCGi;;l@)hh>^&a8>U+glvpGaHrLC!|k&AMEed*PsD)}D#
zO6zWs$JfiZmYB6RqSe6ru~ib#^R?5}ha%Zx7nk~47Qy#10v4LjUgW2C>>N<=2;j}Y
zo9^oCnK~nbJ{`0%oc<(YTj<#KNv#64CBN}N!jW{vp~|94kG!3n+49r$E==<ne%ACO
zpR;n_f1-a({lDoC^S|~dTCVzi|AEJ2WC95kqxYKQs^7gI7;6DO`EUXJsq$3T!SCB%
zL%eLMiPtCNFV;SuZDF}nfS;T-jYy>;Kfc*^JLlvZ;_)|+xs+7k_-!=KNlCabFmXka
zz80N4e8<&&4F}@aCX+EM*b#zLf)cD{3haFs^0UWA8{&`mV()@}++fx9#$$V4&i1Ia
z&XsFH9~;bG5O}`dHN|o^*+>@Fmk?NGeI!*iz3s-KNFg|nP}gh1WJ~&-ZWEW=FyBJ%
zjc=44rM7B}?1G!QxI8v%!L8Tjdn&4y7*7Azd2vh35t1Jw(Yk^Mc*UxfGHS<P=To`D
zk#!IFMeNY^GJa>@sK7q)2gKjbxpj>&s`Q_#54SCu1p7PitGNT>OXrW=k-1Ugi^r#A
zjKx+nCk3{Sh&<RE4~jK0xx2|VBA?)Bxe4g~);HYP$|srHcC#RI7Cz>GF*bSqy0eou
zwqp?VjhV&u<nxNl)^x|+v$Tfu)w at tdEZJP=!Izpc!Q<CO9+4tOefJWEZs^fB1D<N3
zy~%#xm%TWr#Qhui7livkLC4Q4`SyR!z3&G8^>6vtTyCHIH2UQc&g at mc^*#6}c>MH#
zra$3EVBop)#RK*sii7H#V7{9n0rsxN1E;!=XH5Cw{74|kuf_Repz|xv58DMyvz?$1
zIO-ZA$*^A$WaR|Lc8Tb#rCY%L5LJ9GDQJ9Wo@#q!v>3#5<w$-MqDgm_xtW}qA>7v`
ze&fF}w9*{U<?nRZCI$LOMIo*g;-{xZqTXw~fq3w+(M0+#&2ba+J(tETxoFMLq+T1h
z;sQaMn9VW^;5Q#{v3FLd)n6vmrsvDRe2CO_<o!TT>^ASoetobv+l7uC+{GN&W10$f
z5I$ecEJOZQn#Aw-_(wS!V$Vv>ThA$fazLx6T`C=ySI04|0-N<bHzyjuUm6_he#NMm
z(tY0E8H3+1oOA0QW6X6_N^j3;N`ZKk2gT&FJp`{<Io?u?**JYJ+@);Sbx#=i%)Xll
z`*(1?T-I%z^00w!CcYWQ8WvYit*g7bf2sF6Y&+0DAG=Oe^WsrEo>kq%@q at +|>37Ns
za?gsZe=YC8 at 52`ET(lB-^ez7BKou_U8d}#o!p4mEFMYPEW<U6YSw;*;QO%_<+kO<)
zN&~$T0|Ojgl>`}$Dg5&^&TQp>=$)Jl_dON=ruYA9+@*{ELALyP{=XV?o~z*V$5zv6
z+^^WUKEyM;S29o1-aMc`3vGH?1o*5+dLHu`j?bpNA^@K)Ev1n=q=8?Old^Bjg7qc@
z1e|d)NZ9=KOSu&2M_REzVreoR at 54TQg8k(c>mN1Vv`IBzC9h8(<WWNMs!^SeM at qvD
zt72EUPsrfSHQEO9L!B&_`~mlUd6ya}Mvl6T#%Io`8o+(lCMV=L|CY<kgy1AG at Yg?g
z6t(`27YuYZj`5nS=e21Z#TZl6(G8BrfIm7rs_T)xzx|=FB0%q7-L8zi+NrAVl33M$
zfqaY4-YscOUe{2eGhQN(<1eKYL;+cLbe2y~(nWkc-(N(Jf+(Xhn&%-t0pm*&8q9%x
z`9o{Jf<2*XI9*w4x=l0Fp(gqW0rsP5ff(f&9k?P}a`*=gp4VT$EMz5G at iIBvQULg4
zpvPOx7(q?Vdb6GJ`((urm##`%_1#;X9pGMJ1?QI^7-Vmw<b5}R%HjA<$D{qyV`|k>
zJ6?GDUid at 5Klc5<8go$ZX}sujiMt2G at gO>N)!*O8yEw(8dmiAwKcD}@4?NVn13{Sd
z6Xsdkb##^8fIq?kf4DQf6%*C5(y5kXaDRF)y{O(R-6t!&{vE`_ at cT6UerI(3Dq}lX
zKdx`iPV-0c+Or%D%SWQ%zhZnEHsDTZfaehbfo`r!1!?RN+B>js4;6ipxV<{vs`)2w
zsziakUO|oC_ocuz_k(twb`j8DAB#m)FYouae{7iv_hVEEm7=$oZZm97n<%S>aM9#|
zSr<e!D4*^3&)@q6 at YV9oJY`DR)^WzA9-^TZ at T>S73z602Nj=7-lZ*v^A0b?2WUl!-
zmqF!AfxeSN#H*1ng+4x`Vae46IDMs3WhKd5M~YQ!Bq07!93b;hQh_Pp?b6(>0Q^=Q
zC_|GVBa81&E$+^g0lXu*MPvu5w)RMriYb0SIw+}iQ3Tok at n%DvX)lbar(OMyhrW7S
ze_GeM8T_SDB at MBYtm>T5JJ(!E);PXJz+arwnK<LSu4n<AcQE+#7s=jBK%bSg{h`nQ
zF1`Q#euyW%xhzCLH2j{Dp3ciL<7w>a=yuTxxv63%s}Ae^^Zq~d|M!^l%VSy}u(@`E
zuUH at BH-Au~wM=7F%<0ay|KN{U44#+M#u=Qmr+({?`h&Jq{?v5L55Oe$OBerxYytX*
z;r=XTGK|gRP$yx(k04$q&fKDyc&f7;*M~Bs74tt?JywsMV{N(`&o{A<f7l)4daA<Q
zbvqgEt8a*J_15xB at G;liO$YhO*vyY1Uh((Z|JR0cCm!(AX7_4}ie_O7Mms|Qd$d&F
zJ%;#hw#*YDM+y;v`8AA4_7Sh&IvrPCuL*c#DU+{Y__5Cu>~)U_1;!M?9i#VKZ|l!l
zgP7v<4w!R8Qj1ySt0^uU3Gt~GIT<6;dJ4#cTIXBvZ>VdmuL>iEW)B;ZSpq6ojBGV)
zo(H<hAdRbHa~Aa5pq5c^TgG5b?Xv7S^}!(Tx_nu~x4PKooy#4FQq%gADP)qm+^y~A
zmPk=JABgAB+?BkG5;Hg#6#vlU|CIh9 at 4@~71P}7o+8c?P9KnC+gRBGVc_*7b{h9v{
z{W&Yo{X=hC-*W1>Hs`tYZ+h~*>;`&#3OT=y|9)QK%cAm~8Ju5^(_ at Tpcf|aRqc(3E
zpHS$yEWkhFf9C%~|9_9C;~C8ib?$UL!$cX*qnCzo&EP(OaU#Kp3;4-YMMTs_=0jkw
zUzRw;3)6P-VkAucB&>HiPOt$_o;p3GCw@=TI;JhVuc!~`VbvhAjQD#0<O0kN?w^}m
zW%8s6e!pU9B`K3^44#Xv6?sc~E<UE+yUG^sA08Hu%IcXhrIrznYPf)YV)zUDkTm=x
zlAhRjR!-yb6Mn~6wd{9V=;Qni at O$wMlAVT)pZDU#rJZka`^TNFV4;PG$?iHPVRgUd
z*sVp!jBHJn55+VJyv~1aIhOxa^~zrVNy%=xtW6IT0l%J|FzUZvm``moHy76cd-$lB
z5xW<^zj|6lm!CclKb3Hk%^`E?8p at 7;&g=hz{@45iXl`U$?VH5zmT(T9FC~QdX=^h^
zKj_t|1AknZwg&@*W;`A+ZEwi$(Uirs+6zJY?mP#njxrZ5`U%slgjy>nb)Ja?J~lnZ
zf<cZP*c0q(fWN1=K|6syDky?@6>eWVy_6>B`{DUX|HP~AmDBKe6;9vZ at r&qe#<txi
zW~Q89)A%(O%g=>)RAWBye^fvq)v0)r7i4Vy;V9rS1QBV2==rJ9k|_ej+hl|ZM3WC=
zb-uRdW<*NMu@@10m!92|<s$pisc$>jiwi$Eh9)85E(+48UGnt+KMv8_<|XJHE<mhj
zjqT)W{2eZ{?$Um_*u|TbHnmJ}n>(a(7C^q4`<Ir4(}_*Eyf41sz83P&cCFhkJ{P`k
zG|-xOHP1AsN5G!;2T7D@<ep??Ow<Y12<V at s!8fC=@9x|8arZ6>OZ>inshI4xsU50B
zaRf5<fPZDK2aoFv-5!%HApT95j_3QGh&CxnbExj!VEtR(FL~kkL@`e}0>%L#|6<d4
z9Q^(NivFCl(|Ao`lcqY3{{heb_7BFfwtvPx`TB`Rtr8wpW=FY3iUNIGk;ulVR}b5s
zj_g;4cocRuFwoPhcmRB;W#56{alAmGbFrQ01rX1G^@IclUh*<96GaeB8vD0B at mG26
z9HlY^di^)Qgq-ll<ZbiVr_=r!8)es>jL-36q)(42vP%A2u}S+N9SrWvn0~?pzp5*7
z0_r8O7vGls)-M$Y1=KU+jOq7B`hEVX_ at Vzr=+ at gfKllfDxKji&iG8$AxUXkq5C}H9
z`1z!CzJ>cO7YUyrl?s#AFOS-6_cOQ}e_6#;b4}(wX?n!)O|%91rqh`3%f8KCAh>l4
z_dlHv8c7aNxwj8KCYcH6f_|3J5=m}kL-LDTT7 at v+GYuON(f%*Jf9L5ovW9_vp4k#I
zW@*`$xo%iK=#Rb|l<PZW$+j_3yFQq9LcZQl%ShD_d-KOeTjcKsgT1nnjA>I_btAHZ
z%&)>Y4iCNF46$8s`M$a++H-n;eowELt7vYaFIKMnuju<<J^!ER at 9_849e}rzF1fwP
zf&D`M=O6mJ##vQ5PRnb6s2HKQPIQa?SG_;;Kh}M&TZ`N0X7AD~coOOKi`h0k76L?=
ze5AcfdwAJ at fB!w*=KthRJl6dm$Io>iPx~7{@6szk at 9!%Y7?(IGK)g^q?A8tE^8^!r
z*~b)#=s)u{!)!P{;58H9TozVB=KD!fM94ysTvR9s?3WL6f6nc1Vqx#`aaho~SxCgM
zV9SeFc5s at BrGXLzWR*_G+k)7?;<>>A1s~-a;unRtD11IE`Ht7Tq=CMSd8Xy%uY(u0
z3m`rduZC3^-;+B_v|@^HB!K)D(XJVatTt8qpmH0>pK=IElBltIXUB&vx78tjz(0BM
zvbdROazKSa_dW1Wa{b9yw at 8Jhu3Gn~tSXj+R_2;jh#2|YlNs{Y`v&((ZY%B(Jw;Xu
z#S%UtCjmczehlzL$OPRsky*7$z|UczZ^g)~^(?;J8a(=E|Np1@{kOf4q$?<Es;o9S
z7R>Du>QE0qC5`MHq^DoJc55d8cP9ULCjWOP|92+;cP9ULCjWOP|92+;cP9ULCjWOP
z|92+;cP9ULCjWOP|92+;cP9ULCjWOP|92+;cP9ULCjWOP|92+;cP9ULCjWOP|92+;
zcP9ULCjWOP{}=KXX7Yb$@_%Dz at _%RYe`oT4XYzk%@_#*M at _&V9 at _%RYfB(mP-<ka1
z|8M61BJv2r)ySXh)jM-!BVWn(T>IcS<jn7lxG_13RV(_L%6^6(Vhu9s3tF%VD)cn9
zJx1g<H_K!|PBppHB{h1jIMhfl{lK%)f3gyKnzh|+fSQloK!u&eZDgGh?v$Y6Gt{uD
ziam{|TUf_v?4&blq37j6pV!&ty5vQEJMkVDkMB+X9BDhyh}Vp|$kahkqy<EE?J4%q
z&O62O7N#w&et9+V7cRLyq?qO|xDWz8NuJ0(C}_h**>8E+CFofz7ha$cQgW at sKm5Vf
zG3d!)(<C3yO+I{`YkA3b8Ps617ZSrPR1SxZ9h=I4o<#4>%LY$7*L{1NkgK;m_drYQ
zHT?;Wew0~I7>~c8lfXqY{O9X?ZSpe=e7t{k2K3zZP}X3Ua^>4t)dF^oGvr7qULtPD
z?OOI(4eztULAwW?Cm6d6_1BlRu^XabzZ8u(J0g$2&s><IBdCFz#ZqdF&$FsBlaaVX
zH-n%?Rg7f(j);WJJs}dk;s(^9CN8;k^-;0T2+s#<Y at jAmP3q~%h;+ at DeQTpt;(#7c
zUc`@bJvnT*f-8#8q2^$tWbi99Ud6R^KPT0Ac>Zyl^5pI$3&TE>3JW4vY>&%Yr%$2L
z#!<5O<64YcT7v~;F$blx6b{5!icoKJ90Cunv#oJYulDTCDvd3J9zcqG!^^J2{nwM|
zCRt(J_x3J3gg2b1&>+jYX}yLTNXFsLitQGf+R4fNOS_M8H6*_nNO+!D<F;hnZqvMc
zyl2z!1Y=LC_=cAS4KeZ1<7IHzi&1Hy&3Kt~w+eFR|KfyHA2r)**IulD;||muJdC35
zKKf95t6NdM6bpK;Ko7?Er{;|vm|QybLJ$NsPs#?2itm<WpZ2GC%?k9eT3=s(x^kE2
zogQNq=otn*6|bMeuw2?_0pX?&j2Duwo$KPA9v#ia1Vu1bAO&BfMii+w2HU9aYH77@
z^8HzJcIxl10{($q=+Qa5soGf9lsL!GjH0qR4r&BLc~<(Ok at E!@pSBJ7O;)jI0lU5F
zG+Uo>Ue5z+$eyk(gBraJ2jy~2<5W24;qJyUEK2FMYD&@_e19 at GrEIpFeOB{G&c1`!
z*bEL1O+wE)P1WM0fQESJc_}(qgLr|`&KndSFE)nf!-HOo-Knco-wyq*F&`e9%vjZ@
zL~ToNxXA)}dPbvETYJ9nF`FZ{%<`Y}u!b6u+^8*)n|aNoHvtL;3E7YOtDRiF+jG!>
z?-L!OH6#4f9?NOVrKfv}1-4_ at SGLYxeHUL`zWUX#?$Lvqn6E*fzj4r6!`K7S*un&c
zfun>8^bA~X#jTS6ByAs%zo{{*A7cDYc at +8mxh}RrQv><XQ{l72`w?t+;ntkdmsK~R
zXGV8-`w*jYm1)WbwHSQ=j)M+k4B6L(qp1^&rV^YV`X;b7jMp2IA4AV!kRL-0O1t7W
z8 at gus>HKWizuT`Zne?r%83zRH#tqOTV<AaQWIJ-%`e$0IrzO<jEg>;WWDWc*l%cIE
z)YL!?xbeI2Xobl3;9ltAjmk&~zu6j!Exf2xUUU=Y9~8U(ATR#=`hzTQ+fgcBqemc+
zb(n;P5WL0=YLGWD>>4tCo(JWQ9<hZQTD-;rYMKf*V4TiICI@}}>*++H?6{|TW836p
z6jwuK#ofIp9D@@oH<Lf41#lf^J=>w?e8Bwc>h>MmSdGxr#hF7{KW^9iwa9~&-v|7D
z&Up;W%qYSJN0!`ui1)B^m|(2(yq`N-)>H^J{vHMj-YG`xk)4=_-3aJ|!~?vzZ6B+|
z)n4?hsDU0opVf)-B1b97vgr+HqQ2ngcMf{my}qB at E@;5dZ=FjIQ@%SUhn3Se-9x5(
zxDWJAs?y7UYPb}O1^1el|8U>4HttZAI-H-zTw at M#>y6vYFI7vjAVzc7-`^Q(M&lBw
zyb at m?^t3H=>BUB=<GE9;5ob7mRicQz9eHvy!%6=$$d`8bPl^X7pz<+i*5y~A at 3!i`
z%gM6fmOm@%!h0^<N|5}vJycU%wXm(G7v$a10r+9}xy;;wbw$vV9Chq#AH(FtHSZ5!
zZOo~Jo=e+SPKtyq)^#qhXH}ns9xHec(BbvaAZ~z<*T^|Kb;Eu%wFBFKl`W}-8rtTc
zKcNSx+!AU>z^@aaPf>~>g>`cIcK#*4oEis>2nl&lFxAwxFSMw6r3lZ-<Tv(-xqtQb
zIGGo{1o@%(`gxizM1`C#TW&Um{YOI0+*z`BZA1o#)BEq58mJjc2nw=4IbD<9wu%ik
zxSklZO&sJmx$PE-5A&0dl~d58;wx5Ss!4?BpE194I(W at iHSMSg7cK8C>qk7MdkA2Y
zZ+PfSs~+pzMz%YZpW<9WhMJ<VFe`$FrgqAx%gHTJGyb)@su}JOy!G_I at XwzB{`ocN
zg?*oranRImx(hu-*{xmu$Z>o=9S%<f==s?7P4c|jA5MS2+1cg}{6tYGEzNmq^mBn=
zonS8)Wp%XnBaX$#@g5gAzeiyH%&j{dm2}$tw|ujLo^BoL&vr;_YG@~C+R*=_rt9A|
zMSp61K|XE<1)VynG{v!<?B+quBh>5%U2rmB4uoKxqtIi6a4Rs- at w8H*Ah0Gy^F0r0
z_5wuiV<H~BA}3601kV2v4N*{EW~$=9<?@c(Q1kZ0=*uJ4T at AhvcB8%&?4d<J-SfI<
z-r-9N&m4yuSD6sWPx>aF>4iE}$L$)hKfjf}r&vYL&cs#CiGv<TEkcThB1+7iL+q&W
zN<*9<`6uUS(Zw)9yu%u>zcOLs at Aa=~=X>OQ#l#DMK5sEUPs`~Zeo!+D>xG(WkBds@
zi^9IX;JN*q{;>Wxex#$e(JEF>WjRrx-+%W+(AK=&K5{pj#fg;rU4zJ_VR#K9=i8>=
zHO)N6Xg}tt4f97p4+K}Gfr0p`Uo at z3Ee<3QW>423Qm21YU|dPeP_>bINj;iy-VyN4
z(iLO7b1ZM=EUfqG6F9dVi(*(AVfmZF(zfO~o&Sv298;^-%@X|0-F8;Os*j6)Xkr3=
z4HhZ>L*Mqk7Ld2p!pwn=BD`l>`m>+VlWCAP#SqwG4B+>t{sG6A{qE^g*@n~4-~Zfs
z*gyW80KJ^EEAjO!;QS3Wp)4-Ge_;aR_xI3exrqz%I6eJD{Z&k4Rm9aYqtao%D*^tZ
zB7SB`hML_xye9wm__B(L!HU6Y{R%w^Wq%qTeq3JE2>6c>6%=^ptpEDOpFigEpvO~U
z3XKxI7RL`mcdmjyOI`7k>A`0}O=Zc{La?to(j2D8bPuU#ws?<756bK}!rkGnJMwg=
z8o{1>##mSExU5|q(@gJggBo at F;r5Fe&-a`+v-&_AUk>Lb<I5y&|Gl3WS@?d??{4md
z==oBmojeyVD*R868^D*ojCVlaHYi{8Q?_dh^`4xh&*0w~{5ykxXYlU~{++?UGx&D~
z{{nuP!M}iyX7KO-8~7Iyff#V`$AVAN&O>#3ixL#)`)>lD(|c<vQ7I3al>4xA*2C{y
zbvftt(bKnzw&Q(d0F$eUJ+V~Nu+>m4e1IL`1xH=vmGQ7atd5bwHyUhdJuPvkqv>L@
zh1xaYY?G5MtrmJA%gok at T-+N%lf7iebx at XGd7{|->V`f$!8i|MO#aR-IXxAHuXBe-
zVxccJ`l5mM>mFrU6r*M|e}^Q<WKnOw169d;exlAOANtS`!g{Jl*i8_zn}lwR(?0r&
zK}Kd_t^8CXrVqb!b7+{U<hJQ`Zqk>_r()rENTk;qMF?%!iVfa0`0|STUO{?gQo2Fu
z<YH|Dm*NTV$)vg{9wh>M_N#}DEQo>WXtAJ=I14K&`qB8D#z7CX+fOideTJA$c2f-W
z9X)5ReK6>m+GqrS<vJA&F8Z*)`R5 at wgEz{r9Zpw5Ut$07p4}eX^6*yszx%*TlAc~j
zt$MoO!zUi2!G7Wc15TY~=6;Ph^<tFA(fH_{HF%#2K1 at y0h}L4<rzQ9;1)oM8qYkS=
zUw(Dzo at t-SE>znx2Ku793C*{#=O;SJ^)i3f!+QOldW=SGM>8fz!mu(a at S#w#T4m?j
zWrAL(%WIb5K6W5-%4G3_1KAlP-#0)X`CMK0zAw(7g`Fo7CgZ02_Ay`nv{%bC-qSM`
z3hM(Oj(XnD$H%0M!{bBWlMn94l<T06ALh<}1U{$GSMHnKT02*}TzreX=Kig>)s%$e
zNDlQXVfMSgC)Mhqc$h2p>Wt*_ at tB=r9Y#^o)LgFG7G7|}0_KMp!l~0__Sbh`2GCsa
zLBZ!FAe4JTo4yej<9%G>!$R#5q^~w;i}Snbm_ta|aTFOCjGwv~0X}v>O%SQvnozJ2
z at 3S?|Z8q_2v4YM-`XBGjn%E`6MQ^<`TQ{+t?5E*iOfV{LId=XRa<A~ggkewM$hDu)
zhZW1pPuQoGxzxQhympT64FAvYKl1-D|NB8tC+OXNul=NA%LdYj4$JET^cuVWv+Jk3
zhe7K4uE-T`Y`ABWetsy(cDZ-N;p(7XRnUR(+h<SsB9GSGU!ly{4?5K4Cvz0yr0iVh
zw|OU8j-|dTXwg33==E8YHF0_t4^;~9IpmQxwf=Tkwj2K2Akf>=Z-h3;7-vti1)vkL
z=s<sGFN1H}w!9g9*UAmv7cQhtD4z#1{t)|hl#8a<mU68F4f-n5ye}q#4k(Ty2E<<b
zC(h;j|M&I#K~M_xHW8ukouZax8pTEbg#O^8qGEd87lwq#a!+D0L(tE7W6kCZAq2Dg
zvZ>Y*H=&=E*Rq>-P3zX^8A-<vuKK_IJQ>yi@#A!Vrp(`gsVnDoNR6HT_ZWW<^w|vg
kYtCu~CUu0f)%S(szsLA{{=`{DHur7Zu;IV=7XCB-Z{3laYXATM

literal 0
HcmV?d00001

diff --git a/tests/spec/khr_texture_compression_astc/compressed/ldrl/array/waffles-12x12.ktx b/tests/spec/khr_texture_compression_astc/compressed/ldrl/array/waffles-12x12.ktx
new file mode 100644
index 0000000000000000000000000000000000000000..b9ef01f95f64e52bd6738bca78fc6417bdcd2bf7
GIT binary patch
literal 11680
zcmeHNe^3)w9^cJ_04joTZLQWCi)~{=isJJOr%d7$TW_?}rSc<IA~>yr6-w9*MvTlZ
zMd9$o#<M8YqDu=lNVXv8h(|Mv2CD*&-rRNOrnLk8K at X)?XOx;0!rpg--jB}x<J{bI
zZf4&f4BzZ~-}n9XzTfxW=e4X(Giw$t>WZ8)YYM4CAp|s1{sYZ(fFQyjCkP(?e^dSe
zn%qJD9xfBmxVZ#@(Sg`%m%bq+LbcFrXIYGzSH9KDu+Sv`bKzOod+n9h7lCHjt^u(%
z6r<KPj(*dHU<WDCijf$<x|>N2h>XZe0Xs&0gLHj!I7g5<T(3C{_}6~iok$r(>x4W8
zBQ&#{r-9#2(W*YjVYJ>{vw%Fe#!c!8JwFwrIfGO}L1Bd;R7DCS1sElyf7Tz=iX$#+
z5JpoCLn$lE!nNAHAtR{?7{%5NTfLOpZ`}?uve-Kz1 at 16*iDd^QX1#>HM`nL`jhbK`
zvJUoT7 at d!Q@**gI6J!X=bIG;3pCpOB!_9(2mhV(}l!mb+Bo8~c<OUdw-bq=ewMlHT
zM_iX4mjwLFnNNvGxA3K4XDy}heK2N;o)7)_V*b89^K^{9Sy(=s-VtOT<d0^)Yl69K
z+l|)e$0>}Ke$v>}H(Y4GWSUNdc4IUeA2;jnggDbMLqqg{KO%=dd*y)_iGGZ-cQ&pB
zTCe4%?8&IXX!rcsSwxObC at u}^i$)`j7hPWoT0+C^^Mbt3cCD-)NsAKOUYvTvNn+#`
z^CCcg`Xl3)$9(T$6wu7p&>14Tt+Z4)l#J0xw@#B5VDb%1xWaVMzgjcZWGM`Y#akLe
zr at 1gXotN?L)0`&sO>CLSi~xV$RV6Z+en(M>NbeAVe)sK1kJplZYvH6lV`tvAf~{FF
zroSTx>}^^bd-Cg&4R~vAT_5lt(x6%N4!d#tZ)%CD;Qvt#dX(~+2~{vAaom;*m;Xla
zLPxPQ$#0Z<t%p3H$Dt)A^<{_$`-vI5!5-n^Ysed^5Pvn(SFb7~2v?b(DUv{*W<sac
z$h=HMFJ-{U!%b<7e?u)=fu98PUkcI9XX=`oO4_qt5uyJDQ&j)in?&fzy-RjI`vFE*
zdSa3YqHV{v5|POW0Bu4w(|D5d$l}2GG1Kd{WqLl!IxtB``$^)p^joZ*rN`L}jCPKZ
z1f4B^V_CZodw&`mJ0#mfZWAzmx2*pp$$CNmKZR$fkf6T-o77%2MrT99o*>BuyEyVP
zC;{=vF>XPaQ_zeq=a4`Tk(ejW)pm3gwvN>3K_6mkkC!5&w2gb+dmBKXoL7C*zBd;b
z#@ny)VGys6RDHq?r at oMsd}EzFfA!PJ<ZLSP49+8_$^5UlmZjt+o#MOJC3j>4zgv9n
z8wF0XwfSXXL}<b2P8xbopHtzrR``mK`G9`+&xaBzwa;owXs4EA^pivqpQlH8TxI%3
z9^!2r=%9Z7h at kw{9C9)eYw>gx96Rrp*JtK3ccA#xfQQj(VE!+xxo2yu1%2|I2r`7j
zs48Nsi|{!K6iukRd5q3*o89qLL+2$EImHS6J(@xnN$@Urn|Xs&2>y;=qxCu=vGtoP
zq6CO<?lIFIe{p*9_>6d2o{rl~Q{Hdw6B>SR{GN=L?UOjjSORQ8QeRdx<de#r7yO&9
zzpQt!h&-NJ4e^ZE9->pDjMf#tb_(*BtRL+VS$j$A=jpoffb?$-dwqWYSO;WIXp(4z
z^?z0M<OBcuY#4n+p at Wljrq3IcUln~n9*+9l7zy(e+wucUf#+2IGw*=Bp7W2U6brXH
z1VLz!{oSm8D+KzlFBSE3DENM~`#DX!y~$@Y8G6mNIPSn;;jxi=F07UdJIO`De77 at l
zs3Ec7X}yP8=Yf3OJ?mo2-1o`IHw4R33G_=-&7~biR$jjuN&n(6P{85;kNO2VGOv_w
zD=;z+$S*#K?=~*1ca at 1eN2w=iI%9uDvNg<a1^s;il7N5}Zf=S^UI+d-bXz6sPwzC+
zn|(C){!rd}mG|2C(xbwy0+8=BZvCohlv=b&A|z>yKBQjQ*re%8zwSBJ7z+9yNPFsR
zyQPb55z9zkkI{8*shjM{Aym<v`g#FIm%CM+Oh%G4Typq$6MX+Bx;*B-{TYYx=lcAd
z#@-+Ajg4+h8et*dFb*;3&r!%PL5IS6k2|pc;IHPB|DfgdJlf|Ziy3f=9qJ8m91A6g
z=?nFqf-}7s9UfHG$n%#P>0 at 5V_h-47nGo;9vYap|ypRt=9{Y;P4v5yxor@{Rzg65+
zSDDYoZwLFx`Q;4p*!vLsBu^NiM9b at 6^+Zsg3Gf%JzhFGxmyRu&q^%PS4f$4*$A1U$
zO7!IDK{#k&Kc&7a^<Am&N_|)AyHekk`Y!L+l=`lm-<9*ba()l)kCpSga(-9N at 5=dI
zIloWd7by4h%Kf}@KQFHZR=J;t`%2}0Ub&xF?&tqk_w(H{CIFb&vT{NY4%b)fbl=i|
zar7?k(edFYf-v$ez_gaXdX)&_NNuQlmjy7R=E1em?WxN}Td8OUOa(1Yx~;tvDB9QQ
zEF%fPxH8x6?k9bDFeG#r1(<D>20f|aBm70VBH#qrJBvM>0vG|=Qs1<9I14bCmZ#$N
z#Jq~rZ+bc`$1tkjid<jMTWn>S($4e1f5f1wBc1A`6C6s+0!-}YUtZnM at f2i8kud^h
zbH;>XX^SYbYX|Zo{|XofV7fA9v3!aA;6T<dJ2_vn3kGe-r{N~Re4~ENr~7HjaC-fX
zKQ6$?{{b>JG=I3H?InME)^(8gMU~6KS58mJ7b<mDz$g=uuW!@5@&z0z90ZJ~WoGP=
zUWzm<T=DqVnT!63(G`{WI+`v6X6-DWdmjU0#{mPmLa82LLacW;*!QaHk&V7$emUmV
zGUi^@_j)5k`B{76mTzj{4Z at I)c5U?0RF?=!!1!Bjs{M3kvax7IQaknh1I#Q}{s;{)
zUVq?TsIKj|VQuNJ?KlmX(Ad~Ly}Rj5lc@<%B6uTlRrPpK9){iK1ACo)JLYb?E!*#4
zD<=*DrdOwnTNMHdjXO;jynq>2Y1T$Rkbj2}qaOj&;e56nL!x;=o==GvC0>+xQSytD
zUzB?E%hw|U$?qCw?8_aD)V|bpsg7Z at 9T<IeGA1V6sd=`|G(B-wC+ty<^jvIDV;$R<
z{!Z<J{^-bU4HQS%qrf{dsF7u>kW;RCU5nk%XsdvJ3*l*BSekX(dAmY~fKEq`EY529
zWYH#J#F>EODr5fu{Uw&Y$J*CAaGdv0YtaX%zsL?an936(>@iZ%oHZhy>4%pte%M1a
ze5<OZ&7DTuW*=j&433Wuz7vFp6Lv|FU$Osx6F<RyE-Jf(V$%Y2Rii0#PyS8p{aBLL
z(;GaZ-BXlM4EyGW6xEzGIUs{^2{GLb`{WG))>dj{vd4k`zaDQQ<UCNLDUVHLHjJ~j
zio^V#hovWZc*4C$X}kO&Yl8g&_S+9fPx81!o%&9AePrOs0CTMc_RtSU%RC;u73=P<
LuV)xZdRY4JB2Mno

literal 0
HcmV?d00001

diff --git a/tests/spec/khr_texture_compression_astc/compressed/ldrl/array/waffles-5x5.ktx b/tests/spec/khr_texture_compression_astc/compressed/ldrl/array/waffles-5x5.ktx
new file mode 100644
index 0000000000000000000000000000000000000000..2cb8df8e341b71db7e539fb7217b9bc441b78c11
GIT binary patch
literal 30400
zcmeHwXH-+$*62>?aHuM_qX`hIA~y7>M+t&TKoq-TLBRq-;93w15Q<1sfzU)$KtV)B
z0U;bg30RI;jv}a(2q7XWAT1jRA!WU}@p!*)+;80Rz4GV1 at z_HdEVB0AYt26Ansers
z)5fjTIdjT2)u*VF$O?)WTqNQLTt$f(raBqJGU4}w#2?@y!++v)RboI~TQLmBP9&JJ
zCN)>|qR|V-MCZA|8khsG`|t5!Y+SG^mBFUvxisEGI5y+B;jK=Dub53D)6C6r?CzAs
z>77W#?E3J;5DUSv$0z6Nb`kfMmN4CQag4uY^|h|;!n at 5))^pTUacUK3tMg}65!Cge
z#G6FMD;u^|UEi~_&a%+Qv``J!<1uYx#w}jUtRSBMI-f9{x~XpKs(s!<?jHHngCW1;
z*z at U2uH`j<ph=pfJbJ0nEb#VATKkdY?uC?m6`_7x&Fyd714?XXH`{52PESmQ`4s7M
zl+iDf{Mb*W9HFi~3loLWaeh1w6DP*~t)rhIlmPpaRjmqaN4+u?T)~9|>uGLt{&eQF
z7DgQf8ICR5J>$WXM)fiiMl_9*Ab7Nx_v;?rZ}OyL>6{9iXdJU-Y<Lu5SX0fsIN*1W
zg=3-2*7LKhlZqK1O%JhYIMtT^YmNQFb<0*Ktk5%x#w&}S^lc8MF&wY%t<%@uj$`W{
ztvDP-^NQcWC|hU at _b=JAarfCE>PYGnS3PeAj at f-aeQYg8)h)1ZNZIug$4*sqgEvxV
zD-0V+GZ3twHE;l(Vif}Vx{(Os)O{(NMg6yM<B_ljVQy8U`xP0?OPcUv#{1|_dmQt6
zeMhQ>sfH=HhKkeReya;)(+&x469V)^(!;U*$#W at Ph|7|=1sUuQ!KvGJnm>y?OlOyL
zcV}?k!}9~@FwS7q*y6-LUw3|o=X;fN_PEtqb1WTcfKMuavvAvY)`+#&rLD#GQ8;!a
zBgvpQL;U9Ba+*HV3FyrxId6^I=5;1!rUsS?IQE`(IO3J^=c55l{`}f*9P8R?r+G8B
zS*OXJ)h%b?)WL`Ap5~%PRab9jY<)G3HD1{;P2;d~PHwF&gR}_8-X at c^Z?3tVox`4T
z6t5LVjk9}p at N997d~oV8IamqDf`rfHUD}0jhTUXH4*TsxBy6`_0g2Cj-5xd#$2wu0
zd5eWmd>;4VZM<?oEM^h(!AJLy8q7ap$~qbIWL83|qN5>gJ&r~6_G!hR;FWHd+(M)i
zI2Qh<`uyvZ at k<VUUqvJ7;Fy|5+671UW!iJj!wwrVj^XZ`=rKJGi)rQw*$!cNWqjtJ
zMWNY>vyB=O51X;^$}o0u_MVcdrBCbbtZB~1vHSLWKQgFPOwm>qTL$;Xt+%Btq at z54
zimRAej$?Tq;XBUnUK?M8(e!y+fj^h>9#b%C$PI at I6SM;8`PJ885vw1Gk&G|*8^ymk
zOIGjeUC&9`VF&zsf}Hb>R~pnb<2Km|*1Iij-n830xiZPbeC30+IJMbTm!Xtow<xF9
zyt!G1W8JKySw7?X$Tw~ORD|_ohmd#jOhw#8mO8(X$-}Wh{v{(9!-0CQx)+5Gu-<NN
zc<MR2#jPzD7fC+(;#farb+Uzd-~C0+<DDDkgS<eDNVQj5$0ExfO9ol6-;1QkPZQQ9
z&@l3NHCWF}%KFe74E(;>xPn{}0b at 6I=wB%okM2pC2>F40ar20M!KTIQq`7uJEx|Ft
zva?gWyk+?#Hmsd#Q((S4Cd;W=xqD&>W3M5j&EekMirbe-jr-HSz5l$W9mfuEWlkUh
zkc<l`2Kw@^MZHHP#eea?_(>`#I5q<G(7IqZuYg&}*~1%!Uphe#^~eZCOX2>kl>^4t
zeKBQ_52OYhJGV at no<Vb7Z)%=Ea{&2qfV?FzI@@mOG^NZ?5yqvJGpgH*G|f!*ZD+5~
z6_7RbXW6 at Nh)=QCV<g4f<J5eot_H^(z2v~=1=Dy#IF=?@H0yxV<^4hF)b0KLfS<j)
zdejIxesy-7K|1hj_V!)T7)j?>(s$(~kaxDBt9{Hg3<B6mFWF3x7c*>dZU(kn at 4|{e
z13AoZMzRA)){l5x7ODVxuK#Vu)R`T8InS+kT<|;`Yi}@0*I>W=<6cIw_yfVut1_Cf
z&N5~*C)m3b;Jb;xJTC8C;W6jBoMs72K=!YpE4j{h>MVQkLE71iSAI}CpiaW5E-_|{
zHnRr+{>RC2H^L9aXeCzXUAhkNSz at LTovE<jjw3?yyMjmRyWV9>zu*73i9YkptA{xD
zG-FR_n;UN3;%>>AG7jj6?-60toY52Tu&yN&;Ja<-jM%CdzKi1WFPx?&;?%!3(32w+
zw`#l^-|d$29 at hW+4((?l)bO*$mPN=4<lBRz39HElr!MI+i_kle4}nJvoVG82IPOA>
zi!;#g9wae9<NBvcouu>RaX3{RuicB=ph$EV`60?Ez9m`t?>67a-pqDo;8aP0w!aW0
z>p1xqBm;g360DVb0_pgna9JbZtCVEFraHxsk at BR$a0ci<9%<LmtvLJW)As9W4j?Zs
zFa30vuQ*?0c-3bkeYSvnVoxD;$>L%U`}>Nt26w!2?%LGSkQNQ9Qk4#9YMff4UcA+E
zX4UM&W=3BO*5Q?BlKu!YU|gczYCiAr{uW+&I=-lA4?~Zq at 57kx*@0u_%UAEHCiFEU
zjAj)A`XbBzdt}k(gkz2kCuW`keSbPKa9z at bgp>AC142G*S~}mdbB-+PAgyuyig=I*
zSIpJa`n3E4>Pwt?92}d<8&-~_sj+Do+vT|wubiE;v8mEf)di#L(QE)ehra#J7P#rH
zGr?lw6G2`b>D at Wrqd6mJ^Fas0X&?`-&8>=B5vHN1>}*jYv<7;vuT~X!7cV$y^ubWG
z2FF${TO9rgjabRuE%iMBUgC_iktX_mPe(5L+$vWE_}ZL{UbV(BH~eGh8e4dtmyP|o
zEZ!ISfgw9F3G_qhMKuM5=H4DYhsoo>ShHL;)^4`?ww!{T#t|ltMJBas?Q;hGvwX72
zO`tE!Whc`Q9uBH*vS;R$!g~7MWagLk%^7C)moN(O=P4v_WAXdAh>IkIzL9+t$!wyB
zSwHOuDMDgWQM>PUUT}ik7_XGdWL+dw#_B at 3lCJMKmWxInBd{Mfi0Z{k!vGJD0Qp(4
zy~bnjvgAwPbGeX<V*lX!48?Sk3gCSm&!hpMiBR2uar{Ia3&;+T>oraEWIY6J4)j~T
zcdxtJ2)RHdB$N*J74=%L-sTsav<6Q$r<-GmQ}dj=-Z`gy`|x54i&>nHQ>|{5e{|Bh
zwlRG|QQ#inx0eRiA0ufifF9U-{qX*h#~WIrXlgoUwo-Dr3XV<VQB~A4$!6C^atV6~
zOT5r}Mj4~CsSHQ<KH%qU*SRiLr_CJW-7TJ%ea5jZ-+d+txZ*d%7I#cMKwlr2U}CV>
z>A|0_-a#6r>Ns`FsY`Y at x7Ts}Yim1N0Uo&WGM%e at J~N=SidPNvWUzEj#3$Y#51Xb3
zTYmuj3fw#tKBFP)^Twp3pFtn&bMqj1Abxj16B(PyhR-S6NfC$DT at oCE^wC|AU;O2v
zWU3mLNn7-sz_+!uKZdm0(Rfqs)$WEK!K2MfCWQu<z08=~>=nUS0PqW9pX)|L-Li?6
zhN}U;Zz}FxwhCKyypEIARXG#z&wrf!=Bm$f&iEx$%b$Y2ydul5$gla(pznKEz7y!L
zMYM+k at F-@QG6;L&6j!u|%j`!|7Hd0<se=jHz4NRKK>~mY4fG;9L<wRg3_KOr%lRjL
za7<FUMcxnkB0#=Dtacpkf07$m53~8GCnE*+Z^M!{qj_1*rx!k!2tof{<BwEvmG8w!
z4SVhtzrnGrijn)2mIKGRtwC3t!5$M`-4fV=Zpl?1fPD)5y~N$VNhNcQ4ra at yIe`5T
z7;`7sw#IYnKN=UF8+w3KjV)iUf5l18UOSc3RndY|DV5|JXT!7x-^AO_seBwuX4j}@
z3n{rwpV%bQVjOE*HGhf#*4tZe;Y<g6_N~)~3kJ%&u(_BX<^b}6-;+Gaz3`9Ct}}WT
zil*Y!?XJl-x4dLIuNUW;PfG)OU&PA&a-#hGnwhSKG~nl;2U~Ke%~yQym9O(MFope9
zY>RF49&nRtOBE_WKT9%#G)-F?Io=+*DKp6+Us*E at a=N$+ym)0yYAnzX<uu8dcc=JT
zV(4LFeSFyzg)Bw}C!luy8e6dUO8EvV0{+n5oxDF8l{5kQl+V>w!#N}R`4rK8$wC2n
zm1mZ*E>+o{cKwp4Q9h1+ec-6%NVaDyGSZ9r`@mkIY&d68w2$HGk>3IO4m)KtcuU0U
z;}82u7s_FOk_uFQ$jJmNaIp5O+Y9^Qi`MeikQZfr|Bb-``5|c$z2O(Wi}+^IQ!)hO
zQ%Ka!N-t!!aKE!kfgXA{m>wyLmhH7hGRa54?^~|yD}WbCL=t`>5|H;W`gNw<qt4&7
z=$PJ}0C at i6$iRM-j#kMN#dg4NL61`dg$qaAq^us+Akg25$E?79F&aiW=o$ifaoKGo
zpLiZzVg}5g%opcyCEEK`DzOm4zcc^j`1;J=HG07RG)4?g&G_Zz%C+uIoW>7wo*W4t
zt(@~0>CnQt9z*$i(1kC6f6tB6$(VCA+sU}O9M;R<XB1Du9Kt>}Wp_8h^F7+fpRF>i
zd2*1K?_6PmV}7+-8GEez>!n+Qw##AvPj at _+{O<hj#u!SIt~v1Uj4kdF8qZ%39BDFb
zz6ADP@{w<6!W8LYG>nu at F$eiWafuA4ZW|{xlx7hA3r;y3dOi8AWzz>Aw^HD*fCTrn
z>&~^bLuGH91#o{i>s07x#AU86UAKmy2b`Z6dR<b_k{z@(IjAcj at 9U#0ledwF+>80u
zGk|_q1oxA#>-RSdUo4jJKwfllU6q{0cK#9Wb-GN@|82qQN~WC47dq8_NPO5&7e$gV
zY}G$;*hzj*UJvkZK^`){2Y)&OJrn-vDY?i4A(7wCaogDhd;$OMEFO{}PKmRRE>1nP
zp0bbQR_o^>FFyzRi|Sv1_@(5J7g|hnl1mri)FW(=7q5NUC)xr_K)+yI8|fPs0)7K~
zG8F7d|1dZCtR~hyq=byX9>Idz<D at t!qX79tG37Jp8zgHJu!bs}?|t=-v;_M^hH%?I
z(!DkYrlO=HguNoe1%5M;-;hd8*?U6%td;)o<$F=qcd$2h$A{2r9X>Ug(2o)8x8s+o
z=w&NdD7{Z~C7BAy(FrS+T{aiZ;P?+atv-!osRnAllBrboZ6??G at -d({chaRQ!}x|{
zWlpc{9RVLtW~GE-bSz5so#HOw*Q~TOB~4l@%~3DsT<Jo<cfi&NwM^A&<;3M3t$@FT
zTdL{;?}0yEJ*)|RU-{x!>i#T_%Iw^wu|=d>pjWrwBFSL+sFDK7^7J;$KRh~z&X`Kg
z&n`|%V&l|PeD7OiH1Jh^uq4F?^v_#XScH<}a at I3>0OHDo-zNHBYI}6ZKpJe3bvp*+
z|FfX}kUzZ=7qoca(VqhIw=A0y2~V%ld+5s?g7vj$7)IXM);g<?JA`Use#b7!xQ7U5
z$=&4h<my0AUN!Ed)16D7FJL<u0zJt%3t6 at L{pfFd0DFc;QZtUK at 6Qzl02T#gyOdv6
z#wcR+1$t$!#QZup$%LucZe343Rx|PWh8^*{HA2&;p%<m2pUbX at 7;bvH+g%f--4y`>
z@>U6{@=l89yy)Uu2eaoOuefqCLPNy+(nmDG9^tEq3S~=0fg<1*H5~g+_^ZsOZ138f
z+mWEJ!IF?<u{SbqC~hUkb3h-xRRMdIxKh78Fa>#5qtc6yjzM41LEks;)>IQKmwMEi
zcU%H{UCHG5=_uOTFw?xm-HiQs<*Z2-%LTDJbI)D+J%tVQoR!~j@%vrgO0Ty0Ym8pt
zm5yc$e#<&Mvel8cFS`Fv9Mg8CM;=h7lBuM4MF-GV6H|uIL?mgskm>NJ5FAUNJ4ta*
zVewX<nSbgN at geK^W{Pb)6YHOQ at QM_50Nyp%CbStznn%M~1buD|2{YZlW={CG^@{4C
ze at ZDQND&;(XPjxKw+R2ktB!U$;`F6tH}9)E?*Anqul3B$T{yx&BWg5A!NC9Q$T%5k
z+06G1V6QJC0lo4mdJzZE2hP1q at oWcJ&pkv+Q?Ai!KQL78Ru1-s*!RqL!k5G7>p2fu
zcxBVo^S**O&seH?<N5l%ICg8Y-n4^GAESy@<1wJW%14Vzv;^KumZVX4V*4Ax9_F6T
z(K`LhqU%MDVminVrwYfoo84vk&D{GEgIpYAaNQHW^BwOiWS+*{G{Byrbm<OF7+f)Y
zFxXoT?+1IMp5LgwnB)+ns7L6}4D^hGIkRIdna<$9W2ac6=d1~RE2Q;OK2QJ^FH$*i
zDC7RZUFnw3>w!N<WZ)bAeQ5#wq(C1(u3s^^!hafvC=8RN!f)YoTQ1sNT!kFplD38f
z;FTL)!)AtLnysUn$Luxx1o*XB{wQ<K;MO&(?K5WrKF_&*i{&fY*1w|6*1%xAJ$KwI
za;8=Y`7r4$2KZypjjomC1-dYGw$N_c1H5=HYR27Pd{WCpJLzKJ?{W0gR~h^U=a~x)
zJz)RO^<A**4SOv9p_-s?>;U{3L{-zn6n;}?u!|~R2_43L*UGv*Wm4v*@*WW{5U=#D
zU-?I?_x;6}6RbOV;D0%@$|Cy^&K<FMXfgxVBce!?$M06Yp-{KJ at jKXGUEG6_XS06^
zA)AG-X_pJJ8EC_Ng&6Fzb6h}w9mreLC1Q1NYu!XDDe;}dAlRoHPQ-_IXyq7PQcYq2
zz2y9^ru#{wP&LZIHQOEd`Tb=_?TAK|{R-byGl_9M>!gMjrju}dW^iE(_@{h+jP7~N
z!NTC7Q;TH)jxhu0O at 2Yvi48OgK350$!`+H6C(=kE<4Lm=Z2%wsEgy}pDAGf8sAn=w
z=pe7J$f}TAfA5H>M>5n4_;*8gzh<h`sC-ixz{+q8P49hp(xkBA_=X3TEvG@>)UE6q
z;7RkP6Q$bRO+Vrlz<ZbjMgxoO2R;0VZ&Co?Kk(m*`W1fAgwX8xHOaZ4a$V1$w5<)1
z5jduL1H(cT*RaQfy+G*idu=3(<$A~2H&n0Cz#qj9s3^6N_xgt3YEW&O=>q<^y~eCh
zdY*Q)y(C8mE4*?z^pIg at _Xl6*!hjj26LG3}s+(4B$EOcz55k57LtyXvW0AJZjO>8g
zx(+Ny at W@bgBZMEZ$qPm#a;q*J)7?5rIh<yTVP at -mc|icr73xX!qJ55+Rs^3O0DtKg
z`Xi$ER{!0RsdqV3(?S2(NHq0#s|<K>k9l)BfNy at 7nk9KR*>iQVKYIY=K_8~H<kUf7
zZ1zy+0Xgi)MlEjD0&|VxN}X4>0N+B_$!fY7ow2^G$Suhgo<BdD{6w#D(>K#>>khDI
z?k^Fa&SVxZXqn=7t^(}!j)zX+pSAn9e4F^?ZUgXlRr8$4tGtY3sdeC=0{>fYd#)Jv
zV$F*QjAx3Jbr9dmFc1G~?J_RPfmX-^{eq+LwAWWZMg=O}CQkwW9^{_QSgW{qo%Q=w
zLigpMUs_}(Ey^{dYRv)Tp{WqhMMDoKCfTniF~ip|M8xMUT&Zq<`~}7<MGJ at z1n4dl
z_aTW)ESGXo#^3QO&LLg_sR8r(oBvyF`Y6NNQWY&sDjOC3|NH^|bVirjF8SIK(}cwJ
zw#LA}Z<kk at 6gd=KpTB1Z>AEmVWkU3wf;0m;re5i_zZU%I>3>8XLR=GFQivkMQ9$0d
z&i-);$MtY5Q=+H>@7sB5N1WL~+Vh0QaY@)sz at O_5P1Cp+7GwjR5GAm;CZC|HD16r*
zf_Pu|1&~)um33kSu at 4>3Gqz=`hTxTz`X)L8w|fhG-5d4ILBDxu>L@?%Sev8NjwO*m
z{!gInj%?Q!M at sGFCMX2_H=9_E*q)2Uv5C<e4Zz=i$u(Dt!Zgb^4E1hDV9!0{&(SoE
z-shC0sz=AZ0KOMjDJu=E8O#;U at lI~QE8n>q9=1K^Eh?PGtF<!&|AgzQa6KdM0%i+d
zCeXhT8dl7-et*VuMzJ+-CD6Z(2kG;?{)@+*@0e^!B;pm>k-3smnG at TAO<E7~jC+V=
z-_k1=$!9dvbK9^D3N_By?<b7oitDt>cN6yN<HWcZS|?SS6CD{~zqZTgCghR-&^c}y
z<Xi#tD?w*(oll~^m_Kb(bPLGOQyEVS3-aGucW(A`6M?-LRMBIDH2TwyJKr|c2YXYL
zFfoWbv0;0s_h4+<s{g?MAIy&ne1U!l`TrCDa)tkje+iO3V at U|-wHNjE68=+bChf4V
zVUn at hW*0+PU&Rq^zrqaF@#YsZ_XGaCZHl!McDuf8nfi5Y5f}8=(o1Qp6{kIR%kw){
zHW%jqdM<VKQTv-lY2!93>fx2Ij`(p%Ypj- at _rAYguLkV>3-sufyz|mXdAOts_;G at h
zj_RlFvJ$b;T}{FsDEX~bxmVGJ3?WSrQ7~RueMU2BO>U$;nTqMOVe7&*GaP1k8EAeE
z`!(Jj<iCw$tO~XoGpJ<0_y+pm-j=-6aQonfvJ&TAOYq8qhYK1ASx04<FbMrQt?9-Y
z!oF0bCmb~s3CJsU8- at CWPN%DckQ5W>;18hMa0^KWKqJ7dNEzNgeR6o!Vg0<j7wX?l
z0eEz090~m#Tln;&VX*Eph<^o9k~Pej-aLH<Df4qM-0!wMybbJiKhY9N71+CjNUCut
zzr=cEN{}^Iofv<n^n2G|zt`;4V>>7ydu&~qoIcN5WPeJncp97!1r#1~S|#gc`fn-M
z&Q=0{4_z|tz18<#dN9};Z2 at _3Wymf#_Wp`t!$4iR4o+nzYI_Z`#6f{JT(^q5f8!tA
z5jhKS{eI&AC%^w!{8LXAsNjcr`*UR!shdYPyuZJ<_Xux6X}4U|Z3X;(0u8SCak~i7
zPlA1uA<aOrzuY2)jTq=_Z-i?il#zXp7ENOSKX$NWS<{=8Yn16Eh*HD;b_l}O<m5Rl
z*L5(|u?Kl#U7PyChn|tvd2iX(5P(1ZS|qL3c^-QKc36ilAUiL=_SkX*AP8fGL at 5Hl
za)&i`_Lyv=5oQeV|D4N=39E{Xo~P`6saCEH{*zGrOPjY(G?^ZnWcC)~;TyzJ?kM9}
z4%|R;0e*V<>lxC(tVPK_FFE_30lg(<stP9Dk3Z`WlkKp+4LhPxoQl;Zy>pevR<KpT
zpP*bNsZkj(u9ufd$`QyDJ_F*>!&?HKH)kta06)3~lJ+-4u(2tS&<9jW#?+iIu?2s2
zZqAj|0{yYv{Nq+NYWu4+lU9>Jo&;q))n)3|OxkJ}I6<BU_6h3F(eu4z*;6m|M!@fb
z{Kw<g8SW;<RNB`p9|3t{la!%VtdtW`^tQPj=ttyMoG!Emd1HB7w|*-;uSLENA=%xJ
z6Me0l;QjrFCwdK{A-OmhQHXfJD8B>3hFMY at IptsZ{ojqHqZdLyKmT`Q92@>&U!o9J
z!vY_OkI1+x%mLmIQ^FM>B0k~8ms!K>5l{XV6~dVBCQBp6;GE4vdPIDEB6EHte-PE7
z*SjI!c!Gs^@Ts2!Eoml|LHyHAv<dMmPyn)HURo(2Z#f=e*fn>k!oAn)(2feww`p at H
z-0b?0eK$F6wHnAzMygX>I}3latF5?j8t~&AvA4D-s`o9q9G^s-N9S%~DD0DPyZy=-
zzC^qr|KwyP58el+ce!!22N}oKrV7KB_pDi at v`-<4 at DCOy<zahzmRZdBmg1Ot6!@9q
zO=|ZZUMQU?*Fcj2-!=-A at WZQfLOC@%FM<3D;-1s3R at BkGp!(5pI-EzG>T at q_<GJR>
zzKecAKLGT?%};&a?YJnxvz|sF5%S?->N&Pzj3U#Hna0Ag4QNWVvZMO?6ypGAB7U+W
zLpL%KGh-L;HDwa?*X>p}ZaB7Y<#Edg`V+ywKH(+;cV2|VEWo$ssJ|x`FeRmOZ&YFv
z{u6(r5QiWC-59SNkw|1!oV}IGyCM7w=Uc;KF%qQ8okoly(*4i-f6 at bv4S_zXWbbt<
zvTS72=r}cq*Bb<)2I85gB!%EF$z`(sJrKKVE*-JF-UslgL4W(3k44>Xg#U{C4->EA
zTn^NbjjkWhf)SJFd#>u}=zM>nL?k~Yzb~<lf%6&ez!DpXr`OBpApyYK`BzJ0C)uAq
z5#_Zz+wb6&M?Llx80gkq*t+_G?iE+iN8G`wTP|lU&2%31KdI#jdvYFk&T33O>-5A-
z4EYE1kEfb6_tKKPFBTK$35}<gsI>FTn9jUv1_t<d4t9n3Qa#6+?NFo!`n;X*4fMjX
zZaEk{r(zO;?~-xtZUxq>XF7t$hxHbC8+<~D8OvN{=nV8U=vFdLwXqaQfWJR15SpnE
zPEV`;WN>Rr>)nkO$pUhK=PDJ<A!$(mz_&M+fZuxA5lzq7g7=+M%Dr1b9;|w}C-fWQ
zAG>!sW}_;|ukH*<oZL_Pe#Eds7vkmA6K_?5z}_QpGZp<$^Y_1_2cYMQuQEPu<Mxx@
zaN<=;;9r8WEZ=bs5-1t^Nk2dF|F2_^2NJL^RKUJuN#PXr2Yt}vXEIV~PHg7(AM%2#
z2Dl*8NNn0q`2p%Z9s>{K=ksKv7vaxByh1V?eMNN;H6Lc-RKE?o+yW#7eMv^2-!C7?
zqqu0#R>>so#wx+ylKwvVWslVX)8vHA6~OQHi-Innd$DS<31chmBlt5L#NHFlLUz2p
z^V$BzCy4KM$j_#Gqq?4Rbq+-&pfA6cz{KaTeecg}k4mz~Kwog5ruoL*f9m65qHnGT
z_(l(PJH0s^zuK3_2ze4jX-V*u^d8Oq%sx#6e9QPxbxpf{c?Kjlwh!ou$G at f)h3*8^
zaSV9zAm6%Fm#UL7a=b$Fl5RQp8;4%ZkFrywl66Q=*m9<T9JJdc;&y05LU-a&PWcg#
z_xx^yImh-tFEQJW8N+&HEkpO at NXi|VD7Tiw`ASgyL=kbGfLO=|x&4ISzr*i;_c`#R
z?9Hiv+$wzkalh|8Q8M69JZdj042PmhR_o9Ef8zh2_$Gn}STL+_R3Fgw{zmcN_$Fb1
zY*63?z6tt3i1Hg at gc0+9jDIZnpY;0^|3BaNbNthPCH*>jJKP^&GiZr`8btCsNfr3B
z-RPxm%KA0Wb9};!)LsBQ9~;?j8=q9{-t(C^7yR>tcf(pLRHYC@^Jffhw}8CP#qI#P
z)i{KrTefIcKFFWw)MZ)uZ-ba3KVB)|OU#u`+o)Kh(=hX>{<s8!->-~2chvEw>9 at oI
z+5zCd*~`pV>h0OShV8SRz-N$K??i8X!B(Gf56>mQe!KbjIVZ^-*;n~BUIOrQ`rPBH
zVeB=GYfspF9UkFSyYuw%r}b<Z at jk}PihPLwyF7kcUpYC%n_Oo6X%*mm+0Z<M${wEg
zNXu3Pdl}9n1q8cGxZkZrN~7{pCO~44|DfM9e!}a2AOAtkZ%*}P^sOB}00K6RkY_4E
zkP;zh&L~N4a{OB#AS=em=qrBc3sONd2huM%EYKH({t#d;>|z;D&P1bQBp~Mhpbt17
zmB>Q(zTDi&=Rm^MsQeG;|4+|@^Hb0$H5{cM^f4O0v}M2JOd!sj89(e<F#Ko?J@|tn
zPG#{Cei+p=-|%gE)&l+mxC2uW%8<c%a3iT*cw at 2k=K4Pzs;;CJUGvj^g=5hveZQ#h
z)~ZqXM&3w=c%|n|`sd1dLECRIo*NoQgM79&oU%xjG{1cuw!ZQ_j%9G8bX7xs!HQLH
z7gm%&yn-8Zxr5bjHN1rd5CD9$f|K)_eNEYy5{iiUSEJ3nNaaRlzYS&naGuhJJr7si
zuyQS?7_y!rA7Vp%hfVtB(OfSD8Yw=6)CcjeK!<awEgB9#;+q8it3swnSzv21x9~GS
z-#vuC#u{OLJ9C|<Hwol(jmi&xx9PS at v;zL`LnlW0A0h64Z{PiG4?aU}KPcn}JS&I%
zhW{Q at NAW*ToF+At>&n%L^K2xxy?W6_X*@3`@d>=2t8$_c{2OJA#vsmzhe1B<=B;5X
z(rLtbC_yhL4sn)(EMM9PW1t5l38gi1l4&vmUhq5_a6G--*qH-X^C<no69|NIm>l3g
zpdX1XJCg$mgYcgi%Oq7MUUmmdjs1WhiS at wq7;ygT#0LFA(1*w%q}XI6)hGJ04a7g$
z6HmNFAJ8-4Um|}<GF at iLf;aa9IcLe*%(i^zC%#oQk2cP;j#0S;_F<Uf`jG6kdNf8n
zoQlKw#Igpp3>sZ8-sdDs2=U}?E~_GfpH6<O5 at Wl-R=*9iQ8-C at muz$2ICp?s2L1+4
zDT({#wU#KioChKs@*`ND5sF70bNx&AAtFCA)zVYdPS1eB{_gnN65^e0>vS&I>KP<N
z+5fJa8U^tsSxE9pMeuF++HUKB_!fFW32uk=N^H<PIpjma{=@>S0d0A|beTNw|Cqmj
z_yhk5|HOF#CcYW`R|R+tfInGt{i#0dzA48wA1Loqz^RD$CWzvoovl)<&=ETD^Zf$@
zgM%X=0^mH$M*BoO&5mvGJbtgkT)eWgV-RIwyD+PeiIp0y|1lrOB_Or_-FR?tU_c56
zCdd~^QZ&%ljg4CI#E|g+;d~WQeh7Okg!A)$AQA}(3YbseKkM|y<rW6X at s19oV;Sj;
z_Txyw<38Qbu>K0|Lu{Lu8SQU`2gLW_`AE_w at MIO+G*P<a0AJ-cl5)yMEen<8 at E5l2
zc%=nNH@(VRP}1j0SlGmQ(o5qW-TtWK_P-lWhxMG|4q1)wRQ3-qvu(}<e~cCUK2|45
z;RUHZ<S=~^j*YuQJx4yOU8d3;-eW6*^YzF{Q at UAwHp3LDwp<0LMo;NC^S)KEslmc$
z0!JO<S<c3NZRCHD{=jx%vmkyau0a9)<4`nu!un*>KN`=$g#^9`^GEt~|3Dz4*Z=DH
z?|8sJpNC`L2>(rdCeW_JfFJJ%{=``R?^yotSpM%={_j}+FQ3TY8q5D3%l{qA{~gQ!
zMclFc-?98(@JGh-f5-BF$MS#2 at _)zjf5-BF;XGk1|933^cP#&REdO^b|933^cP#&R
zEdO^b|933^cP#&REdO^b|933^cP#%G at -fEpf5-BF$MS#2 at _)zjf5-BFF(Q9+EdO^b
z|933^cP#(+Kj#CF<^TTQk^hV76E!)7Hh7L3Sv5rIT`uHox5eLn@}=XJ-XcqD+E$G8
z59pb<fCoK(hlqx`-jJhR87!%~Ab2 at q?EEWZ0rc?27?b4b=lW8DoOullAE?=QKlCB(
zd+ggyt1r$MuP_tdpgwjpj(!r~eldN3-W3Wt6`WjIhjQQ4VK>O;hMaj>rApwB0)<nE
zsOgbivkF`(_Y<d9hba<0C%DEN99C>}DpSEs)XJcSYe}14MYeYGlW318$Mj4gr~j+d
z4s}dTM^ROgdIW0no!Tv0su!e9Dc)}F$Zdl6MK6 at cVdHg&XUgM<o=d1P0F6lc{g50=
z7fYdLczz<~AP)t}T2OhZ8tkV*mS?uIv%=NGD#aaYE=!I}&uN6r7<T#~=X0Ru at MLf5
zGR!y8THGXqN=#ujX)yL%V+hs!n&CUMr=9|G^J>hf`u9}-q!-Z|hHIgQWYZVTvotDw
z_3Dc2i at Vx94a4tja(xCh=on35Bh-YxM6wLT>SK){Df&@EA^z(}&yHTGp at p6dF0Ir>
zhl||ZyEJojpvEX!UVYi-sMMvH7VhH!XOheu%c01^wNZuwy-Wtwq^$UJUQHB at k)X(U
zVG^_sa^BC(b*a`-V?VI{V)VTQ;2XVG{#tK#f>cR1PQF&~$U>vhAuO=SH-?kwS at aUG
zoOEChr;;eQr-v!7hMJXoFIuJx_+_ZM<q7Rqc;2{ztk_SfGTU7a at AZ_PLXV6D87W)R
z+2H%JN4r7?dOGOILlrUSr#n!NthonzKGY;=cpO^gWm;kfHPwPg`$^L}7mB{8bEEyj
zPEsM~eizE(8Wh9~JIf~^fPXt*#OFp7n94=pQ3cdkK at aD;ANlW4n+WtmaqGxuA#N_~
ziH~weJ>Vzf(^GD>^dI#jxoBt>)bL~oa=3BYeC0_BA!<-lQ4n9PV_<UqiQ~cCL(K~S
zzottzs}T*cN$S}2Cjigd1eITQuUT~DRl{|97}S`5-8bIWq at j4{#RmyCPEa%6bNJl%
zxV~pTOk)mndz<IXnL%GJvg6g)Pm6WdQ)|PX1{6Ogt1mLymz_=YsKOo>$VvMosZ5o7
zp`D~fLNf*b at HSouspTZ<#sk&~9rh1~mp<<cRm!}}XZd?U50xoMO`_Z%zjehO!z}>c
z?Jd1qklRO-6j~^a3Har6Ma{5Z)=rP$2}Dn_7f{1NPaoLV!}o10*a!HGG?iM3Ssf_n
z>#C$kpeLJw?TC-+`KBvue1n1B+a^khrgMB$Cm|gG{PFwJ5xV<b<p$Jc!g^!Z7ig%p
zYMCiqPUs<ej7)w!=~qn0I9gBb`X)~<j%l3T8evYQhQzDgF_B+ at n!3BQ6>?Ja63^1N
zA2t3gG at IDAR_#Q>+a<mA8#mW(Y{O1TysGFgT(9%KgeE1kg%0L}85QaA1_7TgmiZ=c
zgBotJG}MddS89}29sOaFP}Rue=3g&v>Q<g;RZm+7J=|7otJG67$8-bK*gK#`%fZpE
z>)geWg!&h^-;eJX3(cJTAC<@Ku<f;#__o&i2*?NgBU(9vo=d%7cq6m^0{HPoZ at 9|C
zPe)3jWCU`0#Rbp<i`7R#rO4<m1!|f`d$|6fD5nk_Q~7N;Hl|POA1V!`SJ*MQ-`Kd;
zR!g8bTTO~>1o<;Ap(ZwWMuF}K-7RxfJk*HiUk!iK(V2aXr`xI4CwMevp1m#Ra0cZs
zt&?Bv6?#q>Ocj<F8E7<AZo5865>_(?6-qm5L-sAx!h2nhK~FOq`D1mfGitQ{F9Rv*
zIA)x7Gur9u-b2 at R+L~ZjVLZ21vyCsj+vv7`UK8|KupE|zsvliWkER9OEx+4_ow(yp
z!Wx%cujBN}-amkv(_m2^-_S)NP)({#)SPXQ^ga}mtwXO=zJBLh06l_^P at qQu&JrUj
zMGiGgqdkq0j5iE5d_g>+nVQGdhkvNM1O{iI_Q=mdRcf0})fSETr<{<~6IKy|M?!<>
ztbEDAu3HbeO#y&E%B(V_mCbRo#}x+64ae}xWun>ZTcaDBZaOy^?gjZ{bnlzOmqbZT
zg*lYW#0$vpk7J}ppR9)q_FwQk4D#jRUB)gf+unGcyxsfWe&`vuZY08s)jzR8HHJzG
z6Fe$XAjdvP{<tW=Zb+-sPe5)DP)^C8n`hH9|DD4mP8;U8#fo%hS3d4vwz<R;_Vea9
zxe7C*UZuy0S;94j9#YMsIWp*xbKGGW?ZA52|2!)o1SqFr$;!Ew|5`&cTEoUXI$D#S
zXY-{S<dKcY;0JXaK%vkB;4xP|jo==UJRExFL5=C&)({%o;rjDU7O5nA=rOQsBwU7|
z=SL~&s9K27fn at jcT-p5^`N;idi$W#nA*B(n@&%RoGxRpF)hvL&n4!?~RBoMLJt at iI
zIrJo$Cnc$7D!Le&=S7R$K)=nEh3=CGdmEQ^Ygf>r2U?xz+>Hqh at 4s)ZjcW(`5pU72
zs=1P6Ut5uQG=2-r7fTg1uzjYTrQiLA{GcW=STqfK-oF{15vbb|HCiJzC}2ssayOZk
zT=QS||8xA$8eb}c!d9W5H)ldq4^Rlyh;da8&D$skZfZxR&?98Drk_<|#YcCzzd%ny
zIg<2dp+Aq}6+Xz>AA0V%4P{*sukBXB!<%eD{!cA_r(MG^S?8tXYe>j5OU~f9TiWj~
zCJ~)D!G5qVmML`kL62T{ry`<<4mS=(+}wHPUE$1ahBKi@*1`l)+=07U+`Znu39K0c
za>o&>9oe3ycB~=gn*}_t at SRkHDJi_O)uSmI1N?8Y0W|^i4*S(cP=ggj)KGHeHh`jD
z^!4X{e_)uXDU(9`Bmp;>=15!lv&K+tTf|f-GG-JJJ+z6MWehsSBcy;4`Wb2(p=Uw@
z4Y7C&z<wI-p(2DH7;T&meg)J>e$9Z|?9uBhdW(dfhJ%iho4XCBEqnH<FZ%@aDE4nv
zi^a%f6Kqp<#cx8F<}Y at E-yM}w(pzbZa6afWPH*bV*DDq&Rg!nB76_vpJn}UkX6mTw
z_4x)y0DLGZa}-|2DY9wR*lBu*(9FpHb<qtUYGA`()8`tUhMq`VKolSm{&7Xxqcx-c
zLK``kSd!f4KYD}^V;1=6&_i<2_Hy3qjT84zC{rID<DoPMsJJyLOw1?l=d-TRY}r&s
zF{5b#j0<{YyT~(1DVWuBfFIPPYy0a(pL?>>o#jo)+fy|nfA*U<U%%qe#shkC06d;S
z*&dRhZVB{i!!%jLp*vfwdQ(LT-_>Rd<0HO2%T3ZUZuMMyY`z-Ev!};I+7leLb0TZ&
z#QUrS<o at LbE5kOO&QqM><@@%28}|0vgUi)(Ra&uM>FQDL&;#FQ1oYYH#X>*!E7JX@
zJ)i;=i}J|P{r{+;C8o6f=uv<Pi6&AnWzDdjG5dGS{vES_$L!xR`*+O#9kYMO?B6l_
z7kYq<*}wmv*uNOGyB6vs|M_f}T>a^mD=pe;ub at xfxLcBOx+djEp{tKK4`O5_je&@o
zG{F?{XFmy#3E!(V^UwjAXiG`a^mn8__}+<O$snT@;pioLDN!2|JbDyelkoh|+_dHK
zsyYdVc;$LD`>&9VYe{)@6T?*K({_#0G1bO!*g<M3izQ;R8Xakx=P}dj1(;5aDiVJC
z&1YZJi=C=FkL7(?XPf}<e<C6Iu at Yo!hjN(`D`B;3cyasV3v;{!syuehuZF(V)6iv<
zQSev8e)(Pb8|dS7?`ts8_ne24C7KXZ&S5oX$lXwWbCX$jXdv|Qc)n1+9}(Y^paU_m
zwkVC;Bj4|kmwU!foJ)6pDj at 3~F-$FWf4%NHn~o)%5JpW7cMjc`FlRYgFM0ilv(U^u
ze4y&_ux^VrKee1q6{>2-e~#Zbd6v`NxwiKGzCs6;cv)o5)KvP>L%ko0XF!Z2Nc51a
zHTjL_vEX#rFSWN0i3+tpaKEw8o6;j~W{%-VeA&+2-1trQ&@Y<=WZRw4r=K0zwqIlB
zf~ft_*U05Yq+N7P at d?S^IddlvecH=HnY;rzB(ulDT8N2<J{=+T-7DH2EPS=Z8)9f3
zn?C4&%t{~cowm5xe7rDf>FmVg<NcP#_;`K9x15B&Il`}^!c*5N+^3e3a_AcmK5f51
zq9dy~g4TTO8SN`BcHy%k7I6WHcOfQ~F|-7JLvN5b__S>|C`P?rX||baoogR_Xi;x-
zIOYGvkfo$8oyz(0&=G6Hvi?|VcY5o)Us^+d4?&4-H?VLdf&CdR+<WnKNd?4YaFGnj
zH~|RfFTJ}9`u>0qS`~7ja$f7?zF+nNd=gQ|c(1tPRZT|S2}985QrIh--h9T_t~85R
z13q>-SDZ`{$4OVojo^Fxgi#9bH|FGdlAay9*#6u3I-x4LP3nG?@is)+lde1;Vkk`z
zGu_=);NP&=XBtO~ct1Y~ZS}vsc=NPd=QoYf{}}!M|4jcO5a1HVXaCamro?(<Y>HVc
zr`%s?rW4*-^6A~|-^r_W at PjAXJeBN3tn%ge4N5;-)u}`f-#sJHT_#a38<+K(X5$3C
zeK+mTF563ekk;PioJ|+bzIaBzu69~P%!xvcyppRzhs_g~#9a2bjlOO{T3sfFIFQ>=
zKjQZDM-D*4xx0kSLA`a84xF9$r>wVQPg~UHO(g>@Di#dmyuFv}F9^tsYD3(O4y=56
zMk{Hn_477tX?T5=z`)!xC#N`xt^fb}`a>Yb*k-0~^yb9#<wYmDN*V&*vV}Kj at sAqj
zS1(q$Q*&h~2x51)xFdg2ByqB5at}Bg6nc((+?;*ZUWaWN at HNrr{{QLyR9J&B%Bmoe
zWff!UzVv`d^LW_5j)^&-Uy-+qAABn!(FK^J`LAPQ&d)e&W##3|M~?hQFR-8E{{bi0
BF8}}l

literal 0
HcmV?d00001

diff --git a/tests/spec/khr_texture_compression_astc/compressed/ldrs/array/waffles-12x12.ktx b/tests/spec/khr_texture_compression_astc/compressed/ldrs/array/waffles-12x12.ktx
new file mode 100644
index 0000000000000000000000000000000000000000..c0d7dda913c061b5ffa29255126899af4e9f414a
GIT binary patch
literal 11680
zcmeHNeN0qW7JqLp3 at DBuY+I_ej>WcPVT$5)9ahMUDYhos^ila3lo3p;U<+k<Z*ats
zyhl+fuGn!E#ai at H!45L7Ae0oBPTuHXRlw+Gx5*~8fqu|Msl`NTX9~mYd4p`SoBhX4
zHk(b}{ey7k-Fxmi_x|oV_uk)aU7ul8FJIoHnmvCusX!qF6jJ&F<?AB^5&k4W at bLdz
z(hpFi3exv*Nr1vFA_$C*#MC;pjUlrX%Zyf*#i(WNJADibCE$A at JQsUzz1H?J$PC*v
zD7J-S)V9GkV7L;j5b(EQBqpqPGwFVj5!ry>ic$X%-Ov)w5oA8sXAA at V^`E$tD4l4Y
zlG<Q|V%<Cq`u2!s<s}ZI&BnT=<fRQxQcGz02#gjEQHjMR`vsv!C5#qhl$iPDK+r3W
zxT;1NMd*gp)>ejVGzUXQ(-Sd at IWc1PP)eV97ud*R&s4yFpUDfb>|lV|9KfDa3(nl4
zrdXTggLO4VmlK}83eMjJ8-n&+bF3dAN#fv0i(r%N>k5xlGp5AU5&Mn;KZDWxX{$As
z09)n~b28(SL4OtV1)*{ZUkg^&Q~}?IqE~A9&`+)w9qKpE#pt_bRSW3dLFGaHDE6oU
z`m*fOn_rxyFk1C_Q*ZxBiSe3YE)nX+Xgncq{(~toRyR*g^um0ohQEAmW)_J7jPmw0
ztp!=D;btGms>5jCl9>5Ke!Ngt5%d?0tMpeL-v}B)%^mW9z0dcotsTvX6x&~pxML?V
z@`#1Az<&B;{nux`A7JEHFHqB2BD=GqLO7m^(WpCKo#AJSbSt@%I`F?%9bqt)_{Fjv
zjiGZK7=2cl_5HJ)I`l1Un#!I9^Z7uL#AN$yrR5^MTLk&&yN{o%Cw=CU>G6z-ePEXG
z1B2=7%!lzdY>fHz+wv`VeZh%-&_Aq3^Xc7I{jT5D6A>`~<7)Ic<uwwDASQ9#jw{#y
zM({#sSzub<IJc>nyj;kkl?LT?z=QStynQep;o%#|JL!PGy1DDuRT6}w(#Mnrz at 8Q&
zUZa+D8Hheghmnh$-IVaAQZ$3U0Q7$?Bz_5VqPe-eBlk5C>R&NL4qUuTgnoK(<=*E%
z!steCbTUD- at 7`H1GFg6*4XADoPf{+)9B4mbc%!~j%d5<T({hxLBsOJ^u~wFzWV0~Z
zGeHt`p7f1ntzPW;bz<VUG#*l!g7*6)|EERP1OERhJTHv||8>})ykx}aVo2CiB)N1i
zM_vaf0FNBw6oiGvE$Dha3Gy(BdE!!iXJ<*<Xq^`PA>QuwP-LX0>7esqBlwg5x_8cx
z#$w%M$1Oe#@cLNI=iEs8OUbEsa-{xipG_qfP^t^KkeDOszu{P&R+!wy_vEB@=7GL3
zzTnMbJK5IqsxT_FVst+PeW1<X?=kQ9mYwy2eDu%9lPIOvY)I^&QZV{8KoWN{BU2sw
zv`swVZ4zV)_^0zplK}m3$j$^<ldH4%>}994KC at Rl{bgN)E+$?L- at h^!T&%AZw5bbc
zks%yLHM8D!5MDchq6np%$LIpL-I+i&c3(4)v+Ypdr7m%h1n+RR8 at B{XV7?PJXgqcZ
zYy-yqkpkeGd%|$QSC*MNIWIx7r}N&bv=7_*g~s3OZ;={le3FJ3lb<b4?$2$3cv7AJ
zl5gAXSGCSHs&nbJfM>k%IGrA;H?Q$_P!PW)|7e?@wU#H+nGuuzz&{o2@%nrdomN0Q
zz)M^O>;I<W>6!WUS}^*ULdT}%Y_BJ1zar`(9!`6m7zs;~+Kc>5v8$`-x%a_d*X764
z%7n2_K at b|H`EJp^69V-&SBTn$6nsDJenH(~ZT4CWx;|q)jyp0`a(1+V3ybA+KXNMQ
z?_O3uH7piCt93CsE{MnO`Bz&PeMqX_6ilZB;9rJfk>roGezTIN=WE8^Jm0_d&)=DS
z!?ttW&)5JzUch%f7uNUQ8uAjQoR;aV=1Nyiwa?@O*-sJxSmExr$a6U`AII-0B>(9>
zdV0H;#-5+5+HUe53tw?s7%K+*zT`Hqn?or at OF)DmjnNtErLE2C{><C1uBK4%|47C&
z7duQnY^zvF@>+~;bE}+WZ$6=j;*__GF}m(nbTe7Wfsyi)=bGXBcTrW*5B*_m`hWH3
zUuEq1`Im|Dt;wS-#2dyY2Iq4e;>*Jo3gdhD*l(7Q|B$8iJl=078_I$;um?0wgsO=b
zmuXW><$V~P98%Ot{a5JevmS`|7rE$Iz&o)zKMWEt#KVv$zG3qGqIrAw3JT(H4Hx04
z^ji2`Fg{Xzxj;PeAz+{62_2+pY5gmn3i>kz^9AcKh{uQ4S*NCD^Ax=a5Ezi!{{VO;
zdh at jqkf6Z$$@yK*?{a>Z^Shki<@_$^cWJ*S=Xd%1E}!4!^LucAET7-y^SgY0m(TC=
z`F;AnK)#=s at 8{+Fd1)=M^8GyASIYPE^8LJgKmXslpLa`~0B~Zfs|Z0j*-#rF|2+*H
zN8gIxcs~4mkVYN at PAld0n?wjlYC at fRO~4to3~h|+NKX+h6`~P16|^Gxp60&4^ia3G
zk|Yu^%Ffw0Kza+IN$6e*INKUEdRooT@|6~dG;lbc`RvIw;0VaphUSAKxxm4+K9is&
z7VrP;Emx=MEJh7)BgeOkSD0C*qWd!FAJr*NkalJAc at 8Dz0w;F&FRvfwcnTt<$moHy
zxnMvsv`G}%je~`%zXHbroUX)Kq^y)497z7<r4|LOf=(0iMYsVt-^kzcnLe7*eYW||
zAD3d}`v at 5tTh6R(f5q34dmHS1S>Z78)pHYzgz9)RaFj{N+rMq`yGuDzI0hU~Yi!J^
zK8j3Pw&uxivzO0sbRuwC-jhdEz**a?7Cq#E*h%0(ZcvIDPKfpFgYmtocx<b;j8DP5
zQsUfe`rl|`C?9Jr+3{T+yg?X_ryX0pG}R-56VQIFU2&MsPSuyLN$#LtoZ&bNBm!RI
zls&)t{J)U#?Q6q2GB??}fD at XS_(glPW-`=J#Z*9h at uuR*pgjz`(+lHu@!jYL9hN+w
zjjf(K2AtlB__%c;;LxPqaK!_hVU2oY)QtVR^%(sOoDSzT=j)P;gJ6%07a1=yUSRFX
z at kNd=az6TB=OY41?;7SEDi~5}Ug^1Zm|^p57=80;bac2~{d~J&ZqnXv*rS~4z1oq%
z+IFpaPw9aA=+r$m<WJb6z&kR?k(KL^UCMbqE1b`1YCwJm;W=NKTH-Z}_l6FGoQWP=
zk=ywB@@>MXJrT!M$NT~62c$<;){QnC=Q-Y1>Rk0z-XzOZpBG_|k%ks-5b10m><WCa
zhiLp>QBNDY^_J~k##kL}AH`UqJ(QhLU$$Q!|Nk66!F?{OyoO>j{B%u|L3N<$F7|v9
z2yCXexJ0X~G_ef!&5db_g&7hcgSZ4tyJ4Ta#m`zQ^i19)$p6>v4TKa2>eN*+eax0g
z*0TR3f8bH&X&tU`&uJRgCS#joe}et?qsh}c?o(Yq2xrCyPYp7+T44|UXtJbZ=B=39
N-O#`=fxx56e+LK+>_z|p

literal 0
HcmV?d00001

diff --git a/tests/spec/khr_texture_compression_astc/compressed/ldrs/array/waffles-5x5.ktx b/tests/spec/khr_texture_compression_astc/compressed/ldrs/array/waffles-5x5.ktx
new file mode 100644
index 0000000000000000000000000000000000000000..7cdc7a1fa85252f07dd6f2141386649839973386
GIT binary patch
literal 30400
zcmeHwcUV)|x9CZzfkB#L8%=;v6+1fWC_zvOh+<bPD5!uC_*oDO5Q<0>fzU)$KtXIM
zAcPT=fW6Epf=Y=HBcdWb2M8f$zjbi at -S>X?-S574-#_ntkMlWxvpwhRv-j$2?X^~J
zIBnQMn?1WiOJkA-iL9iI!9^nef~z(e!_+5YST_9se&QeCBEx^geRX0$Tw5><$BreL
zu_rWF_Mnjq$HZrNA)1&2zw7VuKwLtII*rMpUvp`^gK%uxQKK8*5x#sDiA=Y!z_Htt
z7G-`%VphldM at CpEjy*g+N4JA`x2%-qu8U)W#j7rNY!lsXZnB<DQO9Z3+%3+ZQ6)TI
z>O&&qRSjFKuk7AYXI12DRz!jIcud)lb%WnBBbXns);AodZLHg}a<7kww^uQFf9UTx
z_I&E%%h#IU)1^%^KBG)z9(401z3otH*8*yRTAx8{&CPGy0!wXYP1!akY-(~kJWrK9
zM_GMx>5u(XDG=(|y&zc>pWx5uvT$PD_i^MNLP at YcdG*SmHq;|m!<Ae}u%6~t=TE0j
zj=^XnAj7eRyQbZH)TmKz%8a2?lY|cz at qgW|`%RH at B$Hcd6N6(`%=Hf<jcT5GpX>L(
z!^W{N*2gn5tW!#uAIuJL=s3-m at oSC!g0)LmB`w!8j=`&nAN6huqca^Z?Wr at +-iBjq
zA1pr at P4`aR&MaSG0`D*0y<yksVA^o{BUe2iCXU&CK6zvfM$;{{Z%Etu630$F<ArRX
z%~BdNmSrJWKfB)(onRLM`nr%9;k3PJo5X!LaFgNid*N=?Bl{H_TAx*2W%q>AdJ at OH
zU)_>XF!gZNk71Gwcz@<uvRS(nw+RJ$BI)5+!NfV#4#Z<i-GUAGh2pfWJ1m|?9b|Ay
zySlQt?_mC**~}FfEiNVb$*b?3Fu!*Nceh)eHP_0K4)~-AHi@=&vMWlx&)b*SN8{L`
ztQ5nZEXnH+%jgCyC!jZ*)N8BVHmx-^H#4+K!m)SkgOPu#em)%76d<VW!m*AWc3Rit
znsu7o*<A`YP8+zt_HjOHRCo1Z#nnH<vBrz*r)VBj&C9Q~Ws(-+*qc<c_Vv{la`QNo
z4&$|=Xnnh<`%jnDC<Z1Ekwa8)ELikZ(V<=RddN+V6tLf3M8b9{l#nF;>$dPIIQAXJ
z**Dloka&%E|0Z75FOjeb`VgQyhyu?aGGiZ)eKaE}UD?ryz7EGCdwRzt9^;p7lion2
zV>lM^`q`ORX=4{3=v+xB>EIYeGvlly=K}pX_kOz#8OLz<jf~iChedRYq+Ew^yecvK
zNpV=N at +{+q<b&oMyegbilDoS|zwB|{t<}xBICj^5&j%)rhAG>sV at u)vgmt#m1q^g8
zfa)q?Rp8h)kBIGOcCAS)#^?t8Ex?~k_z$TVE%d5Gr72nt^!(@75HY(CNf7MUe+2)M
z9C^K;Pd(RkM+ETiF>>BFepztSw3}onSnt-1xl??1 at Z{3*1*(>{IIY=Lm#LCsw=l2v
zd2_QI$GX^ubA0uC$=7Y4D8u@(1IQ<Jx-xDmPoG!B;^WwW;JmSmQGdO6-HRdzSZ^0E
zB0ZjAd1LdrM(HO%9P6X5O0~4;y}Ph^taHOWkQay<Mfr2gk*M;A(g8N?_Z%te)3~)s
zbc{Tf0_%B6T^DwhiQko&RFW$rVeG~U`zy`z!5tZk*bgRf^N4%Fp(pBOxPE_Jietj1
zrzdy#$P0#T*gG;N!SjmP9H(a0uJNVJJx0t{hdXmBZ(blZ?#uZ0?(^n09P{MKoj?Sz
z<vc(!&{se$>NzAW`AhJ{{{)YUW5YlX3_Th%k<Q at Im?QAZB<P_Y8KW2(yq~k8-{guP
zrV8?b)PQ60OC_0Ebmw(u7D;pmkRP7p%|S7_c7rFW<wnXdE~}dMtgTqf+;s0Y&boXd
zS<_&Kz5DvaG<!W}N}@eZD{$&)aLm(74Qif0g+GX68N!7#Je at A=3(ll%>k9z<?Ah5(
zA>{a_SqX-jz^}R6cE(^NonJ|vswp7vY{ORhnrj*ca#CJ$SRgN^+2Fh^Y?t2I<w1rD
zc)l6QJ(0W*@p)`i3G`h5+qB8k+XV`~TaSLoTpVj_FwWHEy!_)%R*9sZ;OCWDP1yHx
zRx>xmrwrh`QLrrGT71zF=eoRRDO*Sms9~tMZgBcue($~Pdk<dqp5m!N!e}nB<_kA*
z`T_n&$q82 at 4#bX0es=Br6 at brTbETMUrG0i>F;d(XKG4|tHdoep_rpfU^izM{$Fav*
zyTe-DaO)O#EAAwHpdW!pq;Ydrci{c?E!hCytvja0Rlo3Cm{4%`Bt03Y{k5Kv8mYWR
z^UtweZfTEU{l9P5ei}-PIBjB8jAnv-yLUKgm9pW9^Lnge^cLhp&>=&oZOiWKpN(;G
z2KwENq=rbpZ?eouHdm2=(<F)7J%?;6x1!s~pGzIVx73zH2mFH$Wa2bwp>}`>B&)t6
z3dun}1q;_GynuB4QG~n^@Kr{#U;Ql2pPBZk!Dt%jKR#*a;Ee?Pn3MMF=nfz+E-d+U
zTcA8ob7<vfV*`$md~A0SZSkTK5Bs~y^agjlYR;PUvd|Vyno6|}Xlk5Rs!_7V%CdUa
zVRPg6hHLSvQz?Ih8#2$+Z#19rcy|M at I+<8pyql at VH}GXnHE+kUie;;|KO^)tGn_s%
z6!b-oeP>khrlcc|4acUR0DXTlDrjxWxTNFuGDAW>Y+N$W>icYY^nQBd*yV{J4=!3z
zD7|C+1M5qj`CJ^E%pX#XqEk3 at jN|fLhF8tX+t5^Hr0xPtLAL??9QgJ-N9d-v))b3P
zOa^&%sAtDmkLIl4P5T{;rhq)SJf}K(dAO#Ys<UOO$QtOm{+YVar)2(q<M&2dH8{3%
z>7s~FXn3Z=-O9iN;3dgA9c60J`*`@A?~Mv|fUiw_%*xe9`4Jz&R@=gS-Zu8}Is7jQ
z&p|s03E*FLj-sU0+|w=KviMvWYgMSn+0D|}npc?DILyMasFaUm_Bsz+doP=4dL8J?
zYU%OJ{Re}eHQBTB%3wWxZgPtY1{O?n`|}tT`11r(w6X=gJj6p%Lf^<gh~+jhL+qdS
zgA5 at FskluM%nwOYnBY}1xx9mfxa<y;FYV~Wv3xZA5P|)$UR*Cx83K5C1S(F0?KKvA
zo1<6^_Z1=@iu;4-I~e<&R0!W|e<}+^V1?B6n<S3MvB2Cwg<jKmFZO-V=0Lv{d-k|f
zhRKC$p<xWLuV|Nh^ftZVW;A$lxLsT;oOaE*<E=CI+xu6O*sPKQoHp}D#Rn&yhZ`!!
z6$kAGetT(X{UM6J9O!|g*9YG(eYn0QnoiL%x0R7A)NpJHpQfgfO*X$goKM(8Sn}DA
zr&KXQ);V(a0zc=v&T*+eY3`WlZuxxCR~*~i={rHlle`|Xyk+VE`r31xso@@{dyidx
zf;G!DaN6b*=k2a<t1Attt!@7Z at W54<>Rb{CSb=5L{AWN<hD&Bge&YXeziDcS^?Sgt
z(9J{XGa9r$V?sLo8T7$kHxH5r5_APNk+JC<xKG_iiae;{lH?F<fNq2Q5-bZN(<oRr
zec^Kg-`29eSkfv-lZ~~Px*EEL4>m2H5EfGYGHXt=cO-K at z%Q5+--QOd<m0W3Rsnur
zSKhfWGkoRII&Mx!)pWqW;9=_POTNpvV;4`Z0Qn)mC at -iisCnOD;CEZG1L&_syqgN}
zC}Ei~347rLPrRGQ>O(R%dmD^t14-IFbFGU&0)Pn(^dde$4QA^Oyi?S7^N*C^n6zrM
zq7U>%pklp*aunWwlpj<NPYY0YRvPTzhAnGGb90<eE_f&vf&RNJ7_R22-iehNb>As@
zjbk~L!*{7Io=15fgD*9MJtn at iIj9}oP^jGl`xN+lvAcbfTJ~xk41|;e*bhOmw?b at d
zye9vnaY6j>J)CA@^>W>xF{!z0CUZL~TW}h+id+*<&uH*VE^*F;`BOPH>bW9nKFc>Q
zg|rCAT361SB!u<$)LS|;z at B~MwEnE2>P~D9riVFzd=PY}PH->!W0R|y-vaSuoVLw1
z)#iq`Jnz*a3yUckK<^9L`CpDzJYGHB)rb!K9DHwc9<BMJ-<^uJ-iBtdzsjv~tv>y3
zGHsbsCFo~qR<Krn%NwqbM}8We4Dyvd%`mS6&G)V^cV@%^{ZLPmO!&7-E+>Z_B-SU8
zPg2TZW^n^+*D`Iv-YXLrstE;yw|DTLFstZ7@(JHdD~Ixi4GO5 at yV3<h@=C896J46B
zJ^jjgFXI9n`+Cn&#gS~!QD$bA2=;=#LR}wkS-h9&<x$Z79_aOi&A<&YyH_yeFI%91
z{YfiP#eq08tk7Ym_Z`4rut2<qznZ)-r}H-^@E;~^5x*7`y^Z`ft-Ev(<jDyn?qX*a
zv0HeZ>@uK-p7myjiem=$SfgP12f*(ep8P9-S1uJx1w}|m-p%aOnRJIXZ{xxvdba{$
z{)bUPeJB&HR3uC6J`>~gAkl(hHyOK|JplA~>>)d-PlAR}9=eP`UR-b+E`a%nOTvWb
zCkiBaJgN3xwJI!>@b4@>IlelzXSLpl`ijMAS--qou_l+#ZG5lbE0FNPirIgW4lJ1C
zF<7u0o&5s%_u4R(j5)_}oJ^W4V7-F9#)%}%A^byAZdVh`@6k5)bhS~<qy78>=Sou?
z^RFF~wcEO{UbZ=Sn*#R#c>BGHZ_n&%jHNc|S^)n}+w2~x`TSM?p(eBD^I-p_9{P4F
zT$vG0$4I$U3y?olm#7HZR(+X~EQ|18aO&x>E2(d+n%?`ml>vVRCb?%^ajvBwD1Xx|
zg!jAHC&E4>9&1h6+SLR-;DY3^E7E$le7}|HeqAAXZ!bfYyp=rYULtrl4d{1yNFVu%
zL0`krxe_TK<V6S1RmE9i7ZB-Qr^^EU-x{K!V#d92_Pd5JNdWulph}a5X7-IAa#Gw;
z)C2rmkcZs=-V;ZlXTm={p%8l at B=+B-zl}q{7x3T4=7Vv~Ep_(Q#c2oDQTKA)>ewEN
zig?gpw17e+C?kJ3+hSH)TDB0U9pZqzc;y#<EZMIJ^b5wbk-cUk;5V=*!@!;l2zOJ=
zXky<%D##e at 5iGbZL571e3RH}jP(OpdLGo51d$`j1&R15H71$?ogxmg+>AfK+9i<#1
z>=ijK^q-FW2i0oI-x2a>jqHan--B{G!QR-F7)q~o_|#;|I6|!7PEf9<m#bu{@-Eqx
zWF{oXB&|?&*;G7-8!+Uw>LiY(8&ZBHV>Hf97SH*@5ui7B()ntmq=qBqPOt180UwWM
zq=jP)EL#1o@=oB_oQw<=E&4~gqh4No*#f|K;Fd^Aw)!*G<Ynz20e?w1)HQ at Y{ZCvy
ztO<Qz_2O6Bz8tRFtbA*yVp1*8tJ`l;WUzeHNkL>qW-AsD5tGMYPNo&)mZYR`aM}rh
z&kZsf`l{Gpn&u1o=M6hNQpIr@`>7%j@#La!;{(pOJ~&_~3$e_(84L3NX>ecY6Yu2t
zEk3slCc*QYmrja;*=zLf`>_ULeQjArQCGKqoYBi0M78jI`%bC;eT1_WZi=}I4WK9Q
z8h6sk?@OM~=QtPvJ;}KX*tG_I=x=)fdy0nBvkq(Q%NGX%7KLQHv|m=lDr1cKdgZRf
z^L1|0ag(uKx?XzhX5#+(?TNcI!!oC!7iA;&<rl?FH$B~LuF0~l%0MA`i<DG#E6r<e
zOi8VS`E!t0JcR_ILE?Lv!&+dE2-L(y at +IOR_?n!8W1WP*%Hm(~sVlu11^OB+326>@
z2mhvXlWHOt^wAqNuvdv|{I`32kY_b&J^092j1U9#ee*6YibS={qt>GRJlN|hrbkak
z)7ONXT}$4 at +=o}qm|(d~7`G!o{`~K0$rEr|PC>)D&f9!f at 78&%ji2FFj^^`!%Q-l_
zCDzI_rtb-kX}dC_JXL9A8YxlP0rb`Qw4qaxDPvs74EU!|9Lt<DL3wvk$rj(~PYj6o
zko7!s<<=d^3!Z!Mi<J`r-ZhuUwHiyCN5WYIeQpU2H`}**cEq=J${L`5%BaUkkzB2(
z+$m-^2>-*oj(#%o<oQ%LpG({C{v{-@@ygF%Ff2GFZZu58!2fK|Iv!=!Ebt5DtScq~
zy$Yy$k)G&1_s;o5jsvXc4kBf!){JTM9ISAw0Q*AXcdC={<uJxN?tM01)pY5MpD at lV
zj%Lw#h7a=b#zeg-`<*^Smtct)&|lSqg{5PJK8qJ;&~{+^8o?gsoy;4fthMk;v7>|m
z^24dpG2wbwc|kMpuGBCe$Cy0#q)vh3U8U at kn42cpGt>^<!Epo2hxUi~DB$~GZ`2DK
zwHJ{bVwLp>{h5WHQZZ*vtQE_d at OMwJ#n0K}dY8-UWde|wG`v{t*nzCOGh05*=&J|*
z8kU1^`1hp>@RI?3{J4I>xTODX9Ev$$bkVnnIW6bx&aFhTZ%A801M#X2uHn-|v(4Ai
zEMoVVe**kkE_;wYdtl4zRrcA_0iW at 1-{J(yw)KBfXK7+E-j=WbCpmjeDET1iG^QgY
zGa1I0ORojFuyi)luiFE>_%0Nat}njn6=B~Ql2&Y^59y3 at -ePtJTdFmgg=5bRT(Bz*
zyDk5ro;2UY0r)eRM$yBRep6*~imUz<Ip}we$+<acLiWarZZSUyukx#3 at yAD>yNfO)
zS%2q4Ji?h>9 at UF*-mv9;(`m3CF;$j2c9-f^rMh*EoxX&;-yd~4_m at zzdBo~Ag$SF5
z*3VOl#V$A}1oqW|yfs at a(YRr)n at l4mzjYV@`*i)W#EAAWdB*2;QkXz5dB0P1KWP at J
zM?1LYx&uGIyWprD*{HTp>6>~sF|KDH*BpcCBpsa|Qq%(esX!2`dj at l`G`#QBVikyE
ztf09QUyya;f{a7r>i~baTgioFIw^E4X@;_m63F|O55^aj8KF9~Q`x2rkk=RG)yS={
zXIR`V9qa-8yCJ(@v(;+UzA5!%<v50>_S`>iTGViK{XL78lb~<vR&@09`wL{_W!jY+
zf5a<*_Xy;I#rA_9c7bKj=V~=z01tv5cJT}UCJK at H(aX~K;0j%@;EXK|QIR;Neig$)
zl~;4df(uFL?>ns|%Vl~;Iak#$(!n3aJk?ZM$b0<4ZZxPjO?Lr*++K6WCp|Aa`W}*_
z!%VztDC~eycGr79)`GxkW#e(0MY`LV{Ps`pGwy{C3J1a74ZxyoSy{P(wd>olJmCW)
z^$iey#3n8smMUg;;F#`~391ovTMRQ_>&FiUcrMpSVHEFmJkJa{*$@8G4fIE3&yBv@
z!;^1wCuf5Gv5{&S>{9FZ;2rVdaRJ|gaEcXq7ujo7NdTuG<Uuc{viQV)QC#lecTa_o
zyrXx8QSENs8uB7rX3aeuD{`Gk(Zv|db>+owDXuX8ycqH$y~d5-%yO;U!JfIhSaLF(
zRWiS2l7D<9*z4{0ogzMK_ig?*{>$wK;P2|@*- at AHSx3_Az&{24x8C|(IsC=y7vq>u
zm8okXzLjMW at zvTzKiYv_#0UL?qlk=Gmp()XsoW$_0{$N0oz8l#yl1WTyOkpMWuRYL
z<fSdDHKcD^{U(ExA)bo{?~hNhUq at m^tY(Ud`z<_~ZeQYA=AX)z5FZHCT_6Gammfni
z9?JTG|6SbKfMG!Q-~7L8a-mj(s;`nNCX<hd{(t at j{&ZFcWv61zuvt>_I$IOq-#5#u
zO^Y3hugu%MopePMtu`*^R$+#r0 at JAS-d79$^wdA14j`VXE-6%*=_n*`U2Ffal<Rsh
zjwMxAgYWG)u|2_jKmAQoqkal at 9q{M6UCS)tg(cZgCsYOOt%=8IYD%5jgAniQI(r1i
zmZ<8)3ghlOo?&i1sUC_~RT-G-2;J_?_j7MFumJt$p{1kxuzgLQN*k6!0{K6Vx+|(p
zTM{L+Q<$Pq at ZW6WG~>F at mBb~-Y%m0W`z6nU5{+q<uOIB$hQOYCDwwTh7PHqWMO`nH
z1oFFRQMIZ{|LTE!@ob;e2E6L6tI<K*BR=AyDg0VHbMQ}iUP at Q8uARkf!OH~tH%3Fs
z+1Bq)c}**^=C1(yxA7o-p4)fssPiq;&B;W(A~z~uS|)emIB-boK%VgqknCG}6k^4+
zW=4K1wqB{m8T<X1NkU28n2KG5z4|aY;l-HaYR$=xOt4?u6mycUk^j&+Y8C8U3G^#P
zr*E7|p}m+lWn)YW$j=j5kBbTm-dKO%<nJa1doj4O+XiX&WgK;$Ze#%VrZ{PQFi*cB
zv(raxRRR1v60ZdBJ(2F9M+f*3{7$2QE+*4Soc{^_rAYpiEhU`S9 at N`I_)j0R=?DFc
zQcNhDT#R6Sm4~$bi>R7oEzV`{1N`~elxQdIa(&q{`Rkfu9_X(n=QCC*PkHEe&HqUG
z9C-fM`1DnW?XMeW=x<Qg!>j&0<j*Cop1I_V&)s!;HDK?bWyGxDpOHl=BBa#{z^9Xr
z`loI3Qi<_xEy5ls{q3V_kFpCHLYknqV7%bjDXo;%`BC;54by4G)<$S$IZX35)cPF$
zYoa^Ie;da*HS8D6u!{5I8|Z^Oo3EXO*9X>@2RQFsj8_%jpWi^}KN{1NN$AfhO;=A5
z_N6i->9Dz2NM63nILtR}Dnl)lq at 2V6e*o1+SW2 at 18i8)bs_^}(6C<h*8eF at 5w*KuT
zfJax>p|H<!MUOuih3GDY_*XDBRnwg1!#7}(vcHAE`)=DJTESlT7cZ7pgFYTWGR*@8
zrPjlff~|QP#P~C{&!_&%oo1(Q+W{fjW6O%v%(>QL`xBIsDR4d%SaiT?rM!nVu&F{j
zR|Wh%bl$8duJ at g6e~2~O4D#UOpj}AZ-Q`0 at LAnYZoW@Gl_8wqMf`e>q+<3SD=70V@
zR?B?<Oiz#>Blsu6fyAGGkAK>ULN)v#-{7vqU*@LQ1>f)M={dyTWaf>&wwnRJA43Dn
ze~1e)VjKtiCQFuuV1N0=N*gfH*FFf>LMSWu4n2m>1b%F1%X6kSsn)16ND!rl{cRV9
zug<&XuuRv%NXH)JiFIxI3tvXoMA4n4mqG#ljLT8<TIac(`Pe}nhLG&M?D9ja^?)FZ
z85*q&{K^~B+|g~il}>0Z;Q!ednB!I!8$VCm^O91b4gQlz@=L3aZw#3ckz)P^;^FHh
z(e5bgNFKaEashsN`RgfC|BQvHzAw3Zp8~z5WUC9u-Az305S#0;t`$3^RFaO>ro44k
zysYG?fj>dLM554`FRoOSODhn_69E(A(L<YqoHykvTLM421(EhOa|`%QL4-b_NwX&B
zeTgf2 at _kdjv=-=(?G})*vJw36X3}92$dll#$GR-tnh9I%g2pKzJ|ae4d3t{5t-9-F
zJ_z`IK=4q1t<f%0Y?Xb at vSE-XHYr(SN>uVAi{CW20sV;GN-{;(AaAU0>eg?8`C1ff
z!ScWTVZ5Jp6MVn#;CSx=G^jYnMpPmm at Dtwz_j8p0Ro?$cW7)`s(9iq-(HO^ue%P1(
zp$i)3`$Bv~&QoI@<`1%@Tp=m}d(K-Rw<hR?ulS0J0Db~Dc?K~C=WH(0BjW4hS at RlO
z22mY)MGFA>Vk17>^_QZ>&7^XOf4Ye`B0(hzM0TtXD}?0DM<b0o<_uQ4_jn)JUJ3d(
zW6rqi9q)5*r)I38fc#{pJ0-NS at z*<BONyodKfaduXnUc0ztRhdDa3hn{${4qUMa83
zzntku#0v_JPgL>Xzi0VWn8bLHacoVxD12G>>V+zMl~M@#y&&Zpw!3?&rPa4I$MnO%
z&r}~$o6pcp*?5H}nh5x|QKCkyTV at i*t=VzD8}Px4*L|j}qkC5UgV9ttk2ulmUewBW
zt%!RY^MV2Kr4zh@^ygiU3zNL+=~S at 4Tix!b$8(fpm05PI43OvR(WDqvM~!u9CV|dG
z{A78SZd4Rz&MDbr#v<si%dJj-D6V(KQLB3fo58<6<|YPrUW_CJzO_dDJ&BMdEmQcQ
zQk#gM_#1&Z{PmxW at v32|R9?;9Q>8j$B!c}Wk)YklTxJv97p%sg at BgF+92*3EQbqTM
z=wTDV at 3dfkPcR$gfdHM57J<K{kjwja^WnUx?2FcwZvc-PI8Pg~KMh}Zt|9za6mW24
zJS9j|KC*s12dq;T-!H!U at W}H4BB at w$LUB#HFc!{dc>RlQAf8^Yn2Us<FPwk1GI5eW
z at r~ry?r7uURfj$H78>f-Y}vBvroly5&_}$1$(t|aEXj5r at jq!5NxSnNexK2pe%k4g
zxdieL<{eEpZSJ9`cAee8;KTXxiN$Jdf^wEK{{<6sg!w~UA-+`4b>=t}Q-B`Y1U^77
zT<gaDA+swd5cn?DZ*wcOUNzkjG(N1i(8ur-LaaE}N+V~WrvbN8ef7pNBnAF{KVM|7
zF)%gb*(bvrlRn<wV3{f;2YRhk!yHlu3_QQRwgUXt%MWRJ#TCB$KB>azBgli5_jiYV
zLxLlBF2rt72l>^NB~4KH%iaweRq8^#oObMuT5vBB4PYZH1@$L>{#Wt+ug?QLSALZX
z=o_{j_kk0yG6MfnWJpPZSTg8~&p)64iT{5cgFKLeKcNKn<$Pa$A at DyzAE7j7jwv%a
zmj(7YAus-Ef6#x*4^Z!k7^tM5^T|gp!k>kBg>)9`K<|)<J;1|h{_A(T1xg9}lA=C<
zSD&K)8r4O6mRh#%F02adE!poAUv|&*G)qm&UJm?TzcBbh{EL-~OqpBgAHW`3FYy^~
z9=iSct<Ux^K0$o9U2!_o2i0}Q*EtlEfWG`&f|4y>`Q4q{7M)^`fxh59&hSgP``FjR
z)WAXy at Qv>4e)r*W{cB$yA>>IgwI#_*+H*MnGv_44t1-FYv94K{AKwtHtGz%^e8FW(
zwDeYR9oLYb2=M4oU!p<A$caj+i at Oxy&mDL%FWOF-M%E!c;wV_6Xr+Pkf}vW&fGvX=
z$@IG*?*(0kvybe1UTVG#GlBKUTL$kaz_uSAudr6Y`ATr&crkIF0K9F3+<wCEzm9*o
z{Pl@{+$ehYVV~bzaVp?X0{EN^-a{y>YW}XD^Z&&EKk+@{UCf8|jpzf0-rp$x8{Z_1
zFgBT?1ilIS0OxZ8VT2LS{}_*OJXh=I{6F#kuj8NoD;RixzaMBbV1<Ah#ELp;wX7AR
zDjjz|yKX~_<64S2$w5dCerRmFb!<wBd-rGl9PrPR-VTjXqp5@%Sv+O(x`gDlE_R;e
zk0zm1-SUMq3PAqEq%X}WcoWPL`}4~HUlN{t$_C{cordX$4fK-;e!r+6f7sE|>|1g_
z-4pn4)>4ZVdP!SWb8c=U at EPpZGv3EQxW!lhetZ(_w at ZM>J4tWJzbY>ClYpNy=NwfJ
z=d5NLKj!Rlc!1OF&M?NF)U#z~`<i%H7C`*p<>BM{s)?aK<Z_cwD*@k22j?PGe*cU|
zMy at j0%WxhkB-mZb>zrApG9oYKLdfQjuoX6nte^1uuj4<s`Spq3tll+4o*-Z|2zjO!
zY|}{gWsdj at f9nIjD%L=R5LiF-1*x!^`@z?ryMX^=yc^qv72a=b@%0}WBO%hphDb6j
z1S8HzLBAX!Ghd|9oj73Mg8UEcLu)v2jtbYv`6)<@#1Zoj=wl>)Y0F6|8AqHsGk at 5#
zVEECQBlZkVV+#;|5T&!kS%Oz<Abu0b>z at qvryS0M8%b at VtBb5R)&Jp8eKDi>vcLA9
zI2M!E`-{e|F*Qox$Qu|h at G7tAjL%hbgSK6 at eQ9JA3-a08XwpJ;(!4f(Y+cnE9LwTG
z>#B$Tf|aP>EUGMpcm*%^LOZ)}=Fny~v0f~g9g=#jxtq>8pHxi5zZz}sM5#8a`h&j#
z=P9k&^9c3zE7oAjq3f86K at P-sIHX@5%<)#DlM+Koy%66Ha)?iF(RBC`-z4x~9Xd7I
z5?h10MVtcu=muzfWDm2w;;!)ZAl?e`+8_LGGcYq5@~uGlAA>|20vlF*gZ~Wwf5&?s
za(9os0rXAyhgF07j{ZHSjo^Q-BtvGT&{a?fd>~2K$#V>qvHaNNNAP_f#25K#fS(2~
zvHu}LKJZs_lo at p5Jd~i9V{hnN0ar`C1)z_Ir3g5 at hMP*4|HLnh85JhZ+-8D)6vX-Y
z2rrkgxWIp4e?Wf4N0_^em><S+sV$ji>&P|n2Yw{h1MiPe00-!YcwcN7+H9)GEQz^b
z1MyGJ_+zsX7d;gR@`?N*=~THDfvFxK=Nx&f`Q}bR@*8D~7?W$(v1;eRJ`7i07n-|9
zkI3j)4){r3+Ca&oGxQRD%h at 7`CvSCG85#U|;v2PC+xfNzt(c9{anjpVo4Y3Y{k(GU
zH*jic!Y{AJi1RD>UCD!xAHnvDR6gvOA5gXz5&4nnR$l6MdWK9+r{gOt3D|pUb<W!A
z874*B|E`-J4e=#;XzFog at NM_lZf%G77J5MqX at m7jZO~i=`3HQ2GyAEEKG{;mjsFb4
z|JnV2kALF40Fzt~`KuDV2Ed=Zx&8#?HjN1Iog|!w_^*Sh4r;kdwWRjY!$0Tm?;jW#
z9tQl-0&KL85uW+TMZ>GUw+|3Aj$EqQ|MonNOF?S=N8^Ek{(c#V0FW<`q-bcM8yCI&
zkrCnl!}%(r{ykqP_viaSBvLsL)DQfJDMNCLEr;d=@f)Cre at 47@_QCoqwGVJ?9%cz&
z_j(S^h53=RL-;M^uuVC&IRWhT3L9w!b;B4-wbY0gwrzNoB}q54+DBO0>q=PI#Cg(7
zlWyI<=%e<(8%>4voZt=49Q$20Afnv1IUD>jcF4OpofM at Pq_)t5jD<L+e~}hXKCE4?
z)*R7oD~9v+s0ow0*u6GGRGGFy4X4FS>NEGbQMj?e(svwJ1L9fECcUlXe~|vbwqr9O
zekZ8`c{o=w5uIi~v1uKN=is8Js1=NzA-3%2{((S7uK(TfPx<)+pz|UA`;CB><W!Jd
zrJ*3vAN+~Y{NK_1-_iWv(fr at h{9gf)zcrfwJDUGHn*TeR|BHB|`M;z2zu=FI=Kqf7
z|BmMWj^_W4=Kqf7|H65~X#VeL{_kl1?`Zz-X#VeL{_kl1?`Zz-X#VeL{_kl1?`Zz-
zX#VeL{_kl1FXUs4=Kqf7|BmMWj^_W4=Kqf7|BmMWj^_W$<)it(qxrx6|6 at MzX#Vg2
z9r?eQ0a24vWP|6qk<~+0-sVHjc5C9zM_<}+=q<Ferf<PW|A3x(^ZC%@caUh9>jOF3
zRUy*qv%;6dCeFVy=R*%)j5$G(8Q+^0?96Xq`a;ddyTSJvods_;t~xhQvfNyBmG;oh
zB<4|K+quksMn at RrRB-d<?W(<#huk208*=95Rcb-4Bl*oIP&L$a$S=<fTA}clq(2K+
zCVEcrOx8Or-{4fPhM7{zp at wU5t6pWUcIu-Tk4H!J%pj-#tJ8K3jH08gu1q at wHTh0$
zmMzcbXG|*DX6?vpg73vFP$Xbub%&-a5{RBls4)-?ON;!G0!kOlpk{bpGIc*68g#Xw
ziZTl9r$K(re8u-lSC5%#?oe}CdQ=v#89Hsq>Agb0y at gjD?@3>Z`6XLRn&eQ4DSAd4
zi2K$UO0&3Z^w#{bmyq1N3NwDTG(8~YMU1A=8mJ-J_(kh9off)kRppgM9j#tQ5w|wF
zKK(^`H8x#o1Js1RMDi at e?qv at n8G@P$sDY6DMf4bjDh8;bg`Ny9A888 at 7Q4H5XyxfZ
zjZv!N*#(=!GM5s1gs%gfNwV^+2BV7BL>me9vYAkmvi!;1nrJ#RNtyY=G<YrKyq}um
z@=S-qxo7*uxU&V|8?#37N^e$@OhvA*SR;I3soCfd9#q^N%T4wweu-C2 at Z8O<B15 at 7
zBV2hE)U4cj(K1yiC`ZjLkLbU`eENksai7xVwmTi(>8U)19vMk;Qm*uSgWrd4?MfZ!
z>7b_wQ^uShZ%29ZX2`jpSd*mbabTslS*ab=R0|*MBTf0fK-`(hi}4RXPJ^8LohXNA
zSQtCxtQdy?{%r!WfEQV4CJ}d{N~p1d9?o?m;DAD?9H1AfTYCZ2oaVD1`Kq?p1AekT
zJ?1@={iA+39}Uic8lEg+9xp*#pgKV*lmaysg^AB}3{9^*a@?PPpm{#v*KF}73egao
zq=8L+1n{g)Qu}4s>V=2?Y`DS*hZ^&*d&k<EHk9l*cQ47t32Mf>55{*U^gi`vnQ&R#
zTD_)E5B_qFlc=$7N}RJEr4 at S|Sn`mpvCwpHZZ6TI3VT?nAnlc=v()Z{eJ3pxnJWcE
zwDLnqEv~2w4_qs9*f$VS_PjStCHuC39pDW;R3;&cRJAX0%ko=Bn*qMtT6#7kw-2Ui
z^e{RL at GIbnn_<7~9Uh8tL{G98P;tS??BClh at M|oD8e at 5snQW$n-H!6Uu1tvnda~)?
zh6JcyV7A=G4|)=y*6}i;>6`%7NlBi7KS6IMLbp5Bu0oA0tT%35p(f?y7;~iyN!>(`
zk%<o{{EF$A#OP73Z1m#cnC9s%krp&sXd>m7sp2fu)ZLz?l$WNLe44TCu*qkU`S{i~
zlw(P67WdR|*i^fr6+0pIu4cS&y~6(zmXgX5Iamy2Rc0m{27WqM?w7h1YPcn`FmJwp
znQ_LmnD-Mz>c$?||9Wv<x9ZqOjf}O>!)^K2Dm{t?rW;7%Y&VJ#IXK#N#Ge~Zs(*3w
z-Pk^f$lNL5K}GC#+a6n~-^W^CA=xt^@*`K+eZJ=le|W}U06&5FHBWWu at h}fcMj)qG
zQV2b;whhIjL3Z*jD%3QM^l<$_QFaG$OzpR!xY*t?|4?fn{fQlc_f1S{ZN~_eXHjI>
z29Q7cNi}i#(+YKm8E)At6QM at D;8Mh+_V2lu`MTdJy}}2R=Gxn04yRDTk~+nuo>s4M
zsqqa<PwLNly#M)7B_?{t98fB2uMOS1bPV3(dIWl!*(e at r%sfS*_kHP4gBn?rjO#H@
zm-ZaEyu;QMyCfw4waxbAt&4om=bO2wj?V at 8J0uO$IJ}GzLl3-Nak~{ecFUcFH7>qV
z$L*27gB~{g5b-sEk&99gMW#yBoUNDk+?SB8!!B06dh1sRJ%SEVp+^ADmLM5b0X0lN
zdW8J!X)7|PcwD;whlWc~NET{~`YckXwc1o~)=YfN4NX5bGgA0KWEhiEAl=__<36t`
z5b#HxQLeJ0IYIug(y+PV2wt^RJZs&@n8v2-&P_&p^q^<Too`BClBG437Em$+J-yx?
z#Ym05Irr!9JL`22<jels%$-=Sy~$cdo6ntn&@*oBaHKc8Z+wG#ER7T{d{C at Jj=Puo
zVPQet;F$0JLULQ6YFfdZcAJ)YZyhFZTQUF5GfAg*7T^Kpn at YW4Kd*mNsIju@)w-Qn
zr92bpA=NCNEr%XCM;(^ZJ=ekh=gtH|7-A2x<rO at uf32YzsbPa221H5SHJdL`BlpHe
zZ1{sZJW&|*0C>n#Od+^OtcZY~c~E1z=VK_H<8bBqM$2 at PJ@gpZIUFHJ(DS2=beIw<
zav<5gj4!`iqZq#1Y+0lNJ)|@v)V`qd0H)r04#g7qixmbvPZib$&nBceJcphHb7ds;
zY-JZCi)%4rH_&f$<Y9ZIqMpX3UD}ll=z&%zj=wst;a%sZ+JrWsAIWBe>Y9rw_O+GC
zhZ8r$^AeeoCbrk?ds(Odpg+_khKQ#?&->Ry(}HwcqDN|^283)GTj3_3srYBj?T;P)
zTaDH~YkX-43R^{jeSZ4fF1~^_(&OR4+-y`TM{TGKdV~-){kU7Dl>p7){j!IcU)qy{
zo*c$2{g5;Cba?7Em~&CGrb`WvXtD+QKe^<sb`8^Xt+$Gw5h2g4xC8n(wBMdfAv$q_
z{a{@pSL*PG9=-0+18^Pa`vequeaFSOMboz$O@|&?3zEbMp0{&s_W1ZEv8M^i?T2V~
zWP3X0NJH8;OPH_dtxS_8ExP69(G-IL{x{lyngDu-{c0nq!3rj7C~c4ppr{8){~i9T
zWKy|A$jhKR((QlN7)ruQSV|>KX!{EMMAR%}SRv2{2_tG4q3193Ovs?~=kw>oZv>3=
zP!T~7jECHIK_$@7*DUzf$n_PyK_V}s0Y~ZeU4~PZKK<02dklIM2YjT&VPvu?wlTNz
zH<3&87rUTNN0qe9kMxDO0Q4ERC;jEC<qK7+$h*`FMbQo(1zPvBb=38G{emI^KGd|?
zN-q<XIrL}PNk*v1+&JJ>@l{`1P{UtS=NO-a8hIWd3XlkYcw+65n$ZA}je<ukNn!JM
zP2i6LP(IXf6FnpcY`GTv4W7rxm1~TQ at vxEpL8e8?1;qOT_C=!Lj#<KNnh)c`9{Eo4
zbW$2N^Etp7YSOg>^a|qNukc~}5c2j!jW~cKel7hfhc+J2lLO%Kl;~L at MO{+pRfTD>
zhr)KW%<M at QD|J$4i4r5fJk3uTWAf2!&5?N&kY|sNh_%N#YUf4O)=Box6q5Uv8LkN5
zc=DR^G;hB*cU!SHm+xJ8Hb?Cv_A5gp+8uh}+YEy~8 at br%$9~1S-?aPHpkh%GHM0M|
zYv$pZ)*n3zFrqz5bFE(&chvqJwSPzL-%<N_)czf{e at E@#QTrEq2#nglqxSFrH})?E
z?XE>SsZXBnRA at Zje6dBF@+b7k)4w6r*EOv;3=W_VA7W%A&Hl)m4B;fnXMZUl`c~;r
zKj0}BZ!RsK@|M&KzdJD`9bkS$IC_a*N-2ZF2M=OulAa%!ld&vOT_?#1uUdy@{S~@l
z4e1)g)F>VLv|XmQPqr}{a*$cc<A|87W_yO#8O-e2d`zcC9f`jE=DWA)#SZlyN3MNY
zYmx-te<UUOvy<d&2J>0cnWAT|5hZO8&(8J<toGPB?-}%^o`No*tirz<_9<>FUPB+J
zJ6}VHzUO?DD%FCRavr-eOW}qJnw!kK!h)cW$MXe>eTev-1RaQhwMJ{+9PYeDUgniJ
zeh$O=v5>5L$SA$c{ngql90rzjKomVO!Z~bj((Gkqz0`HX&LVS*i2mw_L%J>2g7gXw
zO{A`!_&IU!#2HSv=h)i!`H39V66H~OlhYX+4)(k+nFcYAVDWw4n2E2wj)Y{werY{*
zNL;kwJ?|TmiOUYPnma}y$pt$L3zOHmgTHJPl5KZDpMFkI>psot^P~4cUn7^RQFbvk
zCC8+DX3rT%^l2{-WAQ!nNahbkwGa~zdpu0)y;Hm`MD*ukABdr~Z+vg?At!UJPsXAW
zi?O2UC9{%`j`d#>>+Agi-+UbU=7_$Ei|)Uq^70Dg70@>xeA+&tR7YNU2(A7wIMP>K
z;vxu%Tv`c0EQ1(T*5G2o!+MQ;z^84!N;U5B&alm<d|z|#eTzn`!-;?|Mr;*r*<|jQ
z`;J&Emh;CFyOUeq{_-*G_fVAFdKHU6QrMsIf<5O>mR3Sc1{ceboEwO6!IE1SAm$A|
zX!S_XF=$r22jG*8+Q)h)l&owr?n;97^oe at pQ~9UB$KK5^1bWHjNm8kj1ldZ3G5l^H
z^ig}aA at 7<O>FGaW_x^Tjy-1zhDs#WYd=skb#Za9GF_b2VneOT-3~X53Ic0DR at qIxs
z@(L(f<T|C`%%)NLAEp2QpXomo0$ifR++R9gms)R#OEdq-tq2gA>qLAn{q%O$@8nfF
z`2J(9UMhBCcEz&0hGm~;)~Q7jzda+=T`E;A*Ux!Hw{e2rz8m-DmhYk6%V_Ix&Si*Z
zojYYvS34y#_E?eTwbDx>hfU)a$6g4qjk#h;T2(HAIFQ?5AL8{1hCSs@@Y at IQTL!3S
z?u7BDHJ`|P+IP1`Z`xSe-=b#8G`Y6tLj74Gd0}m+yRqkrm#4<0Y_WdciY<w#uNE3w
zSmouFq;L%WUtfPH#28!6HH=>$d%mprSVw6?;2VzUDn0Q*!@OsUly22r91Moo-3{LG
zUsP#={HekN&IUzZ`VX6PPuuGxlE(K&th)Pu`aTWTAc~$@7{#6$Yv#VhQ>=9~{9nh!
mGoW9QkBdKa{3N;nbG80;Og!^5&RSJ<;liOq{}yNdIsR`bE+<t0

literal 0
HcmV?d00001

diff --git a/tests/spec/khr_texture_compression_astc/khr_compressed_astc-basic.c b/tests/spec/khr_texture_compression_astc/khr_compressed_astc-basic.c
index b2bd98d..6867db6 100644
--- a/tests/spec/khr_texture_compression_astc/khr_compressed_astc-basic.c
+++ b/tests/spec/khr_texture_compression_astc/khr_compressed_astc-basic.c
@@ -23,67 +23,116 @@
 
 #include "piglit-util-gl.h"
 
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+	config.supports_gl_compat_version = 11;
+	config.supports_gl_es_version = 20;
+	config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
+
+PIGLIT_GL_TEST_CONFIG_END
+
 static const GLenum cube_map_face_targets[] = {
-   GL_TEXTURE_CUBE_MAP_POSITIVE_X,
-   GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
-   GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
-   GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
-   GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
-   GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
+	GL_TEXTURE_CUBE_MAP_POSITIVE_X,
+	GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
+	GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
+	GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
+	GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
+	GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
 };
 
-static const GLenum good_targets[] = {
-   GL_TEXTURE_2D_ARRAY,
-   GL_TEXTURE_CUBE_MAP_ARRAY_EXT,
-   GL_TEXTURE_3D,
+static const GLenum good_compressed_tex_3d_targets[] = {
+	GL_TEXTURE_2D_ARRAY,
+	GL_TEXTURE_CUBE_MAP_ARRAY_EXT,
+	GL_TEXTURE_3D,
 };
 
-typedef struct _astc_fmt {
+static const struct astc_fmt {
+	/** The GLenum for the ASTC format. */
 	GLenum fmt;
+
+	/** The block width. */
 	int bw;
+
+	/** The block height. */
 	int bh;
+
+	/** The number of bytes per block. */
 	int bb;
-} astc_fmt;
-
-static const astc_fmt formats[] = {
-    {GL_COMPRESSED_RGBA_ASTC_4x4_KHR          ,  4,  4, 16},
-    {GL_COMPRESSED_RGBA_ASTC_5x4_KHR          ,  5,  4, 16},
-    {GL_COMPRESSED_RGBA_ASTC_5x5_KHR          ,  5,  5, 16},
-    {GL_COMPRESSED_RGBA_ASTC_6x5_KHR          ,  6,  5, 16},
-    {GL_COMPRESSED_RGBA_ASTC_6x6_KHR          ,  6,  6, 16},
-    {GL_COMPRESSED_RGBA_ASTC_8x5_KHR          ,  8,  5, 16},
-    {GL_COMPRESSED_RGBA_ASTC_8x6_KHR          ,  8,  6, 16},
-    {GL_COMPRESSED_RGBA_ASTC_8x8_KHR          ,  8,  8, 16},
-    {GL_COMPRESSED_RGBA_ASTC_10x5_KHR         , 10,  5, 16},
-    {GL_COMPRESSED_RGBA_ASTC_10x6_KHR         , 10,  6, 16},
-    {GL_COMPRESSED_RGBA_ASTC_10x8_KHR         , 10,  8, 16},
-    {GL_COMPRESSED_RGBA_ASTC_10x10_KHR        , 10, 10, 16},
-    {GL_COMPRESSED_RGBA_ASTC_12x10_KHR        , 12, 10, 16},
-    {GL_COMPRESSED_RGBA_ASTC_12x12_KHR        , 12, 12, 16},
-    {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR  ,  4,  4, 16},
-    {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR  ,  5,  4, 16},
-    {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR  ,  5,  5, 16},
-    {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR  ,  6,  5, 16},
-    {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR  ,  6,  6, 16},
-    {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR  ,  8,  5, 16},
-    {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR  ,  8,  6, 16},
-    {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR  ,  8,  8, 16},
-    {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR , 10,  5, 16},
-    {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR , 10,  6, 16},
-    {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR , 10,  8, 16},
-    {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 10, 10, 16},
-    {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 12, 10, 16},
-    {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, 12, 12, 16}
+} formats[] = {
+	{GL_COMPRESSED_RGBA_ASTC_4x4_KHR          ,  4,  4, 16},
+	{GL_COMPRESSED_RGBA_ASTC_5x4_KHR          ,  5,  4, 16},
+	{GL_COMPRESSED_RGBA_ASTC_5x5_KHR          ,  5,  5, 16},
+	{GL_COMPRESSED_RGBA_ASTC_6x5_KHR          ,  6,  5, 16},
+	{GL_COMPRESSED_RGBA_ASTC_6x6_KHR          ,  6,  6, 16},
+	{GL_COMPRESSED_RGBA_ASTC_8x5_KHR          ,  8,  5, 16},
+	{GL_COMPRESSED_RGBA_ASTC_8x6_KHR          ,  8,  6, 16},
+	{GL_COMPRESSED_RGBA_ASTC_8x8_KHR          ,  8,  8, 16},
+	{GL_COMPRESSED_RGBA_ASTC_10x5_KHR         , 10,  5, 16},
+	{GL_COMPRESSED_RGBA_ASTC_10x6_KHR         , 10,  6, 16},
+	{GL_COMPRESSED_RGBA_ASTC_10x8_KHR         , 10,  8, 16},
+	{GL_COMPRESSED_RGBA_ASTC_10x10_KHR        , 10, 10, 16},
+	{GL_COMPRESSED_RGBA_ASTC_12x10_KHR        , 12, 10, 16},
+	{GL_COMPRESSED_RGBA_ASTC_12x12_KHR        , 12, 12, 16},
+	{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR  ,  4,  4, 16},
+	{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR  ,  5,  4, 16},
+	{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR  ,  5,  5, 16},
+	{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR  ,  6,  5, 16},
+	{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR  ,  6,  6, 16},
+	{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR  ,  8,  5, 16},
+	{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR  ,  8,  6, 16},
+	{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR  ,  8,  8, 16},
+	{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR , 10,  5, 16},
+	{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR , 10,  6, 16},
+	{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR , 10,  8, 16},
+	{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 10, 10, 16},
+	{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 12, 10, 16},
+	{GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, 12, 12, 16}
 };
 
 
 #define REQUIRE_ERROR(expected_error) \
-do {\
-	if (!piglit_check_gl_error(expected_error))\
-		piglit_report_result(PIGLIT_FAIL);\
+do { \
+	if (!piglit_check_gl_error(expected_error)) \
+		piglit_report_result(PIGLIT_FAIL); \
 } while (0)
 
 
+bool static inline
+have_tex_storage_support()
+{
+#if defined (PIGLIT_USE_OPENGL)
+	return piglit_get_gl_version() >= 42 ||
+		piglit_is_extension_supported("GL_ARB_texture_storage");
+#else
+	return piglit_get_gl_version() >= 30 ||
+		piglit_is_extension_supported("GL_EXT_texture_storage");
+#endif
+}
+
+
+bool static inline
+have_cube_map_array_support()
+{
+#if defined (PIGLIT_USE_OPENGL)
+	return piglit_get_gl_version() >= 40 ||
+	   piglit_is_extension_supported("GL_ARB_texture_cube_map_array");
+#else
+	return piglit_get_gl_version() >= 30 ||
+	   piglit_is_extension_supported("GL_EXT_texture_cube_map_array");
+#endif
+}
+
+bool static inline
+have_gen_mipmap_support()
+{
+#if defined (PIGLIT_USE_OPENGL)
+	return piglit_get_gl_version() >= 30;
+#else
+	return piglit_get_gl_version() >= 20;
+#endif
+}
+
+
 /*
  * The KHR_texture_compression_astc_ldr spec says:
  *	* An INVALID_OPERATION error is generated by CompressedTexImage3D if
@@ -105,29 +154,28 @@ do {\
  *	the TEXTURE_CUBE_MAP_ARRAY target.
  *
  */
-void test_compressed_teximg_3d(int fi, bool have_cube_map_ext)
+void test_compressed_teximg_3d(int fi, bool have_cube_map_ext, bool have_hdr)
 {
 	int j;
 	GLuint tex3D;
 	char fake_tex_data[6*16];
-	bool have_hdr = piglit_is_extension_supported(
-			"GL_KHR_texture_compression_astc_hdr");
 
-	for (j = 0; j < ARRAY_SIZE(good_targets); ++j) {
+	for (j = 0; j < ARRAY_SIZE(good_compressed_tex_3d_targets); ++j) {
 
 		/* Skip the cube_map target if there's no support */
-		if (good_targets[j] == GL_TEXTURE_CUBE_MAP_ARRAY_EXT &&
-			!have_cube_map_ext)
+		if ((good_compressed_tex_3d_targets[j] ==
+                    GL_TEXTURE_CUBE_MAP_ARRAY_EXT) && !have_cube_map_ext)
 			continue;
 
 		/* Run the command */
 		glGenTextures(1, &tex3D);
-		glBindTexture(good_targets[j], tex3D);
-		glCompressedTexImage3D(good_targets[j], 0, formats[fi].fmt,
-			4, 4, 6, 0, 6*formats[fi].bb, fake_tex_data);
+		glBindTexture(good_compressed_tex_3d_targets[j], tex3D);
+		glCompressedTexImage3D(good_compressed_tex_3d_targets[j], 0,
+		formats[fi].fmt, 4, 4, 6, 0, 6*formats[fi].bb, fake_tex_data);
 
 		/* Test expected GL errors */
-		if (good_targets[j] == GL_TEXTURE_3D && !have_hdr) {
+		if (good_compressed_tex_3d_targets[j] == GL_TEXTURE_3D
+		    && !have_hdr) {
 			REQUIRE_ERROR(GL_INVALID_OPERATION);
 		} else {
 			REQUIRE_ERROR(GL_NO_ERROR);
@@ -147,7 +195,7 @@ void test_compressed_teximg_3d(int fi, bool have_cube_map_ext)
  *
  *   and <width> and <height> are not equal."
  */
-void test_non_square_img(int fi)
+void test_non_square_img(int fi, bool have_hdr)
 {
 	int j;
 	char fake_tex_data[6*16];
@@ -209,13 +257,17 @@ void test_sub_img(int fi)
 	char fake_tex_data[4*16];
 	int width = 7;
 	int height = 7;
-	int expectedSizeGood = get_expected_size(4, 4,
+	int expected_size_good = get_expected_size(4, 4,
 				formats[fi].bw,
 				formats[fi].bh, formats[fi].bb);
-	int expectedSizeBad = get_expected_size(width, height,
+	int expected_size_bad = get_expected_size(width, height,
 				formats[fi].bw,
 				formats[fi].bh, formats[fi].bb);
 
+	/* Ensure enough space has been allocated */
+	assert(expected_size_bad  <= sizeof(fake_tex_data));
+	assert(expected_size_good <= sizeof(fake_tex_data));
+
 	/* Allocate enough to hold the larger case */
 	glGenTextures(1, &tex);
 	glBindTexture(GL_TEXTURE_2D, tex);
@@ -225,26 +277,28 @@ void test_sub_img(int fi)
 	/* Check for No Error */
 	glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
 		formats[fi].bw, formats[fi].bh,
-		formats[fi].fmt, expectedSizeGood, fake_tex_data);
+		formats[fi].fmt, expected_size_good, fake_tex_data);
 	REQUIRE_ERROR(GL_NO_ERROR);
 
 	/* Check for expected Error */
 	glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height,
-			formats[fi].fmt, expectedSizeBad, fake_tex_data);
+			formats[fi].fmt, expected_size_bad, fake_tex_data);
 	REQUIRE_ERROR(GL_INVALID_OPERATION);
 
 	glDeleteTextures(1, &tex);
 
-	if (piglit_is_extension_supported("GL_EXT_texture_storage")) {
-		/* Check for expected Error */
-		glGenTextures(1, &tex);
-		glTextureStorage3DEXT(tex, GL_TEXTURE_3D, 1, formats[fi].fmt,
-					14, 14, 1);
-		glCompressedTexImage3D(GL_TEXTURE_3D, 0, formats[fi].fmt,
-				7, 7, 1, 0, expectedSizeBad, fake_tex_data);
-		REQUIRE_ERROR(GL_INVALID_OPERATION);
-		glDeleteTextures(1, &tex);
-	}
+	/* Check for expected Error */
+	glGenTextures(1, &tex);
+	glBindTexture(GL_TEXTURE_3D, tex);
+	glTexStorage3D(GL_TEXTURE_3D, 1, formats[fi].fmt, 14, 14, 1);
+	glCompressedTexImage3D(GL_TEXTURE_3D, 0, formats[fi].fmt,
+			7, 7, 1, 0, expected_size_bad, fake_tex_data);
+	REQUIRE_ERROR(GL_INVALID_OPERATION);
+	glDeleteTextures(1, &tex);
+
+	/* XXX : Test the methods exposed by GL_EXT_texture_storage
+	 * once support is added in Mesa.
+	*/
 }
 
 /*
@@ -264,11 +318,11 @@ void test_tex_img(int fi, bool have_mipmap)
 {
 	GLuint tex;
 	char fake_tex_data[16];
+
 	glGenTextures(1, &tex);
 	glBindTexture(GL_TEXTURE_2D, tex);
 
-	/* Allocate for an ASTC texture for following texsubimage calls
-	 * Since TexImage*D must fail, then the corresponding TexSubImage
+	/* Since TexImage*D must fail, then the corresponding TexSubImage
 	 * calls must fail as well.
 	 */
 	glCompressedTexImage2D(GL_TEXTURE_2D, 0,
@@ -302,65 +356,30 @@ void test_tex_img(int fi, bool have_mipmap)
 
 }
 
-bool static inline
-have_tex_storage_support()
-{
-#if defined (PIGLIT_USE_OPENGL)
-	return piglit_get_gl_version() >= 42 ||
-		piglit_is_extension_supported("GL_ARB_texture_storage");
-#else
-	return piglit_get_gl_version() >= 30 ||
-		piglit_is_extension_supported("GL_EXT_texture_storage");
-#endif
-}
-
-
-bool static inline
-have_cube_map_array_support()
+void
+piglit_init(int argc, char **argv)
 {
-#if defined (PIGLIT_USE_OPENGL_ES3)
-	return piglit_is_extension_supported("GL_EXT_texture_cube_map_array");
-#elif defined (PIGLIT_USE_OPENGL)
-	return piglit_get_gl_version() >= 40 ||
-		piglit_is_extension_supported("GL_ARB_texture_cube_map_array");
-#endif
-	return false;
+	piglit_require_extension("GL_KHR_texture_compression_astc_ldr");
 }
 
-
 enum piglit_result
 piglit_display(void)
 {
 	unsigned i;
 	bool have_cube_map_ext = have_cube_map_array_support();
 	bool have_tex_stor_ext = have_tex_storage_support();
-	bool have_mipmap = piglit_is_extension_supported("GL_ARB_framebuffer_object");
+	bool have_gen_mipmap   = have_gen_mipmap_support();
+	bool have_hdr = piglit_is_extension_supported(
+			"GL_KHR_texture_compression_astc_hdr");
 
 	for (i = 0; i < ARRAY_SIZE(formats); i++) {
 		if (have_cube_map_ext)
-			test_non_square_img(i);
+			test_non_square_img(i, have_hdr);
 		if (have_tex_stor_ext)
 			test_sub_img(i);
-		test_compressed_teximg_3d(i, have_cube_map_ext);
-		test_tex_img(i, have_mipmap);
+		test_compressed_teximg_3d(i, have_cube_map_ext, have_hdr);
+		test_tex_img(i, have_gen_mipmap);
 	}
 
 	piglit_report_result(PIGLIT_PASS);
 }
-
-
-void
-piglit_init(int argc, char **argv)
-{
-	piglit_require_extension("GL_KHR_texture_compression_astc_ldr");
-}
-
-
-PIGLIT_GL_TEST_CONFIG_BEGIN
-
-	config.supports_gl_compat_version = 11;
-	config.supports_gl_es_version = 10;
-
-	config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
-
-PIGLIT_GL_TEST_CONFIG_END
diff --git a/tests/spec/khr_texture_compression_astc/khr_compressed_astc-miptree-array.c b/tests/spec/khr_texture_compression_astc/khr_compressed_astc-miptree-array.c
new file mode 100644
index 0000000..c1f8fa2
--- /dev/null
+++ b/tests/spec/khr_texture_compression_astc/khr_compressed_astc-miptree-array.c
@@ -0,0 +1,294 @@
+/*
+ * Copyright 2015 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * \file
+ * \brief Test texturing from an ASTC miptree of a real image.
+ *
+ * This is an adaptation of the khr_texture_compression_astc-miptree test.
+ *
+ * This test draws miplevels of the compressed textures in a 2D array
+ * according to the MIPLAYOUT_BELOW organization scheme. Each miplevel of
+ * both images are compared for equality after each level is drawn.
+ */
+
+#include "piglit-util-gl.h"
+#include "piglit_ktx.h"
+
+#define num_levels 8
+#define level0_width 160
+#define level0_height 106
+
+#define num_vertices 4
+
+static GLuint prog;
+
+static struct piglit_gl_test_config *piglit_config;
+
+
+/**
+ * The \a filename is relative to the current test's source directory.
+ *
+ * A new texture is created and returned in \a tex_name.
+ */
+static void
+load_texture(const char *dir1, const char *dir2,
+	const char *filename, GLuint *tex_name)
+{
+	struct piglit_ktx *ktx;
+	const struct piglit_ktx_info *info;
+	char filepath[4096];
+	bool ok = true;
+
+	piglit_join_paths(filepath, sizeof(filepath), 7,
+	                  piglit_source_dir(),
+	                  "tests",
+	                  "spec",
+	                  "khr_texture_compression_astc",
+	                  dir1,
+	                  dir2,
+	                  filename);
+
+	ktx = piglit_ktx_read_file(filepath);
+	if (ktx == NULL)
+		piglit_report_result(PIGLIT_FAIL);
+
+
+	info = piglit_ktx_get_info(ktx);
+	assert(info->num_miplevels == num_levels);
+	assert((info->target == GL_TEXTURE_2D_ARRAY) || (info->target == GL_TEXTURE_2D));
+	assert(info->pixel_width == level0_width);
+	assert(info->pixel_height== level0_height);
+
+	*tex_name = 0;
+	ok = piglit_ktx_load_texture(ktx, tex_name, NULL);
+	if (!ok)
+		piglit_report_result(PIGLIT_FAIL);
+
+	piglit_ktx_destroy(ktx);
+}
+
+/** Compares the compresseed texture against the decompressed texture */
+bool draw_compare_levels(GLint index,
+			GLint level_pixel_size_loc, GLint pixel_offset_loc,
+			GLuint compressed_tex)
+{
+	unsigned y = 0;
+	unsigned x = 0;
+	bool pass = true;
+	int level = 0;
+
+	glBindTexture(GL_TEXTURE_2D_ARRAY, compressed_tex);
+
+	for (; level < num_levels; ++level) {
+		int w = level0_width >> level;
+		int h = level0_height >> level;
+		glUniform2f(level_pixel_size_loc, (float) w, (float) h);
+
+		/* Draw miplevel of compressed texture 1. */
+		glUniform2f(pixel_offset_loc, x, y);
+		glUniform1i(index, 0);
+		glDrawArrays(GL_TRIANGLE_FAN, 0, num_vertices);
+
+		/* Draw miplevel of compressed texture 2. */
+		glUniform2f(pixel_offset_loc, level0_width + x, y);
+		glUniform1i(index, 1);
+		glDrawArrays(GL_TRIANGLE_FAN, 0, num_vertices);
+
+		if (pass) {
+			pass = piglit_probe_rects_equal(x, y,
+						level0_width + x, y,
+						 w, h, GL_RGBA);
+
+			if (!pass)
+				piglit_loge("Miplevel %d", level);
+		}
+
+		/* Update the next miplevel arrangement */
+		if (level == 1)
+			x += w;
+		else
+			y += h;
+	}
+
+	piglit_present_results();
+	return pass;
+}
+
+enum piglit_result
+test_miptrees(void* odd)
+{
+	int subtest =  0;
+	int block_dims = *(bool*)odd;
+
+	/* Texture objects. */
+	GLuint compressed_tex;
+
+	static const char * tests[3] = {"hdr", "ldrs", "ldrl"};
+	static const char * block_dim_str[2] = {"12x12", "5x5"};
+
+
+	GLint pixel_offset_loc = glGetUniformLocation(prog, "pixel_offset");
+	GLint level_pixel_size_loc = glGetUniformLocation(prog,
+							"level_pixel_size");
+	GLint index = glGetUniformLocation(prog, "index");
+
+	/* Generate filename for compressed texture */
+	char cur_file[50];
+	snprintf(cur_file, sizeof(cur_file), "array/waffles-%s.ktx",
+	       block_dim_str[block_dims]);
+
+	/* Test each submode */
+	for (; subtest < ARRAY_SIZE(tests); ++subtest) {
+
+		/* Load texture for current submode and block size */
+		load_texture("compressed", tests[subtest], cur_file,
+		    &compressed_tex);
+
+		/* Draw and compare each level of the two textures */
+		glClear(GL_COLOR_BUFFER_BIT);
+		if (!draw_compare_levels(index, level_pixel_size_loc,
+		    pixel_offset_loc, compressed_tex)) {
+			piglit_loge("Mode %s Block %s.", tests[subtest],
+			            block_dim_str[block_dims]);
+			return PIGLIT_FAIL;
+		}
+	}
+	return PIGLIT_PASS;
+}
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+	piglit_config = &config;
+	config.supports_gl_compat_version = 11;
+	config.supports_gl_es_version = 10;
+
+	config.window_width = 2 * level0_width;
+	config.window_height = level0_height + (level0_height >> 1);
+	config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
+	static bool is_odd[2] = {true, false};
+
+	config.subtests = (struct piglit_subtest[]) {
+		{
+			"5x5 Block Dim",
+			"odd",
+			test_miptrees,
+			&is_odd[0]
+		},
+		{
+			"12x12 Block Dim",
+			"even",
+			test_miptrees,
+			&is_odd[1]
+		},
+		{NULL},
+	};
+
+PIGLIT_GL_TEST_CONFIG_END
+
+void
+piglit_init(int argc, char **argv)
+{
+	static const char vs_source[] =
+		"#version 130\n"
+		"\n"
+		"uniform vec2 window_pixel_size;\n"
+		"uniform vec2 level_pixel_size;\n"
+		"uniform vec2 pixel_offset;\n"
+		"\n"
+		"// vertex is some corner of the unit square [0,1]^2 \n"
+		"attribute vec2 vertex;\n"
+		"varying vec2 tex_coord;\n"
+		"\n"
+		"void main()\n"
+		"{\n"
+		"    vec2 pos = vertex;\n"
+		"    pos *= level_pixel_size;\n"
+		"    pos += pixel_offset;\n"
+		"    pos /= 0.5 * window_pixel_size;\n"
+		"    pos -= vec2(1, 1);\n"
+		"    gl_Position = vec4(pos.xy, 0.0, 1.0);\n"
+		"\n"
+		"    tex_coord = vertex;\n"
+		"}\n";
+
+	static const char fs_source[] =
+		"#version 130\n"
+		"precision highp float;\n"
+		"\n"
+		"uniform sampler2DArray tex;\n"
+		"uniform int index;\n"
+		"varying vec2 tex_coord;\n"
+		"\n"
+		"void main()\n"
+		"{\n"
+		"    vec4 t = texture(tex, vec3(tex_coord.x, tex_coord.y, index));\n"
+		"    gl_FragColor = vec4(t.rgb, 1.0);\n"
+		"}\n";
+
+	/* Vertices to draw a square triangle strip. */
+	static const GLfloat vertices[2 * num_vertices] = {
+		0, 0,
+		1, 0,
+		1, 1,
+		0, 1,
+	};
+
+	GLint vertex_loc;
+	GLuint vertex_buf;
+	GLuint vao;
+
+	piglit_require_extension("GL_KHR_texture_compression_astc_ldr");
+
+	glClearColor(0.9098, 0.8314, 0.7843, 1.0);
+	glViewport(0, 0, piglit_width, piglit_height);
+
+	glGenBuffers(1, &vertex_buf);
+	glBindBuffer(GL_ARRAY_BUFFER, vertex_buf);
+
+	glGenVertexArrays(1, &vao);
+	glBindVertexArray(vao);
+
+	prog = piglit_build_simple_program(vs_source, fs_source);
+	glReleaseShaderCompiler();
+	glUseProgram(prog);
+
+	vertex_loc = glGetAttribLocation(prog, "vertex");
+	glEnableVertexAttribArray(vertex_loc);
+	glVertexAttribPointer(vertex_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL);
+	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices,
+	             GL_STATIC_DRAW);
+
+	glUniform1i(glGetUniformLocation(prog, "tex"), 0);
+	glUniform2f(glGetUniformLocation(prog, "window_pixel_size"),
+	            piglit_width, piglit_height);
+}
+
+enum piglit_result
+piglit_display(void)
+{
+	return piglit_run_selected_subtests(piglit_config->subtests,
+				      piglit_config->selected_subtests,
+				      piglit_config->num_selected_subtests,
+				      PIGLIT_SKIP);
+}
-- 
2.5.1



More information about the Piglit mailing list