using System.Collections.Generic;
public static void Main()
Console.WriteLine("Hello World");
public class MakeCartridge
string hexData = "4e45531a01010000000000000000000020700600206406002078060020b7040020bc01000108020802000501000201010105010501020102db60e255142001f9a0e030101001500130d0ffff3ec657c6e1c660c77dc7e4c6f1c653c708c719c71cc735c74ec78cc0cfc061c16004c3c0dfc06ec1c4c2c8c286c1b0c192c1cfc1d5c1dbc1e1c19ec1e7c10cc670c689c625c6a2c6cc008ec196c1a6c600d80000010080d7041806fec8bc04e809fe209e041809fec88004e809fe2062041809fec84404e806fe8028040001febc9e80624428ff000080000000180000001000e0bc00109e00e08000106200e04400fe00001003c8bc08c88004b87410685814c8440460cf0c709b00309e04508508807d00306204586000902818fe0000081d0000081700000818000008090000080b0000080700000819c8bc00709b00309e00c88000807d00306200586000c84400902800fe0000080d242454546060646460602424686868686868242424545454000060b700507b00b85c00684000fe00000818caa78e6b515c2c4c2c64c6aa8c6d4dc46c7c54c408110a1108100a11080f0a1105010c0905050a0a0810081004040c0d0c141c10182003050203000003040000080810e010e00ce008e80102040810204080133048607890a8c0e013db4c6a88a6c5fe536b8fa7cafe526e8cacc5fe526c8ea8cafe0006080819303430343034383c3c3c020402040705070903000004080102030450607080900ed8180ec80486c804a6c000beb800d6b0044eb0040ea004dea000c69800ae9000968814c6780c0e70044670088e6804ae6000c65800de5000664010862800feb078604028ff0000140000001c000000240000002c0000005400000012000000e40018a00c207010507014607014986808c87808e0a000e0500cb04008902804fe00000810000008180000082000000828000008300000084018a000207000507000607000986800c87800e0a000e05000b04000902800fe04011b0e000112013038404850580000091518004c5f035c5f03c467034c9f135c9f13c48713dc3f03dc671306d80006b8001690041e680826400cfeb890684028ff0000f5000000d5000000c5000000b50010b80078b800e8b800189004609004989004e09004206804806804d86804284004484004b04004d04004fe000008200000082810b80078b800e8b800189000609000989000e09000206800806800d86800284000484000b04000d04000fe00091e3348540ca70374a703e4a7030cc71374c713e4c713147f035c7f03947f03dc7f031c57037c5703d4570314a7135ca71394a713dca713242f03442f03ac2f03cc2f031c7f137c7f13d47f13245713445713ac5713cc571308c710a7187f2057e8c7e0a7d87fd05734ac44bc05030d0bd40ce40c5d4bcdc35d43e5c3ed03244977777777ffff0b0c0d15161718191a1e1fffffff01010101ffff0101e4e3e2d8d7d6d5d4d3d0cf4884c0508dc720c0786028446b2033c437c43bc43fc400001008000010080000601000002a20b0a078686888888888884838281818bbbb5e2f1388786456498888245555888849555540201008018cc00cc20cc2f0c2c3c00cc252c206c3e3c00cc26ec216c30bc10cc28dc241c327c10cc2a5c249c3bcc00cc24cc200c30cc2d2c274c30cc2d8c27ac35bf5d9f8cdf71cf7d9f81bfa00000106e8045018d512e8005020db22f0000000032c3004207ff621d0002046f621d80000000104c00400000004000430c70422000000000208100400000202e004fe00000106e8045018d512e8005020db22f0000000030c30043078a012300030a8a01238003049a01240007070a012480070a0a012500070d7a012580000002302400400002302580400000004000410b7042200000000020810044c9f98221000cc67982220000000030c6004000001169004fe00000106e8045018d512e8005020db22f00000000304d004146ef621d0007c46f621d80000000120500400000004000438c704220000000002101004feb3c4f6c4f6c469c57f7f7f005f3f002f7f7f00a9a981815959313100304cd50010e0002450c0003bb33bb33bb338b30022222200212100202222002222222221212121060a1b00821c00c50a1800e8f74857a8b708170004070b01030508d0d1d2d3848d848d46767778797a7b7c7d7e7f808182838485242486872424248846249c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadae24afb0b1462424248924248a8b8c8d8e8f909192939495969798999a9b4624b2689eb5b66cc7a3a469a6a7a86baac9ca6dbf24cd6ab146c2c3249ec4c5c6c7a3b9a5a6a7bb6bc8c9cacbcc24cdcecf4624b2b3b4b5b6b7b8a3b969baa7bba9aabcbdbebfc0c124b1132c16131316303723db42a021ca4c2421ea0c242419150a220e1b246624240023e204080a0a02220a4c24222a0c24100a160e2424181f0e1b24224a4c240012242420635b2420944a2420b44a240021094e2421a94e2422494e2422e94e243f1d0330360600208d462420ad462420cd462420ed46240012aaaa462424dcddd4d5dedfd6d7e0e1d8d9e2e3dadbe4e52424e6e746e8e9eaebecedeeef24f0f1f224f3f4f5f6f7f8f9fafbfcfd210850620023094e6223294e6223494e620020c5422420ca422420ea422420e54224220a4224222a42242218422400223842242129c4242136c42421d0c424226cc4242273c424230fc32400ff0101ff78d8a9108d0020a2ff9aad02202980f0f9a0078401a0008400a900910088d0fbc60110f720e7c7a97f8d1105a9188551a901854e8555a900854fa51049808d0020851020edf44ce1c7a9108d00208510a9068d01208511a9008d052085128d0520851320aecb4cb7cbaabda7c48500bda8c485014c28f2aabd3cc08502bd3dc085034cd7f2aabd3cc08500bd3dc085014c76cdaabd3cc08504bd3dc08505bd44c08506bd45c0850760aabd3cc08502bd3dc0850360aabd3cc08508bd3dc085096048a510297f8d00208510a9008d0320a9028d1440a9318500a90385012028f2a9008d30038d3103200ef5a51149188d01202048faa54ed02aa54ff039a59ad006207cce4cd7c8ad4f04c908d02820f4cca543d024a9008d4f04854fa97985434cd7c8a555d0062030ca4cd7c820f3c820acf44cd7c820c9caad0505c901d00aa5518500203cf2ce0505a51049808d002085106840ad0201d0068d15408d0001ad1805d011a98085fda9048d1805a90f8d15408d0001ad1005d027209ad1a9082007c8ad11058d0002a9a28d0102a9008d02028558a9388d03028d1005a920854460a5152920d017a5152910d03ea9008d1205a544d007a90185584cb1c960a9408544ad1205d01fa9408535ad0002186910c9bfd002a97f8d00028d1105ee1205a90a8d130560a535d000608d1405a20aa9009524cad0fbad11054a4a4a4a38e9078550c9023007a91c85514cb1c9a9188551a55029010aaabd07058521bd08058522a90f8518a9138519a900854e8d06048d0704854f8d10058d0b058d1205a90185538d00048d0104a90085548d02048d0304a90085528d08048d090485fca903a658f002a90185558d04048d05048d0b04a558d011a9978543a90185fda90f8d15408d000160ce1805a97585434caecb20acf4a558d013a543c975f01dc974f01ec973f01fc95ff030608555a90085588d100520b7cb20aecb60c6434caecbc6434ccacbc643a55029010aaaa5219d0705a5229d08054cf5cba652a9019d0604854ea551c91cd00ca5524901aabd0604854ef00585554c53caa98585438d0b04a000844f86524ca9caa000bd0004995300e8e8c8c003d0f360a000b953009d0004e8e8c8c003d0f36020acf4a553c901f006a543c984f02aa543c972b03ac96df005c962f01460ad0b04f00aa9008d0b04c65520bdcb2034cc60a901854f2047cc60a652a553dd0004f00ac901f0062024cc2004ccc643604c1bcbc97af011c975f016c974f00fc973f02dc972f018602053ca20cacbc6436020b7cbc643a558d004a90885fd60c643a653cabd08c68500a92085014ca6eb209ad1a653ca8a0a2007c8a90a2007c8a551c91cf00da9768500a9208501a9042015c8a9018d05052032d020bdcba9bc8500a454c820c2f4a900852ca98088c0041003b907c2852ea90d8545a9028500203cf2c64360a9008504a9ff4c92f0209ad14cb4f1a9b58500a9208501a4554cc2f4a558d026a551c91cd020a652a553dd0004d017a000b9aac6993103f004c84cdfcba552f005a9678d450360a000b9c2c6993103f004c84cf7cb60a558d01ba652bd0804d0148aa8180a0aaab525c9029008990804e65520bdcb60a52e8500a552090885012042f34c32d0a9018d05052032d0a9008d0b0520c1cc4cf2d7a900aa95599d0d04e8e089d0f6a901855985968d3e048d51048d5204859f8d0305a9048597a9588d3d04a92085a2a9808518a90a8534a65220b9caa9bb8539a9278544a553c901f009c903f012a91085fc60a9388536a9408543a90285fc60a9208536a9508d3f048d41048d4304a9038d40048d42048d440460a55338e9010aaabda6c58509bda7c5850aa200a000b109c9fef0179500c8e8e005d0f28486b1092096f0a486c8a2004cd6cc60ad5004d00ea9018d5004a90a8534a91085fd60a543c958900620acf44c22cd2024cc2004cca9008543859a4c53caa543c99ff01dc99ef01ec99df01fc99cf024c99bf029c990b02ac986b029c970b02860c6434c6fcdc6434c7fcda01cc643a9064c23c8a01cc643a9084c23c8c6434c89cd4c9dcd4cb1cd4c24cea00ca90a4c23c8b1009931038810f86020aecba016a90c4c23c8a00ca90e2023c8a9038502a9188503a9504c8cf0a98d8500a9208501a5432901f0034c89eb4c92ebc98fd022c643a010a9102023c8a90185fea9688500a93e8501a9408502a9468503a9504c80f0ad5002c9a0f011c9fff0111869028501ad530285004ccacda98085fea9188503a950208cf0a9eb8500a9238501a9122015c8a9014c0ece08a98d8500a922850128d005a9164c15c8a9144c15c8c985f007a54329014c0ecea90485fda004a9182023c8a9788500a9208501a9c88502a9228503a9b02080f0c643a9a08500a9308501a90420d4eaa9002086f0a9288de8028dec02a9308df0028df802a9388df4028dfc0260a558f014ad0201d0068d15408d0001a5152920f0034c2bcfad1605d015ad1705f004ce1705602004cc20a8cfa59ac901d0034c1ccfa5bff0034c13cfa596c9ffd0034c19cfc908f011c904f00da558f00620daeb4cd6ce2075d12006eb20b6eb2041d020a4d1205fea20e5e12079eea553c903f010c904f0182016da209ae12029ec4c1ccf2034e82081e92029ec4c1ccf2029ec4c1ccf200cee4c1ccf20c0d02042cfad1605d006204cd020acf460a901854e8d12058555a9208544a90085588d10054c53caa5152910f047a558f009a9008558a5154c8ac9a515cd1405f0368d1405ad1605f016ad1705d0108d1605a50f85fca51129ef85114c87cf60a9018d1605a5fc850fa90085fca9408d170585fd608d1405ad1705f004ce170560ad1605d00160a5110910851160a200a000b541d008a9ff99c00299c402e8c8c8c8c8c8c8c8c8e00230e760a000840f2008d0b9c002c9ffd025a50599c30218690899c702a50699c00299c402bd04c699c102a9d499c502a60fa903954160c8c8c8c8c8c8c8c8e60fc01030c6608a489848a558d01aa55209188501bd00c68500a50548a506482042f36885066885052032d068a868aa60ad050509018d0505a9f985004c35f4a52ec9101004a92085fc60a59ad042a653e004f00da55af065cabdfac1c559f01260a200b5c1f056e88e4f04e008d0f44c86d020e1eaa90420d4ea20cdea2088f0a90285fda90085fca901859aa900853aa53ad029e653a553c902f007c905b0084cb5d0e6534cb5d0a9018553e654a9a0854360a98d8543a900854f859a60a90085fca91020e6d9f06da598c9fff05fa598d00fa558d004a98085fea940853ae69860a53af010c90e904ca558d004a90185ffa900853aad0102c96cb002a96c186904c97c9017e698a598c905f005a96c4c1fd1a558f004a97d853aa97c850220e1ea20cdea2082f0a598c905d008a9ff8598a53af00160a65220b9caa555d009a901854ea987854360a551c91cd018a5524901aa8652bd0604f0098a4901aa86524c69d120a9caa98785438d0b04a900854f60a5520aaab515290f8556f0084a4ad004a5568557a596c901d00ab5152980f004a904859660a51129e78d0120851160a596c901f011c902f015c904f014c908f013c90af0126020cfd1a5964caad14c7ed34c47d54c97d64cc6d6a556c901f010c902f00cc904f005c908f001604c8bd2a9db850aa93620e8d9d0034c75d22090d9f00160a556c902f006ee03024c08d2ce030220cbd2855aad00022016e0855920ebd8f019a653e001d007186d00028d0002206ad3c900f005a908859660a59bd007a901859b4c75d2a90885ffa900859ba597f018c908f01fa9048597a585f005a9004c5dd2a90885974c75d2a9048597a90085854c75d2a9048597a901858520e1eaa597850220cdeaa556c902f0034c82f04c88f020e1eaa9868502a9c1850320ebefa55338e9010aaabd7bc48504bd7cc48505bd83c48506bd84c4850720add8f011a50038e90485a1a9028596a900855b855c6020e1eaa596c904f009c908f005a92c4cdfd2a94a20e8efa553c901f00838e9010aaa4cfdd2a91a2031c8201ad9850c4c23d3bd6bc48504bd6cc48505bd73c48506bd74c4850720add8850cd00ba553c903d0052026d3850ca50c60a92a2047c8a90085d2a5d2c906f030aabcccc2b90002c9fff00e8501b90302850020efefc901f005e6d24c2fd3a5d2c903b005a9014c60d3a90285daa90160a90085da60a553c901f0034c7bd3a91c2031c84cadd8a90160a556c908f00ac904f0034ccfd44c32d4a55af00a20e1eac601200ad5d031a924850aa94920e8d9d008ad000285014ccfd4200ad5f033c902d0034ccfd4a55bf011186901c910f00c900aa9104cd2d34ccfd4a901855baacabd47c18502a900855a855c20eed44c0dd4a55cf00e186901c906f0099007a9014cfbd3a902855caacabd59c18502a900855a855b20eed4a5a185008d030220d1eaa9008504a502c954f005a9004c2cd4a9248502a9012096f04ccfd4a55af00f20e1eae601200ad5c901f0034ccfd4a924850aa949850b20e6d9d008ad000285014ccfd4200ad5f02cc902f028a55bf00a38e901c90190084c78d4a90d4c78d4a901855baacabd47c18502a903855c20f9d44cb1d4a55cf00e186901c906f0099007a9014c9fd4a901855c38e901aabd59c18502a900855b20f9d4a5a18d0302850020cdeaa502c954f005a9004cccd4a9248502a9012096f020cbd2855af017ad00021869082016e08559a9018596a900855c855b858560ad000238e90185014c01d5ad000218690185012906d004a90885ff6020e1eaa92c20e8efa55338e9010aaabd8bc48504bd8cc48505a9438506a9c1850720add88508a553c901d00ea91e2031c820add8f004a9028508a50860a9ff20e6d9c900d00160a594c9f090034c0dd62090d9f011a556c901d005a9024c6cd5a90185568557ad00028501a9002072efa5018d0002a556c901f007c902f0184cb3d5a59ef00aee0302a900859e4cb3d5a901859e4cb3d5a59ef00ace0302a900859e4cb3d5a901859ead030285002000d8a594f023a50138e910c5959004a9ff859520cbd2855af01ea54b38e9118d0002a901855a4cf6d5a90485ffa9018594a50185954cf1d5a9284c70f020e1eaa92c850220cdeaa55729034a2096f0a9f0859460e694a594c9f4d03aa595c9fff027a9042070f0a9008d2c0485948595a9018596a5a0f01ea901859fa94b853fa90a8596a94085fc60a9008d2c0485948595a9ff859660a9fe8d72048d7304a200a060b90002c9fff00f9d6104b9030238e9089d60044c7ad6a9009d61049d600498186908a8e8e8e8c090d0d6a9202031c820add8f006a9088596a90160a9ff20e6d9f02720e1eae601e601a557c902f006ad01024cb7d6ad010238e90285022075f020cbd2f004a9ff859660a53fd0034cbfd7a9db850aa93620e8d9d001602090d9d00aa556c901f026c902f028a5a20a85a2f0034c53d7a92085a2a59ff004c9049005a9024c05d7a905859f4c53d7ee03024c13d7ce030220cbd2855aad00022016e0855920ebd8f019a653e001d007186d00028d0002206ad3f007a90885964cbfd7a90885ffa59ff009c906b005e69f4c53d7a901859fa69fcabda2c12070f0a59f4a4af005a9004c69d7a901f01ba904186d03028500ad000238e90e8501a9218503a9f685024cadd7a557c901d009a90e186d03024c9bd7ad030238e90e8500a906186d00028501a9128503a9fa8502a5a0c901f005a9d84cbad7a9d085044c78f0a9128503a5a0c901f00aa9008d5204a9d84cdad7a9008d5104a9d085042094f020f2d7a9018596a90085a0859fad190585fc60a9198500a93f8501a94e2015c860a5a0f00160a453c003d0034ca8d8ad0302c001f009c988f00e900c4ca8d8c928f00590034ca8d8ad00021869082016e08559a55338e9010aaaa559dda8c1f009e8dda8c1f0034ca8d88a2901f019ad5204d0034ca8d8a90285a0add8028501addb0285004c7dd8ad5104d0034ca8d8a90185a0add0028501add3028500a92e20e8ef20e1eaa9302047c820efeff019a5fc8d1905a553c904d00da9198500a93f8501a9462015c860a90085a060a9f3850ba9008586a000b1048500c8b1048501c8b1041865068502a50769008503848620f3efd00ca486c8b104c9fef0084cb9d8a9014ce8d8a900850c60a55ad028a559f0242901d00da556c901f017c902f0104c17d9a556c901f007c902f0064c17d9a9ff60a90160a90060ad00021869082016e08559c901f00fa202a90ce459f00a186906e84c2dd938e901aaa9008586bd8cc08500e8bd8cc08501e8bd8cc01865068502a5078503e8bd8cc08508e8bd8cc0850920efefd022a5001865088500c601e686a509c586d0eae8bd8cc0c9fef004e84c3cd9a9004c8dd9a901855a60a556c901f007c902f0154ce3d9a5530aaacabdb4c1cd0302f03690344ce3d9a5530aaacacabdb4c1cd0302b023a553c904f020a659c903f007e006d0164cd4d9e005d00fad0302c968f00590034ce3d9a90160a90060850a850be688a588c90fb0034cf9d9a9008588c908b009aabdbcc1250a4c0fda38e908aabdbcc1250bf002a90185be602066e1a900855d20d5efbd0002c9ffd016a536d015a980a65d955ea910853720f7eabd43c48536204cdaa55d186901855dc909d0d260a65db55ec980f029c981f028c901f027c902f026c9c0f025c9c1f021c9c2f01dc908f01fc910f01ec920f01dc940f01c604c9cda4c00db4c2cdb4c30dcbd21044c8bdd4c69dc4cd0dc4c32dd2007df6020d5efa93085008501a9908502860420dbeaa537d04da981a65d955ea900958aa5adf0034cd5daa55dd038a9c0a65d955ea9019d21044cf7daa543d026a55dd022a9c0a65d955ebd2104c901d008a9039d21044cf7daa9019d210420f7eabd4dc4854360a95520e4dfd01a20d5efa94d8500a9328501a9848502860420dbeaee15054c2bdba65da901955ea984957260a9ff20e4dfd0016020d5ef4820eceaa5012016e0a45d9968002901d005e6004c50dbc600a500205ae0857d2048e0186501850120eedba65db57220d4ea68aa2080f0a50020aee0f03720f7eabd48c42519d02da65db568aacab57ec904b021a596c902d012a604bd0002cd0002b00818690fcd0002b009a902a65d955ed66860a5002090e0f0034ce7db2040dfa65db568c901d02c20c3dfa500c920f003900160a9038502a9048503208ef0a90185ada900a65d9568a98085fe60a65da908955e60a65dfe0d04bd0d04c906b00160a9009d0d04b5682901f015b572186904c9809007c990b0034c2ddca9804c2ddcb57238e904c9809007c990b0034c2ddca98c957260a95520e4dff03120d5ef860420eceae601a45db97200c990d005a9944c51dca9908502a65d957220dbeaa501a65dd5a3d006a65da901955e60a9ff20e4dfd0016020d5ef860420eceae601a5012901f00fa65db5682901f005c6004c90dce60020eedba65db572850220dbeaa9322053c8a5012012e1f027a65da910955e2030e1f009a5192901f0034cc9dca65db568aacab57ec904b00160a65da920955e60a97720e4dfd0016020d5ef860420eceaa5012016e0a65d95682901d013e600a500a200ddfcc3f01be8e00bf0284cf3dcc600a500a200dd12c4f008e8e00bf0154c06dda501187d07c48501e00ad006a65da901955e20eedba65db572850220dbea60a95520e4dfd0016020d5ef860420eceaa5012016e0a65d95682901d011c600a501c914d002c601a500d0164c7fdde600a501c9ecd002c601a500c9f4d0034c7fdd20eedba65db57285024cdbeaa9222092f0a900a65d9568608507a65db55ec9c2d0034c82dec9c1f03ba507c902f009c903f00aa9344cb2dda9364cb2dda9382053c820d5ef8604bd00022012e1a40ac004d0034c73dec900f00aa65da901958aa9c1955e20d5ef8604a65db55ec9c1d02fa92020e4dfd00aa604bd000285014c27dea65da9c0955ea507c903d00fbd1704f005a9004c0ddea9019d17044c1adea9ff20e4dff06ba604a901187d000285012086dee8e8e8a507c902d006fe00024c56dec903d01ca5012901f016a45db91704d009fe0002fe00024c56dede0002de0002bd00028500a65db572c990d005a9944c6adea9908502a65d95724cdbeaa9c2a65d955ea604bd03028d2b046020a5de60a507c901d018a000a501d91dc4900ad920c4b005e6014ca4dec8c003d0ec6020d5ef860420eceac600ad2b0438e901c500f02f38e901c500f02838e901c500f02b38e908c500f01f38e901c500f01838e901c500d01fa901a65d955ea9009d170460c6014cfbdee6014cfbdea65dbd2104c901f0e1a984a65d9572850220dbea60a95520e4dfd0016020d5ef860420eceae601bd0102c990f005a9904c27dfa994850220dbeaa5c0c501f003900160a65da901955ea90085c060a5c0f00160a596c90af00160a559c903f0034c72dfa203b57ec905b00160a200b55ec901d006b568c903f023e8e00ad0ef60a205b57ec905b00160a200b55ec901d006b568c905f006e8c90ad0ef60a940955ed6688a1869030a0a0a0aa8b900028501b903028500adebc1a000c500b007186918c84caddf980a18691518650185c060a65db568c901d01820d5efbd0302c930b00ea9239d02029d06029d0a029d0e0260850a850ba65df68ab58a3007c910b0034cfbdfa900958ac908b009aabdbcc1250a4c11e038e908aabdbcc1250bf002a90160850aa55338e9010aaabd93c48508bd94c48509a000a901850bb108c9fff00cc50af00c900ae60bc84c2fe0a907850ba50b60a65db55ec901d007a57dd003a90160a90060850ca65db568c901f015c906f011a200bdc4c1c50cf019e8e009f0174c6ae0a204bdc4c1c50cf008e8e009f0064c7be0a90060a90160850ca65db5682901f005a2004ca1e0a201bdcdc1c50cf003a90060a90160850ca65db568c902f013c903f00fc904f011c905f019c906f0214cece020f1e04cece020f1e0a089c9c4f02f4cece020f1e0a071c9b4f0234cece020f1e0a9004c0fe1aacacaa50cbc72c1dd77c1f009bc7cc1dd81c1f001606868a65d94a3a901850c60850ba000b108c9fef00dc50bf004c84c16e1a9014c2be1a900850c840a60a65db56838e559f00530034c41e1a90160a90060a200a020b90002c9fff0082016e095684c5be1a900956898186910a8e8e00ad0e360a900a006997e008810faa000b96800f008aab57e186901957ec009f004c84c72e1a659e007f00cf67ea596c90ad004a659f67e60a5add00160c901d01ca9208500a9c08501a9fc8502a9128503a9e02080f0a90285ad4ce0e1a538d021a90385ada2e1bd0002c9fcf005a9fc4cd7e1a9fe9d00021869019d0402a910853860a90085ae20ddefbd0002c9ffd032a553c901f007c904f0164c25e2a540d024a5adf020c902d01ca91985404c1fe2a540d01120f7eabd66c48540a906a6ae95af2050e2a653cae6aea5aeddf6c1f0034ce9e1a553c903f012a53bd00ea90085d285d385d485d5a9bc853b60a6aeb5af290ff03ac906f033c908f02fc901f031c902f032c903f035a553c903f00620b6e24c80e2b5192903a6ae95afb5afc901f004c902d00295b34c54e24c38e54cf9e2a9004c9ce2a90185994c68e3a553c901d00c2026e6a6aeb5afd0034c92e24c1be4a6aeb5d2d021a90195d2a5ae1869010a0a0a0aa8b90302cd0302b007a90195ec4cdde2a90295ecb519290795afa8c904b0034cf6e2b4ecc907b0034cf6e2a00394af60a955850a850b2006e8d0016020ddef860420eceaa6aeb5afc920d005a9ff95af60c910f005c6014c25e3e601a504a8c8b90002a653e004f00ec99cf005a99c4c4be3a9984c4be3c9acf005a9ac4c4be3a9a820d4eaa6aeb5b34a2096f0a6aeb5afc910f005a9104c65e3a92095af60a955850a850b2006e8d0016020ddef860420eceaa599d005e6004c87e3c600a500290fc904f007c90cf0034c9be3e6014cafe3a699dde2c3f008dde4c3f0034cafe3c6014cc0e3c904f007c90cf0034cc0e3a6aea9ff95afa49920a5e6d007a900a6ae95af60a599f01ba500c90cf005900c4cede3a900a6ae95af4cede3a900a6ae95af60a504a8c8b90002a653e004f00ec99cb005a99c4c13e4a9984c13e4c9acb005a9ac4c13e4a9a820d4eaa5994c96f0a6aeb5af4a4a4aaaa553c904f00dbdf4c3850abdf5c3850b4c4be4a5502901186554c90390e8bdf8c3850abdf9c3850b2006e8d0016020ddef860420eceaa6aeb5e8f00ec903f0034c6de4a90095e84c7ae4a5012903d007a901f6e84c0ce5a553c901f03520a3e7c903f007c913f0104c0ce5c601a501a6aed5dbf0104c0ce5e601a501a6aed5dbf0034c0ce5a901a6ae95afa90095db4c0ce5a6aeb5afc913f0034cd6e4e601a5ae0aaae8b5b9c501d006a901a6ae95af4c0ce5c601a6aee000d01ba6aeb5e0c902f013a5ae0aaab5b9c501d01ca902a6ae95af4c0ce5a5ae0aaab5b918690dc501d006a913a6ae95afa504a8c8b90002a653e004f00ec99cb005a99c4c32e5a9984c32e5c9acb005a9ac4c32e5a9a820d4ea4c88f0a6aeb5afc906f008c908f001604c9fe5a553c901f005c904f01260a9208500a9b88501a6aea90895af4c92e5ad0302c9789005a0004c72e5a008840ca51929030a18650caabdcec38500bdcfc38501a6aea90095afa9a84c94e5a99820d4ea20ddef85044c82f020ddef860420eceabd010220d4eaa553c901f00160e600a500c92cf0029027e601a501c9c5d01fa900a6ae95afc600a500c968b005e6014cdbe5c601c960d006a6aea90095af4c82f0850ca6aeb5e0c901f01dc906f019a200a918c50cf00be8e009f009bdc4c14cfae5a90060a90160a204bdc4c1c50cf008e8e009f0064c11e6a90060a90160a6aeb5afc913d0016020ddef20eceaa6aeb5e0c901f0034c6de6a500c95cf007c9c4f0134c9ee6a5ae0aaaa9a695b9e8a9c795b94c97e6a5ae0aaaa9ab95b9e8a9c395b94c97e6a500c92cf007c96cf0134c9ee6a5ae0aaaa98d95b9e8a9a495b94c97e6a5ae0aaaa98a95b9e8a9a795b9a903a6ae95af60a900a6ae95af60a50118690b2016e0a499a6ae95e0a553c901d0034cc6e6c903d0034c02e74c3ce7a50020e8e5d016a6aeb5e02901f006b99ac74cdee6b99cc71865018501a6aeb5e0c901f008a500d9e6c3f00960a500d9e8c3f00160a900a6ae95af60a6aeb5e0c902d00fa500d9eac3f024d9ecc3f01f4c2de7c001d004c904f00da500d9eec3f00dd9f0c3f00860a500c9dbf00160a6aea90095af60a6aeb5e0a888a699bdf2c3c000f011e000f0061869084c58e738e908884c47e7c500f009a5990a2070e7f00160a6aea90095af60850920ddefbd0302850aa6aeb5e038e9020aaab5c1f009a409b9dec3c50af00db5c2f00ca409b9dfc3c50ad003a90060a90160a6aeb5dbf005a6aeb5af60a55338e9020aa8b99bc48507b99cc48508a6aeb4e0f02d88b1078509c8b107850aa55338e9020aa8b9a1c48507b9a2c48508a409c40af00cb107c500f00dc8c8c84ce2e7a900a6ae95af60c8b107a6ae95dbc8b10795af60a6aef6e4b5e43007c910b0034c19e8a90095e4c908b009aabdbcc1250a4c2fe838e908aabdbcc1250bf002a9016020f7eabd5cc4850abd61c4850ba900855d20e8dfd00160a90085d2a5d2c903b054aad012a5dac901d00cce0002ce0402ce0802ce0c02bcccc2b90002c9fff03098aade0002de0402bd0002c950d0062068e94c90e8c9c8d0032071e9b90002c970d004a90185d8b90002c948f05f905de6d24c4fe8c906f061aac903d012a5dac902d00cee0002ee0402ee0802ee0c02bcccc2b90002c9fff02e98aafe0002fe0402bd0002c950d0062071e94ceae8c9c8d0032068e9b90002c9a8d007a90185d9b90002c9d0b005e6d24c4fe8a9ff990002990402e6d24c4fe8a5d8c901d027a90085d2a5d2c903f049aabcccc2b90002c9fff005e6d24c18e9a9d0207ae92068e9a90085d860a5d9c901d026a90385d2a5d2c906f01caabcccc2b90002c9fff005e6d24c45e9a948207ae92068e9a90085d960a92399020299060260a9039902029906026099000299040260a9008d4504ad450420d7ef8a186930aa860420eceac9fff056ae4504bd46041869b0c500900da501c926b011a9c085024cdae92001eac9fff0384ceae9a9c48502a501c92e9012a90285fea92e8501ad45040aaaa9009d2e04a5001869028500ad45041869012072ef20dbea4cf3e92034eaee4504ad4504c903f0034c86e960a501e601e601e601c926d004a20186fec9509015c9909016c9c0900dc9d8900e20d1ea2094f0a9ff60a9c4850260a9c0850260a536d026a5192903aabdffc1186910ae45049d46048500a9308501a9c4850220dbea20f7eabd57c4853660a539f00160a908850aa900850b20a1ead00160a9508500a9208501adf102c9dbf007e6b7a9db4c8aeaa9d720d4eaa9f02080f0a5b7c904d008a90085b7a9bb853960e6b8a5b83007c910b0034cb2eaa90085b8c908b009aabdbcc1250a4cc8ea38e908aabdbcc1250bf002a90160a90085044cd6ea8502a92285036020d1ea4c82f0ad03028500ad0002850160bd03028500bd0002850160a5502901186554aae0049002a20460ad0305d00160ad0505290f8d0505a553aaa8cabd08c68500a920850198c902302da544f024c913d0034c85ebc90fd0034c8eebc90bd0034c85ebc908d0034c8eebc904d00320a6eb60a925854460a536c918f01ac900f01dad1505f00c20a1eba9008d1505a91a8544a5444c2beba93085444c9ceba91a85442097eb4c2beba98085fea9404ca8eba98085fea9424ca8eba9444ca8eba93e4ca8eba9004ca8eba9022015c8c644ad050509108d050560a545f00160a52ed005a9ff859660a90b8545a9018500a90a8501203ef3a90285004c3cf2ad0b05d00ea9018d0b05a9008d0e058d0c0560ad0c05f024ad0d05c905d011a596c90ad004a900f007a90485964c12ec85562903f0028557ce0c0560ae0e05bd28c08d0c05bd14c08d0d05ee0e056020e1eaa94c20e8efa553c903f004c901d0032044ec208aed4cc5eda900855da93a2047c820d5efa553c901f0058a186930aa20ecea20efefd044a596c904d02ea5562903d007a59cf00d4c97eca59cc903b01ba59ed017a59dc918b011a5008505a5018506a20020c6cfa92085fde65da5534aaaa55dddfdc1f00b4c48ec2051efa9ff859660a553c903f009a596c90ad0034cbfec60a5a0d0034c87eda59f4a4af005a9004cd3eca901f013a904186d03028500ad000238e91085014c07eda557c901f009ad030238e9104cfdecad03021869108500ad00021869068501a93c20e8efa553c901d022a900855d20d5ef20eceaa93a2047c820efefd031a55d186901855dc909f0544c16eda90085ae20ddef20eceaa93a2047c820efefd00fe6aea5aea653caddf6c1f0314c38eda90285ffa5008505a5018506a553c901d00ba900a65d9568a9014c87eda9108540a900a6ae95e095dba9014c87eda90085bf60a90085aea93a2047c820ddef20ecea20efefd00fe6aea5aea653caddf6c1f00b4c93ed2051efa9ff859660a596c90ad009a553c901f00320bfec60a553c903d007a496c001f0016038e9010aaabd2bc48502bd2cc48503bd23c48500bd24c4850120efefd017a553c903d015a501c9c9f00fa9708500a9c985014cebeda9ff859660a980850aa980850b20e4dfd00160a553c901d00620d5ef4c29ee20ddef860420eceaa5bfc901d004a00284ffc90bf015a6bfcabdecc1850220dbeaa604a902206ceee6bf60a553c901d005a903206cee20d1ea2094f0a20220c6cfa90085bf609d02029d06029d0a029d0e0260a453c001d00160a5bef054c004d068a000aeffc5bdc2c5cd0302d052bdaec5cd0002904a38e911cd0002b042b9c100c900d02da596c908f026c9fff022a91185cca90199c1002038efad00021869108506ad03028505a20020c6cfa92085fd60a596c904f0072051efa908859660c007f005e8c84c8deea453befac5a000bdaec5cd0002d030bdc2c5cd0302d028b9c900d023a92285cca90199c9002038efad000238e9088506ad03028505a20320c6cfa92085fd60c002f0fbe8c84cf7eea92485cd85ce85cf85d0bdd6c58501bde9c58500a9484c15c8a596c90ad01aa5a0f01638e901aaa9009d51048a0a0a0aaaa9ff9dd0029dd40260860f0aaabd2c04d0199d3604e000d005a9084c89efa9809d3504a9f09d2d044cadefbd3504e000d00569104ca2ef69309d3504bd360469009d3604bd2d0438fd3d049d2d04a501fd3e04850118bd2d047d35049d2d04a5017d36048501fe2c04a60f60a55d1869034ce2efa5ae1869010a0a0a0aaa602047c8a900f006a901d002a902850c8a489848a000a50cd0172063f085462069f085472062f085482069f085494c59f02063f0854a2069f0854b2062f0854c2069f0854da54a38e546859ca54b38e547859da549c54b9017a54dc5479011a54cc546900ba548c54a9005a9014c59f0a900850c68a868aaa50c60c8b10218650060c8b10218650160850220e1ea20cdeaa55729034a4c96f08504a900f0108504a901d00a8504a904d0048503a90f48850f8a489848a50048a50548a50648a50748a50848a50948a9028505a50fc904f036a90f25038507a5034a4a4a4a8506aaa900186507cad0fb8508a50fd006201ef14ce9f0c901f0062095f14cf2f02061f12039f14cf2f0200af168850968850868850768850668850568850068a868aa6860a603a000a9ff9104c8c8a5029104c8c8cad0f160a502a608a0019104186901c848b104293f910468c8c8c8cad0ec60a000a606a5018509a50991041869088509c8c8c8a5009104c8cad0eca5001869088500c607d0db60a001840aa50838e506a8850ba606984818986502a40a9104c8b104293f49409104c8c8c8840a68a8c8cad0e2a50b38e50610d660a000a606a5018509a9ff9104c8c8c8c8cad0f7a5001869088500c607d0e460ad0220a51029fb8d0020a9208d0620a9008d0620a204a000a9248d072088d0facad0f7a9238d0620a9c08d0620a040a9008d072088d0fa608d0620c8b1008d0620c8b1000a48a5100904b00229fb8d00208510680a90030902c84a4aaab001c8b1008d0720cad0f5389865008500a90065018501ae0220a000b100d0bba5128d0520a5138d052060d8a9044600900548204ef26818e90010f2600a0aa88501ae3003b900c09d3103202df3c8b900c09d3103202df3c8b900c029879d3103290785028a386502202ff3aa8e3003a9009d3103c8b900c08503ca18b92000290ff001189002a9249d3103cac602f022b9200029f0084a4a4a4a28f001189002a9249d3103a5032901f0013888cac602d0caa5032910f00ce8a40118b9200069379d310360a000b102290f8505b1024a4a4a4a8504ae3003a5019d3103202df3a5009d3103202df3a504850609809d3103202df3c8b1029d3103c606d0f3202df318a90165008500a900650185018e3003c605d0c3a9009d310360e88ac93f900aae3003a9009d3103686860a2ffd002a2008604a200860586068607a5012908d001e8a5009506a5014c5ef329070a0aaaa504f027b524f02718b5278503a50720e3f39527b5268503a50620e3f39526b5258503a50520e3f3952560b524f0d938b5278503a5072004f49527b5268503a5062004f49526b5258503a5052004f49525b525d008b526d004b527f006b020b52449ff952438a9008503b5272004f49527b5262004f49526b5252004f49525602026f46501c90a900269051865028502a50329f065029004695f3860c9a0b0f8602026f4e5018501b00a690a8501a502690f8502a50329f038e502b00369a01805016048290f85016829f08502a503290f60a900850418a500691029f04a4aa8a50029070a0aaab92000f051b524f02638b923008503b5272004f4b922008503b5262004f4b921008503b5252004f4b030b92000d030a9ff85043898d01e9010b5248520b5258521b5268522b5278523a5002908f006cacacaca10ab60b524f0afb92000d0d01890d2a209c6341006a90a8534a210b535f002d635ca10f760ae3003a5019d3103202df3a5009d3103202df3a9019d3103202df3989d3103202df3a9009d31038e300360a51829028500a5192902450018f0013866186619661a661b661c661d661e661f60a9018d1640a200a9008d16402022f5e82022f560a00848bd164085004a05004a682a88d0f186000600a600b4148400951429ff100624001002297fb415951598290f3515f00609f035159515603f00200f152c120f2702170f3036060f302c240f0236160f3027240f1630370f06270223c048ff23c80355aa2223cd430f202cc73f208184505152532082845455565720838458595a5b202ac73f20ad463020ca433020d2c23f21024e3021100c3e3e453d3d3d3c3c3c3b3b3b212d0f3f24243737373636363535354934342159013f216d114038383939393a3a3a3b3b3b433c3c3d3d21841a3d3d3d3e3e3e303030313131323232333333344934353535363621a40636364b37373721c6013f21e21730303e3e453d3d3d3c433c3b3b3b3a3a3a39393938403821abc23f2204183737373636364a35353434344833333232323131313030302230c23f2239013f224a013f225905403838393922641a3939393a3a3a423b3b3c3c3c443d3d3e3e3e3030303131313232228412323247333333343434354a3536363637373722a6013f22aec23f22c20b3b3b3a3a4139393938383822e21a34343333333232323131463030303e3e3e3d3d3d3c3c3c3b3b3b230c103f2424243737373636363535354934342339013f234c133f2424243838383939393a3a3a423b3b3c3c3c23614f3023700f3131313232323333333434343535352324824c4d2325824e4f003f00080f2c27020f3012243f1d0306301223c048ff23c9075500aaaa0f0f0f23e205040000000120c502707220e502717320ca42622105566221a4586222435a6222e25c6223615e62210801632117016321a8016321b70163224801632257016322e8016322f701632125c43f2129c43f2136c43f213ac43f21c4c43f21d0c43f21dbc43f2263c43f226cc43f2273c43f227cc43f2302c33f230fc33f231dc33f220a826e6f22188270712219827273003f00080f152c060f3027163f1d0312371523c048ff23c902aa2223cd430f23d182844823d705030c88008823e10388008823e90388008823d3828448202cc73f202ac73f20ca433020ad463020d2c23f210255302106025e5f2126025c5d210e025e5f212e025c5d23615e302346025c5d2366026061234e025c5d236e0260612146d0742147d075215c4230217942302196423021b2433021c2433021c9443021f94530223342302256423022794230229c42302282433022ca433022db433022f842302315423023224330233143302136c33f217cc43f21d3c33f21e4c53f21eac73f21ecc73f2219c33f22a3c43f22bc013f21828270712183827273211d826e6f214ed074214fd075003f000d0f2c38120f2727270f3030300f3f11012523e0505523f048aa2083c5622084c562208501622105016220a6c3622088c5622089016221090162208ac562208cc56220adc26220cec262208fc5622091c56220b2c26220b301622094016220f30162211401622096c5622097426220d7426221174262209ac36220dbc362209cc3622147c5622168c26221690162214a016221a9016221ca0162214cc562214d016221cd0162214ec5622150c5622171c2622192c2622153c5622155c5622156436221d643622198c2622197016222090f012419150a220e1b24100a160e240a22490f012419150a220e1b24100a160e240b22890f022419150a220e1b24100a160e240a22c90f022419150a220e1b24100a160e240b230516d301090801241712171d0e170d18240c1865151d0d64234b0d160a0d0e24121724130a190a1700206301ff206d03d0d1d2207602feff20940a25162a262728292a152d20b40a2b242c242424242c242f00ffffffa9c08d174020f2fba20086ff86fe86fdadf006c990b005a2008ef106c9d89003eef106a84a4a4a4a4a4a850098aef106d005386500d00318e5008df00660a0070ab00388d0fa6085f184f2a07f8e00408c0140602095faa200a8b901fbf00b9d0240b900fb09089d0340608c0540a204d0e78d08408a293ea208d0ddaa6a8a2a2a2a2907186d8d06a8b94cfb60984a4a4a85009838e50060a9908d0040608d8d8c8c8b8c83838f8f8f8f8d8584857f8585857f8d8d8d8d8d07f0000000690053004600d400bd00a8009f008d007e01ab017c0152013f011c00fd00ee00e1035702f902cf02a60280023a021a01fc01df01c406ae059e054d05010475043503f803bf0389050a1428501e3c0b060c1830602448070d1a3478274e0a08050a095040464a50565c646c747c88909a85f085fba0084c67fd84f0a971a000a29f208ffaa6f2bc67fbc6f1a5f1f0e12907d008984a7d67fba8d0072903d00ee6f2188c0240a0289001c88c0340a9004c00fe84f0a954a06aa29c208ffaa4f2a5f12903f00ac903d00b20d5fa85f2a8984a65f2a8982a2a2a8d02402a8d0340a5f1c918b05a4a09908d0040d052a4ffa5f04ab09046ffb081a6fad04a4ab0be46ffb0af4ab01d46ffb00a4ab05046ffb03b4c90fc84f0a92285f1a00b84f2a920209ffac6f2d004a90785f2a6f2bcf5faa25aa5f1c914b0044a0950aa2095fac6f1d0ce20e0faa90085f0f0c584f0a90a85f1acf0068c0240a9888d0340a51829081865f169feaabce5faa241d0cea90e8da506a085a94620b3facea506f019ada5060990a8888c0440d00da5f3d009ada506d0e6a4fe30d6a5fcd06aa5f9d066a4feada10646feb00c4ab00d4ab03c46feb0239051a928d01fa5f5d00446feb015a5f64a4a4a4a4a65f6902fa9008da1068d0840f030a9fe8ca106a20e86f5a0ff8c0840a0088c0b40d010a9fea4f5f0dbc007f006a5f6a820d7fa85f68d0a40a5f5f002c6f5a6fad049a5fcd0058da306f0404da306f018a5fc8da3062086fab9cdff8d8006a9d485f5a9ff85f6d005ce9806d01eac8006ee8006b1f5f0d9aa6a8a2a2a2a2907a8b962fb8d9806a91020bafaa5fdd006ad0201d03a602086fa84fbb959fea8b959fe8d8d06b95afe85f7b95bfe85f8b95cfe85f9b95dfe85faa9018d95068d96068d98068d0201a00084f3a5fbf009a4faf039ce9606d034e6fab1f7f03f100c20cafa8d9106a4fae6fab1f7209ffad004a010d00ea29fa5fbf008a206a5f9d002a2862093faad91068d9606a5fbf055ce9506d050a4f3e6f3b1f7d02020e0faa90085fa85f385f98d0201a4fbf005aca106d0038d0840a9108d04406020c4fa8d95068a293ea07f20b3fad004a210d011a289ad9506c918b008a286c910b002a2848e0440a4f9f023ce9806d01ee6f9b1f720c4fa8d98061869fe0a0ac9389002a938a4fbd002a9ff20bafa60090e13181d22272c31008ffe1b0008b0fe000c00cffe001a0805ff000b00adff000300beff000000c4ff00000f20ff213e00a1ff08008646824a8326468034323432343234323432343234323432843400a9aceee833351616571e20649e1e20649e008030308530801a1c811e821a801a1c811e821a5e5e5c5c5a5a58585716189a9659181a9c985f5e605e5c5a1f00811a1a18181616383882264226422846284630283028813a853c843a5e0220424a42605e601d00822642264281408042444826282c832e5656e0425a5e5c995858e2425e605e9b5a5aca4260624a8d5c5ee0425a5c5e1d00826f6eee7170f07776f65756d6a09a96b4a29c98b65c9c96575c96742f8502812e342e833481482830283028853081303630833681262c302c302c16161a1634161a1634161c1836181c183618162e8016363436831681022e8016363430862e811a821e308316004296b0e603830087423e423e423e423e423e42823e0a0c0e54900004120412041204920000000000090e121602021a021e201e005a4256560009070500ca8a8acacacecacecace8e8ececed2ced2ce00ff5fc89ec7f0ff0003070709091c0000030700060603030f0f0ffffffc810100103c3f3f3c000000c0f88020903c0000c0f860dc6ec0f8c0c0c0f0f0e0c0e0503830f0f0e00000070f0f121338000f070f000d0c0707001f1f1f18191e1c1e010301171f1e000080f00040207800c080f0c0b8dc80f000e060f0f0f0e0e0f080e0f0f0f0e00000070f0f121338003f070f000d0c0707033f0e0f1f3f7c7038c3e3cf1f3f0c000080f00040207800c080f0c0b8dc80f006f0f8e4fcfc7c00008ee6e0f0f07000000002060709091d0301030700060602000f0f0ffffffc810100000c3f3f3c0000000038c0e0d0fcc0c0c0f8201c2e0038e0e0b0f0f0e0c0e00060f0f0f0e000000003070709091c0000030700060603030f0f0ffffffc810100000c3f3f3c000000c0f88020903c0000c0f860dc6ec0f8e0f0f0f0f0e0c0e0470f0ef0f0e00000040c0c13133b070f070f030c0c0400000f0f0f1f1f1e1c1e00010f1f1f1e0000007000c0a0f880c080f0c0385c007040e060f0f0f0e0e0f0c0e0f0f0f0e00000070f0f121338000f070f000d0c0707011f1f1f1f1f1e1c1e0000131f1f1e000080f00040207800c080f0c0b8dc80f080f8f8f0f0f0e0e0f00707fef0f0e00000040c0c13133f070f070f030c0c0000000f0f0f1f3f7c703801010f1f3f1c0000007000c0a0f880c080f0c0385c007040c060e4fcfc7c0000c0e0e0f0f0700000070f0f1213380007070f000d0c0707010f0f0f1f3f7c70380000091f3f1c000080f00040207800c080f0c0b8dc80f080f8f8e0fcfc7c00000707eef0f07000000007070f0f387f7f00070300000704041f1f1f1f0f0f0f071e1f1f1f0f08000000e0f8fcfc1cf8f838f8c00000e02020f8fcfcf87880c0c078fcfcf8008000000003070709091c0000030700060603631f0f07377fdf0f06e0210107071f0f0600c0f88020903c0000c0f860dc6ec0fbe4fe70f1ffff000083c0f0f0fcfc0000070f0f12133870ff070f000d0c070f02df1e1f1f1f0f070101f35f1f1f4f37c080f00040207800fc80f0c0b8dc80f000f0e0e0f0fafefcd88fe7e0f0c888100000000708102040400000000708102020404020100807000020201008070000000000e01008040202000000e0100804040202040810e0000004040810e0000000000000000304081000000000000304081008040300000000080403000000000000000000c02010080000000000c02010081020c0000000001020c00000000000000000000000000100000000000000000201000000000000010000000000000000000000000000000000000000000000800000000000000000000000000000000000000121100000000101400000000060000010210100008000000000400101000000000810000000000004000000000c00001008000000020000000004000004020100000000000f07030000010101000000000000010300000000000001030707070301000000070707070301000000000000000000000000000000000000004239ffffffffffffffffffffffffff7f3f1f0f1fffffffff7f3f1f1ffffffff8f7effffffe7e3effffffffffffff7f07000000000000000703030100000000000000c0e0f0dbf6008080c0e0f0ffffcbe0c402d1e1d183ffffffffffffffff0fffe08f6e44ee60fffffff08000009f83e0e4c661331f0ffffff9f97f3f1f0f00000003070f5ba700010103070fffff730727408b878bc1fffffffffffffffff0ff0fe1ec44ee0cffffff1f030101f3800e4ec60c98f0e0ffff3f3ffcf8f0e000429cfffffffffffffffffffffffffffefcf8f0f8fffffffffefcf8f8ffffff1feff7fffffe7c70fffffffffffffefce000000000000000e0808000000000002040800000000000f0e0c0000080808000000000000080c000000000000080c0e0e0e0c080000000e0e0e0e0c080000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001f3f3f7f7f7f000f285c3f7f7f7f7f3e1f1f0f0f0f077f3e1f1f080000000060f0f8f8f8fcfc008040c4f6fefcfcf8f0f0e08080c0c0f8f0000080000000001f3f7fffff3e0f001c3f7fffff3e700000000100000000000000000000000000e0f0fcfefefffc0060f0f8fcfcfcff7cfcf8f0e00000007cfc8800000000000007070f0f001f3f00070300000704047f7f1f1f1f1e0f1f0c9eff1f1f1e0f0000e0e0f0f000f8fc00e0c00000e02020fefef8f8f878f0f83079fff8f878f000030705081b19053f030702070446e3c23f0f05373f3f3e1c4207070707030200e0f050086cccd0fee0f0a0f09032e321fef8d0fbffff3e0c2070f0f8f8f03000000079f9f3ff7b3f00010000001e7f3e3f3f7b7ffbf179383c3e7f7e18000000000080b0b8c693f7c0e04000003aef4be3f793c6b8b080005f4bef3a000060c0307cffffdf0b1f7f000c0f1f1f0f0e047f0b3336100a0f0784c74c090f050f07387cfcfceca0f0fc0040c0e0e0e0e042fca098d810a0e0c043c76220e040e0c000010d1d63c9efc7030400005cf7d2faefc9631d0d010000d2f75c00000207031c9e8fdffedefcfc000000187efe7c3cfcdeffcf9f9e00007cfe780000008000000000001e3f7d780000010000207c787cfbffff5f1f1f1f7cfefffe7c60e0e100000000008080007c8201827c0000000021a2a3b38f27fe10195adf4f73db0200000000030f1f1f000000030c1022201f1f0f03000000002123100c0300000000000000c0f0f8f8000000c0300864c4f8f8f0c00000000084040830c000000000000000030f1f1f000000030c1026231f1f0f03000000002120100c0300000000000000c0f0f8f8000000c030084404f8f8f0c00000000084c40830c000000000000000030f1f1f000000030c1020211f1f0f03000000002326100c0300000000000000c0f0f8f8000000c03008c484f8f8f0c00000000004440830c000000000000000030f1f1f000000030c1023211f1f0f03000000002022100c0300000000000000c0f0f8f8000000c030080484f8f8f0c000000000c4640830c00000000000000f30603f7f000000002f3f60207f3f60300f00000020603f2f00000000000000f80603feff00000000fafe0302fffe0306f80000000203fefa00000000000000002f3f60200000000f30603f7f20603f2f000000007f3f60300f00000000000000fafe0302000000f80603feff0203fefa00000000fffe0306f800000000440041204b271f00000040200000010f1e1f1f1f0f0f030307060607030000002050206048e0f00000400000080040f8783c3c3cfcf8e0e0f0d0d0f0e0000010012a0ca6171f1f00000200800003075e3c3d3d3e1f0f07070f0e0e0f070300000080c860e0f4f800000008008024c07c1c2e2e1efcf8e0f0f8d8d8f8f0c000ffff386cc683ffffffff386cc683ffffffff386cc683ffffffff386cc683ffff925438fe385492000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000023972f00000000000001036eeff7ff7f3f5f0f070703271f07000000000000f8fcfe5e0000000000f0f8ac5e0c9efefefef8c0acf8f8f8f0c00000000000000003072f00000000000001034e6efe7f3f1f0f03070707271f07010000000000f8fcfe560000000000f0f8ac560c0e1ffffffef8acf8f8fcfcf8f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000708101020202000070810102020201f2f373a3d3e3f001f3f3f3f3e3f3f000005193363c7c7c400071f3f7fffffdd800000000003030089010101010000000000000000000000000000000000030700000f0080631e000f0f001f7f1c00000103193c19235120010219241922112c00000000000000001f07030301010100003f1f00010001000000000103070d191100010001001f3f29190d070301000000fcf8008000800000000080c0e0b098880080008000f8fc9498b0e0c080000000000000003f1f0000000000000000010101410101001f3f0f79a1790f0100000000000000fcf8000000000000000080808082808000f8fcf09e859ef08000000000001e3f3f3f3f0000001e3f3f3f3f1f0f0703010000001f0f0703010000000000003c7efefefe0000003c7efefefefcf8f0e0c0800000fcf8f0e0c0800000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0819090909091c000000000000000000380505190505380000000000000000003c21213d05053800000000000000000018252519252518000000000000000000c62929292929c60000000000000000000000000000000000000000010363311f000000003cb67cf80000fcfec0408000030303070c1b77077f3f53070c1b07070f0f1f3f7f3f00000f0f03383f0e1c0ee0f0f0f018fcfcfc0090f0f018fcf0f8f8fcfffffef00000f8f0873dfe1c0800030303030100071f7f3f53030100071fffff7f3f0f030000cf63383e7b301800e0f0f0e0fe3cf0fc0090f0e0f838f0f0fcf8f8f8f8f8f800f8f8f83880f8005cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00010333190f3f1f00010333190f3f1f2b07050d0b1b1b3b2b07050d0b1b1b03090007070f0d0100010003050e0d0100f8fcf8ecf8f0c0c0f8fcc04080800080f0f8f8e8cce6fbffd0f8f8e8cce6f8fefffefefefe8f0000fefe06f80e800000010f0000041e0003010f071d3b010f02070f1f0f070f0f030203027717010000e0f0f048c89c00f0e0f000b03060f010f8fcfcf8f878706030f0d0fcfe08000000007c8afefefefe0010007400000000fe7c0000000000000000101010101010070b0f0b0b0b0b070004001404040400c0e0e0e0e0e0e0c00000001f000000000307070707070703000000f800000000e0d0d0d0d0f0d0e00020202820002000000113373b747a3e0000082512533339d898a8d8da7428c80880309ccab8987808593071792b36160008004000313d19c6c4ccccb87cecc80080c0c0c088b8b8384cc6c6c664380000000000000000001838181818187e0000000000000000007cc60e3c78e0fe0000000000000000007e0c183c06c67c0000000000000000001c3c6cccfe0c0c000000000000000000fcc0fc0606c67c0000000000000000003c60c0fcc6c67c000000000000000000fec60c1830303000000000000000000078c4e47886867c0000000000000000007cc6c67e060c78000000000000000000386cc6c6fec6c6000000000000000000fcc6c6fcc6c6fc0000000000000000003c66c0c0c0663c000000000000000000f8ccc6c6c6ccf8000000000000000000fec0c0fcc0c0fe000000000000000000fec0c0fcc0c0c00000000000000000003e60c0dec6667e000000000000000000c6c6c6fec6c6c60000000000000000007e18181818187e0000000000000000001e060606c6c67c000000000000000000c6ccd8f0f8dcce0000000000000000006060606060607e000000000000000000c6eefefed6c6c6000000000000000000c6e6f6fedecec60000000000000000007cc6c6c6c6c67c000000000000000000fcc6c6c6fcc0c00000000000000000007cc6c6c6decc7a000000000000000000fcc6c6cef8dcce00000000000000000078ccc07c06c67c0000000000000000007e181818181818000000000000000000c6c6c6c6c6c67c000000000000000000c6c6c6ee7c3810000000000000000000c6c6d6fefeeec6000000000000000000c6ee7c387ceec60000000000000000006666663c181818000000000000000000fe0e1c3870e0fe000000000000000000000000000000000000000000000000000000060e0808080800000000000000000078657965657800000000000000000000e496969796e60000000000000000000059595959d94e000000000000000000003c70703c0c780000000000000000000000c6ee282828280000000000000000080808080e060000000000000000000028282828eec600000000000000000000000060701010101000000000000000001c3e3c3830006000000000000000000010101010706000000000000000000000ffff386cc683ffff0000000000000000ff386cc683ffff000000000000000000386cc683ffff000000000000000000006cc683ffff0000000000000000000000c683ffff00000000000000000000000083ffff00000000000000000000000000ffff0000000000000000000000000000ff00000000000000000000000000000000000000000000ff0000000000000000000000000000ffff00000000000000000000000000ffff38000000000000000000000000ffff386c0000000000000000000000ffff386cc600000000000000000000ffff386cc683000000000000000000ffff386cc683ff0000000000000000000000000000000081ff818181ff818100000000000000ff81ff818181ff81000000000000ffff3881ff81818100000000000000ffff386c81ff818100000000000000ffff386cc681ff8100000000000000ffff386cc68381ff00000000000000ffff386cc683ff8100000000000000ff386cc683ffff000000000000000081386cc683ffff000000000000000081816cc683ffff0000000000000000ff8181c683ffff000000000000000081ff818183ffff00000000000000008181ff8181ffff0000000000000000818181ff8181bf5f5f5f005f5155ff7f7f7f7f7f7f7f515f005f5f5f5fbf7f7f7f7f727f7ffffffefefe00fe2626fffefefefefefefe22fe00fefefefefffefefefe4afefeff07000f1f1f1f1f1f050f0b1b131313131f1f1f1f1f0f0007131313131b0b0f0507000f1f1f1f1f1f050f0b1b131313131f1f1f1f1f0f0007131313131b0b0f05e000f1fbfbfbfbfba0f1d1dbcacacacafbfbfbfbfbf100e0cacacacadbd1f1a0e000f1fbfbfbfbfba0f1d1dbcacacacafbfbfbfbfbf100e0cacacacadbd1f0a0fc00feffffffffffb4fe7a7b79797979fffffffffffe00fc797979797b7afeb4fc00feffffffffffb4fe7a7b79797979fffffffffffe00fc797979797b7afeb400001f10101f00007fbfffb2b1ffbf7f0000f80808f80000fefdffcd6dfffdfe00010202f1080403ffffaefeff0f0703008040408f1020c0ffff757ffff0e0c0030408f10202010003070ffffeaeffffc020108f40408000c0e0f0ff7f75ffffffffc38181c3ffffff00c38181c3ff00ff9900000081818181667e7e7effff7e00000000606000000000000000000000000000006c6c080000000000000000003c18181818183c000000000000000000ff666666666666ff00000000000000000301000000000000030100000000000083d1e1d10284f0ceffffffffffffffffc080000000000000c080000000000000c18b878b40210fd3ffffffffffffffffffffff1f0f1e3f7fffffff1f1f3f7ffffffffff8f078fcfefffffff8f8fcfeff00000000003c428100000000003c428181bd7effe7ffffff81bd7ea5dbe7ffff01071f3f7fffffdd0005193363c7c7c48901010101010000800000010101000080e0f8fcfeffff3b00a098ccc6e3e323110000000040800001000000004080000101010101010101010101010101010180808080808080808080808080808080010300000319000001030307041c3f7f00007c02010000007fffff7f7f1f0300000001010307070f000001010307070f0f070f0701102000ffff3f3f7ffefc30f8fe7f1f0f193070f8fefffffffffffffb73270f1f1f3f7fffffffffffffff7ffffffffffefdf8f6ffffffffffffffffefcf9f1f0f2d5040efcf9f1f0f7fffff00000000e0fefff3000000f0fefffffffbfbfbfbfbf3f7e7ffffffffffffffffcf9f3f3f3f0f0300ffffffffffffffffc0f0fcf0f0980800fffffff0f0f8f8f800000000000080c0000000000080c0e0e0e0f0f0f0f0f8f8f0f0f8f8f8fcfcfefeffffffffffffffffffffffffffffff3f1f1f0f07000000ffffff0f070000000000c0e0f0f0f0f80080c0e0f0f0f0fcf9ffffffff0e0214ffffffffff0f1f3f80a02020a0800000c0e0e0e0e0c0c08001050404050100000307070707030301000003070f0f0f0f000103070f0f0f3f9fffffffff704028fffffffffff0f8fc0000000000000103000000000001030707070f0f0f0f1f1f0f0f1f1f1f3f3f7f7ffffffffffffffffffffffffffffffffcf8f8f0e0000000fffffff0e000000000000000077fffcf0000000f7fffffffdfdfdfdfdfcfefe7fffffffffffffffff3f9fcfcfcf0c000ffffffffffffffff030f3f0f0f191000ffffff0f0f1f1f1f1f7ffef8f0980c0e1f7fffffffffffffdfcee4f0f8f8fcfefffffffffffffffeffffffff7fbf1f6ffffffffffffffffff7f3f9f8f0b40a02f7f3f9f8f0feffff80c00000c098000080c0c0e02038fcfe00003e4080000000fefffffefcf8c00000008080c0e0e0f000008080c0e0e0f0f0e0f0e080080400fffffcfcfe7e3f0c00000103030307070001030707070f0f07030303030303010f0f0707070303010000000000010204010101000003070f0000000000001c3b0000000001033f7f7efefffffffffdf9fffffffffffffdf9f3f7f6eefdfcf8e1f3ffffffffffffffd3cbc3e1f9394200ffffffffffffffff070f193063727001070f1f3ffcfcffff001f20c0c0f0ffffffffffffffffffffabc1819182fce0ceffffffffffffffffe5daf0e0c0000000fffff0e0c0808000f0f8cc86622606c0f0f8fcfe9f9fffff00fc06030107ffffffffffffffffffffd5838189413f07d3ffffffffffffffff6fdb0f0703000000ffff0f070301010000000000000038dc0000000080c0fcfe7e7f7fffffffbf9fffffffffffffbf9fcfef6f77bf3f1f87cfffffffffffffffcbd3c3879f9c4200ffffffffffffffff000080c0c0c0e0e00080c0e0e0e0f0f0e0c0c0c0c0c0c080f0f0e0e0e0c0c08000000000008040208080800000c0e0f0000000010307070700000103070707070301000000000101030100000001030301010703040000000303071f3f3f00000000000000000007000000000103030f0e3e7fffffeff7f83f7fffffffffffffffffff1f1f7ffffeffffff1f7ffffffffffffffcf8800000fffffffcf8f80000307f7f3f87f0ffffcf88ddc8f8ffffffe5dac00000000000ffffc0000000000006fffffef107fffff988dd890fffffff00010207000020ff03070f0787c3e0ff7f7f7ffffffffffefffffffffffffffefcb87878b078fcfefcf8f8f8f8fcfeffffffffffff9c4200ffffffffffffffff000020408a1e7ebec0f0fcfcfefefefedffffefcf0e08000fffffefcf0e080000000040251787efd030f3f3f7f7f7efffbff7f3f0f070100ffff7f3f0f070100008040e0000004ffc0e0f0e0e1c307fffefefeffffffff7fffffffffffffff7f3f1d1e1e0d1e3f7f3f1f1f1f1f3f7fffffffffffff394200ffffffffffffffff6fdb030000000000ffff03000000000000000000000000e00000000080c0c0f0707c7efffff7ef1ffcfefffffffffffffffffff8f8fefffffffffff8feffffffffffff3f1e010000ffffff3f1f1f000000000080c0e0e0e0000080c0e0e0e0e0c080000000008080c08000000080c0c08080e0c020000000c0c0e0f8fcfc00001f06060606060600000000000000000039656565656539000000000000000000e0b0b0b6e680800000000000000000003c4299a1a199423c0000000000000000000000030600010700000000030703070f1f3f7f7f7fff7f1f3f7fffffffff7f00000080000000a0000000c0e0f0f0f8e0f0e0ddfaeb8000fcf8f0ffffffffff00000003060001010000000003070f1f0b07035daf5300003f1f07ffffffffff00000080000060f0000000c0c0c0e0f8f8fcfcfefeffff7efcfefefffffffffe000000000000213f36367e7f7f7f3f3f3f1f1f0f070300003f1f1f0f070300003e1e1e0e0f1f9f9f3f1fdfcfcf9fdfffdfffffffffdfe700ffffffffffffff0f200f3040983e1f00ffffffffffffffff81362eafaed1ef87fff9f0f0b1dfef8702f806010c3efc00ffffffffffffffffc0363e7ab6cdfbf0ffcf8787cefdfbf03e3c3c38f87c7e78fefcfcf8fbfdfefff87f7ffefffff381fffffffffffffff9000000104020000000000078fcfcfcfc060e7efefefcf8f0fefefefefefcf8f0000000000000000100000000000000000200080113010000010f1f1f3b3301010000000000000000000000366cfdffff00437f7f7f3f1f07ff7f7f7f7f3f1f07000000000000c00000000000000000e01038bffffffffffff8ffffffffffffff7e1e1e0e0f1e1e3eff7f1f0f0f9f9fbf7f7fbfffffffe7c07fffffffffffffcf000010fdfaeb80000000f0ffffffffff201f608e3f7f7f7cfffffff1c4eec48339362eafaed1ef87c7f9f0f0b1dfef870000045faf530000000007ffffffffff02fc0338feffff1effffffc745ee44e1c0363e7ab6cdfbf0ffcf8787cefdfbf000000000000e0808000000000001070f1f3fffffffffff7f3fffffffffffffff3f3e3cb878787e7efffffdf8fffffefffd797bfffffff380fffffffffffffff80000000000000000000000000000c0f01084e0c080800000fcfeece0c0c080800048200000040efe70fcfcfcfcfcfefefefcfcf8f0e08000fefcfcf8f0e080000f06060606060f00000000";
int hexLen = (int)Math.Round((double)((double)hexData.Length / 2d),0);
byte[] hexBytes = new byte[hexLen];
for (int hbi = 0; hbi < hexLen; hbi++)
hexBytes[hbi] = Convert.ToByte(hexData.Substring(hbi*2,2),16);
File.WriteAllBytes("donkey kong.nes",hexBytes);
public byte CpuRead(ushort _address)
public void CpuWrite(ushort _address,byte _value)
public byte PpuRead(ushort _address)
public void PpuWrite(ushort _address,byte _value)
public Cartridge(string fileName)
if (File.Exists(fileName))
cartBytes = File.ReadAllBytes(fileName);
public CartHeader(byte[] _cartBytes)
if (_cartBytes.Length >= 16)
for (int i = 0; i < 16; i++)
cartBytes[i] = _cartBytes[i];
constant[i] = _cartBytes[i];
PrgRAMSize = cartBytes[8];
TVSystem1 = cartBytes[9];
TVSystem2 = cartBytes[10];
byte Current_Instruction;
public void ConnectCpu(Bus _bus, bool _bcdEnabled)
BCDEnabled = _bcdEnabled;
public void SetPCL(byte _pcl)
public void SetPCH(byte _pch)
return (ushort)((ushort)PCL | (ushort)((ushort)PCH << 8));
public void SetPC(ushort _address)
PCL = (byte)(_address & 0x00ff);
PCH = (byte)(_address >> 8);
public void IncPC(byte _value = 1)
SetPC((ushort)(GetPC() + 1));
public ushort GetStackAddress()
return (ushort)((ushort)0x0100 | (ushort)((ushort)SP_Reg << 8));
byte retValue = Read(GetPC());
public void ReadNextInstruction()
Current_Instruction = Fetch();
return Read(GetStackAddress());
public void Push(byte _value)
Write(GetStackAddress(),_value);
return ((P_Reg & (byte)FLAGS.N) > 0);
public void SetN(bool _value = true)
P_Reg &= ((byte)FLAGS.N ^ 0xff);
public void SetN(byte _value)
SetN((_value & (byte)FLAGS.N) > 0);
return ((P_Reg & (byte)FLAGS.V) > 0);
public void SetV(bool _value = true)
P_Reg &= ((byte)FLAGS.V ^ 0xff);
return ((P_Reg & (byte)FLAGS.U) > 0);
public void SetU(bool _value = true)
P_Reg &= ((byte)FLAGS.U ^ 0xff);
return ((P_Reg & (byte)FLAGS.D) > 0);
public void SetD(bool _value = true)
P_Reg &= ((byte)FLAGS.D ^ 0xff);
return ((P_Reg & (byte)FLAGS.B) > 0);
public void SetB(bool _value = true)
P_Reg &= ((byte)FLAGS.B ^ 0xff);
return ((P_Reg & (byte)FLAGS.I) > 0);
public void SetI(bool _value = true)
P_Reg &= ((byte)FLAGS.I ^ 0xff);
return ((P_Reg & (byte)FLAGS.Z) > 0);
public void SetZ(bool _value = true)
P_Reg &= ((byte)FLAGS.Z ^ 0xff);
public void SetZ(byte _value)
return ((P_Reg & (byte)FLAGS.C) > 0);
public void SetC(bool _value = true)
P_Reg &= ((byte)FLAGS.C ^ 0xff);
Push((byte)(P_Reg | (byte)FLAGS.B | (byte)FLAGS.U));
Push((byte)(P_Reg | (byte)FLAGS.B | (byte)FLAGS.U));
switch (Current_Instruction)
ushort ASLzpgAddr = ZeroPage();
Write(ASLzpgAddr,ASL(Read(ASLzpgAddr)));
ushort ASLabsAddr = Absolute();
Write(ASLabsAddr,ASL(Read(ASLabsAddr)));
ushort BPLAddr = Relative();
ushort ORAindyPC = GetPC();
ushort ORAindyAddr = Indirect_Y();
AddClick(ORAindyAddr,ORAindyPC);
ushort ASLzpgxAddr = ZeroPage_X();
Write(ASLzpgxAddr,ASL(Read(ASLzpgxAddr)));
ushort ORAabsyPC = GetPC();
ushort ORAabsyAddr = Absolute_Y();
AddClick(ORAabsyAddr,ORAabsyPC);
ushort ORAabsxPC = GetPC();
ushort ORAabsxAddr = Absolute();
AddClick(ORAabsxAddr,ORAabsxPC);
ushort ASLabsxAddr = Absolute_X();
Write(ASLabsxAddr,ASL(Read(ASLabsxAddr)));
ushort ROLzpgAddr = ZeroPage();
Write(ROLzpgAddr,ROL(Read(ROLzpgAddr)));
ushort ROLabsAddr = Absolute();
Write(ROLabsAddr,ROL(Read(ROLabsAddr)));
ushort BMIAddr = Relative();
ushort ANDindyPC = GetPC();
ushort ANDindyAddr = Indirect_Y();
AddClick(ANDindyPC,ANDindyAddr);
ushort ROLzpgxAddr = ZeroPage_X();
Write(ROLzpgxAddr,ROL(Read(ROLzpgxAddr)));
ushort ANDabsyPC = GetPC();
ushort ANDabsyAddr = Absolute_Y();
AddClick(ANDabsyAddr,ANDabsyPC);
ushort ANDabsxPC = GetPC();
ushort ANDabsxAddr = Absolute_X();
AddClick(ANDabsxAddr,ANDabsxPC);
ushort ROLabsxAddr = Absolute_X();
Write(ROLabsxAddr,ROL(Read(ROLabsxAddr)));
ushort LSRzpgAddr = ZeroPage();
Write(LSRzpgAddr,LSR(Read(LSRzpgAddr)));
ushort LSRabsAddr = Absolute();
Write(LSRabsAddr,LSR(Read(LSRabsAddr)));
ushort BVCAddr = Relative();
ushort EORindyPC = GetPC();
ushort EORindyAddr = Indirect_Y();
AddClick(EORindyPC,EORindyAddr);
ushort LSRzpgxAddr = ZeroPage_X();
Write(LSRzpgxAddr,LSR(Read(LSRzpgxAddr)));
ushort EORabsyPC = GetPC();
ushort EORabsyAddr = Absolute_Y();
AddClick(EORabsyPC,EORabsyAddr);
ushort EORabsxPC = GetPC();
ushort EORabsxAddr = Absolute_X();
AddClick(EORabsxPC,EORabsxAddr);
ushort LSRabsxAddr = Absolute_X();
Write(LSRabsxAddr,LSR(Read(LSRabsxAddr)));
ushort RORzpgAddr = ZeroPage();
Write(RORzpgAddr,ROR(Read(RORzpgAddr)));
ushort RORabsAddr = Absolute();
Write(RORabsAddr,ROR(Read(RORabsAddr)));
ushort BVSAddr = Relative();
ushort ADCindyPC = GetPC();
ushort ADCindyAddr = Indirect_Y();
AddClick(ADCindyPC,ADCindyAddr);
ushort RORzpgxAddr = ZeroPage_X();
Write(RORzpgxAddr,ROR(Read(RORzpgxAddr)));
ushort ADCabsyPC = GetPC();
ushort ADCabsyAddr = Absolute_Y();
AddClick(ADCabsyAddr,ADCabsyPC);
ushort ADCabsxPC = GetPC();
ushort ADCabsxAddr = Absolute_X();
AddClick(ADCabsxAddr,ADCabsxPC);
ushort RORabsxAddr = Absolute_X();
Write(RORabsxAddr,ROR(Read(RORabsxAddr)));
ushort BCCAddr = Relative();
ushort BCSAddr = Relative();
ushort LDAindyPC = GetPC();
ushort LDAindyAddr = Indirect_Y();
AddClick(LDAindyPC,LDAindyAddr);
ushort LDAabsyPC = GetPC();
ushort LDAabsyAddr = Absolute_Y();
AddClick(LDAabsyPC,LDAabsyAddr);
ushort LDYabsxPC = GetPC();
ushort LDYabsxAddr = Absolute_X();
AddClick(LDYabsxAddr,LDYabsxPC);
ushort LDAabsxPC = GetPC();
ushort LDAabsxAddr = Absolute_X();
AddClick(LDAabsxPC,LDAabsxAddr);
ushort LDXabsyPC = GetPC();
ushort LDXabsyAddr = Absolute_Y();
AddClick(LDXabsyPC,LDXabsyAddr);
ushort DECabsAddr = Absolute();
Write(DECabsAddr,DEC(Read(DECabsAddr)));
ushort BNEAddr = Relative();
ushort CMPindyPC = GetPC();
ushort CMPindyAddr = Indirect_Y();
AddClick(CMPindyPC,CMPindyAddr);
ushort CMPabsyPC = GetPC();
ushort CMPabsyAddr = Absolute_Y();
AddClick(CMPabsyPC,CMPabsyAddr);
ushort CMPabsxPC = GetPC();
ushort CMPabsxAddr = Absolute_X();
AddClick(CMPabsxPC,CMPabsxAddr);
ushort DECabsxAddr = Absolute_X();
Write(DECabsxAddr,DEC(Read(DECabsxAddr)));
ushort INCzpgAddr = ZeroPage();
Write(INCzpgAddr,INC(Read(INCzpgAddr)));
ushort INCabsAddr = Absolute();
Write(INCabsAddr,INC(Read(INCabsAddr)));
ushort BEQAddr = Relative();
ushort SBCindyPC = GetPC();
ushort SBCindyAddr = Indirect_Y();
AddClick(SBCindyAddr,SBCindyPC);
ushort INCzpgxAddr = ZeroPage_X();
Write(INCzpgxAddr,INC(Read(INCzpgxAddr)));
ushort SBCabsyPC = GetPC();
ushort SBCabsyAddr = Absolute_Y();
AddClick(SBCabsyAddr,SBCabsyPC);
ushort SBCabsxPC = GetPC();
ushort SBCabsxAddr = Absolute_X();
AddClick(SBCabsxAddr,SBCabsxPC);
ushort INCabsxAddr = Absolute_X();
Write(INCabsxAddr,INC(Read(INCabsxAddr)));
return (ushort)((ushort)Fetch() | (ushort)((ushort)Fetch() << 8));
public ushort Absolute_X()
return (ushort)((ushort)((ushort)Fetch() | (ushort)((ushort)Fetch() << 8)) + X_Reg);
public ushort Absolute_Y()
return (ushort)((ushort)((ushort)Fetch() | (ushort)((ushort)Fetch() << 8)) + Y_Reg);
public ushort ZeroPage_X()
public ushort ZeroPage_Y()
return (ushort)((ushort)Fetch() + (ushort)Y_Reg);
ushort retValue = 0x0000;
ushort effective_address = (ushort)((ushort)Fetch() | (ushort)((ushort)Fetch() << 8));
retValue = (ushort)((ushort)Read(effective_address) | (ushort)((ushort)Read((ushort)(effective_address + 1)) << 8));
public ushort Indirect_X()
ushort retValue = 0x0000;
ushort effective_address = (ushort)msb;
retValue = (ushort)((ushort)Read(effective_address) | (ushort)((ushort)Read((ushort)(effective_address + 1)) << 8));
public ushort Indirect_Y()
ushort retValue = 0x0000;
ushort effective_address = (ushort)((ushort)Fetch() + (ushort)Y_Reg);
retValue = (ushort)((ushort)Read(effective_address) | (ushort)((ushort)Read((ushort)(effective_address + 1)) << 8));
ushort retValue = GetPC();
ushort relAddr = Fetch();
if ((relAddr & 0x80) > 0)
public void ADC(byte _value)
ushort carry = (ushort)(P_Reg & (byte)FLAGS.C);
ushort sum = (ushort)((ushort)A_Reg + (ushort)_value + carry);
SetC((sum & 0x0100) > 0);
A_Reg = (byte)(sum & 0x00ff);
public void AND(byte _value)
public byte ASL(byte _value)
SetC((_value & (byte)FLAGS.N) > 0);
retValue = (byte)(retValue << 1);
public bool BCC(ushort _address)
public bool BCS(ushort _address)
public bool BEQ(ushort _address)
public void BIT(byte _value)
SetV((_value & (byte)FLAGS.V) > 0);
SetZ((byte)(_value & A_Reg));
public bool BMI(ushort _address)
public bool BNE(ushort _address)
public bool BPL(ushort _address)
public bool BVC(ushort _address)
public bool BVS(ushort _address)
public void CMP(byte _value)
ushort sum = (ushort)((ushort)A_Reg + (ushort)NegateByte(_value));
SetC((sum & 0x0100) > 0);
public void CPX(byte _value)
ushort sum = (ushort)((ushort)A_Reg + (ushort)NegateByte(_value));
SetC((sum & 0x0100) > 0);
public void CPY(byte _value)
ushort sum = (ushort)((ushort)A_Reg + (ushort)NegateByte(_value));
SetC((sum & 0x0100) > 0);
public byte DEC(byte _value)
byte retValue = (byte)(_value + 0xfe);
public void EOR(byte _value)
public byte INC(byte _value)
byte retValue = (byte)(_value + 1);
public void JMP(ushort _address)
public void JSR(ushort _address)
public void LDA(byte _value)
public void LDX(byte _value)
public void LDY(byte _value)
public byte LSR(byte _value)
byte retValue = (byte)(_value >>> 1);
SetC((_value & (byte)FLAGS.C) > 0);
public void ORA(byte _value)
Push((byte)(P_Reg | (byte)FLAGS.U | (byte)FLAGS.B));
byte status = (byte)(P_Reg & 0x30);
P_Reg |= (byte)(Pull() & (0x30 ^ 0xff));
public byte ROL(byte _value)
byte carry = (byte)(P_Reg & 0x01);
SetC((retValue & 0x80) > 0);
retValue = (byte)((retValue << 1) + carry);
public byte ROR(byte _value)
byte carry = (byte)((P_Reg & 0x01) << 7);
SetC((retValue & 0x01) > 0);
retValue = (byte)((retValue >>> 1) + carry);
byte status = (byte)(P_Reg & 0x30);
P_Reg |= (byte)(Pull() & (0x30 ^ 0xff));
public void SBC(byte _value)
ushort carry = (ushort)(P_Reg & (byte)FLAGS.U);
ushort sum = (ushort)((ushort)A_Reg + (ushort)NegateByte(_value) + carry);
SetC((sum & 0x0100) > 0);
A_Reg = (byte)(sum & 0x00ff);
public void STA(ushort _address)
public void STX(ushort _address)
public void STY(ushort _address)
public byte NegateByte(byte _value)
return (byte)((byte)(_value ^ 0xff) + 1);
public void AddClick(ushort _value0, ushort _value1)
if ((_value0 & 0xff00) != (_value1 & 0xff00))
public byte Read(ushort _address)
retValue = bus.CpuRead(_address);
public void Write(ushort _address,byte _value)
bus.CpuWrite(_address,_value);