From a0aeb86fd4469370abf65c4a920f92c3c82dec29 Mon Sep 17 00:00:00 2001 From: merrywhether Date: Sat, 21 Dec 2024 11:33:32 -0800 Subject: [PATCH] day 19 --- src/19/enput.txt | 2 ++ src/19/input.test.ts | 14 ++++++++++++ src/19/main.ts | 53 ++++++++++++++++++++++++++++++++++++++++++++ src/19/sample.txt | 10 +++++++++ src/19/test.ts | 14 ++++++++++++ 5 files changed, 93 insertions(+) create mode 100644 src/19/enput.txt create mode 100644 src/19/input.test.ts create mode 100644 src/19/main.ts create mode 100644 src/19/sample.txt create mode 100644 src/19/test.ts diff --git a/src/19/enput.txt b/src/19/enput.txt new file mode 100644 index 0000000..15d95db --- /dev/null +++ b/src/19/enput.txt @@ -0,0 +1,2 @@ +116,244,147,186,100,85,10,91,96,17,94,96 +c4673bf0fab123af041e07fb6dedf4e3aedba08fdffbf5d451920f4823a72e88596ff43a6b78f005da3d29109c5311429b580814ef5a4c224ca71683ede6f71bf1306ce440353c1e2ecabfffa3192e8665a118d73fdaa808559d72db603e1e2d67deb9b258fcb6f98145eb5b829964dbd0b9c996c210af550bc5a0bf379b011c53c45e871b940ea1f619e2895ebc6fede025935fc761e4a978a714661387c47d773ea675b6fe136cd0efefd5f703d36f338cc7722aec1fc8938a28f270a4f1cbf07cba09f9333c3b11ecaebe8e0d8e338d0d8e307bdb78751a224e377fe504d0e2054de3b35f53ce3137449b3386abb425eb38e2ae026019c9837a454df5019f974b2ca35768e39e6557850ac4976306f17740d4e96202e6b9232dea347f05c53355eff92b7a19b4af1721b74e0ead693d3cbb9a5ab2f81b5fc837b3b7b824150b3f1b07b65edb2009fd2b3cdb612b3602634a814f84dbbb5e2292c82e3a19471448153954700b44622ff8bdb1a537b9c550bb42e3679071a83392039b412e05b9c17db2f6b5fd503b170513842478915c879a2bb476edd385fd27d9540176377a728b2ec68e561b2f5836b21c255434f643d7d8fb5770c00c6c942706a7c7ad8ae22540e46dbf62e22708a0be22e8e37ae1d23455893940e1a466bbb1e6b2360e0aec939cbded5f026e9afe4da891017370f6552ba3ce56aa6a81b6ccb6990cd3a6dd3ccba35ab816f765248edf4dd133515a32b94118aa91cde817a31948720f188f80a53a1cdf626dc7b59f91bb58364bc0e1fa707f2aafa1b5cf00acced66af9b6ce7e6c3831dffafd0c9705f3615a6a4ebb8603af4aef703fb90b79f55b96d7be48c96b94b0657e30f8d3556cd6ba45264d1d4bf54bfb060d2fe858bb6fbe5077a80cb09b2dce36ee52d6b8d4fb426c64662725c5eff94cba5af931753e21f37a3eb824a03c74c81ee8bea5be4b3c9f252b4b2e242dfb59cf9cb8f97464d752c1070988303ef896ff9316a1ccdf75a887ebacd7b46f5382e4c2a35ece65f0a670885d4b60f0a9b009c53881d933175141c4f6dd4ad1a0317264345ce4115f7f4c56c849da4311fe7a9efa0a4aed02aca3aed97a87dcee04bec374db3f8b7e4bd39e4fa367072e6b0584bf9be0508b348f433561d8e1014f7d0ad3607d6b809bbc3af126ee01a1c1694229514d7e80a3cfcf4fc8d8da4d100e39b3224e96fc46cbc7c1b216a063744d848d3848bee590258614b1ceb6944bfefb0f2f464d8d2f99527ba32aa5cbca90693a865542318c5766515e63db658e6e1c9c9ad4a51ce5565e29e6cf3caa6bb2d820ee9a4b7f4eb75d05384d3eb08787521e605edd707864d7a6fd0f14ca0126f63a39d2718001a4964d211f64b2b7997d257400c6c1fb88696578288fa7510e8216e598844e721198441da45046b6148989833899f7a4de875a41f2d7d36750e6436be2280970854e83fb0931e83a0bb9e7a183f39a16240239f0bb9780eac31f24db7e2f9b5f6915bcf1f80e5140c1516dbf259c63c2c006ed45cee8b2831608c98fd3d327878e515c88e604ff4ca7bc66553d04e62dd843fa3cc7a891eecb7cc6ba64c4fbedc19d7d9b2bdcd8c7e301960b7328ec20b3e39264d9aed9a6eec48edd9cf78360d36ccf1be54416235877fb5e85340dee5df00867b0575184220b62ea8d371695a9fd22be78faaca84b906bfaf57520545217f84caf0fa788b0ee094863de32f9a384ee8e9161553b99c2efe988c7a08d84b8794b6bae641a2a929ab86c325cd01c35927dfece13de585056b03077bf8b4f14d53bf430e337276f96b085d7f172691c8ddce5e96096730b3c136bea8e64bb2309d98ee00b36c923a8027255e46f41654056d871e671e9bd343b3bbac9cff190344cea22db6e7bbbcab8eb766f1da533821a41d8b6949b1bd42a2df24d0dc02474ee7165fb91738682b8a8f1cda99f189075f29b396e9f9464288569ee878f77d7d92e1bca392cf9a80c34e3c64a7686ac6275f0b9ddd42b9a701197812442f08711fa4ec850f07faf7c2a32f5c1987c22f7329af72ee357a1ae2174c3fd595b5fc0deef2f40620cfca552b55323d7cf2dc7569597b3bf25af404345696c1246ca1f7a99ac36c50f9de9273204b1cd81c840b55a9508eedeaf5087c03fdcc8268a3783ddb62ffa924d610c7199e5912d984e45cdc2c74755768f69f46fec5d8ef91463846adb3c2f9822a6180917aea5b77a1b554a5197c4bb4b8811139afc37adfd786e63b000ad3e783a3dfd2495bc8dad443d1a2c3cbbb64f23481ceb27cc3e2339f68b05f4ac8e8dfe94e73effb67eb9d534f171cf8144733a35e8606269501a05e0010be33b9fb2b64fed36f41a1ecebc9961238bd4c8d279abc78b1f1491f1d1b07a32d945ff4c202e13b7b384d4e71e1fca1258e0c933e861e89ae433c0b920544b507c4397dc319972f6d197a8edd4d2593aaf4a8bc6db54d1911c8fda589cd6140f9a40eca1390550764745ec51fbf19ef5f8b9e28b4eed477b3c8ee7da1aa79bf9b4c96d62c95b07a2d10b32000094f30cce020140770b4af4d23d8773677604b782cd9303f9ea30998f668460c3ec5ab5a1ce6a1010eb108da92dd38249e58dd665fc7ac5589c5dd405981d2f2c9b75d7656da358379881f87b7eda90fe71e10d8c7bc5520664c9feb01460cfc6ba35a026c545d93106285f90aeaafa3242f9324bc25b5c9b912baf27eca3d065ce80101427c8a0bf507db7678eaffb03f8e1751e74c3b41e946c01573ff9cbc7fe09e96dd9cf156eafd90506228d4ddb822672209c70460a2f3d271aeec12966a063c589137d22a99b4f51eedff015af454a312c5fce2ae89e5525434adee7eb2e2bc75b8f23845ba0a53a232cc21e3d338e8d25ad63fda2b773d77cd5a846e390f0c1369db836f7009d7a4804f143ca1a2300b8eb7a5a94ad25ba95ba8e34619f43d76af7a3d1f6b54aab08a6d7ffbc8148949cd4060fb83849826f769b4c13d3f934a674c6dcc87b4e35f7c0253e2e3b99a8604a0a1769b704480a6be2d05a29547f97cd5188240ab4d9c86ac4319b4396ec15f78824035a0e538fe09f8e1b0c01fcc1f4e965b32ba92098da6f9a815685e021b1d4d54159c5c5cae4acb3a04d037a51f3ca4dfb75520730435731dab4f27e4a4dd8ab5991b15e1e3743b5b0f643d27b99972b23d4c29c19347f40321e3f86c3722ae8c05e7e82b5df30ca46664c91db84a4f41b4e971ffb3ab7ed1c6a2f355cddf30f99e1c0eb58f59ccf9b0125be3992d170c5ff9bcf423af0c1c420bead6bb4c2dc4285894c8e35fd769135f7eeeb3f8feb15a00e5544f3587c00eb536164082482cffc5b90c5ef80d4509962a6d4d5d5048d211187000b6f8cda43831d6a3df0d67a651e1c286b99c5f06d78d4812574c777b3c8d386dd0cff51a7a8223eaf672d4ac252110010af6ec75598509c14415397752e2c4b029b9a179361069ebacdd091a52d9182bba82c9167cd3f9f335b447cfa9755ae5efd5661480596cc63b949bbe0e83e86dcdaff2a61f0b41ba2358390b395b91976b5388761fb1646be4b3e6d60a15aa38929f90c62995c9fb7ed2763ebe6825184c931fcf800198ab50f3a72cffb3e21f3ea5ccc4cdac6b232a4c9a7a2b8780c6670de7b06dc1ac1396f44dfd1e56af88a8126c82410387e8a8dee56f39dad99c3ab7749399eb32d1b9e6aeba914d6aa48eb1e0a25a8331af9d9dd53a9a44b04f45524718ae3233207619d612ba5ed405c50f72622501c0d158ca5cc8aa07ed479af38a6e683bf8caa3a1db3c4374728c5f599e4dc376c367e92e80d5b6732bb4e14616e9a0c2728744ca66295efbde3a5ae4d927dd3a241043ca09adcc833e3783067b4ffa04fac3f588c7ffc59b266f488ffecc943a503678a368f8ff6309049bb0c84b5214bfb232e28d0cc8fa6be630971f49961d17ffd64198e5904eb42c7c831c172a8e4bb61713717a5498799c3369a4653bc90a0e3cdee5697db2017ecfb825fc4c4c9c6d990cb32ee437dba82c17e2736f30560f35086b229471b535a96381ee3fc850457fbf8fcce13264afdc322d23d22c182d536dc1809fe119350aa47766df10a8be0dd6e6985fa12159ee16c9e66c97029126b3654017515b996efba63a7b814e39e1f8d2dcab7d6881820f20665d50c1a08449eb7e65636a07789b92621d1410dea46c3d06379444a3fcd6d1a58a3cb90442564bdc93b6ced1fd9ea1170fe87a6665060eb1e14cab874aeab033c1b3a057a8c892d78431ba3bb84a65524e51b1a29896adfad917b4daf8bd31e77d82818d12fcf2e0ccb89601ef7126ff7ecd656c8fbbfa4b652af231fcb94bb7ea9a462d96b897002c32b16a46854108c1fb25a901c48ed34d3b30a70a9b8b17ec2b45ef8a3f45c56f226022c4f9bc9bb7df03e15abacc9f9e527f37b31e257cb9086570fef6f96ff11cace7c238c0ef19e253f6eb23a5fb7ef6a681eb307afee4d6dedbd7c5b04fbc461cef9f77536e5ae5a7bfe1023239bf465996a0a3e03b8d839cdfeb3f2d52d6a299905855f71e35f2af77cad214a4b179fba30ad08a326ad965b01d64609a87f8f7e5b197ba624837e67524b08822de661d87aeaae6e8198f12b6239c8ad802f22bae8717bb85b9baf2b46aa7fc0f3280647e54a2ca5200271f93beef86dacd1330aaf8ac5fd1c04017b1d60eebe4d11a2d21854f3c9641cd1bd0c69089e36eb9433cb56890abd42affde75fd1a25be27353d42c0519fbecd0761b294358dbf8dc9035f9ac06d17dfce9a6ebcb741eec11f208889fd15f380d3f58f8d48829c8642902832842194c23ddc6600c2bc57b71ecdb4de240a407804ef0fe50c05593236a5236374430034f2bcc90b765295194b3ff299943bc075385af7b38c6d21f2f4ead839e3ea7a8c68bb38e05ebb1d8ea837e297ac483218d57ca18214ef36bebf56c4ad622a8c42271e6b0ec4366a5fe9ab34dfc9feb33781447fa64fa83ca30c38783f1d2e3c095d5f9f63036f8af62da53ae977dcb2de61dd9f54b8b9575bc1ccd4e3cff2812fdddd2c5d1fb7421292c381101404356e64c24d4a9e72b9e40e5be11617cacd22586de9edde7fd5fda2c6a524c7385a94d930c5773d064a2999f5c6c74e87d7f1cc6657b311a21b31c55033679aee425e6f061a2c97a1f640d8eb37cbf0b2475bbaa147a531705748c9835d3e71f2676e9a0821b45f0035b45473a92c2dada1d606feef6f3a4b02eb0e0607789f979e19fb76579c3b311716132db56995a2c258d1686d5c2162ea2a8d494b7584cc6aea088a857ea9777c7f100c93b39e0075270021b4d88e418f2a6976bfbfc9ffa6a5cd456c5c6faa3ce382d1022a0f621ac94055a41a0af8e0c4d5426acd51c82c626ba2adb43f1a7065bfe5e5346c8aff953b2908530d777ab5f9c06d0a69367bc0ad518a71403b14044dc6105dcaffea77440683480cfa71d2dda2799c3b751f90429353ff19f9e99063f5c701aa209208eee0a7930d32b95b8f5841281eb7f8be60c600d9e7d77daee2407a32a2ef974f212310f4f209b2e5ddc5c319c1323f7cd3c63bb4d5fc2be6704461ce9315277953ef2a6980ce80bd8bb0a995e3d3ed7f93a8e635c638cdb25a5a239f2c017fca3d235377fa4fa4f0c72d537bef91aa6a6333635fce7fa98272704002289c5b9a38a088346f6a74bbd1dc1a2de6cb777761a18f20e220cd563928c901f7a84fd03e8ea73c2284a4fbf897134b7dc21609002d19818b8d684c546909a6eda8b74f1857d68c6788cdb790879e58cd5b6163a8d8c4a9e07817bf64114a7917e4130c80e352d4825a9ad2ecd0ae1430d3cf5b3e22a39eaa929ff9049ab6328d620f3b49147f0fe57d85546645203a3cf9e99e545e79ab46e25b50e6580ca8e1bff955b4482342bb4651e10038afddca527a40d123eab4636796c669dfcbd54923f2d7c42573b96d19fc83463fa118444123540bb670ba97a0bdde897dd9c11b5e039b081981347c1bb457e11879f72b073fbb367b4e2c531162e60f50e5bb3ed9d9a73ec33ec6d8b875d9b57baee56b255839efede6d493a999ed84fc0774d67384171b9eac8c6ea225e6e4aa95cd0a29d576b5b294aa4ed32dc0f9fd5f2c6ad347bbfcb416a6b2aabf79876c06021f82262e131039ee17892d64b93afd8c12ed262139eb9eb0c55e61f1b1ced744528bfb7102aaf84c21fbcbfcda402ddcc04782b9c0f62e922f518810b96c692cbcc5bf2248bd95a85f32a9030b92732efd4e874d1a882985c18e8b5bded533101339f83384c63f5cb9a6dd57092791150f6b27afeba6191385f34495451d9743314689653656e24c35d316ef82e4dde4d1665dc0d72cdd849581b4007ff137e2891e5374cc6a62c4d1b77ee7410880f6de0f3787bfc110b31b7274d0c5ceac659fdf35ab1fd391807b0379e00ba851179d4422b283844c82e8b844609c393dbe7f6c96d8076a44012894f2dcaff4f4408ccad39dd2de65e63aaddda4baaf7cb33ac02872f166113188909f78a71670e5dbf16274ff7973d32ee0ff1b8cf62a63ad6fb22b0274c08d01f09c59a85cd5bbb24dc18033562f93d3c8245cd0a94b3c7deec459f322e88f67b1737aff55e83e6b65ee48176abc13263cb8f2e39f3e6d46816a7b5247db8ecf56869c87d0051823b8155501ce94d79dd63ceb011e528b56099be0a18b494a6873ae9356dadf986ee8f51dfefde15312cfdc523151d88a1aff3709854e6ceceff445cc1fa3ef91e1f29ef036c10cb46869c9bf233e7b9a6c368e7fd74d55bc33a4da1f6eb3f2272474c3894f3821209b25dfcde95935189cddbafdb77a9291566b3f9e8c73aa2b30014fcf04bc7e8f4e048711bfb49d3974973843ee8d4b6848314779281cb6abf8dee8338cfb4a7f74b800f7b78dba5cd0f4ecb39970611c59b7844aeb2a59d43250ec7a0a92157dcd1c88d05441bb43f80944c43bd1a88bebacc73ad95eb4a6dc13231960c21c421c314598e5fe73697f935183b684db952e5b2b8971f871678edb9ac04e61331be91c536eb12c3d69c4062452684729ae7df464a7855c540ca0fb06be16bfc907ee37fc4da71b77453dc842d1dd336217410a5be360a55d88c3347da3d1c6db60598364a739a47b4c62cd383bc57a6fbab76fc4fc40f6e09d6a2bffad4cfdd82fdbbc5c3f666210fc5b526d0d37f9db53276b0f8d95e763a26f7ca36f93188ca0e597138df9256793df1683cf5f3e9bd53f616213bb9220b1ea0d3ad376bbb788c00d5daad4139a90ed80b49489e10900c35d0ac050f010d9fb5ba63de93eb3e7c45e7e7dfe05cb8484328d0b29369e2fa5b0a4fefa645a9b2aeda8e96973ad9070335f5786d3fb8d18d60bcd9031de19c662733fb51bb4f7796f90e13bf39df620205b0b6b9143aab48a0ef94b3974c41afdc4eb3fba827599f06fc4bdadbdbe3b4792c68e845da32c4a5eaacef7e7f18b0a70425487f2df47549e130fe8313346a1686dd45087a19ad3ec9602bca0e9f20f1f716c4927b581a520999a7641b9c6198ad6b7476fb315c19f198a8108b420a35a17b3697b45ed04a85396884bf1f2dd4b2a7f8b34b97a9a175456fc032027f4a812c13d72f851bfd988f5dc0acc909fe54d9b9f642901e28a066a730321760095217066dafbe09646306a87cd759bdd2c85218772fbb1a3dee1159864a999fd3bc1fb0ff4fbd5f51431797cd33adf27b784eb6f8a116a912a43af2edac5e16ecdddd48ece7ddf30c679500e2e843c06dc32a73a52a80885820f9bcabb1ffa5e31b86e5ce2e1743327daf9addc095451eaa2a593dff1ec3f20a243cf8095c4ddf15fc5844bf90775e5abc5fa654a8527641b59760d15763b4131f309139cecda10bb6927f0bb1f0c55d2f75bef5c59f6a105c3b0c94bb4d81b6a349ded55cf687e83209a8bdcd5f7f08dfdef307ee0a65ae3472675c62b53aa9a51ce7b459a06340a7d0f119e8a110d60fd1f6b2340727332b2bb1454ffa16018dcade4cb0af946f48f0503bc16ed7b4c3273e9858669fb1584cf9ab02d9c6cb8194acbe8c9e807d1b0ac2e89cf6e3355a5ef4916a829645bed3851d489682fbfa19c9efb7dd517b07b6a0d6c7328588231c6d13df1a0e492497752b66b5516307d1fb494e1960f578bec3a0c55de6a6005288b476c3813e7bb96a17e0813152456ce1fff80dfa8806b31ca3c8282bad70bdfb190d969a1b7ddd785c3e7359644a2a090599bc79b1fdc936b762649b8490aeef9ee94231172631e1316d10ce62e055971936b5f41c666796e039a4a18d548244e9aa47b793114ad949b0f489ddd42ea04fcf31e1266594198058fd31e48f281fa2b3fdc793ac07133028f4b1bdd69bb833dc93118802ef8f3779d23d27db7c4887a146938b7990e1e000616821ebb636b78ce0271cc4b839589e757dc5a4e2e09729d7da55adf4f29c878d902cc2754491425d506aac5bc68b7b48f27e99198e51bfc746730c435aac00d9e7877bb465034ba9d5578142faab0724611b81d24ae34d4b46d9867b5610c8e7ffc94cada03e456c6843732085ad2a11d909eb1120177b50b55f417415c33ff4a94250b294951ad60b6f6d309f6c0f51004e46aac9c0d637de3a6230063484be66086a7057177569629b70702eefea3edd2ad8a2608698f2e287241693555bc6ec88ffa470983bb2b0d20e202af3f90a00c4808cd704a52bd7ea93433ddb11cc45ed55b55253c26455de4014efeefb696848bc66a1f5cefbf82ef52df5bd3b0e1cbb4ee0ac39263a63353ea0ad2d75ba1c8b596bc5b365f313f6b15d27af4a7655bfc9bd2d6cf106defed5e4bc03741a60871ea3334c86f4243c24c8eeb46881ec3f7ff278f2cddc2ec67e04ef93fac408bf2bed836b3d585d4fbf0ff3472cb96736c14d14850426b212a8593bf51096bdfbaee92781084623771844571c532ceb2cd178164a3d7c5dbfc05773e31b2bde0939ece1edf41abb83545916d7469588cfcbaf500bd4d82dde72379b3859c45608c72f74c83733e1eba89990ca6347c5e7ca5ed1b1ab217f75d54b0249c2422df688cf4580d2a581aa5224703f4b6e1d0e9c83dd6ba791c901dbe34fab32a23197215b9bb0d7e94e072a11c4fe5523dce8b83f9e59ae657ee3ec854f5644f703851c6e32bb4e0fc7db9f6936ed86988285fa59dd73f9a0e0df05234f531a99c95caead2a882c097a4289eb3cf37482d3262d08e4cb6898e4640d7932866a6d8649567e45db4d37697382e99bc2184cb967b895d4ed37a01f36cb4e56722ed8956ce33e3655ed69f23139654fe4346ad418b452c5c5422efcf3c0db95c6b4f43be86dad080be03fc9ba867fdee30f6cf024cbeb5cbdb6f1f2c85f3cd0fb8bc816f4ef88c363725a6facaaa6f0d2540e90450bffb0b92f1d05a9e66260eda91c8026f5250015c37e0828492164eabad799e38ffde15cbd8294bc23fc4122d2cc1262ab52c294834e3b9c210994d725287994f30e2a26d891bff3018b75f5f98a18847a1e5a81d0cc65460c2b8622059f6e14d6c2e9a3bc57453a3c9f2464d9f96bf23d6f434381623b3f70d2375d2a12b4b420fe5ca0580e10757ca2ea3bb8a343dd994f3e2903049bc0dd7a38a831d723b9fa4a75f283ed4a2253183f80d0e2d9dcbe653a0e1a990fe084ce5f8eb81b8ca4f1ef580e92a0ccd67db3490c019f073b12590e2379a8c52f6f186a54e87e9f4ed59d5684098f998bada8719bb0627e4e965691e679ca8cb5940b39be43f9ef4d7a30d0bb60c79a9d18d353e8d3a327732bd282aea7f827f750881e341fecce0629403a86552e3fbb4056bf56bb96f9f527b7cab7a3d8e88b58bef6ce15b743372abc6a81b7fdc537a84768fa69ce3df33e7f8cd0164c2b97a9d0dbce4a3a03cb6aec88e0eb7685c053bfaa3a65dfbbe096621cbcf133cc161c3d9cc22d0901f598b8fc50fc89cfafd9d26f2e1f16380942129b6fcf793b695e3529ac445e58fd3696e95cc752e2cbbf572a4749adadcb40ba2f64543d8ef3d19bd574f07bd12221e9d846f6d8fafe867880e0d3c571c4c8f02e52986da5cdd7cf8dbcd29e3abb0a92e169df09a536b187d0f6c4862608704be2d11678be944308a698c99b23d82c2883fd468b4f619983de9e57a52cdf75ec3bbde4aa52400de51d25088d64e62bfb5bd8de9f1cb02f37b82c68ffc32833f1d5565a4bfa04b2612483b59507d39a09dae3167e93d4984e688b7abd1bb33bc6791271dd339a92cc5ae1d95535a4dbe8733863467591dacea5e44ce859ed1395ba6660887b680f6f957d4e694b643a16cb96ee582a6c6fb6c80a4011b88a50205daf3e9d12178f9d9e0b8ad346924ce66dd37fcd0c35303f14e9701024a5488b9d4c99d5cb2a121f816b9249a9ba491cbe7227c4130ce139fdc3d7c501680f0fa3dda264f7e8f096c74046490624a2fea90533f8d75841053e23d02ef60e7928cf43510029c464efc887b153ecec2956d4bcb210b7acc4bb75d39fba8c05f597997c02b6b4a86840164105b26f0ac7a87fae532f20e201be911e70525ba749f78b7075a7c277d2727be2cf0cf5dfdeecf5358acc438ac90c78304098b3df1c8e097f126149b878be9da2f77547b6722a294f591c6c5398641c3b65517d14c2aceb9576c594da805e4220d765194f82e8d9272164bad2db01ed04f9521ccce69baa36bceb5661345b87f01dd509fffe3004dfc6aef6f374dd653800a441d1bbacd62806367d8fc8245d0d5115843c0db332d45671eaacf8aa9e3c18ff2e62438520dab0cdd450731a995c4e6d29ffafcbcab91f087d36596d5ab7bfdaf1c4e70ec19cc064c722419f540e2655196e4068e90274c404f7a8c7663e17e59d731cd92e64e262812732a755a2925b1ef4f0b53eedfec27665a34992cae8b6022be58d666d620de0423c922be3049ce5ee9dbf5bc6e1cedcc81121ae22ef4831746df4e34e1f4afa49a31e8b653e418a2bbaeee9d1d99fd0040645feec1ea9b5053e3a620a45b0b65826ceb55096ac03f9c82aa15a90bc36e4225321a8d7c3954f398b255520f4b3a26d26d7528d443f6d77a29ed3b5893fa221edfffc94f82192ce3c9d6784a25cb39316abe6ba28765160799d4097991b6c408d3cb47986bde2fc936fcb8d5539eca1799cfb94f0fb90887c28c68554cb03d61503ceca5a6d0ff09f8add7f423a6e801d7e165766fcbb419ef9a4dd87e324c74f4cd3763b706081f08351c158990ca835a78b2e458663611b7e526a5d53fb012a713e3b78c983b2d504dd5cee482cfe5ad3a21165198afc7be226bf319e10541e2c83e7b9bc6b651d5fb6a9aab83a3262658b5cc9d8a438dc777ac7f2b57f7756f1482652c6a2062ccf455e957704c12eacd974c846e3e1ecf978dce27583666e5a936fe6c94f52494147c12f2bf7b721b55ae1dbf35915fab2c090a80b3cccf5ba83ec68cebb319728cf8ce5b50bc1496402a9e32d8ebd67aa906145e896380445d74a8b2cfef6a7542d17cb3565e86f572f99a9870ab3c1c5bf67df8bd8cec946563cb11291896bd7a261015c8c0567872e8057b4971cd696398667255bced2e427409af9575d14e9b731afe7b20ab841d325643d9bf34298b78dc1b7819b90c5da1ea0ec6c810f83c2de207ea40c45bdf30bc2e1fd7e626cd3e2ba92c6d87ba74a31aae039fc9111e9b7da310bef9748654befad114e9659695db65797e9a3ceed2f33f87d6424d83522dc60d01f0ec1c9a038bc32f2161a7a42ff72e6c7bb5fa47e1275a1860d497fc2e6da19456e7bb48860cc3eaf99a01876b1a354a674d36f9e4b4cebc92d00334323e5ea47d20d6b3e678a45138faa2f6369374711bf26b3e0926af0fb5d44774f09980565ddcd897c0eb1d36c3d1a6890403c5fa0e9cc488ae667d387e43a94f81096a026739c84deeed666b87f6e036dc9cbea4c89723d25a77ae4a6348d999911d6a8d401680990a9ef9cad64853053dff7c95b40d2d25d16da8893fc360149698e17f406e976a7f9c70065665b9231cbeea03c71d727e4d3b4984de3eadf9111a94a7d99f729060cde49de845481219abd37d9dd79f77d1d65b557f9f664b89bbcffe2d3e2cc61d7d32ed20faf03bfbd867c93f4106925d7eb2844a60bdc1705f5ec29524dd2b135ae34ee1463421fdb42afd7bd5641469f35d8a0a467c1dfb7594741a216d5f32398a6d610d1867350f205da91a620254484724254f80f6a798a7bc914ca4ececfb7d9933c99287de56d33ea84ad9e0be766314696adb9c7dbdb528e6a1cd218fa04a431a206902e22d196fed6fc7f2254adda92b13237a4e2fa46c051e0fc8b9d7f94c220e8fc84f3958aa584846da68912fa905635d10d815f43b36551f2557303aee839e21e624f8286f7fecc3fcbc946fe658977e23148ae3530f0d095c429b60d37026c8855bb423450cbde55309c203534361b35585d31be80d8752c2df38154c03b8acd2eac45846eca4cd5c9e923cea5cb453daa922625efa3a8ee41498cea1e0432df80ad93b9c56f540c5d9b0f62f4ee64d7f0ac1da1eb40d604514c1c31adc056b4df48d9b8c5b8c4e2f49e9d399e6cf8f53eab22c5e690a59ad6c7839d589fb10ed7823e85810d238466af064bd50aa3b119e7dd802e62b21b42410a4eeed042f7b8b13a58e8aba2da9746e0dd1a3da1828b106bb9558d1f6173ae2d5fd3cc0a31af514c0dc01aaf63a8f70ef149d8ac66342b0c484f5ebf88f2797a1cf25a296c88d47cdf34a3a6d62c8e63c365bab134412566f3b1e6b123b89713eb1bc8b6a57b12d3a4ee6ad8074c3815a3cea7fa110927081b1c4677d6d412405d601217e44a1baba6a7d45d215013efa42b24264e43b01c8d796a383b175c11e1f9cf7a8865c89914852a30ac7d5cc9aa1f873f034e0528451bf54e8e504be55fc7509f8676439d56bf66e9890dce6fe5ec9ea9b95d42605fe1e6a166ec10658a094bdaabfe5d46dff26a72aca4189e1fc0155002a05b7b517ba7236b787391cef45998d30a361b446419ba19e1657f982f32c168efce7e61108ef3d54ee404bd8e561935b9733b0e9eeb060b45ca025b90c15e9375b24fe79d957a02ca6d46ad1bb40a062cf023864dc8b41a10bb6dde05d79e8fde7d0428cff866c9266fa2dc3120e071958cfbedfed32d5724dcfbc69ef0e8012525b8e897cf8510f6d53fc8e93d3cde6425d18126af14c19182dbb2a62941ce5438e0d7161326d75fdfe51dfaf06594713fdaa3fee1d249d1a37668061f7b583fd72c5c37162bb3afe98ba58c1f59a6bb146fe9c5ba300f5c7cbf6edc4c4af1397d72f848a15f9e7351bd20f159f232e375d5c7a011d1578741b1f1f6271dd66d52edb69b44223bc283d6b1aaa08d7e86de79dfe4d4f5ef4972e03192a4ad81732d5c3e5e18be8e175ce498ed884dcbbc07cf29a6f16db3782f5f4fc9d8d47b18d516c41f9b75e943df07995033151286dbf1ed52b6356e4b8742af9e135a29f946c1de303c0e4735c0447410eef450b03f1b22978e486952f7cb847ebd342bbcac0e69c530e76be17ff340de83115bd667e43129c7e10bfe087129327b8837282bcaa4046cd4e33bb805d813c620a347dd7b42a3a11cec0a3ba8140b16ae4d143ad6af53bef311affb5fde4d6999b18fdeff90e9d41eb20ed9f883ba1ddf4f1d367fff5f8cd36f9fb009370c42b232abe5be33ade59b0a68b34b1810e2f1b80eb8f0590f21138a34e3c2b8ba57846f1fa4e4d43c245964c377b9db2bcb103074d45dc54b252ff8ab635c34af31498d301c30397906153973d789afa335a23a999b56d6bfdd397a01a8c41c9cb5c29e77d3b3dc629c37452d6f4b7899b1d455ccdd4d6d134e7b183e94db48d75b750ece8ad352bd6dcc6ad9d43466684c68d2e18e67c62263beddb6421ac6c50840fb3c7895033b6c5247ca75dffc8a696e373ecc444a0eb0ddbfe437cab6f71494474deb8a0d061000e50c4440bdbbae2bdcaece8f5de988d109c3314fce209ee4c4bcdd31cc3eb5fedc3f693fe7774ec14cb4dcb30e8afa99519cfacb11500e8990ada12eae2775bc6159a3f0c84bc112de564d721f4bac68074f8aba3fd546445d2198f401e34ec2f367b182f8e64aea055c56e13831789282a62fdbb57148ab1fe1fa1eadac51bcca445e08d7925905a8b86c61d188165d86a15fcc8e26145464f6681ced3b3cba16dd2e01fdcb15a01c51dfc1d6adf8fdc89e8f362bcef2ba61f05d86745efe3127e5f07f31cac1026ef8c4db0967f4f9e1edd975b9ad57d5e262de6d8315f75158335b73829590f759e9fbc0ae4fcaf3f8820da92a4799c95da3e1a65dcdf35d71f0e78f335f83bf5ea479e5063d134fe0ad3f67d38759305744ef54d36df46a1b722851e73fd2cadd08843bc178077e98446f52cb01efcb890527245394246bcf10184e7ae3a97b1980ce42b0f46d2f3c959cbd8f5c7fc7ad81bfcafdf30d03a91c76d058576229d27fb01e9fe557d0e053ba5e6c5be44550e7ca659348d6c5a436ef9df07660011eb82f6b71460c2154658d1c338d648c90ebc014305eb55906dbf348c271e5d2b45955306c010be0eeca09ccb8c5c8512d835d2b297ab129fa69c9d9ccb868b2387664f7c22cd10622fa49810005c4d52bf322a5b2390aa7586047c0c0ebe7d07a0898309732b056a4e95f57c16240dfef189e231530535052a619d6e16353a3ec915cba1d1f5b6cc003359df48bcd700f8671d36ff50695e5bfe74021300d9b6e23f07496847d6a488c50f34bf2cf856320e97cd565d1738d934c3f89a50fb8df66f97211cb73168ca76cc1629ac4d3595ba313917789a9f6e28b05e2f01f6d23497497e7241af87f1b4f3a0e8dca21baacf684978efc065f7a59464b41c4e19e739aac2fadd022e1b2ed541813ca63da36f81268649d31b74bb4f9b4ec4eff81e34932a3de09f102cc2b75fba39b2013f5d93de1cf4b15b73a42352151dfadb8cb095fb9882090a524d68dc89918995e15ba41a2af0b330fd91da9e6782cc2de0810d2f119a085f9980a5eb690b212bc0dc99640c4f36e9e93bbc54ee04b39da94a7856fb8ad8d746451a93b535d2a23cf422eeaee5e00e52c4bcb1ee06c3c3cee590c21b0eb2ec22dede46ad516b181653a06faacb5dc9dc26b59859566793801872c5e03633acf3a0f79568d48529411f7a2e337b1f69894ed4327db32afb6f43413b6e1a9e369022cd20f2c58dcf40dd6ccd1b7d269535b6416313d1e4af2b017ece1583e897a5fb880b564c2833e054d677051235c62689a71785a8686c4ac6790681a3ad1ed11395f1ba9ad576d49295a09f90012be3ab525b09b004f757dc9f3d1de9b5f22f240f5897eda1b4ad5cd66a429f26ce5cb4054a0a0a9ad9ca8042d2ad6f65852f9578a5d4c63d76bf668a9c5c56d0c34d7225e7e6b1f7df441f6fa010917862374d023336acb2b8583c4e0e8295f80d32b524882fb350b311853677cfe9b17466686abd7a8b22d809051bff61d99c6e0dc72f2e71cd6e91a5093b7bbd136eb3b7f71f84140fd1ec5325cfbd2d184a0e778ae7ed2eaf3479a7012889232bac01277efca683c4654b6716d963e4ffeddcf939be136f62a21a6ef5fd0c141a3189d92555f7479da2dcfec6d04275dd629e2ec1787292b99f15eecf884296d77c9699c346eaa0297a742c6f647bec7193ccd716efda612df1504a4f5ac7cdb659baf48015fed581b7e413739a9b6f001e18a488a9ee91f34496f38a6f7df65a3d97ec8b05a28af13b8f6e03ed35682d809ab82d8d66566d92193240267c483e465e9a0cc24922f6a9b4cb7f1f8be833da54d847851b080976827b428b399749b80f63cd897073a6144eba6cde8ca3257e293e3d635a9a0f7eff3c508594992f9e14800dbb6dd6c2e3d9d1b968bee4953d0327c13b0d12677d217aaf2e857bda22a2c5dadb5870b0a44198fefa9fd75e309ff071d2c6d4498fd9affe36236277c9bee0561cb26e0977833bf0ad6b202d02cc00160d08b4be90451b8b87c8e2f91a06e21930170ac64bf5c2598d5f7b7de61a9ea838f34a99215dcb610a087cf501ba64b6f5bbbb439fa8377d57d78961a08ad62bdce4d4d8b6fb4e70cef582aa1811233e77672551d1ada3c619a0eecca4bb77ba714bee58d20cd85b7450c4e2ea4f93eca0e18da716df9d35d2fbc515744cbb4669caaaeb731b9380d6aafa9bbac2a38fcedd08987a40554d780dea0898afc422ba4be912cd710a9f3b9d86233bfcc7a93c59d67e9f5a5193d65abb7142577e52b7e5ae2d5ae9eec1ced055ce9e8ab8f0cf986a5f2e96d00dbea79179a426c35864921303a326585c3401a5e91c33c9e6ec4470c59b0befd3a3b400a3c5ef6020ad1cd03f34b6497dc4d46bab8d017d941e2154d935a3c7afb73a0cea59420740b9d75bdc792e662917e78fa4f43901daef78210a242e683890dd3838354ac5c7d2aab4dfa90415efb360f47e79aac1c87ea58368bcdd01ce8fc6c276758e086665cdda8a89e3a547fe992e6f9abd5390acc49ce3a84aac14c40352f1578917633bee3c211de2defa2564f7936ff6ba2ab297a7be7bae93b0ff84d330e1a7dc95057ee75ac97a07567d064720341cfc61572b21209184253fa0dce07447ca16af968ceb9fd90749c92892c27a352a4d98f2b52284f0f4c76c8230ef48912b871ed5ee4bbe3d00b6309521948d5fbdd39c216300dcf4ad5d6520ae9b212d628f674b4dfec5610adda285eca134b95287fe00b9afb580cc9a56f9bf3f2a6801c975a3c41c03317fe3a49ff49fe239dd66a5dc709d2a881f3ea0ab150e735b894b591744fbf6be1a9a103204358e5b394d39ee116bb89f45477345639fd8876448eeb6bd5a000a8ece12fda85f8bf3342a3b5a52cf2d9bd176956eaf550d10caed41a60f7fb0bf0424ca866e0489681d3f385969e9c75151d7c36b26a4382deddb39b73ef1031d971796dfd35a64fe1194d81e10e6a9d89f82b2b06e508c3179dfb2a5eaf44e7d260bf021dbef379e97d4578ec06a9a2843d4e7ba54a962fa7a11f176f991109618798a1ae6d07e101969ee121c02efeab46612d979fdcc8c856c595c9b9743bc28225cd181b07c7adc012ca4bc380cbd1f85f2d5f914d902e6133d383897325af92a9cb3f98a4270f73b74ee7396da322afc52d66b4e2fa55c77519102af06c14b2b2db90229543ba551eaec6f31b25cf0ac53cb61072e82bfdee5d8fa22088d24e7a47cdb68a82efdefa3fbe2c1dec1d0de908afba67b472528a22901e888551f24a420f579c178a8337ac2105550e30c1369c055f9d91269ae175dbb717ae1747128b5237b5a4a048ebfa1d754973340fe94aab27bed04877d4f3ad138a5c0672a15f0c523c62c2bc1ed906cb004e0537cec9d6bdd4a17d29db3ddf6fdb66f89d0c22663627365a23c08b8a7fb8f882bb77ffff479a39dd2c8f041f02f2552be4bcb4889a81c8a146ac505961c1f7b269555fd158ef658d00ae279deccd5b4ac7166765794c1b92e1414b61346f46164333205b0043a1700611eead51028613fbc0cd03f94a22a5d3c4a20600c3dbd95f754d19b62bfae7ca923bd142e74ccc93827a42d124bbf59e39a16fe165419020995c18e11fc57fe543b1904a7f0006ed95b04881967b3721b3eb8d098473f189d87fe3976dd12c95242e27de65de120e9b699fe8457eeb0e78f17b52627cddd661b1f0c2a5dbe3028f25ef4cdb04afd91b8861905dea2a15b94cb274514092ec45f68d8d96124f00da108c007ed5b59c958096d29aa32edea66149ac55cc66595f4588fb2078976dad7af5b0eb8d9c032913b8f61b972c217ffa31f1c18587adb7c2654d8938e750e4b8fa6e7745ecbca550a948aacd5e69208f21732d6f7d9614e4701567224d757456ddf4eb6ebe8bee8b18eec32539bac590c632de56c63ca95375540e80cd5375e5cb5aec431c30fb5bbf4f86bb4b7b7f634f00f5027087a7534db8b4edbf14d2d604021b870320cfd539395c6afa757bd79c7de5fab7ee40b12f32a2aa7f741d7e68e35cc4d1de6f1f19d46f859473658aae0a84504bcee95828e5d4a6df8c517e6c639e8ad1e202e7b9f342f670b3285270b832b8939e8143c80095e1fb0404f24b1d3f08c25694cc0ac208f7005e5ae6f36964b9f65eeabae09e37f337bbd4752438b1d4ef8565ca5ff08c7e1140ce75c80dfdea44c1164f27bead8a80497829ce02f22b1763e727f3e8c1addd8492c428431b7457a4cd2d707d7855637c23cbcc6e8a2da29ab359a58186718f69602344db8f741a16ff35ed80949a0c2e7fd10bce19aa0f6f348b4eb46c7e18a64c7e5d13e5c35a366e14174d05d36dfae84b355beeda5c4d42c64ee4acfa834ae20758e45a8d0e0e09b3dafc6ea441f881e32eda43530a32979e50f9681015ebc615fab5c170e1058d41d3dcbc19346c3424719def77db95d81b38ce96cb19139da4d22e9c1108e22cf6b90c04928813ebcea387fd12a044962e644bfa2cee11a4091a2ae3ef349d3e19d2e4fe24dff9d05f93e21fadc010bab9cf660296a0120616554765a01c1f30c17d113594556532791c0efe63972f3e058a23b3bde7365693b09933994a5892f4ecc6bc42d4d475c689de0649e3e92eb05cdc0f743ba6197e27b7b0f671819d3ffb7373629f3da23ac349af24b4d92c5e36dc7807df6d5a560246e2c33e03f60caaaed7267a8d13f453e368f0a7aad82c9ae3de7a227cb6b0df77ab611b50204758b1e04af5061c25ada049f88e2c1f274b19c63a9c895f4aa5cd788b50ab14bf3cc5ac6d36bacb2241076990a34f1a5892f24e5659042b49db1b401bf15a13488741a152e015853b9c5bb25bcc69996488771c4fc58d768d01a77ed6fbf998a7d469fe9e0d062740fe7aec207490b76f7070f8e6537e1c20b38cafb3cb912f511efeb0346a38bf1ab63e35c0088094c5393e238aa2664e71a367895fa3f914691af7a2ff800b5bb16c73461b2e4b92a7a995446935f6544418e56058faf7c5433dafae76556ee54f8f801abcfbc2ece80dd47cc17ac1d0c4c7816be792e4b93e21029195ede0475b2826ad1dbeb087f4202d501a8b9b713281e645de8fae025d7416996aee22fbc65e769f785b577a89dabc3438e5eaef86e23a5330918404ea062ece6c24ee5c76c4876765777023c0434aca3060ed12e4c87da26d22ab59a580588cb2decdae4bf2e906c2de1915c0b245d375931901e5bcd16e0bbba0defcc585b48d6f5583bc96d4b250f106e3e91fc244f957636b77213acec83854d852bcd829b5a884f9f07e6b5f87cb27b2d9e9f100c283f1ea62ff047ab1e8b2a69d56c2bfddd712f49d4a4446f52b6dd19ec64d30462f251b7e283bded074c26905e9964ada3c218b0e43e60a73ec8cec602bb264f3736e3dd40d4296d199f7c43c226735002e5206f5007771ed26ecdd657b2a6e67ba58363894b9bf8eb0fc5a868cfdbedf613a252798976db1cd4a1eeab417021351aa5f71cf496bd4cd527d3f4d30cd2fcd609c17669d3b7234fe26b484f964429ffadd8d01e3e49458a0db60f2d61d484f06f036996a3c4cfa8622351f9b2cb189550149b80d73037fa8a90d3a55b09d80f981e981a3fda6d5bc2616c6fb91b1f113eb3f753c9aa3c42cdbcb61f3606b37bec5f281f41093091c7f5c550052686805b466a8e5977d9649a17f4f9e213282dfe2fa3f575f1310579d073a10e14c429df3b8421cc05c10b029f85ee3752ce3d819b1272ab696a2ac822f0a5929b1344f9bb5c84add0d11b872e6cbd6d98f26ce08f50005c1b13a697a3ee49b2ffb82df78b93a57150b1c7739d9bdf4b5e727bd3f58227d30dac549568e4f4ac85559261909915dbd6e73f2fe3435ef9cb8a2ffe32a6a1f880775299f32d15a16844b07b199f016f712232bb1c4d857f6112656d5cbf5449e56c2b55bbe76eb9f935b8b3946aed29d49383dc750fd97dd64e5819c91ee4f4b95a67244bcbcdcd4aab3920545ce3021788aad444db70a6c036290c9946ffa715eb22f777e49a452ab8f53007c3f630e8e4ce6c1c03a3fe4ae4a7e48c8de6d71fbc5635892cc28149ae2d4c53506548c52afc86c72da4322eb4d201f4dbdd32f2d9ab156a4551083cfe020028068c03c1d9f887bd2c47db21b34330fee9f835d64822a24873afd1dea380487ed6f531844985bd235784de550447ae3e2b14b01455a9dfe66936caaa275eb5c21b74e4a526f35613fef5578421fa213be486b49906cd1fb6d7905bdd60a542917b9e32bc4844c1a1c56fd07e8b28510ea7ff43f4091a0f3799ad05c7f094ea0cb919eed6c6e339f588b263792730a519a2d78ab8b263c94adb808eb13eb0932bfc5eb9a1d98567c47dee4141529710d22cd4c89a3851bd844697f90053b70d6716aa851a570228baff6786b7db9dfd627b1d874f4070b2449b2894f75db94b41f939076676be9dc384f99a8e4190b9160ba99874a03e094f44a68c9ff13c649f850dfbe48bb5c730371518dba3bfd8b12d31b876915dcb00f7bfe3c8a5f92c0941a05cc68b4c10f76e73bba632896a96b040cb2f88599bba4b08f1206c3b3dbf48c2b2de73760b6025228a00e3a87e25ebf1e3c9d244d40c0e1105517d9703c20b8ef24cdf7b1cc90aa24a41b001a2d3440c2313161122ddebafc203244041878d0e41ebde28aab27a022ce1d04119ab328905bbaf557ea9b0a5bd3e5bfd9dff9e7106906c2a0e7c7d485bf88ea7a58a4f46a61f210d50b58b5330beab07d2d6ed44c7b051eef6a84e37ec39829a558fe15fe8c15d051c2bb420d4ab8e031b86e56226095d97dfc17f7fe29f23e33937851f9d45a18a1ff047423e3e72b4b2ef9063732601f809dc20bb884315116fa8b7b566a392d1be9941bdeef9dd3038f05edb20995dda010bc6e38e8e4801bfeac1c3df422161d9dc9fc1770e38f39fa55ff3d643282d7b89e7bf756476dd04b6982f8da5ffbfc9e713a4160c7a2f916178881fccbf3b5388f0220ed142aac3633ce4072726352ad897fa3dd38a0680da8185ab02061448564b9840139f56e718a9ee99c38141adca6495c6a731f2b47bd9c0b949c15a4790b863552121adaa95ffe10d9f1bd607e0a3a050a8fa8cee74fbd6e5f79f9fbca4498938cdd61ca5c1a8ef474d34a3562c91184aea6474f99734af59b41e1d31950b05eef59203903c1d3be9d814bd78a6e9360699d0d1a616f878cf7b773c0258b5f2046ff79a091a66c1ac467428eb656a44ff10410415eddf522351ba29f541acee7ff858be338d2f2fdb902b0b15741975838b716c6ebdfc5d766176edd85a53a1b371da63b0ef544ee5144305ba03cf858fda6bed2f1888802bb6b0fa4324a30ea9b667d3d963a30bec12fe564768c1fb659cb64f63ca4ba79597b975ccbd187dcae435fbb1a27f9ec86c6f0b623a740a64d1cedcb242ba0ddee1b604f4929badcefcc2d74098319779275ef88e89a86e15a5d186843bf275a03f2700ce2f163103bfd7d2762b21736d827784a90b2bfebcdf38790cebd0677c618cf79f61ee1afaf324a498d666964929083b0fad78ef1cffdd97e4378e303f12b1d8cb672d7121d0ed6fad48c972cd2675b9d32bdc0a8705db28d16c930c4bdad2c6e7f4aa7dd3e69d8d2d2e807f817891792ebfac4c3ec2029ca7ceb6ccb41f4658ce9274bb2930f0f234d1f14ffec94fd06aef9482a073e467c0a6406bf25c907a42e9dcb995df41cb967a1092f85c8f79fa391f6a046c04c1a9383e7f5d746856e74a9115becb614a2aba92a56783e6f44a1bf9cdbeb50efea237eb84834fc659774bbda38ad697b0ea008e1201d42da298ecc3ea0f4573ae2ba69c987c71c24c08df66b9dfd161030721a7d1691ec669ab2dbdec478bc41b0b1c53b1a6a7c2e2c6a3ae77d4f9192883fd0253ae6f7d652a8d35ba6887137bd7566f8b93712cc202a62164a39ebd598c82243898285e04b67d6a5d6cf3d97300251f9616089598c3bd597537038e3fa007bf232dff7f4d479c227763f83c65362f20258622f6c8d7e064ca0ef79dec742646b24783133699be968e726e239efd63fd43a64c63722b7585fc2f11b22c8ca2b28523a981dbd73cc48d95cc847a463f3510490460be581ef699fc1acd09e3c1c7e70f061d10a1ff5a9570c6c838fa080810827a3eec0fbf5977cd528c42c4036de95a595a7dde033949e52f9a657555344942e96cfa9ae42212eb80f1dd4da168f9c3980a9227a83976e3699e13c5cf048bee7a3ad5ceb1ce29710082cb3750134ad868f2f03689bc1ad25a10e00b7bf006dc92ace822b4ff2a795ee1dfa8adccd6037463ae56be1ec54564c8865ac35a42637d8bab7c058bf34801237d719d216e7c48835a17ca9a1923783d26cc3d6ddff6aa77b7412e34fdcb2f33b385309d26acb6c15fae8f48181d14035c77c9afd14b4f789a09ab1ac0788cada61e881927ed5c45be34ee1f847aa5259a03755da12a7b0a48a094a35ac89fe9f848afcd5768c525b5fe82ab8b4a1b02e3c53f4189e331825ba8315dd8a53b2b1c5904cfbb3d21b585a8e252b35b789204801f00544329131bd2532819051332c7fde02e4198509e9533c9d0cd17ed2eb8660b61819dc8adeb149b1ac414d5ba3e32931f4ea487887178c703bcce4d28a9c4a93dd9f70d0ff9b7a8549fd6cd3652a7f422b38044a2773be3f1330afdd74928eb44e4aa6f44b0a8a18682f2451d493efc048bc0bf3a1c428b557dda660183de71427e3a52b78d456aba5ed3813dfd93a15a80730b361c9113bea1b1339883c1d2b4afa5dcd39581bcfa9eb423271658ed41c7b77b5142b570952bb5f49bb0a8445face29b391265da82d15a3bdfe70da23a9d3e2f76af659c43a0181549cf60e538bb283569a93dda88e17acce5a55e16a1d190c8c7507fb85a438506968973b25a4b1aec4e4c37dcb26e5f9327f587e2a8ca8e1aaeb5b54f45a734636a1fce0dc61eef54412deac359f187c50a818b73f97049794a05e434c094fcc5607ffc0c508a145d544572418e7e7739b264ccc83eba5b8c9b7a8dddc819284ba25903fe0f152aea26465f45bc412f189a218121a81df6905da6bb8e4c2ef7464b69bb8a7e1e9e83a0ad9defaf4348a425262ba0b6d1520c4b5203660a1e57b251fc3259bef2f72c4d7ebe40c90097ccedda4950bf91f25e74d6cfc2f22426c587f456cd21b104bd748151ac68cab89159f784e1de23a6933606ac26389f6772834ea36c460fa5082362320c0175da1971f1b7c014815463fdc960c60fe053ba61ef60f56b69ed00a44fefefc35c73ea7b13ba80c778436bf6266098c01dee7269f84f3bca30d50ef4c7f4a5bc607fb800513639ecb782c261df002fd5cd06fd918c9429b57bb6b882df654d6ff18504613246fa77abb55f674551feceed1d3769d502c54e48fd031b6fa93f582ecef93d84ca9062cea2ab93cca4946712eeaca05ad0b2a679da563b2bb4a34b744d42dbe2a5323dd783b47b0a9fa3b478ad6137d52d380e44acb9aeadc830b76a2c7e789eba9c20e40363d1e90a7b790520356e7973f524a0ebbe902d4cfd599adbd3b49270edd9462a95dcb0adb43f3bc74d39fd4f4d630164f27ab182fd389263bddcca48a1553305527fa6db177a8ce8956b68d9d56b2fee07cf81709cc850307b8a662e0b5722b6290a11b1a850745bbe049a91abd0c26c83a4310f8b94c729c83a0a5e44a9b81d688da9ca51eb31259f6bbafcf860ee919162b76e558134439b024b94ab97407fda20853276b4c6a9a37d54d5a8d15e38e4c3b99207a307e942708899c62812a3e8bb24917ec006e0b42d9fb3bcae11fc6385924eb19a89535d6e7e5bf946b3db892d80759ccf05f0841e54f03d09413babe4cb0e660e60268fad2b870452720f937fb26720c2b3e987d3ff868d36c97bcf187563c7dbf0e25d647b03b72d2367148cc9aa33508b5feccf827f380a7ee1b92c6592562ca36fbd3b7f6f19804324357f19f647de3a152ed455a044fe71db070607e1905508022babf4ffc493e7481ad53e75dd440c43f295bc9bb32c6c8407fc2d4556548b08b79a9f960a079dc6fb4accabc349669892f7a2969a01a8baeaa89dc737098f16893cf8bf7dc01026ce5b1d82e0b6c42e54ce6dc746a41dc628d9b0e337df36d9f652489f79314ab722dfc59afa2232f61ec7cefb7d6823c31f29645b87644db3c487287a5565bd7f708c112ecc8e161cd695f9e838e2803c2246e9c29c50045ed4ff65bf4a7da4166071a48f7b32805e15ac9684ee279ad302fad96b15e9f1fc4076bf845f1daf31203817cf6a821fcd29540f0ebf42fd3e6d21f61c696bf0225418e3bb2a78d7715d7a760a3ba03c59f40cc483c85bdc3460f6177581fab5271746a5d09fbbadb153475c96b4dea95ea1cebb404dc3483e45972a86750a026970df568fdbb808a95997dd71ab6ccfd2654677d43ed87ac08711aac068144da46b4d13ab8a17f98dcb9fe918766a43923bdf2026b5a03ae364a435e82c6729f08a556bb1136da752c5d25a0c2f0b820ddc8337b0eb13cdb34acf94b420da060f5cb36d79ba6dfb5cf45efb50b1bd72f9b1e0431b8004a2de13e60839c73d4eaa763148d5b29489af824fbda0f43f9b02e92e196e071e64ebf1a3bbe4ea56deb6845a1350011f4baa1d2294ed65e1c1371b58afb12a974b090bd9e0572e8942856b8edc855cc142f586c72a943363b3238bd0ca302e93cfae7ab46b4396d20bac2f86be752c5b1b4c5adfe5e79ba00c86d42c914f91a1f532e35c64c96ecb5036ca3fea6196123082f8d8dbc6ceeae22a94d5e4d999dcceeb154bf5a626c8f09251c83052ca6dd10d42cdb6038c41cb078e41c3c1d2897473d7404f9016b1cb71bdbc6d2a9837df1c49c7cc683db911b87fa5ec2100611657e5a2e7d4d5d35abd8a317f0f903a25eeba3d7428e80448d9a7cca2a89f5fb38cf8d62ce6f01a5362a9d2af5c80028cdbccc43cdb3da8c580f69f288548ff699779180e44ff312cd3a8fae8e5e21f2ee7ef84ea00fc073f507d26a70ef09accb8cda7b8d4a60a16f28cf16cbd4a485450ed80cb0bf5c284ff901453f0390fbfc4c278cb04f3b8394307a4039fad19c88a65cf70f5bd78e0fb2bbfdc7c8dd24c23d521155fd381589c8fecd9e836f54a8da16a796a17a650b38dfbeaa236b515ceee0bdd2b900659f3d886776bcafaa2bb71a1531edd7153f2a816d2066be5716bb89c585541e4da9c53fb01291007b288395f04d3ab37383c4e7844bbcbf6e4f0863d2c094598198a413fa62daa3ee64422de3dcc64d7aebfcfb70b0b64b3a8ba9293f5ea0ef19f49301f01ffffbf200718d3d70003543972ae3bbd13e90d48c347109f8dcaf8429d4072077529e4c783dee0b6e708939d67ff0322fc032d92ac15241864899c924fae6b086662d2053fb033e1598c306bfdf46e6c94ca5716d43ea0b0ac720a17576a1cc7fe167194bb78a141bb435bbfa932c6aeaf96f64b328605654957ff8fb12d86685f0db5acff67e16774fffe6024b91dde221528589e34d6915e31dd41c92e2413a9166321b83d96b9d4c837ad085f0d28226cfc485082cfca60d6e0423c1e7612bb7aebdeb2b3e42a81508a69c2647012ea200c27c01458da37a17d1fd72fb3d22eb13e8a00b8564f9cc36c3542500595b28ffb55a751774eff11d699d877be3e86760de01faf3c7bcd151968f35c6c5a861989d76a94aa1b0099f19e9e9f3d52c7415b49fa3867b3740fe37acf48d274e4df14f4fb1b903f78f6896601b273e8d460bb4747fa986275fdf1b1739825dc14ec4585b8785b8ae4cd8931b3abe49d5de5e3bf8cf99d99fdc5ed8294b1d152516947b42f83ed711e701e4a780dcd63a9c678e721414feaa7e85b054693035981c0976504c58b935f85b86394c6ed6049628bb93e855bb3c149ec9e1482546245cef484221cd2e8dddf7eadf1c451dc794ec397d0cf203e255292571bc625eecc0b237ccf457c303774a38303d08ca280319e99db10c6b03749452568d55aaaa52efa6f88af146b98bdacfbc9d355660e76f52862bed7525aebf12ec6bc29ac51fef59176104c45f017bf26396e4c6ccc49639e93e7a1a10d38e70c373bd056eb8b04d405bfaf167c065a61b56319b46d8b806a2119aa16fc05e7aa18abb2a676d3ce2d303da72470b145c7d3d360b510af77530cf3e84acf375baa6ddb7573a27f071013824f257430168efdc91518b8a46fc2768045b83a2a0188d8599da5cd0e319828a19206bf6bbbcdfea50a82a8be4a0bca4ffe655f1324280269c0938c7af005dce2ebc77ebef921cee84547dcc36195a66e26a596a24364430294c2fcb059479d62d7a84bf22255d62b82acd7cac2c99571b9ac19911eee143608c99b7a5c2765c529b29771f3dfe3a4ad9b0e658f73f1e4ad2dc02e845696b870f4047a916826313100b79b522cc108878bda2c363ea6d814be4095fb864c4488f6632519da51e5c7ad5ebc08b2077c3b403f54922db062034595e9a48507f42fa74e76298aefcd658838b04244f22f4fc238d2d1794b6aae88cf12d07a6f1e66dada83f98f00faba804a625fe820a4a11e2c81b7dd9e98842b88ecb680f965129e903cc0360724225265c6d435e2529c9e4306e624f866d7a04e407d08179288074ea7d99045c02c385bd2cbfad20b99db664e4719877d685dab15b696feb0f13d3a77f34f1510ec3a1fc446748e82cb257d80503871c5085603b3d97d32ee4345003907219f60156f395dc22b83099511c3597e2035c4884cda8c7e158ba9789041934f633c0917fc1842399f302911fee19b282db2360da2ca8b099e5f8d9c882bd4dac1acf289df626c7dae2335ae37780082edc024528bde8224393b5bbdffaddf77475c10e5d46947ea4a71d79ff8e6ad20a0710a1f16c36b3d6fb7ce70f5bdb80fa3c22950ae9636a6218befc0875a56ecf3a6ffb3544a5eca329f418298123bf1e1c1ca1ffbac27b26448a3b8e01f731cb53099db957b3f9b4ca81781f06f0d4ca3d2ca6a8fc86166fcfcd8aa1398e096a3d1d1fcfb47f7528cf0a07f11f60b0c582e0f24d216a9fdd325e3216f693be58c906bf4dc6198f8a3c170e00ee0dc4e7d81366714be8a81e97d2f2af03020818739f7d04178bac72fd0b3cb1142ea6adf2d595f879f33124f90d2cb0402700a64fb8698e82868f758e4d1dedfa27b93e3508cf8cbeda8238b31b8a8f6472427a9c17b8e5151f1f63ad9f30a9c3174748a13ecff672fa97b04129717c7e867178a8f9251489b9fa1edb937634f7d75cd928d55964378ab2e02f96e6519c9be060622c39bba5318e1a2d5f1410c36d71b83a669c274194bf0a194ab29bc0466b38dc3312d5335867d016a457fe2499bb6bb7cffd6c0aefd29b9f095bcb2060f9e459de5a629465318bea4dbd111a2edcafa18bada3387136cb523eacb9c6d40be5e828c6a6a0a08c42b60d2a5b4fb2f68a7dfb8ea306627000e27cc181e041385f3f4e7741c8a4fb6d39186b89321668f3f79cdb3d9441a162670e406488ecc817fc142dd22dac079b887b0ecc8007d05fe2b30765529857f76708e9ab2166bec35a945c7bef090c22a99e20e8d8467f534edb0a5b641c35e8b908bde74a8d376ecaf4aef7c8f05d02515fc68c64b201ee47489b676089f508d27444df8021351da86c59c2a7648f8f77e49b120a17bed243c84e51666b70758762eceba15fdbe544ff203fbdf8dbe6d04f80380aad053c73da3da302947da538034ab189835ef5a518efafabe436ed9be24867385f31dcac7929a69bb672770fd68d99cc109c5d72f0d4bfab856df4f55b285a52d4a1bc4437a320f7f3d2dcdb579f03b147b2b521c6fe0a56ff1ac5c4df9d758dcdf38f1acbe0e078228fb0588e9cc062378ba2ad9c689637749141e73d8d0ee26d172216ca983e09e115629c8b7041ff3d4a240fc5cba78e1c20261bbca927a9232abdabfc9f3febe31af3ad1946fbc74f1b90f47fd7ce11b1d356e287391560fb069aca049c0c959d1e7db19643525dc692548bec27b460d76a2476e7b4a73e016f8a56f8ab0406431fbc32f2439c72be289a79678d994d394fd0b3cab41646c5aaabad19291c9c246fb601e819b1331b3575a91e1247c73601d25fd1c247e1bf7bebc427cfa62da2b45f1f909245d3533bd9500110e8fcc932331b5c3a6aa9dca476343358acb1c51ea85cdcf0fedde957fffaaeeccbfcfc00867f7c2b1e8b2ab0af61db6328538c56d0adf11ccc35f92f17ad40a02d703ccdfe85e36f48e47454cba7127f345c931aeca50adf86636c3a9e0115914c838a063a189cfd93da0e712acd3426e40536e43c101d38f15ca9b6977e177329c87f78e4c5e9b372f5e16e13e24ccf071d85eae952644f96d1e5e744d1800ef4b294dcd4ee62e3827c33c122a220162f29bb99186e78ccbddce51ff327f17d5050d1e5079c5642158b713184e9e28731f534f1560498cd75efdd771605c92451d995eaf5c991236f2bf2e7fe6c76adc92dbdca1dbd08379c0801d888baa7a9f068dbec964fe9ba720f345a4ec055eed64954788f6da22a8bd32bc8a3e2af1a397f8e81a1fa8e49d6a842da720675b13f76ffb39178e75b26bbca14e1dfe39a3496f872077abb115b9f51e734d24438361a814ae9c8b63d97f6110ffa55e9fa1db8f1513cbe0d86c363cbd8a259b252a276a9b2166030f862a17d358a8cf389983f898dadcb75149b691a9402380f0c0e9a2d650a19b65723183a80600dcec855dcc276abefd4288b2f5ae28416db3cfdcad34255f8ad8b9a64f8f6c899759d2cfae22eae27de93ead658c845c0fbbb92f2ed151e0345ad5a7a88bbbc6920c605f36020c6474f4c1aef8c12d7e20f8184fc8b05ce68b9821f6fa2f15c5d082c3cf4d3e4cd814f39d3dd090ad1d1e6bf9520afabeee3776c27373adaf1c3b978b21ef1c1b887dd6dfb5b7b4d04a35fd8c454428cae0d38eefc396f8c091d1f574625c3116768f57da9df387d5d3e7fae79d0d03802b0bdc36accaa666880a5395272042702c688c70b36e65137594a895d223a2814a010b03729392c52f70da8527447ccccf3a81fe0a7a3badbc459417c5408d1464d3257ca5592e3efcc62551c56eecde1e7a2ebf7b23eb0601c59839e48bc363126609646b910c299d0ec3c7ed3af110a37d75a9c8113fc65611de8cb3bf28de8a2a9e22f5d96761c37d7b3783654740e9cbeb609642173c838eb0404e36867e8d3286f00ab424f73889ac9701755cf1f60a43f5e84c28cab93c248e42f61fe33d550003ac16701fa497b4f597debcb530ec320a25f82b4b6b1541c3d32d4efc48b36e3375208b3054836bae2f0f1fcdac92bb4732339d46c6a91f102d8058e55b95ddd19855d6aac7e0a31e8bbbeb7f9106d0985daab7083ae7336c642f38de4df5ffc8f7c3d23b59fe94031798bdec89b15d74ef4a6c1146fbc1f2190c6fd5d4627a2d0f7dc585cd631b6a853585bf314f48fe12982b412eed21001e6df419b65116529ac1271085539273c0604384ad31b7a0b603ac08f9dfcad1c63a3819cd970552d53a22bf6995086333baa10289c57f4c93c14bd5f0bc7c918fe8038668b88f4dea0d7c84499f7214aba5e9f986fc94c29c069262b479911d5fa7464e662cb944693c04a2e61a348438326eea563fd43902da3db1e309b6ace3c74960da606d0849b418582cc9fd8028df63faaeec75a8fbdeabd9319a31560bdcff330c6a4d76301eeae019e783a35a256692e94ea69c853c4c86fe0dcd544dfd9f40c0327ff8f6edef5a284433e44e61aee433c42a50a3f30eee552900e3ece0b5400d01e54ac9040218dcb2327f8bd2a6c6db67c67579ff6eadcf480f43902d8ff80edc5da68c49e2053c4ee45966ba48c0971d8d6467c23dad5bf910a95845a9ffc8d16d975f2df505dcc8ba95fedd68b68296707ad260a707f8a295ac06c7a877220b8f64e0567ff9767a134f80e675ab7d21f69cff0c561e007e11502f2eb018324dbb01590b324336a4a720c61f2158e1a13d725c12a944f5bd6a0eaa83d99bf488e5f6e75cc2358d9129b2fe662b311af8924368d766a6679e16be78c42618d5d8f5f6e53bb30436978ed927ac5f8f31c77d356e8b35ec751811335627cae19a5ec6fdb54d12e82b77a5ce7439677123cf63ee1767c81a651976d875c5af5088041d45092b049e00e8ec0a4e579402d2f813777f59328210d54805ec05967e1e19cd304b1529d52d8e3941e0d9ae4ee46d51327265a86f1d69a2b6f3cd37623954877b92fc985f90ae56f8f6548a19ffc46f7a2a89a0cad2fbc5d93507ffc2e9e4ff6441249700271cc5764055125e985ec4e860ccb23e352944075afcf608987e5a0dd8dd59484ebbcd455a2dd9559262da3c92eeabf0224a339bd84a7bcb21a9147d330aa32aa824ba50775a70481f5ee4962cbc4b1926b16c9157ee0b109267b9cdc73f84d1c333581eae4ffd8f838c57db456435aca47e34751f2ee1837a85c0c2fed94650affd21e9075ecd89ce5e1ad2e59ef992512463a042ff9324ca0c280eb5293234f80d958ced108161a072834f1e7bea22ea3a65a16902d753abfbea9f3850ab66e7d11137b435f0932ab26b021b0b2341251753fa31adb0f984af86353d67d3d69738125471c23de41b9c099e2b3b879b415905f85d3b17e5c7fd3a227b99de2cd33fea63bbb6ef993c45c9894e1f0f616e64b36f6589aac53581a11a68b719479ef55ef79d12902b0314918475c8ca21a61bece95ddb9085180d3bc7629ebf1415c01b51b2d2656a73e8bf7b54260cbf35386c9501faf37069b5c3a50dba510cdad2b03164478a4af4eed65ab0b2013c4a93111389ad126968de8a5565ff60ebcf8ec5dea1f48c962e2e3d6d67682071ba4cb273bb770b24b9d662358bad5d195d0cfc910abd1f822d3d60db2c9f293e7f77824f381d537c358c82c4b317ae4faf8680cbcaf8d91ec737bf78e868563911cb2f733fb0b0432276e30d239b7d3ab0e195617f0843b347a987043c597805d973578bc080a9f16ff466d13012c672f33db4e611d0a5482a4fe262ffd71e0179c2758e368ba68980119adf2e66383de91df7f0a277b20c042e8fd455521009f6327fc6fb326f352519bde331c496bf8c5d19531412419ce0073635da3279804d4977c13867caf0e355d32384aa17bcc5697d3f51809bf5eb2663adadbd26844a13a521dba4ced8145baed6450badc5223737eb891b198cd9b3f8f5e40d5e3df3c3af68b93fb36591b062abaf5975240ae00acc594e86accf9c3b0efd91882d6218bab9a15aed0e845902bac6b1dbad21278937ad42f25862004c7b57814b586f98e5aea3532525f40ad91d233d7aebe203cfc5727dc78b1ec33c8bd10a8546d859c1749a2c1c9cb2fae4a33c40047bc5565a58559c818a5c93b1aefebe3dc73596b9bd8ca4eaadb9e59aacc4e42d71c2642192d4322d14b72d2b1a148a25aabbdda0a10a3ad46b3e85a1a0f2651373cd0836eb2c876390a1fbdbe47de2f0b5039fa36341e3bae3561a60ec9d608012e1e9088a3699792b6de7090409abeb7c65be2b45204aa76b7c5f04248cebaaecb45c69ac758712b2fe0811b831ae159d8c83c1147d296e47d7e0aaf5d8ddd416e7547abff9ca7f05899af4196ccdc21dac570553731658d26dcd8c1ec9b42e61d2652739fc2e219c2269d4463e09790484dcbd40b7f0b86fe5d15ee65d1803d0dc1f589ed925d37fd986d20d7fc967af20e74685a502ae7217eee114387c41d94bc5244ad3007faa0e5da9f57e86fafe18bdfd947342c85d37ab85414fde22118a1665e27bb8edb3c3ca5d727f13478b17a1bdf7802fdf05de3a37832023aa351d138d1fc904dcf135f9c24f31c06f7e2420123310d92d312e827187d847ab81a1b64e9b08d7d45bb489ea9ff59f19fd6708ed5f7d1e6fa51b1ebddcaf6e63e9c6cc4261a58b6c1de2303bd668001c6d1e9a92407b57848f21e5a17b0d71785391148f0c221eabaea07f5b3a04f4ddd15f98b0044c588c51b54418cdb30736a7dc89a6e353ebc7bb164e6df8a83e8e50a0ce97e41feae907305f287841c73e838e059e4803b1c697d628d5873de404c743c8d32a68c43fc47b10e660935da6a721e55ea1445c45a73c625e88b428d45c62bae7042954af264407a9e0d86364a1a5aca27bb4944df262fd7c49cf6c28f024bf3297c4017f07ed8b93a666635d09d8d80b52391eb2a12bf31f963d03ae99519de5b3138cb25b73aa25b17b55307d20bb09823e774553c5a844096c20f67abec0b913714f2a4b36699f5e6f235b47b76b33d1ddca4cb94d8232c39c46b8199765cfe30f0b6deef0c466e44173c706e758a5992b72d767644c48a1460af547f76e2d30466023fcbe755dcda9b6a49460946cd8fec3383b974f84da24fc193c76e50a7c58da36b651be084d4764e047d325e778d28b04592ad566033dd04f9117c1eb8ff84502f56586b0cbb54c8f95cecdfa9323a22a5ea20b7e197e4fd10489939b0561d0a0b6d5e53d7df6549c54f0aaf2e0d9e915d16fbd6ea7f403e2f7cf762a4ea7ae13196859264708af925606f7066640b3b7bea2ecc852bd83f1bf3dde017268aa8b842bc4a61926cc929f9e0be25c94d3f80c7b0ea93ed321c9f21573f102db3ae719c2a279e735e5ce9c1ad7796a1bc0db5bede8618f0fd08972c4dbc278dc57f7a50154b2177089640e19a7e088760bd62aba21146f5de29a7c5a5fbf77831907fe9dcab35275406a0926a5d8239d26e5bb3a2 \ No newline at end of file diff --git a/src/19/input.test.ts b/src/19/input.test.ts new file mode 100644 index 0000000..08aca57 --- /dev/null +++ b/src/19/input.test.ts @@ -0,0 +1,14 @@ +import { assertEquals } from "@std/assert"; +import { main } from "./main.ts"; + +const target = "input"; + +Deno.test(`correct possible design count for ${target}`, async () => { + const result = await main(target); + assertEquals(result.possibleDesigns, 353); +}); + +Deno.test(`correct possible design combos for ${target}`, async () => { + const result = await main(target); + assertEquals(result.possibleDesignCombos, 880877787214477); +}); diff --git a/src/19/main.ts b/src/19/main.ts new file mode 100644 index 0000000..24926fc --- /dev/null +++ b/src/19/main.ts @@ -0,0 +1,53 @@ +// { possibleDesigns: 353, possibleDesignCombos: 880877787214477 } +// Elapsed: 133ms + +function testDesign(towels: string[], design: string): number { + const designCounter = new Array(design.length + 1).fill(0); + designCounter[0] = 1; + for (let i = 0; i <= design.length; i++) { + if (designCounter[i]) { + for (const towel of towels) { + if ( + i + towel.length <= design.length && + towel === design.slice(i, i + towel.length) + ) { + designCounter[i + towel.length] += designCounter[i]; + } + } + } + } + + return designCounter[design.length]; +} + +export async function main(target = "input") { + const dirpath = new URL(".", import.meta.url).pathname; + const text = await Deno.readTextFile(`${dirpath}${target}.txt`); + + const { patterns, designs } = text.split("\n").reduce((agg, line) => { + if (line.match(/^[wubrg]+$/)) { + agg.designs.push(line); + return agg; + } + + const towelsMatch = line.match(/^[wubrg, ]+$/); + if (towelsMatch) { + agg.patterns = towelsMatch[0].split(", "); + } + + return agg; + }, { patterns: [] as string[], designs: [] as string[] }); + + return designs.reduce((agg, design) => { + const combos = testDesign(patterns, design); + agg.possibleDesigns += combos > 0 ? 1 : 0; + agg.possibleDesignCombos += combos; + return agg; + }, { possibleDesigns: 0, possibleDesignCombos: 0 }); +} + +if (import.meta.main) { + const startTime = performance.now(); + console.log(await main()); + console.log(`Elapsed: ${Math.round(performance.now() - startTime)}ms`); +} diff --git a/src/19/sample.txt b/src/19/sample.txt new file mode 100644 index 0000000..29648be --- /dev/null +++ b/src/19/sample.txt @@ -0,0 +1,10 @@ +r, wr, b, g, bwu, rb, gb, br + +brwrr +bggr +gbbr +rrbgbr +ubwu +bwurrg +brgr +bbrgwb diff --git a/src/19/test.ts b/src/19/test.ts new file mode 100644 index 0000000..a0fc5dd --- /dev/null +++ b/src/19/test.ts @@ -0,0 +1,14 @@ +import { assertEquals } from "@std/assert"; +import { main } from "./main.ts"; + +const target = "sample"; + +Deno.test(`correct possible design count for ${target}`, async () => { + const result = await main(target); + assertEquals(result.possibleDesigns, 6); +}); + +Deno.test(`correct possible design combos for ${target}`, async () => { + const result = await main(target); + assertEquals(result.possibleDesignCombos, 16); +});