From 5fbbe90d5ce2a0a4298a33e49a6fd023bce05769 Mon Sep 17 00:00:00 2001 From: Krzysztof Rudnicki Date: Mon, 29 Aug 2022 19:53:36 +0200 Subject: [PATCH] feat: get glad to work --- .gitignore | 3 - .vscode/tasks.json | 7 +- Engine/engine/glad.c | 2 +- Engine/engine/match | Bin 0 -> 214232 bytes Engine/engine/match.cpp | 62 +- dependencies/include/GLFW/glfw3.h | 5912 +++++++++++++++++++++++ dependencies/include/GLFW/glfw3native.h | 628 +++ dependencies/include/glad/glad.h | 2 +- dependencies/library/libglfw3.a | Bin 0 -> 480500 bytes 9 files changed, 6566 insertions(+), 50 deletions(-) create mode 100755 Engine/engine/match create mode 100644 dependencies/include/GLFW/glfw3.h create mode 100644 dependencies/include/GLFW/glfw3native.h create mode 100644 dependencies/library/libglfw3.a diff --git a/.gitignore b/.gitignore index 9463db6..0ab6ff0 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,3 @@ Thesis/4_2022_zał 1_ Zarz_wymogi edytorskie_.pdf Thesis/Thesis.synctex(busy) Thesis/4_2022_załącznik nr 4.pdf Thesis/Fonty -dependencies/include/GLFW/glfw3.h -dependencies/include/GLFW/glfw3native.h -dependencies/library/libglfw3.a diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 35e55ca..fbed5a7 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -5,11 +5,16 @@ "label": "C/C++: g++-11 build active file", "command": "/usr/bin/g++", "args": [ + "-g", + "-std=c++17", + "-I${workspaceFolder}/dependencies/include", + "-L${workspaceFolder}/dependencies/library", "-Wall", "${workspaceFolder}/Engine/engine/*.cpp", "${workspaceFolder}/Engine/engine/glad.c", "-o", "${workspaceFolder}/Engine/engine/match", "-lglut", "-lglfw", "-lGLU", "-lGL", "-lm", - "-I${workspaceFolder}/dependencies/include", + "-ldl", + ], diff --git a/Engine/engine/glad.c b/Engine/engine/glad.c index a2aa28c..e72a9a3 100644 --- a/Engine/engine/glad.c +++ b/Engine/engine/glad.c @@ -1,6 +1,6 @@ /* - OpenGL loader generated by glad 0.1.36 on Sat Aug 27 19:06:27 2022. + OpenGL loader generated by glad 0.1.36 on Mon Aug 29 17:36:37 2022. Language/Generator: C/C++ Specification: gl diff --git a/Engine/engine/match b/Engine/engine/match new file mode 100755 index 0000000000000000000000000000000000000000..c8985fac9b448355c4eae87919743228a3c72412 GIT binary patch literal 214232 zcmeFacYGAZA2+^NcK5<@fjbCflaO2zdM}|$Pa(kop^AuvkOYW?1XC!|#R3Kdv7v$j zqFAt_q9RSYs31it3L+o~q9Q0Nkl*_=v$MN*Nxr}5^}L=xJ!NLz?@yWbnc3ORUNSp5 zJ;iRbN#f&>x=Vyk`8d;47kqo0LoZ2EPpOmSL0VsmmlUv0{OhSpgY$3gTp)6nu1DU; zE?jpToJZ+;A{Q;Bob0OlZ18Z2$fcSblbuXO9S7%!TW~#*3%OBWPc9Gc=$shNi`;5Q zW3xM-%XiNR%!lj!ekG_qG+bnNO1C?u+lkz-kEh7Rc+!~AzfQW};M@-xef%tyq+mPI zp5Q!5*B3d}L7%~AOLG2i>dVmWN=9%$!MT$L93La+P#Oq38khgmj~LcLdVN*RL-081 z)l04N^Tu>YXqBJSB0sO7bZU#KojSDWkkGQYuw`4;1nN80K{3^*|4<3jvV}N(_}N_4 z)-lPmlJ`U{n>Fd*{*9K#6xZzaZpMchQNjn+Njmf)dwq%xTn{DEq5jYB`3|jC7jb_4 zi^ad*$%ilP&;4@ZCqFKoarEBdQDMufCxWi@a~{U}(hiX409D2xszU$uD)=9(@H3?f zesdN4uT}VevRp`H01>dI%{^ctCcc?=Dvnu!%RrqOu$*pXh|E$7K^(yqgsKWp3 zD*OztLO&F|AOC_syFgUd&RSKprz!OP!A^iXSHVYD(axsuUsKW~|C~T)H=!RFNHNrn z=|@PD76l61=zOrBr{TvdMMyp8aQ&LV?1S|_E`RJ4TH)=a%(Nl>GIMf^a>wNrm*f@= z>6e&aSdcp;YfOHwl$kkhVqrmMaYpG&v`q zZ%H}%+4+UVxl&Gk@wACZ3n%3kki57gC%aiQ(&->&ju>2$kXw+GpO!tiq)nUb@mWQg zB}G|zCB3t0=07(lt0W6HV~UHp z5L7{q)F(ZycVcGSmTgz>6mf{HDkop^Pr?d)d zL0mU$=jGufrAi|pC$28Tijeka`k&N!mt3i3^3g&p-v_sp*vt2)&fD(#jJYpwf4V@Du9P?U z5m}8GiS);ll+-qRkaIRd)GB9m4S1t@RFl{hbF7z@mZ7f$Vv@tMkC|54T8kjbc zD;K;5rVZrE1)G6swX=6bD4NMyX`Y$j>w;LPX zB#DhL@XU!c+9oay!V`mVZVt`~&Eg0LqD%R%^N zeqjHv1>s+U@Yx{zofWtFC2hfhQK<_~r_MX`TgH&|MeLS@rS?B8|VOSb(LPkp?r2JHkm^o0FKGSpPA0^?U_GF*h-azeC#WB6tC?*9Is{A5oIJDC}Z0N!m0Vt9Ub%r1Q&Qp1L6Udg{EH*QL?~^z{f7 z(DU*MkRF41>Vj?P zl5fyB=^52FWkOlcb=vBr~IYJ9NeqI+KQ4co=V!Tm0ir|SM9;4h!baCG%w^mdngCm?;6 z1a!flx?tw{)LqHfNd%*g+(D_zd|ylk)m-<9;0^Orxh(lS{FZ;6Y6JpRcXKj{hC+0N zYMq5)WD1yWb2KR=_0c;29%2bI{v^$KZA{Hr4Db2*4J2tn@{RM20WgvQmi{vN6;v|s zx_vfPxDXeq&5jr>*!`&sV0E||^r?kCkUxdhekcPL9nh!Zl9NY#>Uq928zmn5vmEB6|kX@8mNzRnLH0n=j0nR8$ddn zdAyOD{WW*GKedbnNg*m^K?On{K`zjW5!8xZavwnYSXKq*u_q#DcbQxVLd-~w#jijE zwxP^6`4o1DQ&NeFY_}u^u^O#`vZ1@tkyCn@)cso@qIolaGxSa~SIN7n4GJlg4gD?E zhFM1cX((??K2=hKmFAtd)%ZZ_>M!-v;ILweTQ5F9lSe~zVJY{A!Am}MVLBoU?VMb~ zhDii^(XQkZ(8A;ng`jitiJ5mnX&}mFLr(;a7EQ3+p)wJMJzDReSO*=@euRh<;% z+#HkZAh<&&*GzENP0la4OD0!aa7)G-byOGJcDiiwv9}AZrrG8j*g@Hj7-e!-1-HfQ z$0fmCHT|6v+}<~sNno2_qE`zn*G=(xSHm??GT*P@x*7G}j1=k%CJzxjO~dtrD(HCEOx21cnOR zxh6MIa68Z+JsfWroTc7W!Ob-L(OYmw5h_&-(~&VWOeKSK*O9_xa;{OG!L2rjqqfld z-sEZuZct8@)lFd4)p+0oaj96;?U(xcLMnz#Z^i||^)LhBoZwzJN5arsY;u=`Ua`sj zD!7MD?wa5xnB2dD8(?xa(XH1pBvp*!vMe5KmTsLEuDY7tGPpVB{%}g@l~ls*H@WYH z-gcAwPH>ie__*NKnR>?rw*>9fhxnl29spNGw|0!?-I`^tp>@LSra3|{3GOkotE&Xp z-i*hm1-A-*^=2#)Tzk{s!-CtBW9ZEh+zOMMEx2bY;f9)ZOci=Z&F+^7u7O$aM8VyO znbzBvBe(}me|HORn#tWMxS6KE;ewlM`pXd94s-kNE4VhMZ9lL3prkQ+tQdFb4 zO@-M9km+4$DY*O0?l%_PSaW&|uC2)#{#u$`b78x8lu<_`!5uLb=M0482j6a6g+| zE#dFWO1P%xaxvPhm|S&X`;Tc`O>m=3J-6TnnVcfH6qBe7_ zcDLXx<2OQZr%k=#f;(bzLj`9Um%)PDWa?!I?p>4XFSwUY?smaFYjSCVd(`Ao1b4s5 zB?)e_$@LQ4Jto&faHCAFtKbHiTo=Kmm|SPUbuqb4f@^7V9R(L>avcO$rxLDOCEP7@ zts1shOfEtAJ7;oj1b58jS_$q;lWQ)xZ6?=La37dlW5K;QqhbE^A?s1cI3GQid zRWvJsHLJ!0OBG`^or}|V-_+p-cT#X0@&2FQh2w(r-(_&$2yXeE2KR;F{3f?ua7iN# zy-x+Vf0)5-6I_mIyF+lhO})|#8MVVLEBZ8}JTxy&39u;~$%_%d+FWux03%%hcXVjZ-atDN-WO7EEtDD?cLNDCp zz7$+nlQZV+74zh^Pw1^TIb*E0nA~2WcgW=S2yT2OTuCL|oJzPgm2jg?&Y0gEliMZg z9bO4HvJ!5z8EZyd6g)X+0*E&I?+p=a4Q9unN!W?SwT zT)tWF9Kr23`!QE=QD(if1-Hz!eL!&A%{D(QxD6)vh~UCtp zdTRuCb)YdWuL`cFInEyluB&OgQE--h@*}~WF~?w&;6|Hu7`A83F);S~aI=n2gl!4- z-6}3w4`%Qi)|NJ-3r0A8VY+`xxcb55jHU6ZIkiT3|6p$QhV4sc7Yr`e9Abl8WOjd< zsP|rzdrolQnO%KeaJ@`DV|p5xoUs)wFsEl*q<)FsF~AsuErNU1fH0^n_`$Gixn#pAf?je(#D7Y(TSEmT>A#>T!eW-G5Rst41wE)UNv)w69t!I>h%)bF|&Osf>TVckKneMeKYFVWO7DZ z>}DPPh3(7eZxz$?LO(t|k2sC)HxOpuK&B5#E5S`Lo7PfrYt5l+EV$dup)>rQG@DjW z=#`mu)D>KeIXwnf%jCj^-cRNb8{Bb|(}dnzCKoBV7fmi&aE;8q#R=|Tvu}+A_m{~v z6Wno=Ya_UFv%k#+H{H~0A-E|fXN>babGI=3#hANFYhhcf5>7Qa!{5KAKZE<#b&|rdo_f;45Yt_Qtf>0lX!>7CP`Aj3oIEqc)g}UW6=2N{`EFn@XpON zI0o2{;tXE=7RA}TcnUAOoQF1cIk_)3qRsXg9xBOO@UFrZsm24B?ewb0M$#!u-iY@@ z%93{Mr#CA4SRmd^$p4nTy0BYk)1k!QZP=o}#BmoC=nWF=r@K>a$y+We^O85(F20t! zsNaUvMMKwvM|0c%?x*JN+CUYae;77p$?F%$JNr=e8y3i0Spm#CY+sC7%L?n~UAL90 zARgQ@%>@&{S^8TB{DmmID6~L+m|L5=v#Zw4GIRN+Wy)8Q z^^tIta%C~bl_~EbWqC2udDk7Y>y*h4u%dldT$wymFV@{9kHH1cfk@jWkJL+8dZ~Dw zASbmQUq>bK`CdoL%Y$Al!s{u!hsJ^ zLy~$8OIvWH*U+>D*Ln@!yas7SL^aWSa z7hFzS@Kdky+9y-zeP&DT{9WnK^gi}oclR3E>+W8odS!k#c5KTUF%Qt3u=j;O({u7^ zzPZiB|0Vy8!2cWp`VLuoZdOsj0DNPxPr8(XFV5xW_)7}?+3c%}{yym`clf99FEEGb`)HbxQOVjLd$b;n+VdV@?X&CgHC%FabGr3l}9)XVxe z9nDgXt@IRL-9^uCSnAVGg0e*?Gmqg+(Y0$(@>!Rg^U`7vIwy z8;mCh5qZH_S4f+fH7>VJ5|=X2mOxTb)|B3*W5?!FMTz+sCXpu==Cj%vIk+UZARFH| z)OC__C$ZM+bib_P2_zy5z05R3Ij@*~t#n*|a)Dk*!RQuK|5NfyS>798W6Vh@EyxC! zUN|l{lsEG9*d`f;{7T&F8I%)V0>$uz^9Stri$}1ShC72{Oss=KrOxLzf zW1h*S=T6SeuS_{mz%0^=`3UBq7B&KdvI@pgunfz~oieGgh`v5cGuo@DC~F#Zl0b5P z?nHd!mY^PC1ICUm&L!Q%!b#Ia!&z)t2^JqZF}QS$89+fC(}R})9Sdgi-dJAXN=l2U zxk*)H=rX$}Y*9Eb2r3gR>@1%Evd7 zC+8MnRj`4WIElWkoJ)-~eJ2(M)B2zU)B509=%6-LBB|&~*f4L1yo%MMsm4kfoI44- z0=^_YF27%Ceo0=y#2bud*w|iUMjGsb7z)Zjik46iLrSa-VuN5H`QFm3lDxtK2>av~ z3@ptp%FAT|$Y$EaX~k5YMn3S(bEZfjxgbaI=r=2hCBndfG56%s95VM@&Z$zyQFIxr zoCg<&dTf~>t=Q1xg(Ui>Gg`y;Kumy+(TZTIU)ChUc4)yw3o?|A!4)m#25bcRt`RU; zmKiknVQR9m(^)hudtpVEc3KPDs{~&YA3u0}7QWz5ox|{eD#{y^UYISWiGm9kLPLpv zk00OMABRf~j5s#Ld{j*_#};uwjY)jVAC_BGk~@`G&GsbtsN4X$1~arE zZ){-^HH#?LyWAXJIiF%81N#R>y|rR8beL8!wh)&X?u+{n8XQ%kFu1U^h+WR%Rd0)B zC{1##9-+F9@N4aDj;>$|YAf_7GrU~OX$`(M|sR4^iUjmhBwyRu|S7e;-X>nu6(+|&inKakH`q7wUzR8oOekGuy zae5`dF8@P{vI>f6V^7J=%^8E=Yyts}0+rF`C0?9)O{O<~V+$-Rm<`J+nuY^9O%57Z zl^D{*d>jak^9&tK@Y`x~aQ|0`-1cZW1I ztOAFYRp8LHid=p=7r6p8ce&Eg zA7CBup*3x&Gp3OR>76&tNQPSz^g6X~le@j1f;0XdHtmerU9kd~Fs4Q&voO_WUjl^;reRV6fJw6=QlP<_1(B z$ne@NoL+ellQ=#%dxC`_)93&F<_f((G2$LR6}E zZg#|O%O2E#os_HJX$b*Mv%bLTsRO+7akg;!I0rFl#TJ6hj0YEK1^6{r1=+cDwYEON zu=1Dz9=g!UD9W3N&3ba~pj`Gl%hJ&8so?2R09OjQvC~%-wDPjqO)BDw-+1VfVir)r zY=1--oPyTXdgB*sO%QbjYcpY`ewajeX7xk^$sZ?K`%Kq1K2G{zuyGf6^%kiv77}Bu zEGm`<1wt)AikpMUg%i*QqrwzC_RAeSjXjpbT?Q}cw|*QX=I0?o@4)X^)1{Uo#za3A zbV#5L449O}s2DQi48bSM40mp3iEVw|!52#GIZfN7z>pSvyC5EQTNK%L#-9SwtuyUk zm2LZMa#R%PqmpArM#TdVQ5C#ZJQQUF97f2u(SpE=0;&jf zPCiU4-60}4v9PcxNAIW=QnL)qYqY`uG4Gfm);ncjUb7XFHCrME$w#^ZS5c8SB~Vcx z>_Cz?ssdNhBX3@yqCP(Taleq2uaBw;$Ok*Z>k^}E3b<1)(47s=&BjR|_X&nN+*Bkd zOZQOHY> z=Wi%4k3v55qw?~F$oqXmRv zlRkw#^0$$%Lw*at+GQW|AGX0BxobP@@uTr6$eSbYzXSHj8|;KV^6k4|kG$Deut&ZP z`99>O_+j}al79nxrzB+`g+206yu^}@yd&~_xIZq;HTE>kf-CP)K`($)(;}K z`vyt2sWokp)m7IL^oRH;{7c0+v?84(wI*ft@h<`YCao_o9}PVzv}Q_Zc;6cCDXuwE zkBBZ!+trT)%k1&Gw)6_dl^GI=5BV*@zm?!K$X@?YT?_GVE9$#WTykj5hwO+i_%=&T({AS3PTIKcyhJAIkrw!)0ja5G0v~Lc1 zZ^(np6Plx=U{~^zZ{2j#m3jy^%Wz@eA^45s|ajLcbqg2uUb&yZ_yuAGBfchUb>fZEi=4@!jTg#Ep{*ZMQbRkdq!|Bb+ZBk^xcY!a;vX6N75}{-9 z_bupo1AXvlg?+Bw;E09{ac}6NdvSc|mYP1_>hfwFO4D#pO&>SUq;NeC({qvO zW|B0UGrE~{UGE<~7ov||om7`YX^ZYy@Wb_rMZ3rA_942ys6SfALJ!}gV2?GR&Zt{D z-mM$r_p&m%Xyz_Oz7DFRFcAGRdb*!c1(4;3o(6_Z{gz^(uERS}^Z$qx6BKx*^&~vnP;hWQvV`vEe zN=~~FDoc+02qZAzl$=gE4}W1vCXq5K4dRZzi72bCVx+G7kJwk-5}FWb#HRCpsYCB zfofQHEs6h`hH|5bKS*qs=f4RvDk~r28>i03QNWTC^AXBTYE!FaH^x_a=SdJv>%33G zS8k%*T%*V8ZkJp_I#gCV9Rc4WlC`1THIx&4yGj3N?1Ikrwa`9E8HsK?JJkA#%6-nE z+_82!l|ApF+^H6;%Zo+s>|C23&nut)iE@`(jj23)G|IQt?n&jxLs3rkv3eEkJ< z@6tsmFJo;}hS7vR6G=L%i-u7-jFFMUd8=+<7-WsNBo^J3BY5qvp?7j5uTgFXqj28x zk1#xn##{RyMnj3~yYq4(>Gug|)82yg^--Eg`hEF`JxKbu^Ku8QEcFgu4*gEv3StSy&=q zl;t~-xLwYqFz~Kg;PXQ%H066qadK0%D!+ah<@>a@R6hDD$}=Lm zQ#toJlxIb3g01S>jx;nIjOv<+qP&N(C#iS{Ne$I?4p~j_)16?n(cz{pdFHMH_!K{^ zz+R`iRHQy1k`NkK$$Q-g=_ZFpKT-0$i*`D;a8)n;Vi?C(M??&iJ;(k5_{^cDFemBc zWTbGSds^NUD%%}lok{<@xd1yI+GM6bgY+LJeHtvu`}Ju^cR3>RNOfH*z#gvZjiUM7 z>xiI@*)wAsz&>87cgSdfFC0;Cl4Qowj_4vXD#J$VIPTEa zGoz2m=&L{@g76nh^{sdX+9w<_Yr%OgO$Yeiq5TS=x~?Jh#jB#epy6SV!hpAiLP+wy zg3ZEl(h+%@yq)|4;0K4+4K7qyB2wSvs=ToguhixH*n1tP9g(eJ>PdVa;EWz)r*TGf zoOMLbBgymvfS(-NYXGY2ZKS?Wkc8}Dfl9wS*KyuaX9cNF+ywA5=AWq^C)I1DN^=*K zNZv=t??p%CZn9jH0`LpwpY}ml7*d}f2@4v@yN_n;vZJ0Il&4z_fZrTi7pB^iRBtC$ zTHliQH=5<&9g!_a^~`F3KO9;vQ=LGnlS!3!56OGyEJ&|9qK1=d`}Y9;bZASM>Qkip zHmQC@^AMOw-h_ov{>u?Dk1SiK0{rdJ_5!G`{YZVskuW34JDS$iKaPk`L3!l<05|kO zPN$aMbcCO0k|O}+y5y7F0VHQ#J1zvC7pP%&r*;Z$_ST?%%i*jWMUq=10c2gWaW8=4 ztkZ!c^ve+(E+^X-ytfYo2ysSakR)UTfZNG-9j^?*wZ{Nd*V9OS z>yYpmWbwmCEpHU`YB-}FAfuEY0K86ZCo|edMn4!vMhHvZem$Y*b4GkbMh8y;)YjV| z?E(mMMqDPz3A#$ub!uVNs11=wea(*ON$nn~+qtb6NI?`%#1BU7iKo zSZCz@8eIFFY)($J}eV&SQ-+DLu% zk#H+2fu;ENHdzP7M$SkZIL}$yL7O-ulK@m#U!=9D8t-|!crUs&O?|mfPib`NYA2 zYAHC+8wh1bTW9^l0NDSLx_(AN|ClAn%hbS-F3@Y|jMxoSR#RvS3sj%qajJiqYn`q^9a%ySJd;po}80Ku$Stq?$dqc0YGp;Lyp7S)`w>h<0 z%;*6!dM40__0hXO4SHRjarctZSvm`JcWUo3qmRhwpkZV-lvj7}J5cW7Z1gf&p4th} z%c=dsEdL-&kEdc6d7aOF2<6_+MyJT~Tnm6CXLKW|tF9JES@d)j){^(nnb1gfMnr(} zJkuJWk5e1Q)JG!q<&!GKj=n+OnGcmzXJi`b4|)NhuajM{z3DWPw>!0Ika%CGvr2}O zpH;SX1Q_Vl-hf1Py@%Ad8;NC#_$56PCmY8gXXHu24!=2GJzHmN3CebAjbMoRN9w!lfBG;S z>8Gr>;@}|185aR7Pq7_ftWzsx-lmhcHI;ZXC&w~F7TUAJPDPF&L}5%5B;qz zN1;>e#q|4-{vD*x8c!v7X-hlQ9nV8?k~1a&oTqFpK#^0M0)W#xQr{vZ+=@zIsWNXp zTEE54sC&S9Hq)kF>WqE^0P&BMt-@_6=x2#jm!L7(89`5pyqjt5OxM@WS^TLm#|)=- zf!Y3w)K?2zve_@@fj7W1HVf#2G}9S(0tTLWVF0t8S_>Geu69U$6AT|_5V5YC2@^1v z7QgL3g{wKvNO~OQ38T@t->E&w{Fag5-Ie&QvW8&i7oUc|dCusm$HZTc!`}A7210)Gy{I>1e*l8QmT=c=ph3>SCuh z5lamEZF{SUeUEOlxNnf_AJ-$DAUd*&#bBg;xmz)E}z zn?)PzrrM08cu#lK`sgEK*-BoZYH+8SL%HJUDpD+2CvPR&6D~GR!|*VE&Q% zMpor5*wO3bVEc@-fgc8*W^VyJ=hP-MM>ELLM}dx*xtRp@nT?30&-1^8zva%xdE~s; zT>#HJwS&z0QF30rc0ivi^Be4P&*$*+g0t~Xa+!g{kzBZY&Zr&?@ttNuj%1-^)rCio!UFh z!-wSIfZ>7FZ6uO++&U<)bH=TKhDV|+^qWrYBD4IREZtbpJQmmuB!kombTW~4pCj{N z@|M&8J=vdr72qAG)(l3fs|`|LhGB1dVw~>e7&+NbQS+`dE*i?7rVj(G=SORA%3Of= zo&Ic+bX*Pap;LPV0I#Yd^{qt0o5yaTz1>eLPasIFs3eLo{HJ1TkSw1>(jXY4NUo^NRX--6SJO09hzV5>9oFOtv=o8vQm zZ6BdsWxF%lTL)_Y(wywk=OmKus`v8U+`Fq0z~|1$PEhlFOHKKLUmd(3^#u6R89j(3 z|JDWA&-Zfg`|$t=oZY$OTD+;Nv4HAnHyGD7RxdOdY&bSZ=Jrn4haawQpS_F~fM`vVrlF%PNbez>k;U^n9 zan2b%oFrT5-toLXa(m7LTyRDfktChEcTpdo_-g={urre6%>;nUIR66RCI+eRAQC>k zk0RniXd`4$^3Ep9U!9RJljX5~0Ken>%PjvOOHa74yq}B=bIJSgE+}7dMxP?f?L`1r zasGii&Ob!^?X?V<&4Z?mgA7JXa3U-YnlVeyN!13>&}QF zWOFnV;2(b4_70#0|F1J@K1nWMb{seLdA{u%fLqQ6t4T7JLI}^Z_W-D_uaNrAAmO9J z=9wTw)JE?TS}!&^ZX-DFINItInV+$bbOcake$U==Ab?B89U*GCZ6822S!)J>^^ero z3kg3mPzmgMbjG`duDEVFDjJ;U&y4^cneA8J&uNW^%5g(Tl8rOAqo%A)2T)yek@}uP zVrenkr}>#{In9Pwu3tcw&))#3C9^Y{ck~K?+H(C@NYd~%fI71F6@cnGjMR4)2@hQE zDdQ=q)RpUPBmK^Y0W?{oSIbqG90C0ZB&L1{Jw%nfp%np%l&y<>)6#vSc_wV_ouN2tX6L-diLYN{hZ39|rH}0|3qCdV5In z$5?=ty3H?irEDcP`H>{s&jPg3CB0_@w3Qp*B+2e5fCO2qA4$Dxiqtn4iDi)3g^zKx znS|U)(o7^!Cz0x+090M{h}&C&#L-^%*M;2kIZa+i?%KPZLb#J0TSSuGKLK=+wPyfS z*9%B}A0gqDn)UI0=-wZoe48AK5NZBKTUkqzLrHM3g-Q~EQWTSiw z&{Jl+q<20Ym3ztc{vnBvMj}zxVlfD+s}WLPFC@Y3V7>J&x&z8da$Id_c%J$TAVv2X zHwU1P9MzvB(X!2ClU^N-Xws0vHH z;;^Hzm?=m2q2^gekuY1<@|k%Nncr`iQ=sCpIrVOi9Fa--!yf^-U)Gj0{ne!ZVSv8= zSpF~S-8?yBF&U}YX&evA+5u+t4H^Aj(MY#!N4>4Are8w(^mA0M&&Om7&HG2PKa2D~ zCjXzv+Vf0*4e75p^y$adl6TPkP}wNQJOr%o(!0OmTih@9~hm0N=>|XxMrlxd3of){+5K*X>AsxrR@p z$NH97{b48{lVduOz-hhj>2y!^qwL>FlAefJ$5~nX1weKEfz;<{Abe5@>~{`?$Aqy^JSWGVBC8ui z0M5%=JQP${6QsV*h85pX@C!O|=O)M20q?m~3UE=czbow&m*m(KlANVu%Vk-c2!QvW zkouM);eDdlF+u_p$=mHQnExurjwbVGZv*&U*48oecgcL4VNO5Xk-UF}K;?=Y_X6pk zrF*KYvUY;$pCs9MQ<(eG#73sUEt$)cH{Y`Au#Y-zpW7@VQm4bD_Ua!)zuQIuOAX#rLhWG zIO;Ju;SpGPl$b~|AD;tILtz_}_lJ7{YAXH_B&q)>fKOqQ>TUEnKrJPy0ti#s z^m$u+3s6UieUv0ez5@tX*hG2DegV*w*jGrBoDLAFXkP)~{tv0|ZzQ~#?8?oKi0m4~ zE{Ob@>1Nt+qLljEpzEDZjfhqF?eMN~0C5Vto_QP6H85U@uhke;70?20pi3^M05nwM zTaaWW%~fMv(zz2r6D7V6N#;@Wn(2~vCIK{8;6%{bk|hOi$Rd&kpW+Et1EmyFU*19VrkZpz{ z65Sd?PYar_UJAc?e|tJWZzVjJB<`sINxJ0yY5>WKHk%|3Yyf?f=$8Rh*E*!^2OnEd zFk2{jvt~mrRf&9tZ2mn2&{yHF7<8oPaJMUsz95PEH9$XwzsfMM3qXIR!A~S9%>u|! zw9uwhPi>^Wc1X-R_;4DJiX`uXC9oKXMFKU?TXO*hD_TEhKA6nMS2UNr12;f#h!WG2 zj8dtc!xZg)W;CCSR+AAMbQYuRZi3=g@@{oQ`3|LNDOrx7?fgzf+sG`pk>y3h(llrH zz5{T#5_z2@3+Ygssc13HXh0eu^|eRB8^@az zc^E3Al}0}Bp0By|eF{LnQvZFDG;tuN3$TFzsIJpUeOHi} zRZ8CWdC)IZ{9lp&m$cIE#kSI%^nFNujgXl7`d!0~d!SdO_{+&?unbV5XuX(GA2Q0S zXrx>2n+WAn#h(BT&x^DWrYPEUW;vHES5{%En~yGp#Z<*#K;|21m$?sH9Ue(}-`xQ) zU5R~zB=K~eoT+Gs0Py@9sqa@LydNwsD8UABJM?BLvAf8K{xF+kj-rLMAfp;ceNB)A z88L|4v=dOCtHjfjP3_A`=Pr&mdq z>X(ylr+bHUnEIc3b0ISl(=am z>GChYTK!Ttmo5^oC~=RIBr6KwHAVXvKy__F>N|{tPZ(QJ{Mp#%N1*q*68#1lO*{qg zhQgkAdK*Uqys0!eO_I8_jNVq*Q!{TC_4^&A{tc28J__(2hO`w`)C8%oGZKDF$0KPR zE$;P7WF7FHQ?v#@P_)5J|4z~`2+-G~pkrs~eW*mHkWsZvfR7YyJ~Mihj9#f|q+8Ch zLHT1PaynU#P6gPgXxo_OZnFHT3QOJmC5n+xmB{zWyw@Ip&A3dorrxPYeNjkw@7Qj{ zPl{(KVzwwzSIHr2}c9P+ZtM?xCzEWZz zBcr-K0S+kar6TW^uK>PQ;&+l{{09Js5Sjou|0DIeu&gZZc*sb!fgD!qpCY60zXbS3 z(c++~x*8+(bu)}uobh{r$I1D(N^}^69(vcraZJ(fU`BV7QBj}~Z+KJMN{=fseaYx3 z?JD0X+CpZul#JE}8u44?L2pCvdnI}{8NEzKrxa}~GulN)KLi@F12HvJ@_Nbg2PJwv zSsuO#@S{@yUuJ1*i$ew7M9@jsyx>dT1FN8RMv1&kHp#T?&tWmugtxW#0sN%I#KFRI zLB{rSK|j1Kr2zd|iS0^~JJ$eQ!WDvS`W*!LMX5iGBtOx0_g96z1>*f>9>8x(>?D$8 z(4KZh(VhlST`Q3KK15=fDHfWPNZu24p8rFs{|H&ePXM^4&;D4NyFZm?+exyK#`?P6 z_HUO1{H;WPPm-o10sht79!ib6q4=+px}~>$Z!ti*67OpV$=dw@HkG&C@f?6% z^*1NUpRWNp)yTmBxc^7W9{-O=fwdp+tv&$_S#6X;>UAh?R8_m5sn191TPsv8{bkoJ zK8yQy!NR3BC?)f98tQ7?+*^AufLm>_o+R!e03KC44xqYzKm~!#Rbw6^$vre1nyS44fcJlp`Ys~jdlg%X|2v^qrS&Oz z`A4{lQ2i^(FWvh&qEt<8Pk!AU$O@_dtp4#d!ZVGyszOeX7NbWLoa zYFnB0E~LH_6)h$2hVP))P;IoHjJnYIp|Q$;f|p+m&_wlLAj!(V0h+0Nu_i45Xs*UP za4_^trKR6e5BL>10IgJiJ(66d3tk(QZwjYh2WYECcZ9^7FbJTd%5Np zxQxtaWdn3qwKL58XEHB0%#HbxyosZs*F%l?hK!!4A7b~?hv-;WNP4Rct9PXC(uFKZ z)!G55uFgn(!;x6l6`L?))+Fz$p|D6+;~J9rs4##&s#e6zr;_s@ghc`7T)=2(+Y&3U3ErR}a$F_;$7a3uJz)5kNmxyU5IcC-a(} zM8#(9>`saQIB(8Bu;{Ng_@2z&IA=RD)X1i=QC+Q(vLD+f87}yb6;leJHc)L)54^`k zyX;_98^vsLkosmB`m9Pe{JgPST0?n=+IS#YzDkQ?7;mhXo+df&P@9&KzFk01)LZZ4(BK6%u61=8a%rX7K3E+6b{@7lYI8RXJl)Fx#;RHtb2N?|l^KpIiCujc zp4=B^ucVU= z8B5+L&O)PDt=kloXH-*wQdJwv)bo-0rkJXmQz4zKM&3!PL+QXjRgHX%sXmRAT|M6x z>TC}Td70Jm*fr=*Q)3<=!++?4JYCiHGQ<5yeP=5(ifRnK8LIXv8SM-On5Am;tL^aq z1I~TEFeJR+R08`f>hhkUc$lq5Um>f%XgipzYVDz*x^5$@5oAR@w*(klNj$a}9e~CC zYD8nGc|OblctF)knE8EVzL?C7ttf=m>>WjV532rgWYmrV;$c;Ll^MN7M%xV|X3343 zoP*wcwb61i`t$_ABdYd2Gde>?w*rk=6!Z9BcsG>G)c6BrX`{8Y2=R}uBL0#3dLyy) zj@8Kmm?bp*_?}i>m_4dCbVJv(%m=VU)kZQOW5`F@|MX#TRIM9qA5$9+AV+^S0C*hn z&m6r@jf-B)kQN@S3RV@j!3vM^S~0m<$d-Hl%H3dQ=2_Ut^=%8`F-S4y5y}= zW0OeI`h9>G^$X}PI5;@gs8ORxviKo@m-UNocR#>dHD)SF?s^&ERsGVskaoV;)QF`d z$)ID}I+Z{ExSg&kZ>Ul0Nb=_A0B@<*ct6shkr65e(mDQxw`FM{6NYTQmTiYfwl zSJhnI$tV=5FCK}-i0>(BSpAOo)cAkNXf^Eu@2grjW|T-q!vl@z-b3>Kx)6FFsBx_! z^eo)~umRUUW;B(I76lsdyPR6M-*9}S#^;jJ9z>Vp6W%=U+ERdxYW-(PvTrNECY*l& zRM#$~z7t3+4d-`SuhCR&#?hFJ8q!E^Rr%AjMB09~sSPiXWE&02c3m=bGr$hDk)sDB z_ffFyQrUYP-WI(8cB>8Rk>m~9;`gfj3Ea^m0H5P%N0K_X1AKwwb2E%Wi@N~6RO<~S z$=!1S_N&@d0M#`Msqb+lmS*$iOz*Zi4yf_;*DgIpbPhU*^Di@ckBoK)8WDuQmubto zWQX=4wf;(Qp5yfN=ZGFIX~Q7-My-FGBu(*^WXDlev-c!R7gApw5=%?igL8^^$-DDQ zSRPYjuaV`>?*UGzT34v6uHHy}BasAK^6_8xB$U5X<61$(Lq8~VoaA+SV}}BqQe*Q- z5*H0{n)~$DrJ4Crjhjc3Cu#zm)oo_b)#aQTyMiPSjt4le+q9!|+XXf5Lz3VQ4L^$0 zZ9b#R;UzWp07-_u18`Zl`TJ9VU)8vaB$@C8!0#%5KK}we9l4@L%9wA@!Mg#js#8kf3Nq(ILpy)R3 z=`4x8`~XP~{QwZ6+q_0GTg_GPB1s`@5T@H~y$n#tRc|m!`q0%aT(@bt2|#m2PbA3|n$JiVJFk0B z3;~F8#XU@ttrRNJF7`agJD@v2j4OT>NgkoyJ65;Jrs#-s#eG7OtA7L3*KOKih8+!D z@rOxr5f?f~Bi*L%3V_D0xL-*!9Y;V%Q{84gg-SD5d`KcBx1)EC7P?KMgz#$Vii;;n z^gKvf>o(oS0km<&cOyx!%>eE6G0=VnNN`2oL6R1;0Xpbo(3Y+O9bHlPl4Pa=&{?-> zKNp~jE24}fpVFq=Rkx`f1JKPC`4UNT{sQQs+vLzAx}L6x%_Mo4u28*oo09JV5?zr; zNwSBolF7Qwwf7)NamD{Z61-rJTMyl)ADtf4T=hMOE+rKMA9A4XM$9vQ{Y4>VHJv@e z@H>!u-UGw@=On4xDre+i=!OzdT`4H4t_PqQR$P)J#Y^Adx>ko?z6}kx^{PurAymTM zJ>B=dM)@Ll`Ky#KcE_%xe2Kdg%O7(OW%*L~e3n1%Uc>Sy+&fwRr290>pK_P8{Asrz zduF(MnY$y)pK&L#{8{$|mOtlyjOEMSZ?b%a`w+{YcmKxnm2UM-vS00P!txj0eObQ7 zJ(lG!yBD$iRrk9rU+4aoT{>+a0*_uL~`zTRER^7q|KSpI?gb(VkV z-pTR}?jKnGk^9ZJ$^K*ac9wtQKEv{jZYQEL-2JJ$KFc?`Gg!XaJ%Qz0-HTZMnfq0i zZ+Guu`40EbEZ^yNzf1PJ+|5|N+ufVxd)(P9-|K#W<)6D>V);JzPL_Y+{+{Juy8qF0 z4KWk${>t4+&+lOQe)nWOf0E?~-0SuHAj`jYU(xeAxVO>VZd;u$tWe!nXBaDZY;~rv zLZmH}`l7j`QNW;T?pRwWjk4yhZwsa2)!dD3q1?QQEtH!#wS|(oy%_7rR{gGO*Ha`Z zfm{D8R)s6Ok+sm8C)}|gCzCoBT0ksFY+aL4Pjz`?!6EXtv>CrB#nhAUx+3DdYm~u z!>TX*T9W2~eaMi+F2N?}8SZK4lh|*@c^;BABz+xjr8rjMXf^5z`tT9x&4wWtjZr)7 zhv*RKlR^~oj%k{!rbIw~6|!r!`s+;I+mugGmJ_EJ5{$55=%wFR{)_Nmz@clUnXM3QtuDo7Kf zp2HSP(z*Eeupw=dIb;&+Skp}Wbu;pYsvAITk9mPtU8nE=s=ECtR&}2eN%|O8-{apI za{jBe>OYgY^alBbJ1(tQwM~*&lFA&+3HAChOVyvDVMed%Y7je*MxeX*j~bHH9*TG3 zUnV)fWvx2=F)p0~$xK7aswO9_*HoYZhq#&cI8~jfgiOF`x_NpYp%f*~{yu~)q~;I) zNkp0wYCi^|F>i-k{6@gwg^YNngiPBBO_&8(%Y@pa9nTeNyz;T*cWH3 zzNH_AeL1AQW;WISu_WC>IV2xmLW;$t?*xVE6L1vZ+h{;0vu)x~|I& zI^>t&^$?pn8!e+K?H?%axa(8+yUnJ~E5=`$fX`x*Po?@;LYKYu6$Uz*&i+iGWh0uUV9rx21&9SK)F7ff}MoJGr8$WpZ3Ze!!x|@+? z;ye0@dB~>d$*xU){Vg=6u4h)q3!=PArr4yM+( z)TVY(Iq`uokUG!xN)pYPl+YoR=K5J%^>qWpT)${jU(Cd>ejxQnXjqo8#IKG&?#e6A1UXKvdhX*ra(lM)rIm9V+~&Za6@StPqq znG&1pvo>`QPN1X|it*x}*j&?q=yUyxP5lUa2{BDbX*IOBUmyDzi6jr$*#w{_ERBMYyU;9kx0_U<=X-ogDb%R9Pvvb?jqH_N-Y`?LHu_Xw7E zb&q9vcXtFPGrU$0x1Hs^+&;$lc1N>3(cP5gNpAX$XW_L{++VZ2kNbO;r@DV;d7ArA zmf!9!VtKlI7R&p&A7Oca_fss-a5rT240MMgPpJDQ#qxA}^{InIEI(pbTeOj+53mM9 zUZH7!lT8MT<(c-_1R$A&ES4X&t3zAz0sn~%NS7P1SYB#ZzbxcpWnh4q$MRElbp3GTdiRD#x_4pPZ%PB%hkLB0wYB4UcWHCXAcr3F<^H_e*u5NMRIt-;Hq(lX4 zB`lUV+SMtzi6Ytil_{}U-eFg_WpSlrh7yZq8W25}zp$%z9KDFSMoL@YQjg`?_E?$~ znRp({2kh#wV_Y!~Gr)(A?^}oMYIrj~cD+eNez-Fp%SY|%{g=6EM;6Q9+10;SbD}^P z@O_KsOiJj6UC!n^ZLgj)M9lT?b~XK~B&{a(o#cNXYb=}VGxpe?Kr#v0Twk-RAFbsL zI!Fej%MI9E|7};#p5@{zfnq+_H|^@2n|!Y8V#$SkP3A1I%(cs*_QW(0(^e?ybM1Ag zi8vmT#T`P#=bAN|&vk@DP5K(wCn(JzB`R1eVRIetP{)nnN~m-MoKZ_G1gaMyxnlmZ9c6;|36vAtFa5u$6h49)P-O0#3 zUCXfzJ8V((8xXrZ8Hx5eheAJWt?OgBx$Spsz_Yt9Q9yP53)c@@*L&LISlabM8t%v> zc>#2~d;k}^)d#LKWaUR-&F=d6PO^G#A*>{MGkE)~nka|ut(G_pSJMN(pqeim(-~f} zb(@G)A9k?ONC2Qwa2a+)pk=sg2s<93%ceaIbW+$2CUjb$+cCCbKMAyXI?zSo<;PV( zzY4T*3D6$`t;h8*?7Bb=anTREA<(IJfXa2B-CtY-=I%wKWo+`+ z7?4fgO9o_<_p+^%b@E;j(jHR~_hC4S{eWW$Yv@{vgg0&Kig`M*ielj%n;PQNiLx#r z*5e>rpm&7@zz4!*cNPF2a)?1@0kFZ4vHSWJp;6Y_@ge0btxfN(sl$QzY!L zRlfr}8jpls!U>Ory@-Tdes<-N@CA--^*F&J;ebu86VC}A35WQIs(K_G=FqN3!Z(4D za8y*sBjK0DIHvb*%Aut+##OfHLrvj$|5aL#}% z5`Houi-ZfjZp0{ygr5z_BH^L|StMKvjD*WV$|K=-TlJsL=?!I(aMh-6eL*K!B>ZJl zN5ts_i-dn{DwY?!XXwr%;f8R@BjF~8A`)&HQWgo4U0=@KStQsvL|0fO*zMLxSd40< zgoGUw2`+o}EUZ%=3DtxX9tj@1dKEj?A!zeRsEMNrHdG>bB-FO6;}>y)M?zgY+Y>}2 zgmWk&A<`bOC)5+w@kod^Ad7?;1F}f)3s*c6;_d3)H}$5lNN8wR&mYyB!XlwDH^30E zNN8d}770xa$ReSc0a+xp;B|{gXlXze39SssBB8ZCU{7c(q&yPZ+tpbs^@g%Y=ww&_ z8lw{|5^l4rk71W(qsk(ohh1&|tKJnB3B83&9tnvYibzN@q%0Cr3@M9*K8BP9LWXd{BVn*zJ+udp{Gk2+arPbHQB+aevzeKlT{c-lNyu&z zNCLa`q6DS)E(l2P1VW2csR~jRkPZq`1wjM^K@e2L0*Im_Dq;gGB4EXW6tVs9d+y9+ z1Nwdc^W}MR=bU@qbMBox@7y^vdv`}Mp-Y_QouMie6MDp1JD*k+iV3~di2Cd~p|4UM zCiE}Jgj~0ia&;K!w63lWgIraZFxUyDn2?79j~hnzt${FMc${@F5@A-<7bc8!53Vp_ zl&cC8M!Tvo;VxGdCX97^CUe3#R~06VcU57+gn~@C+p#JpOpddPFS9!;OqdpDJ%-s# zdM-@3FU}fx%&rh7%!#vpU25-&Fkzk(QZZq^QXM8Na8+T#B3BhAEOvc`2}=qvft}E@ zI~ioc!*TKB`Z-Kk=>$;FySRv6(+n~kO>DJt75|8IO~r`?2ZZ(j>K8t zerHz*6W)xoo_flz5GLR*@q_yIt_Ty}aY8C4ysK1)3CCTlFyVx26(+pzT7?N86kvip z$jJVn7@3f+$4|vvrLGR8^z_(_F-x~P#(^_?9VSF{D;e1jD-;vT>DKee99f~5P(hdZ zKhb7FMWq@x6Dlbc11uS1Wz`&1nG>owt*beqs;deUswrQG3DtFLANkC#2orA6tU)N)l}LTy(SCe(3NVM0B(XEG<$cU56R16LI$G}J48-3fiM)BQ${RWSkg zWtXrtLOLo;XrWsN-m`lyOlYlJPkC*GFrlq({d~KX@c}ZShaS&G5Q+)CoFHmW=&M^Z8fhBuB-NbIU$;{5#RFC- zCJfZAqz@HBF=4P8(F~gjLzL>w2}9lS7AEAmofIbA>9nqxFw9kj3B#4I!-P?~6@Nyx zte7xHw_ZjD&c3Ou!#KAwVZwM<6(&q@Rbj$JR~07Q+LOeM}-OZ;dI(&R|pek>(;A>>5EmQK~a1JmHSFFk!pXoPBk0Rdsc6Rdsbxp&Tac)-5zDEh{GM z)vX=KW~D3Y>YyBOs;aAltE#JmtE#JmtE#JmY8$@7gcn^^T^(FiT^;lS8RJ36YF{06 zYh=*wsJc4fjK9gQP*(@t`sS!zp{@?PwGJQI$gZfXgA>xeIw;j)!g1HCt`4qMT^(Gj zx;p5w_YQ1A%ie`#(3A9u9=~>o!-UVAAZkwdQnw~t(X<^vD<+)Ltq3MIRwyQ%*R5yz zsS3q}@6?DoSBD>z>M-G_f=u|u?WD{JzdEg}IpLzK3KM=)p&TY$(XH}$+9O?&tHU+j zYS!KEiZJ0%_uvW>{&H1e!r!hcO!&uDg$W)*P6>wzajq&%&|OuSU>F6M;B~Bu34X&G zaK!GYFd@OPGLa8T&xHv^3~LM?Fi3?kA<3|wo@VcgFd@YWshAK_s>6h^s|pj+TveEm z?)nN7N*b|DV4GTY-T*S8j1j*X52V!9A?gHCOek+yhyCg~u3|zZ!&(IPc80rRLN&u$ zfZyO?g9Gp3!sjCVTnz^blp}DIH6I!aa9VWDLRbfJFR~07QR*(s89jjtO zd&Bze8M~vxgpP*wOKZDAn9v2IdY@e(Oz3V{_x@q;iZG$46H+mumr@-j^meVngubp- zn9$F)3KMb)Fo6e7%ii)mnK0Oh-!;r(!cZrOV!|-PnvPF0_5!V#Fw(I8ETk$F6UG=; z3*3Vep_njUjcA5_b(pABhY6DkGT~mglQJhvaavb%!c(tfTkZT@fbC zGOQiX*kVuEczaib2^*b|iV2S?)nURWR~05~ zc2!}*7S~spu(bda*rt~KrpyUDjrjc|9472?f+!~JF|2K00_ky>@T_5lSE~xeg#CuK z?t-dNOn6C+Xak!GFDtdEeeZCvAQN73np1PaVONzo;Z;`^CcLIXIZSv1OnBbziZJ0V z3}0QlE5d}g-GeJkc*j+R3Gce9FyXkX3KLGKww*cQeODDGeBi3Wgbxcc;bX_DnDB{V zl@Hk+6()RcSe0-e&rxk4OgL>=yMMJSgb808*7&>aT@fanb3!U6oL8#Dgl}A{FyTAb zDops^wF(n{D8K}ELd)LVf^)*JM*ORz947qc1W`=5Vpv<#H0=eT)tqn*qdiAeC?@=E zSm$f03dIDEDOZPvHWPHE7PFb)H49uFe5P|XmN~(%RP3NIp^&Qz69Ouf!-Sw|P3dTN zMVL^;v~;gWI;*Y@#gqe%rZAzns|pj6TveEm?5e_q6t`zGCxl#8m=JbVVM3}|AWukl ztcnR4rZu>p-BDpe8PlqS#DSx#m{88N-nrAR5GGVItt5PkMufU|sOp4NOsJ+*hY2^i zsxYCts|pjcU0-2B4Kp@RU=v#QK0NR6B-JtF-?__SLOmylVnRdH+7;2X>P;OcG%>9K z__Tr*iU}=DtK)iAp_tHGji@sxv{9-vC$uZbgbq$~YEHPrRfP#1T~(OSNriHl(ABi& z6tTM^Oz45(8*Fz)=7e7E!4)R-c2!|QA6FG7^mSEXLXK+NnG^cEsxV=Is|pix3o>Dl zV^vHTYFhmd+8q@p3^T1$I2C0OWlk7rT8T*7r9zl6#0 zwF(pNcCEsMdt9q9VNwAmuuUzy7}i~RlBS#SC&xNWnCS#jOqgX_rAKSpiaib!9x$zV zJcVF|V!{H`io?w)D-;tJs}XhPgr!P#=7ePhneedNNtqK?IIXKWVWq1I6IQ8E4inaz z)_1$@t_Ty>n^voGc2|T68{C5{OxWnE!i2|MRhY2JRfP$g-JZ#uu*Fq{30qxNnD9hF zCTw@CiU~VStHfEmqr!xzP3v@;T_H?(*0dhauq%WK`%UX(IxO_c)d2~lJWp8SG^gf-rAoz#D09Mt zt}0A;NQH8k@UYj~;I+FVOjzZ${@S7{8VVEED2JI-Jq?8lYn9&9Q(vg?h*GC{>I)Ut zDK+Y;FI0Hc?V3wmCJ+2 zBOgn%2`&5k<-9x`@y7o;(V@Z{P7`WUc*|??%OrV*Lxp#|)`z*OLQ&y_*V+wlA`}%q zR3lo$rou-`#giskpm0)Ap@>a|Po3rz6+UzOEL8a1RfP&)s89|SzVcd6gTicCJz6^J zwPvQP3PpwU%3i!Z>C&I%i@daYug+7&V}{Ncr~GT0TuhQGa5HzaT}vNADfmVKJ4 zi2)SvR3`3D%9j~o7!;1rDq*%I}6zT?2Xop-^WRw zWlg|3*4l{b@w|cR_g$p4)cDKQ01ZuONI>J~v6soY30#)pF;4?o`ZyBd9bf|mb}iIU(z=3f$8}eGrc!j zZ7bR46EL03H-Am<%~lu>D+qmaDI znz_(6SA*%6d~=fz;l0<=-muN>VCtN2Udlmu!K#Vjde5y@|hhJOS49i*3&p@(uy_(U+Toa+TF%~kAQiQVod4FC7_(PD&Zs`#8U~y%`P@8wI9sq zt)cZ{YJuuIXyQ4bI-3bJ=r+ikEPAcpkxe~KJZ8d9ybs70>(v1AXQ9dJVToC5Sa7tUjABl+Ew z9;^B)8@>k6?Ki@;7Bz{?^;i{uwvn#^^`VR8A+ft4NPI=8(AzfhXP~s{&ThqYR*-jk ztjJay83wAVi@d(G0w3YAzMf&jTLIerM!44E`!eY4T^?)B^EPq}P%~X*OlJi--eYyz zZzI8v2{@mRZGu#rcA`qV{U-&uiA@mLQdKbHe>8BngQQU}+CYc1N|gU-(I zSd|Xg$PA#WxyYE#3Uao`>iUt5Yz_Hr*DL7Ek6AfoqZ4|^5-`47*LSx|Zv%D4MPA=of$#QMRq$v*I{O!(2|!&>gIf=CihKblLjyJ8R0b&K zRBf4w$5hF$d5SVW(poOHpdIlfu|1#rm9$p%j^ol#fXSUJJNO?YS=snZpGnri1=lB8 zW8m#1S<@irCt3Ypfwl!zJMf>{6O+H2Wc5PJ9?xOazvI~aIRrRK)(TvJJzvB2lWRYK z`#ak{-MWN}i^sqfsyO~7wx4!Cd*dcqy*FywU_|wJssL5XMM_Ifk~N$FC&}XKCXd-1 zNGHiMwuGy|!AjESGg*MCSh?8V(!oG?*1XHOPvr4jNHL=Y#VXB{Rwv()^VYay| zOuh5Xc9J#bWqcD9BkLIt)8u@!on-Atk|pM4Fs;rv+ey~*;DMO;!1R2+*-o?B#j7$?bk!BP;<65t+ou}+eexe2XoNA8Hcxym&{{!v}pPgiFNw!CO z3h)bEAMRx=5=qt>+%*X2w*d8=i{$(gi$sz&evOTM52*7l(w)s>;YhNkp0eSdx%jR) z{?!3@;rU6{MC2IKg^EDcagi~db&{;AS8Zfxpa#0gn9e#$)~ny!$f-a*zH}ozKgs&5s*U^@sBc_kOlO@WYd=m-i5WK!cfI&m0}#_$C&_y34;xtt zs75aG`p!B@*5*q#yeFV{-U!c6vL+n1k@o|&%tgj@)=9Dsylx|R0`;hPlX? z&N@j}%6S_(3n+d^@4D7)8aPSTD}UPXy@0-YBRoIJx_O_C`~oQc0-XvR(^)6U^7OZn zeq1C&_`i_`g^=AK$(p^wMpg%^rHj0NWSu1Ix3M<7KcIKr2-n;st1$?}*>5R8vd3z- z|0Bs_dn(D|fJ&0ZUw6<tZ2pA=I7!yam~A|*VC&@CAIi5+w?6Ix`%u{KE@1bwH*S*k z!ta{43SJ)1gFrpvBBdoK$y!fu*cj6q?2UTo~b-NAENS8hIpL)aFVQMaA081 zB@}0@HmlW*?}w(OSC0Hm`+gW4_r=vQnGd<`-Z(ly5GA=>$)*PM^W|gL!N}f$4O< z*-o;af5tXngGpQL?xme%Rl`gp-XWMu<(us!>qLT`WYvVJzH4@ptnEBLPLdV3K|wsZ zz>RdU>ZsdE)=n(QV-(M96iW+2oFuC#J~9%_HrRJL7&pnPh-;~s--PL1*X$%&!WbvX z>OMh1JePs{)5SVTR@z4NqzF!)H2ljspgQX$S)Va&z6rLv*V*kP%a13Go({0}a_wZa zn`Hg+gFUw6V4q72>FM9if@7{)bCax<)$x#r2l6pM_qgyFq?2Tg!EzDKAfC5@I_VGu#(%(_;j@#hhB#V`=Q#uXMc0RW8H+@c)&DjdneZTf z`wRc-xNv@nMIy;c$2lW0`A(%aE|Q&%9SY}3)@R?^@Iio%zY(6FWPNbKMlJ?wy^DE+BE;6RGPLg%#4jXw8sN*g&W@Mctt2~|p%W?f4C~dj3Ti18iNwS(D zArg2P&Pj?#G1-z#Gq9sG5lX)PrcmO|nMbN#H`%uXJqwBLp}}R-aS= z_)U_1uKifPeY*8-7ues1?ehY5KYQaQSuf&SU?zM>PLj2FJ=%3XE_}MDf_M%C_oj<=lB@xJZSxtJzKt=fB_Bx~L~3gUSKxc42bI_h?k^#E>z8O8GhiYo;nPLg$I zfQ?C9g(MRH_Gs827k0hRHdlqIhHG|`EMbh3WHpUf5Km9wa$KyFWZi-+)iWN|(`n*4 zpgQX$S&6vG^DKw$(d+DXl6CG&*q?#zplc_i-6ZSSWqWK-!Tu95q^JLTry%MsgJ&b1Bx?~qO9Ux2Pj#T`yGT0cCs{*w+MsR#40l0pIDZTrN!H%5 z4WA9@tHWj+c^6PKTqNh0SR_9#Tx28H z0JY0Sx~<2;@g!?>IU9Zy&`)lJ=O8z7v zX~S(~E1>$g$m=`nBw3?M*zk#f&bbkupJWY4wviiv+U+7^I_o4^892-`*}MhRr!F$4 zvrdvV;~N`!8K}S`&H!BBStrSQ7so~dM*yvHBRoIJ$~Wqtw>8z7v{cYIDzkn*b-Wh=FJL@D_3me$*N`ThA5uTr9U1+Fg zkX``ES*lLe|46dfo=URVM@h2ydw-hAohzG`t7)xg6vH&LA+Gol1WaC;jpDJm;w4yY zV9g|$ORNtUFTr9DYP1qWFN2hlGBpr-o!e=Fwz8cS*dyBq0!L*#KX6XA3j%-2c446C z8^kXPl#}g}Ku6g=6c{Pn<$+nUT^ZOQ+f{*=WV<@>g>2Ubv^VL$K9D8bje#1n-4tjn z+s6Z)WxF{rUbb5T%VoPY@QiG?1&+yfd*Fg>e@>n*{koLA8B=FU%H`xjN4dS49F^_w z$&+P!ExE32|48m7+dq>Z<~GznkhGoK0f9PiaXT=uOSXdohh;lBa7wmA0>8+1XuyZF zI3<)9C@I@J12tqjEYMZ9!vhm#J38>7Z0`!}lkM2RN!gAIT$AniK-$}kGcizIws!|w z%XUhjt88Zm@??8oV47_253H8$?7$A$&I#~E6Dgs2fgfbMAaGT-ivmI9I=A)3+XKTb zinqc4mJPW5e7y~Bt?}UI_9t=K@TB&O3wTCBZAUdVH_lr6A*#;-`2+q_8zY3)ZaZxQ zLC0r8KMK%-=z+XONe_PO{2!+X$?f@ zf~Y%oAsI;>9+&#UvsfN=x)hWVamAV1Y34z6M@vb&BhU}tDQO)8on+fd{rG)aufScR z4-71j?U2A0*$xf7gl*gR(fpfe>|Z`@Z_5|UopWpj9}>5{|5f|~-edpjmtA)Yb|ZbA z9v=okR!yHmQ(E>}Tr524TlDzmsINkAt?I4Q@T6pi{oVe2Y}+B&(f&^Sf^BEl-DbzX z$BF-~#2?+*j{i90)BE4z3)cI^UAXm{o5|hlH~_yW7gx9FaLnTL^p^Yuwgs6xU`w0P z4f|QI=)Kq+f-SAmDd_c!mc>T&tJv4L21PGoL*4s1g553C!k&)V0r?4c|i4@H)&c%=|D%DOF8wuch&j!?Vem*dn(|O7_0Z!}Pa)*xBQa;eX zK93uy*YP8u=!Ku(c#=YkJCx4et%*+nvAZsBiI&%?9!XC(sGj!1(aqYZ>dP#L{Funn zJNcqS+=jC%OsD^Am^=f+5ZCz$6=wDSHH@sxj?4H)4f$6L^S=!FD;$1%$SKQCy#PUr zyC++PDGw_AZ(%ShZWziEW|4&9uWyq8qy9g_T#E@qS;F8%!cxJh?NpfmttWLn`8}a5 zA>@0nS|CGT`L(=&W#0Q(dspr^@T9c%5Bk-!_Bh-TYkS#J&xOkz+348>_|o!f3182R zmmN7#^A^DkWtrk7=+Vm;33_g70;b~d^)@0!^x6>mJajKsh7>JEM4z>lAQvk{fTo-G zK`Cr?hOFr|ra>ugroduo{Pas32(cfJfUbF~BWff`51`6h19H@xM6<~kzj(iyg0#;J zErcBR=-+s-SMDYsQy4w5Azpb<-EQFV-cW9l<-b0CY)dG&ijt_0xCcs2QBw44FF~m# zN`}5L2TE;G%IW+S?{alSsir@73QAp3YU&-vL#Zc9L;X-IC=Eqvskd$frI9G@^>5ch zX)H=Nea>zuO_ML;-0Y`k;s}&$Ui^0`L-glpX(_!PrLXP_rIjdS^|VwdtpkT~G$-og z-hk4!=nf3fG`;3BD7P2J(bQ(>r=~$^=lciIX6lniL+Mbs@LRZT)H4{Md&0X2uvj0+ z-R@Z;49g1r=MqqQg(6Va>+Sx6(p$Q-MQ@1Dh|2YmSCc%Y^Vhx0^(|DkDekQFvSp$4 zlfE6$JKzFSuD`D$0vy)7n{XJ)TXINp_&UZ4X`aI57hlNZmjj+NHU-rm#z}QMRQ}P0BeBorKHRDjwhO<7cfx=e&l+_!X|j z#WR3>?kNF&FfJgeo1NlbgBytsN)m>n1Y7q~$bUy7s_O)5anu7&`_ z>B0!UDalX9sNu>vxE{7HD*SBPgfem%sbcpI0etJ>Vu0<9i{Fne+t~dt&>W3j9iU=; zOhCb|`X%74b;|(tLR@@xY#Hh=BBjCnR&!<}Ppr^Kh2mR<6hH-7hqJN5zPR}1*fKz^ zg7%!7s>5Dc9SXkSNhSt0(sIyqt6;{ekR#^+U;L!H$;P$ZBX`4;Cxgv*LFM;L%jL4e z3NyvT*F(jcQm4VxRRZ#jQLzDgU^1w%UkG@*pjVDQ52nVt*sP}l8ip{{W z!?l_fm5jNBqo=ib;jz8p(NN6Wo{OH_q{GBA8qR{p@qNulLlYytal8B=4I?WG2m!=UBXc?9-e;$Mb# zA(YTW>^YYv!roOK>ed9vmrz8KakNizdgRV(2<*$!L%xwH64ObcolwoZpVL(NQlb(oysTFz%5pgK-f^G#y;yR3#k z=fd*%dM!z0I+nyIccu5Dgdf@U5YzUwT%S#404D7;@y z=Z4;V1zP@&+vZnF&`fW>87+UewLxQeMcbCn4ZZoowAi-AytM>3^yYiiV%y$?^rynR z>DsoBvp=0p=J)IkRC+~5*^T%_LV6K$lh9P*bl-~jSu%1pv zoN1ooOxAf1rMjTVSOfV;g?*l6-lFifD&J<4aWc;O3I{x;_+5SeUk?cQtoonuyx@D< zEFa&_W%>9jw!u;kk($9$20U?3l|~xD=PQ;kqZQt|HLfzgu?7J;U)eRZ;beTO3;{nf z&-ZBM?MTG@0>Sd}-Bx+uUc`+fg(U;<*%5@H-ZXqQ;5Ov4Lu=lJsUK3@(2eL%4@jOs zT;e$J&E#jq0VDCvFCjOCZ29RMV?4Kub|->UUuts?Yl-qoZFeL5u(Nx-q(m_u_ zZc*uWQSQ*U&4SWil#Y5I9NbEGh|)&XM@xW8~AQ4aWDXgiCM2^D7E_ld5;fKYT`zUl8iiP_WtP!{?p)lcR+;>pO###Lc zg&CvqO+5+~9@n(}6yEQJQ;EVgEQ&ixVbw5A`-Z}3n66N$httiA_VOY*ct-(+_vd2e z4TZ_bW2#e#JAj9+6po@l4^mhXz^hFttXhDN2PvExjv0)?sU&<6h(i4zu?~X5JdDPV z6xKe0hj?8fynz{{GKB=}S6vG4yokrj6gEDI6Pv=iHaPVuG#!UqGzw{$5N1;-`W)8K zP{@53s|qOe0imu^$b^@LL^5yILCmHUo^OuZT?)US$MZi5&5`i+q_Fy=rmdw=8TsgT z3cIgi=qPL+h@qn}7*S7BNXD>yL!l5Jm0qFH;!aFlIKX-JdLUhmLgNwQXfZLNysJ2-MJT+M3EEH? z4{@WKnhiHbT(6H46kP>biqM+l|rZAu`q!`{78H*MWG{R)?X=j$72@l z38CJ%n5QYMDULNI6s9F$QlQWc(^OvygMQGo5ftiwid9q;qH&rwpTeG(uzZ}tJVVo- zpm5(-Wcm~ee~uFkgv*O7kEibx8i0BgDEJ@3j835`j(bZAzo7Mz6fT3yC2DK=}*95gFTN9?nV%`}cra z6zVSowJ2==0@R|=7@5f!3g0~oYEfv3EMp0U$P7@6LL<<4Cxs{u_e&HGVOWZwPkF{Y zpcaJ%5m1Z5aa`K#Q+Vbre9S@NZD4v)_@O->gisiA6R1U@^9P_7g}-pP&rn#j3)G@; z3}=cb2f}kWT@oquD24^i6b2%4dkQlj#sp0v`!c9SAq`F3OX2i8pcaKUaCBBvc(Vqm zMd7by_#l?T3n%gIdkPIOBc=9-FcJG+fkNj8K`jaw-vG5Jv;wdzgvz_HcJQy829YEdY^2GpW(^)^t8 zLSi9Mi$WCSUrwP@M^K9bUk$y7LXTgt*oZ=%?Rbq9g{v6DNG^mt>{m90xi^7Y6#8Kv zyMw~pcjGRF!i6kN8%5!dV))(~g{@;iEeeaLfm#$E34&S_MjQaOFuUa)$37)dxB_mJ zp->3}UY)`_kAYfZf-r`{Z|KGh3QN$$5(;lW0cug0fyrSfh1P$AS`@0G^T#OgS2;eV z@MH;43#VURs6MDg;oLeo-tqFoeigpcaK!G0vqZ?EVWERtl@D;4^ay9fyEg6jr?mYEgIr{FzUoB$`-FVe_4! z7KM}LKrIUT>!22eAHd#^DD;WqLp=)h>VR4Zns*83MN0~wy$Whk2ql7A6pk#_v~d)+ z&B6LI3Qyxq*+yaNL!cIga1T(6LKp0NU?_yeIQzpC9(o1TqHqkyy(WeF&tr`fg*I3~ zIFZ6toDQ=oY<(2eqOcjevx&mtI8ckipBV60D13+$|2+x~eE3QNh0aSf?Pm&;Fo86| zM3dJz0%}oM&=Az3uxu5mML|o(Qb7vm@50yRC|txuw3kB1&p<5--(uvw7{|P+tw1db z{kDQy6d1KSg{vQ8sV0SGVI&n4l5lpfx4>!o{yatzi(p{0P*dQ0+}ni$YCs^&SevaKb)7LHhysJQT)a zR9~j>^GHw&^LXAXl|d~E<%)n>6xw+~Eeel=qV*_@nTmS~3I{>Ro)iMDK`jbpaaOLT z(EBo|Md1?0c^`%3+d(Y~{c(Bxh{74r>Kujd(ZnSR6E`4r905T`oURn6mj<;cT-gq4 zQMeO_`#uV(6_A)w$jnA!MxhVb@&<)jg+MLrQr;IBu`q?x|A1N)iu?p>QP_l2ss)7$ z8*%$cAro`LKnmdmP>aHkO+YOQt8N9gD73)Y^a_O?S3xZb6_I9~rm(Lns6}D&Ui|6> zg%3O6Gr&<0qL?LeD7?J_)S^%XrxkB%^6o+8g%k$kG+#@h+zUv|C^UHqx7HM%M6jgM z5cWO@YEd|bQLRql#WSE5h2P=cfx^l>B>fb6fpsG(Bu@afD16xn)S|EvxVEl`WX09=apQD{5>)S@s3;Xk5Kr7oyNVVob-qVU1Xpw?IjzdVWWno%gX9-lx` z82S^aMd84^pcaL?81M%vOiBT@C^Wu+#EinLnBEUi81Xp1?n)v18Bh!RmiPSqpcaJ& zI4fIFSoR30Md8zZpcaK1*srk^x=ce-LE$pGv4_I%mGRLBg*s<(+$p?04=c(jcrktb zLZKbFp^b+y9v7*?6khe>{(^#rBUqWjbDi*s4uwq^-bEBDe1_X43Qwc;Cn+2qh#yC# za61}3O5qCn^DBjhX}I`;F?n@c;NnZ+GES>IC>(zpG^S7#bLJ=tAC&}+DWrY`8dDgj zVM?K}^Z>F83hCYPR(J|`;kf@qVF_6G4}}5fPjDiHAF+e{vTfe7{kV~(@LF+v>6gN7 zK}4od`CgnL6cTV&Zm00(5~PUv4SW|F< zP?%5!CkTb{Xln|EQQ+YM3X3q9YbeaRiW7vwS`?pCh(E4r7bxWXh;q-6uMNyUQpO~ANGR6;S}rzg{psHFDTUb9D6}w$!=sa z6b4pDz6$19KK`V|U|%md4;I<-U66WJLpg8A2~E2n0L#a(W)Al8H!lW@Z23Cg&w5ou zIdAJRJgo)5@*Nczzq@Jq>g=TpYb@V$3t6&$ur2esQ{LlUv7kx7TsAk@H*Y;*EyR&E zmM?t;OV$szWj>_p<*QmpPfEq}PD~7X%SuR+>Z)gQ!|xh6T&r476hreS15>rW`O6Xb zBvx&rCwIXm&h=>;l+U7-Pcu<`nzsZnRhyd;z~IwXe-Xnz-SxS>7#{~}%BP(u@OcTC zs_o70fF*1$1i74Ecoh`Ow;rXhGd#F}&;Pz*7g|nHjBwSC>S-?*_4&VqO}q6y%&%3u z#TDh2Zd~W5Ou08@!Zc8xymQr`dTf(>3u}kSLl&+9v}^0I_D*@+!WDt4Hm4%4)m5|g z;0y%r$ZEGg>XSG5AYcJvYa_T;qiQET$PwlmLiMDGJ<@Wxw5sYoaq<+2>k94Yqe0}V zUG%~nU@kNCb9AN9au$IiRafcKO)fnY7yB7(dK_$<)Q3APJolze&0%BxbLJcBhF9xLSLKR-~NNr>ZDn~pCooV08 zz03`cLDe`J?oq6j4pG8U<&&}8&ICLqW4ycoKsAutU59;7nA7bu|6++Dhms9JP9hPCr&Bk0+^_V>4p8Rk2B#y!)`Lu_Nd}4+v zH~w#!rpUAP-33i?Th<~+tX3%T6zcU>ui(S6cv(}R=?fl#l2DjSD{x}XmmF44ti@umLH7+iY=aj5H2V1Z|COylSg! z7XMN+RHue#FjyZ#N(vWFvnegtd=*t62=tU&oAdZ=)Lv1u z1edxha88j*sQz75bLFcYqc+Z-n@&j#u7kC~8s^ZO&MKmFS*%?>Jr~uVs2ClbYCk3H zIENyqB^|TXc|MT{(q2sjs?Wpg0&rPIgX?P5u@_q9)B<~MniVG>#OQ4!9vOoa4kMoMbzFqZ^D|Dq=%`3vroI)J|_)-CqF$pUGCG12C?nKouf!Gx%rzscp z+L1lnw{vPxTD#Q)o-K;%AM8ot!h29GJt2>Fb+!yyh^nPB!dwAt*QU-v?L$(_^}sRX zF!DlQn4XDC;QC{;FhJSSRL)-BhY_JhweT=FSiTaR`v!gs>pIzEuJKjNB)AG#%dK7o;9F${#TM7Z zg~D2H4VtoxQsGKqd-Mh~*6Jek=Au$nJJ`pyu!DVEEt@wI=VX<~sB)2O-p_}S&OsQ{ zWfS0fhv|rozq|oBcneWAHgF!d#;CcIt5WaW$Kov(U$FRzj?1LTHjQiZ7^-AJlFQiiAc9ud;0qLKA{+T+Sw?^HeOvB&Ap^v_X zJA7!-32R&9`OOyWr)NSg@{9W+HZ3;v2rg_}AZkPZUWp6=Qp2H1m672>@(e9H7QgfW z$r>6z59L;*$wNPCfG=}E@(i8d14${Q!V_9%V;MIjG|yj_>H%@uv?)V-o<#O4(4EMq z?}yZ2;<$l$R6wZun>zl=Hl&i`z#ijo>fI#~BbdYiMSi6=nrF>D={OY+BFW`nTeU$o zzjrk$21)O{w+Zy*T&uBr_Jyo&($j#>>wks{riGQbcm zkZ3*uk_8g2v)cjWeYv4!`fx$;R4xnomO>tFVJ$4UvwK;-oC^233ICS$Q5-LUQqwV% zn&GpW;50D|t0gw3&+z#8vvEe8rBA@d<1H+jIcEomZkR(yjMd_{AdA*3h3*x16Nf>I ztN9`0r7~PBQ4<@&THVTnLGyDd zpmB>Ihgb9YxfIa2Rg^^k2wb;}nxdrmxfIZ-B}#^$O974AqLlM**bAkODAoL23TV_7 zrKX=t0gZa1H1r>81*M@VE&W^yXfzU~z5mE}{FqeJ2GQ0Dl#6wv6Num-Tjel7(xdX|_D%L+f20vf$S^P#Nwb19(FTe`Ew z&!vDyAAcM8Jmu$7K%;LV9_Hu#TncFPlfE7Bb19(F-?tP24r_5-3TRrP=YcE4EW)T5 z45%!kGXR#4hIk$@_A7zMn6+)81XLC=nWD-fWv=Gz=7E88uB7P8$M7%baufhn@x9@r$?pOddizb_@1k?rN=gHnGr`7_!6 zo?P9}c-N9IivCA(G131_z8%}*IsM0AZJyrU=h1q>zZFI)iGpppO&OJ9z8ibp_dl}RhX zMg4`asJ|f$>fm8Lf6+oH_?z>^e6I)8&VL+GJAEdgcKYjp+S#)KwX^2~Y7o8&aHmz1 zYHdCJrHiVcnxU3j8;Qoe_rZO`n2-6(@EJ{$ut_u;V3Xnts2ge$$Ilz;KwZB~R3Y9_ z2kMDpXmPxu4%9aX0G5&%P&d@vMdi~pDEqH`nu+4m;&?+HXl_2NeAEp!M^O3PUQ9+) z`Lq+ohu)bZF_3Y*uMV^~j{+U{#9ug1Qj1{%;hfHeHDTUr2XLz$1zjy)C6uY`bVCS9 zZUM_}sK6p(eCH*dx7`8Ub`v*%I2M2m#inE_-gO7;yKf?Ro+v~H@4f>A3zHN)Ym#`f zYZ<)z4h)fKJcsOB-hBt|bLH&;09MvUoop!2LL`&EYb;{n`{Giny^#{;+@=fsiJ3^iH?@5ck<s5V-k#3;@c{0}*#S;S0?^WVKOVsSI0tAQtG7T%5{Xr4eI5se zcjW=xmD8JNu7YvAv~=E;2XI%;Gm~d?%-Na2yYj%OGCT=*f~!U|cvl{HJ(;yU-LLO! z2JgxP$4V6iTR08eVCP+VU{a8i8>feSyOzPb^1zhhoDqi>G!;uI8!uOigo;7AQY2If z%8Z^+JzlOT3EA;-MM=0NzA7gxY&pAf%ejz@p55GXc#XSri3Q(a$!nn z8ZQ^7gl6$_VM=HbFBhhSmho~yN@yJ~7o>#S;^l&r&?dethP+rp+jtVDSi z_VIE-O6U;J3zF~9OccSJeOn4)((3H@Xu;}ga`fLrCEJ-C`?SK@dTY@=fFY+qnM&@z z0YM$rV3BD6bj+HDnz-6XC<~_+zYmDGRFsJ;GQBvOaT9QO5?5w^K+I?DA^)1eJSr~! zRmc}JZl@f^B`5K>i~*EiMBbEmiA$rja2516QTJqU;t4kZ(Gvr<@@Y3H#XK1#L|pJ6 zbfZUdGobYL0aUcXloIS&LSj#B3b~gU<9_@Ya-Wpn(HH%00`=CY=o>O2>vLIg?mblW z3l(9-YE~THgo>PSIxDubVmP7K{bdD{n&?+Kme zXr9~(d2;wi$^%zJo)Yd0U&}WTWnchmEMG~8dLD|%!!?0;K@YIw;pvY;c~K8768tih z(e)^jIC@&-YEf8U(nB*)72drF$^iw9+?NIApdNmbmQ&ZDyrPHRhhq6op^ScqLW0HuGu%2{;_|K+8c})))3B(sd8BIcw#39il?|lX95j}i`(CsauyrH0xG#<4#^>7xz z;mL=fyrmkAbm|A?n4VUbmT60%yrYK(K*9A7WppNrBpxJH@L(jd&?2>}1N^R@(uJPe z(xJSkht`VcMtVL+PmYEvR2S>#0(U|$xtLBBzk~9D9(qrlKBm);1)Zp(Cx0SJxM_v{2gbKp+&Ylg8*OXsiPR} zi(^nu>!G6(?Kq6C{*jMO(@T{I%1VO`-MnE~Q zhiXExeDzUATd}d>GC*%|fWFa_D-t^VB`DwF_zQF>p)(2PvAeF&B6At{dp)%aJs)ch zy$JX+_jWT)?MH0_qE%Gyu@-KSoepH3O z-T>vI9=a&d-w8Dm0p%Q_MY>Oc^*2539HBLyhH_aCm4w~$l|dP;PiPLiUa-(2+4BLu zqKAtB5w6A)<##>QO+5S1bExB~Mf&lax~7M3Bhj1@X zgg>Xn-vdg(kXa|HUzGy5pF@J6JJ6pZudds%$j6`C)4t2YbYg*&_*cux(&+c zJ`}MNz=m^xq!?+-iGP;PVIy=x@F$7q_ipn0tVQ+`pK7GNMtpxf7YL@?EuR<$rKFL1 znU=RgP%?~AI_6!=R~lus4T^u8xm0x7xi+AY7Fm-6-%KMl5f0%e{)ST82n~`z!x(5X z0|}lI!jn#s9*Y1hW2ALQUAPE$Bx;1#K(TxqP)2v7P+pW!OMXYnZwIifk-7+V;j^4U z%NwchL9u)vqb$p2BHus?Rxm=Z5;Ow47p!E2t_bKal+gsRNQI^Z*PrR-!9%HFWh49@ zy(;3FNU*9AstkbTtBx|-#PyG6SGs{zsWQ5e5IH zJyb5IlfO1_)s1i$7{W(54b?D0E1+1uM^HvzbR5+9%h*Yw2E6M;c;JQPe3T!4iDynt zBlMBDe@6FTU3YPkos9g}7`R$S)|+(thT~nw2*np?n?+GZ%c4+&B2Kc8k$0JX)itvI zq0?Dj`0E>?M&i_hPC2eq{tT;{8@&tQ21eOzAi`h12Bnb^nk1gn>ACt}JXM>k@#r(y z*eE-Kp64n~n^Jnb2ovIAK07y5Zy|phb!+9F^ zG)f&~pmVsL3-&fbrQvP)%A<^S{oez*S6D6b-4X=oW0XpUS9mkY)6WQvmS__gZFRwD z`8{&Gh3}Me^3E}`av39+2WWs1+AA^kGsd_7V+=Qton`IJLV#Q&i@&iS9uo&;kP*^L zaR2-$qc@|7Iga`6a&Tgf&_6svgN>4x8R*eYP=*?zHWKI#2D<-W0_8``Ki)ARXDvsR zJfma-xQ6ScKpAF))=9`s47t}0sV+SuzW`*ok+zih*C#+3X@uT^V);Hm89j?ab~}j@ zYEN;p>G}wOql{9AP#2!J8OmKo$V6-St`W*;DhlOA3AJo2lFsvYjFEPgUN3V}A7_-T zBVLVA%30W+o~mnK{s6>yBU}Ylk(X;inPi_kXYtz?!O2Ew0xbBpGRo+qDAbtKSt6(o z#Ei`Yydd3cWaR-Ho(XaWry8OC65}9a{O-n(LB4LJT}rBEV&c|#5uv6TsXG`qiK8*Y z2o*zP_%a#FXcrXM^Wi^Rkhn3yzke9;Npfds)eyzKXbG> zeQJ@%7Xz}`DD@ff&(wpm)Ch$E!e{y@qaBHtJ(FIEB!ik?%m;3h5&aps$a&K337c-ey#i&M5o!Q8%h!w%`nnNhC)`4d z4Big#b|dR%Ai{i=E&?L?~*mUjjZhqQeiffJu0=1G@lM-uaWT!Ew^rf@~ja`NoVsV zQAVqvP(vd((2;so0C~>H44^*TOT&cryh^$wcQev{Bcl#2KRpQLMI+Q7isc)EGCC23 ziX^wjk!dvmdCAD^O#DZj{|_MhD9qk&gL2SFy`PqWOe9~i&+QL6s~k2;u7f4=2am}c z_A%kxM}u#w**tQjER>^0>T3+}F}re1T^%C(8bW#7DETEVe_%onzN_Z)$llUWjvFc0 zXeq_1=7hQeMOrL_^1hK;yd*4Zxyv8g-T98^&__n73N1rsKsl)r$w<#fp`0>OThdbJ zW+)9JH{P`)rikBQS0bb7g=P< zX=FW2r#qQvd}a50Ge{IXW2C-COYiYe&f24J9zT2?JZF?VM+?8i75v5?xi`Ln@-60s zQn0k)?tO2MPw7ige!$E~%Z_X)7m)u#!AcmE(Hs=&@K%k7#7RL^Ei#p!KN+dn^gPuT z$}h-&#dA76SG%62>FK&_k=aK8{?#Zsf}V%(g7O>kAMxBz&kz2^vkmqdzrce}LxPu# z%q{eMZw@@K7^y#r=OvW#=+vL#^q9v$iyRsT*i|F^6@5p@0+mUuW;r}qwlHn0% z(iQy6KF)PMg7UW!sYc5nQb;pHU7=XM-YBDYp-`hD$C)Zj>|Yh|KuIuVzKR^>IUY2#zM_T6elXDt`7`NR7-h6PikKeD{I3$5H9Q(c%rbw{^N~NH z6f-49i}YIyrMOv!pI3#WPe4gFL%k*D0LC1{m~MijMcVUhFJY#)C%)DPP(o&Cf#4q` zeoFy-5}%lAk>K~hh0W5_=#-ADOfb!q$2pN+WN^A!axX3I%0nq-rhWSQO|Bdj;GoVE5)`FyS)GS#V;PB#Z zP|DesGkz%L&GdS-bmmE4Q4K?+-*G6F%=E6bTpR?YitY1bPbgK*@}p@vd=|=0wx#h@ zC^wts=F#$c8kB4^v>OT*Jfn=BMv*_LiULx{$t3AKtv{jwoL2(NM*`vo7h@S2Yam(; zGh-9%;iEiwx2n*Q!=!LcGgHGh{Q7w)warjjD3-4>%4iD|F%y5o)4n~O>#!$50xYGD}A0Fja13rq7|JC`Y1+8QKX2 ziy=@(-$8MGKV)ws3%UZ_)XdsI&*fL3G`C}BO@q?HOyi57!X-HmwNf!7-P!lnX69vD z#?*z<#uP%X(EBhQE;ckmvqyP36vPH8ou^fW_1i_>K~1tJBURQLKk3|ucW>kOSvfE>X- z_So$vN&1>uDR2uX^oEjy`2-5`AC%D^1;fca7iq_X*xxL7Go7lBfK#q1H%^geJRb&{ z;lZ@DF9Kz-ZFzMOlp$tlIxP>*fRbmQ4{yE-&oBSO({@if36Fct@D94KAQPsVp=;uWxme zXLat~EHiuuJ!|3w49+n_E5&miJzx3{PusmU_wE5RJfH66zJM~%41Fx_pVR%K>n?W& zDv6!E6u9|j>QOosI|^l?a*9+;fwIU<)yly#mSerdwj5#Vz0^z%)6#~g!$Y>ka}$(h zW@zJ1&?=8M#rO211w!o*{_%9@d`8bb~@F24$3O!6giU)Wwn_)la}F+ zLRo8D8a@T(5i@lyEu9uXS#Mj$@_c&KOnsJ?rm0XinxW63;I}qVM*l_;(*@r6CaIw~ z&XeykGxIn-AM`n3)k;+V6m}-9D2FabTY` zGaAs+;ZG<#&CnnymTwr!=wuY?9919D9GMQtQ)a2|#LxK~%5F2XT<~j%-|pfmAxZ+z zYcy@xXT6$;ggI$wWgE6l47-)Cn0MEvuNzuyd10?6{+OnhS(&kv=w$Q_)fUNB3QLVdXI6Hs01jEOLoSwDDnrzo*No5-0Nnk_vzGZ7L+&D z$V9sEDtOe)@K=PT8p9nkL)D;IzFSa6Z$qKNaSW2wKzzY)Z=0n`!x;X08I*U`Ktwup zgL2%==tj%Al~7KYp{Yrh;`v-TeUz+Sy?mb#0c7s&Gu?LF@FCX|oNjP10{ z{T9keGjsxqP=KHjqW!iGV4E+HGA0$;qqzn`)5*J-06)dz!y(Mt}$;`Y!_f>VE{9=Y`!^iS9 zqcel@cyqdt6g7?j`4P@dpN5kJkv%cI$dRRWMpW># z=YJ@pg{wI6+>b(HKNOks06hLSOMNDRpNFD(WlD;a=m5pz%}7Il@FCs->)uckD3-4k z%IFX`FsB`%T7IELwlc8cEp-dseO;k=y)p|$?(Pi5@@9;q<;`YL{9ZZKk>s9G3VAaY z(UNpClz4CG87P+T1(eZGP^htS&qAT2&B;6G!Xv?3YAfA`o^1)bDQM7?#uHSm^viB6Syyc&7c&HGc6pfvWTT%;v15lU0r zvbPYFX5LW3O|V2fP+E9PW<#-jwNc6kAGbru@1YjSnF?4-Z)#ck{P8}N)?T&5fG-9N z-sUaalNReeC~duJDMN?aP;U1|#?dk^2TFTyXblv6{*5wv5Ji3)YB=3TMOx&6#qj8W zlZ5U&r$g!J4Sgc+r|EwAMt3dJ;W^+sc}u-br!j-NQjBL%iw+{jQQwhI&hv zM}Y9FO`+WBm1mWa`V*iG^Ok8sOL?p`4UWJB0>$!;LK&TgBELy3Qe!CaBfS~DiGQ1C z+GtEGf?rSk-U4_#?f)|mxVyX=3+U9*gfi9}dPkf-pwmw`I@z9Y4F`CfH{%dJH}XW7 z;0^gPo8$Qx%4ii7`Q1}Vvy2T3EaDjnkBQ!lKk5EL2PpSossjrmyO}Rf@@CdSfN*JE zC-3!!`b*#;41BK}Sa`t#6Tof2P4Q-Srqi-4DAT;5hs9|vou0kXNjityv`+z^?#-M_ z&p&u*W_m-%#q%S2Uj7eH+dYZt#eLq)!*s9pFqB#LHRt{(pv?AW>NQ{)KMl$Qwq-BQ zmEc@&W;!h&4}mh@whZUKFYspGO3SD_pe(X28@Ypvy_p?oxyq#^OYO@^J%)bJn{_8G zoj7?fvn@XKDY)F5bw4f5mqJ-#TfY4T%1Uq6I$C;@=&NnZ`pr<*c(eA=a*gDC#4AZw zq-;GX>%5sKXz`DR@~C|g9NZ7e25;t%;`2C^$Lx#XuvJhtd9y6gF|g zws^BLX~{{0@`N|k5{l)!9c6R?iWvH+XJaqV1#a8_Hv`Tu@Zb?&WuyRIzf&CK_{zrUo>J-4cEEvHVMy=pGF zl9k3D#l!tIO5fSAekC5>UDGhhH|KF1Jy4^xW(_%x`#m-5Ud}fYJfYukJPMe zXZ5zv;NfF9CRFv;vidvx>WUg^PVtAtmCb8h%uk6S@nLt`DQmB z{>8l6@Dv_CRkP{~eA9gw9!{7yAG!|@pQ%~(Q@%OI*?Xu)`Excr4sKxa=W6Pc+wi99 zmw5PmP2Ht80c!b)E!Rrz*J-3pY1{TsiH zTf&vJh}_5d`cBOSi|}&ATUqJRnz|lU=>RKDgeyG>VrS^@S*-cJnhSQb=2!j?9)3`> z?q#axU*lJKiM`pct&!~uZ$hyj)~tL!>!csS!{gXY%RxWib|W5sRCD12eDh=Eky`v? z!@Rtj2>O$n)t}{?LvO*u&u~JVhdTSegomHktotF~{3wTqU(_fskcOY%iiam_R{x1_ zdP&oMSyR^l?j%)v34R;X__0<>p(cM44d1#Bg`cWfw;Ux_ti1sbzc#Bs#I^fP%_V(& z^I^{Q)28o_+>M9d)m$*jH_W@Z_z$M1Xf7YzMmv7$o zFdn>=?tAs$;Grs2|3SX_%{%aLT59F@@BsNAzblEVzri1>|L|LV4N4?a7k!z<&n4cZ zQgus!bl`vR+qeZk)=(9qb1}>+e(uw#QJZS0MzIzD$*DeFS8q7`vv^pTYS_&;3kUG9 zC{T8csB#@L8$# z_p;`{QzT!Os{4_u`E%Ax?Wp{^W{`jKYZN{^)%p$Ay#1$mI5(vk*YnbNI4^bK*{HkX z2v?&nRd*#G;Qxl-#$#;LXAw^F7hR>z61?>XXlg~Oo~fW#{D>W2m8!c_wfhFPdz|g6 ziC2gg{H0OuV$SXPsZB3o_1%l`aAB(Mi>mq~to~cSdU)~79G`*hv$#IB{$E&qCz+x( zsg-BptV9exewBrE3;xhO@Y!wS>-~-ssIWG5;b|zb;u|~@8&Y*Ws`df=HXf<0nP@ov zZIo+FU9=l7S6o5e*5gN? z?`kkg-q9z~-@Fcm_omi7#hPFFYdl<&s=Gqf+{K#Na7`X6x*vL9y_l!*zSO#nD7NBH z7vW)ls_vMoeiN&|(XXz^i~72fl(aeT=HH`6cdB8O)fd*`p*OYixT^k9{3^5U7yTx* zS#i%eiajIM@J`mLy&Dhxsk)!3I={qk;~6-e1761N?1P(8cp$a@yR7+kZi;JlXB)O~ ze_of`P=~rJesdun4y6=#-|+P_@bJvkx)!`?*h_578f<&}nRvK9RX2<`soF98Hog)+ z`hyXiA@U^}9_mMpT3e1mmZInnT%$55h_I`24(KX(Hj zrc-slQpJCd-^S!_zv##I;_cDY${(@lfj{73Hns9Xyhr>4e%0x@Q;I7ZcuuGK#vMF1 zj-@VKikB;X&ja}{QgsJa#pmL;vE-_>YCXz5KUKGnl|Ho?4=+g7y-HQOla=1gN@_{@ z7y57|zSZzU;=@g;3vLE%1*!Yu7pCeyi3da(;kWS#{HT#z2&Q(D-iWXI0&3inTJb(s ze}69?UX-e3mz?AHv? zR{f=ZxcrFIIuF(UD%JP~wsF@|JlvkD`-y7fNw!f3Da)E6)$gDUtD)0D_ZQ!hYWy}E z`fURq?gaj$Ht-+6jop4jY6RMZzWVhj_nOq|M!Z~c1yzNwOVy32O5?2b0#;JxHA>%4 ziu3x^s%HV-@NACwZbLo3PFnf5sk*;cmEXzA)U#NGOEsfO-Y4IH!f#AndKXHp`0CSm zxHqNc$XBn%!<$m8zsNV6{|OIoHV5d>Tk-Ig)T*EH&0oI+4{tSx?#_BVye)NM4LF|_ z&w48!-foW8SCaC*BekNQZ+bt6hj*p4`ePr@l>1YwuHc(@KZJ+>ovO>>Ayqq!-^SHO}zOCpanpY~CFB7#{v5bS{VU3uoZBaW#Id zSK#CrcMj_wjZa~r1=Ih#W2O0I-lfm__NgN zEZo54e>_CfqM zK8znt&-5q{P?-C5YSsNL&on}de`{L0^UZj8I<@lKeDj{S;NkbWr3R*9Ui^pDs^9X> z%LeiAe@vancx?U&l0gPy8wN-uyxLWl@Xg&k&8us5kG~IsviP*x^V59u zix=Rb#?;wDUJ{v?$6c2T^7yN;5emR1Nm9>grZ}=7^tyQ&a&cXS&;^Rb>3u=`ucBiCErj%w0MK5 z^N&Q8OKR7?o^SSHbc;8dI_>mFzN~i5d-&#pTk&SIsdLpZ9-3;`KEyX|BqJ?m4(fh_ zht}GakMYgMoA9vJ%t7-@@NjwUs{iDhzpTN-c2j2yiNzJQE9yW_R(ym+cZaESHVN5P zwJTfrX7IOoxZ2biT!4pNwJY}X%}aSg?KXAF-@!wB?aE=k`3z6Vw5jv!_u|c-+O;p_ zn?=vY!(LNoKe@+D?Yh6goArM{@*A&LB|BMAy$b}B|EgXHI^y-OV2XtG^(--P@k1!R zpn9(n8|(tAWzhMwR^y+q~~=rY}JY z0zEOokq}z zfZkUJP?Dfg0X3`wsD_|P0e#?nfKmjN1@z*2fNBYv70_!o0knXi=L_g6oGjky1l=s4 z?_LGaLV{i-p#8f5I)k9w1oR5*b#Dq=43#uO$&|hu^=sfSj1=WuTh&-0J+-qD={iuNMgpSOsW5p)~^tJ5( zt?*VZsD4sFonR8YmEO4vs-G4Rqt?7t1gV69z@ZH<;;f#}wrX!7P6704F4_g`{SpDa zi=YcRh06tWPdz~OUj2gVdI9|u#}QKDoxPxXy?_{p;;r$3;F|?R^^~`kU)(039JZ{t zj$hm*AUffD4gBI>0a07%HFEBI1#~AD?IKn@D4@)l0Im0y0HXy&<*#=!+ZquNmB`)( zf+ht-4Yqd)L9+s)e%iZ~i*~bsZe{Zu`Ni7=#1Mb)GJxpfm3Zf}Ru*qn*4fy*0ou0Wqe^+d)tQl%M}L zbP{wGLA3&+X2{z~oLC~D1?K{EH794efEeBC?INgNKnzj!+E{VDfEfJX?N<0DAV%_e z?F4NT(2qFm4i0;lfaqH9rMW_T1;iXD-X3om@Jm2XaU*xK;z0r3Pb}Qa?S8$0HnXh^ zON|KV=iD&Y5Hu;E{~$8$^DY2>31}I&XqUn-0bRqk_OoBN35aR|uUp}lfPTu2+{21@ z3FwX7$i3{>y#jjKSpYpl;g^7z{=w@b=m7yS3ft>v^T!1=$W9Ef6AudLR#rUVEd_oF z=mjiwt+y8VC7=}~Y1eTI9}y6vvAu(A{!sx@#pxa5Ogtf=3%FsP$x=@W=qvRAJxkFq z0WnD1dp7%(c#%S{#D-Vy0_Zs;3bg{F9@Kj-Dbo@GQN844y$!%G0Ws3myPjxLFQBim ztsF`1dI9|{hke*P3-n7scX8NxV)QlvB{=LsPR=d?eVdf2zzwrkKvxo(h7^7Y=oVHS zW~qY$dMCR&!WFt+K<{TKitNOQfWAP`5mLEH0a3;6-N2cc6%g$b-YC0zvw*1U@WzNH zw+V=*6>prKxLrU!1Wgchmw;#|@g@nnS3uPHc+X?=_X+5O+(T0ezXY_1l)R+yOF+y7 z>y>!~JSdYdQAx=CZpw(Q*S%MxF&~eVhF?Bu)Xf?Zf zBR9;G0(y$;_!lhow15_^1?c(wV&cUHzZ!`Xf9b6QehKIdf?mL3FA)%x#@2CH~4$3Fwxk0KJG~+$A6?y1W;2wf73> zs(OH4!cO!GXqKRtviXAoVvL%18^?IPfR?WU=w;k6BLX_kFTR}1F)5&L6Z8tA@2r59 zEd%J4TS3qyy4bUB& ziTeaZUo!921U(?23_EcrC+E0;y4i`>uoDjo=-)WeujNdf5YTH0dL60B!vdnd!FxSd z=n(-iGSa(?Z9OWWXS38B6#WtqLm|EY#pa(B&;f$}hEw>ofU?BsyS)bB7X%yr+wevx zF}%N3^h-crBF^BzT z&et{py?|5r7Ovwi0ny~`{XKiXS3uO~dT(W^UI8&1iuX3Qbx=UeJL28P0bMU3CKU1B zPSA*ea%8sN!HJ#}5Zw;EcXC!|1;lJA-n%%fHw%clP`vvIx=lcIaP!_xvVFUNXo2zm zx1wJHqCv@ffEDi*(B+(*_plT935Zcr-aim09uN>?puG1IbX-7ms`37jSoolTwzdHD zPi*UifO-jf9|!cXfEbqKy`M|_h=3R^KvFPYUQKB()#% z&IEo5=pydz4|9tqUaHV5v4QDWypM3vY6V0WN$;av+9d)yM#TIW2ee#3Wq$ENR;(9L ziWvQI9&_sj^bw-TCrDQ}3ut2+pii>mHUa$=+xlnrYnOm%7V-XtXWCu?F=vJMDTQAG z`XVX$r`fNA0%B4)?*vO-FQEI_{AY-TBLYgE1<+^N)ky&@s0ZjFR-6?O?aAKf6#pfl zdq@lal^fbQVjPSBTG>Old$g`lq}{1VVd3HmBaJuIL{2>KdJJtClA67&dH`%wX%LBZhb zoUbPY#9UV1Hwb!CKulNVeUqT41@tG*#J4y(iQ5c*F&^LhHfc_+fc6sf9hO=mAjaBz z-({)g0@}oNe3Z*kFQ5!T-{Tk83y8^eyzdhMHVf!&I|2Fu3EwsW&2Tw>$S>{^(9iY& z^cZ*TUIA6}0DGJ>(JLS(((-;p&_Mywr^b7NyY_kk(ec6iv3D`>OF+=0CcK{zb0!7! zf)0Rw%HGckXbU^>Gq!cJfT)P~eoo4Cn}8nYhWU4{p=lM!9DbA&esV6F~^$s8xH7U z0bRTrpx?6MBLZU9I`3(gdQ?E|EcH80t2M*|I0nr7)`y)#w zUS{yCF9Xp3VZUkxG)mB)h!aZ$^b&&plckmm=w5;nRVY<2pbrw{RiV^+0ezXEDwf(T zpnoT*nx(c0sFr)^G?v;WAf`z4l2yQ*y#ivML$8LQUIEcQ=%uQFs|N+d>^NR6OIR|yfG|@Ycr5+Iw{Yt&%1U)JsI%9fuRY18X1jGAy+EOnoN&Lw}}Owa=YYG%b2 zRy;1CKeA#gOFbx{&8)bEpc4XGTMy7y4(MS4RdEV0=dd3UP#2ru#+~-4fEX3(ZRhTI zLO}mO&=oB8q<|RJ>0QZEPYY=227q?3RN@s}3@is@Grg-=s#ZX=1np$0B?7vipsQJG zxqv=R&@Ps$7Z5`xy*8FwFQ9WT0cbZ%Z59wCA-#5%+9sd^K^-i$OF#^8^wKP~S3n;i zXb(&E3Wy<#UMEW(6wsne0ouz_*9(Y2h+c-JMg){2=o*%q6wvDl+NbE3fEY9AbrE#4 zfWAl2eu8cj5aR*8Zh~$XP%l9}RX98D5)i}qyk3It70~+#dImxF3Fu*h`q-}r1jP6| zub;g?E})AE8epjh1;k)F?*L1k5YR0IUCUAr3+Qfwt|RCX0Wl=bJIIQU3h37a9b%~` z1au}b`k5T#lLES!pl1>Ew1Cxom!kfR=0lD9eh= z1+=#npz8^$7tkzAy5rVE4(7RZw$hJlV^e90`SZY#043zP1VDqyAdM-5{ z1oRSuZe*z^1;ijo?=OfsPYdW?mU=$PW8zf?zi7?({*pwrRzN=?=mjjbL_nuy0J@2# zmJ8?tf^KH1dI4=C=!Gn`UO;D`1JEs1kPJ5qh#qR*tpsf|piACG+vRglOCCX|&H^*e ze^-0@zuw)QMcf_wNnK>^eW%0jid&U7K1RU$(-yrGY!m+tRqOwHcYh1zFDv56I!&dr zufF45H*I2`djOQtwEB*>+_Z_g?g3cFPgdV?-%XotCSdbvXVKVNea8bgZTc#WyG^H^ z#pbH+*tK~LL}C7eETaBx8il8Yx8t;P39r86_)WObgOz`V@{7ReCaM!nUt%X$>(Aa| zI(o6L4n@(%YQFwq^`frFA zS1-E9jOq2dIEMBIzx=bU@{hCpAFCE^TcZmOr=z3;(-To)MG2Et6m@T73y+-QeH?_8#V)yCNi3ic{`VLOR zx7DoLl-_*zAPaEn}``J;TkIn{+SKLJhT zzbXA6V9({_xF`EzuENc$%tWpKE+1dGkQMmR?dS26Gc_MDm7Dy^&F^E=2UTY-GH+k) zzkLImUjJFPm0QlgLDX;7FZIL@F4dDVnz({rR)hRQ}S)|jB)zUEx32t3Hn zL;=EU&+#(L*v5jSDt9_x;Mxk)z+#ZnR;%XKbvuAmi%et5?W&E%%TR)FrbS9D;mFT2 zl~f5`Y3Vs0zq9Nd^_{b?L>;)VZTG5c*>k=E{Z_+3rI&eV?z}4!c!j6sc)7fm4;U~X z>ePdIv*I%E>N*+!I69KAdxf`f5XDw*g8(c3r;KuNamwH$(j_sl< zvqI}_OyM+)*41OV!2ws-5*;>dR)4Gl>=J)IFwbn{QXlOAXjY(&FTI8P{jybB{wZyJ`_GJ63<7V^>8db=5-M z{hiV2kQZ00&l36kP9_q&DoQWX&9qg#Na`26?M>Z`p0tO1LUht4JN)5eD#sV|h1w$= zP&)ihW1;_ck3XNPrj4VWenm5i0Dbq`T_$E^^qgLR&3KL3cc_GI&K~T;GAk-zHh!1d z_-3!~Cm!lW?6y%-V_;9X4?z!lD_{6ydPewNWW;@T-!-Y|2a1{w2J~Yfz+0jd?o~Gc zGaIZb3w~`dW)Aqe@H(;bLDeVgBYMb(e56-<;F-ZA+j*9>qqpC)mw9q5j4$T<=bYyQ z`1o8YuIYBxGqnHu)!4tAuu3_5Vq}jTCYzDBF;)+E&@YUxN#O!ISSy|2H;3#}oIE|Q z;U(q(8rg0BD7GfX7k4fr={chR#O=7PiB7aJ>VMpPDUle%P|RfMv5))nhv}EEO!yxM zP=9#R2KfXM>G|a>06VZ611|B?RTz4it4eCts?NS?(@iksN6nw01vBQ)Brduze}bbv zb{VR+*74llwfuFvvC21I24uD%oT0x+`rpo|FFxPzq8hGWorR$QkdErYP6i=U%&-`WfnSZvwz?hW)k~guLCjqVxqP_(D=B)JfcNDUJ@Q=2>UKIsH#5B!W)UtdMu%WP!Y+gs?l_l z-AmToybzr2Qf!hYZW5UezY(wnrs>K((1Kq0d!KE!>bAH)wwMpAT6_n7KsJouI12_0 zLFEUwMR(+O(?=Bb8v%Pjl*jUa1G~N&cYlLf_x`YW5q^=+2@m++rjd!U!loOh^CQPL zJ#(}$v#Gy4Jy^_b>Mj<#C(60<4aH5pQxiuDHQx*@lzFg{!yFBGOW zmPZPuVrk=b2L?8!70kR!Y?>}jp+{@XjX4{^6@E=G%oHx1|Wn=1OWT?X*q z-j~jhTbgo@E~MK+a>O%_TxGjrwq$YuG- zNup+PqEwzL9El~f4k*UeiTzP0> zY779Jj;KFa7{cG!V&|5&M97|Rx>rY6)lFq2tSEto1Zc}^k= z7K0f^nW33M06h8;&?F|w^iWNteo;DB;yjLGrT_ra;bDA2 zzti)$Q96Q`8lvAOknv?f)n`b4@ozElzuc~2La_Q0J_S%EVrM0V* ziw-5vJDNQABgy0slhDpA?MiONn?-nY#?hpA=(5`SMAd0t&CqF8$-0{Ai*HBxjaPkL z)y3Y9TWUeezq^#w{pVP^|6%GrABtw50?xfZfAV0{k#H?@yx8B0qgNGuunYdzorQCp zPyfvy;d!I!B~-H(kpp@N?F1POZ!Dm$*;t0G8VnC(KdR;RrZLnri))U7>>!^uJp>80 zw-z^3K&92E&AtN(Hgp{n)f5xjjdEdnjSU+nDT(AV>@U$`R(}mHI7_R~_+awP>EsG- zmvZvF;pCZBYnO7TEhs0uo}FBaUA5t8a^s0)5+$mtXAUOMs9rpTEtWi|DTy56$#QbZ zq2!s5CB1hi*X~L#e98bXV1ox|`2M0p$z<)-$@6BDXVktX>FrCNyE(bwL&-CbCeJ#U zOdd?G*_S-)vE&)gN_tl%S5}{iyA(d0Ob#V4er6KMfzSR}^4xop%WL-~7YrpE_az%{ zNuK?|8TRh%L&;@tN~(QcPO8rhC9gh|tgjtTUivGLf~%6}O(*Nv>)LyhXY;>h{kQ`O z!PV0O{-=7jj3J$IJBM`s=H!wOvCGSzsamWqL(_^f_a|5D8tQ2X?vX+LcP1AVlS|b2 z8+In^e#Nez{o3S$`;!-<6z247^y2T(pW)>4>15-ZlFL7sTy%f(Qa15M-TW=dwS3x< zT#Elx?@Mmye@e;q7;QPZeBZsvv#O8Yl3Z4O=0T2|WkK?mP3u9IlNaBgT!-JGWL-JA z>S*#j{0=1-y)n5-7i6Ek+RM;TQVn<#!#!QCU~BcQ)t4ocPbI5{l9$|?TzVq8aXPu| zL~`wP5^1FM-}<*{I(g2C+Hz~K9PPk~6G{6wGo4(0B5D7or;`_+z&@Md*G{*;b}PTO z9oQ-}qW``U)Is3-Z@Wj1hV;DX4(p|}CsO~d8`5)RH&Ay8TtgL?XO~jz@BrFuVdLPk4FI?R3%IX_Y@1kHc+Nf`D0KJ}i9W;f}=xg_J|8#Qg ziR3e;lMS-x?UK5@?uhQSu3PzAIm)>qmGi10b}hS%9+&Qq?nxYeY5cAH)qU3O+auB~ z+b4^L==L>S*V5m$|L&Piu9MxY+t)4Yzbj`__h0Y1+%y>+8^^DkPOg_7ui?6d%9eEx zS607EVbE7>3~IZTBuCR*y=C>^_GIdT=+4+((#W9S>W}Jf$mgC%d|hIpYv-*zy)^b5 znoeFUf9uNn^B1Y})t*g_m%341Mwi#4)ibC&t$+25>lIyDNp_!cE0NbOqOEZZE9;Z%HYLxzHCb~oS#?nJ?bjq1f?q#G4)(&$9|X6!;D^ceRTtNR?S?%3 z?&Kq}?T?a|-JU%6j^yUslNa8R zY}t|AsQJfr{LhZ$4*ch|YmzPe5C297@LN;H4`hUM`Jb8{isuEV%Tl%fO)VV!zwX2T zKU(;IVJ-e&=)?cOYAzu<4=1bmpP}S>{09P<5}AjRyYPgKNQ{RVb@riqAgEc6us0wyC%8lp5!@)J{0^*F8{FE z9`5dP`w! zvV06}p~c~P^#j!f8*zL*mu_k;ma?VELcW+AE#6odOiLej7sm&8PY(?href-LgnI67 zKc8;e3$2Vn$`Zc z{k>i3zTP&j=s>zJletzcq)4il3ds(;z?&O~`^a;OMH40V$rC|HNKJa)n$+8d?}k+{o0#OxDa) zdrwzSUvJ9+z3Zf7Gr6h3?2Uz~iI{a9vQH@YSBF3m1I&p-h*4*$(6$4$X==t?X>5mu zFWtBAh-(@1>C1@~1)xRWzM?7NI3ith*xrgd*wTsYe%c{phJ6g^3%l8DE?-syI)z1Q z9n6(;idus1Y(^`&sj1wt?9t3j+|*zKBNP;tgNbpN^KcTuVv7}Y&phTUH1mr5;OOk` zNI&C1+d!tLJD^ISNbNm6eI3LAi&z<2yuS?_=wQnp>rH2RpdY~QPC167WE3Y&>)6Cm z(8!Jwc4uiUk=OVc)7wG!F{V0gy3s6s)8nncj;6x%I44=!fruPjM;cu8BpG_wJ~28m z)!T|A-aTtL!CQ#0!TB6ha0b(h^+WrG;lfnh>J{a@HJ|S&j26m;{*fG53fb=0g6pAFWf4OxgUmVxOuf1n~Z(q8< zKiyGz%#%WwbK`^D-=n!>Aeh;>ua2d+4i<-Du*VQ_O7Y;!4vhorWJJYM4u@9Ue3m2A z6eZm;vwH;dmYen2iqKlmq%|W4Dm~WM--ONTZR>DmODH>s-Qaw_7%N z)!dZLh7WY*@eny_W9X3k6ctM3PthE6Qy~e&&UjOkK08X~W1|J1*)xpwZn!SoK$aR) z67w~R1t&i)#yCsGaepHi;h>U*?rJ*(MvRhz=FA4t-R+sKJqNnm`_tsl2GSP&ippPL zdR%K!A*aoPIVu;&kBt{fK%oNGA0x*M#Vtq4K`R5{Y^p%AnJq!yD9-9`gV=^R8AGCN zzRzdx+$%E}-U`nBQVKI=q-?~*xZ_1IHP{hqiqY3h_dvQc-M6(>pBJNKZ4F84O1JfC z8AoWjsuUVst6@UiBRS$;`gXS5k?tMXs}|JICY!QmdM8M$= zUAim1Kixghzq_qJt$RNQB7qXQ4i$wT>in3>jZy$0NiJu`y2duA)A^%gKJ|+tW;wkD zzDSdr1wSP$Yid#Scc?f8-Wd#%l3tvoMK74WFg|yv7v}P~o^Lry277M8HJ_uil-@cz zF$1=k^RPe5NHjM}fO%B=G=hnl{{Fpf9cKGOLIdYjptF;|r}lL9v<+w+&9*~s8i;9s z_T*eHuqVU}82mGIZ+{M=)ok<7Q3zkzvBBIiIS#@?uvX}RI7HX`FwiF~-upt+mMn;% z<-ga2I7jPoD<%#@7ffntIjO9f>Fb|J%Mz*`Aku0}$NmFd0~syd>RncVKO=kz-OECT z-JAx>RS%so(}H2AmGho?Zl4|<-IL1~5}jSDJpnAq|xZg&Sfftge{O7Y z6a-&Q9L^;pMr67>GVSSpg~6EPv5CRy(Ft8BKy{(!G1S$iUX9Y$-hFw|A2~L3h+Mb_ ziT(3`&sVgP4b_VsGZr^{7#)p1DPl3rB}`lDR;Vw_6QhIvQfM9^(2!|FHv8T_wIL6I zEE=^F))d0i6z~qD9NwsGbJX@aR_d>oW^OXm7WCzrvD|Q>xnuwIXc?jkQG%FyN|Ui= zipQqbGR2^IMA%RqR!C~er(39!0Oii~WM_(lg)CJ8dPXw+&p43oJEV!K*30dg0uj?n zXN;jdJyqz+9SdYebF%PEQRuxJSPkr@+E`FG%4N=^x8_PbM$)}AV>5{%oC`Dgn9&^b zISf_ImtP_W7L~RT3TJ1VnqnF%D8^Iou{a7bVxO;(&APj*r+pvBmOf|=E4rOVL)73@ z7k3-E+!8Dt!2v}vtuHq|Tu6@=#vo`z_l~26F#r{omW1NlvQq_^LlCb~(96-6ZtLjH z987mO6dc11FR~}Wnbk$;*R|>+<^_$MNfSk|9YB2 z3ae(LutG<%7aSTucRw*hR3|5fMkjLRtR>EJf=`WXh`~+wAUaaWjg?A==Iu~abSw6zapu1#yb`yBiBSlA5ao+Z#tY|yz+FsDS_)EwxVw21&pNY%sL zU6}z(S1?Bp!MsFRSk(Y1t$%iD!7z}abd*R|VGlUV9qJGNJQBK%Lrt~R0YP#gZFR;F zj4TzGka=L^;CZGChomuE8w#93^cM+nb8AIUl$=(W$`sSvK*fwI&m51S=k{rvIc1x2 zD~O)vB}1%tN0FH1UQil;eC@fK1bbW=;c86}wZ2wayH!~#o}>1)KaUNLayUv$JtmAp zrX=hm)lnhoi{qN-jDr{xc@x?GZ0Q(Ihe4eDG?CZs^PC_C7^^1 zJ*~g`lgGgR^iLmFTwGH}Vu-90qn(EMQ{>NR6gKc-W<6!u%wyz>COABl==*nM{Rw5ZHM|Z z-Teb?-R)`L@a|X}ZL{-L*iOA2)E||i*!1{xsW8|avjw4LtynWN;yth}m6b5Ax*OV> zVjgraPICt(TXT}=C5b97{f+7vs--S4%40XaY~{}t=e>{KuS>oBCTy&qEJ+? z&?O^$^iWUPH&>TvmBf&ItAN;A>JLu<>C7x-O3IHx9zjvHJ>5`xu0Raa;Ntx%4y_q5 zN~+_#)18^_Kuieq4ke>^P^Ikk>ctT;$JthxC)ezhbt_HqNlu2u!2yJuR^yyxE9LFKKc^rzPlbJy61=OvE#4@0rFBZXv0DPbO(=+oBWM+jA z(oQj^rO@YQ(#?hE!8l335r2;cW>4?MNMz|9^ucvVglAB8N5GI8 zRE|=)V}aPJdl@32w53HHJ<6n|C>pc49Zu2}_z1eE0v4UQoju(>d-n9F2lTed!nhpg7zmY7;3*R)VZb9RaAekF3ax2A-I@mnknYVZojK?= z&2%U@FDVPmEW9JI2erN=PVB@+H47SIFCAt~y+g$YrurM>e_;u-?xlieGT6#$etidK zAxRGUh^|&}^puOBE*tsQa2bAK1^ zDK3|6v)duh`pY!8!o?{dxGeYzvuwA7Igm>)uZWaFoT54v+t*LIRX~333^62H1lCNx z8JUw6h2FuuHV0GFP!!<1+nW+Rv`n3-pdE|X!o>G=l=|RqsCj_?z~5(%8NsdyT-=-t z6nG5Um3_@P)5S;+ZQ`A2j@7b2`-T<*pHaugg9*u|rD|zxd9GFK29;(IjBJ_KWM77` zP8ZvQvm-sw*1p#=8z@RSm$P}c2ou?#;c2I*@>QROlVS z1Wkd9ghEWMM4?EdhEj>FS}z_MBFADtkdn;iHjypcB#%>T296%u6MJ(YB-=Z|P^WN2 zgmHm$1VxB*T>Z{O$g^D}2I*4x2t`-bsEk0?G?y-ANF;yvfk39!bt1S+!|q>k6o%)q zB}zhDL~U^rsf@NQbpoFfR!5XlRMXlsqus+>!w%y1a%Gz5nmgsuXL&WpF>s^+0W*cE ziy4E9%rsqY>77i>h*DU&S76NNu;boGJww%e1iIZ|PlO!qLr$k=N$t(vJQ&9wft7I~ zP#7(YpV=(WPj|=RwC-}13+qe$7=X^MwvKFPR~Bp8k8pu(6MU>HVNDKLvjf)RfFbi` z#Wz&6m*aSZ79-;H8yZn5j-kk(m^Fcez3=B}Mg&HxUr}CG zi9vIh#JweN%yFij^!VUF)FmAnS@9%~kbIE-o#JXk8_d{Y3K=oI#;&a}A)vGKI)1<( zhb6XP*dgYarv;AmWAvD;IAAh!Yq!gaV-q$vei~iW!bqdO>fNSgt=$Js>UQT^npWds zqQ+6N-{#;>vGXHn@7~(n9$__@nbi=10c9A18N;|s(3q-xWczy#^tIcbLs1ziU^T>- z6P~40@JvA7ML9n04~et2=|k@nb3P)oOsgpmG*AXV_?%j9 zTaE!`T4Tdy7&t}Op3s@$petihJBXtU?XH~MQ2e9nekjUDMRm6L2ECY_>q0r#0W~8o zJ<-JgHxbe~NO)VxC0eLbJi;#}%4v47hY;vP1 z!=~mD_YEG%EtAi;?-9#HHp^6*$}d+fo8@s~8zf{O#;lxMIUW~}O3FDedPtRKSc5e* znnTc#><`=BM1qOUUI?!-jzFKk?k_Wa@Td+Wb)YoqN|;_iw^W*p^9>72z)H)Fv%&O2 zyB>(qLoa+t!w0k1Xj#l&`n_WzW2QHsSG$$g-lC;(e&$LlCIjVsO)S=r}Pm zPuDx@OPyK(lQY*=00?M40u}<#-TR&*P{?*0ETetq$8xSZf=M(m+%JA!T{>sxj*S+F zN9Iy~yOGOyo`@_EGq)~^eYuHejn!xp$>vWN!4p*oeX{?f#zUb}{pA?FbaZE{hHNY~ znFl(%ke+&|Sb%4?@7thK3Megr9hJ00xdDn#Vm;npTEBVc6<4TO9~E)yQ!D#BnTVys zK8<1!Wh79>`6vR*EX7bnMZb4A6wmpCH5`l$lw6dEE@KvCb$S(+=dRQm$>8geU* zY$co8Y8V^LSauw~oS;j`5ZA$I7i<)TZxxfBfd!%oAz-6_jw_Xj02OOahS~CVnJX5^ z?0CciA^nO8=ThydFgv4F4Y05xh6DjimF7u0z4?w^AtPmrij9)#sBp1%C$kx%qf+eV zgOg#1?~B>kF&N{}7SQr7a+A)_Q@JJLXdkAdVsGQH9nX(V`n$$xnZ!RpO|HTJ5MQm1 zc(oQvEx*65f1h2}aVkdiSmF)ElM?yo2eWYClyltQp6V+~Md-87G(ABbs5{(C=c)e8 zGeZ^u zJO+<+id=Sr0@YC+3juGRv~ibqnpwbORv18(U8B9{0Dbj@;>4hiivyAOgyEJuyKuI`K`>@lAtK7xyu~Ak3$3&?9Nh`(ATLbqD2+@^mB}OR zG~`BQ^#aB4%_W)+!1>IIXH)Cff%saej0MvjWQn98EVspX-HqE0VoF5!xvj7RYY9j` z#~0jL!2&aw8kNB-U$Kn#93xXALZxn?xoHw=yuwVeRM0{4>dp)ri015=`y7c_&vj;+ z3X&!ZDLL}YI#w9T)iS9O`uUSIhoxW$K)2kjV#tpRyL`u~cqa|cRfQLX`l{{rtUD7d zY(^)m+1gsvk;kXdrwT3_!L90hID`Cz51Fj~qMfFR7ad5tqB+dF91qUyP{gx?|7nGV z#DI5$dJU$ZH?6|I`U{ir#mD(+zuYtJ`%6Y?1ZZp|d5QxenS@5=wo?NQ5y$3(t+tDV zO?ER)bGlta(2G$eV&zO)xTr&H)JW3eFvPTED-AI%*-Ar9OSVNXT&T|?rl^sI)zhM9 zH!~|f8qA=iZ1&0xVGau6-iR(18$^g8`a*%7@omUa?I!JuBFR5q>KUe)~w4Mc#mttVFl zict-O#UcmN(c#cg|bGORoebaCG3pN#Y^=FFU7*wuZoJ6X#a|gpW~7n!xJJ z_|ODWG8#0S_o$2uky#SQmW{z%=3%lu#bS`h#W-lG1t+ru51QdtY`~C9cO!zSkQ>*0 z0Mf>(oS8>wCgJW=Hm*v>V?4;AGgZ(jBmE3BF#`Z^VvRtKe;rO8rweDAxX@BTo<<S)JapdTe-Nd_N;6 z4ag=rnO3j`T8`7%CbqW5ZWd++3!TwUbSqov#@s+T$YYX`PF>9EMlMXIR8!f zm=Hqffv-wX0&*aa1t{Nbdz|>hG6uz6oQ6Yzr+tND+Hf-+E|(*H{OT1ti7RogpFE2= zXdi%UYdF->u?|re05>Ke=+m|WxC=q~JP%w{E~Az`q9VBsPBo+3gPd(`QT5Szrs4@@ z;t|`3Z6Z`3L5p##<0N9fLSw2BW~%%gXZ4Ed+Tf>_u}w|Bf4B`SYRnDE+WngBGRqg$ zF7~MRJEdvW5|X%k zSORf8qdOV|OE?K$ejb`cXo@NckQ=j^??@>fozxnKGu#bu{dHv~GP&Ym?f?i!tF7Je zp>(1dReL^~xw{K>W|Vnx?0n_K8rp~o(~Pyl#z>VLMUH((OK_TsaN=e}VFi=Ucf(v+ zJHk#Y4nGzJs({m&AI@o10!5eOfb2A`Y(S0`>@dkqV>2(>hSux{MYv}V0?7PbgfR39 zb))(u4>2=`%q%m<>_Hli*paDoM{Wh!1FXGoGIvGnH4fg%wNqP5Gr37b3`l|tdv$RM zhsEbrD9q;QIS774-gjVfrU|^OT6E)z5yLK2x?{{io}JumkP)&Jo5`+VYmiNEEAa+t zbKJObBzz7+6&VB_Dgvt+J-U1j7V@Lyt=5}_C>O^zIiJm12v{+9&t`2IOQB7sKPrzx z7dT#yxA(vm#Mo$E%h+5@1dJvmxKbc4*u0aUgKbXn3bK0y=k=%@=0T#{S%7So|Q{Y#O42@UBXTE&ag!L^YF zhiRn3U+g5KFNrm#w;Bn>y-AM=v+RBicQB^YX-?{*TzAkTp>e_LzG&bbXyPr?ZP; zP>_?@43L?Oh}LZ>PX&Xz)Gk@_tQ+Tjoh5dY$czr`w(>`q*0n3Fr9<}9MSwbI#0%#r z&BrRn(p1CCJ9C|lgrN^(Za;CQm4{W&qZmr z$i<3oq`)?>L?284M|~P-_UzDls^iRkH3{26Eq)I&AEh*@WE{GDO0kYS$zLao-1>YB;1;ND0Bp| z2dwr3Ov{V|$e3GOOh2?OyB`UEbTE};`e^uxXcClo9)oVq4P|*2nq`oUrJeqZ2}Pe{ zmK{exc-U${;_4aPy6osYmBtmFH)C(d0+u5;Ke$ubHR0lK`$nz`vn~m0m^XK?Ou;{h z)DY|=tR*rTxKgO-FGa2&i%QZIYHYm07~;C(ROtDvp1O2Hg~)5vE&}X`y+N@j$LYY}ZzqjM;x!Z<87R%X@)$s2QNeu4PSLU8Ox9-5G$h=C zG=+Rn=a@U^>F3WKWn1&f^!Q-=1a5ld-5j}5O)$WV@4+P|T494Npwn{)j*`lqm`+_m zS~H{Hu!BAn_H`qbds|m@{;VOQ(7Q`{FyENHMj?yD|;;_cwz;l3iK-$VPdnKC8omX9%?(}t; zj`-^-krmNRc1J9GspF6UgWzJP&A>uk36$t+D$H6dEYRYCtxQy4^qSG7Rt9DC;PMJT zPzLjy#9LslQ`aSO`E0C&nS^acuuc1zdP-#eBmyk(cb+^iD9ZGV{| zN`jBdFiF*?@jW+71ADs7Mu7_kg9dNLgf9cByAZ{F7R;4$&2cPjvmd`}FE=s{#?zsg z<2bl0&Vgy*U*|bDbQH4BVppI446ff1GNN2o=h7v_h< zoDidw((wg%-yGlQ?CROw)`iQSrVnQ`(Demj^xe2?Iyb7#I2Gjlq~V*PMapL3{5=7; zCzET-xPR-rcC;7^9AvubNDhN}>8W(a$rx2=%V2`mOIpw-WY^fJjC6-Q26@?^8l>_D z^^JdaL~)d@@$)$p=gQ{*4mf;jIS{r5K_j@oZ;n0XB4ZV2JCm=dF+lZgnM`4DN19gN zDC`f*5I892dG!IOo@#ng(L-#WJJQ0*X-GmR3w=W_4*7h%@iOq*anJ_PO^1}@+vL>g zsE@bM3gPf-LaZPMM+9JkpqNvTihkua6mdHujiesacRkXYSA#v;Qz_=dh3DBHK4S5% zHtw~OEmv_!%t`J*j8-|g=e@&qxJ$g{O87H3KLCwyz@oZ~lw`6LritE3Ym;0fC?#gb z3S+!r5ADSrr%uklIadY|G;IckN1ywQv#3-mLa@Pyn4*ham={GsP9&9Vz=#ue_G|xU zrO55vvhlQgODNSwHai6Ww^-L#NJzeWs1h%3*!V=^IHMb#N7e zuTL`y9+eQ0-gRcu75l3MyF6{SL{dy;d16}3cu^4t$9P1X43@9bJ4NzA(%A_YVMbG+ zSds2=sOV67nGZ(w=!R9d6$@|?Fsg-^IzF!++OyrTt=YIQ(XH-2=B!!n>{4+`V8(Fe zWGp&}Gg5HK$09|*r}me_8IC(nk__K+mt$ry^@Y&fScxbdxC7c+p`g^x9ne_gW7^>x zD(9rbIaFTlM0#v91{z1TpW-;RV0CNq15HB@f4+}D#wUG}FfJaLbc`1X*jTUh|bVR`$CFRI*Ys;V&6e8n0aGGXm zU&f+^?#(r?L@%Qg@SPHFo?ND`Jnr4|#Nd~(`e-iC20_T(h2i4(KxLj|Cnmy&*Y*q& z469i1jC&uRH0vLHBO|AR7Nl(Zg<7bv5EGCE=gy8lMB7IS`5P=pgZ^@^JZ*a$*!u#> zGb|)I$^C#9%VTiF_TN$x2@=}jK5>2bQ2b1~4iH~u49^N#M;Iv)RzEjE9s&0|4q6B? zmFZuOs=M371;BJu;e)=EF}_o-)5%zIhkTy`)1WEi>jdJ-Ba~zo@6X-9#w%w6Z$7)cP0i?-H zLBQL?pRkz6)pqV3eAqU0s3EHa_(7mlM1C8bn1;eWj&9~ekO_KW<+%WJICw@_%y0WgusdyXsm1_h>B1!amF!C zk(T?$Hh+_jTZdU3l^GSf0F5Zz{7m~H)enQobka66QQ~Zdi{1hT;4`)9uLdCXjvfW>u?&Wjx2Xrl|pi;;#iOg8YNXa8w zQxaV09Z7o`Gcwn97Zi%$;gE{m6fje=)-(ngC~2{$V0>}mP#G$2=)M)R5UoQXo$^3 zs*^iO#6sjW4qj85iu8id2T*zkuqOMmyFrsg2%Z zne=tNJ$?EbO9kP11IGhra*z-@n2Otc@PM2@K1IbGGyR6t_DuSOR&~~-4)?QGYb*`zJh0rBGm^+x z^ER&d=F`ZfC5{GMr<@<>Ky^=sbHBqwsZyhb1m4OT5;J<5I;|)bDlb&q^Bj}18R{e-@gah)byFAs z#iq97TZUK%-F2zn9hj;d4MSSrI7*@~O7M^RESarIdg$TUEa!@nOU0InGOc3PP(8N} z>p)s^^l7x>sEt{0w*;w~TR#OM{EhKp=H1jgB}5E#_!eX)-^DIWzlw6la*@1)UgeX> zpkfM&>9dQz1WMPFv6U4Uy2^bnC*dvSLRT|*`y|B3jW@p>WkzXXO-dBMaQK873T7Q- zZcjHA02!*>FER7u+QgOvS)4`!0rsG{!pge4fn+oxW)+){Cnz}N@xk2GV0JWjY+|~c zJqmTPf9jjLXn}?aL;;8G)>ch0l@FV3sGegxQu7qC)2a=jJw>bweHGN+K~17pjHV}- zMEzR05zU*i7W+y=TO2?>1))>XLo z|3KTofw|5nOmvv5{y}4syO?#%&lJle{#kF(&n7TUu@~M#!x~;VO-eN( zb!PfB{DGn>nSM(R0-w237FS3qJz?CaobFA&l}ZJL%rz;_>Je2S*$XoVh>j2g6|kxq z_zp4gXb~a1p_9Z)^D^Xnx|ridF8k#%V_KDi2SnRI>;`I145t}ae*vffUh1Vx$-5oDTHmz-prjJ!-7<`4XJFafiwv)W2#l6`W|q zQ_|gk9Hy=f?l>1Q<(0C24AQy?ftJT0@2cK{K|cdN3JM|3NVPt@81n`9k!7s? z?xE6JNu1H%D3EUvGdrVlg2rnuXKj8dt}E_?qVifA$%b#S#zrJPNzAD41ZMEdXt08N z$A3K5M_LEYVA7DvH>s@L}H%XD{Y>1+=A$L(UD5pnty zu$z@!z514+vJ${&<{rI$>nl#N;s8bScXc0-9Z}4Hlym^ ze2m8cOBAT7`KLMy=%>y+M02oWE^^{H1EHHa^|&ElsbJlgC7S`hGHTNF_EN|&$BIL} z5gwwN(~u$w_p|A{=hA)oK6pu~)@?z*HE`Q-%rgx2bLI`fvb*$sF}vBxSwyIoOsS(Y zqxJ#MMWo5nz4%bBR!Vj;y>hK}YY@a1Q)@nB(Wzw}BVnAmO>HoUn9sO6*A$sDYIKzu zF+V$N<|BjyGvbXfqq5z&XACPDVauEw6et&EgHEmU2K!~1V}?DS*(C#N&URxF>gh!c zE$ECASKDJyLnn2M@K3V;Bw3-0zEuQXxF?c~-#lqprN2eCAMu-GxP?p+CkN($cvtiz zbVh5%GPCBHgT)Yaol3UFzj4e|!oaoT-yBL;P|}J`uIPx$_!oHPIr;$ww?t8dh>oxe z?kQxRK6`tpkEy#I5DeCvHtr`@jz*uaQprek-*CSpqWk;z`T1`!o1txiY;?vSKCk2Y zRJ|Z4fFitROgOotfhHzlQw##T_N^qUpzlPS0vO4G`I^Q{>WyM?*lAvK&n8g@2Vp3G zRQ#TG?!0DB6x7tEGQ4E%kk_b`6qat?{b6W+*xx_x@SU;qBDjbewwbVjbg^QQn5A%y zD5N9E$INoDk&W8VJsu{qJ(-WgVVkRWY-{EVvY8cyic!wVzX#n4I*jQ$yy5~yp6+%C z_i-fXOpN}K5HophsV6jjWMfo+dwaSLb@p`c@4=+oWqnlx;F@C8()&3yt%; zfV|w)qJ8rX*Pd~0&mhAMebI$yKQNB#;!W~dJ&}$9xtha(;^mX@YRBWQtKn^Q;bwM1 zw6Eq}IY;j~(A^$B{ZyG4{J`!Bh2lEK1)$n zfx1~co|`36u2AYyBB{{Pa{yaJ7ecTs^T_C(93A6W*eJ+6En|maepRVJp($iGQ@sqXHV*|@TOO}q)aZHH6cP}lQ{WyJ!bn_B9r0AhP4sQL z_rEC%x_fMp+@9z%M(c)kuP5zL?iOXgwy+{NZ< zK3a)KP&ByLQ2R3oNeOjYixw@kwq-SUA%hAM(`3f!)c_^2Y5pWWEAW)FZQXm+I_Qpt z_!SJv=Q+skS?5M{6XW6mUxTjjPqbQLH*TBgs>lWRbih0vA$!qll$#ybC^zF8Wp{f; zId@gpDmXk_=5V51?7D$jt>BPiS07^T*u;2t7`|kaAh;Uy1HW&r3RgX3f-31{z|%$N z9LwWS)jLiH==bKOqr~}NsZPX<#%ypm!4mIDr79XZb;E5uuM!Auqx_t)EU+uJ~|%aLsU3C37H0~sIO^r6E%GSh3}#1Jd`MKs548gKg@2HP0BaD zIVc9*S-|7^{z0m`9MZO*!F6q!fs=Sg11%IW4_xe3diQAryJiQJhm0(DrsOl;j0?7n zSsidX_2Xg9ni;vG6>Ft@bNobw)EmLt4*02}gn!(rn=WC8XB{p6;? z1gn}hBO~Kf0o$xZS=NnPK<|*J9=LJxNr_1nAS>%-2bBjb2m+91^+n>RKn_FMh;-DG zP3gp~!9l)VY^ovNWDO%8IyBB6!+&Hihx5bePy~1rx@Q-nL4`V56X+=R zT#IXjVTGJ)tHQ%jT>Z2x*VMcXtRgOs&u`zJJvxI6cgN#IFDQ5_IuhSyAX-SBsk*#7 z-I?ijW4+m?DyF|Op{%YAM#q)X$w|zBl+kHF8M1E&uIrmafa)q03LJXfBjj8}N2quh zqy<-fbqT?SyH)Sg-E9zf=h*Mirv*&1zPMG9IMFQ0wz{@hn3?2mb9WTJ3U(G)?N8j_ zbD+;8vr)Ce_^6Z)W;uM@1KbMif%#Hxm}7V8-~;#hC`)#vk{m^gAfbxsesJ_^vE4s? z=Oo-NW-7unYNjfN`nb7PSGxQ;#2q>=RGg1M5Uf5ku9_3l3{a(@?T6~nU*N(NXrvbG z0+Ugu-&T7mJW_aNA2$fGuuoqc=;kdi5A>--%*b7oGIZdH(+!{rl@{jU!W6b-irIE;8O9m<1@{Gp^>D0H$JC7%3Jefm31P?+#2oHzR6pec^C`xBN z$`(O+7CePXw{|s&n6VUDa@-!v8P5_4Y;ji2rd=hZ@3kefOc2)}CH6=j=BtI=NT!3* zMf1h*y_iWk656*hlMzGQBd!~k3y{)%K_xm_2xU#HAiS-T%+NiG!(moFIt?_f+sB2w z5z5bzOddWd1wAo@G4L7JUZ?5+5uLudyV~DO+NPpE7osMChf;5T%;BKa8>IF>CCrOG zN7amq1Q~dv#jK-?c-i7Qz2jszN{sncngA$<)O~!pr(HR`h7!VPbJ7IFR9t;_GINq@ zG*0ZV;3$X61<1Y9<$5?XUvY(Umb35t+F|8LxZ(3_}`Klr1?Q@KyL(B{%^6+KfL`2wcD-1K2`r&6Z)0lf)d{P&H99O%TG3_2L zGK=CE5`PR0A-!1K$n0Q|Q=QDf-^dl{0ymrroi)>O!U{WsDH+E93%LYMpL)li>esjC z{cHZR)8jXcPt1&Gl^P-rA)J~~@$vBkVuIsG%Vv&c)+VgE)se?S48ME!VTO*V3(ew% z!*wXVnin=NqJl6C9O+zD%uSrddxyl)s;#HRcU#zs-e(^=K!MffTG%33Ea(<=W14u{ ztuz}Aq3IN6GAiwEZKZ8b`S4RK=ikJ2N=xPbj4+J>aCrcCA5d?netk^OAcb)C--pA*w!tDE6FDG>ZFBNeI75W+qKn#4n z<+TpdPInl!ictPQ5N*Nzb7|k@H%f=$_7^tBSNL0~)4niOnWoB5hh*b(OYBv%vlh!4 zGt)80UW6M~SmK8_B34i1XDMna*Sw@b9jbnn1A*iR+6{HG?l^?HnL=zVIXqP&s?!Ru zUvSHj2&7_3=RnlE%W#q6TPt^Es1>w#UQ0~I#TH*t;=p)F{~?hjZfc#*JtFK{0!DDn zhwi*BpPrNrc8R+dg^xYvU0ZBE^<3Yxobnyhg)||7lf%SP#9!Pz_p06qs2TT<|x-CxNEe*W2l(V&P+`C(c#@`I;8K< z^wM{kCYVT7n{7}IA2I9fnn^#DB%VG65jBAmYs?o;!jk#n%Z|zCMse66qYl?iO_u8_ zOp5Bj(uZ&8NMmNqi2I*^#%4+)Zk;Me;^$-(HH1EBwF1J;0?@fIV$_P#S!N`i>B;KrL+^B%6N_ti3H*08*ONCLZbO4u3+FL9tMocuU$WQi;c#toTT zl28h97+v%5AW^q?#!izRZ>^`&u~_btP?<&C)2}abx479;nvaM*g1%G0{`gsS(Or8^ zdGy-ZB#et%tkxl%ZrbE~jU-SsITx(+T+aRYe!6LuBSg=Pc*f{Z<`}wb8);*(dtt!& zg~L>Iu`v3hOjK3wCxJVOdAxZuE_0jBS$7ty>y7-Q&899?d>U_X`&joQ26Wd>@gL6G%N=4NDg;v%e=<~@LI4U=kmCw1#bZ@+(9QY;pTiY%#@A#T zHKv+6H9;|0TKRWPU45OeRc4GA@Ydr5Euh5=?un!wOG0k?)JQI}Byx&scP?II2EUh#wV zxGJV?-LmcU-9B2xttQtY0nbSiZ#chFAtJ$IWOcWO;W!)*P;etvRy5y>4hOphux!y?UVDL(L8j2WG4>pM=hx%~>9nlxXvsvXKs z@gOujfOfNYjCaV=0XSY`uSW!FH$ou_IU+~M{E3|bCI@61GOlbfljuefGXySU?8oP) zN7niL=4K&z@P|`%s*&h4szx^ua+ScWIVg{t&+!w?sy4&7+WJuz?m@y$FGQGQrqD%; z;5A@ph=GUX(TN)%3>#%jK$WzO+8nRlym?af)3;+-*M&K7MXp5%x~XdKg*ig4yLt*~ zURne71=zPL2wT=!+KPUw!Q|=Ehhh=dez>QK`zgbgDKCAp{ZP60wLU! zO%5?6N1)g#On8(6&2=*dcbH28cj1(iKKPM+{=J?R(-I_&i5Y~8dYKG4sxd2bb0}63 z!sF4yIxH)uWfwliscK`kH|+big2=sMg+QA-G*u`d)xBboVw%i_?MalL!`KIdlZod~ zQ@N@AxX5(KA?Lt<9Y%LU9 zLZ+i%*hwx%%MP_vqjI2)@qU4$&z?+|5dtx&-90^B>9%hDR#nRYLsZIKP2scU8^xdA z(V-zrci_93mW-QeXIBA=wwQIpG4ua*b}hhl9@Y7GY#fEW6d=S&fZP~EoMa;FWm`!@ zkuA&CrLwJ9P9j{&)wS-mb+KO7m25fnB#QG=2pQa@lbB}=42?TsTBk{;rci94DGCj# zGZ_Z86h@Gyh{v=Jg+^@w_uJiX_uoBtug!4B)_?E!pFMl_?Af!A|KGD=yMz}glz3Jn zata3zm@(K5PdJ-y6oKAG%Q$Cv3`f`DA%=b`pV5bNT=)A`4$V8m9#Fk<$Ouu02)hpt zEKF0;v6kC5!!6l8r`4*?jKR{%H*~RvA73g~0hQagsAorX;o4wBeJUV2Y9oC_<;Lw*CU5bHSrso6?``9L#xA75 zTq3HDc|y#ubI^tR-vSurXW>qWHxcJ<~AUOG3U zZM#oMi>h|2>F6Kro$czlYx5LE-|~BLwUVk$4J-cTVjtr5jp~EVDhP4jmo>?Vo55Q- z6$`xPP$0DzV^pmR##<(048xJ1)v1P_NWU>^HyK3M8N_bHc+OZtsSr6%sR}2Tfzz62 z?Yc)NaUNJ8t_bK6rwm>@ui6UYt(8VS=pb2Xm zRVoL|89@XDsp=1<1A*u&2bPF`OBJKvj7%%4c!2oS#rXg=h%oI#ZOp8AOFORhG_;d_ zHCSsgeZz;{vmNkoBo=83SZfIa^B})!<%o7Qt{kefi3_XN9x9gqDr$XQ_O`4&X0_sG z*1a*9TC#DJb~`@e5#-TutuGB6T)G@s@i-X6`QK_5tD2u|R9eceE!mBDmmN;39U;oM z;0-HpG8^wm;s)U+fK`>~zYbxCXlM`mtey&usdp@OBf@LN#i25GGb#^+6P^&cLA@Gm zz7^d!^%}jw)B)k<8~t_<%u2CZvkvCjtvz!N#l8*CK=C*}U%&}!Ih4N}FZAaca!nPO z+B&^y&BpfbM2-CJz(&jB4!kc?#<;6IJ}?%cudl$Guq9jO)daqkSYrj&kXxCkhZc&q zSU`XDp&8vjzx&AtP3W)TmLv zdJdNA1x#$jM&Nv8flZ}-5rHZT(~ye^-dvHk2@2K$QFIOi`GV<``_>c+P-nRdbKe#H z!-K^YyT<$a_pR7AP~5wsdu+T=%CFc|DsCD^Np_W1pd0^Cao5o){CQnUr;Jg@qUNRlU-ydBHO%)B@@XUfMdA&_Zz28@;?}k0HGk-t z`7R>;UgBE?{xI<#A?IVndja&UT-y=Rs#lJ$o_#5K4vI$&6`m4?{`R->E7&h#ZR^mS;{vG0Z;$LIau=oMuAIliR zC&>SE#9Njcd?)?!-xGi0T7y4sF3GFJS6yd-XBM05Vw6Ma=g0Nt_h$0HhImV(!EL@B z#J|&I@TXXjCE^EK49@J6yNN$Vd11%qxn_(+s|LE z%2nB4JgfOv`p>`9d@iln~0ydH>AIX_+i1PpZKhx|6}5{4~2XlA>JbRJV|`H(A#n1 zM@43txS^K#;?LO<6N&)gT%uLoY6T%Kem!>l)w zzDDr>Ao1Q0hkS;KC!$=F#Fq$tK1RGn@Hs;KE{Ih|0CWb@LD*in0>wzxYFBl(XLk!pBL@=7UI1^&JS8X zQ$|4i)SunNM+E)-#3%0$>7O8;hSqmEfNN zzSOV?{@x5crq3?&X%&3(#7_!*Kk;M2t{x+PSm4hRKlor+uIGvO3jDjoCxtz{20SMJ z;y2PBgg#FpyEnnpJkRm)JhgEZ=wp0#lFvcW?(QPqGZo7JC&UXZueI~f6F)5K>r2G@ zMg6`=yjPTWj(Dq(=QQyaQQphWH+ty$a46?;;xz)liFk|P-$gtlfc|rv(2- ziwpWJ@p^%810J)h-K3uv{&|Y{A<}M$P5hXU z=i&>Eep-ZIy^8n}k?%_4Bf>vyCf+0DDH1;-%Db2N2_ff4iJubreujAM!(n-!AwDbW z<(tGuJ`&RZkodfi|38S=2zywJ3B2lemIyxYAYLo*mBbGUJ>O#a2z-M0tkBOVh}R4L ze?|O=DDMlz=Y;-WAwD6>`y1kk(EnR6HvaRHn~mPyyTDwp0j~6r2>V=3d`j@y|8DR( zr*fTYGwCOVoI8mh6Xm*#ct7>C$cU3XO1xg!$rmiW(A#swy9E8WfydhKPe^}MlYocep2Xd1Mx#b552@^gq$P9YlWXYK>VPvpT~)J2zj0&-Ye|z%fy!m zIbR~)CGZ~-KP=?@74d1Iw@b0UsmE_Z{&y44hBye&e{M7xK&ypB8%f8F2io_$Kx!heZ9}Kzxa? zt1R)uLjLWGTfS~^t@hKtykBPSk zyZROJB|`p-v2Gi)pZ8%ttH$}Wyt#rFb{*)IK6{0otgXW50n*nBIX_LjOVs00;{C#Y zo+CaZ?BRRBWAgu$^sRyqmiV>&^}^mRBi=9cwvzZ^p|_31dj+2Y@eYCCLHww&t3$*y z!hW6x9xK;Bk-kUh?PtWNgq(}8-mU8Eu+ZDviJuVl(gIx7`v<^JeQq+Bq>c2)M7{;$ zGlI`u#CwH4KSjJ%$oZGVX9b_H5uX(H_A>Da(Jp>O{IJM3!P2ePgJ@ru6Ymi1w2t_4 zVLuy)PY8K#Cw@?rYd7%`VGmQprv?AViO&i7j{=X`!waN8B=Y@t;w?g-3$a9{^l((z z!&M5$ye~7!3g_i|(w`LauO&V&?DJeC2Z6`z=WfzZ3VnWz__VO+XNaE^_3{tI4+?)Z zL;Q%a=bsZF5%QlVUN7(qG2T%6nG$loi};L?a~*K?ydzXocN5;^FI?mCCdAA;vIrM z!EGb{m*gq(SuXfLNBpqh|9#@Mq8- z#qTuwnGpI}M!ZMxUq!r2@ZUguO5nZ3Pl$ePAMqNYhmR7^2>K_9Pu^_`x`^fd67e2E z|1$9oQD3hSuNQW;c$v||q|n2=h|dTS_qlZ?(|4QQXf`1e7Q$qgr#1GvU%DJ2Pw4i?o zc!qWAU!ElWVIj}gi60g6e~0+oePO;oC%#|5c0CGQtuvgUKYRlVeSq}SqTM}8{MbEVxjs*P$^9YzHR7jeht@y*3-JkISFaIo z6>=`VhWZio@36Sg&l=*1pnpH{lR`g(#E%I2`-yjmdjBl(LjwN_@L0d|66srnKIf{? zpS#?YcZsOqD~M-=om@}+h|pUr@kH3$?Z7jvYyYx?^tGZ~_Yj{F{6AKO&oiVyD$4sD z@m8Vd?-4&J>?gU_=%H4O!{0=F@`2FamJ{z0_SQ&zMwF|a_^Ag&KDQBXoeJ?m;IaBm z`bNjfV+hfUoebEfP~3@dIYqVqBZqAjL)evqjlsj%Trs>IyUq&O*MVrl;}eP6^R42} z6zW>)SK%nY7*P&e8A^;jjG!%}`>>w@J6>{y@xehvo>$QY>@RE>FO3DHgZZ(({<^-A z5xu{n6FX!}*z%^&I%;k}ydP}bKo~-Wl=1_mJIn!P2#1Ota@Zd+jxz+XTdux@5I!3^ zH?LjOi6rCOb6IS6L4Y8)bE9*m*;tX=*4fyg(8}#2xoz7zS91@`p7xby=MLx{1_3); z>>d<#$Wv#F-Rgqvtm=2eDt{}D-fvTZ>J2tPoAoXnb-Ui%CW7Cq)Qy}9No4q|pE|c2 z-7XRRQ}1BMO`G?PmD_acyViH@!F?4RuCpOR&~P?_#OMOn^fv&qi>T zQeY3&nK@uX)!7Knq6h3w3OKB;*zTjNtf9f%^aCWPkBP`(Gr5Wnv@l`DQ`8Dz&wH}Jz2kwhz5*bU7t764 z%<#bQs16QK4hZ7w#i(*2-H|>!G*;YM99`91$~nD)8gi+VO&q1KlLjl-CXF#ANwicTrcV+eF%9vEXxH!_H)VJByynnC>lY*^ZCVddJicksv ztVS8duo0nE!8L_g%BXv6RK-zF0iSc$b6JrH&P-J0I6vO?Rpk_u+KSED#L=LCEh}#@ z)HgU1l{%0R{#^A=I7T~Vgt8&bsrzh7`*KB3+Gics4 zzTM(miur<$kY7f0|26BvEz}K`O2iqY8sM^aF%E|%G)49rVAR<*rq0%vE8Cd1dfHgC z3*+w$(Rm9$X`{<0JzkYkx?a;I3}et}ZIjmdPgkpcCe53+J09u?;?jU{7v0$5-d7q> zom6*mB(Gc^1_s`F0nCPFv97DJqPgin0VF2VwDtHRHK3t{Om*MBWADcNt|E@397C7a zHa?2bHe;3!EzR^ICU&`nO^nCT{b@y|4$P9qj;Zy9YEISUGV^^#TFYJ>ewM<;vgGeJ zoRwu;R)ZT%fUVyKy&;P)N0T!i-JJEP!j=IXJeQtUfGTaQgY=KwxD6f&y>3z1zMpm0 z(?N#{7{cOcUmbC?LE45?K?1jIyaon6s6kDt8&v{(UV-a!yn_oUNvtc>&OGh9g3Qw% zAh6!13D0`{1kGt1m$l`2U}+z^fWhv4itFO4@;4INj=X9Y)VwKGWFT}i>buh0HCpY` z<|1QQf6VH)(Kej(yguJoObP>fJ{tA$5Sas0Z(QlCOdl~9Hxw&c=(<$+EYkaYlz(?_ zVO^=LMud(~kLiQ?MR@EV`RT^eHardw;s&?t;oXWl&@73vWzP_;Bxw+RQkg!10;-Xc z^VQG@+mIMlYa!Q<5A|85tUk2p!Qx=w$i7s;4X%sR0~+#n_jc^P9o&ZZYOf)UR7Egx zx(|Id{D28<@6V+uWJ9WepdB<#R8dWH+O43Dqz?QcRA`Xi+|)>C4+hoI#^Ew?W_DV2 z{&dK>U1uD+I@$TzLPMBf2BZUkMyeJqAZ_|>{l&gro}qS|ASz6zI`WEXE9Pzyt_`m8 zgVq*ByS$^DT-7M`$SPHFRG63R>D}OgH`E|4?3C!e-5FmbytOPlCG@bqIi}k6i>>E4 z=s_xFbLQrq@FJ;Hs2y7Zxt8EngEAz2SZrD|G)8T)X_Q5MmUn6;t1WXd2%D%HA`g_a z7z&H%Z-@a@F+A?uiox;992VcmIvgK|9kcTbs5-5jbRENZvom!494YMByOj}n(wUc@ zVV)tW*Oj8M$h#8(AqU)Wp+a$H0O}IBVP!w}PdhJIIBlJw)jwLW7+0;Ee zP;T#9zomP)JJ%l7W2&%-%L|;3S6E+ctXieztX%psp4^NOtYK7?fhXxWV`sxs9g1vP zF+Ep!OW&=fLwuV(SgglV?^xxS0!yVH5lfHZN~tehgbE#~x0Dy!Ivbc6nxvyX2+=+| znl40zs`i5?`pQ-ZZ;>;{3HB%W`Gio3Ui$Cbg-HLqay#;+fwYCX9#~}RbuL|_r9nI} z*i+nshXhz0tvY7Q+SQC)ZtKQ2uEbJAUm%aS@`dc8tn?JbYXT^bIID?FNouTd$KI@Z z(!pD96e5iVM(!G=^Zr6(sSz`Wic!7lBAoh>nsh1Vuhck?<8`uu z{x+fNr6+Gf?5~)vQ<2t>Vos??x}-C+Yu#ogw}zZF48LhZhjxISTCuNKZ&JrHd*d~~ zD9YhFJt|`eyUGejRyh~)6z#D>*U4Gf(bhiZ-9YPs3}=zeqTCvcB>Fp z!KiSzOzouii`C@ZSGMeT;g*3}>Ge~r(aVsmm~7b-9uegRuv&LktH^qbvBI8%>cA?l zP_kai^ydb0(3n<{K8-poh5hB1CL7Km{af@A$|tGSZ}m(P&s$hWkwu&6vd|7alep34)0!vupZkk0~GIEv*x$MM<~Pb_7&W<2E^cx)vy zeQx5dZd5j8U+Im(q{%N) z++x-Zk7Hu)+P;5Isnv~{yZf00ZQQ@nq?gRMmvR1>-x>nTs&u$v^?CIgq|??Hw1i-G z7c{)+gT%C6T>I0}MO#Y4<=l1{X0z&d+Zx*UuzEt@>MvFy zMbqTl)RDxPnOFD|k7f53%jX^;2D+uQ-jnO3|I?aZScwW!B>g`&dWVezo0U9nz6`2(74kNu@}_fm zCrm~AcXxco>q>h{-a~GzTxn^nbUrCoUeY;*H}A5vs^Y{VL0XAsNaL&|;OjZ`)Kj{? z3T!34dHkHe6-H6wh>^oSPc&In9wyJegE4RlTcBWcW;1AjBq%+5`#>T5v zS)(g~)Jn=q3mkKSMnC>a6LRIN3$7k*L&YH5b8C34>eTFp@V2bF;}05Oq}EdT)DR

jc=l}tf#z%vo~}pv zMN;d$Ih;U@7w}AW?sX&IeB47JkFRs`ii2tmXKD-DV1fa*FNAuT$8ts;R9l>}By2fe zBG)+>6Wq`V?mGIltJonn7U#7s6W5wh^T7d9kge+?jjxBU(c`mYQB&fl>;Gg*ND=a9pah31RBVtZonQMCRC+b5E9@!zIz zVS0Pb_{8{LBYv;KZ$Etx)7$GZLBB}+&WiN=nciMAf?lS-9ryqH^yy(Mzl{TKuPsc! zm{%!(9{BnAZ`02(e|xRxZ&gO6JDVQc(e$*<m*Va9)$5ocFE(F`9vA6toOgS@ z&=T@0_4gdp+xkyhNyuv%`{4bLtv`!>3tvpnj$GWqzghXZgH_8wkYsZ%A%h`DC?(_U=8_V)$guXx$~ zTPMw(4Aa*O18Oz5-QP=)UWr)m5c9>Rzh2 +#include + #include #include #include - - -void e() { std::cout << "breakpoint" << std::endl; }; - -void instantiateGLFWWindow() +int main() { - glfwInit(); // we initialize glfw - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - // we configure glfw , - // first argument is what option we want to configure, // the second sets the value of the option - // see: https://www.glfw.org/docs/latest/window.html#window_hints + glfwInit(); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - // We tell glfw we want to use smaller subset of OGL features without backwards-compatible one //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); - // We would use this one if we worked on macOs -} + -int createWindowObject() -{ GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL); - // we provide width and height of window - // then name of the window - // we ignore last 2 parameters - // function returns GLFW window object that we will use for other glfw operations - if (window == NULL) - { - std::cout << "Failed to create GLFW window" << std::endl; - glfwTerminate(); - return -1; - } - // context of our window becomes the main context of current thread - glfwMakeContextCurrent(window); - return 0; -} - -int initializeGLAD() +if (window == NULL) +{ + std::cout << "Failed to create GLFW window" << std::endl; + glfwTerminate(); + return -1; +} +glfwMakeContextCurrent(window); + + +if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { - if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) - { std::cout << "Failed to initialize GLAD" << std::endl; return -1; - } +} return 0; -} - -int main() -{ - if(initializeGLAD() == -1) return -1; - instantiateGLFWWindow(); - if(createWindowObject() == -1) return -1; - e(); - return 0; - } \ No newline at end of file diff --git a/dependencies/include/GLFW/glfw3.h b/dependencies/include/GLFW/glfw3.h new file mode 100644 index 0000000..31b201a --- /dev/null +++ b/dependencies/include/GLFW/glfw3.h @@ -0,0 +1,5912 @@ +/************************************************************************* + * GLFW 3.3 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2019 Camilla Löwy + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would + * be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + *************************************************************************/ + +#ifndef _glfw3_h_ +#define _glfw3_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @file glfw3.h + * @brief The header of the GLFW 3 API. + * + * This is the header file of the GLFW 3 API. It defines all its types and + * declares all its functions. + * + * For more information about how to use this file, see @ref build_include. + */ +/*! @defgroup context Context reference + * @brief Functions and types related to OpenGL and OpenGL ES contexts. + * + * This is the reference documentation for OpenGL and OpenGL ES context related + * functions. For more task-oriented information, see the @ref context_guide. + */ +/*! @defgroup vulkan Vulkan support reference + * @brief Functions and types related to Vulkan. + * + * This is the reference documentation for Vulkan related functions and types. + * For more task-oriented information, see the @ref vulkan_guide. + */ +/*! @defgroup init Initialization, version and error reference + * @brief Functions and types related to initialization and error handling. + * + * This is the reference documentation for initialization and termination of + * the library, version management and error handling. For more task-oriented + * information, see the @ref intro_guide. + */ +/*! @defgroup input Input reference + * @brief Functions and types related to input handling. + * + * This is the reference documentation for input related functions and types. + * For more task-oriented information, see the @ref input_guide. + */ +/*! @defgroup monitor Monitor reference + * @brief Functions and types related to monitors. + * + * This is the reference documentation for monitor related functions and types. + * For more task-oriented information, see the @ref monitor_guide. + */ +/*! @defgroup window Window reference + * @brief Functions and types related to windows. + * + * This is the reference documentation for window related functions and types, + * including creation, deletion and event polling. For more task-oriented + * information, see the @ref window_guide. + */ + + +/************************************************************************* + * Compiler- and platform-specific preprocessor work + *************************************************************************/ + +/* If we are we on Windows, we want a single define for it. + */ +#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)) + #define _WIN32 +#endif /* _WIN32 */ + +/* Include because most Windows GLU headers need wchar_t and + * the macOS OpenGL header blocks the definition of ptrdiff_t by glext.h. + * Include it unconditionally to avoid surprising side-effects. + */ +#include + +/* Include because it is needed by Vulkan and related functions. + * Include it unconditionally to avoid surprising side-effects. + */ +#include + +#if defined(GLFW_INCLUDE_VULKAN) + #include +#endif /* Vulkan header */ + +/* The Vulkan header may have indirectly included windows.h (because of + * VK_USE_PLATFORM_WIN32_KHR) so we offer our replacement symbols after it. + */ + +/* It is customary to use APIENTRY for OpenGL function pointer declarations on + * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. + */ +#if !defined(APIENTRY) + #if defined(_WIN32) + #define APIENTRY __stdcall + #else + #define APIENTRY + #endif + #define GLFW_APIENTRY_DEFINED +#endif /* APIENTRY */ + +/* Some Windows OpenGL headers need this. + */ +#if !defined(WINGDIAPI) && defined(_WIN32) + #define WINGDIAPI __declspec(dllimport) + #define GLFW_WINGDIAPI_DEFINED +#endif /* WINGDIAPI */ + +/* Some Windows GLU headers need this. + */ +#if !defined(CALLBACK) && defined(_WIN32) + #define CALLBACK __stdcall + #define GLFW_CALLBACK_DEFINED +#endif /* CALLBACK */ + +/* Include the chosen OpenGL or OpenGL ES headers. + */ +#if defined(GLFW_INCLUDE_ES1) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_ES2) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_ES3) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_ES31) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_ES32) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_GLCOREARB) + + #if defined(__APPLE__) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif /*GLFW_INCLUDE_GLEXT*/ + + #else /*__APPLE__*/ + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + + #endif /*__APPLE__*/ + +#elif defined(GLFW_INCLUDE_GLU) + + #if defined(__APPLE__) + + #if defined(GLFW_INCLUDE_GLU) + #include + #endif + + #else /*__APPLE__*/ + + #if defined(GLFW_INCLUDE_GLU) + #include + #endif + + #endif /*__APPLE__*/ + +#elif !defined(GLFW_INCLUDE_NONE) && \ + !defined(__gl_h_) && \ + !defined(__gles1_gl_h_) && \ + !defined(__gles2_gl2_h_) && \ + !defined(__gles2_gl3_h_) && \ + !defined(__gles2_gl31_h_) && \ + !defined(__gles2_gl32_h_) && \ + !defined(__gl_glcorearb_h_) && \ + !defined(__gl2_h_) /*legacy*/ && \ + !defined(__gl3_h_) /*legacy*/ && \ + !defined(__gl31_h_) /*legacy*/ && \ + !defined(__gl32_h_) /*legacy*/ && \ + !defined(__glcorearb_h_) /*legacy*/ && \ + !defined(__GL_H__) /*non-standard*/ && \ + !defined(__gltypes_h_) /*non-standard*/ && \ + !defined(__glee_h_) /*non-standard*/ + + #if defined(__APPLE__) + + #if !defined(GLFW_INCLUDE_GLEXT) + #define GL_GLEXT_LEGACY + #endif + #include + + #else /*__APPLE__*/ + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + + #endif /*__APPLE__*/ + +#endif /* OpenGL and OpenGL ES headers */ + +#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) + /* GLFW_DLL must be defined by applications that are linking against the DLL + * version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW + * configuration header when compiling the DLL version of the library. + */ + #error "You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined" +#endif + +/* GLFWAPI is used to declare public API functions for export + * from the DLL / shared library / dynamic library. + */ +#if defined(_WIN32) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a Win32 DLL */ + #define GLFWAPI __declspec(dllexport) +#elif defined(_WIN32) && defined(GLFW_DLL) + /* We are calling a GLFW Win32 DLL */ + #define GLFWAPI __declspec(dllimport) +#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a Unix shared library */ + #define GLFWAPI __attribute__((visibility("default"))) +#else + #define GLFWAPI +#endif + + +/************************************************************************* + * GLFW API tokens + *************************************************************************/ + +/*! @name GLFW version macros + * @{ */ +/*! @brief The major version number of the GLFW header. + * + * The major version number of the GLFW header. This is incremented when the + * API is changed in non-compatible ways. + * @ingroup init + */ +#define GLFW_VERSION_MAJOR 3 +/*! @brief The minor version number of the GLFW header. + * + * The minor version number of the GLFW header. This is incremented when + * features are added to the API but it remains backward-compatible. + * @ingroup init + */ +#define GLFW_VERSION_MINOR 3 +/*! @brief The revision number of the GLFW header. + * + * The revision number of the GLFW header. This is incremented when a bug fix + * release is made that does not contain any API changes. + * @ingroup init + */ +#define GLFW_VERSION_REVISION 8 +/*! @} */ + +/*! @brief One. + * + * This is only semantic sugar for the number 1. You can instead use `1` or + * `true` or `_True` or `GL_TRUE` or `VK_TRUE` or anything else that is equal + * to one. + * + * @ingroup init + */ +#define GLFW_TRUE 1 +/*! @brief Zero. + * + * This is only semantic sugar for the number 0. You can instead use `0` or + * `false` or `_False` or `GL_FALSE` or `VK_FALSE` or anything else that is + * equal to zero. + * + * @ingroup init + */ +#define GLFW_FALSE 0 + +/*! @name Key and button actions + * @{ */ +/*! @brief The key or mouse button was released. + * + * The key or mouse button was released. + * + * @ingroup input + */ +#define GLFW_RELEASE 0 +/*! @brief The key or mouse button was pressed. + * + * The key or mouse button was pressed. + * + * @ingroup input + */ +#define GLFW_PRESS 1 +/*! @brief The key was held down until it repeated. + * + * The key was held down until it repeated. + * + * @ingroup input + */ +#define GLFW_REPEAT 2 +/*! @} */ + +/*! @defgroup hat_state Joystick hat states + * @brief Joystick hat states. + * + * See [joystick hat input](@ref joystick_hat) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_HAT_CENTERED 0 +#define GLFW_HAT_UP 1 +#define GLFW_HAT_RIGHT 2 +#define GLFW_HAT_DOWN 4 +#define GLFW_HAT_LEFT 8 +#define GLFW_HAT_RIGHT_UP (GLFW_HAT_RIGHT | GLFW_HAT_UP) +#define GLFW_HAT_RIGHT_DOWN (GLFW_HAT_RIGHT | GLFW_HAT_DOWN) +#define GLFW_HAT_LEFT_UP (GLFW_HAT_LEFT | GLFW_HAT_UP) +#define GLFW_HAT_LEFT_DOWN (GLFW_HAT_LEFT | GLFW_HAT_DOWN) +/*! @} */ + +/*! @defgroup keys Keyboard keys + * @brief Keyboard key IDs. + * + * See [key input](@ref input_key) for how these are used. + * + * These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60), + * but re-arranged to map to 7-bit ASCII for printable keys (function keys are + * put in the 256+ range). + * + * The naming of the key codes follow these rules: + * - The US keyboard layout is used + * - Names of printable alpha-numeric characters are used (e.g. "A", "R", + * "3", etc.) + * - For non-alphanumeric characters, Unicode:ish names are used (e.g. + * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not + * correspond to the Unicode standard (usually for brevity) + * - Keys that lack a clear US mapping are named "WORLD_x" + * - For non-printable keys, custom names are used (e.g. "F4", + * "BACKSPACE", etc.) + * + * @ingroup input + * @{ + */ + +/* The unknown key */ +#define GLFW_KEY_UNKNOWN -1 + +/* Printable keys */ +#define GLFW_KEY_SPACE 32 +#define GLFW_KEY_APOSTROPHE 39 /* ' */ +#define GLFW_KEY_COMMA 44 /* , */ +#define GLFW_KEY_MINUS 45 /* - */ +#define GLFW_KEY_PERIOD 46 /* . */ +#define GLFW_KEY_SLASH 47 /* / */ +#define GLFW_KEY_0 48 +#define GLFW_KEY_1 49 +#define GLFW_KEY_2 50 +#define GLFW_KEY_3 51 +#define GLFW_KEY_4 52 +#define GLFW_KEY_5 53 +#define GLFW_KEY_6 54 +#define GLFW_KEY_7 55 +#define GLFW_KEY_8 56 +#define GLFW_KEY_9 57 +#define GLFW_KEY_SEMICOLON 59 /* ; */ +#define GLFW_KEY_EQUAL 61 /* = */ +#define GLFW_KEY_A 65 +#define GLFW_KEY_B 66 +#define GLFW_KEY_C 67 +#define GLFW_KEY_D 68 +#define GLFW_KEY_E 69 +#define GLFW_KEY_F 70 +#define GLFW_KEY_G 71 +#define GLFW_KEY_H 72 +#define GLFW_KEY_I 73 +#define GLFW_KEY_J 74 +#define GLFW_KEY_K 75 +#define GLFW_KEY_L 76 +#define GLFW_KEY_M 77 +#define GLFW_KEY_N 78 +#define GLFW_KEY_O 79 +#define GLFW_KEY_P 80 +#define GLFW_KEY_Q 81 +#define GLFW_KEY_R 82 +#define GLFW_KEY_S 83 +#define GLFW_KEY_T 84 +#define GLFW_KEY_U 85 +#define GLFW_KEY_V 86 +#define GLFW_KEY_W 87 +#define GLFW_KEY_X 88 +#define GLFW_KEY_Y 89 +#define GLFW_KEY_Z 90 +#define GLFW_KEY_LEFT_BRACKET 91 /* [ */ +#define GLFW_KEY_BACKSLASH 92 /* \ */ +#define GLFW_KEY_RIGHT_BRACKET 93 /* ] */ +#define GLFW_KEY_GRAVE_ACCENT 96 /* ` */ +#define GLFW_KEY_WORLD_1 161 /* non-US #1 */ +#define GLFW_KEY_WORLD_2 162 /* non-US #2 */ + +/* Function keys */ +#define GLFW_KEY_ESCAPE 256 +#define GLFW_KEY_ENTER 257 +#define GLFW_KEY_TAB 258 +#define GLFW_KEY_BACKSPACE 259 +#define GLFW_KEY_INSERT 260 +#define GLFW_KEY_DELETE 261 +#define GLFW_KEY_RIGHT 262 +#define GLFW_KEY_LEFT 263 +#define GLFW_KEY_DOWN 264 +#define GLFW_KEY_UP 265 +#define GLFW_KEY_PAGE_UP 266 +#define GLFW_KEY_PAGE_DOWN 267 +#define GLFW_KEY_HOME 268 +#define GLFW_KEY_END 269 +#define GLFW_KEY_CAPS_LOCK 280 +#define GLFW_KEY_SCROLL_LOCK 281 +#define GLFW_KEY_NUM_LOCK 282 +#define GLFW_KEY_PRINT_SCREEN 283 +#define GLFW_KEY_PAUSE 284 +#define GLFW_KEY_F1 290 +#define GLFW_KEY_F2 291 +#define GLFW_KEY_F3 292 +#define GLFW_KEY_F4 293 +#define GLFW_KEY_F5 294 +#define GLFW_KEY_F6 295 +#define GLFW_KEY_F7 296 +#define GLFW_KEY_F8 297 +#define GLFW_KEY_F9 298 +#define GLFW_KEY_F10 299 +#define GLFW_KEY_F11 300 +#define GLFW_KEY_F12 301 +#define GLFW_KEY_F13 302 +#define GLFW_KEY_F14 303 +#define GLFW_KEY_F15 304 +#define GLFW_KEY_F16 305 +#define GLFW_KEY_F17 306 +#define GLFW_KEY_F18 307 +#define GLFW_KEY_F19 308 +#define GLFW_KEY_F20 309 +#define GLFW_KEY_F21 310 +#define GLFW_KEY_F22 311 +#define GLFW_KEY_F23 312 +#define GLFW_KEY_F24 313 +#define GLFW_KEY_F25 314 +#define GLFW_KEY_KP_0 320 +#define GLFW_KEY_KP_1 321 +#define GLFW_KEY_KP_2 322 +#define GLFW_KEY_KP_3 323 +#define GLFW_KEY_KP_4 324 +#define GLFW_KEY_KP_5 325 +#define GLFW_KEY_KP_6 326 +#define GLFW_KEY_KP_7 327 +#define GLFW_KEY_KP_8 328 +#define GLFW_KEY_KP_9 329 +#define GLFW_KEY_KP_DECIMAL 330 +#define GLFW_KEY_KP_DIVIDE 331 +#define GLFW_KEY_KP_MULTIPLY 332 +#define GLFW_KEY_KP_SUBTRACT 333 +#define GLFW_KEY_KP_ADD 334 +#define GLFW_KEY_KP_ENTER 335 +#define GLFW_KEY_KP_EQUAL 336 +#define GLFW_KEY_LEFT_SHIFT 340 +#define GLFW_KEY_LEFT_CONTROL 341 +#define GLFW_KEY_LEFT_ALT 342 +#define GLFW_KEY_LEFT_SUPER 343 +#define GLFW_KEY_RIGHT_SHIFT 344 +#define GLFW_KEY_RIGHT_CONTROL 345 +#define GLFW_KEY_RIGHT_ALT 346 +#define GLFW_KEY_RIGHT_SUPER 347 +#define GLFW_KEY_MENU 348 + +#define GLFW_KEY_LAST GLFW_KEY_MENU + +/*! @} */ + +/*! @defgroup mods Modifier key flags + * @brief Modifier key flags. + * + * See [key input](@ref input_key) for how these are used. + * + * @ingroup input + * @{ */ + +/*! @brief If this bit is set one or more Shift keys were held down. + * + * If this bit is set one or more Shift keys were held down. + */ +#define GLFW_MOD_SHIFT 0x0001 +/*! @brief If this bit is set one or more Control keys were held down. + * + * If this bit is set one or more Control keys were held down. + */ +#define GLFW_MOD_CONTROL 0x0002 +/*! @brief If this bit is set one or more Alt keys were held down. + * + * If this bit is set one or more Alt keys were held down. + */ +#define GLFW_MOD_ALT 0x0004 +/*! @brief If this bit is set one or more Super keys were held down. + * + * If this bit is set one or more Super keys were held down. + */ +#define GLFW_MOD_SUPER 0x0008 +/*! @brief If this bit is set the Caps Lock key is enabled. + * + * If this bit is set the Caps Lock key is enabled and the @ref + * GLFW_LOCK_KEY_MODS input mode is set. + */ +#define GLFW_MOD_CAPS_LOCK 0x0010 +/*! @brief If this bit is set the Num Lock key is enabled. + * + * If this bit is set the Num Lock key is enabled and the @ref + * GLFW_LOCK_KEY_MODS input mode is set. + */ +#define GLFW_MOD_NUM_LOCK 0x0020 + +/*! @} */ + +/*! @defgroup buttons Mouse buttons + * @brief Mouse button IDs. + * + * See [mouse button input](@ref input_mouse_button) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_MOUSE_BUTTON_1 0 +#define GLFW_MOUSE_BUTTON_2 1 +#define GLFW_MOUSE_BUTTON_3 2 +#define GLFW_MOUSE_BUTTON_4 3 +#define GLFW_MOUSE_BUTTON_5 4 +#define GLFW_MOUSE_BUTTON_6 5 +#define GLFW_MOUSE_BUTTON_7 6 +#define GLFW_MOUSE_BUTTON_8 7 +#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8 +#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1 +#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2 +#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3 +/*! @} */ + +/*! @defgroup joysticks Joysticks + * @brief Joystick IDs. + * + * See [joystick input](@ref joystick) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_JOYSTICK_1 0 +#define GLFW_JOYSTICK_2 1 +#define GLFW_JOYSTICK_3 2 +#define GLFW_JOYSTICK_4 3 +#define GLFW_JOYSTICK_5 4 +#define GLFW_JOYSTICK_6 5 +#define GLFW_JOYSTICK_7 6 +#define GLFW_JOYSTICK_8 7 +#define GLFW_JOYSTICK_9 8 +#define GLFW_JOYSTICK_10 9 +#define GLFW_JOYSTICK_11 10 +#define GLFW_JOYSTICK_12 11 +#define GLFW_JOYSTICK_13 12 +#define GLFW_JOYSTICK_14 13 +#define GLFW_JOYSTICK_15 14 +#define GLFW_JOYSTICK_16 15 +#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16 +/*! @} */ + +/*! @defgroup gamepad_buttons Gamepad buttons + * @brief Gamepad buttons. + * + * See @ref gamepad for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_GAMEPAD_BUTTON_A 0 +#define GLFW_GAMEPAD_BUTTON_B 1 +#define GLFW_GAMEPAD_BUTTON_X 2 +#define GLFW_GAMEPAD_BUTTON_Y 3 +#define GLFW_GAMEPAD_BUTTON_LEFT_BUMPER 4 +#define GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER 5 +#define GLFW_GAMEPAD_BUTTON_BACK 6 +#define GLFW_GAMEPAD_BUTTON_START 7 +#define GLFW_GAMEPAD_BUTTON_GUIDE 8 +#define GLFW_GAMEPAD_BUTTON_LEFT_THUMB 9 +#define GLFW_GAMEPAD_BUTTON_RIGHT_THUMB 10 +#define GLFW_GAMEPAD_BUTTON_DPAD_UP 11 +#define GLFW_GAMEPAD_BUTTON_DPAD_RIGHT 12 +#define GLFW_GAMEPAD_BUTTON_DPAD_DOWN 13 +#define GLFW_GAMEPAD_BUTTON_DPAD_LEFT 14 +#define GLFW_GAMEPAD_BUTTON_LAST GLFW_GAMEPAD_BUTTON_DPAD_LEFT + +#define GLFW_GAMEPAD_BUTTON_CROSS GLFW_GAMEPAD_BUTTON_A +#define GLFW_GAMEPAD_BUTTON_CIRCLE GLFW_GAMEPAD_BUTTON_B +#define GLFW_GAMEPAD_BUTTON_SQUARE GLFW_GAMEPAD_BUTTON_X +#define GLFW_GAMEPAD_BUTTON_TRIANGLE GLFW_GAMEPAD_BUTTON_Y +/*! @} */ + +/*! @defgroup gamepad_axes Gamepad axes + * @brief Gamepad axes. + * + * See @ref gamepad for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_GAMEPAD_AXIS_LEFT_X 0 +#define GLFW_GAMEPAD_AXIS_LEFT_Y 1 +#define GLFW_GAMEPAD_AXIS_RIGHT_X 2 +#define GLFW_GAMEPAD_AXIS_RIGHT_Y 3 +#define GLFW_GAMEPAD_AXIS_LEFT_TRIGGER 4 +#define GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER 5 +#define GLFW_GAMEPAD_AXIS_LAST GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER +/*! @} */ + +/*! @defgroup errors Error codes + * @brief Error codes. + * + * See [error handling](@ref error_handling) for how these are used. + * + * @ingroup init + * @{ */ +/*! @brief No error has occurred. + * + * No error has occurred. + * + * @analysis Yay. + */ +#define GLFW_NO_ERROR 0 +/*! @brief GLFW has not been initialized. + * + * This occurs if a GLFW function was called that must not be called unless the + * library is [initialized](@ref intro_init). + * + * @analysis Application programmer error. Initialize GLFW before calling any + * function that requires initialization. + */ +#define GLFW_NOT_INITIALIZED 0x00010001 +/*! @brief No context is current for this thread. + * + * This occurs if a GLFW function was called that needs and operates on the + * current OpenGL or OpenGL ES context but no context is current on the calling + * thread. One such function is @ref glfwSwapInterval. + * + * @analysis Application programmer error. Ensure a context is current before + * calling functions that require a current context. + */ +#define GLFW_NO_CURRENT_CONTEXT 0x00010002 +/*! @brief One of the arguments to the function was an invalid enum value. + * + * One of the arguments to the function was an invalid enum value, for example + * requesting @ref GLFW_RED_BITS with @ref glfwGetWindowAttrib. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_INVALID_ENUM 0x00010003 +/*! @brief One of the arguments to the function was an invalid value. + * + * One of the arguments to the function was an invalid value, for example + * requesting a non-existent OpenGL or OpenGL ES version like 2.7. + * + * Requesting a valid but unavailable OpenGL or OpenGL ES version will instead + * result in a @ref GLFW_VERSION_UNAVAILABLE error. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_INVALID_VALUE 0x00010004 +/*! @brief A memory allocation failed. + * + * A memory allocation failed. + * + * @analysis A bug in GLFW or the underlying operating system. Report the bug + * to our [issue tracker](https://github.com/glfw/glfw/issues). + */ +#define GLFW_OUT_OF_MEMORY 0x00010005 +/*! @brief GLFW could not find support for the requested API on the system. + * + * GLFW could not find support for the requested API on the system. + * + * @analysis The installed graphics driver does not support the requested + * API, or does not support it via the chosen context creation backend. + * Below are a few examples. + * + * @par + * Some pre-installed Windows graphics drivers do not support OpenGL. AMD only + * supports OpenGL ES via EGL, while Nvidia and Intel only support it via + * a WGL or GLX extension. macOS does not provide OpenGL ES at all. The Mesa + * EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary + * driver. Older graphics drivers do not support Vulkan. + */ +#define GLFW_API_UNAVAILABLE 0x00010006 +/*! @brief The requested OpenGL or OpenGL ES version is not available. + * + * The requested OpenGL or OpenGL ES version (including any requested context + * or framebuffer hints) is not available on this machine. + * + * @analysis The machine does not support your requirements. If your + * application is sufficiently flexible, downgrade your requirements and try + * again. Otherwise, inform the user that their machine does not match your + * requirements. + * + * @par + * Future invalid OpenGL and OpenGL ES versions, for example OpenGL 4.8 if 5.0 + * comes out before the 4.x series gets that far, also fail with this error and + * not @ref GLFW_INVALID_VALUE, because GLFW cannot know what future versions + * will exist. + */ +#define GLFW_VERSION_UNAVAILABLE 0x00010007 +/*! @brief A platform-specific error occurred that does not match any of the + * more specific categories. + * + * A platform-specific error occurred that does not match any of the more + * specific categories. + * + * @analysis A bug or configuration error in GLFW, the underlying operating + * system or its drivers, or a lack of required resources. Report the issue to + * our [issue tracker](https://github.com/glfw/glfw/issues). + */ +#define GLFW_PLATFORM_ERROR 0x00010008 +/*! @brief The requested format is not supported or available. + * + * If emitted during window creation, the requested pixel format is not + * supported. + * + * If emitted when querying the clipboard, the contents of the clipboard could + * not be converted to the requested format. + * + * @analysis If emitted during window creation, one or more + * [hard constraints](@ref window_hints_hard) did not match any of the + * available pixel formats. If your application is sufficiently flexible, + * downgrade your requirements and try again. Otherwise, inform the user that + * their machine does not match your requirements. + * + * @par + * If emitted when querying the clipboard, ignore the error or report it to + * the user, as appropriate. + */ +#define GLFW_FORMAT_UNAVAILABLE 0x00010009 +/*! @brief The specified window does not have an OpenGL or OpenGL ES context. + * + * A window that does not have an OpenGL or OpenGL ES context was passed to + * a function that requires it to have one. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_NO_WINDOW_CONTEXT 0x0001000A +/*! @} */ + +/*! @addtogroup window + * @{ */ +/*! @brief Input focus window hint and attribute + * + * Input focus [window hint](@ref GLFW_FOCUSED_hint) or + * [window attribute](@ref GLFW_FOCUSED_attrib). + */ +#define GLFW_FOCUSED 0x00020001 +/*! @brief Window iconification window attribute + * + * Window iconification [window attribute](@ref GLFW_ICONIFIED_attrib). + */ +#define GLFW_ICONIFIED 0x00020002 +/*! @brief Window resize-ability window hint and attribute + * + * Window resize-ability [window hint](@ref GLFW_RESIZABLE_hint) and + * [window attribute](@ref GLFW_RESIZABLE_attrib). + */ +#define GLFW_RESIZABLE 0x00020003 +/*! @brief Window visibility window hint and attribute + * + * Window visibility [window hint](@ref GLFW_VISIBLE_hint) and + * [window attribute](@ref GLFW_VISIBLE_attrib). + */ +#define GLFW_VISIBLE 0x00020004 +/*! @brief Window decoration window hint and attribute + * + * Window decoration [window hint](@ref GLFW_DECORATED_hint) and + * [window attribute](@ref GLFW_DECORATED_attrib). + */ +#define GLFW_DECORATED 0x00020005 +/*! @brief Window auto-iconification window hint and attribute + * + * Window auto-iconification [window hint](@ref GLFW_AUTO_ICONIFY_hint) and + * [window attribute](@ref GLFW_AUTO_ICONIFY_attrib). + */ +#define GLFW_AUTO_ICONIFY 0x00020006 +/*! @brief Window decoration window hint and attribute + * + * Window decoration [window hint](@ref GLFW_FLOATING_hint) and + * [window attribute](@ref GLFW_FLOATING_attrib). + */ +#define GLFW_FLOATING 0x00020007 +/*! @brief Window maximization window hint and attribute + * + * Window maximization [window hint](@ref GLFW_MAXIMIZED_hint) and + * [window attribute](@ref GLFW_MAXIMIZED_attrib). + */ +#define GLFW_MAXIMIZED 0x00020008 +/*! @brief Cursor centering window hint + * + * Cursor centering [window hint](@ref GLFW_CENTER_CURSOR_hint). + */ +#define GLFW_CENTER_CURSOR 0x00020009 +/*! @brief Window framebuffer transparency hint and attribute + * + * Window framebuffer transparency + * [window hint](@ref GLFW_TRANSPARENT_FRAMEBUFFER_hint) and + * [window attribute](@ref GLFW_TRANSPARENT_FRAMEBUFFER_attrib). + */ +#define GLFW_TRANSPARENT_FRAMEBUFFER 0x0002000A +/*! @brief Mouse cursor hover window attribute. + * + * Mouse cursor hover [window attribute](@ref GLFW_HOVERED_attrib). + */ +#define GLFW_HOVERED 0x0002000B +/*! @brief Input focus on calling show window hint and attribute + * + * Input focus [window hint](@ref GLFW_FOCUS_ON_SHOW_hint) or + * [window attribute](@ref GLFW_FOCUS_ON_SHOW_attrib). + */ +#define GLFW_FOCUS_ON_SHOW 0x0002000C + +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_RED_BITS). + */ +#define GLFW_RED_BITS 0x00021001 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_GREEN_BITS). + */ +#define GLFW_GREEN_BITS 0x00021002 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_BLUE_BITS). + */ +#define GLFW_BLUE_BITS 0x00021003 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ALPHA_BITS). + */ +#define GLFW_ALPHA_BITS 0x00021004 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_DEPTH_BITS). + */ +#define GLFW_DEPTH_BITS 0x00021005 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_STENCIL_BITS). + */ +#define GLFW_STENCIL_BITS 0x00021006 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_RED_BITS). + */ +#define GLFW_ACCUM_RED_BITS 0x00021007 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_GREEN_BITS). + */ +#define GLFW_ACCUM_GREEN_BITS 0x00021008 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_BLUE_BITS). + */ +#define GLFW_ACCUM_BLUE_BITS 0x00021009 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_ALPHA_BITS). + */ +#define GLFW_ACCUM_ALPHA_BITS 0x0002100A +/*! @brief Framebuffer auxiliary buffer hint. + * + * Framebuffer auxiliary buffer [hint](@ref GLFW_AUX_BUFFERS). + */ +#define GLFW_AUX_BUFFERS 0x0002100B +/*! @brief OpenGL stereoscopic rendering hint. + * + * OpenGL stereoscopic rendering [hint](@ref GLFW_STEREO). + */ +#define GLFW_STEREO 0x0002100C +/*! @brief Framebuffer MSAA samples hint. + * + * Framebuffer MSAA samples [hint](@ref GLFW_SAMPLES). + */ +#define GLFW_SAMPLES 0x0002100D +/*! @brief Framebuffer sRGB hint. + * + * Framebuffer sRGB [hint](@ref GLFW_SRGB_CAPABLE). + */ +#define GLFW_SRGB_CAPABLE 0x0002100E +/*! @brief Monitor refresh rate hint. + * + * Monitor refresh rate [hint](@ref GLFW_REFRESH_RATE). + */ +#define GLFW_REFRESH_RATE 0x0002100F +/*! @brief Framebuffer double buffering hint. + * + * Framebuffer double buffering [hint](@ref GLFW_DOUBLEBUFFER). + */ +#define GLFW_DOUBLEBUFFER 0x00021010 + +/*! @brief Context client API hint and attribute. + * + * Context client API [hint](@ref GLFW_CLIENT_API_hint) and + * [attribute](@ref GLFW_CLIENT_API_attrib). + */ +#define GLFW_CLIENT_API 0x00022001 +/*! @brief Context client API major version hint and attribute. + * + * Context client API major version [hint](@ref GLFW_CONTEXT_VERSION_MAJOR_hint) + * and [attribute](@ref GLFW_CONTEXT_VERSION_MAJOR_attrib). + */ +#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 +/*! @brief Context client API minor version hint and attribute. + * + * Context client API minor version [hint](@ref GLFW_CONTEXT_VERSION_MINOR_hint) + * and [attribute](@ref GLFW_CONTEXT_VERSION_MINOR_attrib). + */ +#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 +/*! @brief Context client API revision number attribute. + * + * Context client API revision number + * [attribute](@ref GLFW_CONTEXT_REVISION_attrib). + */ +#define GLFW_CONTEXT_REVISION 0x00022004 +/*! @brief Context robustness hint and attribute. + * + * Context client API revision number [hint](@ref GLFW_CONTEXT_ROBUSTNESS_hint) + * and [attribute](@ref GLFW_CONTEXT_ROBUSTNESS_attrib). + */ +#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 +/*! @brief OpenGL forward-compatibility hint and attribute. + * + * OpenGL forward-compatibility [hint](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) + * and [attribute](@ref GLFW_OPENGL_FORWARD_COMPAT_attrib). + */ +#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 +/*! @brief Debug mode context hint and attribute. + * + * Debug mode context [hint](@ref GLFW_OPENGL_DEBUG_CONTEXT_hint) and + * [attribute](@ref GLFW_OPENGL_DEBUG_CONTEXT_attrib). + */ +#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 +/*! @brief OpenGL profile hint and attribute. + * + * OpenGL profile [hint](@ref GLFW_OPENGL_PROFILE_hint) and + * [attribute](@ref GLFW_OPENGL_PROFILE_attrib). + */ +#define GLFW_OPENGL_PROFILE 0x00022008 +/*! @brief Context flush-on-release hint and attribute. + * + * Context flush-on-release [hint](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) and + * [attribute](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_attrib). + */ +#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 +/*! @brief Context error suppression hint and attribute. + * + * Context error suppression [hint](@ref GLFW_CONTEXT_NO_ERROR_hint) and + * [attribute](@ref GLFW_CONTEXT_NO_ERROR_attrib). + */ +#define GLFW_CONTEXT_NO_ERROR 0x0002200A +/*! @brief Context creation API hint and attribute. + * + * Context creation API [hint](@ref GLFW_CONTEXT_CREATION_API_hint) and + * [attribute](@ref GLFW_CONTEXT_CREATION_API_attrib). + */ +#define GLFW_CONTEXT_CREATION_API 0x0002200B +/*! @brief Window content area scaling window + * [window hint](@ref GLFW_SCALE_TO_MONITOR). + */ +#define GLFW_SCALE_TO_MONITOR 0x0002200C +/*! @brief macOS specific + * [window hint](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint). + */ +#define GLFW_COCOA_RETINA_FRAMEBUFFER 0x00023001 +/*! @brief macOS specific + * [window hint](@ref GLFW_COCOA_FRAME_NAME_hint). + */ +#define GLFW_COCOA_FRAME_NAME 0x00023002 +/*! @brief macOS specific + * [window hint](@ref GLFW_COCOA_GRAPHICS_SWITCHING_hint). + */ +#define GLFW_COCOA_GRAPHICS_SWITCHING 0x00023003 +/*! @brief X11 specific + * [window hint](@ref GLFW_X11_CLASS_NAME_hint). + */ +#define GLFW_X11_CLASS_NAME 0x00024001 +/*! @brief X11 specific + * [window hint](@ref GLFW_X11_CLASS_NAME_hint). + */ +#define GLFW_X11_INSTANCE_NAME 0x00024002 +/*! @} */ + +#define GLFW_NO_API 0 +#define GLFW_OPENGL_API 0x00030001 +#define GLFW_OPENGL_ES_API 0x00030002 + +#define GLFW_NO_ROBUSTNESS 0 +#define GLFW_NO_RESET_NOTIFICATION 0x00031001 +#define GLFW_LOSE_CONTEXT_ON_RESET 0x00031002 + +#define GLFW_OPENGL_ANY_PROFILE 0 +#define GLFW_OPENGL_CORE_PROFILE 0x00032001 +#define GLFW_OPENGL_COMPAT_PROFILE 0x00032002 + +#define GLFW_CURSOR 0x00033001 +#define GLFW_STICKY_KEYS 0x00033002 +#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003 +#define GLFW_LOCK_KEY_MODS 0x00033004 +#define GLFW_RAW_MOUSE_MOTION 0x00033005 + +#define GLFW_CURSOR_NORMAL 0x00034001 +#define GLFW_CURSOR_HIDDEN 0x00034002 +#define GLFW_CURSOR_DISABLED 0x00034003 + +#define GLFW_ANY_RELEASE_BEHAVIOR 0 +#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 +#define GLFW_RELEASE_BEHAVIOR_NONE 0x00035002 + +#define GLFW_NATIVE_CONTEXT_API 0x00036001 +#define GLFW_EGL_CONTEXT_API 0x00036002 +#define GLFW_OSMESA_CONTEXT_API 0x00036003 + +/*! @defgroup shapes Standard cursor shapes + * @brief Standard system cursor shapes. + * + * See [standard cursor creation](@ref cursor_standard) for how these are used. + * + * @ingroup input + * @{ */ + +/*! @brief The regular arrow cursor shape. + * + * The regular arrow cursor. + */ +#define GLFW_ARROW_CURSOR 0x00036001 +/*! @brief The text input I-beam cursor shape. + * + * The text input I-beam cursor shape. + */ +#define GLFW_IBEAM_CURSOR 0x00036002 +/*! @brief The crosshair shape. + * + * The crosshair shape. + */ +#define GLFW_CROSSHAIR_CURSOR 0x00036003 +/*! @brief The hand shape. + * + * The hand shape. + */ +#define GLFW_HAND_CURSOR 0x00036004 +/*! @brief The horizontal resize arrow shape. + * + * The horizontal resize arrow shape. + */ +#define GLFW_HRESIZE_CURSOR 0x00036005 +/*! @brief The vertical resize arrow shape. + * + * The vertical resize arrow shape. + */ +#define GLFW_VRESIZE_CURSOR 0x00036006 +/*! @} */ + +#define GLFW_CONNECTED 0x00040001 +#define GLFW_DISCONNECTED 0x00040002 + +/*! @addtogroup init + * @{ */ +/*! @brief Joystick hat buttons init hint. + * + * Joystick hat buttons [init hint](@ref GLFW_JOYSTICK_HAT_BUTTONS). + */ +#define GLFW_JOYSTICK_HAT_BUTTONS 0x00050001 +/*! @brief macOS specific init hint. + * + * macOS specific [init hint](@ref GLFW_COCOA_CHDIR_RESOURCES_hint). + */ +#define GLFW_COCOA_CHDIR_RESOURCES 0x00051001 +/*! @brief macOS specific init hint. + * + * macOS specific [init hint](@ref GLFW_COCOA_MENUBAR_hint). + */ +#define GLFW_COCOA_MENUBAR 0x00051002 +/*! @} */ + +#define GLFW_DONT_CARE -1 + + +/************************************************************************* + * GLFW API types + *************************************************************************/ + +/*! @brief Client API function pointer type. + * + * Generic function pointer used for returning client API function pointers + * without forcing a cast from a regular pointer. + * + * @sa @ref context_glext + * @sa @ref glfwGetProcAddress + * + * @since Added in version 3.0. + * + * @ingroup context + */ +typedef void (*GLFWglproc)(void); + +/*! @brief Vulkan API function pointer type. + * + * Generic function pointer used for returning Vulkan API function pointers + * without forcing a cast from a regular pointer. + * + * @sa @ref vulkan_proc + * @sa @ref glfwGetInstanceProcAddress + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +typedef void (*GLFWvkproc)(void); + +/*! @brief Opaque monitor object. + * + * Opaque monitor object. + * + * @see @ref monitor_object + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef struct GLFWmonitor GLFWmonitor; + +/*! @brief Opaque window object. + * + * Opaque window object. + * + * @see @ref window_object + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef struct GLFWwindow GLFWwindow; + +/*! @brief Opaque cursor object. + * + * Opaque cursor object. + * + * @see @ref cursor_object + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef struct GLFWcursor GLFWcursor; + +/*! @brief The function pointer type for error callbacks. + * + * This is the function pointer type for error callbacks. An error callback + * function has the following signature: + * @code + * void callback_name(int error_code, const char* description) + * @endcode + * + * @param[in] error_code An [error code](@ref errors). Future releases may add + * more error codes. + * @param[in] description A UTF-8 encoded string describing the error. + * + * @pointer_lifetime The error description string is valid until the callback + * function returns. + * + * @sa @ref error_handling + * @sa @ref glfwSetErrorCallback + * + * @since Added in version 3.0. + * + * @ingroup init + */ +typedef void (* GLFWerrorfun)(int error_code, const char* description); + +/*! @brief The function pointer type for window position callbacks. + * + * This is the function pointer type for window position callbacks. A window + * position callback function has the following signature: + * @code + * void callback_name(GLFWwindow* window, int xpos, int ypos) + * @endcode + * + * @param[in] window The window that was moved. + * @param[in] xpos The new x-coordinate, in screen coordinates, of the + * upper-left corner of the content area of the window. + * @param[in] ypos The new y-coordinate, in screen coordinates, of the + * upper-left corner of the content area of the window. + * + * @sa @ref window_pos + * @sa @ref glfwSetWindowPosCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowposfun)(GLFWwindow* window, int xpos, int ypos); + +/*! @brief The function pointer type for window size callbacks. + * + * This is the function pointer type for window size callbacks. A window size + * callback function has the following signature: + * @code + * void callback_name(GLFWwindow* window, int width, int height) + * @endcode + * + * @param[in] window The window that was resized. + * @param[in] width The new width, in screen coordinates, of the window. + * @param[in] height The new height, in screen coordinates, of the window. + * + * @sa @ref window_size + * @sa @ref glfwSetWindowSizeCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowsizefun)(GLFWwindow* window, int width, int height); + +/*! @brief The function pointer type for window close callbacks. + * + * This is the function pointer type for window close callbacks. A window + * close callback function has the following signature: + * @code + * void function_name(GLFWwindow* window) + * @endcode + * + * @param[in] window The window that the user attempted to close. + * + * @sa @ref window_close + * @sa @ref glfwSetWindowCloseCallback + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowclosefun)(GLFWwindow* window); + +/*! @brief The function pointer type for window content refresh callbacks. + * + * This is the function pointer type for window content refresh callbacks. + * A window content refresh callback function has the following signature: + * @code + * void function_name(GLFWwindow* window); + * @endcode + * + * @param[in] window The window whose content needs to be refreshed. + * + * @sa @ref window_refresh + * @sa @ref glfwSetWindowRefreshCallback + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowrefreshfun)(GLFWwindow* window); + +/*! @brief The function pointer type for window focus callbacks. + * + * This is the function pointer type for window focus callbacks. A window + * focus callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int focused) + * @endcode + * + * @param[in] window The window that gained or lost input focus. + * @param[in] focused `GLFW_TRUE` if the window was given input focus, or + * `GLFW_FALSE` if it lost it. + * + * @sa @ref window_focus + * @sa @ref glfwSetWindowFocusCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowfocusfun)(GLFWwindow* window, int focused); + +/*! @brief The function pointer type for window iconify callbacks. + * + * This is the function pointer type for window iconify callbacks. A window + * iconify callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int iconified) + * @endcode + * + * @param[in] window The window that was iconified or restored. + * @param[in] iconified `GLFW_TRUE` if the window was iconified, or + * `GLFW_FALSE` if it was restored. + * + * @sa @ref window_iconify + * @sa @ref glfwSetWindowIconifyCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowiconifyfun)(GLFWwindow* window, int iconified); + +/*! @brief The function pointer type for window maximize callbacks. + * + * This is the function pointer type for window maximize callbacks. A window + * maximize callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int maximized) + * @endcode + * + * @param[in] window The window that was maximized or restored. + * @param[in] maximized `GLFW_TRUE` if the window was maximized, or + * `GLFW_FALSE` if it was restored. + * + * @sa @ref window_maximize + * @sa glfwSetWindowMaximizeCallback + * + * @since Added in version 3.3. + * + * @ingroup window + */ +typedef void (* GLFWwindowmaximizefun)(GLFWwindow* window, int maximized); + +/*! @brief The function pointer type for framebuffer size callbacks. + * + * This is the function pointer type for framebuffer size callbacks. + * A framebuffer size callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * + * @param[in] window The window whose framebuffer was resized. + * @param[in] width The new width, in pixels, of the framebuffer. + * @param[in] height The new height, in pixels, of the framebuffer. + * + * @sa @ref window_fbsize + * @sa @ref glfwSetFramebufferSizeCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWframebuffersizefun)(GLFWwindow* window, int width, int height); + +/*! @brief The function pointer type for window content scale callbacks. + * + * This is the function pointer type for window content scale callbacks. + * A window content scale callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, float xscale, float yscale) + * @endcode + * + * @param[in] window The window whose content scale changed. + * @param[in] xscale The new x-axis content scale of the window. + * @param[in] yscale The new y-axis content scale of the window. + * + * @sa @ref window_scale + * @sa @ref glfwSetWindowContentScaleCallback + * + * @since Added in version 3.3. + * + * @ingroup window + */ +typedef void (* GLFWwindowcontentscalefun)(GLFWwindow* window, float xscale, float yscale); + +/*! @brief The function pointer type for mouse button callbacks. + * + * This is the function pointer type for mouse button callback functions. + * A mouse button callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int button, int action, int mods) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] button The [mouse button](@ref buttons) that was pressed or + * released. + * @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. Future releases + * may add more actions. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_mouse_button + * @sa @ref glfwSetMouseButtonCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle and modifier mask parameters. + * + * @ingroup input + */ +typedef void (* GLFWmousebuttonfun)(GLFWwindow* window, int button, int action, int mods); + +/*! @brief The function pointer type for cursor position callbacks. + * + * This is the function pointer type for cursor position callbacks. A cursor + * position callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, double xpos, double ypos); + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] xpos The new cursor x-coordinate, relative to the left edge of + * the content area. + * @param[in] ypos The new cursor y-coordinate, relative to the top edge of the + * content area. + * + * @sa @ref cursor_pos + * @sa @ref glfwSetCursorPosCallback + * + * @since Added in version 3.0. Replaces `GLFWmouseposfun`. + * + * @ingroup input + */ +typedef void (* GLFWcursorposfun)(GLFWwindow* window, double xpos, double ypos); + +/*! @brief The function pointer type for cursor enter/leave callbacks. + * + * This is the function pointer type for cursor enter/leave callbacks. + * A cursor enter/leave callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int entered) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] entered `GLFW_TRUE` if the cursor entered the window's content + * area, or `GLFW_FALSE` if it left it. + * + * @sa @ref cursor_enter + * @sa @ref glfwSetCursorEnterCallback + * + * @since Added in version 3.0. + * + * @ingroup input + */ +typedef void (* GLFWcursorenterfun)(GLFWwindow* window, int entered); + +/*! @brief The function pointer type for scroll callbacks. + * + * This is the function pointer type for scroll callbacks. A scroll callback + * function has the following signature: + * @code + * void function_name(GLFWwindow* window, double xoffset, double yoffset) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] xoffset The scroll offset along the x-axis. + * @param[in] yoffset The scroll offset along the y-axis. + * + * @sa @ref scrolling + * @sa @ref glfwSetScrollCallback + * + * @since Added in version 3.0. Replaces `GLFWmousewheelfun`. + * + * @ingroup input + */ +typedef void (* GLFWscrollfun)(GLFWwindow* window, double xoffset, double yoffset); + +/*! @brief The function pointer type for keyboard key callbacks. + * + * This is the function pointer type for keyboard key callbacks. A keyboard + * key callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] key The [keyboard key](@ref keys) that was pressed or released. + * @param[in] scancode The system-specific scancode of the key. + * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. Future + * releases may add more actions. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_key + * @sa @ref glfwSetKeyCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle, scancode and modifier mask parameters. + * + * @ingroup input + */ +typedef void (* GLFWkeyfun)(GLFWwindow* window, int key, int scancode, int action, int mods); + +/*! @brief The function pointer type for Unicode character callbacks. + * + * This is the function pointer type for Unicode character callbacks. + * A Unicode character callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * + * @sa @ref input_char + * @sa @ref glfwSetCharCallback + * + * @since Added in version 2.4. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +typedef void (* GLFWcharfun)(GLFWwindow* window, unsigned int codepoint); + +/*! @brief The function pointer type for Unicode character with modifiers + * callbacks. + * + * This is the function pointer type for Unicode character with modifiers + * callbacks. It is called for each input character, regardless of what + * modifier keys are held down. A Unicode character with modifiers callback + * function has the following signature: + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint, int mods) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_char + * @sa @ref glfwSetCharModsCallback + * + * @deprecated Scheduled for removal in version 4.0. + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef void (* GLFWcharmodsfun)(GLFWwindow* window, unsigned int codepoint, int mods); + +/*! @brief The function pointer type for path drop callbacks. + * + * This is the function pointer type for path drop callbacks. A path drop + * callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int path_count, const char* paths[]) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] path_count The number of dropped paths. + * @param[in] paths The UTF-8 encoded file and/or directory path names. + * + * @pointer_lifetime The path array and its strings are valid until the + * callback function returns. + * + * @sa @ref path_drop + * @sa @ref glfwSetDropCallback + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef void (* GLFWdropfun)(GLFWwindow* window, int path_count, const char* paths[]); + +/*! @brief The function pointer type for monitor configuration callbacks. + * + * This is the function pointer type for monitor configuration callbacks. + * A monitor callback function has the following signature: + * @code + * void function_name(GLFWmonitor* monitor, int event) + * @endcode + * + * @param[in] monitor The monitor that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future + * releases may add more events. + * + * @sa @ref monitor_event + * @sa @ref glfwSetMonitorCallback + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef void (* GLFWmonitorfun)(GLFWmonitor* monitor, int event); + +/*! @brief The function pointer type for joystick configuration callbacks. + * + * This is the function pointer type for joystick configuration callbacks. + * A joystick configuration callback function has the following signature: + * @code + * void function_name(int jid, int event) + * @endcode + * + * @param[in] jid The joystick that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future + * releases may add more events. + * + * @sa @ref joystick_event + * @sa @ref glfwSetJoystickCallback + * + * @since Added in version 3.2. + * + * @ingroup input + */ +typedef void (* GLFWjoystickfun)(int jid, int event); + +/*! @brief Video mode type. + * + * This describes a single video mode. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoMode + * @sa @ref glfwGetVideoModes + * + * @since Added in version 1.0. + * @glfw3 Added refresh rate member. + * + * @ingroup monitor + */ +typedef struct GLFWvidmode +{ + /*! The width, in screen coordinates, of the video mode. + */ + int width; + /*! The height, in screen coordinates, of the video mode. + */ + int height; + /*! The bit depth of the red channel of the video mode. + */ + int redBits; + /*! The bit depth of the green channel of the video mode. + */ + int greenBits; + /*! The bit depth of the blue channel of the video mode. + */ + int blueBits; + /*! The refresh rate, in Hz, of the video mode. + */ + int refreshRate; +} GLFWvidmode; + +/*! @brief Gamma ramp. + * + * This describes the gamma ramp for a monitor. + * + * @sa @ref monitor_gamma + * @sa @ref glfwGetGammaRamp + * @sa @ref glfwSetGammaRamp + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef struct GLFWgammaramp +{ + /*! An array of value describing the response of the red channel. + */ + unsigned short* red; + /*! An array of value describing the response of the green channel. + */ + unsigned short* green; + /*! An array of value describing the response of the blue channel. + */ + unsigned short* blue; + /*! The number of elements in each array. + */ + unsigned int size; +} GLFWgammaramp; + +/*! @brief Image data. + * + * This describes a single 2D image. See the documentation for each related + * function what the expected pixel format is. + * + * @sa @ref cursor_custom + * @sa @ref window_icon + * + * @since Added in version 2.1. + * @glfw3 Removed format and bytes-per-pixel members. + * + * @ingroup window + */ +typedef struct GLFWimage +{ + /*! The width, in pixels, of this image. + */ + int width; + /*! The height, in pixels, of this image. + */ + int height; + /*! The pixel data of this image, arranged left-to-right, top-to-bottom. + */ + unsigned char* pixels; +} GLFWimage; + +/*! @brief Gamepad input state + * + * This describes the input state of a gamepad. + * + * @sa @ref gamepad + * @sa @ref glfwGetGamepadState + * + * @since Added in version 3.3. + * + * @ingroup input + */ +typedef struct GLFWgamepadstate +{ + /*! The states of each [gamepad button](@ref gamepad_buttons), `GLFW_PRESS` + * or `GLFW_RELEASE`. + */ + unsigned char buttons[15]; + /*! The states of each [gamepad axis](@ref gamepad_axes), in the range -1.0 + * to 1.0 inclusive. + */ + float axes[6]; +} GLFWgamepadstate; + + +/************************************************************************* + * GLFW API functions + *************************************************************************/ + +/*! @brief Initializes the GLFW library. + * + * This function initializes the GLFW library. Before most GLFW functions can + * be used, GLFW must be initialized, and before an application terminates GLFW + * should be terminated in order to free any resources allocated during or + * after initialization. + * + * If this function fails, it calls @ref glfwTerminate before returning. If it + * succeeds, you should call @ref glfwTerminate before the application exits. + * + * Additional calls to this function after successful initialization but before + * termination will return `GLFW_TRUE` immediately. + * + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * + * @remark @macos This function will change the current directory of the + * application to the `Contents/Resources` subdirectory of the application's + * bundle, if present. This can be disabled with the @ref + * GLFW_COCOA_CHDIR_RESOURCES init hint. + * + * @remark @x11 This function will set the `LC_CTYPE` category of the + * application locale according to the current environment if that category is + * still "C". This is because the "C" locale breaks Unicode text input. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref intro_init + * @sa @ref glfwTerminate + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI int glfwInit(void); + +/*! @brief Terminates the GLFW library. + * + * This function destroys all remaining windows and cursors, restores any + * modified gamma ramps and frees any other allocated resources. Once this + * function is called, you must again call @ref glfwInit successfully before + * you will be able to use most GLFW functions. + * + * If GLFW has been successfully initialized, this function should be called + * before the application exits. If initialization fails, there is no need to + * call this function, as it is called by @ref glfwInit before it returns + * failure. + * + * This function has no effect if GLFW is not initialized. + * + * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * + * @remark This function may be called before @ref glfwInit. + * + * @warning The contexts of any remaining windows must not be current on any + * other thread when this function is called. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref intro_init + * @sa @ref glfwInit + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI void glfwTerminate(void); + +/*! @brief Sets the specified init hint to the desired value. + * + * This function sets hints for the next initialization of GLFW. + * + * The values you set hints to are never reset by GLFW, but they only take + * effect during initialization. Once GLFW has been initialized, any values + * you set will be ignored until the library is terminated and initialized + * again. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [init hint](@ref init_hints) to set. + * @param[in] value The new value of the init hint. + * + * @errors Possible errors include @ref GLFW_INVALID_ENUM and @ref + * GLFW_INVALID_VALUE. + * + * @remarks This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa init_hints + * @sa glfwInit + * + * @since Added in version 3.3. + * + * @ingroup init + */ +GLFWAPI void glfwInitHint(int hint, int value); + +/*! @brief Retrieves the version of the GLFW library. + * + * This function retrieves the major, minor and revision numbers of the GLFW + * library. It is intended for when you are using GLFW as a shared library and + * want to ensure that you are using the minimum required version. + * + * Any or all of the version arguments may be `NULL`. + * + * @param[out] major Where to store the major version number, or `NULL`. + * @param[out] minor Where to store the minor version number, or `NULL`. + * @param[out] rev Where to store the revision number, or `NULL`. + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref intro_version + * @sa @ref glfwGetVersionString + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); + +/*! @brief Returns a string describing the compile-time configuration. + * + * This function returns the compile-time generated + * [version string](@ref intro_version_string) of the GLFW library binary. It + * describes the version, platform, compiler and any platform-specific + * compile-time options. It should not be confused with the OpenGL or OpenGL + * ES version string, queried with `glGetString`. + * + * __Do not use the version string__ to parse the GLFW library version. The + * @ref glfwGetVersion function provides the version of the running library + * binary in numerical format. + * + * @return The ASCII encoded GLFW version string. + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @pointer_lifetime The returned string is static and compile-time generated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref intro_version + * @sa @ref glfwGetVersion + * + * @since Added in version 3.0. + * + * @ingroup init + */ +GLFWAPI const char* glfwGetVersionString(void); + +/*! @brief Returns and clears the last error for the calling thread. + * + * This function returns and clears the [error code](@ref errors) of the last + * error that occurred on the calling thread, and optionally a UTF-8 encoded + * human-readable description of it. If no error has occurred since the last + * call, it returns @ref GLFW_NO_ERROR (zero) and the description pointer is + * set to `NULL`. + * + * @param[in] description Where to store the error description pointer, or `NULL`. + * @return The last error code for the calling thread, or @ref GLFW_NO_ERROR + * (zero). + * + * @errors None. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * next error occurs or the library is terminated. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref error_handling + * @sa @ref glfwSetErrorCallback + * + * @since Added in version 3.3. + * + * @ingroup init + */ +GLFWAPI int glfwGetError(const char** description); + +/*! @brief Sets the error callback. + * + * This function sets the error callback, which is called with an error code + * and a human-readable description each time a GLFW error occurs. + * + * The error code is set before the callback is called. Calling @ref + * glfwGetError from the error callback will return the same value as the error + * code argument. + * + * The error callback is called on the thread where the error occurred. If you + * are using GLFW from multiple threads, your error callback needs to be + * written accordingly. + * + * Because the description string may have been generated specifically for that + * error, it is not guaranteed to be valid after the callback has returned. If + * you wish to use it after the callback returns, you need to make a copy. + * + * Once set, the error callback remains set even after the library has been + * terminated. + * + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set. + * + * @callback_signature + * @code + * void callback_name(int error_code, const char* description) + * @endcode + * For more information about the callback parameters, see the + * [callback pointer type](@ref GLFWerrorfun). + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref error_handling + * @sa @ref glfwGetError + * + * @since Added in version 3.0. + * + * @ingroup init + */ +GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun callback); + +/*! @brief Returns the currently connected monitors. + * + * This function returns an array of handles for all currently connected + * monitors. The primary monitor is always first in the returned array. If no + * monitors were found, this function returns `NULL`. + * + * @param[out] count Where to store the number of monitors in the returned + * array. This is set to zero if an error occurred. + * @return An array of monitor handles, or `NULL` if no monitors were found or + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * monitor configuration changes or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_monitors + * @sa @ref monitor_event + * @sa @ref glfwGetPrimaryMonitor + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitor** glfwGetMonitors(int* count); + +/*! @brief Returns the primary monitor. + * + * This function returns the primary monitor. This is usually the monitor + * where elements like the task bar or global menu bar are located. + * + * @return The primary monitor, or `NULL` if no monitors were found or if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @remark The primary monitor is always first in the array returned by @ref + * glfwGetMonitors. + * + * @sa @ref monitor_monitors + * @sa @ref glfwGetMonitors + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void); + +/*! @brief Returns the position of the monitor's viewport on the virtual screen. + * + * This function returns the position, in screen coordinates, of the upper-left + * corner of the specified monitor. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. + * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); + +/*! @brief Retrieves the work area of the monitor. + * + * This function returns the position, in screen coordinates, of the upper-left + * corner of the work area of the specified monitor along with the work area + * size in screen coordinates. The work area is defined as the area of the + * monitor not occluded by the operating system task bar where present. If no + * task bar exists then the work area is the monitor resolution in screen + * coordinates. + * + * Any or all of the position and size arguments may be `NULL`. If an error + * occurs, all non-`NULL` position and size arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. + * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. + * @param[out] width Where to store the monitor width, or `NULL`. + * @param[out] height Where to store the monitor height, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_workarea + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height); + +/*! @brief Returns the physical size of the monitor. + * + * This function returns the size, in millimetres, of the display area of the + * specified monitor. + * + * Some systems do not provide accurate monitor size information, either + * because the monitor + * [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data) + * data is incorrect or because the driver does not report it accurately. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] widthMM Where to store the width, in millimetres, of the + * monitor's display area, or `NULL`. + * @param[out] heightMM Where to store the height, in millimetres, of the + * monitor's display area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @win32 On Windows 8 and earlier the physical size is calculated from + * the current resolution and system DPI instead of querying the monitor EDID data. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM); + +/*! @brief Retrieves the content scale for the specified monitor. + * + * This function retrieves the content scale for the specified monitor. The + * content scale is the ratio between the current DPI and the platform's + * default DPI. This is especially important for text and any UI elements. If + * the pixel dimensions of your UI scaled by this look appropriate on your + * machine then it should appear at a reasonable size on other machines + * regardless of their DPI and scaling settings. This relies on the system DPI + * and scaling settings being somewhat correct. + * + * The content scale may depend on both the monitor resolution and pixel + * density and on user settings. It may be very different from the raw DPI + * calculated from the physical size and current resolution. + * + * @param[in] monitor The monitor to query. + * @param[out] xscale Where to store the x-axis content scale, or `NULL`. + * @param[out] yscale Where to store the y-axis content scale, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_scale + * @sa @ref glfwGetWindowContentScale + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorContentScale(GLFWmonitor* monitor, float* xscale, float* yscale); + +/*! @brief Returns the name of the specified monitor. + * + * This function returns a human-readable name, encoded as UTF-8, of the + * specified monitor. The name typically reflects the make and model of the + * monitor and is not guaranteed to be unique among the connected monitors. + * + * @param[in] monitor The monitor to query. + * @return The UTF-8 encoded name of the monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); + +/*! @brief Sets the user pointer of the specified monitor. + * + * This function sets the user-defined pointer of the specified monitor. The + * current value is retained until the monitor is disconnected. The initial + * value is `NULL`. + * + * This function may be called from the monitor callback, even for a monitor + * that is being disconnected. + * + * @param[in] monitor The monitor whose pointer to set. + * @param[in] pointer The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref monitor_userptr + * @sa @ref glfwGetMonitorUserPointer + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetMonitorUserPointer(GLFWmonitor* monitor, void* pointer); + +/*! @brief Returns the user pointer of the specified monitor. + * + * This function returns the current value of the user-defined pointer of the + * specified monitor. The initial value is `NULL`. + * + * This function may be called from the monitor callback, even for a monitor + * that is being disconnected. + * + * @param[in] monitor The monitor whose pointer to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref monitor_userptr + * @sa @ref glfwSetMonitorUserPointer + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void* glfwGetMonitorUserPointer(GLFWmonitor* monitor); + +/*! @brief Sets the monitor configuration callback. + * + * This function sets the monitor configuration callback, or removes the + * currently set callback. This is called when a monitor is connected to or + * disconnected from the system. + * + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWmonitor* monitor, int event) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWmonitorfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_event + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun callback); + +/*! @brief Returns the available video modes for the specified monitor. + * + * This function returns an array of all video modes supported by the specified + * monitor. The returned array is sorted in ascending order, first by color + * bit depth (the sum of all channel depths), then by resolution area (the + * product of width and height), then resolution width and finally by refresh + * rate. + * + * @param[in] monitor The monitor to query. + * @param[out] count Where to store the number of video modes in the returned + * array. This is set to zero if an error occurred. + * @return An array of video modes, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected, this function is called again for that monitor or the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoMode + * + * @since Added in version 1.0. + * @glfw3 Changed to return an array of modes for a specific monitor. + * + * @ingroup monitor + */ +GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count); + +/*! @brief Returns the current mode of the specified monitor. + * + * This function returns the current video mode of the specified monitor. If + * you have created a full screen window for that monitor, the return value + * will depend on whether that window is iconified. + * + * @param[in] monitor The monitor to query. + * @return The current mode of the monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified monitor is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoModes + * + * @since Added in version 3.0. Replaces `glfwGetDesktopMode`. + * + * @ingroup monitor + */ +GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); + +/*! @brief Generates a gamma ramp and sets it for the specified monitor. + * + * This function generates an appropriately sized gamma ramp from the specified + * exponent and then calls @ref glfwSetGammaRamp with it. The value must be + * a finite number greater than zero. + * + * The software controlled gamma ramp is applied _in addition_ to the hardware + * gamma correction, which today is usually an approximation of sRGB gamma. + * This means that setting a perfectly linear ramp, or gamma 1.0, will produce + * the default (usually sRGB-like) behavior. + * + * For gamma correct rendering with OpenGL or OpenGL ES, see the @ref + * GLFW_SRGB_CAPABLE hint. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] gamma The desired exponent. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma); + +/*! @brief Returns the current gamma ramp for the specified monitor. + * + * This function returns the current gamma ramp of the specified monitor. + * + * @param[in] monitor The monitor to query. + * @return The current gamma ramp, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR while + * returning `NULL`. + * + * @pointer_lifetime The returned structure and its arrays are allocated and + * freed by GLFW. You should not free them yourself. They are valid until the + * specified monitor is disconnected, this function is called again for that + * monitor or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); + +/*! @brief Sets the current gamma ramp for the specified monitor. + * + * This function sets the current gamma ramp for the specified monitor. The + * original gamma ramp for that monitor is saved by GLFW the first time this + * function is called and is restored by @ref glfwTerminate. + * + * The software controlled gamma ramp is applied _in addition_ to the hardware + * gamma correction, which today is usually an approximation of sRGB gamma. + * This means that setting a perfectly linear ramp, or gamma 1.0, will produce + * the default (usually sRGB-like) behavior. + * + * For gamma correct rendering with OpenGL or OpenGL ES, see the @ref + * GLFW_SRGB_CAPABLE hint. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] ramp The gamma ramp to use. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark The size of the specified gamma ramp should match the size of the + * current ramp for that monitor. + * + * @remark @win32 The gamma ramp size must be 256. + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified gamma ramp is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp); + +/*! @brief Resets all window hints to their default values. + * + * This function resets all window hints to their + * [default values](@ref window_hints_values). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHint + * @sa @ref glfwWindowHintString + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwDefaultWindowHints(void); + +/*! @brief Sets the specified window hint to the desired value. + * + * This function sets hints for the next call to @ref glfwCreateWindow. The + * hints, once set, retain their values until changed by a call to this + * function or @ref glfwDefaultWindowHints, or until the library is terminated. + * + * Only integer value hints can be set with this function. String value hints + * are set with @ref glfwWindowHintString. + * + * This function does not check whether the specified hint values are valid. + * If you set hints to invalid values this will instead be reported by the next + * call to @ref glfwCreateWindow. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [window hint](@ref window_hints) to set. + * @param[in] value The new value of the window hint. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHintString + * @sa @ref glfwDefaultWindowHints + * + * @since Added in version 3.0. Replaces `glfwOpenWindowHint`. + * + * @ingroup window + */ +GLFWAPI void glfwWindowHint(int hint, int value); + +/*! @brief Sets the specified window hint to the desired value. + * + * This function sets hints for the next call to @ref glfwCreateWindow. The + * hints, once set, retain their values until changed by a call to this + * function or @ref glfwDefaultWindowHints, or until the library is terminated. + * + * Only string type hints can be set with this function. Integer value hints + * are set with @ref glfwWindowHint. + * + * This function does not check whether the specified hint values are valid. + * If you set hints to invalid values this will instead be reported by the next + * call to @ref glfwCreateWindow. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [window hint](@ref window_hints) to set. + * @param[in] value The new value of the window hint. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHint + * @sa @ref glfwDefaultWindowHints + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwWindowHintString(int hint, const char* value); + +/*! @brief Creates a window and its associated context. + * + * This function creates a window and its associated OpenGL or OpenGL ES + * context. Most of the options controlling how the window and its context + * should be created are specified with [window hints](@ref window_hints). + * + * Successful creation does not change which context is current. Before you + * can use the newly created context, you need to + * [make it current](@ref context_current). For information about the `share` + * parameter, see @ref context_sharing. + * + * The created window, framebuffer and context may differ from what you + * requested, as not all parameters and hints are + * [hard constraints](@ref window_hints_hard). This includes the size of the + * window, especially for full screen windows. To query the actual attributes + * of the created window, framebuffer and context, see @ref + * glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize. + * + * To create a full screen window, you need to specify the monitor the window + * will cover. If no monitor is specified, the window will be windowed mode. + * Unless you have a way for the user to choose a specific monitor, it is + * recommended that you pick the primary monitor. For more information on how + * to query connected monitors, see @ref monitor_monitors. + * + * For full screen windows, the specified size becomes the resolution of the + * window's _desired video mode_. As long as a full screen window is not + * iconified, the supported video mode most closely matching the desired video + * mode is set for the specified monitor. For more information about full + * screen windows, including the creation of so called _windowed full screen_ + * or _borderless full screen_ windows, see @ref window_windowed_full_screen. + * + * Once you have created the window, you can switch it between windowed and + * full screen mode with @ref glfwSetWindowMonitor. This will not affect its + * OpenGL or OpenGL ES context. + * + * By default, newly created windows use the placement recommended by the + * window system. To create the window at a specific position, make it + * initially invisible using the [GLFW_VISIBLE](@ref GLFW_VISIBLE_hint) window + * hint, set its [position](@ref window_pos) and then [show](@ref window_hide) + * it. + * + * As long as at least one full screen window is not iconified, the screensaver + * is prohibited from starting. + * + * Window systems put limits on window sizes. Very large or very small window + * dimensions may be overridden by the window system on creation. Check the + * actual [size](@ref window_size) after creation. + * + * The [swap interval](@ref buffer_swap) is not set during window creation and + * the initial value may vary depending on driver settings and defaults. + * + * @param[in] width The desired width, in screen coordinates, of the window. + * This must be greater than zero. + * @param[in] height The desired height, in screen coordinates, of the window. + * This must be greater than zero. + * @param[in] title The initial, UTF-8 encoded window title. + * @param[in] monitor The monitor to use for full screen mode, or `NULL` for + * windowed mode. + * @param[in] share The window whose context to share resources with, or `NULL` + * to not share resources. + * @return The handle of the created window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_API_UNAVAILABLE, @ref + * GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @win32 Window creation will fail if the Microsoft GDI software + * OpenGL implementation is the only one available. + * + * @remark @win32 If the executable has an icon resource named `GLFW_ICON,` it + * will be set as the initial icon for the window. If no such icon is present, + * the `IDI_APPLICATION` icon will be used instead. To set a different icon, + * see @ref glfwSetWindowIcon. + * + * @remark @win32 The context to share resources with must not be current on + * any other thread. + * + * @remark @macos The OS only supports forward-compatible core profile contexts + * for OpenGL versions 3.2 and later. Before creating an OpenGL context of + * version 3.2 or later you must set the + * [GLFW_OPENGL_FORWARD_COMPAT](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) and + * [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) hints accordingly. + * OpenGL 3.0 and 3.1 contexts are not supported at all on macOS. + * + * @remark @macos The GLFW window has no icon, as it is not a document + * window, but the dock icon will be the same as the application bundle's icon. + * For more information on bundles, see the + * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) + * in the Mac Developer Library. + * + * @remark @macos The first time a window is created the menu bar is created. + * If GLFW finds a `MainMenu.nib` it is loaded and assumed to contain a menu + * bar. Otherwise a minimal menu bar is created manually with common commands + * like Hide, Quit and About. The About entry opens a minimal about dialog + * with information from the application's bundle. Menu bar creation can be + * disabled entirely with the @ref GLFW_COCOA_MENUBAR init hint. + * + * @remark @macos On OS X 10.10 and later the window frame will not be rendered + * at full resolution on Retina displays unless the + * [GLFW_COCOA_RETINA_FRAMEBUFFER](@ref GLFW_COCOA_RETINA_FRAMEBUFFER_hint) + * hint is `GLFW_TRUE` and the `NSHighResolutionCapable` key is enabled in the + * application bundle's `Info.plist`. For more information, see + * [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html) + * in the Mac Developer Library. The GLFW test and example programs use + * a custom `Info.plist` template for this, which can be found as + * `CMake/MacOSXBundleInfo.plist.in` in the source tree. + * + * @remark @macos When activating frame autosaving with + * [GLFW_COCOA_FRAME_NAME](@ref GLFW_COCOA_FRAME_NAME_hint), the specified + * window size and position may be overridden by previously saved values. + * + * @remark @x11 Some window managers will not respect the placement of + * initially hidden windows. + * + * @remark @x11 Due to the asynchronous nature of X11, it may take a moment for + * a window to reach its requested state. This means you may not be able to + * query the final size, position or other attributes directly after window + * creation. + * + * @remark @x11 The class part of the `WM_CLASS` window property will by + * default be set to the window title passed to this function. The instance + * part will use the contents of the `RESOURCE_NAME` environment variable, if + * present and not empty, or fall back to the window title. Set the + * [GLFW_X11_CLASS_NAME](@ref GLFW_X11_CLASS_NAME_hint) and + * [GLFW_X11_INSTANCE_NAME](@ref GLFW_X11_INSTANCE_NAME_hint) window hints to + * override this. + * + * @remark @wayland Compositors should implement the xdg-decoration protocol + * for GLFW to decorate the window properly. If this protocol isn't + * supported, or if the compositor prefers client-side decorations, a very + * simple fallback frame will be drawn using the wp_viewporter protocol. A + * compositor can still emit close, maximize or fullscreen events, using for + * instance a keybind mechanism. If neither of these protocols is supported, + * the window won't be decorated. + * + * @remark @wayland A full screen window will not attempt to change the mode, + * no matter what the requested size or refresh rate. + * + * @remark @wayland Screensaver inhibition requires the idle-inhibit protocol + * to be implemented in the user's compositor. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_creation + * @sa @ref glfwDestroyWindow + * + * @since Added in version 3.0. Replaces `glfwOpenWindow`. + * + * @ingroup window + */ +GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share); + +/*! @brief Destroys the specified window and its context. + * + * This function destroys the specified window and its context. On calling + * this function, no further callbacks will be called for that window. + * + * If the context of the specified window is current on the main thread, it is + * detached before being destroyed. + * + * @param[in] window The window to destroy. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @note The context of the specified window must not be current on any other + * thread when this function is called. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_creation + * @sa @ref glfwCreateWindow + * + * @since Added in version 3.0. Replaces `glfwCloseWindow`. + * + * @ingroup window + */ +GLFWAPI void glfwDestroyWindow(GLFWwindow* window); + +/*! @brief Checks the close flag of the specified window. + * + * This function returns the value of the close flag of the specified window. + * + * @param[in] window The window to query. + * @return The value of the close flag. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_close + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); + +/*! @brief Sets the close flag of the specified window. + * + * This function sets the value of the close flag of the specified window. + * This can be used to override the user's attempt to close the window, or + * to signal that it should be closed. + * + * @param[in] window The window whose flag to change. + * @param[in] value The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_close + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); + +/*! @brief Sets the title of the specified window. + * + * This function sets the window title, encoded as UTF-8, of the specified + * window. + * + * @param[in] window The window whose title to change. + * @param[in] title The UTF-8 encoded window title. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @macos The window title will not be updated until the next time you + * process events. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_title + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); + +/*! @brief Sets the icon for the specified window. + * + * This function sets the icon of the specified window. If passed an array of + * candidate images, those of or closest to the sizes desired by the system are + * selected. If no images are specified, the window reverts to its default + * icon. + * + * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight + * bits per channel with the red channel first. They are arranged canonically + * as packed sequential rows, starting from the top-left corner. + * + * The desired image sizes varies depending on platform and system settings. + * The selected images will be rescaled as needed. Good sizes include 16x16, + * 32x32 and 48x48. + * + * @param[in] window The window whose icon to set. + * @param[in] count The number of images in the specified array, or zero to + * revert to the default window icon. + * @param[in] images The images to create the icon from. This is ignored if + * count is zero. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @remark @macos The GLFW window has no icon, as it is not a document + * window, so this function does nothing. The dock icon will be the same as + * the application bundle's icon. For more information on bundles, see the + * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) + * in the Mac Developer Library. + * + * @remark @wayland There is no existing protocol to change an icon, the + * window will thus inherit the one defined in the application's desktop file. + * This function always emits @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_icon + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images); + +/*! @brief Retrieves the position of the content area of the specified window. + * + * This function retrieves the position, in screen coordinates, of the + * upper-left corner of the content area of the specified window. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] window The window to query. + * @param[out] xpos Where to store the x-coordinate of the upper-left corner of + * the content area, or `NULL`. + * @param[out] ypos Where to store the y-coordinate of the upper-left corner of + * the content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland There is no way for an application to retrieve the global + * position of its windows, this function will always emit @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * @sa @ref glfwSetWindowPos + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); + +/*! @brief Sets the position of the content area of the specified window. + * + * This function sets the position, in screen coordinates, of the upper-left + * corner of the content area of the specified windowed mode window. If the + * window is a full screen window, this function does nothing. + * + * __Do not use this function__ to move an already visible window unless you + * have very good reasons for doing so, as it will confuse and annoy the user. + * + * The window manager may put limits on what positions are allowed. GLFW + * cannot and should not override these limits. + * + * @param[in] window The window to query. + * @param[in] xpos The x-coordinate of the upper-left corner of the content area. + * @param[in] ypos The y-coordinate of the upper-left corner of the content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland There is no way for an application to set the global + * position of its windows, this function will always emit @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * @sa @ref glfwGetWindowPos + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); + +/*! @brief Retrieves the size of the content area of the specified window. + * + * This function retrieves the size, in screen coordinates, of the content area + * of the specified window. If you wish to retrieve the size of the + * framebuffer of the window in pixels, see @ref glfwGetFramebufferSize. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose size to retrieve. + * @param[out] width Where to store the width, in screen coordinates, of the + * content area, or `NULL`. + * @param[out] height Where to store the height, in screen coordinates, of the + * content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * @sa @ref glfwSetWindowSize + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Sets the size limits of the specified window. + * + * This function sets the size limits of the content area of the specified + * window. If the window is full screen, the size limits only take effect + * once it is made windowed. If the window is not resizable, this function + * does nothing. + * + * The size limits are applied immediately to a windowed mode window and may + * cause it to be resized. + * + * The maximum dimensions must be greater than or equal to the minimum + * dimensions and all must be greater than or equal to zero. + * + * @param[in] window The window to set limits for. + * @param[in] minwidth The minimum width, in screen coordinates, of the content + * area, or `GLFW_DONT_CARE`. + * @param[in] minheight The minimum height, in screen coordinates, of the + * content area, or `GLFW_DONT_CARE`. + * @param[in] maxwidth The maximum width, in screen coordinates, of the content + * area, or `GLFW_DONT_CARE`. + * @param[in] maxheight The maximum height, in screen coordinates, of the + * content area, or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @remark @wayland The size limits will not be applied until the window is + * actually resized, either by the user or by the compositor. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa @ref glfwSetWindowAspectRatio + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight); + +/*! @brief Sets the aspect ratio of the specified window. + * + * This function sets the required aspect ratio of the content area of the + * specified window. If the window is full screen, the aspect ratio only takes + * effect once it is made windowed. If the window is not resizable, this + * function does nothing. + * + * The aspect ratio is specified as a numerator and a denominator and both + * values must be greater than zero. For example, the common 16:9 aspect ratio + * is specified as 16 and 9, respectively. + * + * If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect + * ratio limit is disabled. + * + * The aspect ratio is applied immediately to a windowed mode window and may + * cause it to be resized. + * + * @param[in] window The window to set limits for. + * @param[in] numer The numerator of the desired aspect ratio, or + * `GLFW_DONT_CARE`. + * @param[in] denom The denominator of the desired aspect ratio, or + * `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @remark @wayland The aspect ratio will not be applied until the window is + * actually resized, either by the user or by the compositor. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa @ref glfwSetWindowSizeLimits + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom); + +/*! @brief Sets the size of the content area of the specified window. + * + * This function sets the size, in screen coordinates, of the content area of + * the specified window. + * + * For full screen windows, this function updates the resolution of its desired + * video mode and switches to the video mode closest to it, without affecting + * the window's context. As the context is unaffected, the bit depths of the + * framebuffer remain unchanged. + * + * If you wish to update the refresh rate of the desired video mode in addition + * to its resolution, see @ref glfwSetWindowMonitor. + * + * The window manager may put limits on what sizes are allowed. GLFW cannot + * and should not override these limits. + * + * @param[in] window The window to resize. + * @param[in] width The desired width, in screen coordinates, of the window + * content area. + * @param[in] height The desired height, in screen coordinates, of the window + * content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland A full screen window will not attempt to change the mode, + * no matter what the requested size. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * @sa @ref glfwGetWindowSize + * @sa @ref glfwSetWindowMonitor + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height); + +/*! @brief Retrieves the size of the framebuffer of the specified window. + * + * This function retrieves the size, in pixels, of the framebuffer of the + * specified window. If you wish to retrieve the size of the window in screen + * coordinates, see @ref glfwGetWindowSize. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose framebuffer to query. + * @param[out] width Where to store the width, in pixels, of the framebuffer, + * or `NULL`. + * @param[out] height Where to store the height, in pixels, of the framebuffer, + * or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_fbsize + * @sa @ref glfwSetFramebufferSizeCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Retrieves the size of the frame of the window. + * + * This function retrieves the size, in screen coordinates, of each edge of the + * frame of the specified window. This size includes the title bar, if the + * window has one. The size of the frame may vary depending on the + * [window-related hints](@ref window_hints_wnd) used to create it. + * + * Because this function retrieves the size of each window frame edge and not + * the offset along a particular coordinate axis, the retrieved values will + * always be zero or positive. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose frame size to query. + * @param[out] left Where to store the size, in screen coordinates, of the left + * edge of the window frame, or `NULL`. + * @param[out] top Where to store the size, in screen coordinates, of the top + * edge of the window frame, or `NULL`. + * @param[out] right Where to store the size, in screen coordinates, of the + * right edge of the window frame, or `NULL`. + * @param[out] bottom Where to store the size, in screen coordinates, of the + * bottom edge of the window frame, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in version 3.1. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom); + +/*! @brief Retrieves the content scale for the specified window. + * + * This function retrieves the content scale for the specified window. The + * content scale is the ratio between the current DPI and the platform's + * default DPI. This is especially important for text and any UI elements. If + * the pixel dimensions of your UI scaled by this look appropriate on your + * machine then it should appear at a reasonable size on other machines + * regardless of their DPI and scaling settings. This relies on the system DPI + * and scaling settings being somewhat correct. + * + * On systems where each monitors can have its own content scale, the window + * content scale will depend on which monitor the system considers the window + * to be on. + * + * @param[in] window The window to query. + * @param[out] xscale Where to store the x-axis content scale, or `NULL`. + * @param[out] yscale Where to store the y-axis content scale, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_scale + * @sa @ref glfwSetWindowContentScaleCallback + * @sa @ref glfwGetMonitorContentScale + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowContentScale(GLFWwindow* window, float* xscale, float* yscale); + +/*! @brief Returns the opacity of the whole window. + * + * This function returns the opacity of the window, including any decorations. + * + * The opacity (or alpha) value is a positive finite number between zero and + * one, where zero is fully transparent and one is fully opaque. If the system + * does not support whole window transparency, this function always returns one. + * + * The initial opacity value for newly created windows is one. + * + * @param[in] window The window to query. + * @return The opacity value of the specified window. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_transparency + * @sa @ref glfwSetWindowOpacity + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI float glfwGetWindowOpacity(GLFWwindow* window); + +/*! @brief Sets the opacity of the whole window. + * + * This function sets the opacity of the window, including any decorations. + * + * The opacity (or alpha) value is a positive finite number between zero and + * one, where zero is fully transparent and one is fully opaque. + * + * The initial opacity value for newly created windows is one. + * + * A window created with framebuffer transparency may not use whole window + * transparency. The results of doing this are undefined. + * + * @param[in] window The window to set the opacity for. + * @param[in] opacity The desired opacity of the specified window. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_transparency + * @sa @ref glfwGetWindowOpacity + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowOpacity(GLFWwindow* window, float opacity); + +/*! @brief Iconifies the specified window. + * + * This function iconifies (minimizes) the specified window if it was + * previously restored. If the window is already iconified, this function does + * nothing. + * + * If the specified window is a full screen window, GLFW restores the original + * video mode of the monitor. The window's desired video mode is set again + * when the window is restored. + * + * @param[in] window The window to iconify. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwRestoreWindow + * @sa @ref glfwMaximizeWindow + * + * @since Added in version 2.1. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwIconifyWindow(GLFWwindow* window); + +/*! @brief Restores the specified window. + * + * This function restores the specified window if it was previously iconified + * (minimized) or maximized. If the window is already restored, this function + * does nothing. + * + * If the specified window is an iconified full screen window, its desired + * video mode is set again for its monitor when the window is restored. + * + * @param[in] window The window to restore. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwIconifyWindow + * @sa @ref glfwMaximizeWindow + * + * @since Added in version 2.1. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwRestoreWindow(GLFWwindow* window); + +/*! @brief Maximizes the specified window. + * + * This function maximizes the specified window if it was previously not + * maximized. If the window is already maximized, this function does nothing. + * + * If the specified window is a full screen window, this function does nothing. + * + * @param[in] window The window to maximize. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwIconifyWindow + * @sa @ref glfwRestoreWindow + * + * @since Added in GLFW 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwMaximizeWindow(GLFWwindow* window); + +/*! @brief Makes the specified window visible. + * + * This function makes the specified window visible if it was previously + * hidden. If the window is already visible or is in full screen mode, this + * function does nothing. + * + * By default, windowed mode windows are focused when shown + * Set the [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) window hint + * to change this behavior for all newly created windows, or change the + * behavior for an existing window with @ref glfwSetWindowAttrib. + * + * @param[in] window The window to make visible. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland Because Wayland wants every frame of the desktop to be + * complete, this function does not immediately make the window visible. + * Instead it will become visible the next time the window framebuffer is + * updated after this call. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hide + * @sa @ref glfwHideWindow + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwShowWindow(GLFWwindow* window); + +/*! @brief Hides the specified window. + * + * This function hides the specified window if it was previously visible. If + * the window is already hidden or is in full screen mode, this function does + * nothing. + * + * @param[in] window The window to hide. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hide + * @sa @ref glfwShowWindow + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwHideWindow(GLFWwindow* window); + +/*! @brief Brings the specified window to front and sets input focus. + * + * This function brings the specified window to front and sets input focus. + * The window should already be visible and not iconified. + * + * By default, both windowed and full screen mode windows are focused when + * initially created. Set the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) to + * disable this behavior. + * + * Also by default, windowed mode windows are focused when shown + * with @ref glfwShowWindow. Set the + * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) to disable this behavior. + * + * __Do not use this function__ to steal focus from other applications unless + * you are certain that is what the user wants. Focus stealing can be + * extremely disruptive. + * + * For a less disruptive way of getting the user's attention, see + * [attention requests](@ref window_attention). + * + * @param[in] window The window to give input focus. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland It is not possible for an application to bring its windows + * to front, this function will always emit @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_focus + * @sa @ref window_attention + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwFocusWindow(GLFWwindow* window); + +/*! @brief Requests user attention to the specified window. + * + * This function requests user attention to the specified window. On + * platforms where this is not supported, attention is requested to the + * application as a whole. + * + * Once the user has given attention, usually by focusing the window or + * application, the system will end the request automatically. + * + * @param[in] window The window to request attention to. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @macos Attention is requested to the application as a whole, not the + * specific window. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attention + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwRequestWindowAttention(GLFWwindow* window); + +/*! @brief Returns the monitor that the window uses for full screen mode. + * + * This function returns the handle of the monitor that the specified window is + * in full screen on. + * + * @param[in] window The window to query. + * @return The monitor, or `NULL` if the window is in windowed mode or an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_monitor + * @sa @ref glfwSetWindowMonitor + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); + +/*! @brief Sets the mode, monitor, video mode and placement of a window. + * + * This function sets the monitor that the window uses for full screen mode or, + * if the monitor is `NULL`, makes it windowed mode. + * + * When setting a monitor, this function updates the width, height and refresh + * rate of the desired video mode and switches to the video mode closest to it. + * The window position is ignored when setting a monitor. + * + * When the monitor is `NULL`, the position, width and height are used to + * place the window content area. The refresh rate is ignored when no monitor + * is specified. + * + * If you only wish to update the resolution of a full screen window or the + * size of a windowed mode window, see @ref glfwSetWindowSize. + * + * When a window transitions from full screen to windowed mode, this function + * restores any previous window settings such as whether it is decorated, + * floating, resizable, has size or aspect ratio limits, etc. + * + * @param[in] window The window whose monitor, size or video mode to set. + * @param[in] monitor The desired monitor, or `NULL` to set windowed mode. + * @param[in] xpos The desired x-coordinate of the upper-left corner of the + * content area. + * @param[in] ypos The desired y-coordinate of the upper-left corner of the + * content area. + * @param[in] width The desired with, in screen coordinates, of the content + * area or video mode. + * @param[in] height The desired height, in screen coordinates, of the content + * area or video mode. + * @param[in] refreshRate The desired refresh rate, in Hz, of the video mode, + * or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark The OpenGL or OpenGL ES context will not be destroyed or otherwise + * affected by any resizing or mode switching, although you may need to update + * your viewport if the framebuffer size has changed. + * + * @remark @wayland The desired window position is ignored, as there is no way + * for an application to set this property. + * + * @remark @wayland Setting the window to full screen will not attempt to + * change the mode, no matter what the requested size or refresh rate. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_monitor + * @sa @ref window_full_screen + * @sa @ref glfwGetWindowMonitor + * @sa @ref glfwSetWindowSize + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate); + +/*! @brief Returns an attribute of the specified window. + * + * This function returns the value of an attribute of the specified window or + * its OpenGL or OpenGL ES context. + * + * @param[in] window The window to query. + * @param[in] attrib The [window attribute](@ref window_attribs) whose value to + * return. + * @return The value of the attribute, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @remark Framebuffer related hints are not window attributes. See @ref + * window_attribs_fb for more information. + * + * @remark Zero is a valid value for many window and context related + * attributes so you cannot use a return value of zero as an indication of + * errors. However, this function should not fail as long as it is passed + * valid arguments and the library has been [initialized](@ref intro_init). + * + * @remark @wayland The Wayland protocol provides no way to check whether a + * window is iconfied, so @ref GLFW_ICONIFIED always returns `GLFW_FALSE`. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attribs + * @sa @ref glfwSetWindowAttrib + * + * @since Added in version 3.0. Replaces `glfwGetWindowParam` and + * `glfwGetGLVersion`. + * + * @ingroup window + */ +GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); + +/*! @brief Sets an attribute of the specified window. + * + * This function sets the value of an attribute of the specified window. + * + * The supported attributes are [GLFW_DECORATED](@ref GLFW_DECORATED_attrib), + * [GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib), + * [GLFW_FLOATING](@ref GLFW_FLOATING_attrib), + * [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) and + * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_attrib). + * + * Some of these attributes are ignored for full screen windows. The new + * value will take effect if the window is later made windowed. + * + * Some of these attributes are ignored for windowed mode windows. The new + * value will take effect if the window is later made full screen. + * + * @param[in] window The window to set the attribute for. + * @param[in] attrib A supported window attribute. + * @param[in] value `GLFW_TRUE` or `GLFW_FALSE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark Calling @ref glfwGetWindowAttrib will always return the latest + * value, even if that value is ignored by the current mode of the window. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attribs + * @sa @ref glfwGetWindowAttrib + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowAttrib(GLFWwindow* window, int attrib, int value); + +/*! @brief Sets the user pointer of the specified window. + * + * This function sets the user-defined pointer of the specified window. The + * current value is retained until the window is destroyed. The initial value + * is `NULL`. + * + * @param[in] window The window whose pointer to set. + * @param[in] pointer The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_userptr + * @sa @ref glfwGetWindowUserPointer + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer); + +/*! @brief Returns the user pointer of the specified window. + * + * This function returns the current value of the user-defined pointer of the + * specified window. The initial value is `NULL`. + * + * @param[in] window The window whose pointer to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_userptr + * @sa @ref glfwSetWindowUserPointer + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); + +/*! @brief Sets the position callback for the specified window. + * + * This function sets the position callback of the specified window, which is + * called when the window is moved. The callback is provided with the + * position, in screen coordinates, of the upper-left corner of the content + * area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int xpos, int ypos) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowposfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @wayland This callback will never be called, as there is no way for + * an application to know its global position. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun callback); + +/*! @brief Sets the size callback for the specified window. + * + * This function sets the size callback of the specified window, which is + * called when the window is resized. The callback is provided with the size, + * in screen coordinates, of the content area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowsizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun callback); + +/*! @brief Sets the close callback for the specified window. + * + * This function sets the close callback of the specified window, which is + * called when the user attempts to close the window, for example by clicking + * the close widget in the title bar. + * + * The close flag is set before this callback is called, but you can modify it + * at any time with @ref glfwSetWindowShouldClose. + * + * The close callback is not triggered by @ref glfwDestroyWindow. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowclosefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @macos Selecting Quit from the application menu will trigger the + * close callback for all windows. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_close + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun callback); + +/*! @brief Sets the refresh callback for the specified window. + * + * This function sets the refresh callback of the specified window, which is + * called when the content area of the window needs to be redrawn, for example + * if the window has been exposed after having been covered by another window. + * + * On compositing window systems such as Aero, Compiz, Aqua or Wayland, where + * the window contents are saved off-screen, this callback may be called only + * very infrequently or never at all. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window); + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowrefreshfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_refresh + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun callback); + +/*! @brief Sets the focus callback for the specified window. + * + * This function sets the focus callback of the specified window, which is + * called when the window gains or loses input focus. + * + * After the focus callback is called for a window that lost input focus, + * synthetic key and mouse button release events will be generated for all such + * that had been pressed. For more information, see @ref glfwSetKeyCallback + * and @ref glfwSetMouseButtonCallback. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int focused) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowfocusfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_focus + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun callback); + +/*! @brief Sets the iconify callback for the specified window. + * + * This function sets the iconification callback of the specified window, which + * is called when the window is iconified or restored. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int iconified) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowiconifyfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @wayland The XDG-shell protocol has no event for iconification, so + * this callback will never be called. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun callback); + +/*! @brief Sets the maximize callback for the specified window. + * + * This function sets the maximization callback of the specified window, which + * is called when the window is maximized or restored. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int maximized) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowmaximizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_maximize + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* window, GLFWwindowmaximizefun callback); + +/*! @brief Sets the framebuffer resize callback for the specified window. + * + * This function sets the framebuffer resize callback of the specified window, + * which is called when the framebuffer of the specified window is resized. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWframebuffersizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_fbsize + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun callback); + +/*! @brief Sets the window content scale callback for the specified window. + * + * This function sets the window content scale callback of the specified window, + * which is called when the content scale of the specified window changes. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, float xscale, float yscale) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowcontentscalefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_scale + * @sa @ref glfwGetWindowContentScale + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI GLFWwindowcontentscalefun glfwSetWindowContentScaleCallback(GLFWwindow* window, GLFWwindowcontentscalefun callback); + +/*! @brief Processes all pending events. + * + * This function processes only those events that are already in the event + * queue and then returns immediately. Processing events will cause the window + * and input callbacks associated with those events to be called. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwWaitEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 1.0. + * + * @ingroup window + */ +GLFWAPI void glfwPollEvents(void); + +/*! @brief Waits until events are queued and processes them. + * + * This function puts the calling thread to sleep until at least one event is + * available in the event queue. Once one or more events are available, + * it behaves exactly like @ref glfwPollEvents, i.e. the events in the queue + * are processed and the function then returns immediately. Processing events + * will cause the window and input callbacks associated with those events to be + * called. + * + * Since not all events are associated with callbacks, this function may return + * without a callback having been called even if you are monitoring all + * callbacks. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwPollEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 2.5. + * + * @ingroup window + */ +GLFWAPI void glfwWaitEvents(void); + +/*! @brief Waits with timeout until events are queued and processes them. + * + * This function puts the calling thread to sleep until at least one event is + * available in the event queue, or until the specified timeout is reached. If + * one or more events are available, it behaves exactly like @ref + * glfwPollEvents, i.e. the events in the queue are processed and the function + * then returns immediately. Processing events will cause the window and input + * callbacks associated with those events to be called. + * + * The timeout value must be a positive finite number. + * + * Since not all events are associated with callbacks, this function may return + * without a callback having been called even if you are monitoring all + * callbacks. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @param[in] timeout The maximum amount of time, in seconds, to wait. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwPollEvents + * @sa @ref glfwWaitEvents + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwWaitEventsTimeout(double timeout); + +/*! @brief Posts an empty event to the event queue. + * + * This function posts an empty event from the current thread to the event + * queue, causing @ref glfwWaitEvents or @ref glfwWaitEventsTimeout to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref events + * @sa @ref glfwWaitEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 3.1. + * + * @ingroup window + */ +GLFWAPI void glfwPostEmptyEvent(void); + +/*! @brief Returns the value of an input option for the specified window. + * + * This function returns the value of an input option for the specified window. + * The mode must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS, + * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or + * @ref GLFW_RAW_MOUSE_MOTION. + * + * @param[in] window The window to query. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`, + * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or + * `GLFW_RAW_MOUSE_MOTION`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref glfwSetInputMode + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); + +/*! @brief Sets an input option for the specified window. + * + * This function sets an input mode option for the specified window. The mode + * must be one of @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS, + * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or + * @ref GLFW_RAW_MOUSE_MOTION. + * + * If the mode is `GLFW_CURSOR`, the value must be one of the following cursor + * modes: + * - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. + * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the + * content area of the window but does not restrict the cursor from leaving. + * - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual + * and unlimited cursor movement. This is useful for implementing for + * example 3D camera controls. + * + * If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to + * enable sticky keys, or `GLFW_FALSE` to disable it. If sticky keys are + * enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS` + * the next time it is called even if the key had been released before the + * call. This is useful when you are only interested in whether keys have been + * pressed but not when or in which order. + * + * If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either + * `GLFW_TRUE` to enable sticky mouse buttons, or `GLFW_FALSE` to disable it. + * If sticky mouse buttons are enabled, a mouse button press will ensure that + * @ref glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even + * if the mouse button had been released before the call. This is useful when + * you are only interested in whether mouse buttons have been pressed but not + * when or in which order. + * + * If the mode is `GLFW_LOCK_KEY_MODS`, the value must be either `GLFW_TRUE` to + * enable lock key modifier bits, or `GLFW_FALSE` to disable them. If enabled, + * callbacks that receive modifier bits will also have the @ref + * GLFW_MOD_CAPS_LOCK bit set when the event was generated with Caps Lock on, + * and the @ref GLFW_MOD_NUM_LOCK bit when Num Lock was on. + * + * If the mode is `GLFW_RAW_MOUSE_MOTION`, the value must be either `GLFW_TRUE` + * to enable raw (unscaled and unaccelerated) mouse motion when the cursor is + * disabled, or `GLFW_FALSE` to disable it. If raw motion is not supported, + * attempting to set this will emit @ref GLFW_PLATFORM_ERROR. Call @ref + * glfwRawMouseMotionSupported to check for support. + * + * @param[in] window The window whose input mode to set. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`, + * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or + * `GLFW_RAW_MOUSE_MOTION`. + * @param[in] value The new value of the specified input mode. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref glfwGetInputMode + * + * @since Added in version 3.0. Replaces `glfwEnable` and `glfwDisable`. + * + * @ingroup input + */ +GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); + +/*! @brief Returns whether raw mouse motion is supported. + * + * This function returns whether raw mouse motion is supported on the current + * system. This status does not change after GLFW has been initialized so you + * only need to check this once. If you attempt to enable raw motion on + * a system that does not support it, @ref GLFW_PLATFORM_ERROR will be emitted. + * + * Raw mouse motion is closer to the actual motion of the mouse across + * a surface. It is not affected by the scaling and acceleration applied to + * the motion of the desktop cursor. That processing is suitable for a cursor + * while raw motion is better for controlling for example a 3D camera. Because + * of this, raw mouse motion is only provided when the cursor is disabled. + * + * @return `GLFW_TRUE` if raw mouse motion is supported on the current machine, + * or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref raw_mouse_motion + * @sa @ref glfwSetInputMode + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwRawMouseMotionSupported(void); + +/*! @brief Returns the layout-specific name of the specified printable key. + * + * This function returns the name of the specified printable key, encoded as + * UTF-8. This is typically the character that key would produce without any + * modifier keys, intended for displaying key bindings to the user. For dead + * keys, it is typically the diacritic it would add to a character. + * + * __Do not use this function__ for [text input](@ref input_char). You will + * break text input for many languages even if it happens to work for yours. + * + * If the key is `GLFW_KEY_UNKNOWN`, the scancode is used to identify the key, + * otherwise the scancode is ignored. If you specify a non-printable key, or + * `GLFW_KEY_UNKNOWN` and a scancode that maps to a non-printable key, this + * function returns `NULL` but does not emit an error. + * + * This behavior allows you to always pass in the arguments in the + * [key callback](@ref input_key) without modification. + * + * The printable keys are: + * - `GLFW_KEY_APOSTROPHE` + * - `GLFW_KEY_COMMA` + * - `GLFW_KEY_MINUS` + * - `GLFW_KEY_PERIOD` + * - `GLFW_KEY_SLASH` + * - `GLFW_KEY_SEMICOLON` + * - `GLFW_KEY_EQUAL` + * - `GLFW_KEY_LEFT_BRACKET` + * - `GLFW_KEY_RIGHT_BRACKET` + * - `GLFW_KEY_BACKSLASH` + * - `GLFW_KEY_WORLD_1` + * - `GLFW_KEY_WORLD_2` + * - `GLFW_KEY_0` to `GLFW_KEY_9` + * - `GLFW_KEY_A` to `GLFW_KEY_Z` + * - `GLFW_KEY_KP_0` to `GLFW_KEY_KP_9` + * - `GLFW_KEY_KP_DECIMAL` + * - `GLFW_KEY_KP_DIVIDE` + * - `GLFW_KEY_KP_MULTIPLY` + * - `GLFW_KEY_KP_SUBTRACT` + * - `GLFW_KEY_KP_ADD` + * - `GLFW_KEY_KP_EQUAL` + * + * Names for printable keys depend on keyboard layout, while names for + * non-printable keys are the same across layouts but depend on the application + * language and should be localized along with other user interface text. + * + * @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`. + * @param[in] scancode The scancode of the key to query. + * @return The UTF-8 encoded, layout-specific name of the key, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark The contents of the returned string may change when a keyboard + * layout change event is received. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key_name + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetKeyName(int key, int scancode); + +/*! @brief Returns the platform-specific scancode of the specified key. + * + * This function returns the platform-specific scancode of the specified key. + * + * If the key is `GLFW_KEY_UNKNOWN` or does not exist on the keyboard this + * method will return `-1`. + * + * @param[in] key Any [named key](@ref keys). + * @return The platform-specific scancode for the key, or `-1` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref input_key + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwGetKeyScancode(int key); + +/*! @brief Returns the last reported state of a keyboard key for the specified + * window. + * + * This function returns the last state reported for the specified key to the + * specified window. The returned state is one of `GLFW_PRESS` or + * `GLFW_RELEASE`. The action `GLFW_REPEAT` is only reported to the key callback. + * + * If the @ref GLFW_STICKY_KEYS input mode is enabled, this function returns + * `GLFW_PRESS` the first time you call it for a key that was pressed, even if + * that key has already been released. + * + * The key functions deal with physical keys, with [key tokens](@ref keys) + * named after their use on the standard US keyboard layout. If you want to + * input text, use the Unicode character callback instead. + * + * The [modifier key bit masks](@ref mods) are not key tokens and cannot be + * used with this function. + * + * __Do not use this function__ to implement [text input](@ref input_char). + * + * @param[in] window The desired window. + * @param[in] key The desired [keyboard key](@ref keys). `GLFW_KEY_UNKNOWN` is + * not a valid key for this function. + * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +GLFWAPI int glfwGetKey(GLFWwindow* window, int key); + +/*! @brief Returns the last reported state of a mouse button for the specified + * window. + * + * This function returns the last state reported for the specified mouse button + * to the specified window. The returned state is one of `GLFW_PRESS` or + * `GLFW_RELEASE`. + * + * If the @ref GLFW_STICKY_MOUSE_BUTTONS input mode is enabled, this function + * returns `GLFW_PRESS` the first time you call it for a mouse button that was + * pressed, even if that mouse button has already been released. + * + * @param[in] window The desired window. + * @param[in] button The desired [mouse button](@ref buttons). + * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); + +/*! @brief Retrieves the position of the cursor relative to the content area of + * the window. + * + * This function returns the position of the cursor, in screen coordinates, + * relative to the upper-left corner of the content area of the specified + * window. + * + * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor + * position is unbounded and limited only by the minimum and maximum values of + * a `double`. + * + * The coordinate can be converted to their integer equivalents with the + * `floor` function. Casting directly to an integer type works for positive + * coordinates, but fails for negative ones. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] window The desired window. + * @param[out] xpos Where to store the cursor x-coordinate, relative to the + * left edge of the content area, or `NULL`. + * @param[out] ypos Where to store the cursor y-coordinate, relative to the to + * top edge of the content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa @ref glfwSetCursorPos + * + * @since Added in version 3.0. Replaces `glfwGetMousePos`. + * + * @ingroup input + */ +GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); + +/*! @brief Sets the position of the cursor, relative to the content area of the + * window. + * + * This function sets the position, in screen coordinates, of the cursor + * relative to the upper-left corner of the content area of the specified + * window. The window must have input focus. If the window does not have + * input focus when this function is called, it fails silently. + * + * __Do not use this function__ to implement things like camera controls. GLFW + * already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the + * cursor, transparently re-centers it and provides unconstrained cursor + * motion. See @ref glfwSetInputMode for more information. + * + * If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is + * unconstrained and limited only by the minimum and maximum values of + * a `double`. + * + * @param[in] window The desired window. + * @param[in] xpos The desired x-coordinate, relative to the left edge of the + * content area. + * @param[in] ypos The desired y-coordinate, relative to the top edge of the + * content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland This function will only work when the cursor mode is + * `GLFW_CURSOR_DISABLED`, otherwise it will do nothing. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa @ref glfwGetCursorPos + * + * @since Added in version 3.0. Replaces `glfwSetMousePos`. + * + * @ingroup input + */ +GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); + +/*! @brief Creates a custom cursor. + * + * Creates a new custom cursor image that can be set for a window with @ref + * glfwSetCursor. The cursor can be destroyed with @ref glfwDestroyCursor. + * Any remaining cursors are destroyed by @ref glfwTerminate. + * + * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight + * bits per channel with the red channel first. They are arranged canonically + * as packed sequential rows, starting from the top-left corner. + * + * The cursor hotspot is specified in pixels, relative to the upper-left corner + * of the cursor image. Like all other coordinate systems in GLFW, the X-axis + * points to the right and the Y-axis points down. + * + * @param[in] image The desired cursor image. + * @param[in] xhot The desired x-coordinate, in pixels, of the cursor hotspot. + * @param[in] yhot The desired y-coordinate, in pixels, of the cursor hotspot. + * @return The handle of the created cursor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa @ref glfwDestroyCursor + * @sa @ref glfwCreateStandardCursor + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot); + +/*! @brief Creates a cursor with a standard shape. + * + * Returns a cursor with a [standard shape](@ref shapes), that can be set for + * a window with @ref glfwSetCursor. + * + * @param[in] shape One of the [standard shapes](@ref shapes). + * @return A new cursor ready to use or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa @ref glfwCreateCursor + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape); + +/*! @brief Destroys a cursor. + * + * This function destroys a cursor previously created with @ref + * glfwCreateCursor. Any remaining cursors will be destroyed by @ref + * glfwTerminate. + * + * If the specified cursor is current for any window, that window will be + * reverted to the default cursor. This does not affect the cursor mode. + * + * @param[in] cursor The cursor object to destroy. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa @ref glfwCreateCursor + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor); + +/*! @brief Sets the cursor for the window. + * + * This function sets the cursor image to be used when the cursor is over the + * content area of the specified window. The set cursor will only be visible + * when the [cursor mode](@ref cursor_mode) of the window is + * `GLFW_CURSOR_NORMAL`. + * + * On some platforms, the set cursor may not be visible unless the window also + * has input focus. + * + * @param[in] window The window to set the cursor for. + * @param[in] cursor The cursor to set, or `NULL` to switch back to the default + * arrow cursor. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor); + +/*! @brief Sets the key callback. + * + * This function sets the key callback of the specified window, which is called + * when a key is pressed, repeated or released. + * + * The key functions deal with physical keys, with layout independent + * [key tokens](@ref keys) named after their values in the standard US keyboard + * layout. If you want to input text, use the + * [character callback](@ref glfwSetCharCallback) instead. + * + * When a window loses input focus, it will generate synthetic key release + * events for all pressed keys. You can tell these events from user-generated + * events by the fact that the synthetic ones are generated after the focus + * loss event has been processed, i.e. after the + * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. + * + * The scancode of a key is specific to that platform or sometimes even to that + * machine. Scancodes are intended to allow users to bind keys that don't have + * a GLFW key token. Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their + * state is not saved and so it cannot be queried with @ref glfwGetKey. + * + * Sometimes GLFW needs to generate synthetic key events, in which case the + * scancode may be zero. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new key callback, or `NULL` to remove the currently + * set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWkeyfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun callback); + +/*! @brief Sets the Unicode character callback. + * + * This function sets the character callback of the specified window, which is + * called when a Unicode character is input. + * + * The character callback is intended for Unicode text input. As it deals with + * characters, it is keyboard layout dependent, whereas the + * [key callback](@ref glfwSetKeyCallback) is not. Characters do not map 1:1 + * to physical keys, as a key may produce zero, one or more characters. If you + * want to know whether a specific physical key was pressed or released, see + * the key callback instead. + * + * The character callback behaves as system text input normally does and will + * not be called if modifier keys are held down that would prevent normal text + * input on that platform, for example a Super (Command) key on macOS or Alt key + * on Windows. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcharfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in version 2.4. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun callback); + +/*! @brief Sets the Unicode character with modifiers callback. + * + * This function sets the character with modifiers callback of the specified + * window, which is called when a Unicode character is input regardless of what + * modifier keys are used. + * + * The character with modifiers callback is intended for implementing custom + * Unicode character input. For regular Unicode text input, see the + * [character callback](@ref glfwSetCharCallback). Like the character + * callback, the character with modifiers callback deals with characters and is + * keyboard layout dependent. Characters do not map 1:1 to physical keys, as + * a key may produce zero, one or more characters. If you want to know whether + * a specific physical key was pressed or released, see the + * [key callback](@ref glfwSetKeyCallback) instead. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * [error](@ref error_handling) occurred. + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcharmodsfun). + * + * @deprecated Scheduled for removal in version 4.0. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun callback); + +/*! @brief Sets the mouse button callback. + * + * This function sets the mouse button callback of the specified window, which + * is called when a mouse button is pressed or released. + * + * When a window loses input focus, it will generate synthetic mouse button + * release events for all pressed mouse buttons. You can tell these events + * from user-generated events by the fact that the synthetic ones are generated + * after the focus loss event has been processed, i.e. after the + * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int button, int action, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWmousebuttonfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun callback); + +/*! @brief Sets the cursor position callback. + * + * This function sets the cursor position callback of the specified window, + * which is called when the cursor is moved. The callback is provided with the + * position, in screen coordinates, relative to the upper-left corner of the + * content area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, double xpos, double ypos); + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcursorposfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * + * @since Added in version 3.0. Replaces `glfwSetMousePosCallback`. + * + * @ingroup input + */ +GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun callback); + +/*! @brief Sets the cursor enter/leave callback. + * + * This function sets the cursor boundary crossing callback of the specified + * window, which is called when the cursor enters or leaves the content area of + * the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int entered) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcursorenterfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_enter + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun callback); + +/*! @brief Sets the scroll callback. + * + * This function sets the scroll callback of the specified window, which is + * called when a scrolling device is used, such as a mouse wheel or scrolling + * area of a touchpad. + * + * The scroll callback receives all scrolling input, like that from a mouse + * wheel or a touchpad scrolling area. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new scroll callback, or `NULL` to remove the + * currently set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, double xoffset, double yoffset) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWscrollfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref scrolling + * + * @since Added in version 3.0. Replaces `glfwSetMouseWheelCallback`. + * + * @ingroup input + */ +GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun callback); + +/*! @brief Sets the path drop callback. + * + * This function sets the path drop callback of the specified window, which is + * called when one or more dragged paths are dropped on the window. + * + * Because the path array and its strings may have been generated specifically + * for that event, they are not guaranteed to be valid after the callback has + * returned. If you wish to use them after the callback returns, you need to + * make a deep copy. + * + * @param[in] window The window whose callback to set. + * @param[in] callback The new file drop callback, or `NULL` to remove the + * currently set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int path_count, const char* paths[]) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWdropfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @wayland File drop is currently unimplemented. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref path_drop + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun callback); + +/*! @brief Returns whether the specified joystick is present. + * + * This function returns whether the specified joystick is present. + * + * There is no need to call this function before other functions that accept + * a joystick ID, as they all check for presence before performing any other + * work. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return `GLFW_TRUE` if the joystick is present, or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick + * + * @since Added in version 3.0. Replaces `glfwGetJoystickParam`. + * + * @ingroup input + */ +GLFWAPI int glfwJoystickPresent(int jid); + +/*! @brief Returns the values of all axes of the specified joystick. + * + * This function returns the values of all axes of the specified joystick. + * Each element in the array is a value between -1.0 and 1.0. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of axis values in the returned + * array. This is set to zero if the joystick is not present or an error + * occurred. + * @return An array of axis values, or `NULL` if the joystick is not present or + * an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_axis + * + * @since Added in version 3.0. Replaces `glfwGetJoystickPos`. + * + * @ingroup input + */ +GLFWAPI const float* glfwGetJoystickAxes(int jid, int* count); + +/*! @brief Returns the state of all buttons of the specified joystick. + * + * This function returns the state of all buttons of the specified joystick. + * Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`. + * + * For backward compatibility with earlier versions that did not have @ref + * glfwGetJoystickHats, the button array also includes all hats, each + * represented as four buttons. The hats are in the same order as returned by + * __glfwGetJoystickHats__ and are in the order _up_, _right_, _down_ and + * _left_. To disable these extra buttons, set the @ref + * GLFW_JOYSTICK_HAT_BUTTONS init hint before initialization. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of button states in the returned + * array. This is set to zero if the joystick is not present or an error + * occurred. + * @return An array of button states, or `NULL` if the joystick is not present + * or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_button + * + * @since Added in version 2.2. + * @glfw3 Changed to return a dynamic array. + * + * @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickButtons(int jid, int* count); + +/*! @brief Returns the state of all hats of the specified joystick. + * + * This function returns the state of all hats of the specified joystick. + * Each element in the array is one of the following values: + * + * Name | Value + * ---- | ----- + * `GLFW_HAT_CENTERED` | 0 + * `GLFW_HAT_UP` | 1 + * `GLFW_HAT_RIGHT` | 2 + * `GLFW_HAT_DOWN` | 4 + * `GLFW_HAT_LEFT` | 8 + * `GLFW_HAT_RIGHT_UP` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_UP` + * `GLFW_HAT_RIGHT_DOWN` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_DOWN` + * `GLFW_HAT_LEFT_UP` | `GLFW_HAT_LEFT` \| `GLFW_HAT_UP` + * `GLFW_HAT_LEFT_DOWN` | `GLFW_HAT_LEFT` \| `GLFW_HAT_DOWN` + * + * The diagonal directions are bitwise combinations of the primary (up, right, + * down and left) directions and you can test for these individually by ANDing + * it with the corresponding direction. + * + * @code + * if (hats[2] & GLFW_HAT_RIGHT) + * { + * // State of hat 2 could be right-up, right or right-down + * } + * @endcode + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of hat states in the returned + * array. This is set to zero if the joystick is not present or an error + * occurred. + * @return An array of hat states, or `NULL` if the joystick is not present + * or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected, this function is called again for that joystick or the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_hat + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickHats(int jid, int* count); + +/*! @brief Returns the name of the specified joystick. + * + * This function returns the name, encoded as UTF-8, of the specified joystick. + * The returned string is allocated and freed by GLFW. You should not free it + * yourself. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick + * is not present or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_name + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetJoystickName(int jid); + +/*! @brief Returns the SDL compatible GUID of the specified joystick. + * + * This function returns the SDL compatible GUID, as a UTF-8 encoded + * hexadecimal string, of the specified joystick. The returned string is + * allocated and freed by GLFW. You should not free it yourself. + * + * The GUID is what connects a joystick to a gamepad mapping. A connected + * joystick will always have a GUID even if there is no gamepad mapping + * assigned to it. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * The GUID uses the format introduced in SDL 2.0.5. This GUID tries to + * uniquely identify the make and model of a joystick but does not identify + * a specific unit, e.g. all wired Xbox 360 controllers will have the same + * GUID on that platform. The GUID for a unit may vary between platforms + * depending on what hardware information the platform specific APIs provide. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded GUID of the joystick, or `NULL` if the joystick + * is not present or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetJoystickGUID(int jid); + +/*! @brief Sets the user pointer of the specified joystick. + * + * This function sets the user-defined pointer of the specified joystick. The + * current value is retained until the joystick is disconnected. The initial + * value is `NULL`. + * + * This function may be called from the joystick callback, even for a joystick + * that is being disconnected. + * + * @param[in] jid The joystick whose pointer to set. + * @param[in] pointer The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref joystick_userptr + * @sa @ref glfwGetJoystickUserPointer + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI void glfwSetJoystickUserPointer(int jid, void* pointer); + +/*! @brief Returns the user pointer of the specified joystick. + * + * This function returns the current value of the user-defined pointer of the + * specified joystick. The initial value is `NULL`. + * + * This function may be called from the joystick callback, even for a joystick + * that is being disconnected. + * + * @param[in] jid The joystick whose pointer to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref joystick_userptr + * @sa @ref glfwSetJoystickUserPointer + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI void* glfwGetJoystickUserPointer(int jid); + +/*! @brief Returns whether the specified joystick has a gamepad mapping. + * + * This function returns whether the specified joystick is both present and has + * a gamepad mapping. + * + * If the specified joystick is present but does not have a gamepad mapping + * this function will return `GLFW_FALSE` but will not generate an error. Call + * @ref glfwJoystickPresent to check if a joystick is present regardless of + * whether it has a mapping. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return `GLFW_TRUE` if a joystick is both present and has a gamepad mapping, + * or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwGetGamepadState + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwJoystickIsGamepad(int jid); + +/*! @brief Sets the joystick configuration callback. + * + * This function sets the joystick configuration callback, or removes the + * currently set callback. This is called when a joystick is connected to or + * disconnected from the system. + * + * For joystick connection and disconnection events to be delivered on all + * platforms, you need to call one of the [event processing](@ref events) + * functions. Joystick disconnection may also be detected and the callback + * called by joystick functions. The function will then return whatever it + * returns if the joystick is not present. + * + * @param[in] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @callback_signature + * @code + * void function_name(int jid, int event) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWjoystickfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_event + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun callback); + +/*! @brief Adds the specified SDL_GameControllerDB gamepad mappings. + * + * This function parses the specified ASCII encoded string and updates the + * internal list with any gamepad mappings it finds. This string may + * contain either a single gamepad mapping or many mappings separated by + * newlines. The parser supports the full format of the `gamecontrollerdb.txt` + * source file including empty lines and comments. + * + * See @ref gamepad_mapping for a description of the format. + * + * If there is already a gamepad mapping for a given GUID in the internal list, + * it will be replaced by the one passed to this function. If the library is + * terminated and re-initialized the internal list will revert to the built-in + * default. + * + * @param[in] string The string containing the gamepad mappings. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_VALUE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwJoystickIsGamepad + * @sa @ref glfwGetGamepadName + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwUpdateGamepadMappings(const char* string); + +/*! @brief Returns the human-readable gamepad name for the specified joystick. + * + * This function returns the human-readable name of the gamepad from the + * gamepad mapping assigned to the specified joystick. + * + * If the specified joystick is not present or does not have a gamepad mapping + * this function will return `NULL` but will not generate an error. Call + * @ref glfwJoystickPresent to check whether it is present regardless of + * whether it has a mapping. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded name of the gamepad, or `NULL` if the + * joystick is not present, does not have a mapping or an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref GLFW_INVALID_ENUM. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the specified joystick is + * disconnected, the gamepad mappings are updated or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwJoystickIsGamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetGamepadName(int jid); + +/*! @brief Retrieves the state of the specified joystick remapped as a gamepad. + * + * This function retrieves the state of the specified joystick remapped to + * an Xbox-like gamepad. + * + * If the specified joystick is not present or does not have a gamepad mapping + * this function will return `GLFW_FALSE` but will not generate an error. Call + * @ref glfwJoystickPresent to check whether it is present regardless of + * whether it has a mapping. + * + * The Guide button may not be available for input as it is often hooked by the + * system or the Steam client. + * + * Not all devices have all the buttons or axes provided by @ref + * GLFWgamepadstate. Unavailable buttons and axes will always report + * `GLFW_RELEASE` and 0.0 respectively. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] state The gamepad input state of the joystick. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if no joystick is + * connected, it has no gamepad mapping or an [error](@ref error_handling) + * occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwUpdateGamepadMappings + * @sa @ref glfwJoystickIsGamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state); + +/*! @brief Sets the clipboard to the specified string. + * + * This function sets the system clipboard to the specified, UTF-8 encoded + * string. + * + * @param[in] window Deprecated. Any valid window or `NULL`. + * @param[in] string A UTF-8 encoded string. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa @ref glfwGetClipboardString + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string); + +/*! @brief Returns the contents of the clipboard as a string. + * + * This function returns the contents of the system clipboard, if it contains + * or is convertible to a UTF-8 encoded string. If the clipboard is empty or + * if its contents cannot be converted, `NULL` is returned and a @ref + * GLFW_FORMAT_UNAVAILABLE error is generated. + * + * @param[in] window Deprecated. Any valid window or `NULL`. + * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_FORMAT_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the next call to @ref + * glfwGetClipboardString or @ref glfwSetClipboardString, or until the library + * is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa @ref glfwSetClipboardString + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); + +/*! @brief Returns the GLFW time. + * + * This function returns the current GLFW time, in seconds. Unless the time + * has been set using @ref glfwSetTime it measures time elapsed since GLFW was + * initialized. + * + * This function and @ref glfwSetTime are helper functions on top of @ref + * glfwGetTimerFrequency and @ref glfwGetTimerValue. + * + * The resolution of the timer is system dependent, but is usually on the order + * of a few micro- or nanoseconds. It uses the highest-resolution monotonic + * time source on each supported platform. + * + * @return The current time, in seconds, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Reading and + * writing of the internal base time is not atomic, so it needs to be + * externally synchronized with calls to @ref glfwSetTime. + * + * @sa @ref time + * + * @since Added in version 1.0. + * + * @ingroup input + */ +GLFWAPI double glfwGetTime(void); + +/*! @brief Sets the GLFW time. + * + * This function sets the current GLFW time, in seconds. The value must be + * a positive finite number less than or equal to 18446744073.0, which is + * approximately 584.5 years. + * + * This function and @ref glfwGetTime are helper functions on top of @ref + * glfwGetTimerFrequency and @ref glfwGetTimerValue. + * + * @param[in] time The new value, in seconds. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_VALUE. + * + * @remark The upper limit of GLFW time is calculated as + * floor((264 - 1) / 109) and is due to implementations + * storing nanoseconds in 64 bits. The limit may be increased in the future. + * + * @thread_safety This function may be called from any thread. Reading and + * writing of the internal base time is not atomic, so it needs to be + * externally synchronized with calls to @ref glfwGetTime. + * + * @sa @ref time + * + * @since Added in version 2.2. + * + * @ingroup input + */ +GLFWAPI void glfwSetTime(double time); + +/*! @brief Returns the current value of the raw timer. + * + * This function returns the current value of the raw timer, measured in + * 1 / frequency seconds. To get the frequency, call @ref + * glfwGetTimerFrequency. + * + * @return The value of the timer, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref time + * @sa @ref glfwGetTimerFrequency + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerValue(void); + +/*! @brief Returns the frequency, in Hz, of the raw timer. + * + * This function returns the frequency, in Hz, of the raw timer. + * + * @return The frequency of the timer, in Hz, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref time + * @sa @ref glfwGetTimerValue + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerFrequency(void); + +/*! @brief Makes the context of the specified window current for the calling + * thread. + * + * This function makes the OpenGL or OpenGL ES context of the specified window + * current on the calling thread. A context must only be made current on + * a single thread at a time and each thread can have only a single current + * context at a time. + * + * When moving a context between threads, you must make it non-current on the + * old thread before making it current on the new one. + * + * By default, making a context non-current implicitly forces a pipeline flush. + * On machines that support `GL_KHR_context_flush_control`, you can control + * whether a context performs this flush by setting the + * [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) + * hint. + * + * The specified window must have an OpenGL or OpenGL ES context. Specifying + * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + * error. + * + * @param[in] window The window whose context to make current, or `NULL` to + * detach the current context. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_current + * @sa @ref glfwGetCurrentContext + * + * @since Added in version 3.0. + * + * @ingroup context + */ +GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window); + +/*! @brief Returns the window whose context is current on the calling thread. + * + * This function returns the window whose OpenGL or OpenGL ES context is + * current on the calling thread. + * + * @return The window whose context is current, or `NULL` if no window's + * context is current. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_current + * @sa @ref glfwMakeContextCurrent + * + * @since Added in version 3.0. + * + * @ingroup context + */ +GLFWAPI GLFWwindow* glfwGetCurrentContext(void); + +/*! @brief Swaps the front and back buffers of the specified window. + * + * This function swaps the front and back buffers of the specified window when + * rendering with OpenGL or OpenGL ES. If the swap interval is greater than + * zero, the GPU driver waits the specified number of screen updates before + * swapping the buffers. + * + * The specified window must have an OpenGL or OpenGL ES context. Specifying + * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + * error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see `vkQueuePresentKHR` instead. + * + * @param[in] window The window whose buffers to swap. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark __EGL:__ The context of the specified window must be current on the + * calling thread. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref buffer_swap + * @sa @ref glfwSwapInterval + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSwapBuffers(GLFWwindow* window); + +/*! @brief Sets the swap interval for the current context. + * + * This function sets the swap interval for the current OpenGL or OpenGL ES + * context, i.e. the number of screen updates to wait from the time @ref + * glfwSwapBuffers was called before swapping the buffers and returning. This + * is sometimes called _vertical synchronization_, _vertical retrace + * synchronization_ or just _vsync_. + * + * A context that supports either of the `WGL_EXT_swap_control_tear` and + * `GLX_EXT_swap_control_tear` extensions also accepts _negative_ swap + * intervals, which allows the driver to swap immediately even if a frame + * arrives a little bit late. You can check for these extensions with @ref + * glfwExtensionSupported. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see the present mode of your swapchain instead. + * + * @param[in] interval The minimum number of screen updates to wait for + * until the buffers are swapped by @ref glfwSwapBuffers. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark This function is not called during context creation, leaving the + * swap interval set to whatever is the default on that platform. This is done + * because some swap interval extensions used by GLFW do not allow the swap + * interval to be reset to zero once it has been set to a non-zero value. + * + * @remark Some GPU drivers do not honor the requested swap interval, either + * because of a user setting that overrides the application's request or due to + * bugs in the driver. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref buffer_swap + * @sa @ref glfwSwapBuffers + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI void glfwSwapInterval(int interval); + +/*! @brief Returns whether the specified extension is available. + * + * This function returns whether the specified + * [API extension](@ref context_glext) is supported by the current OpenGL or + * OpenGL ES context. It searches both for client API extension and context + * creation API extensions. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * As this functions retrieves and searches one or more extension strings each + * call, it is recommended that you cache its results if it is going to be used + * frequently. The extension strings will not change during the lifetime of + * a context, so there is no danger in doing this. + * + * This function does not apply to Vulkan. If you are using Vulkan, see @ref + * glfwGetRequiredInstanceExtensions, `vkEnumerateInstanceExtensionProperties` + * and `vkEnumerateDeviceExtensionProperties` instead. + * + * @param[in] extension The ASCII encoded name of the extension. + * @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE` + * otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT, @ref GLFW_INVALID_VALUE and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_glext + * @sa @ref glfwGetProcAddress + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI int glfwExtensionSupported(const char* extension); + +/*! @brief Returns the address of the specified function for the current + * context. + * + * This function returns the address of the specified OpenGL or OpenGL ES + * [core or extension function](@ref context_glext), if it is supported + * by the current context. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see @ref glfwGetInstanceProcAddress, `vkGetInstanceProcAddr` and + * `vkGetDeviceProcAddr` instead. + * + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark The address of a given function is not guaranteed to be the same + * between contexts. + * + * @remark This function may return a non-`NULL` address despite the + * associated version or extension not being available. Always check the + * context version or extension string first. + * + * @pointer_lifetime The returned function pointer is valid until the context + * is destroyed or the library is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_glext + * @sa @ref glfwExtensionSupported + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); + +/*! @brief Returns whether the Vulkan loader and an ICD have been found. + * + * This function returns whether the Vulkan loader and any minimally functional + * ICD have been found. + * + * The availability of a Vulkan loader and even an ICD does not by itself guarantee that + * surface creation or even instance creation is possible. Call @ref + * glfwGetRequiredInstanceExtensions to check whether the extensions necessary for Vulkan + * surface creation are available and @ref glfwGetPhysicalDevicePresentationSupport to + * check whether a queue family of a physical device supports image presentation. + * + * @return `GLFW_TRUE` if Vulkan is minimally available, or `GLFW_FALSE` + * otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_support + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI int glfwVulkanSupported(void); + +/*! @brief Returns the Vulkan instance extensions required by GLFW. + * + * This function returns an array of names of Vulkan instance extensions required + * by GLFW for creating Vulkan surfaces for GLFW windows. If successful, the + * list will always contain `VK_KHR_surface`, so if you don't require any + * additional extensions you can pass this list directly to the + * `VkInstanceCreateInfo` struct. + * + * If Vulkan is not available on the machine, this function returns `NULL` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available. + * + * If Vulkan is available but no set of extensions allowing window surface + * creation was found, this function returns `NULL`. You may still use Vulkan + * for off-screen rendering and compute work. + * + * @param[out] count Where to store the number of extensions in the returned + * array. This is set to zero if an error occurred. + * @return An array of ASCII encoded extension names, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_API_UNAVAILABLE. + * + * @remark Additional extensions may be required by future versions of GLFW. + * You should check if any extensions you wish to enable are already in the + * returned array, as it is an error to specify an extension more than once in + * the `VkInstanceCreateInfo` struct. + * + * @pointer_lifetime The returned array is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * library is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_ext + * @sa @ref glfwCreateWindowSurface + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count); + +#if defined(VK_VERSION_1_0) + +/*! @brief Returns the address of the specified Vulkan instance function. + * + * This function returns the address of the specified Vulkan core or extension + * function for the specified instance. If instance is set to `NULL` it can + * return any function exported from the Vulkan loader, including at least the + * following functions: + * + * - `vkEnumerateInstanceExtensionProperties` + * - `vkEnumerateInstanceLayerProperties` + * - `vkCreateInstance` + * - `vkGetInstanceProcAddr` + * + * If Vulkan is not available on the machine, this function returns `NULL` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available. + * + * This function is equivalent to calling `vkGetInstanceProcAddr` with + * a platform-specific query of the Vulkan loader as a fallback. + * + * @param[in] instance The Vulkan instance to query, or `NULL` to retrieve + * functions related to instance creation. + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_API_UNAVAILABLE. + * + * @pointer_lifetime The returned function pointer is valid until the library + * is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_proc + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname); + +/*! @brief Returns whether the specified queue family can present images. + * + * This function returns whether the specified queue family of the specified + * physical device supports presentation to the platform GLFW was built for. + * + * If Vulkan or the required window surface creation instance extensions are + * not available on the machine, or if the specified instance was not created + * with the required extensions, this function returns `GLFW_FALSE` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available and @ref + * glfwGetRequiredInstanceExtensions to check what instance extensions are + * required. + * + * @param[in] instance The instance that the physical device belongs to. + * @param[in] device The physical device that the queue family belongs to. + * @param[in] queuefamily The index of the queue family to query. + * @return `GLFW_TRUE` if the queue family supports presentation, or + * `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @remark @macos This function currently always returns `GLFW_TRUE`, as the + * `VK_MVK_macos_surface` and `VK_EXT_metal_surface` extensions do not provide + * a `vkGetPhysicalDevice*PresentationSupport` type function. + * + * @thread_safety This function may be called from any thread. For + * synchronization details of Vulkan objects, see the Vulkan specification. + * + * @sa @ref vulkan_present + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily); + +/*! @brief Creates a Vulkan surface for the specified window. + * + * This function creates a Vulkan surface for the specified window. + * + * If the Vulkan loader or at least one minimally functional ICD were not found, + * this function returns `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref + * GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported to check whether + * Vulkan is at least minimally available. + * + * If the required window surface creation instance extensions are not + * available or if the specified instance was not created with these extensions + * enabled, this function returns `VK_ERROR_EXTENSION_NOT_PRESENT` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref + * glfwGetRequiredInstanceExtensions to check what instance extensions are + * required. + * + * The window surface cannot be shared with another API so the window must + * have been created with the [client api hint](@ref GLFW_CLIENT_API_attrib) + * set to `GLFW_NO_API` otherwise it generates a @ref GLFW_INVALID_VALUE error + * and returns `VK_ERROR_NATIVE_WINDOW_IN_USE_KHR`. + * + * The window surface must be destroyed before the specified Vulkan instance. + * It is the responsibility of the caller to destroy the window surface. GLFW + * does not destroy it for you. Call `vkDestroySurfaceKHR` to destroy the + * surface. + * + * @param[in] instance The Vulkan instance to create the surface in. + * @param[in] window The window to create the surface for. + * @param[in] allocator The allocator to use, or `NULL` to use the default + * allocator. + * @param[out] surface Where to store the handle of the surface. This is set + * to `VK_NULL_HANDLE` if an error occurred. + * @return `VK_SUCCESS` if successful, or a Vulkan error code if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_API_UNAVAILABLE, @ref GLFW_PLATFORM_ERROR and @ref GLFW_INVALID_VALUE + * + * @remark If an error occurs before the creation call is made, GLFW returns + * the Vulkan error code most appropriate for the error. Appropriate use of + * @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should + * eliminate almost all occurrences of these errors. + * + * @remark @macos GLFW prefers the `VK_EXT_metal_surface` extension, with the + * `VK_MVK_macos_surface` extension as a fallback. The name of the selected + * extension, if any, is included in the array returned by @ref + * glfwGetRequiredInstanceExtensions. + * + * @remark @macos This function creates and sets a `CAMetalLayer` instance for + * the window content view, which is required for MoltenVK to function. + * + * @thread_safety This function may be called from any thread. For + * synchronization details of Vulkan objects, see the Vulkan specification. + * + * @sa @ref vulkan_surface + * @sa @ref glfwGetRequiredInstanceExtensions + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface); + +#endif /*VK_VERSION_1_0*/ + + +/************************************************************************* + * Global definition cleanup + *************************************************************************/ + +/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ + +#ifdef GLFW_WINGDIAPI_DEFINED + #undef WINGDIAPI + #undef GLFW_WINGDIAPI_DEFINED +#endif + +#ifdef GLFW_CALLBACK_DEFINED + #undef CALLBACK + #undef GLFW_CALLBACK_DEFINED +#endif + +/* Some OpenGL related headers need GLAPIENTRY, but it is unconditionally + * defined by some gl.h variants (OpenBSD) so define it after if needed. + */ +#ifndef GLAPIENTRY + #define GLAPIENTRY APIENTRY + #define GLFW_GLAPIENTRY_DEFINED +#endif + +/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_h_ */ + diff --git a/dependencies/include/GLFW/glfw3native.h b/dependencies/include/GLFW/glfw3native.h new file mode 100644 index 0000000..7be0227 --- /dev/null +++ b/dependencies/include/GLFW/glfw3native.h @@ -0,0 +1,628 @@ +/************************************************************************* + * GLFW 3.3 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2018 Camilla Löwy + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would + * be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + *************************************************************************/ + +#ifndef _glfw3_native_h_ +#define _glfw3_native_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @file glfw3native.h + * @brief The header of the native access functions. + * + * This is the header file of the native access functions. See @ref native for + * more information. + */ +/*! @defgroup native Native access + * @brief Functions related to accessing native handles. + * + * **By using the native access functions you assert that you know what you're + * doing and how to fix problems caused by using them. If you don't, you + * shouldn't be using them.** + * + * Before the inclusion of @ref glfw3native.h, you may define zero or more + * window system API macro and zero or more context creation API macros. + * + * The chosen backends must match those the library was compiled for. Failure + * to do this will cause a link-time error. + * + * The available window API macros are: + * * `GLFW_EXPOSE_NATIVE_WIN32` + * * `GLFW_EXPOSE_NATIVE_COCOA` + * * `GLFW_EXPOSE_NATIVE_X11` + * * `GLFW_EXPOSE_NATIVE_WAYLAND` + * + * The available context API macros are: + * * `GLFW_EXPOSE_NATIVE_WGL` + * * `GLFW_EXPOSE_NATIVE_NSGL` + * * `GLFW_EXPOSE_NATIVE_GLX` + * * `GLFW_EXPOSE_NATIVE_EGL` + * * `GLFW_EXPOSE_NATIVE_OSMESA` + * + * These macros select which of the native access functions that are declared + * and which platform-specific headers to include. It is then up your (by + * definition platform-specific) code to handle which of these should be + * defined. + * + * If you do not want the platform-specific headers to be included, define + * `GLFW_NATIVE_INCLUDE_NONE` before including the @ref glfw3native.h header. + * + * @code + * #define GLFW_EXPOSE_NATIVE_WIN32 + * #define GLFW_EXPOSE_NATIVE_WGL + * #define GLFW_NATIVE_INCLUDE_NONE + * #include + * @endcode + */ + + +/************************************************************************* + * System headers and types + *************************************************************************/ + +#if !defined(GLFW_NATIVE_INCLUDE_NONE) + + #if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL) + /* This is a workaround for the fact that glfw3.h needs to export APIENTRY (for + * example to allow applications to correctly declare a GL_KHR_debug callback) + * but windows.h assumes no one will define APIENTRY before it does + */ + #if defined(GLFW_APIENTRY_DEFINED) + #undef APIENTRY + #undef GLFW_APIENTRY_DEFINED + #endif + #include + #elif defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL) + #if defined(__OBJC__) + #import + #else + #include + #include + #endif + #elif defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX) + #include + #include + #elif defined(GLFW_EXPOSE_NATIVE_WAYLAND) + #include + #endif + + #if defined(GLFW_EXPOSE_NATIVE_WGL) + /* WGL is declared by windows.h */ + #endif + #if defined(GLFW_EXPOSE_NATIVE_NSGL) + /* NSGL is declared by Cocoa.h */ + #endif + #if defined(GLFW_EXPOSE_NATIVE_GLX) + /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by + * default it also acts as an OpenGL header + * However, glx.h will include gl.h, which will define it unconditionally + */ + #if defined(GLFW_GLAPIENTRY_DEFINED) + #undef GLAPIENTRY + #undef GLFW_GLAPIENTRY_DEFINED + #endif + #include + #endif + #if defined(GLFW_EXPOSE_NATIVE_EGL) + #include + #endif + #if defined(GLFW_EXPOSE_NATIVE_OSMESA) + /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by + * default it also acts as an OpenGL header + * However, osmesa.h will include gl.h, which will define it unconditionally + */ + #if defined(GLFW_GLAPIENTRY_DEFINED) + #undef GLAPIENTRY + #undef GLFW_GLAPIENTRY_DEFINED + #endif + #include + #endif + +#endif /*GLFW_NATIVE_INCLUDE_NONE*/ + + +/************************************************************************* + * Functions + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32) +/*! @brief Returns the adapter device name of the specified monitor. + * + * @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`) + * of the specified monitor, or `NULL` if an [error](@ref error_handling) + * occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the display device name of the specified monitor. + * + * @return The UTF-8 encoded display device name (for example + * `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor); + +/*! @brief Returns the `HWND` of the specified window. + * + * @return The `HWND` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark The `HDC` associated with the window can be queried with the + * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc) + * function. + * @code + * HDC dc = GetDC(glfwGetWin32Window(window)); + * @endcode + * This DC is private and does not need to be released. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WGL) +/*! @brief Returns the `HGLRC` of the specified window. + * + * @return The `HGLRC` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @remark The `HDC` associated with the window can be queried with the + * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc) + * function. + * @code + * HDC dc = GetDC(glfwGetWin32Window(window)); + * @endcode + * This DC is private and does not need to be released. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_COCOA) +/*! @brief Returns the `CGDirectDisplayID` of the specified monitor. + * + * @return The `CGDirectDisplayID` of the specified monitor, or + * `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the `NSWindow` of the specified window. + * + * @return The `NSWindow` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_NSGL) +/*! @brief Returns the `NSOpenGLContext` of the specified window. + * + * @return The `NSOpenGLContext` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_X11) +/*! @brief Returns the `Display` used by GLFW. + * + * @return The `Display` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI Display* glfwGetX11Display(void); + +/*! @brief Returns the `RRCrtc` of the specified monitor. + * + * @return The `RRCrtc` of the specified monitor, or `None` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the `RROutput` of the specified monitor. + * + * @return The `RROutput` of the specified monitor, or `None` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.1. + * + * @ingroup native + */ +GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor); + +/*! @brief Returns the `Window` of the specified window. + * + * @return The `Window` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI Window glfwGetX11Window(GLFWwindow* window); + +/*! @brief Sets the current primary selection to the specified string. + * + * @param[in] string A UTF-8 encoded string. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwGetX11SelectionString + * @sa glfwSetClipboardString + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI void glfwSetX11SelectionString(const char* string); + +/*! @brief Returns the contents of the current primary selection as a string. + * + * If the selection is empty or if its contents cannot be converted, `NULL` + * is returned and a @ref GLFW_FORMAT_UNAVAILABLE error is generated. + * + * @return The contents of the selection as a UTF-8 encoded string, or `NULL` + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the next call to @ref + * glfwGetX11SelectionString or @ref glfwSetX11SelectionString, or until the + * library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwSetX11SelectionString + * @sa glfwGetClipboardString + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetX11SelectionString(void); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_GLX) +/*! @brief Returns the `GLXContext` of the specified window. + * + * @return The `GLXContext` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); + +/*! @brief Returns the `GLXWindow` of the specified window. + * + * @return The `GLXWindow` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WAYLAND) +/*! @brief Returns the `struct wl_display*` used by GLFW. + * + * @return The `struct wl_display*` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_display* glfwGetWaylandDisplay(void); + +/*! @brief Returns the `struct wl_output*` of the specified monitor. + * + * @return The `struct wl_output*` of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the main `struct wl_surface*` of the specified window. + * + * @return The main `struct wl_surface*` of the specified window, or `NULL` if + * an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_EGL) +/*! @brief Returns the `EGLDisplay` used by GLFW. + * + * @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark Because EGL is initialized on demand, this function will return + * `EGL_NO_DISPLAY` until the first context has been created via EGL. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLDisplay glfwGetEGLDisplay(void); + +/*! @brief Returns the `EGLContext` of the specified window. + * + * @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window); + +/*! @brief Returns the `EGLSurface` of the specified window. + * + * @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_OSMESA) +/*! @brief Retrieves the color buffer associated with the specified window. + * + * @param[in] window The window whose color buffer to retrieve. + * @param[out] width Where to store the width of the color buffer, or `NULL`. + * @param[out] height Where to store the height of the color buffer, or `NULL`. + * @param[out] format Where to store the OSMesa pixel format of the color + * buffer, or `NULL`. + * @param[out] buffer Where to store the address of the color buffer, or + * `NULL`. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height, int* format, void** buffer); + +/*! @brief Retrieves the depth buffer associated with the specified window. + * + * @param[in] window The window whose depth buffer to retrieve. + * @param[out] width Where to store the width of the depth buffer, or `NULL`. + * @param[out] height Where to store the height of the depth buffer, or `NULL`. + * @param[out] bytesPerValue Where to store the number of bytes per depth + * buffer element, or `NULL`. + * @param[out] buffer Where to store the address of the depth buffer, or + * `NULL`. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height, int* bytesPerValue, void** buffer); + +/*! @brief Returns the `OSMesaContext` of the specified window. + * + * @return The `OSMesaContext` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NO_WINDOW_CONTEXT and @ref + * GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* window); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_native_h_ */ + diff --git a/dependencies/include/glad/glad.h b/dependencies/include/glad/glad.h index 8ca8e92..d7a60e7 100644 --- a/dependencies/include/glad/glad.h +++ b/dependencies/include/glad/glad.h @@ -1,6 +1,6 @@ /* - OpenGL loader generated by glad 0.1.36 on Sat Aug 27 19:06:27 2022. + OpenGL loader generated by glad 0.1.36 on Mon Aug 29 17:36:37 2022. Language/Generator: C/C++ Specification: gl diff --git a/dependencies/library/libglfw3.a b/dependencies/library/libglfw3.a new file mode 100644 index 0000000000000000000000000000000000000000..555b0b4bbbf8a2066e525e2a8df1eee36b9a6871 GIT binary patch literal 480500 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 QSJNa2E@6Jc|8D&M4?q8}LjV8( literal 0 HcmV?d00001