0003-wayland-Add-Wayland-example.patch 75 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. From 3b568db9460c0359e8bda8256aa2161e5aafe07c Mon Sep 17 00:00:00 2001
  2. From: Tomeu Vizoso <tomeu.vizoso@collabora.com>
  3. Date: Tue, 1 Oct 2013 13:19:20 +0200
  4. Subject: [PATCH 03/21] wayland: Add Wayland example
  5. ---
  6. .../linux/apps/hello_pi/CMakeLists.txt | 1 +
  7. .../linux/apps/hello_pi/Makefile | 2 +
  8. .../hello_pi/hello_wayland/CMakeLists.txt | 8 +
  9. .../hello_pi/hello_wayland/Djenne_128_128.raw | 3 +
  10. .../apps/hello_pi/hello_wayland/Makefile | 5 +
  11. .../hello_wayland/cube_texture_and_coords.h | 100 +++
  12. .../apps/hello_pi/hello_wayland/triangle.c | 666 ++++++++++++++++++
  13. 7 files changed, 785 insertions(+)
  14. create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt
  15. create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw
  16. create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/Makefile
  17. create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h
  18. create mode 100644 host_applications/linux/apps/hello_pi/hello_wayland/triangle.c
  19. diff --git a/host_applications/linux/apps/hello_pi/CMakeLists.txt b/host_applications/linux/apps/hello_pi/CMakeLists.txt
  20. index b28a94a..2849fad 100644
  21. --- a/host_applications/linux/apps/hello_pi/CMakeLists.txt
  22. +++ b/host_applications/linux/apps/hello_pi/CMakeLists.txt
  23. @@ -25,6 +25,7 @@ add_subdirectory(hello_encode)
  24. add_subdirectory(hello_jpeg)
  25. add_subdirectory(hello_videocube)
  26. add_subdirectory(hello_teapot)
  27. +add_subdirectory(hello_wayland)
  28. if(BUILD_FONT)
  29. set(VGFONT_SRCS libs/vgfont/font.c libs/vgfont/vgft.c libs/vgfont/graphics.c)
  30. diff --git a/host_applications/linux/apps/hello_pi/Makefile b/host_applications/linux/apps/hello_pi/Makefile
  31. index 4c2b2ef..d2b2555 100644
  32. --- a/host_applications/linux/apps/hello_pi/Makefile
  33. +++ b/host_applications/linux/apps/hello_pi/Makefile
  34. @@ -24,6 +24,7 @@ apps: libs/ilclient/libilclient.a libs/vgfont/libvgfont.a libs/revision/librevis
  35. $(MAKE) -C hello_teapot
  36. $(MAKE) -C hello_fft
  37. $(MAKE) -C hello_mmal_encode
  38. + $(MAKE) -C hello_wayland
  39. clean:
  40. $(MAKE) -C libs/ilclient clean
  41. @@ -43,4 +44,5 @@ clean:
  42. $(MAKE) -C hello_teapot clean
  43. $(MAKE) -C hello_fft clean
  44. $(MAKE) -C hello_mmal_encode clean
  45. + $(MAKE) -C hello_wayland clean
  46. diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt b/host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt
  47. new file mode 100644
  48. index 0000000..9a2f75c
  49. --- /dev/null
  50. +++ b/host_applications/linux/apps/hello_pi/hello_wayland/CMakeLists.txt
  51. @@ -0,0 +1,8 @@
  52. +set(EXEC hello_wayland.bin)
  53. +set(SRCS triangle.c)
  54. +
  55. +add_executable(${EXEC} ${SRCS})
  56. +target_link_libraries(${EXEC} ${HELLO_PI_LIBS} -lwayland-client -lwayland-egl)
  57. +
  58. +install(TARGETS ${EXEC}
  59. + RUNTIME DESTINATION bin)
  60. diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw b/host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw
  61. new file mode 100644
  62. index 0000000..de9173c
  63. --- /dev/null
  64. +++ b/host_applications/linux/apps/hello_pi/hello_wayland/Djenne_128_128.raw
  65. @@ -0,0 +1,3 @@
  66. +�雛彑�潜愾毖丁效毖丁效喆濁拌喆濁拌喆濁拌喆濁拌荿茸拌荿茸拌櫢霜愾櫢霜愾�杉彑咩煽愾櫢霜愾櫢霜愾咩煎彑咩煎彑�蒸嵜咩煎彑�穣嫋�穣嫋�穣嫋�穣嫋�穣嫋�叙埆�穣嫋�穣嫋�呪埆�助喙�飼匯�飼匯�窄从�窄从�窄从�窄从�候儿�侯亳鯲虞老麩剣儿駘挙老麩倦裕鯲具裕駘拒裕駘拒裕靆基夢靆器乏鑠鰹乏酲猿鳳酲猿鳳酲猿鳳酲燕憤鑛逸憤酩�逼軾�猫貲㈹猫詁�頭詁�笛蠹�笛詁�頭菽�暢蘢�辿菽�辿菽�即喆諾效毖兆枋飯糖榲飯糖榲菶訂枋菶訂枋菶訂枋菶訂枋�蹄枋�蹄枋�蹄枋�蹄枋顗凋效顗凋效顗凋效顗凋效顗凋效顗凋效荿茸拌荿茸拌櫢霜愾櫢霜愾咩煎彑咩煎彑櫢鎗彑咩煎彑�据嵜�据嵜�据嵜�雛嫋�穣嫋�穣嫋�序喀�序喀�寿匱�寿匱�索啝�似啝�獄匣�策匣�候儿�鵠亳�侯亳�佼老�佼老麩兼老麩健龍鯲愚龍駑奇隆駑奇隆駑奇隆靈叶由鰺椛眠駝会眠靄縁憤鑛逸憤酩�逼酩�溌酩�溌軾�猫貲㍾溌軾�猫詁�頭蠹�笛菶訂枋菶訂枋飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲菶訂枋菶訂枋�蹄枋顗凋效顗凋效顗凋效顗凋效顗凋效顗凋效荿諾愾荿茸拌荿茸拌櫢霜愾櫢霜愾櫢霜愾咩煎彑�据嵜�据嵜�杉彑�雛嫋�穣嫋�穣嫋�序喀�序喀�寿匱�寿匱�索啝�事匣�策匣�策匣�黒儿�黒儿�黒儿�侯亳�侯亳�佼老麩兼老鯲愚龍駑奇隆駑奇隆駑奇隆靈叶由鰺椛眠駝会眠靄艶鳳鑛逸憤鑛溢逼酩�逼鑛溢逼軾�猫貲㈹猫貲㈲頭貲㈲頭詁�頭飯糖榲飯糖榲�乳歹�乳歹飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲菶訂枋菶訂枋顗喋枋�蹄枋顗凋效顗凋效顗凋效顗凋效荿茸拌荿茸拌荿茸拌荿茸拌櫢霜愾櫢霜愾櫢霜愾咩煎彑咩煎彑咩煎彑�杉彑�雛嫋�穣嫋�穣嫋�序喀�序喀�寿匱�寿匱�索啝�事匣�似啝�策匣�鵠亳�獄匣�黒儿�侯亳�鵠亳�侯亳麩兼老麩健龍鯱拠狼鯱拠狼駑奇隆靈叶由鰺椛眠駝会眠靄艶鳳靄縁憤鑛逸憤酩�逼酩�逼酩�逼軾�逼酩�溌貲㈹猫詁�頭葈糖歹�莫歹飼日歹飼日歹葈筒榲葈筒榲葈筒榲葈筒榲菶訂枋菶訂枋飯糖榲飯糖榲菶訂枋菶訂枋毖兆枋菶訂枋�喋枌�喋枌顗凧畋顗凧畋顗凋效顗凋效荿茸拌荿茸拌櫢煽慇櫢煎弯�恕慇櫢煎弯�据嵜�雛嫋�譲彑咩洗埔�授埃咜恕崗�腰埃咜徐媾�似啝�似啝�策匣�策匣�黒儿�黒儿�黒儿�黒儿�黒儿�黒儿�侯亳麩兼老麸愚狼鯱拠狼駑奇隆靈叶由駝会眠駝会眠駝会眠靄艶鳳靄艶鳳靄縁憤鑛溢逼酩�逼鑛溢逼酩�逼貲㈹猫貲㈲頭葈糖歹�駁淒飼日歹飼日歹葈筒榲葈筒榲葈筒榲葈筒榲飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲飯糖榲菶訂枋飯筒枋�喋枌�喋枌�喋枌�喋枌�蹄枋�蹄枋顗凋效顗凋效顗凧畋顗茸拜櫢煽慇櫢煎弯咩煎彑咩潜嵜咩煎彑咩染嫂橳醸崗茁菅弯�樹媾咜序埃咜徐媾咜徐媾�授埃�授埃�似啝�似啝�似啝�似啝�黒儿�黒儿�鵠亳�侯亳麸虞亢麸愚狼麸虞亢鯱拠狼麥寄隆麥寄隆鰺椛眠駝会眠駝会眠靄艶鳳靄縁憤鑛逸憤鑛逸憤酩�逼酩�逼酩�溌飼乳淒�駁淒�駁淒�駁淒飼日歹飼日歹飼日歹飼日歹飼日歹飼日歹葈筒榲葈筒榲�乳歹�乳歹菶諦榲飯糖榲�逓楪�逓楪�喋枌�喋枌�蹄枋�蹄枋�蹄枋�蹄枋顗凧畋顗茸拜顗茸拜荿霜慇荿茸拌櫢霜愾櫢霜愾咩煎彑茁菅弯茁菅弯茁椙崗咜徐媾咜徐媾咜徐媾�授埃�授埃�授埃�授埃�似啝�似啝�似啝�似啝�策匣�黒儿�侯儼�券儼麸虞亢鯱拠狼�喰狼�渠狼麥寄隆鰺樺由鰺樺由鰺椛眠駝会眠靄艶鳳靄艶鳳靄縁憤鑛逸憤酩�溌飼乳淒�眉淒�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒飼日歹飼日歹飼日歹飼日歹�乳歹�乳歹飯統歹�日榲�歸�歸�歸�歸�逓楪�逓楪�到榲�到榲�蹄枋�蹄枋�蹄枌�喋枌顗茸拜荿増枌顗凋效顗兆拌顗兆拌櫢騒拌�穿慇靑旋弯靑煽崗橳錠弯橳醸崗橳醸崗咜徐媾咜徐媾咜徐媾咜徐媾�授埃�授埃�授埃�授埃�似啝�策匣�黒匕�候匕�券儼�兼亢�空亢�挙隆�渠狼麥寄隆麥寄隆麥嬉由鰺樺由鰺椛眠駝会眠駝介鳳靄苑眠靄縁憤�駁淒�駁淒飼日歹飼日歹�駁淒�駁淒飼乳淒�駁淒�麦淒�麦淒�麦淒�麦淒�駁淒�駁淒飼日歹飼日歹�乳歹�乳歹飯糖榲飯糖榲葈凧歡飼訂榁葈兆榁葈兆榁�蛸楝�蛸楝�蛸楝�蛸楝顗凧畋顗凧畋顗凧畋顗凧畋櫤椙擔櫤椙擔櫤椙擔櫤杉愍櫢霜愾櫢霜愾�据嵜�据嵜�穣媾�女媾�女媾�女媾�寿媾�受啝�歯啝�飼匣麪鵠匣麪穀亳麪穀亳鯰交亳�佼老麩兼老�侯亳�侯亳駭倦老駭倹龍靂駒龍鑞居裕靈叶由靈鰹眠鑢駕眠酲猿鳳�美瀏�美瀏�美瀏�美瀏�美瀏�美瀏�駁淒�眉淒�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒�乳歹�乳歹飯糖榲飯糖榲葈凋歡飼諦歡飼諦歡飼諦歡�寵歟�寵歟�蛸楝�蛸楝�喋枌�喋枌�喋枌�喋枌顥像杼顥像杼�蛸楝顥像楞櫢霜愾櫢霜愾櫢霜愾櫢霜愾櫢煽慇咩杉弯�蒸崗�蒸崗�序崗�叙埃�穣媾�叙埃�呪埃�飼匣�歯啝�柵匣�窄儿�黒儿麩兼老麩兼老駭倦老靂駒龍駭倹龍靂駒龍鯱拠狼鯱拒隆駑奇隆靈叶由�美瀏�美瀏�美瀏�美瀏�美瀏�美瀏�美瀏�猊�眉淒�駁淒�駁淒�駁淒�駁淒�駁淒�莫歹飼日歹飼入淒�麦淒�駁歹�乳歹�日歡�統淌飼蹄淌�統淌�統淌�統淌�糖歡飼諦歡飼訂榁葈兆榁葈兆榁葈兆榁葈兆榁葈兆榁葈兆榁葈兆榁葈丁效毖丁效毖貯拌喆濁拌喆鐸收�潜拈�染愎�雛愎�杉弯咩据崗�蒸崗�穣媾�女媾�叙埃�歯啝�歯啝�事匣�窄儿�鵠亳�侯亳�交亳鯰鯉老駭健亳鯰鯉老駭健狼鯱拠狼駑奇隆駑基由靈栢猗馞琵猗馞眉疉�幅疉�復猗馞琵猗馞琵猗�幅疉�服瀏�美瀏�美瀏�美瀏�美瀏�美瀏�眉淒�駁淒���瀏�瀏�瀏�瀏�麦淒�麦淒�統淌�乳淌�統淌�統淌�統淌�統淌�統淌�統淌飼諦歡飼諦歡飼諦歡飼諦歡飼諦歡飼諦歡葈兆榁飼諦歡菶訂枋菶訂枋毖丁效毖丁效氿諾杪氿濁攸坙鎗攸坙鎗攸櫢煽慇櫢煎弯櫢煎弯咩杉弯咩杉弯�穣媾�女媾�呪埃�受啝�歯啝�柵匣�柵匣�柵匣麪酷儿麪酷儿鯰交亳鰕倦亢駮具亢靉巨狼靉居隆馞琵猗�幅疉�幅疉�幅疉�幅疉�幅疉�幅疉�幅疉�猊�猊�猊�猊�猊�猊�猊�猊�美瀏�美瀏�美瀏�美瀏�麦瀏�眉淒�駁淒�駁淒飼日歹飼日歹飼日歹飼日歹�統淌�統淌�統淌�統淌�統淌�統淌飼諦歡飼諦歡飼諦歡飼諦歡飼諦歡�統淌飯糖榲飯糖榲飯糖榲飯統榮坙鎗攸坙鎗攸坙鎗攸坙鎗攸喆濁拌喆濁拌喆濁拌喆濁拌�雛愎�雛愎�畳彎�状崕�穣媾�女媾�呪埃�寿埃鰉昨唳鰉昨唳鰉昨唳駲国匚鯰交亳駭倦老駭倦老駭倹龍馞眉疉�幅疉�幅疉�幅疉�幅疉�幅疉�幅疉�幅疉�幅疉�幅疉�幅疉�幅疉�美瀏�美瀏�美瀏�美瀏�麦瀏�眉淒�美瀏�美瀏�猊�猊�猊�猊�駁淒�駁淒�統淌�統淌�統淌�統淌�統淌�統淌�統淌�統淌�統淌�統淌飼蹄淌�統淌飯糖榲飯糖榲飯糖榲飯糖榲飼諦歡飼諦歡葈兆榁葈兆榁菶訂枋菶訂枋毖丁效毖丁效坙鎗攸�潜拈坙遭拈�潜拈咩据崗�蒸崗�女媾�叙埃�儒媼�儒媼黌雌垰黌賜唳�朔儿麪酷儿鯰交亳駭倦老﨟副疉﨟復睚﨟副疉﨟副疉﨟副疉﨟副疉﨟副疉﨟副疉�幅疉�幅疉�幅疉�幅疉�猊�猊�猊�猊�猊�猊�猊�猊�麦瀏�美瀏�美瀏�美瀏�美瀏�美瀏�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒�乳瀑�乳瀑餧糖淌餧糖淌飼日歹飼日歹飼日歹飼日歹葈筒榲葈筒榲葈筒榲葈筒榲蒴訂歡蒴訂歡蒴訂歡蒴訂歡飯糖榲飯糖榲菶訂枋菶訂枋葈丁杪氿諾杪坙鎗攸�潜拈櫢煽慇咩杉弯咩杉弯�蒸崗�畳彎�状崕�助崕�儒媼�歯啝�柵匣麪酷儿麪穀亳﨟副疉髙放睚髙放睚髙放睚髙放睚髙放睚髙放睚髙放睚�朋睚�朋睚�朋睚�朋睚�猊�猊�猊�猊�猊�猊�猊�猊���猊�猊�美瀏�美瀏�美瀏�美瀏�美瀏�美瀏�美瀏�美瀏�美瀏�美瀏�眉瀑�乳瀑�日淌餧糖淌餧糖歹飼日歹飼乳淒�莫歹飼日歹飼日歹飼日歹飼日歹飼廿歡蒴訂歡蒴訂歡蒴訂歡蒴諦榲飯糖榲飯糖榲飯糖榲飯筒榁氿諾杪氿茸榁氿諾杪氿諾杪坙鎗攸坙遭拈�潜拈�雛愎�趨彎�助崕�諸媼�首垰黌雌垰鰉昨唳鰉昨唳駲甑眸墲微疉增復疚驎愈疝驎李疉﨟副疉﨟復睚髙放睚髙放睚髙放睚�方疉�幅疉�猊�眉眸�眉眸�眉眸�眉眸�疊�疊�疊�疊�疊�疊�疊�疊�煽狷�朋淒�稍�眞蒴猪敍汯��稟沆託篳埈��枸�淅驟��淺�瀏�瀏�瀏�麦淒�麦淒�麦淒�麦淒�麦淒�麦淒�麦淒�麦淒�乳歹�乳歹飼日歹飼日歹飼日歹飼日歹葈筒榲葈筒榲氿艇枋氿艇枋氿艇枋氿艇枋氿艇枋氿艇枋氿艇枋氿艇枦�託愾�送愾�雛愎�趨彎�叙彎�諸媼�儒媼�首垰黌雌垰鰉昨唳夋抱睚浯抱睫驎愈疚驎梨疝髙放睚髙放睚髙放睚髙放睚髙放睚髙放睚�幅疉�幅疉�幅疉�幅疉�幅疉�幅疉�猊�猊�猊�猊�猊�猊�猊�猊�眥�毘猝�猊�淌�翦汜猪猴���禀蒴鎗翳泚��枸�淅���淺�美瀏�美瀏�美瀏�美瀏�美瀏�眉淒�駁淒�駁淒�駁淒�莫歹飼日歹飼日歹飼日歹飼日歹飼日歹飼廿榲葈筒榲葈糖歹飼日歹飼廿榲葈筒榲葈答枋氿艇枋氿艇枋氿艇枋氿程拌�託愾�遭拈�染愎�趨彎�状崕�助崕�儒媼�首垰黌雌垰黌字篷涬麿稷蘒李稷�理睥�練稻�慢稻�万睚髙放睚髙放睚髙放睚髙朋睚�朋睚�朋睚�朋睚�朋睚�朋睚���猊�猊�猊�猊�猊�猊�猊�猊�貯猗泚朋瀏���稠�爺槃黹��穗�疆�毘猴�淕�猊���猊�猊�猊�猊�美瀏�美瀏�猊�猊�猊�猊�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒飼日歹飼日歹�駁淒�駁淒飼日歹飼日歹葈筒榲葈筒榲氿艇枋氿艇枋坙貯效�鐸拌坙遭拈�潜拈�趨彎�畳彎�状崕�助崕�儒媼�首垰涖履稷涖李稷魵簾篶��穗蘒李稷蘒李稷蘒李稷蘒李稷蘒李稷�理睛驎癒疚�癒疚�朋睚�朋睚�朋睚�朋睚�朋睚�朋睚�朋睚�朋睚�縛疉蕫��猊�緝�答轗nhc鳬滾榾�篳�答瀚�淕�瀚���猊�猊�猊�猊�美瀏�美瀏�美瀏�美瀏�美瀏�美瀏�美瀏�美瀏�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒�駁淒飼日歹飼日歹葈筒榲葈筒榲葈筒榲葈筒榲氿締效坙貯效坙鎗攸坙遭拈�洗彎�穣愎�畳彎�助崕�助崕�儒媼浯漣睥浯漣睥涇梨穗魵煉稷魵簾篶魵簾篶蘒李稷蘒李稷蘒李稷蘒理睛�理睛���睛髙放睚髙放睚﨟復睚�麿睚�幅疉���稻�朋睚�朋睚�放疝驎��禀�抵歿旄�]eg���枳�楪�翳���猖�瀚浯��猊�猊�猊�猊�猊�猊�猊�猊�美瀏�美瀏�駁淒�駁淒�駁淒�駁淒�美瀏�美瀏�駁淒�駁淒�駁淒�美瀏�駁淒�駁淒飼日歹飼日歹葈筒榲葈筒榲氿艇枋氿艇枋氿艇枋氿艇枋氿艇枋坙貯效坙鎗攸�潜拈�潜拈�雛愎�畳彎�助崕�儒媼�儒媼鮏奠縒魵傀睥蘒�穗��篶魵簾篶魵簾篶蘒李稷蘒李稷蘒李稷蘒李稷�理睛�理睛�理睛�理睛�璃穃�練睛�癒疚�癒疚�癒疚�癒疚﨟愈疚驎��睇塚灯耜��UdlYhe�赱�簧�等簓���猝�方疉�幅疉�幅疉�幅疉�服睚�朋睚�方疉�幅疉�復猗馞琵猗馞琵猗馞琵猗蕫美瀏�美瀏�美瀏�眉淒�駁淒�駁淒�莫歹飼日歹飼日歹飼日歹飼日歹飼日歹飼虹枋氿艇枋氿艇枋氿艇枋坙丁杪氿諾杪坙遭拈�潜拈�染愎�畳彎�畳彎�助崕�樹穡夋劔穡蘒�穗蘒�稷蘒梨穗髜�穗髜�穗髜�穗髜�穗蘒�穗髜�穗��穗��睛�理睛�理睛�理睛�理睛�梨疚驎愈疚驎愈疚驎愈疚驎愈睚���萢鈞����@Vg:PM���淺�籠奛琵疝�疚�疝�幅疉�幅疉�幅疉�幅疉�幅疉�幅疉馞琵猗馞琵猗�幅疉�幅疉�幅疉�幅疉�猊�猊�猊�猊�猊�眉淒�駁淒�駁淒�駁淒�駁淒�莫歹飼日歹飼廿榲葈筒榲葈筒榲葈筒榲葈筒榲氿艇枋氿訂榁葈丁杪氿濁攸坙鎗攸�染愎�雛愎�蒸拈�趨彎�償舸�悚蕚�舫�舐�剱篶��簧魵傅簧魵傚穗蘒�穗蘒�穗蘒�穗髜�穗��穗��睛�理睛�璃穃�理睛�簾疚�理睛�理睛�理睛�理睥�練稻�簓�凪敝lyzB[n>VW腸��淺�綟�微睚�瀘�疚�朋睚�朋睚�朋睚�朋睚�幅疉�幅疉�幅疉�幅疉�幅疉�幅疉�幅疉�幅疉�美瀏�美瀏�美瀏�猊�猊�美瀏�美瀏�駁淒�駁淒飼日歹飼日歹飼日歹飼日歹葈筒榲葈筒榲葈筒榲氿艇枋氿諾杪氿諾杪氿諾杪坙鎗攸�潜拈�雛愎�畳彎�畳彎湜哈諍�檐舫�恋舅蠇囿疱�憐簣奛偸縅魵傅簧魵傅簧魵簾篶��縅魵簾篶魵簾篶髜�穗髜�穗髜�穗髜�穗魲簾篶魵簾篶蘒李稷蘒履稷�疊�裂睛�綯�莽A;=?LWI]`AU[����椢殕�稟髜副睇�練稠�眉眸�眉稟���篳�篳�服禀�服禀�眉眸�眉眷�柾翩�狢�篷掾尾穢�愽韆眉猗馞琵猗馞琵猗馞琵猗馞毘瀁蕙縛瀁蕙縛瀁蕙縛瀁泚駁淒�駁淒�縛榲飼乳淒�莫歹飼廿榲葈筒榲葈筒榲葈答枋氿締效坙貯效坙貯效�濁拌�遭愾�送彑�染彑�杉蛉�恂縢�恫袵誧屎蚰���騷�釋�誦�圀穗蘒�穗蘒�篶魵簾篶魵簾篶魵簾篶魵練簧�傴簧�傅穗髜�穗髜�篶魵簾篶魵煉稷蘒李稷蘒��簇��稷�翔魲鷲播GV`=QV@TY.23D2+黔��稻髜復睚���稻�稻�稻�稻�稻�稻�朋睚�朋睚�朋睚�朋睚�朋睚�樋臻�諦睹汞恷斛�潴�諦瀏馞琵猗馞琵猗馞琵猗馞琵猗馞琵猗馞毘瀁蕙縛瀁蕙駁淒�駁淒�駁淒飼日歹飼日歹飼廿榲葈筒榲葈筒榲葈答枋氿艇枋坙丁枋坙貯效坙著拌�託愾�送愾�走彑�煽鈞寬磔轜�攪袒湜撕蠣�椢縅奓�簣淏傅簧魵傅簧魵傴縅��篶魵簾篶魵簾篶魵簾穗髜�穗髜�穗髜�穗髜�篶魵簾篶魵簾篶魵簾篶魵��簇浯劒睥�簇丹�狂�_pzGV]@T\MRS����慢睚魵復疝驎簾睇髙放睚薰方稻�万睚﨟服睚�朋睚�朋睚�朋睚���疆增眉瞎袤�hwv驗��殘夋増疂�幅疉�幅疉�幅疉�復猗馞琵猗馞毘瀁蕙縛瀁蕙駁淒�駁淒�駁淒�莫歹飼乳淒飼日歹飼廿榲葈筒榲葈筒榲氿艇枋氿艇枋氿締效坙貯效坙著拌�鐸拌�送愾�装迚岦脛鱇���鞐�癪諧孖曉舍淏偸簣裵��萪�萪�萪�萪�舊�舊�傴縅��縅��縅髜�穗髜�穗�傴簧�傴簧魵簾篶魵簾篶魵簾篶魵簾篶�緘墲剱疳�緝赧����\m|M[d:T\LSV�驪�梨篳蘒麿稷�練稻�慢稻�万睚髙方稻�満睚�朋睚�朋睚�朋睚���稘�猜�擘�Viu��湮�雀疂�幅疉�幅疉�幅疉�復猗馞琵猗馞琵猗馞琵猗馞琵猗馞琵猗馞枇瀁蕙縛瀁蕙縛瀁蕙爆淨汯虹淨汯虹淨汯肉歸埈祷楪�程楪�程楪�丁枋坙貯效坙著拌�鐸拌�装跫�纔驀寬暘蛉淼漿袤�悚葭�誦�贏�奬簧�劑縣�剱穉魵傅簧魵傅簧魵傅簧魵傴簧�傴簧�傅穗髜�穗髜�穗髜�穗髜�穗髜�穗髜偈眥﨡圉穰�泡�� /5G\nJS_<ZgFOW冒什���釉裵愈篶浯練稻�慢稻�慢稻�慢稻�万睚髙放睚髙放睚髙放睚髙慢秣荿涛聰���K`tSS_鵰��綸涇副疉﨟副疉﨟副疉﨟副疉涇復睚﨟蕗瀁洄枇猗洄枇猗蕙縛瀁蕙縛瀁蕙縛瀁蕙縛瀁汯虹淨汯虹淨埈等歸埈等歸埈等歸埈等歸�程楪�程楪氿艇枋氿艇枋坙貯效�鐸拌册剿跂�恙誑鮏悁窖�尓萸淏傚耘裵劒縊�劑縣�劑縣魵傅簧魵傅簧魵傅簧魵傅簧�傴簧�傴簧�傴簧�傴簧�傴簧�傴簧髜�穗髜�穉奛曝猩�疸�决料v��1EYPVd;ZiGQYogc�釶塚愉緞﨡簾穗蘒李稷蘒李稷蘒李稷蘒李穃�理睛�理睛驎愈疚驎油疥���斃炒�|��?RePUb矚戉倏﨟副疉﨟副疉﨟副疉﨟副疉﨟副疉﨟伏猗洄枇猗洄枇猗馞琵猗馞琵猗蕙縛瀁蕙縛瀁汯虹淨汯虹淨汯虹淨汯虹淨埈等歸埈等歸�程楪�程楪�程楪�程楪�苧枌�猪畋�|�蛞恣萍�傲穹�曁穢妺麿耘裵劈舍裵劑縣�劑縣�劑縣�劑縣�劑縣�劑縣�辨縣�辨縣�劑簧�傴簧�傴簧�傴簧�傅穗髜�穗�偬蘿�尢嬋�轗麺�|��@ZnKM\=_nJU`C<;��鴒篶�簾篶髜�篶魵簾篶魵簾篶魵簾篶魵練睛�理睛�梨疚驎愈疚�也猜�灑貝�9=APbTYf���袵喋睚髙放睚髙捧疉﨟副疉﨟復睚﨟副疉﨟副疉﨟副疉﨟伏猗洄枇猗洄微瀁﨏漠瀁﨏漠瀁﨏漠瀁﨏曝淨�賑淨�匂歸�痘歸�痘歸�痘歸�祷楪�程楪�程楪�禎枌��jWi閠暘衢�醯�簽�瞽�耻鵰捧耙裵剱耘裵劑縣�劑縣�劑縣�劑縣�劑縣�劑縣�辨縣�辨縣�劑簧�傴簧�傴簧�傴簧�傴簧�傴簧�偖蠧�屓慚�舩湾�w��]v�`bsChx[ir���淸暹緲涬漣縅�劈篶魵簾篶魵簾篶魵簾篶魵練睛�理睛�理睛�理睛�睛褂吝魂捷�b��;JXZbn袷試瀟�復睚髙放睚髙放睚髙放睚�捧疉﨟復睚﨟副疉﨟副疉洄枇猗洄枇猗洄枇猗洄枇猗﨏漠瀁﨏漠瀁�賑淨�賑淨�賑淨�賑淨�痘歸�痘歸埈等歸埈等歸埈祷楪�程楪CHV蒭��耡�囑縱�練舁�恂耘�剿耘奝剽縊�剱耘鮱哈縣�劑縣�劑縣�劑縣�劑耒�傴耒�傅縅�傴耒�舊鳧癒衄訒列籀���籠馞俣蓊倔斂炸謝娥穆���営�����k��;W^Nir/GQざ子掎鉈熈瀝奛捧緻蠇麿篶蘒�穗髜�疵鰀糖緞淸麿穉墲煉睥蘒璃稱黶倣艢々�j��UT_MZ[x���檍稾浯薮疥驎梨疝驎漣睫浯利稱夋抱睚浯捧疉﨟服疉�蕗疚增侭疔增柳猜�崩猜�沫狷�匂狷�弐濺�匂狷�薄濺�当濺�当濺�当濺�痘淞�禎淞�汀楝�碇歟��JM[�笶縣�哇縱�傴舂�尹耘淸劔耘奝劑舍鮱咬耘裵剱耘裵剱耘裵剱耘裵剱耘裵剱耒裵傚耒裵傅舊鮱劒耒裵做耡�耆�縡�戉耨涖符柬�ウ�け�0��}���ザy��z��x��\mx<R^8M]K\iJVaV[^onj鉗缺萍淸理縊魲�簧�傴簧�囿緤魵愉篶髜�簧���緻�簍�菲鮱�m��"?PSXiN^`F]Y緡鑓簓蘒聯睛�梨疚驎鑓睫浯薮稱夋抱睚浯捧疉﨟副疉�蕗疔增侭疔增迄猜�崩猜�崩猗�尾猗�備瀏�迫瀁�迫瀁�迫瀁�薄淨�迩淨�匂歸�痘歸�痘歸�匂歸��NQ_�筐蚯鮻恫耨�辨莽�廁舍淲哄舍鮱哈葭�咨耙�劈舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哈葭鮱哄舍裵剿痞�簷�簪﨡幵穢�坿彰v��������{��{��s��^~´]��R_q>M_BSg=L`KXhFO]OU]餐服緻淏�縅魲�簧魵傴簧�傚篶﨡練穗髜�穗���簗�緞�栂����s��KRhL]h#>:��訒愉緻魵��穗驎油疚浯薮疥夋庖稱浯抱睚墲放睚髙放睚增侭疔增侭疔增侭疔增侭疚�尾猗�尾猗�尾猗�薄淨�迩淨�迩淨�迫瀁�迫瀁�痘歸�痘歸�当楪�禎楪JM[艀��驂�囗耨�辨莽�廐耡�奧耡鮏奩耡�奩耡�舫鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱咨葭���耘�萠�耙�尨衽�┘v��}��y��x��|��s���_��^�^gv@Q]>N^<L^<M]TaoMZd����繭縊淏偸縊魵傅簧魵傅簧涬囮簟魵哈簧�簧�簣�簧�簍�麑�稔篠m��gn�`w�.OJ鞴續睫�鑓穃�方稱�李稷浯煉稷蘒李稷蘒履睫浯鑓睫浯鑓睫浯鑓睫浯薮疔增侭疔增迄猗�尾猗�備瀁�尾猗增風瀁�迫瀁�迫瀁�迫瀁�薄淨�迩淨�迩淨�燈淨��,/=�zt�nZ�樢耨�辨莽�幺睾���齎�廈耡�奩耡�奧舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍鮱哄舍�咏縱�賺�菲�舍涖癒菻��q���Ξ�У^w�m��^s�CXkCZj|��Obf<MVBV\BU\@TZGXaCW]r���舍�哇稷�囹耘�劑縣�剽簟鮏奩耡�傴睥塚愉縣鮻��綰黯�m��:Zt��Mfs.QRQIN嗅在埣鱆覧猜�満睛涖覧穃蘒李稷蘒李稷涖履稷墲薮睫墲薮睫墲薮睫�迄疔�迄疔�葺睇�葺禀�薄倏�薄倏�備疊�備疊�薄倏�備眸�迫瀁�迩淨�燈歸�迩淨?BP寀纛猝閇葺耨�辨莽�幺縡�鞆驂満蛆淸奧耡鮏奧耡淲咥舍淲咥舍淲咥舍淲咥舍淸尹耡淸奢耡淸奢耡淸奢耡濶奢虱�誅�恃瀾妺�������Yxy%*=Q\-?M<N_y��Yj{CTfTglATZAT[AT[@RY!59@PUu���葭�暈瀝�撩舊淸劑縣�劍縒蠇圄縊�劈簣奛囓蒄轢剞蛔�┴番Pp���K`k*PS|}�△�MJ@�癩菻蘒煉稱髜履睿蘒李稷蘒履簍墲愉稷�嵐淅墲薮睫墲薮睫�迄疔�迄疔�迄疔�迄疔�沫猖�沫猖�峯猜�峯猜�峰瀛�峯猜�峯濾�楓淺�簸淅�簸淅DGU黼燧穗�攪耨�辨莽�庠誚�哇萼贓備耜�奢耡淸奢舍淲咥舍淲咥舍淲咥舍淲咥耡淸奢耡淸奢耡淸奢耡淸奠袵�蚣�嚥痼闌諢痞���u�����章�可�篭度j~�Jape��o��VlxF\cGW`2@J6CK-6A $狸����釡�剱縱裵劒耘�劔舊裵劑耒�劑舩鞐會袰縹舒妬���廓x��wy�RhlCkm���O\]Z`\板搾睹魵簾簗魵煉篶髜�穗髜�穉薰�耙�厄槐涖吏睫墲薮睫墲薮睫墲薮睫�迄疔�迄疔�迄疔�迄疔�迄疔�迄疔�峯猜�峯猜�峯濾�風濾�楓淅�樋歿GIW黹沾縊�贓奣��菻�蚩�恬蛆�孅伸�黴�广耨�麼耨淲圀舊鮻劒舍淲囹舍淲咥舍裵屁耡裵奢耡淸尹耡淸奢耨�簽�瞎訷穢俎�グ����゛m⊆z��������~�����7R_3T[6]]<RiAYjBTe>N\<GS">BPEJ]���黯理蚰奛哄耡鮱哄舍鮱咬舍裵�耒�蔆�剿蠣韜爨���┝�すy∈Su�qm|]pt:dfNU`^mvZcd澱紙拮淏聯緞�鑓篶髜�穗髜�睿訒呻槐鮻咏嫂�李稷涖履稷墲薮睫墲薮睫墲薮睫墲鑓睫�迄疔�迄猖�迄疔�迄疔�迄猜�峯猜�峯猜�楓濾�楓濾�飛歿?TX知裸縹寀��蔆鮻囎舸驤怫淤叔�Zp~Xdr釼滌猾�瀚�轎渧手竄籵逞萪�翡馞咥籀�鮪衢褂恟袂�輜�微葭孖剱藾裵��蚰蒟�n��{����������u��s��x��n��e|�7N]>R^=Q_8MR@U\@V]@S[9MU/6;MV<NWw��憮繽聽蘒��耘�舂�耙�穽葢沐縉�幺籃���詈闊�{��������]j~CTdYhwSak<NXSkd^fu戯玩縊厠昴旙鱧��簟�剿穢��簗�封耘玳�U`k掵懌猩裵傴篷﨟覧痂�廉緘�訳稾�訳簗黷抹稾�躍緡�峰疔�靖睫�末疔�末疔�峯猜�峯猜�葺猜�峰淅BTZJSW�謾穩�舐�菻妤囑蕚鼕����PdlEU^闃��釡鰀奐衽皷銅左\\c�漲萠髙囓縢�叮挈檜幀窕髜�誥鈞寢瞞���鰌轌輔窶�Π�┨���������w��k��|��f}�Thw>U`@Vc:P\AT[@SZ@RZEX`?OYGXaBS\DT^9WRHX[����驩���萠奣咐耻鱠廂舊�劍耿夋��號矗��Ц��o���暗h|�DTdfv�DU^9ITIa[HQb※Z猾F>H�蔬衒�簫�咢簟�傅耆鮻抹縊涜�fpz疾件蚫齎到篷薰恋睾�恋篷�蘭簍�蘭簍�訳稾�訳稾�靖睫�末疔�末疔�末疔�宝猜�宝猜�宝疔�抹猜9JX<FMupp轜圄舩�菻�咸蚪繝�pz~>T\@S[���縷呰袂蒿螺蚶}��U\i���鱧劍簷�搓舐��Z]h�髴縟鮏恷蜑俺荒孛驗蘭袿洋��か��}��o�u��x��u��|��au�e|�8KV@S_F[bFV_>OXIZcFW`GU^GV_ET]ES\7Y^G[c@FJ�ⅴ�尓衫�呰蕚���臾�濫簫�并縣侘��┯~��{���孤Ldt=P]_q|?RY;NWCZYWar���叺�_^l亘藍衾�尢簟�哇縊鮏癒蚣釶友└Ubl���軏襠轂鮻咥疝�做穃�峰穃�裂穃�裂穃�烈睛�利稷�靖疔�末疔�末疔�末疔�末疔�抹猜�部濾��4DTGQ[IHM鱧糢聆訒屁葭渹丗摸`ruBZbAT\]ad鈬汾睹�埓塰dpxKXeZcg�胱縒驟徘卍lz�O[kД�葫黷僥�XjvAS\跏條窰�ォ�У��^o� 1C!<K[n�-=;O`6KZ*<I@T_>SZ1FN-:)5=JW!.;1?LJUaFR^NXd:XbBUaBDM韆胄舫�咆袞鼈恤舩�衢訷倩聚謌繆旃杜����写�┨��Lcr9P[OdoI\c<OX.-'2IQ`]佳�LRe電戊緞�瞞裵�簷�傀簣驀鍋淤悉�QapRYZ��譣恕篶奓劣穉�剿緲�裂穃�廉穃�裂穃�藍睛�訳稾�躍緲�訳稾�訳簗�末疔�末疔�奉濾�封猜.?%347?聲竏毓�瑩蒄辟����Sls:RX<LVFFN鶴鋺窘�袮�鯵Tdl>KZCU^芫纐簟皷����Tjx>R__eg��窰�~��D`lA^eglf粤����������シkz�x��Tj|y�����BWfG^i?R]@U\9NV0?L7GS0>J#1=6DP#/%1"-9"6F2<K74?�凞�恂耄�恫縱驟撥萸鱚叭邃1商化���~��w�����c}�H`l?UaAW^BR[>PWDWX;F\)8;┰�GRg���辷哄籌奓�穢��耋������Ug{T]]框梦瀚�哇簣�剳簪��穃��穃�列睛黷欄睛黷藍睛�藍睛�濫疚�藍睛黴末疚�躍疚�訳猖�抹猖��,9G!,:7=H #,/.3���校伽糎a|�Jbh?UZ>MTEDS���聹驎�j��HV^;IU:P`mts淲夬瞰r��Unt4OYGVX瘁孑慳gz~>[e9TZ7EI氛�x��8I8I「}��v�����z��cz�q��Qit<R]@Va6NU<KW<LX3CO1AM/<H:HT;IU(6B(:G*2A'%0F85疳��黝涬�葷趾棡葭鳧彎撲u���������ーx��cy�Uny=VbCVbG[b?NWDPYHZZEPe@QSPhbP_tZbj齊惧默裵�耒�剿耄�剞蒂{��Uk�\hn桀怦瀘�訳簣黻剪穢�剩穉�剳簟�偐穉�偐穉�剳睛�藍睛�濫疚�藍睛�薬疚�薬疚�薬疚�薬疚��?KT.:F0:H1;JCMW?JQ>LPCRP8KY:NR>RR=PW?M\BIV��鼈e��IRULU_/J]Wae�釐赭�x��I_c@[h8LXqxwΞ�q��LdtIZ`2LTHQ`�_��Nj{.?Pet�^|�r��n��x��o��`{�8P\=Ua<V`AQ^?P^9JW6GT7GT6FS8HV8HU7LW8DQ;=E蛛漑耿鱚油轌鮻搨聒�醯�儿妬Rp�/@*<K2@;KWdw�&9D9OZ@V]-7%2:AKTL\[CLaGXZF`[FVmIPX�驎�籌裵偸耘�剽耘諂農讐〓�=TlWclvxu三�鞦躍簣黹呶穢�剳簪�剳簪�偐穉�偐穉�偕睛黷欄睛黷欄睛黷欄睛黹劣疚�薬疚�訳睛�藍睛��@JR?IS/:I%3C(8J&9G-BI7OU;FU@MR;IJ5HO1JZ2L[-CEL`O/TdMRSKPY4OeGRV��蚫�Om�gz}:TfCWjPXb���l}�G[nCQV1N[CPa���s��s����lz�]{�t�n�����o��Qk|4O]:U`9T`<O\;O\1ER*:G=N[<MZ?O\BQ_5SW-@G9CG痰棘鰡諤副釐�燉舖�菘�亠太o��z��w��NW\FVd5GQVkuAU`GZa8GP5?G?FQ*75ILeK\^Hc\@PgAIQ�蕫�奬耋奛偖耒奝�蔆籤����E_xWbj┼�耡�欄耄鰾呶穢�囎簪�咐簪�剳穉�剳穉�剩穃�劣穃�劣穃鱇約睛�烈睛�藍睛�濫疚�薬疚��9JP4BH1<C/8A-5>'%,;1;J6FN2DN3FR2ES1DP8IS7HR1?L?P];P_5KX@P\>P^J`rq��ft�BX`9MW=P]7K[「�Zr|Kbk4MT7PZ.KV�_w�n��k��h��f��u��a}�B]jXs�d{�@Tc?P`=P_8CQ*7+<I@Sa8LY2BO(6"+:ALS6=G7:>���鈑鬻釵���詭裨摯簽鰾棕�y��v��s��s��i}�^s�as�;N\I[f@QZ;NU6JP;M\@RV>HQ,3@-7@CEJ怯�蚶渝廈袒�徇處ツ奸掴������l��型貞瞼鰲夾緡黼暦緡黻剴簪黻剴簪驍�睿鱆會穉驍假睾驍假睾鞨�睿驍�疥黷欄睛黷欄睛鱇役疚鱇役疚4DK)9BEOY2;D4=G"0)2?1=I6EN:IQ5EQ7GT8IV9IU5CL(.?L5ER6GT<MZ7GT3CP@P];KX4JQ3GS=P]>Qa:M\H[h6JU6KR2IQ2JV`w�d}�d|�z��a|�q��h�<SbAYh;O^AVe/DS=P_=P`<IU5EQ2DO9NY8JU-<I+9EEP\:KW)8D(2y}�源拙掖繖晞葫用祷赳ⅱ蝣渥t��ヲ���m��k����h{�BUbEWbCT]BT[<NUI]dK\cLY^9DLLU_/38諷檍袂閹尹耄�鱠���w����g~�u��a}�Seo]bd掌会簫�囈耒黽偕簪黻剴簪黻剩縡黻剴簪黻剪穉鱆會穉鱆會穉驍�睿驍�睛黷欄睛黷嵐疚鱇役疚鱇�-=J+9E#/)2?-6@2=F0:D2=G3?I<GT6DP/@M5ER1?K9DQ#/9'7E4DQ;KX9IV@L[9FT)+8F4JQ4HS8KX8K[3FU8KX1EP8MU<QY6IU!4A)<K^r�gz�{��v��9IUK\iAQ^FZf?R_?Q^;N[<S_BS[5FO:MU;NU9MT:KT7FO=HQ4IW8IV1CQ���et�^lu譏���N^[板汀��う��n~�|��x��h|�s��_r�DWdEWbK\eM_fGY`HYc@NTfqt^gn=GQEKO�踐蚰渧�耄黽����t��~��~��h|�Wn~HZdfoputk韆暈耡�囈與鰾囃簷鰾囃簷鰾呻簟驛剞睾驛假穉驛假穉驛假穉鞨�睿黷欄睛黷欄睛鱇役疚鱇役疚)9F)72=K*3@%/9=GQ0>E6CK8BL6BN4AP5AO5BP:GUDP\8BK1BO5ER8ES8ES2?M8BP)7.8F0EP6HR;KYCS`%6C$5B2BM5EQ7JR=MV&6C+;F/<]lyM^k9IV-8C<GS@NZ (3EP8LW8LW<S^CS\:KT?OY@QZFXaFU^?NW<GQ;LX8HU7IVN_lSgw?Sc��e{�F_d\dl髟�Vns$2-?P3>Mn��Thy0?9LYEWb$4=)0&8?*9B2=C*.s�JW^CKP鴆蝠艀�漣飜艢�|��Kh�j��\mw`t�[n{@R\OY^_^[鉞溏耡黼剩縡黼囀縒黼囀縒鰾呶縒黼囀縒驛假穉驛會簧驛假穉驛偃睿驍�睿驍�睿驍�睿驍�睿3BS3@P5?M.7D/8F7AJ6BL(9?-6D)5A3@N1=N2>O#0>'/7E7HU8HU6BQ7DRAN\5?M9DR>HV.?L2BP3FP:LW0?L)9E-:H/<J5GO8GP".8&0&/,%1,:"+.7AFQ[:IQ5FNAT[?U\6OV&6?(1,>G #$-(1(1-=F9AGO\`?KSAPY7ITBUbXp�Tk|1N^@MZ穏�q��g��j{�7DP\qsK_q,@R`r�9LYEWb:KT8JPCV\BP]?JR4?C +.1@G2<?��囘鰀咥贏雙����てu�����|��o��WfoLX]DGF掫苓疽鼇尠舖黼囀縒黼囀縒驛剪簟鰾咀簟驛剔穡驛剔穡驛剔穡驛剔穡鞨�睿鞨�睿鞨�睿鞨�睿3DQ6GS2@N1<J2;H5BN-9E%2+7(63@N/>O7FV)6C0:H?LW;KX:JW3DQ1AN0<J&4 &.;I3CT4ER1CNCS\>MU1?L1;I,6H4GS;IU5?H'0:#'3 )3#0<,:&31>J:ERDQ^DS`@R^?S^9MY1DK6GP+9B +5&2<&1;0@H)207=$(.$17'-:MT?R_J_n,L[CS_z��~��g��{�����by|[n��ЦM`o7KX?Q\>OX<NU:MS@M\BNYEPSARX:MU:GN珮碵鈬謔捍弊������w��������|��O_kSblVcgAHG窿溂湟黽幇穢黼囀縒黼囀縒黼囃簟驛剔穡鱆剪穡鱆剪穡鱆剪穡鱆剪穢驛假穉驛假穉鞨�睿鞨�睿3EP6FS2@L.:F.:H6AO0>L%2@%3?.:I1AQ/?O1AQ/>N0<J8GS7HU5FS5FS4ER2CO,9?P\=MZ5EU0BN4CO3DM%.%108F29J8IZ8HU&.;%*5(.9'1:,4B"/= /:3AM:HT?O[:MX@R]=OZ<Q[6GS0@L9GT%)1>0=I8FS$0&.=.6C;GQ:KQ;MT3FM<MXAS`-IZBM\~����Yz�u��Xey[r|ThzOcu{��DWdI[fEV_ASY@SX;I]?MYBSYDW[=S[<PX�轄蜒捶盒失Ylpv��z��������h��UbnSclP\cOZZEJF裝檮穹�囁簫驗夲簫驗夸縟驗夭穩閧咒簟鞣咒簟鞣咒簟鞣咒簟鞣呰簧閼倆簧閼們簣鈔�簣鈔�4HO1BK7FR*7C-8G09K-:J-8K.=H+<I/?O';J*>M.>N,<I4BN5IV3FS4HU4ER/@M(9F)9E5FR.>O2DP3CO2@H)4=8DO5=K4;M(<M)7H -',6-0:).9/8F1>O&7C->K8HU8IV>O\GWe;LY6FT3CQ8HU+4C#18@O?FUCQ_%3'0G6DX6GS1AN<PW;MX7KX>Qa3P^@JUEKX6Qb'J_���dt� &2Pcu/A1@AUbEWb>OX'9@L^c?NdGXf@PWDX^8P]H]fS\`孕����^fm���]{�fw�}�����eゥU^jNYdAPVWehU]X�跪籌渹懶穰驗囃縒黻囃穩鰾囁簫驗寳簟鞣咒簟鞣咒簟鞣咒簟驗咒穢鞦咒穢鞦呰穡閭剌穡閭�0=I0>J(13<F.8A2>J0=K1>M*8D,=I'8E+>M.BN2DN3EM3CI1@M/?K1AN4DQ6EV,;K+9L/<O/@J0AO,@P0CU+>P/?Q)9I*7E-<M);G!3@#1?#.="2>*8D+<G*;H-?L2CP5IV2ER9Q\:Q]8Q],CM 7B"7B:MX9JV6GS&2,8.EN5HR=MY>KW4?K4?KCP\<IU;JW8ETAMY:CO2<IDTbu��dy�9IT0AM1CM2DOCVa*;D<LV$.")'4<E*4<DPWKW_YfoGY`���@Uew��PaoQbrt��K^o<K\LdiEX_HX^@EK=<>���趙恪耻闍汝葩趺贔窘瑯應籀鈔恂耆跂梦縱辣梦縱諠咎穢諠咎穢趁呟穢趁呱穢赳剏睹赳剏睹,<I+7-9E-9C*6.9G*7G-;M3AM0=K-=J.>N0AN5EQ3BK1BH3CP4DP->I7GT6FS2AR1@P0@P0@L0@L1BO7FW6EV+:K+8F*6B,>K/?L'4B#.<)1>#/;'3?)7C/;J0@M1AN4ER6JW;N[.EQ/EQ/EP-@K+@K8JU<LX5EQ1?K9GS8NY2EO%1)58DP3?K/=I-:F,<I5APBNZ'4=)5 #%5F(9M0@L5ER3BO:JVFVc!2;6GP=OX"*3DLU9EL>HP)15BJ,4<MRjz�DXeat�z��ViwCUfi{�x��H[bNahFU[V_cLQR慝嚀痍裄帑蚩鰐����粭氣耜裘恁籃鱠呱縱辣梦縱辣夛簷趙嚮簷趙嚴簷鈔嚴簷鈔嚴穢釿呷穢釿�2BR3CP1=L)7C-;I-:J-;N/>Q4@K7BP0<M-<L3BS7DR9EN8CN8GP1@I2@L9GS1?K1?J.;I,9G5DL/>G->J3CP:JW2?K-8B09C0AN2>L)4B(0?)1>%-;)1?*6B/9H0=K2?M3CP:JW=N[8HV7JX7KV5JU7HS7IT:JV1AM6DP;IU5GR4DQ3AM=IU8DP.:FFT`6GR3BS3@N@LX"+5.8B'09*6B0;F2?M0=L2AL8EQES`7FOCR[APY<FNFQY<GOGQY&4<:GOGT\EQYWiq6GOI[fSdpz��l��l��i}�I]aIYa4@EALT>BF��韞艟榕碣絋�XW]裼條舍跂幀窕跂幎縱辣梦縱辣梦縱辣梦縱辣夛簷趙嚮簷趙嚥簷諢嚥簷諢�5GX-=M9IV)6E*7E*9I)9J(;-"0.;K2?N3@P-:H!.$-7".8%0:$09*6@=IR.9F%1=5AM8EL0<F1?L7DPDR^2=G3=E,6=.;J4?M,5C%-:)/<'0=-6?/9C1:H4?M9DR;HV?KY<LY<MZ7HU;MW9JU5HS<KX8HT3DP9FR:HT3DM1CL9HQ?JT'0/:D2BJ%7?'7H7DR@KW:DM7?H*5;8?F3;@4=L@HV3;H9EQFR^NYcJV`DOZHV]DQYES[AOWCPXFS[IV^@MUDTZBQXEV_br~x��t��fx�H]pIV\R`fLX^JS[U_b���owzエ��う���[]i榴菩蚓鈕夊瞹粃梃縉跂幀縉跂恚簽諢寞簽諢寞穢諠咎穢諠咎穢諠咎穢諠�(:K.>N/?L&3A,9G2BR-=N!3F08F0:K9GV5@S.;J/<J'3?7AJ*6(4%1=*6?-8B+4$.)3%()55DP&2;)0)0"*-$/>7?L)1>',9#)6 &0)2<+3=-6E.7E'2@*4B<IW8HU:JW@P]<LX5EQ9IU9IU9IU7DP6DP@NZ<KS>MV>IT@IS1>H7BL6EN2CL=IX8ES&5@&1>2=D$+2"'4;<(/?$409F7@M?LX7CM&1<&6?1BI8IOMYaGT\VckN[cMZb;IQFQW;JOHU]CS[DR^4DRgx�6GYJT\R^dCOU>JPEOWIS[blt���<Y_}��OQ^旙弥衾鈕夛窩聽樣簽諢寞簽諢寞簽諢寞簽裘寞穢諠咎穢裄刳睹裄刳睹裄�.>N;KX<IW+:F1>L7DT+9K)8K,7E.7I/:M0?Q/=P6CS/;F/;G+8F&3A,:F)7C/=I,:F+;C$3< ,6(4@&5A-:F*6$+$$(+8)5A)'5*#"-)3%+9)7"08DR;LY:KX6GT!1=&2/;(4)7C*9E.<H$1>&6>/;E.8B5?I+4>9EO.=F3DM:HT3@N0=L.<H-9C"*4(*/67&-=")8)2?;CPCO[AQY7GO;IR*9@/>E,2/5(5=,9A2?G9FNIS\?JRGRZ;FM0:D7AK%/9\foEPWQ\dGSZ>IMYdh+6:ISZhoyOin���\`n侑芙篶裄呵窕艫搴簽諢寞簽諢寢龝裔夊龝裔夊穢裔咏睹蛯刮睹蛯刮睹蛯�"2?!.:'3*6@*6B9DR4AQ-;M.;K2?O1?Q1AR4DU4DS/<J0>J.=N)9I+:J%6B*;H0@L&6C*:G.8G&3A*6D'8E/=I'2=(-"-0&4A+7C/7D(1%.#-".5$.6"-<%0>$2@,8F1BN9JW:KX:KX*7C1>J0=I,9E1?K-;G9JV%6B/:E(2<+5@(2<(1;9EO.@I6HQ5AJ0<H5AP.?L(4C'3=&/9(06,2C)3@)1>4@LAO\AR[<LV;OW1CJ=OV8JQ<KR?PWJW_<IQ'4<6@J09CCLU3:C:@F29@;=EHJR@KUV^hNY\GTU1=?HUVMY\SYbCVSR[hgj{構香簧艫揶炒鈑憺穹諠幃穹諠幄瞠裄寢瞠裄寢穢蛯刮睹蛯刮睹蛯刮睹蛯�0<H*7B7BK'1(2.:F4AO1>N,9J)8H*:K*=N-?P2BR,=J0?K-;O+8K(7G)8I5EQ2CP%5A*:F&3A.;K&6F0?O1AN(7?!.6%16+<H-;G0<H )3'1(2&19%3:"/?%2A)5D,<J.?M;LY7KX2ER7CO1>K6DP4BN3AM3@L2BN3CP7BI7@H;EMELU6AH3@G+?E3GM19C1>J5AP,<M(8I%2B(3<,5=,6E.6E,8D/=IANZ>OX7KS<OW=PW@SZ<OVEV\DU\>KS<JRBPW@HW?HRDIU@EN9;D*(/<=@HDF>JTV^h?IM9EGQZY6>APY]KSYR`VJR]EJ[^fd巒抑殱鱶瑜縣蜒帷穹蜒帷穹艨壼瞑艪壼瞑蛯刮睹蛯刪痂蛯刮睹蛯刮睹$@Q$<M+?N&7D)6E2>J7?L/;D,=H/@M3CT0=T-<O5DT3>J7AI+:B/=H,8F,9I1>O3?M.<H+:B-:I+<I)8I0AQ,;K.:I*7$-7(9K6FS+9E#.5+2*2%08$0;$4<&5=':B,=E*=H6HS8MW<O\7LV8MX0EP5GR2DO0CN3CO4DP3MT/HP8NV?T\"1: *&0!(2'4)50=I%.7)2<%.8-2>29B'-63;E2>J-;G@P\<LY7EO0AH9@IGNX5@G(2;KV\JT[MT[DHO>IQ>KP>IO:EL3<C5<@:@F=DIAIOMW^NZ`HTXNZ_HTYBOPIPT3GGL\YFPKQUO蜃溪瞰邃嘯縟聰怕瞰聰怏瞰萵恚疱諱恁痍諠�穉裔�穡蛛吝瞋聳嚆瀲+BR*@O4DT)6D+6D.9G+7C,7C5EQ'9E.>O-:Q0?R5DT3AM/<D1AJ3AN5AP.;K6CS4AO0>J-<D/:G(5D(9F/>N3DP(6B(1;!-4*:L.?K'5A!,3)1!,4%08'3=%0;,8B%4=1>K5ER6HS5ES8KX3EP8JU+=H0CM9IU.>J7GS3CO2IP5HP6IQAR\0@H,8B*4>6?I.=I'3?2>J(2<%/9 )"..6>#,!++7C3@L<MYEVb(7@"39(1;",61=G8EM&.#+"(*28ALTCPV?IPDLS5=D>DI.49?BG<DKISZHTZAMQJVZT`dIVXFNRN][HUUNVSab^闌繞窈聽怺袮珮帋穽窿怩穽竅怎瞰聰怕瞰籬噪疵瘁嘯獗矗宸獗矗宦炙0BM1AL7ER)4B.9G-7H(5E.-8-=,<M,;N*9M,;K*6$.'0 ,-%2B5BR)6D!/;.6+3=!.:&5@5BP7EQ+7A$,5'18*;L6FS-;G!,3)1!,4(3;$0:-6@'0: ,9#/+8D7HU1AN9JW2AM(8D/?K(9E1>J>LX1?K@NZ5CL;JS=MUEPZ?KU/;E1:D9BL/>J,7C6BO+5>%/9"+5(-9+2;*1:(1;(4@0>J:JV:KW>MV5EL:FR8DP8FS<KT5DM@LWAMT,4>,8@&07)3:,4;"*2-380386:?DLSHRYAMT6BF.:>+7;5BC=FIANNX``LQQPQM湾楳獪蒹栫瀾氓巒瞞氓巒瞞珥巫瞞烽巫瞞槲怡獰烙憚獨毯斈炙珎宦獨5DM6AM=FS,5C/7E-7I/:L"0C&2@,<L*;L*:K+;L3AQ-9/>F(7@-9-9H'3D.;K&2@"/;%.&-!+5&2>3?J ,!+"+$*(9J*;G%1 *2$, '/$0;"'5&/<'3%2A:FT7GT'7C!-%5A#/-9#1=$0*6B!- +5 * *#-+5.:D,9C5AK4CO)5A6BN4=G&0:$-7(.9*1:.4=*3=(4@0>J5EQ@P\@OX=NT:GV@NZ;KW9IU9IV>NWFR\8CM:CL;EL4?F8@G-2:3:?8<A<?D<DKISZMZ`HTXEQUEQU>KMBKN@GJ?DEHMLTXW窿氈渣聹桷籔珥巫瞞珥巫瞞珥巛瞞珥巛瞠槹昊獰滿恠獨瘁孺灑痼吭疵2>H'2>&/<+4B2;I6@Q.<O*:K,:J.;K-;M-=N,<L4DT-=J-:F,=F-=I*;H(7G5DT6FS'7C&8A*5<&/9#/;/;G.:F)3<$-")/&7I*;G!/;&-!)&.(3;,6"*8(1>'0<)3B%3@7DR<LX4CT.>J0@L2?K-;G0?K2>J1=I6BN4@J.:D7BM8DN6BL($.1=G&5A)4@6BN7@J%/9#,6-3>+2;-4=/7A(4@/=I7HT?O\IXaCTZ?KZAR^<KWAT_8GTFU^COZ>HS;CM<GN>EL=FM06><?D7;@CEJ9AHKU\MY_NZ^LX\MY]KWYHQTUZ]PUVKPOOTR腕類瞽繞槧瞶蜃桷瞰炮刄疼玻壺籔瘁斈榻玳壜渙舮掾猾珎處敲痾昧簪"0< .9.9F*5C!,:+9I/>O.>N3<N1>N.>M-=M+;K2CO+;H.>K4EM.>K3CP,;L2AQ9IV*:F,=F4=G*7C&4@4AO7EQ-8B#+4",3+<M)9F(6B *2!,4)1(3;$0:,4A)1>%0?+8F,8F5FR<K\8HX7GS7GS4DP5FR7EQ6DP7DP<IV8GO:IR9HQ?IT9EO*4",6+4>!-$0+7C"+ *4&0)/:+2;.5>.7@(4@-;G:KWDTa(7@"28)5+77GTEV_+=F+:C:GO)4<'0:)18.6=.4;#*126:,/41389AHCMT:FL0<@-9=.:>3@B*46;>B:?@=ACIRQ憚榴湶桎掉炒聰昊榑珈寃獰嶢輔聟毳寃籐籵巛槃矍壤湲框昧耻Д�梗�3CS+;K/?O&3A/<J2?M1AL/AL3=O3?Q1@P-=M/@L4ER,=J2BN0AJ-=I1AN*9I4CS:KW.>J->F/:G.;J'8E0?P8IU+9E%.8)1+<M/?L5CO*1 +3)1$/7#/:'3?)4C'4B)5C&7C2BS9IY1ET7IS;MX8JU4FQ8HT8HT6FR>NZ1GN;MU8LS=NX;JS0;F&/9;EN)7D&2>:GS0:C%/(!&2(/8(.71:D/;G*8D>NZBR_?MV<MTBLW;KSAPYGZa8IO5AJ>JP7BH8?H:BI:BI8>E(+326;/271386>EHRYKW]JVZ@LPAMRJVX>HKIKOHLM?IINYW仔綻搬俔簒殷忝宸聳噐嘲繃怡彁村恠慱殷桀嘸炬毯掖搜粳籀痣�����2EW4EW8GX&6C)5D.=H0AM,>F37M4=P1@P/AM0AM8IV,=J.=N,>F.>K.>K(7H6FV5FS-=J&8@+8G):G$3D/@Q6EV+8F'4@'2*<M1AN3AN)0'/)1%08'4>#1A$1@$6C'8E):K1AR3GV5GW9NY:OZ6KV:MX5HS5HS1AM:JW5OV3LT4JR7KS;JT1=G%0:4=G6ER*5B6BN2<F)3(2(-9$+4%$-7+7C*8D:JVBR_HV_DT[GS[FRZ?PW@PW>NTBPVKV\?IO;AK;CJ7<C@FM.1:15:58=79>4<CBLSERXHTXHTXFRVJVXFOSNSULSV=GGANLw��z���А疾惨捷廃�������y��o�xt�~�夙蛭沼静壁凉�v��v�����dx|*KS2QY0GR-?J.<H.:F7?L3;H1AI6FN7GT3BS/?Q3BR4@Q1>L-<D/>F4BN)6D0<J;IT1@H,:C4?I/;E+9E4BM8FR2>G+6=&06,9F7DQ:DK$.4#*1%,3*3<)2<06>/8@-7@*6?.<H2BM8IV8LY<JRAOX>LU=GR<GQ@KU@LVCLVEOWDMU:DK:DL2=D.4=04=?>H5BL%2;5AK5?I&/8"+4&-5%,5$-6,5?,4A-9E@MYBR^EV_9MTBRYGW^=MTAQX>NU>OVEV]:LS5?F=GN3<CGLT,3758=26;:=A6;BHOWJUXHTXJVZFTUDPR/=>=@E9@B;CGFQRizwaupn�~b{rl�^�ui��d}|[rp[ljcqk}�}m|cvw^uv��t���:w��|��.JT1JT2FQ/?K1@K4@L -8*"+,9/?L,<L4DT7FV&3C)7.7!09#1=,:9FT4BN'6>-6"-&0%4@5CN'5A)"*!(#4B0>J#,6'0%+$.%.7#,6'2(0:*3&3$2>6FR3DQ)=K,4!* /8$-!,6*5)3'1%/",&0$/+7B%/#03> )&02>H*3>'/$-6%+4&,5"+4(1;*3@/;G3AM@Q]CT]6JQ&6=-4,<CHX_2BI-=D3CJ1BI'1)3:%-419A!&*.3$(-,059?FGOV2;C+7;/;?/;@;GI9FHJPT?DI>IMIVXCQSbwt\sp_tsUthp��`|rczucvt[libpn}��y�������������z��{��n��4JV8KX<LY1>L+6D5?M(4C!-<,<D*:F2CP/>N-<M1AQ"3?"/=,4$1'5@$1?1>L,;F(5$3<(3=-;H"0<.?L1>J*5?(/ &&7E-;G%/"+ $(1&0)*4=&.<"-,9E:JV2CP(8F$5==NW$5>3AJ/>G.>G2=G'2<3CL-<E2CL3DM9HP/;E#,6;?J$4A#,/<E(2$.$(1"(1$!*4(1>'3?1?K=MZ8HQ(;B7FM?OVGW^BRYBRY=MT/?F0AH4=F@IR5=D@HO(-5.59,/41498=DFNUFPX?KN>NPAMQBNR<IJBJQ<FM<GM;IOy��~��|��x��]tpv��^wlUja\nfdvr_jnt�`m{s��x��w��fw�[j~m}�^l.>K.>K5BP/9G/:H0=K.?L(9E.;H1AM3DP,@O+>M7GW/?L+9D1@H)7C+7F"/=1=K7DR2@L-<D,8A+9E"3@2BO9IV1?K(1;(/,=K9FR7CM)1 *$-(1;!,5(1?*2@(5@)8C,=H3CO:KX9JW2EL5EN6GP5FP5CLN\eKZcN]f?PY7JR7IQ7JR7HR0?H&2<5?I4BO"/+7C;GQ!+#.!*3&/#,5'0:*3@&2>2@LAQ^EV_BU\BRY@PW?OVAQX@PWAQXCSZCT[2>EAJS+5>DLS05<+1947<48<1:@@JQEQWESZFVXBRUAMQ<GK?IPAMR1>F>MVv��w��l��r��cvz^qnXkbRdV\nay��cqxw��cp~z��v��{��}��fw�hw�dq�(7D*71>K1<J"/=3@N4DQ,=J2BN3BP1@Q+>M(;J7GT8HT)9F.>J-=I.>K&5E4CS7GT3DO,<I0>K/=I(8E4DP8HU8FR(4>(0(:G3DQ7CL&18"+ )1%0:'0>'2@+6D*8F0<J,=J<KY:LW>P[8KS8KS9LT9LT6GP5FO:KT>LU5IQ9LT8NU9NV7KR5FO+53<E5CO!/;+:F8DQ",!+6"+5$-7'08&/9'0=(4@-;G?O[CT]>RYJY`GW^=MTAQX?OVHX_AQXGW^/:BDOW6>H@IR-6<16=/6=45>/6??HQIU[GU[DRXBRTEQU=IM=JP=IN6BJ<KT`p}eu�N]nQdw:JPWfiVf^M^Q`ndhts���ir�Wfobt|Xht\mzOancrJYbJW_-@O1@P5DT-<L.;K1@Q1AR-AP0@M3EQ*=L)<K)<K4GT9KV,=F3CP4DQ4DQ)8H7EV8HT2BO.>J3@L->K$4A-=M<MY7EQ*6@!,3,=N4DQ6DP%/9'.",6)3<*2?)7H+8I,9F->K0@M9IV<NY;MX;QX6LT:MU=OW:NU;LU=NW<MV;MY<MY;OZ<Q\:LW4EQ*6/7E/@M!.:+9E7CO(5",6!,6"+5)2;&/9&/<'3?*8DAQ^BS\-AH$4;(/ 07AQX<LS&6=(8?$5<+4?BLV2;CBLT28B-5<06=4:A39B>GPLV_ESXCTZCQWCQX?JN=JP9EK6CK;FP;IVUfs[kxSbtcv}kz}bnn������{��qw����_otv��arzp��bs|ex~lz�brt2IX0ET6IX-<M,;K1AQ3CS+>M.>K8HX2ET+>M)<K2ER9KV+<E3CO6FS6EU)8H3BR8GW3CP2BN6DP1BO)8I2BR6EU6BP-9B"+5/@Q4DQ9GS)2<$.#-7'0>'4?)9I+:J,;K/?K,<I4DQ7JU:LW5JR9NV<QY9OW<NVAT\EX`?RZ;JW9KV9KV;MX9LW8FR!.94<I1BO$5B/<H7EQ(5!+4#-7",6)1:&/8%.;%1<.<HCS_AQZ&9@5EL:JQ?OVBRYEU\<LS@PWCTZ3<FEOY1;EDNW07@18A39?27>1:C=FOHU]BSZFV\CSYESY@LR>GOBKS3?ELW_ERZ>ITM]fZir���aqwグ����xz�{~����{��^mv���FVb���n~�x��{��DPV0M[0LZ7M]1EU0AQ2BR4DT.AO0?L4CT2ET*>P+AP4HT;OU,=E3CO3CP5CT+:J2AQ:IY2CO/?K8FR3CP(8I1AQ9IY7HT2>J)3/@Q1AN:HT(4>$.%.8(0>(5@(5J+9L-<L0?O6FR9IV5DP;LX5MU9MU:PX:OW@V^AS[AT\?RYBQ^=LY:LX<NY9HU6DQ"*82:G3DQ&7D.:I2AM"/;"+9#-7 *5(19*3<*3A%2>(7C?O\HYb:NUBRYEU\CRY;KRFV]IX_:JQGW^1=H>HR.8CAIS09C.5>04>49@/8A>IQER[FW^DTZBRXDRX?JQ@KN=HK<FM7CI:FLAOVSagVbir��K^epy�ccstp~lhrvyx���cn~w��z��s��q�����goz~��?O\?NZ7FR1?K1>K2AQ/?P.?S/CO.AN3FU.>O*:K5EU9JX0@M2BO4DQ4DQ-=J2BO8IU5ER0@N4BN0@M"2?1AR8HT6DP.:C",6+<I:JV4EM(7@%/%2<'/=.6E*:A+9E,<I/>N.=N:JW8KV9MT7JR;NV<OWCU]>QYBU]<OWAT\=QXBU];NU;NV=QX3BJ(2/8A.<I+9E0<H8DN&0:$/8&/9&.7$0;)2<+5?.8A+4>=LUDU^>RZ>PWDV]CV]@RYEX_FX_ASZEY`9EK<HN2<C?IP.6=6;B06=4:A7;D;BILX^KX^EU[?SVARU6HJ?HS:EN7AIGPTCLOGSTT`dQac7JRJ[bS_e[gjo{~��■絢|��Xqvt��r}���l��m��Zovo|�/>O8IV<LY0>J8ES4CS/?P.?R3FR2ER6IX0@Q,<M4DT8IV-=J2BO3CP4DQ-=J0@M5ER0@M.>K/=I2BO 0=1AR?O\7DP0<E"+5+<J9IU3EM+:C%/#/9&.<,5C,<D,:F*:G,:K/>N9IU;MX>RY:MU9LT8KS7JR@S[@S[>QYCV^=PX>QY=PX:MU:MU2AJ ,61;D;JV*8D6BN8DN*4>",6%.8&/8%1;)2<+5?,6@7@JAPYGXa-@H7GM2AH+;B1AHCSZ#3:$4;%5<)/4AG09@@KQ08?.7>27>39@9>G:BIIU[ESYCSZCSVBSV9JM<IQ;GM:EI?HL:ED?HKNZ\OZ^5HO8FM[gk_kmZeikv}t��x��_u{n~����r}�t��u��ct}x��':H%5E$1!2=$1,;K1AR0AU1DQ3FS4GV.>O.>O7GW9KW.>K4DQ6FS7GT0@M/?L9IV6FS-=J1?K-=J#3@/?P7GT8FR0;E!+50AN9IU5FO0?H&0!.7&/<,5C+;C,:F):G-;L,;K3CP7IT:MU8KS9LT=PX?RZ9LT=PX@S[CV^AT\?RZ=PX8KS<PX4CL$0:09C4CO-;G/;G:FP,6@!+5%.8$-6%1<)3=*4>,6@3<F>NW>OX!5=)9@%5<-=DAQXAQX4DK>NU?OV9DJBNT2?DBLS29@/8?27>5;B3:D6=DHTZESY@QW@QTCQT6EHETZ<HL6CEAIIbjj^gfV\_NVY?MTT`d\ijJVXFRUix����i|�������U\i}��o~�u��_o|PZd,?Q*=K5FS,<I-=J.>J3CS3EV3FS6IV3FU.>O,<M5EU9JW.=J1AN4DQ6FS.>K4DQ8HU4DQ/?L2@L3CQ%5B1ARIYf/=I3>H!*42CP6FR0AJ-<E)3#/9&/<.6E'7?*8D*:G0?O2AQ5ER:LW:MT<OW;NV@S[=PX9LT@S[EX`?RZ>QYBU]=PX?RZ:NU4CL&2<1;D4BO/=I2=J7DM/8B$.8)2<$-6*6@+5?-7A-7A5>H<LUCT];OWAQX<LSAQX:JQGW^AQXEU\DT[6DJ<JP2>DBKR+5<19@*3:4:A29B0:AFRX@NTFSZDTVBRT8CGFVXBMR2?A=FEMQRBGG:AD9>CCOSP\^forIUWKV\���嗣殻甌惜y��fm|t|�t��{��lz�\er4K[1FT:NZ.?L.>K3CO1AQ4CU/BO3FS6IX/?P*:K4DT6HT1AN1AN3CP7GT0@M0@M8HU7GT/?L2@L4ER3CP+;L3CP4BN3?I)3=->K<LX7HP,;D ,6+5)2?.6E-=E-:G+<H,;K0?O8HT9KV<OV9LT<OW<OWBU]<OW?RZ;NVBU];NVAT\<OW;NV>QY4CL*6@09C6EQ3BN+7C<HR3=G#-7)1<&/8#/:-7A.8B-7A09D<LTGXaAU]DU[DT[@QX<MSBRYFW^P`gFW^;IO1@F3>DFRX-8?,3:.6=-6<3:C.8?EQV@OU>MSCNRFRV6@E@PSIVX0<>>FECLKGMP',1/7>?JNEQRNWZ?KM>KR\mx]t�[t�_t�@O_LVgw��x��r��������2J]4L\>P`/@M5EQ5ER2BS5EU2ER3FS1DS-=N)9J5EU7IU2AN3CP2BO4DQ.>K3CP9IV7GT.>K=KW.?L"2?3CS1AN1?K3?H,5?,=K9IU6GP-<E'1!-73;I(1?"2:9FS*:G,;K.=M5ER:LW<OV8KS<OW>QY?RZ=PX=PX<OWDW_?RZ>QY:MU?RZ:MU6EN-9C,6?4CO2@L*6B?KU7AK!+5*3=)1:)5@.8B-7A.8B3<F7FOEV_=QYKW_ANV4AI#081>F>KS(0 )&4:0>D7EK:FL/9@&18+3:/7>18A.8?COU>JP>MS@LP>JN4<@AMQIUY1>?:BF<EH>ILhtzx��>IPDPTN[\?KM8GJ4GNp��n��h���������4��ァ��Ч���0HZ4JZ<Q`2CP4DP4DQ1BO5DU5HU5HU3FU/?P'7H5EU:KX5DQ4DQ3CP6FS/?L4DQ9IV;KX/?L3@L/?MYiv6FV8HT5CN5AJ,6@+<J6FR6GP-<E%1;'4='/=19HP`h(6B0AN1@P.=N6FS=P[<OW8KS:MU<OW=PX8KS=PX>QY>QY:MU<OW=PX>QY>RY6DM0<F09C6DQ5CO)4A<HR8AK!+5&/9&/8(4>-7A,6@-7A/8B4CL;LUBV^$19$19.;C1>F8EM@MU5BJ;HP8IO:HN.<B<HN4AG-7>*5<+3:07@,6=BNT?KQDPVALP:BF5>A;HMGQY1<@=HL;GKCOWGXa2DP9IPCQXIUY=JLFUX;LS|��}��rヲ_v�hz�j�^z�]{�]u�\p�2M_+FV8M]/AN/AL4DO4ER:JW3ES3FS4GW0?Q*:L8HX:KX3BO/@M2BO7GT.?K0@L6GS;KX-=J8EP9IV��DSd7ES6CO5AJ/9B.?M6FR8IR/>G#/8&3<3:Gms�SbkAN[*:H0?O-<M3CP:MX5HP>QY9LT>QY?RZ=PX<OW>QY=PXARZ;NV:NU:NV:NU:GP5?J-5?4BO7ER)5B:FO>GQ*4>&/9)1:%1</9C-9B+7@/8B.<E<MV=RZCNX<HQDQYAMU:GN8EM&3<=ISCRX>NU7EK;FL;GM;EL:DK6>D6<F+4<?KQ=IPCPW?KO4>A9?C>GQ?IPHRYMV]KY_<PV@S_(AN4FP<MTHSZS^bFUWBU[OcoPitBc�Ke�Tl�Pj�Gj~Lp�Li�Tj�4EP6EQ4DP/<J/<0AM8KW.DP2JV)?K9LX1BN(9F6GT7JW.AN/;J6CQ4DQ*9J1@P3AS0@Q1AR0CTMbq���B^g2LU/AL:AO03C.=H9KV7JR0?H)/='-="2C��MejH]e/AL.<M1>N7DR>LX?PY9MU>QY?RZ>QY:MU?RZ?RZ>PX3SW>RZBN[BNZ7IWs��*AH"1:6BJ;HP.;C7GP5FN2>H1;E.7B$5>,5>43B12A0<H$6A/ALHSa=TT>RW>PWAS\*:C(6<>HMJWT>RW9MR6FL5FL8GM:GL?IP=GN9HK7FI;GK>IM@HLINS:@E=?D4AG?KQANTFPXCMT=GNBIP@FM7BH?JPGV\FTZJV_HX_JZ`P`fN]hO^jM\hO^jM\hL[gM\hN^j*<I 3@%6C.>K.>J3CS6JX=Ra*BNG]i5HU<LY):G6GT5IV.AN0<J4AO2BO+:K0?O1>Q8IZ2AS/CUt�����;V`9R\4EP6BN07F0?K8JV7JR2@I.4B2;IBRc�ごOfkEYaEWb1AN5AO;GV<MY=NW;NV=PX?RZ>QY:MU>QY>QY>PX3SW9NVAMYAP^���TnwEYd!3;5AH;HP4AI7GP7CM4AK8BL8AK-AH1<D58C38B(6B���j~�?N\>RW:OSASZ?PY?MW@PV:LOERT@TY<OT9IO9JP<JP=IO>HO=FN<KN8HK:FK:EI9DH9CF39>;@E@LP=IMDOS>IMBMQ>JM<GK7BF:FJ;GKCQWGU\JX^GW\EU\GW^EU^FV_EU^HW`HXaHW`HXaIYb4LX,BN8KZ/?O-=M4DT5GX5IZ~��Lbn?Q^6GT*;H6GT7JW1DQ1=K4AO1BO-=J,:K4CS/@O/?O*>PЬ�{��8S]?U`7IT4?K27G5CO6JQ7JR4BK09F5=KScsq��LglH_fCT_+;I1=L8FQ;LU:KT<PW9LT9LT>QY;NV>QY=PX=PX7RX<QY>MZ*:G��l��I`j>MZ1?H:IR8GP5@J8DN7CM;GRAIT0FJ:HN>GP<EO *詰�u��ASeAUY?PXBU[@PZDV]=PU@SVCVX=QVAUZ?OU=KQ>MS@LR=JPBJR=LN8HJ8CG4AD0;>+7:6?B=FJ6<ABGL/9<ENR=HL3=A?KO;FJ>JNAMQGVYFUWIW]JZ`HX^HX^P[cR]eS^fVahU`hWbjYdkYdl:T`5K[4JY1CT5GX<M`8H[;Pa���H^j>Q^/@M%6D3DQ6IV2ER1=K3@N1AN-=J.>K9IV7GW/?P,AW����Tlx<R\:LW5CO8@M4FN5IP4IR1BK;BO7AO���}��WpyI_jEYd>MY(8D4CP;LU;LU;NV<OW=PX;NV=PX=PX;NV<OW9U[>PX2AMFXh洩�y��CXgL[h6JP5FO9HQ;GQ8EO=GO>KS?KT6ML:LNBLTAOWJcn以�i��DWnDU[ASZ?QW>QX@SZ@TY?TY@UZHX^EU[?PUGU[APU@LQ7CI7CI?MS=KQ?NS@KQ:FL.:@8AI#.58<@>BF9>CAJMDOS;GJ@OR@OQFRVEPUJY[JY\HV\BRXIY^Ufl_hq`ir^gp`hqajsbjt`hr^gp0KWKdp1GV-AO1CT0AT1DZGZos��Rgr7KV6HS+=H1CN5IT/CN.:I5BP4DQ2BO1AO8HU3DQ3DQ1I`�廓���Nfq=S^:LW.;H9DP,=F6HQ2IN7HQ?JV,8I��Ut�F]hG]hDXc9KW*;C3DM=NW6IQ8KS<OW;NV<OW;NV=PX<OW>QY8QW>PX>N\Ym|�仰t��H_oETdH\g1CO:HQ:EP>IQ>IQ<IR>KQ9PP;MOBMU=NYi���袷q��@UnCV]BU]BS\FX^BT[CV]>PWI]cEV]HY`IV^IV^ANVCPXGT]KX`NZcVckUbjTbjWdlCPXLW_S_g\]fX^dPX_XbiS_eP^dP]cL\cQ]aUadTchYgmWejXhoXio\mt_jq`ksbmtcnualtbmt`ks^iq�義3GS4ER1AQ4DU7H[3I[|�����Lbm>R]<NY4FQ3EP5IT4HS)5C1>L1AN2BO6FR>NZ6HS3EPOh��案q��Net?S]BT_7GS8FR5HN4KQ2HN4GO7DQO^n��o��IaqAXgEXcDW_(9B5EN:MU;NV<OW=PX<OWAT\;NV<OW;NV?RZ7NS<OV>N[�����m��Ogyt��_z�:NY:JW@KUALT?IR=LQ?OU?SUAQW<LR7JU�コ俜e��BVn>OY@R^EV_BT\FW]CPY-4IV`=JRCPXERZFS[KX`MZbR_gUbjScjRbiPagT`hUbjZgnZgoWdl\enYaj]enWaiZgoZfnWgnVfm\go\goXemYgn\gq\ks\ks]mubmw`lv]irZeo]isalv]hrVak_qx0?HDR_8IV0@P.BS6L^核����Ndo=P[8JU5GR6HS7KV2FQ0<M5BP0AN3CP3CO=LY8KS8KS罫���w��BYhK]jI[eCR_.>J:LR2IN.GM5GO)9Feu��Ⅹe��]u�D[jGZeGZb/BH:MT6IQ9LT;NV=PX<OW=PX;NV<OW;NV>QY;PX=NZ(;G衝�~��m。Hav��p��>T_5ER>GQDMVBNSCQWFV\ARWERZCMW6JU���柿r��BWm:MZ?Q\8IRARXHUZXaj
  67. +bepSaiYfnYfn[hpWdlZgo\iq]iqYhrWfoYhq[ktUdm[jsZir[js[jr]ktZjrZirZir[js[js]lu\fo^hr]ir_kw^jv\kv\iwYftWgsQamO_kRbnM]iM]iM]iN^jgsy=IQDOY:HT6FS4IX/HX〆����BWc6JU8JU:LW7IT6KV4IS0<M8DR0@M7FS8HT(9ANah���t��Ws�OhzNdsL`lr����������z��{���Ν�揃鍍�サk��[q�AXhF\fO`gI[a@RX%7>&;B(9A)<C-@G5HO7JP?QX@RYBRZ<QX1@Ks���固�各k��Tl�酉���5NZ<LX@ITAISALR>KR9LM@MVAITHQ^1CO火��澗`}�BWj@QaNbmYjsYhm]gmbjr���41@gu|gt|cpxanvcpxamvZkqSdkZhpWfn[irZhq]ktXiqWhq[ltZlxYlvaq}`p|^o{ao{_ny^lxem{fm{amxbl{_hv\huZeuR]nL_lL_lL_lL_lJ^kI\iG[hFYgOjp2IN;LU8FR6FS3HW/JZ��v��>V\8MU3HP7IT4ER1AN1AN18;MX]ozey�k��j}�h~�PfsE]iG\gJ[eO_l^n~�������す�����さ�術�吃�����r��w��OfvI`pG^n{����ィ����音�┻���������・�����Σ�^δ勸累�歳�����Ur�袴�v��Gam>LT?HPESXAQWHV[HSY[ggO^cZp{d~���嫁d�@Yi7R^FakXkr`pyv��,1>kp~3YhpWgo\gr_ls]jqanu_ltbntWkyWkx[o{Xmx[ny^p{]oz\nz[nx^nz`p|aq}dqdqer�er�crz^nz[jvVgsPcrL`rKcsNfvOeqNepRerWguVfrUeqZgtWfoPjp;PV5HO;KW@P]2ET�荏�塞Yqw:PU6KS4IQ:LW5FSN^kbr~t��\nyRdoL`kM`mK^k>T`>T`4LX=S_\lyZkx>Raax����t��� ̄ャ������Ш���w��w��h~�\s�Yq�~������������\t�������┷�袷�Ⅸ���蛎�呼α��監��ゼt��y��宋�Σ<VbCR^ET\K[d>SZFXcQ]jK\aN`jXq�遮��栽�┝i��CZi=Vb9P[Ymt`kuYclX`mt{�06Ebs�_o|_o{_o{`nz^lxao{_lx[kxUfsTenTenSdmTfoTfoZirZjv]mxYiuScpScpYiuZhxVduTfpXhtUhuSfuSftRgxThyThzRhtPcpPdqSepXhuZjv\ktXgp\v|=T[3EP5DQ8HUL`l��p��G]b7LT5JR6GS9KV8IV8HU:IY7JT9KV>P[<P[ATb5HU9P[8OZ7M]9OZ粧�RboBVe9QaRl}���s」y�����������さ��y��n��n��Wp�t��y�����ザ�げ9JWl���ザ����管������竿�吃�嫁����Юs���Ю�桂�╋<Vd>MZ\myy������こ�安�古�屮置夷��砧���^t�DYh=T`9MXWhqbnxCLWHS\DMZ%,;as�^o|]n{Zkx_p}YjwQboYjx]jq]jr^ksbowiv~dqybowhu|ev�jz�jz�fw�`o�[m|TixPetPfuOfuQetNbsOctRduPbsM_qOcnPdoUfr_q}XiqRclRakQ`i^w�CYd/DN6HR8IV6GTl�H^j>QY9LT5IP6IT5FS8IU8HY:JZ7JT;MW8JU9LY6IV7JV7L[7L[4N]:Q`��@S`BUb=Ra7Qas��x�|��o�����x�����}��k��y��d}�h��[v�|��t���┿��DP`AUf������せ|��������曲�緩��だ{��z���Ь�そu��B\l?Q`Pdu�袷�叡�暇�����蕉�礒呑�戸t��]q�GVg<P]GYdTcl\iq`ksLU`8DNco|_itdoygr|hs}lt�eq~hu�iv�lu|nx~jt{ku}r}�v��r|�oyap�[jzSbrM`oK_pKbrIbrHaqGbrF_oGaqKcsMasPctTduTdvPbmYkvfz�\mvPajL_fIZ`EU\VnzDZf=P]<MZ:LW4FQ>P[9KV7HQ6GP7GS2BN7HU7GW9IX5EU8JT:KX8IV3FS6IV;M]5JY4IX3K]E^n��Rhs7MY6K[<Sc<Scay�x��{��������{��p��f��~��a}�f��j��y��t���吉m��Uaq2FXs��z���ぜw����機系�せ�暇���{��y��������泳|��AXh:K])=N�袷}���永���Ю�訊��v��l��Ul~M`oK\iCVcDUc?NWeszgrzZem1=Gkx���{�x~�u{x��z��w~�ox�t~�s~�s}�o{�lw�it}anz[hsTctN`qM^oI\mI_pI`rGbrF`pD_oIasJ`rOcuQds]m~aq~dt�\mvZjtVgqN`gL_fIY`FV]BRX]t�@Wf8NY7JW9KV5ER7FO7FO<KS7EQ5FR7GU5EQ,<L2BR5EW5FS5FS3DQ3GS3FV5GV2HV5JY+DX=Ug��Pfv@Va6LX:LY7JZ8PcMex������y��z��k��q�o��i��]y�h��z��p」�����O_lAVf3I\^w����黍����仝����ーw����n�ォ畜�稽k��AVgGVe8K]t��v�������y��p��GauB[n>VfCYhBTbFWaBWg>Q^>OXiv~v��}��$/7S_h������z��{��v}�w��x��x�n}�mz�iy�]lxWgsN`oObpM^oNasJ_rI_qG_pG_sHbuJcwFbvPfxNdwShy[o~`q~eu�Yiu]luK\eJ]dHZaEX_FV\AQWAPWBRXI`pNeu9N^=P]<NY?NW=JR<FN2@M1?K2@L0AN#2B#3C-=N4DU7HU6GT4ER6IX7JY3FU/DU/CT3Kb�弧���D_l=Ua5LX2ER;LY7N^7M]Ibr{��w��n��q��n��x��q��h��f}�y��o��巾��2Zr|>T`?QbQ^u������~���㌢��々}��x��x��}�堪否��c{�IXgETd8KZUp~�¨e}�L^tCXjEYl=OaG[h@R]DUa=RZAV]8O`8N[=QY[gox��jt|":CMclsgsxis{lw�iw�`o{[kwZjvUhwQcrQftLcrG^pG_sG`sG^uF`pFaqHauIbvIcvKcyMe|Nf}Xi}[n~aq�ZkxXhu[luN`gK[bL\cFV]M\dGV\CSYDTZ=PS;NQLctAXh=Ra9KXCT^DQYEQXIRZDO[6CO-:F,9G$+;-<M1@R5ER6FS3DQ2FU4GV1DS1DU*=N.E\暇����Zu�<T`FYd9JU@O\0JV;S_=VgB]nw�s��p��u��y��l��d~�h��~���������UtyLbm@N^NTiz�����Ь�|���┥}��y�����影�按~��Shw@OaBM[?P]*FQ2O]9Qa<K\AP`>M^BM\ANZ<MU?RY=RZ<QW6Ra9R^@RYCRXq{tyqv|gkoVdoTdpTdoK]kM`qJ`rI]sD\qI`oF`oE]nF^rE`tD`y=]tFeDcuHcwJexKg{Tl�Um�Un�Vo�lw�]i}_nWguM^hEW^GW]DUWDS[HX_>NTCTYCSYASU;OR@SVf��D_h6P\6P\5O[>YgB]kHcqTjtATaq�����o~�y�����t��r�������������x���`��E撻置��Vm|BXdATa?Rb8KZ>TXBZcF\i?ZjF`tk��p��m��w��s��j��g��}���㌢�吉�┝���7MY=P_.BSx�����せ�せ�B��y��{������映���d��FX^>QY@R]=OZ7HU=NZ9IY;K[;J[<MZ9JW:KX=N[<NY;MX<MX4IY3K[5M`/J[Gcx>ZoA]rB^q9Xr>Yt>XqBZsF^tBZqC[qF`sM_tK_tG_rB_tFcwFbzMgSi�Nk�Yt�Lg}^y�Wq�Wo~WlxLanHfkQjoEX_IY`IU]GW^ASZBT[=VV?TV>NTDOWEPXDOUCQT>OR_x�Piu7Q]4N\5O]:TbE^nOhx����げ���������������尭�����������������紘�鈎�奏�嘉���Vm|F\gI[h@Rb;N]DXXCV[K^fNaoVi|F`pv。}��|��z��o��q��v�┫刎�士�廓XpxC[g@Ud9M^t����x���せ���ゼ���{��d��Up�F]q?YjBT[BU]>P\:LW;LZ8JV:JZ9IZ4EQ6GT8IV<LZ8JU;MX=OZ:LW;LV<MU9LZ3HWJaqD[nC]mD]qA\qC^sD_tH_uBYpIbuJbuA]pKbzLe}Kf~Ml�Hg~Kk�Vp�]t�[w�`x�Icwp���ごj�KamNbnG`fI`eFX_GW^CPXAQW@SY=PW=STAUY>NUBMUFPXAMS?NQ=OPl��Sm{6P^2K[5O^:ScC[mLdul��������v「���~��~��m��q��l��}��{������サ�┨���肯�局v��k��?Sb@Ud@Ud=PbKZ^N]dTemZlvK^kYo{Umyw��~��z��{����甚�煮�敬��_{�?Ye>Tc.EUw�����������`y�k��;Sf@Wg>Vf0EU<S^5HV<NY;MX<NY=OZ8HV:KX3DQ5FS:KX8IV9JW8IV9KV6HS;LX:LY@KN@NT>NT9KUThwLcuGbuKfzMgzLezHeyEauLh{Kf~Hg}Gf|If�Kl�No�Su�Kk�Po�Sp�Ok�j�����y�}��p��at�I]hN_kCV^CT^BQZ@OX?NW?NW>OX:MU9MS@QZ>NV@LVAMW=KQ?MP=OPz��Xq�5N^6N`1I[;SeAYmH`ti��z�����Xs�uァg��Wu�q��〆{��|��r��}�����┰��テ��士��n��<RaE[j=Tc@WhL_hSeqXm{`s���������Ο�Ψ�����夏位紂述�景� ̄c��>Xf5Q^9Rb>Uem��?TfBUl:P^>Td?R_BVc9KU>P[5GR:IV<NY7IT4FQ+=H$28IV1BO8IV7IV5FS9JW6HS9KV9KW>QY8LT?MN@OU;MS7JUE^mJg{Mj�Jh�Pm�Pr�Xz�Vz�Tx�Jo�Vz�l��z��B��ア�ッ��玉�按�ス{。]q�UgyPdsL]jHYf=OZBU`AR[DU^>LV?MVAPY?PZ;KU<MV>MVAQY;IU>IVBNXAOUBSV@RSr��_w�5M_/GY1I[7OcC[oNfzr�v��w��b�Ie~=\u6Tp=^{Xw�c��l��k��}���Ь���ぜ�訊�肯|��p��C]k;Uc:Sc<Ud>WkE]qC^r�々���}�����╋�������┰�曩嬬�拡�営}��Vs�B`o<Vf6O_4L\AUg<K\6FX9LV<NY9KV;KW=MY8IQ6GO6HP@P^3CP4DQ(5,89IU7GS4DP6FS9IT8HT9IU8HU:KT;LU:KT7IQ=OW6JT5LZ]x����{��{�����}ζ~�{������顧エ��斤�遮j��`}�h��c~�JduRetI\lHYfDTbCT`CUa?RZ>OX>OV>PX4GNASZ7JQ:LSASZ>QXCQY;GQ7FOBQZ@NX@PV?PS=OP���d}�>Wg0HZ2J\7OaBZoNfzn��u�m��Xs�9Ti5Qj$A]"@]">RJh}s��q��u��w���〇�ゾ�赤�┰���VpIcs<Vf6O`4Pa9Yo@`wIg�m��r�����{��x��y�������粁���暗�営u��[t�@Zj6P`4N^3IX9KZ4DT:IZ9IT;KW:JV8HT7FR7GS7GS7GS5ER5EQp��+!1=7GS1AM1@M2BN9IU9IU:JW9JR;LU<MV<LU2IU7NY5KV2IX9Ti���t��r��t��y��zなy����緊�旨�在�╂Zz�Tp�LdzQiyF[kAWc=TaCTaCT`BT_?Q]?RY<OW>PY>PX:RW5MR5MQ6OS4JO;OT9LR;LR<HMBQT>MT9KS=OV<OTASU>OS|��k��D]m3L\4M]7OaBZlOgyn��x��s��\u�Ict-H\,Gb4S4GX,CS�劃��z�����}�����蒋�����c~�Jdt;Ue6Sb3O`7Ug@_rIf|Lh��⊆�∋�∈v������〆����紗�┰��q��Wn�>Vh<Wf2L\2M[6LX8HU8HU7HU7IU:JW9JV4ER5FS6GT6GS7FV8GWJZgRbo1AM:JW=NV3EM;KW9IU;KW6GP=NW;KU8JQ7IP6IQ7KR9LS;NV-BQHdxIe�Dh�Dd�Gk�Cj�Bi�Fo�Fh�Hd�Ka~E`pLdtNetPanJZhHXeDW_BU]?RZ>RY<OW>PX:OW8MU=SY9NTEdcDdc8WV+JI1MM2KK=OP:ILCQMDRP9KL@SV=QV>RV>NT=LO{��s��=We7O_6O_7P`B[kPhzq��z��i��Xn}=Wd0IZ,G_8T7EO/AN{���┯��z���〇���迅���Шu��[y�9Vd7Tc2Pa;V`A[iLeuTm�����8z��u��p�����|���������y��h|�<Qc=Wf4O_0KY1GS9KU<KW<MZ4CT3GV2ET4GW2FU3EW4GY2AR8GX0@M5ER5EQ8HU6GP3DM6ER4CP9HU<MV:JT8IS7JQ6IQ>PP:IK=KHBNO=MR6J[2Kd3Qq8Sx8Vw4Uu2Vo9\uMj[p�]l~QhtJ\gQ_kJV_T\fO\cDSZ=OU=PX:MU2IP;QX7NT7MT9MT#5>UuuCgfMqpRrsPmnF[].15>CMXPLYUburF[\DY^ATZ?NUN[bs��e��7Sd0JZ3L\6Pa@YmMh|x��}��}��\w�7Wj3Sf.F\'5O;R[7M_r���ぞ�ス�����α�舎�Ⅸ~��k��^y�<Wl5Sh3Rg3Wd<^mFbsQj~k��u��|��{��{��~�����航��x��s��x��e��=Wg<Ue6M]1EV3DV5EV7EZ3HR5JT5JT4GU5FS6GT/@M5FT6GO6GP6GP4EN:IR>MV6EN8GP7KS5HO9LS5IM6JO9JL<MP<JM:KN<MO=MS;LS4CKES_M[gKVd<P]CVcOcnWht_pxUfoYioRbhK]iGYdGYdGYdDWb>P[?Q\9KV4HO-;G7CO4@L2BIAWZ40SyqDyk?uf:oaH|jF{iP�pP�qN�mL�sU{p.A>{��ENQ0BA9SO4OKu��b��?Yj1JZ4M];SeB[pKg{}��t」n��h��4Ue3Sf+CY%3N5LU,BTr������┿�┯�ゞ���耐��q「h��Jcw?[o>Yn3Pe5Wf@]nHcwTk�d|�i��u��v��w��s�����杏�タ��v��r��k��Ics:Sc5L\8L]1CT6EV5DV3HR3GR3GR2ES2CP0AN2CP4DR3DM4EN8IR9KT>MV;JS:IR:HR6IP6HO9LS9IP<LR=MTAPS@OR:KM;JQ9HN9IP5DM?MYM[gFR`M_lZkyVhsSfpCR_UfnIYcXhqGYdDVa?Q[?Q\>PZ<NY9KV;MX1EL,:F5BN;CQUaj[mqXsq[{tI|oDvj;pcG|oCxiCxjEzlL�rc�|h���鴇�貼�匿�醜�茜���p。e��>Xi5N^8Qa;SeB[oLeys��l��v�Uq�<^m0Qd.DZ 0G/FP2H[�ダ����┿}��|���ー���㍉{��r��_x�D]r:Sh7Sd7Vi@^qGbwOf}Wo�t��t��t��y��w���そ�Ю�Я����w��r��Rl|:Sc6M]7K\2CT3EV5DV4HR2FQ1FQ4FQ3EP5HS9IU8GT;MT4FM3FM<LS<LS9IP9IP:FN7GN8IO:JQ<IQ;IO>MR>MSCNT;OS;NS7IP9KRL]fJZfO_k`p|]mzTdq[kwUdpOalHYeGZb>RXBS`=N[AR_;LY7HU9JW:KX4FS1AM6EP6>L!+2;EBNRFXWf|xTwJunN|rM}tExnG|rHqK�v?�pG�wC�ui�q正u尊r庚�鳥~��f��B\m?Xh7P`?WiHauIbvt��r��o��[u�8Zj5Sf)?V!.EE\f?Ug�肝���7~��q���ダ�塵��v��w���シZq�>Wh4M]:UkC^sHcxNh}Xs�w��}��v���ズ~���Ю�Ю���ゼ��~��r��Un~<Vf5N^/FV2EW3EV4GV6IV3FT4FQ5GR6HS3CO2BN:KS;NT;MT=MT<LS=NTANV>KS<IQ:GO>KS>KSANV:GPALT<GO>HP2EK9KR:MSFW`N`hRbnP`lO_kP]kKWfJ[fGWcBT^?S^DYc<Q[<MZ;LY7HU6GT6HU:LY2CP8IW1BM2@L<FP"(1;CJHQV(21&&*CA )&?]Z`�}V~wS~wQ~wU�|J��D�xEvM��r紺o振}幼5�zu��m��BZl?XhCYi@VhMeyc|�v��s「~��\v�<Zk2Pa&>R$1IAXb8Na���Юt���2������壮�┿}���ЦWn~L`o<R^=S_8PhBYpIdyPm�^z�w��w��z��y��t���〇�����〃��~��v��\x�;Uf6O^1HX3HW4GV2FU6FS6GT6HS6HT5FO5FO3EN4EO;KQAQX:JQ<LSBNV?LT9FN:HP<GO<GOAKS?LT<IP5AI/<D>KR;LUEV_^ow[ltO_kTdpQamO`lKXdIWbBR_@P]?O\>Q^:NZ;N[;KX7GT3DP1AN7GS9IV3CP5FR0=K.:F1;E")35;@JOR"'*"''46-/ $"!=:Xurs�~r��Z��:�u^�o険M~zg��y��o��Nfx?VfAXhF\nf~����t��~��q��f��=\k/M^(=R!.E1HRAWi���Ю}���3�����績�ジ��2^s�3FS7IT3FM9RhE^rIdyPm�Zy�k��{��{���ゝ���〆���ゾ��{��~��|��f��?Yj2K[6M]3HW1FU4GS4ER6GT7IT6FR8IR1DK6FM;KR;KR=MT7HN?LT>KS<IQ=JS@KS?JR9FN9FN<IQ5AKCR[=LTCRZdt�]myu��Wfs^nzK[gAP]HXdGWcBQ]JZgAQ^:KX:KW8HX9IY:IY7FV8GW6EU2AQ5DT0?O0@P,7H%.='0;%,8>CEJM&)- #(-/527:48;7>A!!"1-&FAc��r��s�����s「u「^v�Riyj��p��y�����{���ゝ��x��:Zi0N_(=R!-C4>1GY�勤y��w��{���ズħ�壮����n��ZlyJ\g:KT/AG5K_C[mFavKjSr�j��r��u�v�����〆�暇���せ�┰��w��l��<Xi4N]4M^1GV/EP.EQ9IV7HU<LW8GT5FO>NU9IN=MS<LR<LR9JP@NT=KQ>MS>JP:FL6CL8DM7HO<LSGU_7HQVfr[jwGZdj|�CU`PbmDVaAS^GYdAS^7IT7IT9JW4ER6FR6EV9HX8GW5DT7FV3BR8GW5DT5DT2AQ0@P-5F$+:"+5%-+2527:69= #$(-25-25!$) "###$ )>;;<DG"47%9?q��o��j��u��w��ez�v��|��k��|�����m��:Zi6Rc&<N ,C3<EZm���w�������繋�沌ッ���c{�Wiv?PX+=D*9?8M`6P`Nk|Gh{Uu�q��y��{��s��z���ゾ�僅��������ヽ�5s��=Yj1K[8Qa5L[4JU0GS8HU2BO9HU5FO&7A<LSBRX4DJ:IO;KQ=KQ>LR9GM9EJ/;A5AG7EJ=MT?OUAR[WgpZlwM_jXjuQaoM]kJ\gFXcAS^>P[:LW<MX;PZ6JU<P]2CO6EU8GW<GY4?Q5DT3BR6EU4CS2AQ2AQ1@P,=L+0D!'7(2$';EH!$$ #+-(*  %&/12!%53,;=..7WLY���l��q��d}�r��q��u��w��|��z��g��j��G^m;P^1CP-@M0HXゾ��携������㍉���桂�赦�����s��PetAR^:KS:JQ3DR4GVRg|Nfg�z��n��v��{������ζ��闇|���ズv��q��e��>\o=Wf7Q_;Q]6JU7HS1FQ4HT6KS9KS7IP6FM;IO>IO:PR7LM:MU3EM1AN%7@=KU;KQ?QX:LSWip[msQbkRclVgpPajCV^J]e@S[<OV=OZ@R]7IS:KW4DT;K[:JZ7GW5EU9IY8HX3CS4DT2BR1AQ9HX1@P.=M.>N.;K$/='4#,!&!%/45#"#(' .,,&!"+"O93D($gRQqgj�~�r��j��r��n��w��m��~��v��|�����i��^x�Ohx@WgCWfMap�_�菊�ザ����己�嫁�管�出�局��~��az�EZi6FSARZ8GP/BM/CRJ_u\t�y��s�u��w��~���9�闇ζ��Ь~��~��r���ズ{��:Xk5N^9Tb:O[9MW3GR4FQ7IT9LT9MU6IO9IP<JO;GM9IK<JP1>F:FP1>J@LX?KULWbSfm\nuQcjQcjL]fHYbK\eFW`GZb>QY:MT>P[7IT:LW6GT7HT6FV9IY8HX6FV7GW8HX7GW7GW3CS3CS1AQ3BR/>N,<L3@P,9I$/=%3!*#!"022###  $3';.(60-#'&|����z���ゾ~�����{��z���Шu��[v�r��Nhy@Xj�価����ジ�������拡�曳�桐�故�㍉���z��6JY9KU4EM5DL6GS,<L8Oa������Ь�ゞ�ヾ{���闇�扎斧��x���┰x�����a��:Xk=Wg:Sc;Qa4JU6HV3EP6IP7HQ8GP9HQ:GN;IQ<GO<FM6?H5>G19FAJWZbp\fpfnyNahFX_GY_@QZHYbEV_;LTFUbDW_:MT;MX5GR:LV3CQ3DQ4FR3CT5EU4DT3CS6FV6FV5EU4DT1BR/?O/>N.=M-<L0=M0=M*7H&1?$1%!&) &((!##% "LFHQMI]]T$) #.'CSL)%�位�����タ��}���杏���嬰�廓�㌢v��g���嬰r�����桐�蒋���撹�簡�緩�������尽��t��VlwVhs7GS<JV2CL5FS3E�緩�タ�Ю�Ы�����紗ζ��跡�{��|��w��~��a��Yw�6RcA[k9P_:Q`5KW5HO7HQ8GP7CM@LV:EO:FP:EP2<C:FP6BNlv�ケ�������WgqJ\cBT[HYb6GP?QY;KW;KW<KX9MT3EP>P[2DO6GT2CP6GT3EQ3CS3CS4DT7GW4DT5EU3CS->N2AQ.=M0?O.=M.;K+8H2?O#1A"0*& &6<=%%% ebdLNLAIB&!)"&�θ�英�Dv���ち����{��m��s�Ws�s���橘�����仝た�Я���靭�伊�志��������甚��l��OdoDVa;KW8ER7FO/@N*>Qu、�た�Ю���竿���子�訊~���ズュ��ズ�シm��Rq�@[l=Vh9Rb:Qa6M]:MS9JS5DM:FP:DM4@L3AM:JV?U\-AL景��Т�饗m��RhsLdkCT]HYb?PY>PX:JW<LX=MY9IU3EP9KV2DN.>L3DQ4ER4ER3CS3CS2BR3CS1AQ4DT6FV4DT/?O1@P2AQ.=M1>N0=M-;K2<M#,>(6"/#-$$)*  %!&XWY@ECCJE87.\RKgXRz�j��j��x�����t��l��t��{��f��o�����〆��v��y��Aa����}����ョ������杏�管��[t�Kak;MX9HT8ES4DJ2BO.CTBZq�〇���以����づ��跡�ャ���t��n��|��v��`~�B]n=Wh:Te9Qa1K[4HO6IQ6DM2=J,8D0>JDVa9KX�������Lguw��Nfr=Va<W^9IR@QZ7HP?O[7GS8HT8HT3CP3EP1CN5FS1BO.?L3DP3CS1AQ5EU3CS3CS1AQ3CS4DT3CS/?O2AQ1AQ0=M/<L0=M/9J+5F$.@!,:&4$. %!!&'     475GHF>3/ub]B)%b��h��q��v��q��v�����v��m��pァ����タ��}��~�{���づ�ηv�����δ}��ー��⊃�ュ�|��j��E\d@RZ:JW6BS9FL/?L/AS0H^���ゾ�核�簡��C������すz��s��{��w��g��<Xh=Yj;Uf8Rc2L^7NU4IQ+<D8COAO[;JWx���仮�クRm|l��F]mYn}7JW9KV=QX>NX:KT9JS7GS2BN:JU6FS9HV2EO.?L5FS1BO0AM1AQ1AQ1AQ2BR2BR2BR2BR1AQ3CS4DT3CS2AQ0=M0=M/<L0:K1;L)3D(2C#.<)6$."'$), ! !#()
  68. +!" &'%&$$ /(%$OD=k��y…�詠�ぢ��������������仨���歌{/���と{��r��o������g��|―������w��E\dCV]7FT>K[9FM3CP*<M$<R�果������㌧�Ю���仝�����{��|��s��r��m��k��>Ym=Yj:Te8Rc6Pb1KQ/FO9IR>KX����Ⅵ}��^x�[v�f}�Oct:L]BQbAN\;GSDMW;MV5GO1AM5EQ5EQ5ER9IV3BO1BO/@M3DQ/@L3CS/?O0@P2BR0@P0@P2BR3CS0@P1AQ1AQ1AQ,9I0=M1>N'4D+5F1;L'1B'1C"-;!*7$.$*&+/&*+"'((,-".+%-,#"%$#!!,+'/+*=98%-&
  69. \ No newline at end of file
  70. diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/Makefile b/host_applications/linux/apps/hello_pi/hello_wayland/Makefile
  71. new file mode 100644
  72. index 0000000..c9ddf23
  73. --- /dev/null
  74. +++ b/host_applications/linux/apps/hello_pi/hello_wayland/Makefile
  75. @@ -0,0 +1,5 @@
  76. +OBJS=triangle.o
  77. +BIN=hello_wayland.bin
  78. +LDFLAGS+=-lwayland-client -lwayland-egl
  79. +
  80. +include ../Makefile.include
  81. diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h b/host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h
  82. new file mode 100644
  83. index 0000000..663e23b
  84. --- /dev/null
  85. +++ b/host_applications/linux/apps/hello_pi/hello_wayland/cube_texture_and_coords.h
  86. @@ -0,0 +1,100 @@
  87. +/*
  88. +Copyright (c) 2012, Broadcom Europe Ltd
  89. +All rights reserved.
  90. +
  91. +Redistribution and use in source and binary forms, with or without
  92. +modification, are permitted provided that the following conditions are met:
  93. + * Redistributions of source code must retain the above copyright
  94. + notice, this list of conditions and the following disclaimer.
  95. + * Redistributions in binary form must reproduce the above copyright
  96. + notice, this list of conditions and the following disclaimer in the
  97. + documentation and/or other materials provided with the distribution.
  98. + * Neither the name of the copyright holder nor the
  99. + names of its contributors may be used to endorse or promote products
  100. + derived from this software without specific prior written permission.
  101. +
  102. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  103. +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  104. +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  105. +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
  106. +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  107. +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  108. +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  109. +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  110. +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  111. +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  112. +*/
  113. +
  114. +// Spatial coordinates for the cube
  115. +
  116. +static const GLbyte quadx[6*4*3] = {
  117. + /* FRONT */
  118. + -10, -10, 10,
  119. + 10, -10, 10,
  120. + -10, 10, 10,
  121. + 10, 10, 10,
  122. +
  123. + /* BACK */
  124. + -10, -10, -10,
  125. + -10, 10, -10,
  126. + 10, -10, -10,
  127. + 10, 10, -10,
  128. +
  129. + /* LEFT */
  130. + -10, -10, 10,
  131. + -10, 10, 10,
  132. + -10, -10, -10,
  133. + -10, 10, -10,
  134. +
  135. + /* RIGHT */
  136. + 10, -10, -10,
  137. + 10, 10, -10,
  138. + 10, -10, 10,
  139. + 10, 10, 10,
  140. +
  141. + /* TOP */
  142. + -10, 10, 10,
  143. + 10, 10, 10,
  144. + -10, 10, -10,
  145. + 10, 10, -10,
  146. +
  147. + /* BOTTOM */
  148. + -10, -10, 10,
  149. + -10, -10, -10,
  150. + 10, -10, 10,
  151. + 10, -10, -10,
  152. +};
  153. +
  154. +/** Texture coordinates for the quad. */
  155. +static const GLfloat texCoords[6 * 4 * 2] = {
  156. + 0.f, 0.f,
  157. + 1.f, 0.f,
  158. + 0.f, 1.f,
  159. + 1.f, 1.f,
  160. +
  161. + 0.f, 0.f,
  162. + 1.f, 0.f,
  163. + 0.f, 1.f,
  164. + 1.f, 1.f,
  165. +
  166. + 0.f, 0.f,
  167. + 1.f, 0.f,
  168. + 0.f, 1.f,
  169. + 1.f, 1.f,
  170. +
  171. + 0.f, 0.f,
  172. + 1.f, 0.f,
  173. + 0.f, 1.f,
  174. + 1.f, 1.f,
  175. +
  176. + 0.f, 0.f,
  177. + 1.f, 0.f,
  178. + 0.f, 1.f,
  179. + 1.f, 1.f,
  180. +
  181. + 0.f, 0.f,
  182. + 1.f, 0.f,
  183. + 0.f, 1.f,
  184. + 1.f, 1.f,
  185. +};
  186. +
  187. diff --git a/host_applications/linux/apps/hello_pi/hello_wayland/triangle.c b/host_applications/linux/apps/hello_pi/hello_wayland/triangle.c
  188. new file mode 100644
  189. index 0000000..1a7bfc4
  190. --- /dev/null
  191. +++ b/host_applications/linux/apps/hello_pi/hello_wayland/triangle.c
  192. @@ -0,0 +1,666 @@
  193. +/*
  194. +Copyright (c) 2012, Broadcom Europe Ltd
  195. +All rights reserved.
  196. +
  197. +Redistribution and use in source and binary forms, with or without
  198. +modification, are permitted provided that the following conditions are met:
  199. + * Redistributions of source code must retain the above copyright
  200. + notice, this list of conditions and the following disclaimer.
  201. + * Redistributions in binary form must reproduce the above copyright
  202. + notice, this list of conditions and the following disclaimer in the
  203. + documentation and/or other materials provided with the distribution.
  204. + * Neither the name of the copyright holder nor the
  205. + names of its contributors may be used to endorse or promote products
  206. + derived from this software without specific prior written permission.
  207. +
  208. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  209. +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  210. +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  211. +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
  212. +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  213. +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  214. +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  215. +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  216. +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  217. +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  218. +*/
  219. +
  220. +// A rotating cube rendered with OpenGL|ES. Three images used as textures on the cube faces.
  221. +
  222. +#define _GNU_SOURCE
  223. +
  224. +#include <stdio.h>
  225. +#include <stdlib.h>
  226. +#include <string.h>
  227. +#include <math.h>
  228. +#include <assert.h>
  229. +#include <unistd.h>
  230. +#include <sys/socket.h>
  231. +#include <sys/un.h>
  232. +
  233. +#include <wayland-egl.h>
  234. +#include <wayland-client.h>
  235. +
  236. +#include "GLES/gl.h"
  237. +#include "EGL/egl.h"
  238. +#include "EGL/eglext.h"
  239. +
  240. +#include "cube_texture_and_coords.h"
  241. +
  242. +#define PATH "./"
  243. +
  244. +#define IMAGE_SIZE 128
  245. +
  246. +#ifndef M_PI
  247. + #define M_PI 3.141592654
  248. +#endif
  249. +
  250. +
  251. +typedef struct
  252. +{
  253. + uint32_t screen_width;
  254. + uint32_t screen_height;
  255. +// OpenGL|ES objects
  256. + EGLDisplay display;
  257. + EGLSurface surface;
  258. + EGLContext context;
  259. + GLuint tex[6];
  260. +// model rotation vector and direction
  261. + GLfloat rot_angle_x_inc;
  262. + GLfloat rot_angle_y_inc;
  263. + GLfloat rot_angle_z_inc;
  264. +// current model rotation angles
  265. + GLfloat rot_angle_x;
  266. + GLfloat rot_angle_y;
  267. + GLfloat rot_angle_z;
  268. +// current distance from camera
  269. + GLfloat distance;
  270. + GLfloat distance_inc;
  271. +// pointers to texture buffers
  272. + char *tex_buf1;
  273. + char *tex_buf2;
  274. + char *tex_buf3;
  275. + struct wl_display *wl_display;
  276. + struct wl_registry *wl_registry;
  277. + struct wl_shell *wl_shell;
  278. + struct wl_shell_surface *wl_shell_surface;
  279. + struct wl_compositor *wl_compositor;
  280. + struct wl_surface *wl_surface;
  281. + struct wl_callback *wl_callback;
  282. + struct wl_egl_window *wl_egl_window;
  283. + int needs_update;
  284. + int ellapsed_frames;
  285. + int kill_compositor;
  286. + int single_frame;
  287. + int terminate_abruptly;
  288. +} CUBE_STATE_T;
  289. +
  290. +static void init_ogl(CUBE_STATE_T *state);
  291. +static void init_model_proj(CUBE_STATE_T *state);
  292. +static void reset_model(CUBE_STATE_T *state);
  293. +static GLfloat inc_and_wrap_angle(GLfloat angle, GLfloat angle_inc);
  294. +static GLfloat inc_and_clip_distance(GLfloat distance, GLfloat distance_inc);
  295. +static void redraw_scene(CUBE_STATE_T *state);
  296. +static void update_model(CUBE_STATE_T *state);
  297. +static void init_textures(CUBE_STATE_T *state);
  298. +static void load_tex_images(CUBE_STATE_T *state);
  299. +static void exit_func(CUBE_STATE_T *state);
  300. +
  301. +static void
  302. +registry_handle_global(void *data, struct wl_registry *registry,
  303. + uint32_t name, const char *interface, uint32_t version)
  304. +{
  305. + CUBE_STATE_T *state = data;
  306. +
  307. + if (strcmp(interface, "wl_compositor") == 0) {
  308. + state->wl_compositor =
  309. + wl_registry_bind(registry, name,
  310. + &wl_compositor_interface, 1);
  311. + } else if (strcmp(interface, "wl_shell") == 0) {
  312. + state->wl_shell = wl_registry_bind(registry, name,
  313. + &wl_shell_interface, 1);
  314. + }
  315. +}
  316. +
  317. +static void
  318. +registry_handle_global_remove(void *data, struct wl_registry *registry,
  319. + uint32_t name)
  320. +{
  321. +}
  322. +
  323. +static const struct wl_registry_listener registry_listener = {
  324. + registry_handle_global,
  325. + registry_handle_global_remove
  326. +};
  327. +
  328. +/***********************************************************
  329. + * Name: init_ogl
  330. + *
  331. + * Arguments:
  332. + * CUBE_STATE_T *state - holds OGLES model info
  333. + *
  334. + * Description: Sets the display, OpenGL|ES context and screen stuff
  335. + *
  336. + * Returns: void
  337. + *
  338. + ***********************************************************/
  339. +static void init_ogl(CUBE_STATE_T *state)
  340. +{
  341. + EGLBoolean result;
  342. + EGLint num_config;
  343. +
  344. + static const EGLint attribute_list[] =
  345. + {
  346. + EGL_RED_SIZE, 8,
  347. + EGL_GREEN_SIZE, 8,
  348. + EGL_BLUE_SIZE, 8,
  349. + EGL_ALPHA_SIZE, 8,
  350. + EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
  351. + EGL_NONE
  352. + };
  353. +
  354. + EGLConfig config;
  355. +
  356. + state->wl_display = wl_display_connect(NULL);
  357. +
  358. + state->wl_registry = wl_display_get_registry(state->wl_display);
  359. + wl_registry_add_listener(state->wl_registry, &registry_listener, state);
  360. +
  361. + wl_display_dispatch(state->wl_display);
  362. +
  363. + // get an EGL display connection
  364. + state->display = eglGetDisplay(state->wl_display);
  365. + assert(state->display!=EGL_NO_DISPLAY);
  366. +
  367. + // initialize the EGL display connection
  368. + result = eglInitialize(state->display, NULL, NULL);
  369. + assert(EGL_FALSE != result);
  370. +
  371. + // get an appropriate EGL frame buffer configuration
  372. + result = eglChooseConfig(state->display, attribute_list, &config, 1, &num_config);
  373. + assert(EGL_FALSE != result);
  374. +
  375. + // create an EGL rendering context
  376. + state->context = eglCreateContext(state->display, config, EGL_NO_CONTEXT, NULL);
  377. + assert(state->context!=EGL_NO_CONTEXT);
  378. +
  379. + // create an EGL window surface
  380. + state->screen_width = 1024;
  381. + state->screen_height = 860;
  382. +
  383. + state->wl_surface = wl_compositor_create_surface(state->wl_compositor);
  384. + state->wl_shell_surface = wl_shell_get_shell_surface(state->wl_shell, state->wl_surface);
  385. +
  386. + wl_shell_surface_set_toplevel(state->wl_shell_surface);
  387. + wl_shell_surface_set_title(state->wl_shell_surface, "triangle.c");
  388. +
  389. + state->wl_egl_window = wl_egl_window_create(state->wl_surface, state->screen_width, state->screen_height);
  390. +
  391. + state->surface = eglCreateWindowSurface( state->display, config, state->wl_egl_window, NULL );
  392. + assert(state->surface != EGL_NO_SURFACE);
  393. +
  394. + // connect the context to the surface
  395. + result = eglMakeCurrent(state->display, state->surface, state->surface, state->context);
  396. + assert(EGL_FALSE != result);
  397. +
  398. + // Set background color and clear buffers
  399. + glClearColor(0.15f, 0.25f, 0.35f, 1.0f);
  400. +
  401. + // Enable back face culling.
  402. + glEnable(GL_CULL_FACE);
  403. +
  404. + glMatrixMode(GL_MODELVIEW);
  405. +}
  406. +
  407. +/***********************************************************
  408. + * Name: init_model_proj
  409. + *
  410. + * Arguments:
  411. + * CUBE_STATE_T *state - holds OGLES model info
  412. + *
  413. + * Description: Sets the OpenGL|ES model to default values
  414. + *
  415. + * Returns: void
  416. + *
  417. + ***********************************************************/
  418. +static void init_model_proj(CUBE_STATE_T *state)
  419. +{
  420. + float nearp = 1.0f;
  421. + float farp = 500.0f;
  422. + float hht;
  423. + float hwd;
  424. +
  425. + glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
  426. +
  427. + glViewport(0, 0, (GLsizei)state->screen_width, (GLsizei)state->screen_height);
  428. +
  429. + glMatrixMode(GL_PROJECTION);
  430. + glLoadIdentity();
  431. +
  432. + hht = nearp * (float)tan(45.0 / 2.0 / 180.0 * M_PI);
  433. + hwd = hht * (float)state->screen_width / (float)state->screen_height;
  434. +
  435. + glFrustumf(-hwd, hwd, -hht, hht, nearp, farp);
  436. +
  437. + glEnableClientState( GL_VERTEX_ARRAY );
  438. + glVertexPointer( 3, GL_BYTE, 0, quadx );
  439. +
  440. + reset_model(state);
  441. +}
  442. +
  443. +/***********************************************************
  444. + * Name: reset_model
  445. + *
  446. + * Arguments:
  447. + * CUBE_STATE_T *state - holds OGLES model info
  448. + *
  449. + * Description: Resets the Model projection and rotation direction
  450. + *
  451. + * Returns: void
  452. + *
  453. + ***********************************************************/
  454. +static void reset_model(CUBE_STATE_T *state)
  455. +{
  456. + // reset model position
  457. + glMatrixMode(GL_MODELVIEW);
  458. + glLoadIdentity();
  459. + glTranslatef(0.f, 0.f, -50.f);
  460. +
  461. + // reset model rotation
  462. + state->rot_angle_x = 45.f; state->rot_angle_y = 30.f; state->rot_angle_z = 0.f;
  463. + state->rot_angle_x_inc = 0.5f; state->rot_angle_y_inc = 0.5f; state->rot_angle_z_inc = 0.f;
  464. + state->distance = 40.f;
  465. +}
  466. +
  467. +/***********************************************************
  468. + * Name: update_model
  469. + *
  470. + * Arguments:
  471. + * CUBE_STATE_T *state - holds OGLES model info
  472. + *
  473. + * Description: Updates model projection to current position/rotation
  474. + *
  475. + * Returns: void
  476. + *
  477. + ***********************************************************/
  478. +static void update_model(CUBE_STATE_T *state)
  479. +{
  480. + // update position
  481. + state->rot_angle_x = inc_and_wrap_angle(state->rot_angle_x, state->rot_angle_x_inc);
  482. + state->rot_angle_y = inc_and_wrap_angle(state->rot_angle_y, state->rot_angle_y_inc);
  483. + state->rot_angle_z = inc_and_wrap_angle(state->rot_angle_z, state->rot_angle_z_inc);
  484. + state->distance = inc_and_clip_distance(state->distance, state->distance_inc);
  485. +
  486. + glLoadIdentity();
  487. + // move camera back to see the cube
  488. + glTranslatef(0.f, 0.f, -state->distance);
  489. +
  490. + // Rotate model to new position
  491. + glRotatef(state->rot_angle_x, 1.f, 0.f, 0.f);
  492. + glRotatef(state->rot_angle_y, 0.f, 1.f, 0.f);
  493. + glRotatef(state->rot_angle_z, 0.f, 0.f, 1.f);
  494. +}
  495. +
  496. +/***********************************************************
  497. + * Name: inc_and_wrap_angle
  498. + *
  499. + * Arguments:
  500. + * GLfloat angle current angle
  501. + * GLfloat angle_inc angle increment
  502. + *
  503. + * Description: Increments or decrements angle by angle_inc degrees
  504. + * Wraps to 0 at 360 deg.
  505. + *
  506. + * Returns: new value of angle
  507. + *
  508. + ***********************************************************/
  509. +static GLfloat inc_and_wrap_angle(GLfloat angle, GLfloat angle_inc)
  510. +{
  511. + angle += angle_inc;
  512. +
  513. + if (angle >= 360.0)
  514. + angle -= 360.f;
  515. + else if (angle <=0)
  516. + angle += 360.f;
  517. +
  518. + return angle;
  519. +}
  520. +
  521. +/***********************************************************
  522. + * Name: inc_and_clip_distance
  523. + *
  524. + * Arguments:
  525. + * GLfloat distance current distance
  526. + * GLfloat distance_inc distance increment
  527. + *
  528. + * Description: Increments or decrements distance by distance_inc units
  529. + * Clips to range
  530. + *
  531. + * Returns: new value of angle
  532. + *
  533. + ***********************************************************/
  534. +static GLfloat inc_and_clip_distance(GLfloat distance, GLfloat distance_inc)
  535. +{
  536. + distance += distance_inc;
  537. +
  538. + if (distance >= 120.0f)
  539. + distance = 120.f;
  540. + else if (distance <= 40.0f)
  541. + distance = 40.0f;
  542. +
  543. + return distance;
  544. +}
  545. +
  546. +static pid_t get_server_pid(CUBE_STATE_T *state)
  547. +{
  548. + struct ucred ucred;
  549. + socklen_t len;
  550. + int fd;
  551. +
  552. + fd = wl_display_get_fd(state->wl_display);
  553. + len = sizeof ucred;
  554. + getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &ucred, &len);
  555. +
  556. + return ucred.pid;
  557. +}
  558. +
  559. +static void
  560. +frame(void *data, struct wl_callback *callback, uint32_t time)
  561. +{
  562. + CUBE_STATE_T *state = (CUBE_STATE_T *) data;
  563. +
  564. + state->needs_update = 1;
  565. +}
  566. +
  567. +static const struct wl_callback_listener frame_listener = {
  568. + frame
  569. +};
  570. +
  571. +static void
  572. +update(CUBE_STATE_T *state)
  573. +{
  574. + if (!state->single_frame || state->ellapsed_frames == 0) {
  575. + update_model(state);
  576. + redraw_scene(state);
  577. + }
  578. +
  579. + state->wl_callback = wl_surface_frame(state->wl_surface);
  580. + wl_callback_add_listener(state->wl_callback, &frame_listener, state);
  581. +
  582. + if (state->ellapsed_frames == 100) {
  583. + if (state->kill_compositor) {
  584. + fprintf(stderr, "reached frame 100, killing compositor\n");
  585. + pid_t pid = get_server_pid(state);
  586. + kill(pid, SIGTERM);
  587. + } else if (state->terminate_abruptly) {
  588. + fprintf(stderr, "reached frame 100, terminating right away\n");
  589. + exit_func(state);
  590. + exit(0);
  591. + }
  592. + }
  593. +
  594. + if (!state->single_frame || state->ellapsed_frames == 0)
  595. + eglSwapBuffers(state->display, state->surface);
  596. + else {
  597. + wl_surface_damage(state->wl_surface, 0, 0, state->screen_width,
  598. + state->screen_height);
  599. + wl_surface_commit(state->wl_surface);
  600. + }
  601. +
  602. + state->ellapsed_frames++;
  603. +}
  604. +
  605. +/***********************************************************
  606. + * Name: redraw_scene
  607. + *
  608. + * Arguments:
  609. + * CUBE_STATE_T *state - holds OGLES model info
  610. + *
  611. + * Description: Draws the model and calls eglSwapBuffers
  612. + * to render to screen
  613. + *
  614. + * Returns: void
  615. + *
  616. + ***********************************************************/
  617. +static void redraw_scene(CUBE_STATE_T *state)
  618. +{
  619. + // Start with a clear screen
  620. + glClear( GL_COLOR_BUFFER_BIT );
  621. +
  622. + // Draw first (front) face:
  623. + // Bind texture surface to current vertices
  624. + glBindTexture(GL_TEXTURE_2D, state->tex[0]);
  625. +
  626. + // Need to rotate textures - do this by rotating each cube face
  627. + glRotatef(270.f, 0.f, 0.f, 1.f ); // front face normal along z axis
  628. +
  629. + // draw first 4 vertices
  630. + glDrawArrays( GL_TRIANGLE_STRIP, 0, 4);
  631. +
  632. + // same pattern for other 5 faces - rotation chosen to make image orientation 'nice'
  633. + glBindTexture(GL_TEXTURE_2D, state->tex[1]);
  634. + glRotatef(90.f, 0.f, 0.f, 1.f ); // back face normal along z axis
  635. + glDrawArrays( GL_TRIANGLE_STRIP, 4, 4);
  636. +
  637. + glBindTexture(GL_TEXTURE_2D, state->tex[2]);
  638. + glRotatef(90.f, 1.f, 0.f, 0.f ); // left face normal along x axis
  639. + glDrawArrays( GL_TRIANGLE_STRIP, 8, 4);
  640. +
  641. + glBindTexture(GL_TEXTURE_2D, state->tex[3]);
  642. + glRotatef(90.f, 1.f, 0.f, 0.f ); // right face normal along x axis
  643. + glDrawArrays( GL_TRIANGLE_STRIP, 12, 4);
  644. +
  645. + glBindTexture(GL_TEXTURE_2D, state->tex[4]);
  646. + glRotatef(270.f, 0.f, 1.f, 0.f ); // top face normal along y axis
  647. + glDrawArrays( GL_TRIANGLE_STRIP, 16, 4);
  648. +
  649. + glBindTexture(GL_TEXTURE_2D, state->tex[5]);
  650. + glRotatef(90.f, 0.f, 1.f, 0.f ); // bottom face normal along y axis
  651. + glDrawArrays( GL_TRIANGLE_STRIP, 20, 4);
  652. +}
  653. +
  654. +/***********************************************************
  655. + * Name: init_textures
  656. + *
  657. + * Arguments:
  658. + * CUBE_STATE_T *state - holds OGLES model info
  659. + *
  660. + * Description: Initialise OGL|ES texture surfaces to use image
  661. + * buffers
  662. + *
  663. + * Returns: void
  664. + *
  665. + ***********************************************************/
  666. +static void init_textures(CUBE_STATE_T *state)
  667. +{
  668. + // load three texture buffers but use them on six OGL|ES texture surfaces
  669. + load_tex_images(state);
  670. + glGenTextures(6, &state->tex[0]);
  671. +
  672. + // setup first texture
  673. + glBindTexture(GL_TEXTURE_2D, state->tex[0]);
  674. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0,
  675. + GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf1);
  676. + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST);
  677. + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST);
  678. +
  679. + // setup second texture - reuse first image
  680. + glBindTexture(GL_TEXTURE_2D, state->tex[1]);
  681. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0,
  682. + GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf1);
  683. + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST);
  684. + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST);
  685. +
  686. + // third texture
  687. + glBindTexture(GL_TEXTURE_2D, state->tex[2]);
  688. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0,
  689. + GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf2);
  690. + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST);
  691. + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST);
  692. +
  693. + // fourth texture - reuse second image
  694. + glBindTexture(GL_TEXTURE_2D, state->tex[3]);
  695. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0,
  696. + GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf2);
  697. + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST);
  698. + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST);
  699. +
  700. + //fifth texture
  701. + glBindTexture(GL_TEXTURE_2D, state->tex[4]);
  702. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0,
  703. + GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf3);
  704. + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST);
  705. + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST);
  706. +
  707. + // sixth texture - reuse third image
  708. + glBindTexture(GL_TEXTURE_2D, state->tex[5]);
  709. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, IMAGE_SIZE, IMAGE_SIZE, 0,
  710. + GL_RGB, GL_UNSIGNED_BYTE, state->tex_buf3);
  711. + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (GLfloat)GL_NEAREST);
  712. + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (GLfloat)GL_NEAREST);
  713. +
  714. + // setup overall texture environment
  715. + glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
  716. + glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  717. +
  718. + glEnable(GL_TEXTURE_2D);
  719. +}
  720. +
  721. +/***********************************************************
  722. + * Name: load_tex_images
  723. + *
  724. + * Arguments:
  725. + * void
  726. + *
  727. + * Description: Loads three raw images to use as textures on faces
  728. + *
  729. + * Returns: void
  730. + *
  731. + ***********************************************************/
  732. +static void load_tex_images(CUBE_STATE_T *state)
  733. +{
  734. + FILE *tex_file1 = NULL, *tex_file2=NULL, *tex_file3 = NULL;
  735. + int bytes_read, image_sz = IMAGE_SIZE*IMAGE_SIZE*3;
  736. +
  737. + state->tex_buf1 = malloc(image_sz);
  738. + state->tex_buf2 = malloc(image_sz);
  739. + state->tex_buf3 = malloc(image_sz);
  740. +
  741. + tex_file1 = fopen(PATH "Lucca_128_128.raw", "rb");
  742. + if (tex_file1 && state->tex_buf1)
  743. + {
  744. + bytes_read=fread(state->tex_buf1, 1, image_sz, tex_file1);
  745. + assert(bytes_read == image_sz); // some problem with file?
  746. + fclose(tex_file1);
  747. + }
  748. +
  749. + tex_file2 = fopen(PATH "Djenne_128_128.raw", "rb");
  750. + if (tex_file2 && state->tex_buf2)
  751. + {
  752. + bytes_read=fread(state->tex_buf2, 1, image_sz, tex_file2);
  753. + assert(bytes_read == image_sz); // some problem with file?
  754. + fclose(tex_file2);
  755. + }
  756. +
  757. + tex_file3 = fopen(PATH "Gaudi_128_128.raw", "rb");
  758. + if (tex_file3 && state->tex_buf3)
  759. + {
  760. + bytes_read=fread(state->tex_buf3, 1, image_sz, tex_file3);
  761. + assert(bytes_read == image_sz); // some problem with file?
  762. + fclose(tex_file3);
  763. + }
  764. +}
  765. +
  766. +//------------------------------------------------------------------------------
  767. +
  768. +static void exit_func(CUBE_STATE_T *state)
  769. +{
  770. + // clear screen
  771. + glClear( GL_COLOR_BUFFER_BIT );
  772. + eglSwapBuffers(state->display, state->surface);
  773. +
  774. + // Release OpenGL resources
  775. + eglMakeCurrent( state->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );
  776. +
  777. + wl_egl_window_destroy(state->wl_egl_window);
  778. + wl_shell_surface_destroy(state->wl_shell_surface);
  779. + wl_surface_destroy(state->wl_surface);
  780. +
  781. + eglDestroySurface( state->display, state->surface );
  782. + eglDestroyContext( state->display, state->context );
  783. + eglTerminate( state->display );
  784. +
  785. + wl_display_flush(state->wl_display);
  786. +
  787. + // release texture buffers
  788. + free(state->tex_buf1);
  789. + free(state->tex_buf2);
  790. + free(state->tex_buf3);
  791. +
  792. + printf("\ncube closed\n");
  793. +} // exit_func()
  794. +
  795. +static int running = 1;
  796. +
  797. +static void
  798. +signal_int(int signum)
  799. +{
  800. + running = 0;
  801. +}
  802. +
  803. +//==============================================================================
  804. +
  805. +int main (int argc, char *argv[])
  806. +{
  807. + struct sigaction sigint;
  808. + CUBE_STATE_T state = {0,};
  809. + int ret = 0;
  810. + int i;
  811. +
  812. + for (i = 0; i < argc; i++) {
  813. + if (strcmp(argv[i], "--kill-compositor") == 0)
  814. + state.kill_compositor = 1;
  815. + if (strcmp(argv[i], "--single-frame") == 0)
  816. + state.single_frame = 1;
  817. + if (strcmp(argv[i], "--terminate-abruptly") == 0)
  818. + state.terminate_abruptly = 1;
  819. + else if (strcmp(argv[i], "--help") == 0 ||
  820. + strcmp(argv[i], "-h") == 0) {
  821. + printf("Usage: hello_wayland.bin [OPTION]\n\n");
  822. + printf("\t--kill-compositor\tkill the Wayland compositor after 100 frames\n");
  823. + printf("\t-h, --help\t\tshow this text\n");
  824. + printf("\t--single-frame\t\tupdate the display only once\n");
  825. + printf("\t--terminate-abruptly\texit right after rendering the 100th frame\n");
  826. + return 0;
  827. + }
  828. + }
  829. +
  830. + // Start OGLES
  831. + init_ogl(&state);
  832. +
  833. + // Setup the model world
  834. + init_model_proj(&state);
  835. +
  836. + // initialise the OGLES texture(s)
  837. + init_textures(&state);
  838. +
  839. + sigint.sa_handler = signal_int;
  840. + sigemptyset(&sigint.sa_mask);
  841. + sigint.sa_flags = SA_RESETHAND;
  842. + sigaction(SIGINT, &sigint, NULL);
  843. +
  844. + state.needs_update = 1;
  845. + while (running && ret != -1) {
  846. + if (state.needs_update) {
  847. + update(&state);
  848. + state.needs_update = 0;
  849. + }
  850. +
  851. + ret = wl_display_dispatch(state.wl_display);
  852. + }
  853. +
  854. + exit_func(&state);
  855. +
  856. + return 0;
  857. +}
  858. +
  859. --
  860. 2.27.0