0,U<8…P,О}0юО•Ї№p8Зd%qy)6o;]ЩAІіsяїєєєЖЖЅVl†3( 0џџџџџџџџ2Tv˜КмўяЭЋ‰gE#2Tv˜Кмў2Tv˜Кмў џџџџџџџџџџџџџџџџџџџџџџџџ!џџBџџџAџџџ!џџџџџџџџџџџџёџџџ!$ёB@DDD""DD!D$ёB$ёB$ёB$ёB$ёB@DDDD""BD"$ё$ёџџ$ёџџ$ёџџ$ёџџDDDD$""B!"џџџџџџџџџџџџџџџџџџџџ@DDDD""BD"$ё$ёџџ$ёџџ$ёџ/$ёџAџџџAџџџ!џџџџџџџџџџџџёџџџџџџ$ёџџ""""""#""!"!"""""""""#""""!#"""""""""""!2""тн"2ђю-"""""!"#""""""""""""""ЊЊ"Ђ™™"ЊЙ›"›ЙЋ"Л™™"™™Њ""""""#"ЊЛšЙЊš™š™Њ™ЊЊ™™™Њš™Љ™™™š""""""""ЛЊ""Й›*"Њ™*"™™*"™™*#™™*"""""""""""""""""""""""""""""""""UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU$ђD$ё/B$ёB$ёB$ёB$ёBDё/B$ё/Dџџџџџџџџџџџџџџџџџџџёџџџ!$ёB$ёџD$ёB"ё"џџџџџџџџё"ё"DђBџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDDDD$""B!ё!џџџџџџџџё"ё"DђBDDDD$""B!ё!џџџџџџџџџџџџџџџ$ёџџ@DDD""DD!D$ёB$ёBD!BD""D@DD"""#"""т"ўт."ђ""т/""/""ў"""2""""""""""2"r&""f'"#r"""""2""""Ђ™™"Ђ™™"ЂЙЉ"Ђš™"’КЛ"’К™"’ЙЛ"’™™™™™šЛ›™™ЊЊš™™š™Љ™Њš™›™™ЛЊšЉЛ™™™™™™)"Й™™"ЙЛ™!ЊЊ™"Й™š"›™Њ"š™Љ#™™Љ""™™™"ЊЛЛ"ЊЋЊ"š™™"šЛЛ"“Њš""!#"""™Й™™™Й™™Њ™™Њ™™™Й)"™Й"#"™""!#"""™™Њ"Л™*"šš"!Лš""›Њ""Њš"""""#"""DBD43C433D243$B43DD34$D3CDд4CC442DDD233г2$343$BDBDDC2D2C2D$DBD4D4CD$4=43333C44D4DCDDDCCCD4DDC4$DCD$D434#C333CDD3444#D4D24MC24CD"DBФ4cCUv\Ef6U&B4cDФ34$U5CФe6CCf63DC43$C3C$D43DD33Dд31444141!"!33Dд2D4DBDBD3D"C#M3D"33C!"#"DCDC4DDCDD4DDC4DCDDCC4D#D##!"4CD$CD4$DD4#4C$3DDC$C4C#A#"!"3Df73$s7У%D3UeD3lfд3a744141!"!DD@DDD@D@D@DDD@DD@DDD@DDD@D@D@DDD@D@D@DDD@DDD@D@""""""""!2""тн"2ђю-"""""!"#""""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#""""""#"""т"ўт."ђ""т/""/""ў"""2""""""""""2"r&""f'"#r"""""2"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""DDDD$""B!"џџџџџџџџџџџџџџџџџџџџDDDD$""B!"џџџџџџџџџџџџџџџџџџџџDDDD$""B!"џџџџџџџџџџџџџџџџџџџџDDDD$""B!"џџџџџџџџџџџџџџџџџџџџDDDD$""B!"џџџџџџџџџџџџџџџџџџџџDDDD$""B!"џџџџџџџџџџџџџџџџџџџџDDDD$""B!"џџџџџџџџџџџџџџџџџџџџDDD$""D"!DёBџџBџџBџџBџџB""""""#""!"!"""""""""#""""!#""""""#"""т"ўт."ђ""т/""/""ў"""2"@DDD""DD!D$ёB$ёB$ёB$ёB$ёB""""""#""!"!"""""""""#""""!#"""""""""""!2""тн"2ђю-"""""!"#""""џџџџџџџџџџџџџџџџџџџџ"$""BDDDDџџџџџџџџџџџџџџџџџџџџџџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџDџџ/BџџBџџBџџBџџBџџ/Bџџ/D"""""""""2"r&""f'"#r"""""2"""""""""#""!"!"""""""""#""""!#"""DџB$џ$џџ$ёџџ$ёџџ$D$""DDDDDDDD$""B!"џџџџџџџџ"""$DDDDDDDD$""B!"џџџџџџџџ"""$DDDDCD$D434#C333CDD3444#D4D24MC24CD"Dђџџ$ђџџ$ёџџ$ёџџ$ёџџ$ёџџ$ђџџDёџџџџџџџџџџџџџџџџџџџџџџ"$""BDDDDџџџџџџџџџџџџџџџџџџџџ"$""BDDDDџџџџџџџџџџџџџџџџџџџџџџџџџџ$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџBџџџ!џџџџџџџџџџџџџџџџџџџџџџџDDD$""D"!DёBџџBџџBџџBџџB""""""#""!"!"""""""""#""""!#"""2DDD233г2$343$BDBDDC2D2C2D$DBD4D4CD$4=43333C44D4DCDDDCCCD4DDC4$D4CD$4=43333C44D4DCDDDCCCD4DDC4$D4CD$CD4$DD4#4C$3DDC$C4C#A#"!"$ёB$ёB$ёB$ёB$ёBD!DD""DDDDD2DDD233г2#343#BD2CDC2D2C2D$DBD4DCD$D434#C333CDD3444#D4D24MC24CD"Dџџ$џџ$џџ$ёџџ$ёџџ$D$""DDDDџџџџџџџџџџџџџџџџџџџџ"$""BDDDDџџџџџџџџџџџџџџџџџџџџ"$""BDDDDџџџџџџџџџџџџџџџџџџџџ"$""BDDDDџџBџџBџџBџџBёB"!D$""DDDDD""""""#""!"!"""""""""#""""!#"""DDDDD""DD!D$ёB$ёBD!BD""DDDDDDCDC4DDCDD4DDC4DCDDCC4D#D##!"4D4D4DDCDCDDDC4D4DD42DC4!21D"!2""""""#""!"!"""""""""#""""!#"""DBD43C433D243$B43DD34$D3CDд4CC4433Dд2D4DBDBD3D"C#M3D"33C!"#"4CD$CD4$DD4#4C$3DDC$C4C#A#"!"2DDD233г2#343#BD2CDC2D2C2D$DBD4D4CD$4=43333C44D4DCDDDCCCD4DDC4$DDBT4cCUvUEf6U&B4cDT34$U5CTe6CCf64CD$4=43333C44D4DCDDDCCCD4DDC4$DCD$D434#C333CDD3444#D4D24MC24CD"""""""#""!"!"""""""""#""""!#"""DBT4cCUvUEf6U&B4cDT34$U5CTe6CCf6""""""#""!"!"""""""""#""""!#"""""""""""!2""тн"2ђю-"""""!"#"""""""#"""т"ўт."ђ""т/""/""ў"""2"3DC43$C3C$D43DD33Dд31444141!"!""""""#""!"!"""""""""#""""!#""""""""""""2"r&""f'"#r"""""2"""33Dд2D4DBDBD3D"C#M3D"33C!"#"DCDC4DDCDD4DDC4DCDDCC4D#D##!"3Df73$s7У%D3UeD3lfд3a744141!"!DCDC4DDCDD4DDC4DCDDCC4D#D##!"4CD$CD4$DD4#4C$3DDC$C4C#A#"!"""""""#""!"!"""""""""#""""!#"""3Df73$s7У%D3UeD3lfд3a744141!"!""""""#""!"!"""""""""#""""!#""""""""""""2"r&""f'"#r"""""2"""""""""#""!"!"""""""""#""""!#"""""""""""!2""тн"2ђю-"""""!"#""""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#""""""""""""2"r&""f'"#r"""""2""""""""""""2"r&""f'"#r"""""2"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#"""""""""""!2""тн"2ђю-"""""!"#"""""""#"""т"ўт."ђ""т/""/""ў"""2"""""""#""!"!"""""""""#""""!#"""""""""#""!"!"""""""""#""""!#""""""""""""2"r&""f'"#r"""""2"""""""""#""!"!"""""""""#""""!#"""""""""""!2""тн"2ђю-"""""!"#""""""""""#""!"!"""""""""#""""!#""""""#"""т"ўт."ђ""т/""/""ў"""2" DD@DD@DD@DD@DDDDЬLФЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬЬ™ ™™ ™™ ™" "6  >ШР?3DC4DBD4BDD$""""""""BDDDDDD$""""""""""""""""""""""""""""""""""""""""""""""""""""BDD$""""""""""""""""""""""""""""""""""""3$C33C43D""D""#"""#"D""B""BD""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"D""D""#"""#"""#"""#"""#"""#"""#"""#"""#"C$D43D24D!D"!"!"!"!D"!B"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!D!D"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!3DD33$B4$ёB""""""""$ёџџB""""""""""""""""""""""""""""""""""""""""""""""""""""$ёB""""""""""""""""""""""""""""""""""""3Dд33DD3$ёB""""""""$ёџџџџB""""""""""""""""""""""""""""""""""""""""""""""""""""$ёB""""""""""""""""""""""""""""""""""""14444$D3D!B"#"""#""$ёџџџџB"#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#""$ёB"#"""#"""#"""#"""#"""#"""#"""#"""#""141CDд4D""D""!#""!#$ёџџџџ!B""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#$ёB""!#""!#""!#""!#""!#""!#""!#""!#""!#!"!CC44BDD$""""""$ёџџџџ!D"""""""""""""""""""""""""""""""""""""""$ёB"""""""""""""""""""""""""""""""3DC4DBD4BDDDDDDD$ёџџџџBDDDDDDDDDDDDDDDDDDDDDDD$""""""""BDD$""""""""""""""""$ђD""""""""""""""""""""""""""""""""""""""#"3$C33C43D$""$""Bёџџџџџ!$""B$""B$""B$""BB"""""BD""#"""#"D""D""#"""#"""#"""#"$ё/B""#"""#"""#"""#"""#"""#"""#"""#"""#""!"!C$D43D24$!ё!ёџџџџџџ!"!"!"ё!!B"!"!"!"!D!D"!"!"!"!"!"!"!"!$ёB"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!""""3DD33$B4$ёџџџџџџёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB""""""""$ёB""""""""""""""""$ёB""""""""""""""""""""""""""""""""""""""""3Dд33DD3$ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB""""""""$ёB""""""""""""""""$ёB"""""""""""""""""""""""""""""""""""""#""14444$D3$џџџџџџџџџџџџџџџџџџџџџџџџџџџџ"!B"#"""#""$ёB"#"""#"""#"""#""$ёB"#"""#"""#"""#"""#"""#"""#"""#"""#""""!#141CDд4D$""џџџџџџџџџџџџџџџџџџџџџџџџџџ!$""B""BD""!#""!#$ёB""!#""!#""!#""!#Dё/B""!#""!#""!#""!#""!#""!#""!#""!#""!#"""!"!CC44BDDD$ёџџџџџџџџџџџџџџџџџџџџџџџџBDDDDDDD$""""""$ёB""""""""""""$ё/D"""""""""""""""""""""""""""""""""""3DC42DDDDђџџџџџџџџџџџџџџџџџџџџџџџџD4CD$CD$D""""""""$ђD""""""""BDDDDDDD$ёџDDDDDDDD$""""""""""""""""""""""""""""""#"""#"3$C3233г$ђџџџџџџџџџџџџџџџџџџџџџџџџ/B4=43434#""#"""#"$ё/B""#"""#"D$""B"""$ёBB"""""BD""#"""#"""#"""#"""#"""#"""#""!"!"!"!C$D42$34$ёџџџџџџџџџџџџџџџџџџџџџџџџB333CC333"!"!"!"!$ёB"!"!"!"!$!"ё"!!B"!"!"!"!"!"!"!"!"!"!"!"!"!"!""""""""3DD33$BD$ёџџџџџџџџџџџџџџџџџџџџџџџџB44D4CDD3""""""""$ёB""""""""$ёџџџџџџџџџџџџџџџџB""""""""""""""""""""""""""""""""""""3Dд3BDDC$ёџџџџџџџџџџџџџџџџџџџџџџџџBDCDD444#""""""""$ёB""""""""$ёџџџџџџџџџџџџџџџџB"""""""""""""""""""""""""""""#"""#""14442D2C$ёџџџџџџџџџџџџџџџџџџџџџџџџBDCCCD4D2"#"""#""$ёB"#"""#""$"ё"!B"#"""#"""#"""#"""#"""#"""#""""!#""!#1412D$D$ђџџџџџџџџџџџџџџџџџџџџџџџџ/BD4DD4MC2""!#""!#Dё/B""!#""!#D$""$""B"ё"$""B""BD""!#""!#""!#""!#""!#""!#""!#""""""!"!BD4DDёџџџџџџџџџџџџџџџџџџџџџџџџ/DC4$D4CD"""""""$ё/D""""""BDDDDDDDDђBDDDDDDD$"""""""""""""""""""""""""""""""""33DдDџџџџџџџџџџџџџџџџџџџџџџџџBDCDC4CD$""""""""$ђD""""""""2DDD4CD$$ёB4CD$CD$D""""""""""""""""""""""""""""""#"""#"""#"2D4D$џџџџџџџџџџџџџџџџџџџџџџџџB4DDCCD4$""#"""#"$ё/B""#"""#"233г4=43$ёB4=43434#""#"""#"""#"""#"""#"""#"""#""!"!"!"!"!"!BDBD$џџџџџџџџџџџџџџџџџџџџџџџџBDD4DDD4#"!"!"!"!$ёB"!"!"!"!2$34333C$ёB333CC333"!"!"!"!"!"!"!"!"!"!"!"!"!"!""""""""""""3D"C$ёџџџџџџџџџџџџџџџџџџџџџџџџBDC4D4C$3""""""""$ёB""""""""3$BD44D4$ёB44D4CDD3""""""""""""""""""""""""""""""""""""""""#M3D$ёџџџџџџџџџџџџџџџџџџџџџёBCDDCDDC$""""""""$ёB""""""""BDDCDCDD$ёBDCDD444#"""""""""""""""""""""""""""""#"""#"""#"""33C$џџџџџџџџџџџџџџџџџџ"!DC4D#C4C#"#"""#""$ёB"#"""#""2D2CDCCCD!DDCCCD4D2"#"""#"""#"""#"""#"""#"""#""""!#""!#""!#!"#"D$""џџџџџџџџџџџџџџџџџ!$""DD#A#""!#""!#Dё/B""!#""!#2D$DD4DDD""DD4DD4MC2""!#""!#""!#""!#""!#""!#""!#"""""""""BDDD$џџџџџџџџџџџџџџџџBDDD$#!""!"""""""$ё/D""""""BD4DC4$DCDDDC4$D4CD""""""""""""""""""""""""""""""""""""""2DDDDџџџџџџџџџџџџџџџџBCD$D""""""""""""""""$ёB""""""""33DдDCDCDBФ4DCDC4CD$""""""""""""""""""""""""""""""#"""#"""#"""#"233г$џџџџџџџџџџџџџџџџB434#""#"""#"""#"""#"$ёB""#"""#"2D4D4DDCcCUv4DDCCD4$""#"""#"""#"""#"""#"""#"""#""!"!"!"!"!"!"!"!2$34$џџџџџџџџџџџџџџџџBC333"!"!"!"!"!"!"!"!$ёB"!"!"!"!BDBDDD4D\Ef6DD4DDD4#"!"!"!"!"!"!"!"!"!"!"!"!"!"!""""""""""""""""3$BD$ёџџџџџџџџџџџџџџџџBCDD3""""""""""""""""$ёB""""""""3D"CDC4DU&B4DC4D4C$3""""""""""""""""""""""""""""""""""""""""""""BDDC$ёџџџџџџџџџџџџџџёB444#""""""""""""""""$ёB""""""""#M3DCDDCcDФ3CDDCDDC$"""""""""""""""""""""""""""""#"""#"""#"""#""2D2C$""""!DD4D2"#"""#"""#"""#""D!D"#"""#"""33CC4D#4$U5C4D#C4C#"#"""#"""#"""#"""#"""#"""#""""!#""!#""!#""!#2D$DD$""$""B$""B$""B$""D4MC2""!#""!#""!#""!#D""D""!#""!#!"#"D#CФe6D#A#""!#""!#""!#""!#""!#""!#""!#""""""""""""BD4DCDDDDDDDDDDDDDDDDDDD4CD"""""""""""""CDD4""""""#!"CCf6#!""!""""""""""""""""""""""""""""""""""""""33Dд2DDDDBФ44CD$4CD$CD$D4CD$""""""""""""""""DBФ4""""""""""""""""3Df7""""""""""""""""""""""""""""""""""""""#"""#"""#"""#"2D4D233гcCUv4=434=43434#CD4$""#"""#"""#"""#"cCUv""#"""#"""#"""#"3$s7""#"""#"""#"""#"""#"""#"""#"""#"""#""!"!"!"!"!"!"!"!BDBD2$34\Ef6333C333CC333DD4#"!"!"!"!"!"!"!"!\Ef6"!"!"!"!"!"!"!"!У%D3"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!""""""""""""""""3D"C3$BDU&B444D444D4CDD34C$3""""""""""""""DDU&B4""""""""""""""""UeD3""""""""""""""""""""""""""""""""""""""""""""""""""""#M3DBDDCcDФ3DCDDDCDD444#DDC$"""""""""""""BDDdDФ3""""""""""""""""lfд3"""""""""""""""""""""""""""""""""""""#"""#"""#"""#"""33C2D2C4$U5DCCCDCCCD4D2C4C#"#"""#"""#"""CDD4$U5"#"""#"""#"""#""a744"#"""#"""#"""#"""#"""#"""#"""#"""#""""!#""!#""!#""!#!"#"2D$DCФe6D4DDD4DD4MC2A#""!#""!#""!#"BDDDФe6""!#""!#""!#""!#141""!#""!#""!#""!#""!#""!#""!#""!#""!#""""""""""""BD4DCCf6C4$DC4$D4CD""!""""""""""BDDDCf6""""""""""""!"!"""""""""""""""""""""""""""""""""""""""""""""""33Dд3Df7DCDCDCDC4CD$""""""""""""""""""DD3Df7""""""""""""""""""""""""""""""""""""""""""""""""""""""""""#"""#"""#"""#"""#"2D4D3$s74DDC4DDCCD4$""#"""#"""#"""#""ЬLФЬ$s7""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#""!"!"!"!"!"!"!"!"!"!BDBDУ%D3DD4DDD4DDD4#"!"!"!"!"!"!"!"!"ЬЬЬЬ%D3"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!""""""""""""""""""""3D"CUeD3DC4DDC4D4C$3"""""""""""""""""ЬЬЬЬeD3""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""#M3Dlfд3CDDCCDDCDDC$"""""""""""""""""ЬЬЬЬfд3"""""""""""""""""""""""""""""""""""""""""""""""""""""""""#"""#"""#"""#"""#"""33Ca744C4D#C4D#C4C#"#"""#"""#"""#"""ЬЬЬЬ744"#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#""""!#""!#""!#""!#""!#!"#"141D#D#A#""!#""!#""!#""!#"ЬЬЬЬ41""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#"""""""""""""""!"!#!"#!""!"""""""""""""™)’™"!""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""BDD$""""""""""""""""""""BDDDDDD”™"""""""""""""""""""BDD$""""""""""""""""""""""""""""""""""""""#"""#"""#"""#"""#"""#"""#"D""D""#"""#"""#"""#"""#"D""B""BD™"#"""#"""#"""#"""#"D""D""#"""#"""#"""#"""#"""#"""#"""#"""#""!"!"!"!"!"!"!"!"!"!"!"!"!"!D!D"!"!"!"!"!"!"!"!"!"!D"!B"!"!"!"!"!"!"!"!"!"!D!D"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!""""""""""""""""""""""""""""$ёB""""""""""""""""""""$ёџџB""""""""""""""""""""$ёB""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$ёB""""""""""""""""""""$ёџџџџB""""""""""""""""""""$ёB"""""""""""""""""""""""""""""""""""""#"""#"""#"""#"""#"""#"""#""D!B"#"""#"""#"""#"""#""$ёџџџџB"#"""#"""#"""#"""#""$ёB"#"""#"""#"""#"""#"""#"""#"""#"""#""""!#""!#""!#""!#""!#""!#""!#D""D""!#""!#""!#""!#""!#$ёџџџџ!B""!#""!#""!#""!#""!#$ёB""!#""!#""!#""!#""!#""!#""!#""!#""!#"""""""""""""""""""""BDD$"""""""""""""""$ёџџџџ!D"""""""""""""""$ёB"""""""""""""""""""""""""""""""""""""""""""BDD$""""""""DBD4BDDDDDDDDDDDDDDDDDDD$ёџџџџBDDDDDDDDDDDDDDDDDDDD$џD""""""""""""""""""""""""""""""""""""""#"""#"""#"""#"D""D""#"""#"3C43D""BB"""B"""$""B$""Bёџџџџџ!$""B$""B$""B$""B$""Bџ/B""#"""#"""#"""#"""#"""#"""#"""#"""#""!"!"!"!"!"!"!"!D!D"!"!"!"!3D24D"!!!ё!!"ёџџџџџџ!"!"!"!"!"ёџB"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!""""""""""""""""$ёB""""""""3$B4$ёџџџџџџџџџџџџџџџџёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB""""""""""""""""""""""""""""""""""""""""""""""""""""$ёB""""""""3DD3$ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB"""""""""""""""""""""""""""""""""""""#"""#"""#"""#""D!B"#"""#""4$D3$ёџџ""џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB"#"""#"""#"""#"""#"""#"""#"""#"""#""""!#""!#""!#""!#D""D""!#""!#CDд4$ёџ/$""B$""BџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB""!#""!#""!#""!#""!#""!#""!#""!#""!#""""""""""""BDD$""""""CC44$ёџADDDDDDDD$ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ/D"""""""""""""""""""""""""""""""""""""""""""DBD4BDDDDDDDDDDD$ђD4CD$4CD$DџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџADDD$""""""""""""""""""""""""""""""""""#"""#"""#"""#"3C43D$""B"""B"""$ё/B4=434=43$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!""BD""#"""#"""#"""#"""#"""#"""#"""#""!"!"!"!"!"!"!"!3D24$!!ёB333C333C$џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ!B"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!""""""""""""""""3$B4$ёџџџџџџџџџџџџџB44D444D4$ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB""""""""""""""""""""""""""""""""""""""""""""""""3DD3$ёџџџџџџџџџџџџџBDCDDDCDD$ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB"""""""""""""""""""""""""""""""""#"""#"""#"""#""4$D3$""ёBDCCCDCCC$""""""""ёџџџџџB"#"""#"""#"""#"""#"""#"""#"""#""""!#""!#""!#""!#CDд4D$""$""B$""B"ёBD4DDD4DDD$""$""B$""B$""B$""B$""B$""B$""B$""Bџџџџџ!B""!#""!#""!#""!#""!#""!#""!#""!#""""""""""""CC44BDDDDDDDDDDD$ё/DC4$DC4$DCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD$ёџџџџ!D""""""""""""""""""""""""""""""""""""""""3DC42DDD4CD$4CD$DёџBDDDDDCDC2DDD4CD$DBФ4DBФ44CD$DBФ44CD$4CD$4CD$DђџџџџBDDD$""""""""""""""""""""""""""""""#"""#"""#"""#"3$C3233г4=434=43$ђџ!""BD4DDC233г4=43cCUvcCUv4=43cCUv4=434=434=43$ђџџџџџ!""BD""#"""#"""#"""#"""#"""#"""#""!"!"!"!"!"!"!"!C$D42$34333C333C$ёџ!BDD4D2$34333C\Ef6\Ef6333C\Ef6333C333C333C$ёџџџџџ!B"!"!"!"!"!"!"!"!"!"!"!"!"!"!""""""""""""""""3DD33$BD44D444D4$џџџџџBDC4D3$BD44D4U&B4U&B444D4U&B444D444D444D4$ёџџџџџџџџB""""""""""""""""""""""""""""""""""""""""""""3Dд3BDDCDCDDDCDD$џџџџџBCDDCBDDCDCDDcDФ3cDФ3DCDDcDФ3DCDDDCDDDCDD$ёџџџџџџџџB"""""""""""""""""""""""""""""#"""#"""#"""#""14442D2CDCCCDCCC$ёџџџџBC4D#2D2CDCCC4$U54$U5DCCC4$U5DCCCDCCCDCCC$ёџџџџџ!B"#"""#"""#"""#"""#"""#"""#""""!#""!#""!#""!#1412D$DD4DDD4DD$ёџџџџ!BD#2D$DD4DDCФe6CФe6D4DDCФe6D4DDD4DDD4DD$ђџџџџџ!""BD""!#""!#""!#""!#""!#""!#""!#""""""""""""!"!BD4DC4$DC4$DDђџџџџ!D#!"BD4DC4$DCCf6CCf6C4$DCCf6C4$DC4$DC4$DDёџџџџBDDD$"""""""""""""""""""""""""""""""""""""""""33DдDCDCDCDCDџџџџџADDDDDDDдDCDC3Df73Df7DCDC3Df7DCDCDDDDDDDD$ёџџџџ/DCD$D""""""""""""""""""""""""""""""#"""#"""#"""#"""#"2D4D4DDC4DDC$џџџџџ!$""B""BD4DDC3$s73$s74DDC3$s74DDCD""BB"""џџџџџB434#""#"""#"""#"""#"""#"""#"""#""!"!"!"!"!"!"!"!"!"!BDBDDD4DDD4D$џџџџџџ!"!BDD4DУ%D3У%D3DD4DУ%D3DD4DD"!џџџџџџBC333"!"!"!"!"!"!"!"!"!"!"!"!"!"!""""""""""""""""""""3D"CDC4DDC4D$ёџџџџџџџџџџџџBDC4DUeD3UeD3DC4DUeD3DC4D$ёџџџџџџџџџџџBCDD3""""""""""""""""""""""""""""""""""""""""""""""""#M3DCDDCCDDC$ёџџџџџџџџџџџџBCDDClfд3lfд3CDDClfд3CDDC$ёџџџџџџџџџџџџџB444#"""""""""""""""""""""""""""""#"""#"""#"""#"""#"""33CC4D#C4D#$ёџџџџџџџџџBC4D#a744a744C4D#a744C4D#$ёџџ"!ё!ёџBD4D2"#"""#"""#"""#"""#"""#"""#""""!#""!#""!#""!#""!#!"#"D#D#D$""џџџџџџџџџ!BD#141141D#141D#$ёџ/$""B$""Bџ/B4MC2""!#""!#""!#""!#""!#""!#""!#"""""""""""""""#!"#!"BDDD$ёџџџџџџџџ!D#!"!"!!"!#!"!"!#!"$ёџADDDDDDDD$џD4CD""""""""""""""""""""""""""""""""""""""""""""""""""""""2DDDDџџџџџџџџBDDDDDDDDDDDDDDDDDDDDDDDDџB4CD$4CD$$ёB4CD$""""""""""""""""""""""""""""""#"""#"""#"""#"""#"""#"""#"""#"233г$џџџџџџџџџ!B"""B"""B"""B"""B"""B"""ђџB4=434=43$ёBCD4$""#"""#"""#"""#"""#"""#"""#""!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!2$34$џџџџџџџџџџ!!!!!!џџB333C333C$ёBDD4#"!"!"!"!"!"!"!"!"!"!"!"!"!"!""""""""""""""""""""""""""""""""3$BD$ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџB44D444D4$ёB4C$3""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""BDDC$ёџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџёBDCDDDCDD$ёBDDC$"""""""""""""""""""""""""""""#"""#"""#"""#"""#"""#"""#"""#""2D2C$"ё"""""""!DDCCCDCCCD!DC4C#"#"""#"""#"""#"""#"""#"""#""""!#""!#""!#""!#""!#""!#""!#""!#2D$DD$""$""B$""B$""B$""B$""B$""B$""B$""B$""DD4DDD4DDD""DA#""!#""!#""!#""!#""!#""!#""!#""""""""""""""""""""""""BD4DCDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDC4$DC4$DDDD$"!""""""""""""""""""""""""""""""""""""""""""""""""""""""33Dд2DDD4CD$4CD$4CD$4CD$4CD$4CD$4CD$4CD$CD$DDCDCDCDCDBD4""""""""""""""""""""""""""""""""""#"""#"""#"""#"""#"""#"""#"""#"2D4D233г4=434=434=434=434=434=434=434=43434#4DDC4DDC3C43""#"""#"""#"""#"""#"""#"""#"""#""!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!BDBD2$34333C333C333C333C333C333C333C333CC333DD4DDD4D3D24"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!""""""""""""""""""""""""""""""""3D"C3$BD44D444D444D444D444D444D444D444D4CDD3DC4DDC4D3$B4""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""#M3DBDDCDCDDDCDDDCDDDCDDDCDDDCDDDCDDDCDD444#CDDCCDDC3DD3"""""""""""""""""""""""""""""""""#"""#"""#"""#"""#"""#"""#"""#"""33C2D2CDCCCDCCCDCCCDCCCDCCCDCCCDCCCDCCCD4D2C4D#C4D#4$D3"#"""#"""#"""#"""#"""#"""#"""#"""D!$D"D#B$!D$"!#""!#""!#""!#""!#!"#"2D$DD4DDD4DDD4DDD4DDD4DDD4DDD4DDD4DD4MC2D#D#CDд4""!#""!#""!#""!#""!#""!#""!#""!#D"$DBD"D$B$B"""""""""""""""BD4DC4$DC4$DC4$DC4$DC4$DC4$DC4$DC4$D4CD"#!"#!"CC44"""""""""""""""""""""""""BD"""D"B$"D$"""""""""""""""""""""""33DдDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC4CD$""""""""3DC4"""""""""""""""""""""""""""""""""D#$D"D"B$C$B"#"""#"""#"""#"""#"""#"2D4D4DDC4DDC4DDC4DDC4DDC4DDC4DDC4DDCCD4$""#"""#"3$C3""#"""#"""#"""#"""#"""#"""#"""#""D"$DAD$DD"D$!"!"!"!"!"!"!"!"!"!"!"!BDBDDD4DDD4DDD4DDD4DDD4DDD4DDD4DDD4DDD4#"!"!"!"!C$D4"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!""""""""""""""""""""""""""""""""""""3D"CDC4DDC4DDC4DDC4DDC4DDC4DDC4DDC4D4C$3""""""""3DD3""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""#M3DCDDCCDDCCDDCCDDCCDDCCDDCCDDCCDDCDDC$""""""""3Dд3"""""""""""""""""""""""""""""""""#"""#"""#"""#"""#"""#"""#"""#"""#"""33CC4D#C4D#C4D#C4D#C4D#C4D#C4D#C4D#C4C#"#"""#""1444"#"""#"""#"""#"""#"""#"""#"""#""""!#""!#""!#""!#""!#""!#""!#""!#""!#!"#"D#D#D#D#D#D#D#D#A#""!#""!#141""!#""!#""!#""!#""!#""!#""!#""!#"""""""""""""""""""""""""""#!"#!"#!"#!"#!"#!"#!"#!""!"""""""!"!"""""""""""""""""""""""""DBB$DD$BD"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""DCB$D#"D"$"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#""DD!"DD!BD$!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"B$B$"B$""$""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""B$B$DD"BD"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#""""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""!#""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#"""#""DD!"!"!"!DADD"!"!"!"!"!"!"С"!"!Т!,!"!"С,!,!"С"!"!,!"!"!Т!"!"!"!"!,!,С,!"!"!"!"!,!"С"!,!"!"С,!,!"С"!"!,!"!"!"!"!"!"!"!"!"D"$BD"$"$D""D"""""""""""""Т""Ь",ТЬ"""Ь","""ЬТТ""ТЬ","""ЬТТТ,ТТ""ТЬ""","Ь""""ТТ"""ЬТ,ТЬ"""Ь","""ЬТТ""ТЬ",""ТТ"ЬТЬ",ТТ"Ь""D"$D"$$$$""B$"""""""""""""Т"ТТТЬ",""Т"",",Т"Т,""",ТТ""ТТТ,"ЬТТ""",",",ТТ""""Т,",ТТТТ",""Т"",",Т"Т,""",ТТ""Т,ТТТЬТТТТТТ""DD"D#$DD$D"D#"""#"""#"""#"Т"У,",#,""У"",#,Т"У,""#,ТТ#"ТТУ"ТТУЬ""#,",#,Т,#"""У"",УЬТТ#,""У"",#,Т"У,""#,ТТ#"Т"У,ТТУТТТУ,""D!$BD!DB$DC$"!#""!#""!#""!УЬ"Ь#,"С#""ЬУЬ",#ЬТС#""С#,"!#ЬТ!УЬТЬ#""С#,ТЬ#Ь",#"Т!#,"СУТ"С#""ЬУЬ",#ЬТС#""С#,"!У""ЬУТ",#,"Ь#""""""""""""""""""""""""""""""""""""""""""""""""""""""Т"""""",""""""""""""""""""""""""""""д#-- title: Core Keeper-style Autotiling and Rendering -- author: NewbLuck -- desc: Autotiling and Rendering for a top-down game -- license: WTFPL -- version: 0.1 -- script: lua --[[ This is the magic lookup table for autotiling. The center tile is worth 256, the surrounding tiles are powers of two so that all 3x3 tiles add up to a unique number for that config (think bitflags). We use that number to store what tile, rot, and flip we need to pick for the autotile mappings. 1 2 4 8 256 16 32 64 128 ]] WallMap = { -- Left these verbose for example, ideally these -- values should be precalculated to shrink it down. -- Return table is tile #,rotate #,flip # [0] = {0,0,0}, -- empty [256] = {22,0,0}, --single [256+1] = {22,0,0}, --single [256+4] = {22,0,0}, --single [256+32] = {22,0,0}, --single [256+128] = {22,0,0}, --single -------------------------- [256+1+2+4+8+16+32+64] = {1,0,0}, -- BR open, rest filled [256+1+2+4+8+16+64+128] = {1,1,0}, -- BL open, rest filled [256+2+4+8+16+32+64+128] = {1,2,0}, -- TL open, rest filled [256+1+2+8+16+32+64+128] = {1,3,0}, -- TR open, rest filled -------------------------- [256+1+2+8+16+64] = {2,0,0}, -- TR,BL,BR open, rest filled [256+2+4+8+16+64] = {2,1,0}, -- TL,BL,BR open, rest filled [256+2+8+16+64+128] = {2,2,0}, -- TL,TR,BL open, rest filled [256+2+8+16+32+64] = {2,3,0}, -- TL,TR,BR open, rest filled --------------------------- [256+64] = {3,0,0}, -- Bottom filled [256+8] = {3,1,0}, -- Left filled [256+2] = {3,2,0}, -- Top filled [256+16] = {3,3,0}, -- Right filled --------------------------- [256+16+64+128] = {4,0,0}, -- BR sides and corner filled [256+8+32+64] = {4,1,0}, -- BL sides and corner filled [256+1+2+8] = {4,2,0}, -- TL sides and corner filled [256+2+4+16] = {4,3,0}, -- TR sides and corner filled --------------------------- [256+8+16+32+64+128] = {5,0,0}, -- Top Side Open [256+1+2+8+32+64] = {5,1,0}, -- Right Side Open [256+1+2+4+8+16] = {5,2,0}, -- Bottom Side Open [256+2+4+16+64+128] = {5,3,0}, -- Left Side Open --------------------------- [256+16+64] = {6,0,0}, -- Right,Down Filled [256+8+64] = {6,1,0}, -- Left,Down Filled [256+2+8] = {6,2,0}, -- Up,Left Filled [256+2+16] = {6,3,0}, -- Up,Right Filled --------------------------- [256+2+64] = {16,0,0}, -- Top,bottom [256+8+16] = {16,1,0}, -- Left,Right --------------------------- [256+1+2+4+8+16+64] = {17,0,0}, -- BL,BR Open [256+2+4+8+16+64+128] = {17,1,0}, -- TL,BL Open [256+2+8+16+32+64+128] = {17,2,0}, -- TL,TR Open [256+1+2+8+16+32+64] = {17,3,0}, -- TR,BR Open --------------------------- [256+2+8+16+64] = {18,0,0}, -- Four directions filled --------------------------- [256+1+2+4+8+16+32+64+128] = {19,0,0}, -- Everything --------------------------- [256+8+16+64] = {20,0,0}, -- Tee down filled [256+2+8+64] = {20,1,0}, -- Tee left filled [256+2+8+16] = {20,2,0}, -- Tee up filled [256+2+16+64] = {20,3,0}, -- Tee right filled ------------Pivot here?? \/--------------- [256+8+16+64+128] = {21,0,0}, -- Left and BR Corner filled [256+2+8+32+64] = {21,1,0}, -- Top and BL Corner filled [256+1+2+8+16] = {21,2,0}, -- Right and TL Corner filled [256+2+4+16+64] = {21,3,0}, -- Bottom and TR Corner filled ------------Pivot here?? \/--------------- [256+8+16+32+64] = {21,0,1}, -- Right and BL Corner filled [256+1+2+8+64] = {21,1,2}, -- Top and BL Corner filled [256+2+4+8+16] = {21,2,1}, -- Right and TL Corner filled [256+2+16+64+128] = {21,3,2}, -- Bottom and TR Corner filled ---------------------------------- [256+2+4+8+16+32+64] = {7,0,1}, -- Top and BL Corner filled [256+1+2+8+16+64+128] = {7,0,0}, -- Top and BL Corner filled } -- This function returns a value that is unique for -- each unique configuration of surrounding walls. -- We use the number to pull an index in the autotile -- lookup table. This works the same as a bitfield. function wallValue (x,y) local cwall = {false,false,false,false,false,false,false,false,false} -- There might be a faster way to do this with peek()? cwall[1] = mget(x-1,y-1) ~= 0 cwall[2] = mget(x,y-1) ~= 0 cwall[3] = mget(x+1,y-1) ~= 0 cwall[4] = mget(x-1,y) ~= 0 cwall[5] = mget(x,y) ~= 0 cwall[6] = mget(x+1,y) ~= 0 cwall[7] = mget(x-1,y+1) ~= 0 cwall[8] = mget(x,y+1) ~= 0 cwall[9] = mget(x+1,y+1) ~= 0 -- 1 2 4 -- 8 tile 16 --32 64 128 -- Check up/left/right/down local rval = 0 if cwall[2] then rval = rval + 2 end if cwall[4] then rval = rval + 8 end if cwall[6] then rval = rval + 16 end if cwall[8] then rval = rval + 64 end -- Now check corners, only count if there is connecting -- sides. I.e., only count top-left if we also have -- both left and top tiles. if cwall[2] and cwall[4] then if cwall[1] then rval = rval + 1 end end if cwall[2] and cwall[6] then if cwall[3] then rval = rval + 4 end end if cwall[4] and cwall[8] then if cwall[7] then rval = rval + 32 end end if cwall[6] and cwall[8] then if cwall[9] then rval = rval + 128 end end return rval end px = 24 py = 43 prow = 5 -- A little mover function for our test entity. This would be -- a good place to recalculate the tile row the ent is in for -- a spatial lookup for drawing procedures function moveBy(x,y) px = px + x py = py + y prow = py>>3 -- Same as this: -- prow = (py // 8) end function remap(tile,x,y) -- Empty tile passed in, just pass the tile back. if tile == 0 then return tile,0,0 end -- Use our precalculated lookup table to figure -- out which tile to use and what rotation and -- flip values to use local nw = WallMap[wallValue(x,y) + 256] if nw ~= nil then -- If we got a hit, then return tile, fip, rot return nw[1], nw[3], nw[2] end -- No hit, something is very wrong or we are missing -- an entry in the lookup table. Set a tile we can -- easily see. return 71,0,0 end function TIC() -- Scoot the little test player around if btn(0) then moveBy(0,-1) end if btn(1) then moveBy(0,1) end if btn(2) then moveBy(-1,0) end if btn(3) then moveBy(1,0) end cls(0) -- Mouse drawing tiles for active editing local mx,my,mbl,mbm,mbr,msx,msy = mouse() if mbl then mset(mx>>3,my>>3,1) end if mbr then mset(mx>>3,my>>3,0) end -- Manually render top to bottom left to right (back to front) -- We have to manually render due to map() messing with -- rows we are not currently working on. -- We iterate a row to draw floors, then entities in the -- row, then iterate one more time to draw the walls. This -- can probably be optimized for one pass. for iy = 0,17 do -- Draw the floor first for empty map tiles for ix = 0,30 do local mg = mget(ix,iy) if mg == 0 then spr(8,ix*8,iy*8,0,1,0,0,1,1) end end -- Here check your ents and draw ones where their feet -- are in the current row being drawn, you can calculate -- this ahead of time per-entity and store ent refs -- based on their tile row in a separate table. --if py > iy * 8 and py <= iy * 8 + 8 then if iy == prow then -- Sprite draw position based on center bottom spr(256,px - 4,py - 16,0,1,0,0,1,2) end -- Now that we drew floor tiles and the entity -- standing on it, render the walls for ix = 0,30 do -- Get the map tile local mg = mget(ix,iy) -- This provides the proper automapped -- top tile, flip, and rot local nt,nf,nr = remap(mg,ix,iy) if mg ~= 0 then -- Draw the top spr(nt,ix*8,iy*8-16,0,1,nf,nr,1,1) -- Render regular wall or wall with ore -- Tile flag 2 = ore local wallt = 48 -- single wall if fget(mg,2) then wallt = 53 -- ore else local wl = (mget(ix - 1,iy) ~= 0) local wr = (mget(ix + 1,iy) ~= 0) if wl and wr then wallt = 50 -- center elseif wl then wallt = 51 -- right elseif wr then wallt = 49 -- left end end spr(wallt,(ix*8),(iy*8)+8-16,0,1,0,0,1,2) end end end print("X:"..px,2,110,4) print("Y:"..py,2,120,4) print("Row:"..prow,2,130,4) print("Left click to draw tile, right click to remove",55,130,12,1,1,true) end