MNIST

MNIST example is using the Onnx Precompile and is available in two versions 0xe49b0C4107238674c5BC43167b9D3b93954c0294 and 0x3ED7196f54c95197C89cb43fF2fc1002eaaf0D6e.

0xe49b0C4107238674c5BC43167b9D3b93954c0294 is an example of deployment where your model is too big to fit inside a contract as a constant so has to be read from storage. It allows for bigger models but as a tradeoff it costs more gas to call the model given the cost of reading contract storage.

0x3ED7196f54c95197C89cb43fF2fc1002eaaf0D6e is an example of deployment where your model fits in a contract. The gas usage per inference in that case is around 8x cheaper than the storage version but limits the model size to around 48kBs

It allows for atomic on chain inference of 28x28 images of hand drawn digits. The inputs are represented as an array of 728 integers where each integer represents the grayscale value of the image's pixel. While the user can submit any type of image to the contract the output for images other than digits won't make much sense. The images can be of any dimensions as long as you can pay for the gas cost. Currently this only cost of this contract is reading the model from storage, inference itself doesn't cost any gas however this will change in the future when we implement more models and estimate their gas usage accordingly. The contract code looks as follows

interface NeuralOnnx {
    function InferFloat32(
        int[] memory data,
        bytes memory model,
        uint8 precision
    ) external returns (int[] memory);
}


contract Mnist {
    NeuralOnnx onnx = NeuralOnnx(0x0000000000000000000000000000000000000044);

    bytes private model;

    event InferenceResult(uint, int[]);

    // Model is too big to deploy as a constant/immutable but can be set as a storage variable
    //bytes private constant model =
    //hex"08071204434e544b1a05322e352e31220761692e636e746b28013afbcb010aab010a06496e707574330a0a506172616d65746572351216436f6e766f6c7574696f6e32385f4f75747075745f301a0d436f6e766f6c7574696f6e32382204436f6e762a150a0c6b65726e656c5f736861706540054005a001072a100a077374726964657340014001a001072a190a086175746f5f706164220a53414d455f5550504552a001032a0c0a0567726f75701801a001022a120a0964696c6174696f6e7340014001a0010732003a000a460a16436f6e766f6c7574696f6e32385f4f75747075745f300a0a506172616d6574657236120f506c757333305f4f75747075745f301a06506c75733330220341646432003a000a340a0f506c757333305f4f75747075745f30120f52654c5533325f4f75747075745f301a0652654c553332220452656c7532003a000a90010a0f52654c5533325f4f75747075745f301212506f6f6c696e6736365f4f75747075745f301a09506f6f6c696e67363622074d6178506f6f6c2a150a0c6b65726e656c5f736861706540024002a001072a100a077374726964657340024002a001072a110a04706164734000400040004000a001072a150a086175746f5f70616422064e4f54534554a0010332003a000aba010a12506f6f6c696e6736365f4f75747075745f300a0b506172616d6574657238371217436f6e766f6c7574696f6e3131305f4f75747075745f301a0e436f6e766f6c7574696f6e3131302204436f6e762a150a0c6b65726e656c5f736861706540054005a001072a100a077374726964657340014001a001072a190a086175746f5f706164220a53414d455f5550504552a001032a0c0a0567726f75701801a001022a120a0964696c6174696f6e7340014001a0010732003a000a4a0a17436f6e766f6c7574696f6e3131305f4f75747075745f300a0b506172616d6574657238381210506c75733131325f4f75747075745f301a07506c7573313132220341646432003a000a370a10506c75733131325f4f75747075745f30121052654c553131345f4f75747075745f301a0752654c55313134220452656c7532003a000a93010a1052654c553131345f4f75747075745f301213506f6f6c696e673136305f4f75747075745f301a0a506f6f6c696e6731363022074d6178506f6f6c2a150a0c6b65726e656c5f736861706540034003a001072a100a077374726964657340034003a001072a110a04706164734000400040004000a001072a150a086175746f5f70616422064e4f54534554a0010332003a000a770a13506f6f6c696e673136305f4f75747075745f300a22506f6f6c696e673136305f4f75747075745f305f72657368617065305f7368617065121c506f6f6c696e673136305f4f75747075745f305f72657368617065301a1154696d65733231325f726573686170653022075265736861706532003a000a620a0c506172616d657465723139330a1b506172616d657465723139335f72657368617065315f73686170651215506172616d657465723139335f72657368617065311a1154696d65733231325f726573686170653122075265736861706532003a000a5e0a1c506f6f6c696e673136305f4f75747075745f305f72657368617065300a15506172616d657465723139335f7265736861706531121154696d65733231325f4f75747075745f301a0854696d657332313222064d61744d756c32003a000a450a1154696d65733231325f4f75747075745f300a0c506172616d657465723139341210506c75733231345f4f75747075745f301a07506c7573323134220341646432003a001209434e544b47726170682a9b50081008040804080a100122805005aabb3d63b3f83d52ccae3d4e19fb3d863fcabd86a1e5bd9a5c12bd1225c5bdc66f17be3fc80e3ddd6f46bd952d0c3e5d8f153e9d49f5bd9408553ea29568be7cbfd83e8257703ddd542bbe39ddbdbe5dda44beea2ac13d7de1bf3deaf92abc64206c3e7ca8e7beb1e4233b56bd4bbcd829023d4fcc9bbe33ab933cf8e9c63cef1f933e20182f3e315c98bd7bbb903cbec5d7bdb88ca7bdfb43753db33ef83936311dbe740cf73dca7cdc3de573c13dc10d8fbdf465d2bc2880df3def58aabd351fa93dc3ec33be31342cbe9253d73d457f32be9683a8bd9df3ed3e0ce5f73cba2923be695f4c3e78efcebd7234fdbee6bfa83e22c5353ecea0d23e6c70fc3dfd2f8dbe1abeeebef117bebedffcabbcad1203be22e7463dbc69c33ecd8b6dbe1cd6d03eed9db93c22769f3d32912bbfd1937abdfe8e3f3d13ea06bd6aa9113eeea303be28c8d43c17c412bc8db2373eb60d09bd4b7bdebc676c053e36563abd04df5b3d28feb23c6a7cc3bbec6f4bbd4bba22be3ae9de3dd5252ebe32fbb23e497c32be4c73293e2fbd0fbe4ce731beb1eb15bda043243d7990443eed252e3dd6c127be7b42e23e86a09d3db312e0be82a94a3dab6d71bead3ac9bdf699cfbec0fcbebeb989793e4d8705bfa01f113f0c230e3f2bdfd5bd3059383e91fbe8bd0e6822bd53abe5bd39571bbba50b4ebb1778d2bd32fb9b3cf5be93bdbdec80bdc6ffb13de4d1733d14b7383ea7efdc3d69b848be8157033ca3a3813d4385723c803c93bd31e2da3d8bed7abe00e4793c029dabbe984c06bdaae322be0e90153fd08b96bd7907043fa602253ea8384dbede5ab03de39188bef50cf7be31b9253d390ad4bc5659993e45de5ebe4039a63d997a883e509294be957f883ec0ec4fbec78ffebd9179c33b5dbf653e6ad10b3ea799e5bc96d48fbe54e7ba3cd657853dea8b15be4526d13d268b0cbed3cb653de620a6bd540ce93bffa553beaad5e73d607538be3a3ab83e63546bbefbc4fe3be0c159bed2efd1bdc090ba3da1ee8a3e578614be60a7b23d96cb8fbd3c180b3ec1caf03ddc49c7bbc4001ebdd214b03dcc32423df31316bdfc3ea73d147aac3d5afa093e041681bd30b8b53b524b9e3dfec9c4bcd84297bd7f7c783e0a174d3ec29502be226cc0be5ec183be93542e3ef4ed94bd26b8dfb90e9f0fbdf52b813ecdb5973e3929353e7071d0be708c37befe47f9be0a043f3f1e1f32bde8d526bdbedb673d862291be1d528a3d9aaf8cbe2f3497be718fa33e2b55ccbdbac1b73eae650cbea2b178bd84a8b63d0abffdbd237bf6be80c7f7bd6d959abdafce013f2096253e0f0e093d303254bc1245e13ddc8739beef1656be4acc2e3e8e75553e6edfd43da4e6283e55c054bdfc7b983ef262f5bd258b35be720612beef443ebb23b320befa987abdc6163c3e0d258c3e2e87b8bdf771f2bd0745df3ca52cab3ec6c413bea5e293be0a9182beea38c7bdc6e8133ff82395be5c2f3e3e64c86ebebc063a3e46f129bcf2451cbd4297b6bd8586253f816c2b3e67d8013e108ec8bd284e5b3ec670873ee5a45c3d886f42bf76c64fbee259b23eb7c40cbe57df923e46ef5b3e78cac93db63076bee95e233ea93668be2d958c3c24c43a3cf864333e037e4c3d4d959e3d64903bbd2d5ec83cc6b652bd103dfabeb5c486bd6e4ece3d4764893ec81d23bd0290c83ddf2a22bddfd19bbde7a9dab862e2053db2b69fbe906db63d8d5794be2fc8a1bd194c7e3ec9ed273f604694be8053b13e08efdabe491380bd2e92293d1b33c2bdf41512be5a56153d5dee06be7b1c393c2ad02bbd59b7cfbc028a35bebf85473dcf4be93b08fa0fbdcd18f7bd99eb1c3d366c49be64de1b3eff48883d7743da3c929b3abec08f4dbef2937d3e7326123ebaea4ebc0a0b013ea6b494bcd9b23dbc9df2e83d20b1aabea43d06bea01f14becd01603eff2c943e090b803eaa24323e0ed6d03d762583beac73e5bda83372bd8935103dd73627bdcc0bb5bdd55a8fbcac7e0f3d8dd4d3bd232e8e3d9663903e494c883d847f2abe7e88873dcb7c28be2328d13ed132803d894882bd585a91be42873b3e072bfd3e68ef973ed7198bbe3df1fabb4f4afebee3bcaf3eeabbc23d37dc8dbe4dba453e51f578be7d3f643e29f5383e6e4eaebe9f80c93c2c0ff6bdcfc7aa3e60b573beab6cfb3c32d1aa3c8b186cbdf5574bbc3eea81be4b99acbee4a0fe3ea1f0ce3e4388b83cbd1765be1d5a023b5f53a3be1bb2f43c4994333ef2915b3e28c2883efd4be03d42f090be2ac5a73e63128d3ef112c1beac982cbf0c35d9be59e133be8868633ef29e063f293eff3e6ff53bbf676794bda62102bd55361d3faff48c3ea7ed39be1ed2303c53408e3e4048473df38c443eccaa11be7bd3c03d03a011bed49e43bdcb800d3e8602e93d28a411bb6af3463c421703bec5e7573e5ae2c93ddff1f0bbd023bbbde78e3ebec4d9bf3d3f25613edecd613cd9df973ca43fcd3d788a6b3d8dffb23d28b584be0e9f513d2d84013d82db9a3d01b05cbe65703dbe7bd1893ecfdd6dbe98df753e86df5a3e158208bf084ba1bdcedb583e75a52e3ea848093f654d4cbe0b56b9bb5fe947be2100febd8a668a3dafa2f9bd226e5f3d81219abe13e80fbaa09e2f3ef32e453f9eb38abe154e713d09f312be9c4ec1bc1f46b6bc42ab6fbeed308dbe2d53ce3dd02b08be10f10abec51f1a3e56290b3e9d4fabbd15ca123e3534df3dc969e0bdadf9973bf130a83dd76269bd138705bd32fb2a3e17cfeebd2478053ea462ed3d2817ac3d73330fbe482f8ebb69b39abdc8339a3d12b6153e83d595bd1ee428be995145bd5ef8e93d1b9629bece68cbbdf64b31be14d5c83d506e563d4feb123d673787399a06e2bd07b4a23d558369bca44b373d0cabc4bd0e7085bd40de983cbea6d83dffe0e53db761313e354786bd55ec033d4f7d873dc2efd2bd35df3abdbbeab9bd7416af3d38f18cbdd6d4a83eee560dbe13f780bdcd27303e4ec46bbd4db60ebe0e898ebede9a6ebbea8a2cbeaa40cd3e3399d73d2339f6bcb3cba0bebfedd6bb60cd9abcbb37bdbc09f054bec262ee3dc6453cbd50bcf83d3bb0f13d51e5b63e9c0941be05e507be24345d3e03c991bdcde676bdc66e6abc97e6c83d9055ddbd76b1fd3c5fe7c7bd97c4cc3caecd76bea10de03c9b0f0a3b304ff43dd186c63d0055a33e6f302abe54d9273e25fc7ebe5fa8043d22a2c23dce7e823d9751c93ec96accbe563842be4e5179becdcbbe3ed8eab4bec065ae3bdb1838bd138a6f3db43f86beda3b72bd0844b6bed0ee533e165b8a3e99a85c3e0600b7bef01312bc8f4dccbe31b6603c44e4d83c1098113e6d614fbe98a98e3e0221dbb90e1e45be5abf223eba4cbdbc2795e63cdca7ee3df39a92bc376867bd50e7a3bd511b97bdd027d4bdbac72e3d04ebb03e5b02b6be1b31843db511bebd0310ee3d24935b3e7f5e933eca53b8be26eba0bea236b43d7aadcebeffdf493d2c58853eb5cc3abd804daebdf512c53e15ea803ef84df63c401344be2c612b3cfb3628beb68bcf3d052c983de794923d534109beba5844bea944963becf2533c064787bccb9f323b2b7e15bc1abfeb3d854c8c3dacd3d3bd8df6ed3d479d783caf60e13c6265f1bcb6dbb33d73572e3ed92fdabde885edbd2b9d0dbe3a1b4fbc526ed53d7ce193bdbcdf2e3debb3a93d460f8b3c2cf9833e2f39e2bdff1a12be9e85b43ddc076c3ec01c25bdccbe99bd0eada1be39c6b6bca7cc13be9d8794bd5f2a22be8b5a21be05ea87bd0f4cb53ef812e13b51d01a3d72878fbe8705993cb44ca93c7bc88c3d10804e3e302bc53d5babf1bd4778f63de86d8dbca4914f3d8ca4df3d5f592ebd17ede6bcc863633e4a53053e091258bdc440ff3d86c2b03d49fe4a3d1ebb463e2c71a7be553d52be40fc73be0ac78dbe17a8793d67c2473e2d20a33d836e17be0d9f4ebe2fffa0bd050fadbcd2531f3f440a03be1045babd3e1fd8bdabcd943e79f365bd5e2d6d3d0fb7a9bd23d79e3c04e7ad3e9f132abdf31833be5f3d073e7eb46ebc6b23f1bdf1758c3dd6c82ebdc229113e556b823d701c45bec644e8bd6b4646bcd58edb3d128f9a3e71a1ffbd76bb16bd7309963e004986be16a85bbd9d09aebddadff83df28d00bc078a97bef82aa73d03c7c43e82cdb33d2759863dd0d0163ef758003ec9c763bd43d7803e2e1cc9baad9e38be0d9828bec3c0f0bd043bedbdcb52dbbd7b2c2a3e19dab53d01bcea3d253f46be1a0f1bbefa54653db6330b3e0e47fdbc9ddf4abc80b6a83d1b70853db69a74bdb0b418bef802043ee20b7a3e949e2bbe66d6b63d6461123dd9ecb6bd2f503cbbba4909be977a6cbe06fc1f3d1b432bbef6e8363ee533c1bdb6d199bcae530c3e9affa4be6cd55e3e1afaa93ead84f3bec724e53e5aa19dbec55b1cbe418d3a3ed3fcb5bde306293e92272a3d41073b3eaece3b3bbffc9bbe498f1a3ee6928abd92c62abeb5fa0cbe3a31b23d9da625bd2f7d17bd464439be0d25283d9892fe3db9a72dbd6e7c82bd5de30abebc79b83d9e68133ea3a1493e8b8ef8bc261f3b3dc5b3863dbf7f41bd5184b63dc647253d4d1d56bd5c841fbe4ce7443e86ae0a3e4c8140bc4c46813d1665e1bc264ea13c224a9cbd2d4c273dd8ce09bd22768fbd8d464cbdeff516be9ac84e3dc8e577bc158edd3da72ccb3d64df0bbe56f225bdaa3bbabd1d59713e9af484beebd035bd262fec3c1603543dafe37e3b28ab203e7e71cf3d5f6554be0694c0bd4985823e6d3b1bbe9e94c1beeb21193ec7a8d23ded585fbe3bde65bac80eeebde814ba3d1b26083f5a423d3e625d1e3e02b29dbd890f9b3d9bb3753e993de7be793c063b8ad5cbbe18cc05bee7b6ccbc44448d3df15d2abd457b863d3af881bdf7b73f3d88ae4dbc9c18edbdaaca6ebefdb88dbebb535fbc92b695be14ddcdbef0dfbbbebe41ac3ed84e4ebdbe242bbd861a85be637e993ee643e03e367a743d658401bc7550c3be015260be59e7803e7edd313eb1ae32bea1661ebeef2b393ede2ab73e866733bda22fbe3e02b3e7befdc63f3e7f3c57bcb96c12be645013bf275404be5975313e1becc33e7c071d3ecf4c23be6df3173d14158ebc76630dbdca0733be2f3ddf3d2098993d1ede1b3ed30229bd1cce8a3d8bbe1ebeaf78273e9d52693e8be43f3dd45af4bc1cfdd43d3e3c42bed2f60a3e40c8b8bd1ecc863e71bc91be8fe9253fe86a0bbe4f4d843dd98cf63c9ada8d3e115763be24e8243e6f9575be21cb65be65ae69bc2113e93e1f176abcdec649be1f438cbe167b353e09e9933dc0aff4bdb24293bdbd50df3d4b6033becc59b6bd3dd22f3e0af473bd9b85e93d982f293e9905b4be203c0dbd0f70f0bdfe5b09be68f523be173a873e8d30df3df224b7bd9c6b31be358b5ebd2f8e3b3dcf47a73dc14fae3d9446a43d818d77be0298be3e06bccebd557120beaa8a503d83924c3ef1c47abedf0e0a3e3cc90f3b3554ffbc648af83de8ee01be8a2142be91ac2a3ea39ff93c2bc41e3ec80258bd4537d73c99ea68be1b9909befd849c3e2c6bbebd15313dbe8c93cc3efc8162be774b303ec6c5f2bc2f38e13d7af1b8bdfcc661bb6903183e9651533d041c2f3e590ba73ce8278cbef63c67befc7814be82d74dbd6bc1833e6e37373e4d30d5be9870c23c0ec230be2a9f02bf83ccfc3d5ba19cbe68f7183dbe42453e0502f23e51b4debddcf6c73be24a3ebd625df9be8029253d876cad3d3785033faa4586bd6eea193e778d24bd44345dbe58c77a3ef3420abeb455d63de620383fec3302be912b87bee65afb3d7528663bf4451fbfccca823d4ed1f03c110eac3ef28af1bc2648df3db8cae73d60334fbe62d3783e8069df3d9a7aa5bec55411be68ff83bdd7bb4c3e72f8083d5cfe41bc6bcfbd3c4218053d3a1fcb3d2ee10f3cef6bd9beed04033e3f57b13e628e92be0c74893ef9ac563ed3e943be5b3ea93e5f649bbe8afc29bba42400bec355733e93b67b3e731d4d3e0514e6bdb34781be3635e8bdd140a8be42415abe77339abde851c53e796972be52ead33e4eb2f2bd67e9253d615b703d8857db3eae3eaabee2ad98bcec6999be7e22b8bd03c4d4bd602e513b4eb900bea0e81cbdc77bd1be4867be3cc33337be109aa43effb182be4c4be33dde43cd3dec7c033e3e764a3b4076033e5402d3bdf2466b3e04ed9fbe15e9153e0031543dd96b393e70279cbd8e14833cb92879bee87c9b3e3f2ddabe10848b3e91221c3da646813cb26ba13e6281aebc10d3483d06ca56bc395d8d3dd3b5c43b8fea3abecacfb73d3b84ec3c130419bd315ffb3d84ca7e3d27e8df3db467babd08b92d3e7762a5be4ad910bee2d1833ee3a7ff3d83fb5bbdf50bde3b4a3bee3c116e08bce2cb3b3e5b044f3c04e273bd5fdae73b0846253e36a7533d3fa907bd7a4f16be65302bbdbb5cc73c782425bdd66c93bd12697ebd75e4cabd06f09ebd8effff3d5c52693d05a5b33d5f68043e524944bb38c8d0bd518c2f3b40a28fbd61b7c33d2776203e45ebd43d1528133e02514bbe05764d3ef7a67ebeb18e913c3868db3d1c61fc3e248289be6a44f8bddf0b02bea055573da8ee89bef345dcbd0e594a3e5c78553eebf7403efd99ebbd284f9cbe9743efbd7d14b2be574e053f7e49f1be19706ebed6561e3ea515833eef3c393eb1c4b2be6f83aabde317a8bd48714f3ed93f2f3edeae34beeeeb31be86698a3ee3d5a5bdf6f6913db5efe6be92f48b3d9bf27dbda00b893efc510ebd3ddd383dd81ae83c48d95cbd1a598b3e2e16f63d007956bd89a3643d26cf933a8e75c8bd8f24b73dce30763edfa72abede6e27be3645383e17ac11bc38d6e7bc2cbb03be65df1c3dad0903bcf004d53e245953be6db003bed69a093ea10306bb95ba8ebe0c4194bef43dfbbdd9be12beb747f63d0fbea4bc301af33cf01706bd24dfae3deac3bebb41d28d3eb94abebd63dd263d65d984bd3bf0893d5e8cd0bee107353ee7424dbdd014e3bed134083e8a584dbb71ab11bfcddab43e72e21cbee194933d6da2ae3e685e80bca5f39b3c7f62e1bd50c60fbe0b45a83d1f74a13ef9eea23eb70c14bbb90a073d36c696bd7d7a6dbe8bbda93dbd37a93e04b8efbd91fb0dbeca78f03d20e0f2bd19db793eca722b3c9ef426be868ccbbd5903d1bd75b111bd22d44bbe8b5c3d3e02cf2b3a57e834bcf3533ebde017393e701b55befe0e2fbca674e13d0be1a4be088461bdcef2943e304b4d3eaabd97be94f493bde567443ee0bef7becf46933ed0ec0f3e6d258f3e97a315bd248fa53db30e2fbeddcbfebd586e8abe8623c73ec060b3be8567cbbd242ed13ea6e1273e3882703e709ca8bd8b126fbece9a763e2f07543dffde883e59f2cbbd07ad17bea5eb22be5e2c3c3d3f1ff33d741f79becdb80fbeaca1543ef6fb3cbee966223ec72aff3dced0d9bcba504d3d63bea83caa296d3dacd683bd45777fbc582c183ef363d6bddb7701be261b25be248ae53ca3282ebe449b213ebea4f63d59e028be61bfb93e1c8088be921111be0146c33d3baa813da6edd9be6eeebebd27b98a3d16a5d43d255cb53e175a293c4ea7a5bd614a4fbd0aea4dbebcbaae3cd26c3c3e90642dbefe7eb63caedfe0bdd26f98bd583613bfa420b53eb310f73d7168523e34b003bd9998073e712872bec51cbebda69004beaa18de3dec81f2be209340bd0b327bbe6ef3ecbd99f73bbe24d3973fbc5057be957c0cbe2116adbdf02ed03ef9c02c3e607be93d1cecfc3d1ee9b5bef866443e8c763dbeb44f863d0f104d3e1c83a7bda25644bea305adbdb0b7aebd0d50b6bb303056beb942af3d40b0523b70f2163d53d71a3d73f5f8bd6afed53dca21c03cd15be1bd6061703d894863bd79204ebb5002c9bd932b673daa51aabd84f191bd8f04a9be2efa583e40e70dbd1ffa433e8b0b053e8692d93dd88472be112bde3d866b9fbee4c32d3e22c79ebd96b0023f9825f13d67703b3e43a12fbef84c573e45e898be239fc23e4a7a54bcaf6a943d562e89bec6b14e3ed25b41bda120fe3d4afd87bd3ebe8a3d495b86bd6ff9653d10b708bda42d3dbd73d0e4bd4e55bfbb93c9423cebebabbcfc42803e0987e0bd4ef403bc63db72bec9f588bbbab9573e1ff6d2bd1369aebd7b395fbd1a6c323e39e4863ec2d220beeae95bbccb7709beebfb8c3c011ce13d589af93ddfa71dbee01ef43dea04243d1bf95a3e68a636be9f25b23d38f37fbe06436bbdef12453d2e33e8bcd952133d3b4b5dbdf45e233d8051463effcdb0bde148c33d9a6fa5bd7e5b013ecc66dfbd6f4796be59b890bd4afbe1bdcf6aa63e083ce03db4322cbd1a123d3ecbfcb3bdbbf551bd1cabbb3d38c795bd416bdcbdecd6593e26935e3e3bd6ae3dbf7677be80e47e3c5b73153eff70813e1d3dbabdcca51a3eab4136bd3da9093e01ce02be26a948be3480a73e42f0bdbecba8b8bef8d5273e06bb4abef2f25bbefa5c533eb37604be8a0c45bd6928f33de10612bc8cc8893de2a76fbe6bee863bd873b2bee1879dbed17e01be0e8f8ebca3652bbd6a29ce3e555435be5576873e50cb353edfa71a3d9c622fbd77576dbe2672723db1ca1fbee110483c5a72b73decc934bee6c5613dc6aa26bebe72b13d288ad03e69b097be86c87fbe221e153edd69043edbe4d6be808e5f3df46c1dbe8886663e7556aa3d544d26bef63fb9bd411a423dd5e8fe3dbd77b3bca8deb9bde14f16be47cccabdfa123c3e2998993d3b8d7ebea8c38a3e57f103bd2274083ec3b177bd53be9b3d1dc931be1a16393e40489cbe4cc4dc3d9665ff3b394fb23d5c848fbe415312bed04a03bfabd8663e3452013ea3198b3e863d2fbde15e3fbfc451463d2a712f3efe6584bedbce453f2327ccbe2fc3c3be9f65143f13c482bed1f2353faca680bec09ba6bdd82f023eef9479bda2e76e3e9806ea3c1946c1bd595eebbd8da5093d18b0433edae88dbdae6849bd864f8cbdfb4754bd358434be63193ebe551bb5bda4e5223ec66e173dd906a93da991363de279d7bc5bbd90bdbc80dd3d171f063c791430bebaa9243ef4caa2bd223f563d77af693ec66c9cbe53cedc3d35e7603ddd3ad23e15c9513c21643dbe3f81ce3d28f7f33ca17664bea49cdabdb5ad92bee7cc323bd1ad99bca95fe43c6c19e7bc3c43353e392b95ba87652dbee5f23a3d724101be6acec6bd7beddabd9c77823d749149bd85bd08be07a402be8043c43cd641b23c4f859f3dc55e2abe8356653e7258403e7d43f8bd7917753dd10501be93fc6ebe78f695bd3753823ab90b79bcf7424bbea4b941be5a750b3ed8a6583eabbab4bc119f89bc64f20a3ee98fcd3dabd0e83ed2a527be1a5a6abe525c8f3c89845abee4b2c7bdf8d24e3e44a2853ec4715c3e69f3133e37deaf3bc168fa3d4c8efebdbcf4823cb2d602be513cae3dde4a65be9d47ae3d336b37bd98c528bd96210cbc4a93dcbd8fefe9bd03c822be9032643e40abecbd89f430be825699bc3a8382bc4e004e3c162bc83c7af9173e09b92a3e927d58be13b8703cbb7146be5e5d1cbe9db82e3edd05993d76bff3bd8233cbbd6784153d17439f3e3c7fc4bd9d08d1bd8712e63eb15c46bec080743e682e04bebf0bdc3ce662833e37854bbe90ad03be6b1301bd33aed9bd56001cbd374b033d396b7fbd3116a5bd1c61083e6176a93d9054a83d8fd7fe3c487f2f3cb27bf73cba7eecbe88113c3e2066b13cc3fba3bdfb098b3c8e4835bd284c9b3da3bf0d3e10bf6f3e4c5da3bc93e2893d71d58ebd927a4e3dfddb1b3d3533fabdbc8eb2bd738182bdead02d3e402fe2bde4d7713d1a00eb3e876b13bed1c41b3ec92a143ec6579cbd64259abe007e58bdbc116c3ed09465be4d44debd0ba941bdc14b0d3e4e3281be78971d3e9c19a7bdeec9363eca99713e638438be18d5663d669d3a3e67b578bdaec4103dc0b4abbd170220bc19b9d8bde126cebd1433973d0b65263edf71263e05ce943d6bf088bee937893d8955483e5d23323ec107aabee87b59bef90bb03cceae25bd30aea93d1d724bbde7362dbd5f975bbdc84f703ee4038d3e7e48193dcba5733e019d703cd79cd0bdde81ad3d8c8751bd87d3d03cf2c5ccbe3f15b03e122998bda335c93d37a91d3ece416bbee6cf3d3ec69c623de414e2bc53a6c0bdf459e2bde584aabdad91293e7872453ec3f025be51b891be557363bb76fcdfbd10e8873e89c107bdbf1dbfbdde2b0ebe8428913dd10c853edb71303ea79282beb33a68bd37ce953d235f75bd5b84bcbdd5d766bea0281ebed40f99ba2aa8883e8717013e3cfca43e067b04be5a2d283d2b8c1cbed466ef3e8d4b80bea66da5bdbc0d18be804e973dd4c6a6be15578abd5a86fc3b81ce80bc061b723ed71bed3e2cc68ebe70d818be7b369dbdc451713e742a53bd3a93003f8b4b05bf481b183c33b930bc1a94c43e0fae21be514ddb3c9f6980be5fed083e1f58673c439669bec0fcc23ef5bba83dee3e4ebd2d258fbe6e94193e581b04beb4c9d03d83b0b6bd12e2a3bd6022e13bf55d14beb03cf2bde300b13dd3a4fcbd09eac73e3587493bc2b94bbd660e60bebbc91c3e9919093e6d7bec3d7b8e03bdc21ad7bdf6b7563e6128ecbcaaa167bee630c63d34c161beaedafb3d14700ebe5c07303d47a9cabd93b0853de305f03c4ad9af3d6f0f4abea18fc83dddf3ddbc7d7018becc91cfbc60da743e597b5dbc452accbdb3b2babd82b3833c6ef38d3e474cd7bd2a6dc4bd7d862d3d832f4fbdaac359be361ff13d715f593d057a17be234ddbbc1239bf3dfbdbcfbd2689c6bc04d34d3d22391ebc3201d93d11a4a43d1f2019be86a9933d0c62a83d2d9abebda7fabe3de60a8fbe9a2b20bc6d7b263e85193a3d450802bb02118dbdcd703ebe3ba2963be9fc53beecb2683d40e6263eba6821bee104cdbd53018c3dfaacabbd00077e3d108a85be10373bbedb5a1ebeddb9623e446b983e5077113e2a26dd3c270f41be4f56d5bde920e53d5736453efedff73d8a657e3b013e2bbd2f3203be79c0cf3be881febd19395cbd27b973bddcbc0a3d32218c3e2587ddbbed01c9bd5f01fbbc5e73cf3d337d8d3d4a60aebc2dce53bebf28243eeb3f013f20cfff3d7bf3ebbd95f766be1eec6bbc56a6ba3df2f81ebe573056be144ac3bd78aba1be479c213e48e00cbe6507e23d7d31493a8676333e7028933e153f253e5d823fbe1546aebd699182bebfcdcd3d76d6b5bdb6b0873c785f85bd09700c3e293b81bee8d5773ee685543ec90f33bd5e63843ecead353e1be4093ee689a3be1143ccbc274f7dbe27e869be0d4d963e0b2a22be923294bb4e81933d32b3a43ecc0e923dbf8b16bbc92cdbbdedc02c3e86ef75bafb788a3ee403dbbd38fa89be5a48bfbd0533b5be2a179abe8555b43e1ed687bde294a2bedd3369beb52b62bd8de0f33e514aa13ef3bdef3bd492c5be433acebd4c0d193e26c9fe3c1ee4ae3d6af7b73d197dcfbcd9adc8bdceaa853e0cd3493e703efbbb3ffbfc3e44873bbe24ffe33d3ee3b8bd42a92b3e20dc6ebe070660be78a94abee620f93df4048b3d4921143edf5a61be1f623ebdd18fa9bccda1a73a858a113e5d7580be29047d3ccfbcb03e9256b1befc30ab3cc6f19d3e5533703d00d03e3d38b4623e2e16febdb7239fbd962199bd98e7dbbd1f8498bd9fa21abd7f09833d923fe83da3d20cbe2e742a3ee658053db96edc3d5f4627bd5e1122bbe21b9d3e17632cbec66c91bee6f5b63eed2c1f3e02fe3a3eb8b0153eefa338be40e179be12fe89bdcfed153e051500bde2ffc1be71bcba3e6aaab43d809694bd17c48fbd0e5afe3b3d94dbbe3e71bcbd2c8dc83e2d879fbe5671ebbd121f753ee81fa73dc1e9bc3d7c5ea4bdf7f58abdf898a4befd8d583ee59d08bee4b570be5c8737bed558793d81af2fbd935a5e3ea93753be47e24d3e5862a53d057f653e6e2214bf6f0045bd296472be46abac3e8310123eaa0a983eb0fe89be00fd4f3d7c2d75bcaee10abeb967803c785d663c274f0a3f77c5d9be3abd84beff476d3d27fe863e8a9aa43d02a578be7503f73de21bb83d2987fa3e5c73373efca677bd76b22ebf4ecb86bef4860dbe65698f3ec54c0b3e4ea58e3ebe2e12beb49dbabe9cd12e3c563e3ebdeebae5bdb0246c3e85da8fbd1ea0803e7802f33dff36943e02a9a0be0953e63d6b3504bf1105b73efcd445be78d634bea13e44bd1efd1e3eb8b8bb3ecca2c9bdf0863fbdc7a9483ebfb208be574a5fbdbc4f0cbc88ac51be77e551be467d31bea16b083d01b570bd7e159fbbc64b42be7536f33d1b16babdf90ec13d28da103ea622623e184be23cde2e66bdc36f223e48dd13be4764283ea2a61cbe05102bbec2a02b3dd661bcbd6cfec33d08c9d7bc0ce034bd1e8d32bedb81913ea381f8be349f96be496b863e0e8ab4bdad745abeaac5e23e520acebd15efc93e4e160dbf1a06743d85fc1cbe5ea7083ea72ff23ea7153b3d033642be3be20b3faeccb2be64be003f071f88bea873a2bdff2ac5be4ed79c3ebeef2a3e837eca3ddfa916bc8fd0643dc5d8663edb6c103d9b845fbd442ea2bb098d07beeee3d0bde1e3fe3cf136f8bc3615adbd76621bbd85d2d4bdbf44c6bd3b98cfbd3fbfa53e388989be84cf4b3d569ed93d3f1daa3bf2de25beaf32ce3d9d655dbdb36657befec1f43d2907863e180d0bbe59f0023c92a2ba3e49c394be36d91a3e292efd3c1547ba3d62f9ecbe9af65ebeb736a7bb461d153e06905b3edcf9523ec49e10be06f3213e22cd0ebcbfebc8bd01c2a23daf030fbe31da7c3da86c893d7d4f8abccc67ca3d51e364bd74917b3cdee70a3e0e1900be33c504bd4c8f8b3d011d533de671b7bd361546be1c67243d0c27013e6752abbcbae01c3d116a89be83b92bbe1f64083e66f0473e1ad5ddbc546c60bc30ab183ea7c9e1bd240389beb3a42e3ec4e49ebe667005be98ee493d82ed22be2cf37fbc0bcd513d7e230f3e19c3d7bdb45817bedccc2cbe3b139dbd5242803e0ed444bb714336be955c483c94856bbd3a1ce2bdf58ed2bc3393933d8de8033e815edcbdedb71abdaa9711be68f16abc0d0fe6bd24c0be3e93fd55be74a70e3edce3debdb069533ed7be0bbe09b5a4bc2f595c3de13deb3d6b0973bde1c092bec30a4abe1eba843e5a3838bd8313043e0f4007bd6d0cd53d66edd6bd750db9bea4d4d0be4e6a083f591de2be6239f23eafba6c3e343bacbec513cf3e9aed21bed621c7bda3c667bd48c1acbd195092bd57ef1f3e4ae3393e5d2b2bbefeaac1bde763f7bdcc509a3cf78a263eb4ef8abd1fed6f3d5f4d30bd96eb113e440126be56183ebe74bd743d2920893e38b3e3bc19b106be8d55333e7c531abe3caa053e9fae2ebe079a9f3dcf0892be9a44fa3de8b3bdbdac810c3ee1db4fbe1539663ba188403eb663e93c4f741abc32f4b93c6246c9bdf0e738beb279ef3ec85126beff30ce3d6b1fa0bc823d91bd61822cbdac30f23bbc8f58bd0138edbd044301be1979753d4ba812beadefd5bd9e0d293d18ebef3d7fe8f5bd7340343ea68333be22f6833ec8292c3e95399dbcfbf944be194e17be2708173ec36772bed396dd3d9a46583d41f581be7cdec93e7b73f3bb0044f7bd53040ebef6f2c7bd0004473d3a4d30bee0da5b3d0d28893d4e9ab53c37f59fb9374403bd040674bd5b82883d9e251b3d128493bdfbb26dbcf6b0cabd1e776ebdef7a8ebd63e57fbd2444e0bdb3cb0b3e1ae9d93d780b2ebe50c944be724b9fbe619b88bd4e4a893e95943ebea59acb3e9411bf3ca43f6c3d917d5e3e6097853e4160883dbe37a63bf3fa02bfa96c14bdce48053e795d8e3eda37043de00ebfbe292e4e3cb52894be1755873ebaf543bed83b833da1d4df3e6784c0be498ff1bdadf58a3efa8fa03db077d9bd84956a3df992cdbc365605bd53a2c9bdf7a52fbdd110893d99f19d3c4a90043e1b9e06be1707d03def24ca3eed1661be4f43a9bea3d884be14e0d2bc8f2f40be699a243da984043f814304bd7795073df9cf87bd7936bd3e82efb03d019d5ebe5bb7a7be7442503e8a8f2a3dc4d418bd1c47833e82a885be0356983e70be07be0e89b23e78d5ccbe656bc3bc258d1c3ef082b3be0591cd3e263ab9bb9efb82be14f5fbbc3984f8bdebd410beb414723d7099b2bd408fb93d35d5143c2f0dd53b8c89c23bbcdc08bcdc2236be9066e63eb9fd1ebee7c957be6760883d753f263ee64285bd55e3b63af7463dbef2fce6bd3df7cdbd5804c93d6a214dbe271eb63b334eba3ea76fe63db95cedbe279c7b3d2755bfbe7fd3043ffae0033e7714f2bd2c580ebe9fce543e5f4d8bbe812e8a3ea82c63be82be703e13c315bd9ee7f93d420c506172616d657465723139332a9a64081008080805080510012280640ae346bd5c65babdaf37d7bb317c03be1507df3dcf86ac3d486e2cbe83eb8abe4ddb9bbc88d98d3d9cd1223d1aee40bc316981bd077b1abefb48e6bd3f198f3d8987493a89b7aa3d456439be2ab3f2bd458e5d3b81aa803e1943463ef7535fbd353703bedd1cd9be468f8abe8cd684be21f7a53ded29b43d8f001f3c3cef6abe231b83bd78bbb23ca5474bbda6882d3e0444713efb359fbc19460abe44582fbd3e4287bd029b3e3e55d7393ef95c14bef69cf63c3a340fbe6fa9e83d6d23d73db218523d03b26c3d67c91ebedf3109beec82a13d5095ee3d728d0abe9b04ffbdf21c54be8dd011befcb97bbd90b3adbd75fb41be6aec61becbc35dbe1887b1bda4ed843dadc284be8bdbd4bd097baabe9fe109be2b9f01bd78b2e73ced6bb73d08a7debd00f03fbe012e65bed851d33d67fe42bd1914d9bc3c14b0bc4e1deb3c6107443d7f51cbba3eb5d43d464cb4bdbefc60bd8c1b9d3d3267d83c03fb83bee6ab91be22a155beaf90923c1edd8a3d3cb80cbdfaf49bbeedac01be68ce2abc847af03d10f72d3e285789bd197e613dfe08333e042c86bd6d510ebecd029ebef705d6bd0a79bd3d2294993ed6667a3d8f4365bed9f75ebe3c97b1bd83780d3da082f93dd9dc12beb3ba10be60b5d8be630311bdbdca593d6827c63c96a783bc1e99f6bd558126be9f22c6bd5f06123dbd925d3ccc4e133e5f7ca13c6fa2acbeff8264be31eb25be987f2b3edf70e73ef81f893ebeadffbd197e5fbecdbd18bee2bb9bbd50d7833ec3b0d23d7f4f853d9282d7be69749fbecf8413bd07ab3f3d4985ea3d390f5abd566d0bbefd5d88be5a2e5abeefbffdbcdb9a5e3dcf9e2ebe2f5b94be9fa729bd358f7cbe0d5fcb3d52ee473e180dc9bd927d8abe175d19beba41afbd2f95013b88885d3d7a7a3f3dc1f124bedab4be3c5991853d8bd47b3e4160783d703a523c4bf9c1bd29b4d8bdc9d86a3eef34513ed31bb8bd297b7dbe95bb133e4fd2543d1940c4bc5fcdcc3d88f869bdbe589bbd524c6bbd3c90513df452b13de4147f3d1c351ebe9be30fbe749ea53c1a69e23c2423d0bd805eeb3cd41403be947268be6f9d89be4e70083effe29f3dfbd4fcbd19e314be120e31becc69993d42e05b3ec4da98bc1a583ebc538d21bed4f220bd10f66abca8210fbd08d00c3e02e5803e4327333d860bc9bee08d9fbd6593193e4721533e6c5010be8cc745be839a31bd73c8b83d47485e3e0f09acbddf144fbe9eb906be838accbd2e47e1baf127bcbe86c79ebe632fd3bef5af04bdbabf13bedd6faabd9fee84bdb82288be5fe871bd558bd1bd38ed143db76a0c3ec28719bd4222bfbdbe15e23b97daa53c886e6b3ed4bf13bcd3482fbe28bc38be12ccbd3c3cbc1dbe441856bccefd07bdcf84aebdac3f63be781781bec1283dbee34b66bde799c33dce58d4bd33db2dbe9b2321be3dd9ee3a3f46c83bf293c4bbd10e563e6ddd823d145c293e48a28d3e667d6bbd6536b23d9346173e3dba0b3e23481cbccbe2023ed9cf90bce2879fbd57fa05bdac441bbe92af0b3e1946f63c986292bd772321be3e8fa3bd9a23c73cd69bd73b1f000ebe3750e83d1724733e245989bdb45002be1279c6bcbbe45e3eb34a763eb6ae69be09740cbc23e348bec7e4b6bd39b736be99e84bbe75729ebe86b3e2bdc66af4bd05c42a3d2b1a3c3ce587b9bd855c25be867e25be79c1bfbdd544cf3de8186c3e2310ab3eac8922be6946e5bcd5ee1b3ebbd4073d0ef7503e7859dc3d9c38023e848ad83c4ef93dbe395c5cbe87121bbe290847be413cd0bd2ada88bddbf339bedddf66beabde7ebd706557be3971b2bd7ad806becaf0f3bd5f2b19befeadcc3dd0d4f43d5cec693ebb2eeabcff24353d404c213e6c2dbc3d00e7683eaba5b2bcf749443e3aeb963d9566483ddc9920bd91ba40bd00696abe550814bdabae293d4cf99ebde7b185be7cc7babdb91331be3b1074bed5aed53d6075ffbc29ec82bb86554cbdffba0b3ee0735e3e567d4dbdd1f02bbd4deb81bd8f218dbdd1ef0b3c0574793e2f3a0d3eebbd36bc0b5c12becb60e43dcfc7953d24cab3bd7d2d493d1b8d3fbdf10940befc632abee31050bde294adbd8dc2db3c2a23b1bd8cf43ebe6837f13b6fa70bbe1fea76bebd138dbe8c1cd9bda92957ba3d8d9ebda79de63ddae7c83d874622bd2221033ede3eb33d97748a3e7a8c4f3e6480543ef404233ddcdc18be04a8bfbd73e1dcbd686247be6da68abe507020bed215dabc4cb8c63d965a0ebc615277bcd2f237be1c0f70bd6c03a2bd88f961be8559dc3d834402bf74ac9ebe73d611bed807643c624808bd84907abdfb7269be33f52cbe4765f0bd375ababdf006853dac4671becc3689bcac60ef3c67b5563e2c732fbe22b4a03ea768633ed51973be08de2ebe8c3a5fbee0414b3e0bfb2c3e4e2d7c3d155b2fbdc06989be92cc873da175953ed2cc193d9b592b3e63cfa5be578a84be5ab794bd9e1348be761b913d91679d3c487595bd8a6d61bd904bd8bc468040be2a40be3d9ed641bce9ac3cbe3de8f8bc8c04a6bdd44bf23db9130b3df53b1bbe6539ffbd1041b83e95929b3ee79c233e9679f03d8b03323e29745e3e46b5c9bc907d54bdd0aba4bc50ffd93dfa76ecbd0ef0d13d2e1682bd3d9beebd0dbc08be07eb94bd581ca03dab05a13c2e7cd93dc054a93d0b131e3e9b1197be9dba44be50ae95bd1fc5433d17ad4e3e47d262be4e5592be52c9c9be7d3104be2b598cbd2b2e823ed38fc73d55966fbdda9f0cbee98381beeada873edbe5393deaf87e3d23dd373e1077333e364eb53dc058bd3cc8bd9dbdf9ee9f3dcfb93ebd008cacbd5a5784bd4f8800bef622acbd40b8683c7c0e113de49728beda807abe3b23bdbec7d538bef3bb0e3e85c1d23d3dbfccbd7c171fbebf8ecdbeb114a43d6750ee3ddefc473d0ce2533e907ed63d730f98bb812a773b285a41be4277bb3d82a3b5bd093e3ebda49d25bed24e1dbdaa3347bd138854bd74fc863d0fccb33c7ca302be344946bead488abe5e4cc13daac3683ed84cc33d0bcd26bd21a373be3f6b0fbe693a243df8f15b3ee82f8e3d2efc9b3edf6b8abd962377bd446a63bc94a7643e63a9f63dcd0380bdca319fbd8bd18f3bbd4287bd02089abe1a100ebe1c3662be5f3225be72598bbed16491beb9ce5cbe3d0a97bdcea648be00e58bbe316886be56c43ebebedb663e2484ad3c4aec543a1e45373c8cce863d53f909bd147653be148b52be047154be4276a2bcc8e04e3d0e8a9a3baa144ebdbee2713ea0f383bd03035b3d62be893ee5f6b03ef964513e6dbdd4be210d7cbe0bffd5bd148737bdc2a0dc3cb650b23d77cc65be067e6abe9d43d53b081794bcf538ac3e213b533db3a3d1bd8cd66cbdfe1924be93e81ebc903f56bebcecb23dac43cabd53cf0bbee54950bd1a4f23be6166a63d28f26f3d1aaf67bd24b23dbc0ebc00be175d1d3ea7ec10bdec80a7bc83a929bec573a9be9b9865be290e953c9f6369bebc018e3d988cff3dcb5afe3dac9e4dbd551dbe3a68c0c73dcbe1853e67f62d3d1cedbbbd3536883e4054453c3107823df95d953e6bd856be28dba5bdf3181bbed4bb8a3c8907d73c1d5093be055e1fbef052edbd3eec29bed11547bd2f50bbbde951afbe80eea8bdc3e915be99bf7c3da89283bdabb1d73d2984053dae7624bdda6a2bbdc0ed15bebd773e3dbc3044be2612c7bd993edbbcbfb60ebc84d83bbeda10053d87da603d3575673d7253b93d872a95bdb6ff263df807913cc1c5bd3c18ecae3d6810963d4d4f973db587493eef11083e981ca6bd7183bcbd1c8dadbc8208853d2960883c6eb84cbea0b6c8bec1a35a3d5ce1173eaf8082bcd2c73fbd362d40be32d81ebd27c4c4bd693477bedefde1bd0ea3ffbd1bd746bed83358beb801b7bd1db9e5bdef834abee3b5e9bd631a74bd852dca3d52b047bbd63fc23d9f668dbe84708dbe9df1db3dabe92a3e0b081fbe9ac8cdbd691567bdb1752dbe0085e23dd0c303be1c1e69be7c3cc5bd78bdd0bdd1f4d1bd2b6fbabda650cabdc5a801bef7a78fbdcf8709bd91da50beada50ebe6f2a66bec420abbd7274c33c7bba243ef8a821beb81372be68133fbec7dea93dc4e1fc3b077742beb2dc16bd389211beaaeb3bbda043173dc9df90be5c7d29be7ef63dbe54916bbeab8e36bdc72954be191e7fbdcbc4d9bca3f6b9bdb3ec90bc04e95abe81072ebe36ea4ebd8674243e637ad6bd9dbc3cbe596ea7bd969fc53cd9e9a13e1deca8bc6dcb17bd573c82bca7dc8e3d81e9d03e46d1443ec5ba1bbeb2f8a4bd057e423eabdb823ed9a8b93b863982bd20a0c0bca2bde93cdf26ddbd038aa0bdb9e7e23b5476f5bc4c80503e0a01d33de75f7b3d3cebd8bdce149d3d2de9883a37d2443e39526f3d9e2d56beacc9e2bd484e1b3e581c18bdc2e75dbd4b8366bd3a3b2d3e9008313ee12d93bd0a8c1ebe7245c73de9adb0bd1aa41a3d45b6f8bd97a334becf5e19bdd12bf8bd0b4d85bdbbef3dbcdc723ebe5dc5333e8688693e496de63d0603ab3d6cd0f6bdd5f32f3edea35a3e023f603dcf55833ef9e538bda2209dbd7c03f1bc2508c33e8a3ef03d9abb813c139437be4b2290bc790ed73de950e73bb04a75bda59b92bb52cb0fbeb5cb88bdbb2f47be644f44bd11b9663c568c59bd1f94c73d5fba3a3eca758b3e36d5173ecb2fdfbdd81fc9bb603f6e3c0715ef3c00ac2dbd9e3315be9bbc87be02734fbec2656dbe220e443e06b9083e23b31bbe869c61bee25296be84d993bde76e56bd4350903d6e1a2b3e39ef263e76b639bdaf5629be3c3521be3b9bb0bdd7960fbc79c185bd4dd7efbd760394be3bc311bea73b8fbdb44e96bdce99403d65c4903d91c03e3ca58bc83ac02f893e935bd43ebbeca93e1d76593defe9babd887dbabd71eba4bd56d19ebd9ed51bbe2a388ebdfa8d23be171b903c5e6b893cb883d5bdcb6a1abe00ad0abed81461bc0e2bdfbcdaf7f83dc8fe4abef05bd5bc8605d23cfdcd71bda0ff663bd24ec1bd5ad505be84a471bea7e0dcbdc30d89be09478fbdf95bde3c061e963e8b20783e0667e83d9fc6c23d7c4f94bbcb808d3d333cf23c18f506bd6459abbdd61620bd4b20143d663f76bd50fdaf3d417e8dbdafc01a3d16abe73dd12c95bb009d54bd011187bdaed71dbd640a92bc9bcd5dbe488a87be75cf6fbee1610dbde778c83d6b4d3b3ee918243e42337b3e8042333df6174a3e32d9963d4795653e93dc75bd40db8bbcc13fc6bd099cc3bd2811c53b369d00beeb39c63dca68243e3382c2bdfea787be2fe350bebb75613c1e461c3df1e2bfbd2a0721beca3092bdce3fdbbddce708bd071f183df8ddb8bd4890acbd71de00becac61abe1a6ee43baf65553ddad6aa3c103ee63de352d4bd602c193dd34e873d8ac0de3c1c31623c052ce3bdc2fd6cbe2dc23b3de388a83dfbda66bedb00d2bd9923dfbd0266c8bdaa82fbbca5a5413e22de353dc18b9abc4f880abe33402fbe7c04393e5556dd3d27ce82bc00600bbe681d5fbe75daf2bd551fb8bd481403be1fd175bd33a4bebdbbd428beac7f8dbd54fd663d4f80a83dbae701beeafc9d3da73aa73e1b09233e9daa25bdc0e200bebd39863ebff4a33e2773ef3d03be973e8cd4d23e45d382bd693ec53d4ec2d0bd8f1094bd20af913c0efbf9bdaaf58c3dc7fba4be8a11e5be4f4359bea08133bd378152be64314ebec8c567be5a6aa6be90d73dbd06fa1cbe40e035bef04bb6bd03ffa6bed6eed83de21a963ec7d3bc3d4402dcbd4f35efbd701ce53d547d243e32ab433e03d38abc9212babdb6060e3c8546b4bd2b6a623ed4d7a23ef0f30dbe54af773d979c243c926a663df903653ead9f273dba4984bb1be3493a067a8f3e1273f43c974c0bbdb16f52bebb315dbe7cced2be773e4abe4c965dbe030b06be25f463be4e6e81be655389bdeeef03be3ac8e53c4610893d0cb6a9bc7a7eafbd4e212a3e16000b3ec21e553d0dbf1abec5ce33be0b21513e38c763bdb4e41ebeb55181be90b6363dd650293e83969f3e13843a3ca541763da4741bbe4e02e03cfc2e3dbd5376cbbd3d33b93d15b5fabd35dd66bd4b46cabd5779e6bc97ccc6bd5391ebbb083638bec51c83bd4e87debc54b58abe3f7a38be9217bebe4ef57b3c8f0361bebabf93bc78651dbe5e812abe5bbf03bef28d8abe040f28bd5f64223ef263e53d6bf4a43d348249beb0ffb5beaec10b3e515e5f3eb055f73cb1933abc54f168be763b81bc48422d3ee7611d3e8de5803d1a3420be9217503c659d0f3db779d3bc43bac5bcbc9b39bcacf4253d5eabff3b2ed4d93de5e22abe13ddafbe6dc5a2bd082688bd2f6bc1bb10232abe5ee0bebebf845fbe4e07fa3d05ab923da0ffeebd766885bef245e4bd9ce2ab3e3805c33dde38be3d0f6fb2ba87c93c3dce72de3d26cf8cbdd111923d68c31f3d947a83bc41b620bd01981ebe29a4ff3db79a563ece4309bcb239853c63f4073e221f893d9b1a12beca10453d15dd223edf572b3e5920f1bd077510be87748dbdcc82fc3d8f7acdbd085007bd771c92bd564951bd2d5f5cbe4b7d21be63c8ef3d3bb72939a9db163eed9e6cbc1bc79d3d170206bc23d5c2bd85ecabbce2fbfc3d2b5c053e80569e3ddc3bb63d5daa5c3d029d4a3d1c3b53bda0ab243d0e98763d3c1ea43d60bf4c3e71fc3c3e0ca381bd537178bce0b7ca3d791c4f3eb2eac2bd420124beb12c6cbea97a8bbdb3d69bbd16d99b3ddef8323de37276bd88295dbe881a1dbeab354b3d37ce613c34d00dbecd6c003e4860bb3dbd78adbd387399bd788fbe3c14e4923ef77d943edad5c9bd2320cbbd4d4b453ec77e7cbca5e78c3df13f36befb51653c9efc18bcc0dacebe651cbabe3302c93c52a6efbdac9049be6e9e78be970197be4185c3bd72fd98befb2e56bed23084bd9189bfbd35c405be93189ebd1f1c7ebc1e6208be54f5cd3d86a33cbe833aef3d3b380e3e2f2906be6479aa3cee8a433cacc3883cd27cfcbd588731be25d4da3dcc3d53bed94127bb474da4bd7f6582bc63405f3ef7a84abe43602bbec62383bd043502be355c073ed23619be4fe7d8bdc24586bdcbc5c43dfa42e13e8e72ecbdd5f043beca7b29be522c05be81c372bd282352be27d299be39e00fbe7edf523cf69a253ea165673de6505dbe3c1f12becb4f46bd0315853d5b77cbbc7d9756bec1f807be7539553eeca9983e7cabcabe6f6ca13a337c243efccb183e781230be768e65bec5b0fabd8ef6fb3c22fbaebd8fe875be712d54be163de7bd164d9fbd2884fbbe7c7a85bee876c03daf4877bd281330be063cc2bdcd52713e40f0f43ce2f508be7a2defbd2073823d418d463ee946953c8e6ae6bdfd6fb8bd86c074bb6a0c2abd70bce23ca95089bdf455ddbd0a16953db7ddc439ecbe0c3e5542a3bd94b54d3dfbb498bda2a0143d98c5893df0bca03cdab2e6bb621d21bbee18163e9d96b8bdfef18cbc5ade42bbe695263dbb76083e044045bee5c01d3d659a9b3da77f1fbdb38b503ebb965fbde2fb07be64dc2ebef726aa3d543e133d5f1e073ee0ef673d017c17bed1a752bd5b12cc3c3681c23d1ea4b33d81ef3cbe94a8a7be6e7730be59b87f3efffae33d9662fabd188288bea4cd63bdc546ad3e520030bc3fca0abe392fbfbc036522be971a083ebe972abe5e16163db101ba3ed94fadbbeefeb6bd8adb2bbe06b8d43e0a10ac3d31e8b3bb8fe830beacf635beea3482be497244bead125cbea5cdf83c89279dbe910517bef51527beeba5b9bcc8b922beafa2b0be48ca873c4ecc823e68d1d63e600235be0bdd26be720e193e71bc4e3d3fc22d3d3d16a7bea73ca2bcb7cdb03d68d4383cd6c431bdcba0d53cf4e5bc3d2ad00abc3894bbbcb006e0bdcc8e433da3cbb03da521b2bda9f4d3bdedd272be7325793c80d69b3ee1ed073d22c42bbe20f3dc3d7153123e1121223e9113d0bdcd1e673e9f569c3d5250113d166213bc88c67a3e2386323d19e3073e546eeebdf65a403dbda400be0c9605bee199843e99c2153eacde643ced2d39be603afbbd6ae45d3e4590053ea0e67dbec6d39ebd1cafd83d91d1b03e6ff51b3eb3b638bed53a9c3d97cb25bdeb94a13e6e4a71be5b46cabd3b2daabc25c0033eff6eff3b480f64bd1bad26bd4d47943cddb39b3db6f017bd8d6a46be9f408cbe2938703d71a0a23bc00dc7bdd06449be82a99dbd18e7623d330e15bdb14183be8724123e59d28b3d25c00cbd4bf85cbe15464dbe637b323e038221bcbc3f31bef2f6813c978d0ebdd718963d92cc173e0007673eea2ac03dc5b9cb3c4a94d63cd66e403daec1343c686ce8bd653a053e4c01f23ce65da73dd57d34be9bdb82be7d12cd3d4e26e7bd5d3569be135983be0d044a3e011e983e8f7b0abec55b2ebe965b3dbe9fa7723dcc74a93d826efabdb90bf03db00e7a3ebdd7ad3e7bb824bce6ab52be030de1bd160283bc46beb0bd391860be3ae69cbaa374c6bd087692bed74681be751297bec68e4bbea31b7dbeb2ed84beaa03d9bded711bbeeed807be6cfdb1be66d8b4be84b0dcbc520639bd3efb093eb52e863dac48f03dfa943c3e9f6e513ed4541fbe57640dbec2a83dbd9d8b823d973d4a3d372939bee90e78bd43906abe5b88e3bd4b6d8abe9489aabdd8d436bea6db8cbe83eb31be41b36bbd54e282becc5cb0be0308aabe769707be43591abe9ed73bbde39738be9d26a0bcf10dbe3d80729e3ca2e657be3045bb3c454d09bd183d0fbef5798ebd7a8333be5316043e05ebc23dd24e2dbb318e0ebe2c53c7bdf5c4183e3dc39f3d2d6282bd30ca00bd033d4dbea2fb7e3d4d7c1dbee9550f3eb48e123d091891be8cd7a03d6364063daadb993c4195fcbd0f2898bd2da62a3edba3353e6d131a3e515637bea930963dad73113e687b23bc25b65abe1e9948bd08a9413e357a03bae3ac78bebf2115be2f5c08bddeaed83d3685a1be91a31abe1001533bc8a5173ebd8265be1e8d81bd9bb959be784b2e3d92e4ba3d15422cbe50eae7bbbbe799bed35d72be5e5b41be6f137dbd807d853d616e9fbe9f332bbe637265be2b89c0bd636bc1bd47fc533e3f5c083ff1cdd23db5220ebca7e0633e7d59c53e0c7f813da9f53f3d6e4f75be3aa3183e8886843d7a843d3e13a4b33dcb028dbc28bed9bdc34e153e70f5933e6cf9df3d24a2debcbc2aacbcf97188bd80ea6e3e39fc1a3e02e440be548c8ebcb4ebd83df7438abe6734a5bd6b34d83d3a9c36bdb28185be1dce3abed7c1df3dbc8c25be9064353da573cf3d2021c43d84234bbc31fce2bd7b4d7abdb88e9b3cf484c4bd3d74bebebe18f73d5c5f213eab983e3e09d753be5f9b4cbe8c7b4f3e051ddb3d90e314be3a3b8abe909d3bbe08b29bbdbd88d3bdbcc599be58a279be61871dbef9b15cbe57961e3c18b3433dacd11cbc25f617bea09d32bedec651bdbef5ea3cd00f1bbceefb33be9a43b8bd6db2cbbdbd98a4bc022a83bda8c65dbbb11043be4803f13bc703553da174403e99a3c03e0c2e063eb9236c3e72918c3e6a10443ea9f19cbdfefea8bc82e9d23de177dbbb9a7bdebccc0c933e8a0f16bd9d03663e2bc23a3ee8b823be8b19863dec42d6bd16843ebe4f8b95bda95a2fbda4a0ab3d05aea5beb982c53db18a05be60ef2e3da7cc10beccab60bdc0f188bd8ba232bd0a243cbcb0bce0bde496a7bce1ff9cba6011cabc510299bdc6aca03e18c5d2bc771b313e89232d3e89325f3d7f4a6f3e8a84523d1a3da7bdd78ca1bb8ccbd5bd066fbabd3b8405be2233ca3c1113be3db29db7bd7d8b5ebec9b5f2bd2539ab3de30414be0e6a99be077071bd011c543e390e01bc6a521e3e8c11093c5c1d903dad73dbbd269c47bd3c5f85bc0f31eb3d54f5403d0bb4b2bdbb157dbee705a1be73e959be59d388bc04c4d5be6102aabe000df2be9200e1be689c94bef228b0beb83dbcbec965a5be455dd2bd250bf13df6344bbe976ab9bd882269bcea90a6bddd6311bdef25c3bd4b7166bd002ab13d250810be4921d4bdd15f1b3e3e18263e6037d3bda033b0bde9054bbed34dcabc05f386bde5354d3d730cd33dd2371f3eb83b43be1fd2d3bdfca1163e9cfaca3df551d53c224074be7f72b4bcf76f8ebe8a571abe896f273ed504b93d2618613d799959be1acc333d8d6c5f3e5bdf0f3e6015403b2a59d8bdbc4b043ef280343c12eb753e3025aabe7163b8bd51b115be1e305fbeab8d963ca28accbd8396bbbeeda8d5be4854eebd9042abbc5e4ef33dedb4333ea642203dc11c39be0bbcc63b613881bd8f8cf23db672d33e1f70dfbd3edbd23d0cef21bebc69113e139a983e39b2b83ca50f1cbee6f2a0bb9943053ed5dfe63ee8f7933da97f05be3d8109be5a6b633ba943543e6df6153ce013d03d089491bca685d2bdb55387bd8b54b1bd85f9f93df992453e1317d4bcf9d096bc49b734bea11bacbda854f1bc233c47be1122fdbd4dc8b9beefcfeabda35bd1bd1909bebd8f2b193e003a1cbe235668bef72516bef11d19be5d7acc3df07c953c0799703ed436dd3d8c760cbdae7455bd57928dbd00fd0a3e87ab283e827646be48a3f13d7eddb3bdc97e3f3dee711ebedd9bf7bd7eeaa13cd49c28be6920033db48a92bea40983be62cfa63c560febbd7bd253bd354955beced34cbd8f3789bd303b86bebb93243d650f37beba03c4bd81e9c6bd37ca84bd2e01503db09ca53dada110be7a3e17be0a3dd93d47ebedbdafc3c2bd8e868abea8d0efbc7d26303e59f3b6bde7f3eebdde7116be6a177dbcbadabe3ea34bd9bd1cbe95bdb2cd5dbc0547c33c5e8f0e3e4361b63d3b7b57bbe3999ebe49b74ebee25601be7366ea3d518cf23cfc355abd660c8ebea56d48bdf925b4bd1c9fd7bddbdf95bd81a556bec0a219be49cd3f3ca13207bea9bb0fbedff20fbefe39ed3d11b1f8bcf4b138be7f1fd1bdffa3833db6323e3e324950be13fd63be8cd9b4be612535bed0117a3e44e8c6bd5aed5bbcfaf255bdf18481bd3d41953ee4f61bbd681a233e3a402a3cdb1a903d222fa43e7000d13d16da943e0a8e153ea81a233ec3f2bb3e1898403e192e903de1b8c73d4c70acbd8ecf913cd897c23d090c64bdbd78ba3dd4bd083d9e6b333d1b4d43bd7a0b5e3eed7f7bbc3e4513be4f33993c4789f83dd450323d176b84bb8c7180bbb6f93fbed58a9c3d244f5fbe3616ffbd9b71333edd1a38be138105bd95b6a5bec14959be38322abe0707863b4291783d8528a03dde0717bd54a067bc8216ddbd6b64dc3d19f7193e91be22bea633c4bddb7e8fbd690548bdd81d02be722cca3ca8c6de3c5d7ef7bcada757bedbb0d83c14cb093e45c4ec3dd81547bd48cf183ddd25893e3541d03dec1c1e3ea98aaa3e6a269c3cdf948dbd5dd2b6bd579c0dbe54ac4bbddfbd8a3d4d531abefa5aa7bbe4e4813c8a5134bd4864d43d92e96cbe7ff3c7bdb71d98bd9eb7723d9d39383e2652a7bc9c7e553d65049d3d80069bbdd442fb3dcf5b3c3d82c2e53d9ca5283ee2764ebbf653afbd478e2fbe61e639bec2c14cbed2a5e1bca01ad6bd7e2f21beea79a0bd80005cbd9f38903c2a6a38bdf6b9d0bc2c6f7bbd8c6dae3cac7e863d5c2103be8b2f9e3d3d6e293e19f3143d5aaf6bbef152113e9aac693ec22da33e2d903fbeca41c8be89c798b9a3104dbd4929ebbd89f7f8bd49e5fd3d01e59d3b630622bd96e32ebdaa3a903dc17633bcb53c6f3d02f2c5bc951eb33d412fee3c03c8bf3d09fba6bd9446c63cadb15bbd600891bdff2f73bd428c77be682f0dbeade581bee293d4bd8462b93d082ce0bbd5fd3fbe5c3262be41febbbdfce06ebb910d4dbee32d04befddbc1bdbdb5273bea191d3ccb04493d031e853e407e003dcfa08abdcd2a6bbd6279423e375c513c9f3509bed8f34dbe8995e1bde95623be0e144dbda1817dbeda3327bedd3e723dc73844bdc53a9fbc06732dbe417ab93bb1ed9abd63252cbe6480b4bdfd072abe7be4e1bd6e291bbd20422c3e27ff583e9a1f6d3d58650ebd43a7d2bd22d7da3d65fb3f3d490744bd97b843be9e5df0bd0ff343bef93305beeb4325be87688cbe1776e9bdb5b716bbc5c809bdc8832cbc025d25be78e609bd5d9e493c5680023d0999e73d985d98bd8d2510bdacc6e2bcce040c3eeba182bbb3aff5bdead14e3b1d174b3d5d3c0cbd307983bd5afccbbda63da2bd927dccbd3699babcfa8d063dd4519dbd599a813d02adbdbdba3f6fbec01134be5272f8bdd70ff23d345fce380f332dbecea012be4942b6bdd357bfbd2462b9bd26c099bdd897a4bd8beac4bcf07ee7bc772e9f3cd06c433e852e513ecd64963a8877efbdad31713e3356623edc62b33d7fd081be9141a3bdac5e75be72fd0e3eaa5f6a3eac7335be045783bdf46530be01c246bd05b900be101e9dbd0ffb89bdad33f9bdd2a777bd676f993d065aabbd300a24be873cc63d5241d63cfc28edbcfd8be63d8b34ad3c4b72713ec5870d3e814030be5c4d833ef0e9193e37b71dbec315a8bb66d8d6bd95bf013de95403be569d833c60f9ccbddd46273dfbe7ae3da66781bef56e9a3c9e1c70bbea99a9bc53181abd9fbcb73da81df6bd74f88bbdce8e9bbdf005da3bc05aff3dcf5101bd55958ebed4f1b43dcd00bf3d2494533db9c5513e98e2923e5e91283d7ba72dbe59c4b53cefc20dbde05c9f3d952ff63c48f3f0bd791c05beb1f50f3d1c987e3d84f2003e675bd4bdd99473be21ff063c0f93743d783d493ed852743ca2c252bdf1f6073c7fa9c43c83201dbeecd268bee1d932beee4bb2bd96d5a7bd81cdcd3c23cc4bbe2d109fbed95e86be7f3855be369701be7ffac0bc94921fbec0bb16bedab8d1bdb07ed03d6d2f233dd2ff283e339062bd225d21bda67be33dd8656f3de12cca3e6d11153d2082d03c1253063e61c6d13e5be4f03e67f8f5bbf815df3cc159c63ca521dbbcb37f02be9bc3dd3b47a3c33d91f6783dc2d4b2bdb113e53c6119dfbd9b5fa53d01fd5b3c4da41a3dd0017c3e7fa7bfb736e9acbdeef759bd406d7ebdb438ba3d88ea183cc6902d3d8c6924bec16f2cbc363756bdf2ae313ead794d3d7e13cebd4f1d4cbc0b34493d27e51ebeae64633d3874c93d142007be8123d63c8032a83c79fc963d7b32fc3de2ee26bd552bfc3dd1a5903c2348c0bded0f303de5681a3d5246dabdd8b770bc09a7ea3cfb969eba32920bbe209dbdbec2560f3e0e6e92bdb63a443e525c583e329df3bb7029b33d5ada0f3d4a148c3c5998683c394f283d6fa872bd079a5dbcb501ccbdf4da09bebd3b5bbdaacc573dad650cbe8293f9bdf42102be78f701be46e0de3d74b5b93de81770bd249d99bd784bd5bda505593e04ce583ee2aa8c3d231982bec8ec24bee43b8d3c88fd2f3deab7dd3d0fcf26bef76e7fbe0e79a43a92ebbbbd6d6091bda281cfbdf9bb59becb4a6b3d31b8633cc1f257baaad606be9ba05dbe9952da3ca06d23bd487056bea38afbbdff06d03cdc4d1b3d5eb1f03d3fb3f5bd53252ebed27cc7bdc7fd503e4fec413e2c432abd8fce3f3dc46560bd9e0d9abda009a3bdfd6cdebd909d05beba419cbc5a7b55bee40a01becc4154bd473d09be3b1083bec6fc41bdfa881e3d8da125be8fed41be146673be470dc03d5384013d6f85303ea9eb1a3eceb9883d3b2f8e3c25707ebe0b8f8d3dced9a93d16c3153ebd00183e65b92fbe825ec1bd6acf4d3b9edc403d2974183d6c7bb6bdb316063d4b7c31be96f8ffbd2fe7f53d3d6b13bca2b2bd3b54a853beaea8903dfe5a96bb5f7cacbdbe23443d1f70593c39f0283d69119fbd85c4353d5ae29d3dd48681bbd964373c38626c3e3b5f103d440b12be469cc9bb8277e23d03a2233e5f37b3bde4024bbe6f414bbd725ec5bae6791dbd34e820bda964903c974a553b4f103fbea7cd843e5662f63b936073be28bc53beaea2493d9754e93d240819beae0193bec0463dbef08ed7bc0a5266be54420ebe722a53beb4600ebe8b64a3bd184342beb5df09bed60b15bea16967bddea216bef760443dcf7e6e3dacabacbc29a0833c7e7a3e3ed2395c3d27408a3c6362dcbd06c51b3b99472abe2506e3bc806493bdbdc315be38b24bbef291213c6649ffbc52d4acbd474269bd5523f93c10e116be5d5c7abc59f9313da1fbcabd00a9893d2b730cbeb547a0bd2375793d04f0f23c5a95a53d49d3603eaa50ff3b1ff534be09061bbc9b365bbc0a0f6ebd9e7a5fbeaa9b35bd8e1b0bbdad7135be8940883b71ee81bddb2fc33d220c74bd14862fbd93ea03bd548b8fbc7c1e5f3c2e6f423de35b37bd0d9609be9d0f2fbd43d207bdb87128bd6157f03ce591763e83654ebe6e7184bbf0d51d3e639e36beaa1340bb112b75bc8f66463e39960e3d7f2186bd3625563dd3e9803eef941f3e0620e4bd3a518dbdd1bf03beaaab8abd89f362beee5998bdbf11fa3c37f24fbe4aef63beb79cecbdf1b9dfbd7136373e9116463e01e9963d3372663e9f5a84bde767d03cb014a63dee6d843ecc870a3ec38202bc5799483c0678cf3d0c39703e3b3fc7bddadd86be409594bd58737c3d205cc3bd2cfa40be589eedbdc1661bbec2c49dbd5962b7bd9593943c24dcc8bcfeb3cebd44ad56be8011bf3d6e421fbd5a6754be402a48be618734be332af0bd06ed253ee0ab37bef82563be57666a3deebe92bde3dbd43b1503513e9191103f6f524c3e878807be4f94943e29ee893e57a9a03e4fb4ee3dc0fbd43d08bda13d793a853e785e253eb5b348bda1dfbbbd232767bd3c77febd296d86bec7c50fbe0c2c083dd3797abd0390213cbf2b723e88624bbeb157893dc977033ddcfca53ea70d1a3ef46890bc07754c3e16e333be1469203e17e1edbdbe0f2fbeac295f3b0964e8bdd32a013dea6c08bef5dd56be9a9e053cb30a96bc559e14bdabc416be21b365bec30af93dd86cc03d1ebf1b3d76a293bdf4139bbec121c03d4368043ea31cf4bd2ef150be8d35cdbd3250aa3d6f8a95be8734a6bee0e30cbe698c9e3dc672683ddc7a453d70f62abebf592cbeb9a883be7642b43c58b3b83d9697c63d8107b93d0a5b04be15b18a3bdd1614bd2a7f8a3c3b1d2fbe151803be0b57213b690303be24e687befe0a69befc724ebd6b58473da6a148bd73d2083e196aa73d877893bdd3d0bd3d2ddd583d58ced13de9ed313c8cf3efbd8ee2513c35ef093e2474ec3d3dc43abef54199bdeafc133eb76a443de9e3b3bdd61a25bef00f11bd99bae03b22b051be5e2fadbd7e61c1bc2080bfbd68d18dbd05280fbe7210d6bd284aee3dd423ad3dc256733c741408beb78428bd09b7093ec80dd93ca9252b3c8594f93d7248f93d03ae8abdfc53463de463ea3ddbce963d16ad493d563aaabd397feabd56f450bcbaf7f9bdbe55b4bd43e3293ef72801be47201d3ecc91d0bd41e091bee4f049be3a9e143e5e92efbd405522be3f7a71be3b4612becdd5a83d422dcb3b12e9fd3c923056bee3ba47be9a6315bd758f21be2c414abed6aaa4be430373be130dfa3cf8df9fbe4a2aaabe1561b6be85e0953dafce503ea3272cbe74817dbe5ac45dbe63f0943ed51fcc3e1efaf8bd8a14333df4b1a73e1a33b93e181c81bea9dbda3d1a2ae0bcac7149bee21c4ebe0a4882be442ac73ddaaf6c3e2c97933d04bafd3d5ca1f33d3343213e770bf73cb5a4b4bddada2e3ecc7e223e938601bebcdc54be28644dbdfe49d43d0e3110bed74f153ee3bca1bdad26bebd60d3fdbc36e8b1bda49a593edb0f763d77eaa23d144c46bdd59fecbcf4111ebd9585cabc9d02ecbdde42233dbed902bdaef773beafa40dbdf416c7bd26e0883d48248bbc872dce3d89f2d6bd3b250ebe8b8411bef9bb8dbef8a3a03e46592bbd8eae5abe6aba28bd11e304be118e76bd8d14453d0b44b63db7cdda3db9856e3ee72f27bec3166cbe9f1a1ebe619d9cbd614399bbb001623d893c99bdde5ccdbc91472d3e0919ab3d308d363e3af65b3d8503f83c660e133e1c4bcb3d4956873e1ba1093d35470a3c64568e3e04145e3e5e0f9abd45f2093e4cc9a23df86c573ed24c613e3df8c8bdfe3a81bdf4bb22bc810c39beb89548bebc243cbe5770e0bd42ed9b3c0df6113eef432a3e678e13bd4a94d1bd494b73bd3ebd35bdd202bd3b8a7600bdbc190ebebe4656beef468bbe141d3abecd06c5bd2b332a3d5d778e394d09b9bdb9c6b6bdc2a6ad3de402b6bc983ec6bdfd3af03b47c52f3d349210bed38a37bed7e941be4dffa0bd9373f83d1585b13cc3e79cbdde478fbe3658c5bd8bc7793ee2303b3e45ce99bcf52280be47cd6ebc54bff03de1db96be800293bc3c8b41bd7a1928be447b88bd4786953d7f863ebdf834dfbd921c823befa7ae3de37e2c3d0a21403e2fbf4cbe611118be3851c9bc94c857bed644b63d5c6a5f3d21b5e3bd53eb343ef8889abd49e1453db4de5bbeea2bcabdcbd13d3e01033dbec935a9bdd1abdabccbcfdcbde4fbcebd973e593d26c721be24ed82bdfcf4c93d49f3f43cd922c73a4a75853e1326663dcb1b6ebeba719e3b25ff32be9ff6493e326a8b3d9a69853a0b547f3df34afdbd30a113be24b018bed76a3cbe18b6153ed5653fbe5e8f32be0761873be8b70ebe8c335ebd005dbb3cc2c65fbd8f89343c793bffbd28bf25bd8b165a3e2d49c93d60f0ab3dcd0f80bd43a7d7bdd9fd3a3a14e5943e5969bf3dcfff3cbd1146ac3c5ec0a33d3b8dbf3e092b563d32642cbe2481a73da9efe83dcda41c3e71db703e93933f3e6c900c3e433dedbd32ed01be54ef5dbe174a27be7a806abe13cf43be763dc8bd92152abd93e652bd7b18eebc6706cabd7a88b9bd0ebf4abec79687bdb30aecbd98c1a73de1d81a3d26d579be91f51fbeb4d411bd0fef87be4819d5bc2b2f083d83cf15be11b01f3d6edda2be45b9103e79cd5e3e8e7dbfbcdf794abe1a0705be6a76303e67e9313edfa8dabc17b574bda8711a3e6d5a353ec84b67bd132847be6c8be6bd1de7d03d2057833dbe71b73c185647bdf49f89bddf3f24be3802993e3e73c03dd78754bd640a52be0d0b8abda884c03e3986913d7c50b8bdf0b8b5bd1638e13ddb469f3e781b23bd19f430be91a9b4bd2647a83dc24a353efd4292bc9afd85be8b5e26bd39310e3e5ae680bd118b6fbe12322bbe201d86bd4cada9bd991d533c1e68fb3ca72738be48007f3cc5364d3d79c4ddbdc5b73abeab3c4abd0da4f43dbbe27abe3a8b35bea7d183be390602be9d11e03dd76449bedb043bbe48e5fabd2812fabddbe443beaba09cbea86ebbbd76556cbd2373053c0f2cf4bd91cfa8bef876413df562813dbf7e513d04ba09bee740aabdd23cf73d42d3d03dc2ae74be28e2c8bded4001bd3e8a9b3e488aa33d278375bea74e36beb22691bcf478813e91387d3a23528fbef282abbda696963eab8e723c8cabd9bdd52a73beaf3985bcab16b2be9ac6d5bef7730cbd1f1ff6bcc96a25be370b90beaf0317bef6947a3dba88ec3bdabd59be321058bde82e073da1f0503d1859b6bd59ba9cbdd18712be104b373d2e5a223d39b503be307b9ebcd656b4bd8533053d2ea3e5bd9383613c8f363dbe591c6abef61ea1be306ba2be5829c9bd95dd443ce153b0bdb6d97fbe2b37d3bce4bf21be4b12273cf49a803c953f323d0daa6bbc4fc0d33c8e950f3e1c0d32bea2580fbc1265e4bd7bbee83dd8f88bbd833b81be788f86bd5419e5bd10decfbde19a12beacb1f6bdf39a69be103a77bea19db3bd63ab09be34b6c23b6b8e9dbe1c545abcb5d5053df4a2c1bc7a25c73df7de51bec03d2f3d352d123e850ebc3d62433fbeaa4e163eb4872a3e61bd063e1cb9213c75aa25beb962ba3ee983503e3a14c33d7e3c64bb0e3116be01baf63b2615853d8166743dd2658c3d6bf19dbe779f7ebef2da6e3cd5f9073ee6ef493ece5fddbe431a8e3dec6e85bdb27110bec7f8c0bd2e12d1bda749c2bb028de5bac2ec55be3fc2c2bd7b9255be68f2523d9e1c10be92bd5f3c1841e9bd420b506172616d6574657238372ab9060808080108050805100122a00616e911bcdd9772be234202bff73884bd2037113ec08b17bf9b58f3be48214abdc7a9443fe9e4863e6bc8fbbe56cf633d6e6d823f18010e3fd621e2beaa5d23be0abb0e3f4b93173f58e896be5af91cbff8b01d3d9b71673e39cd5fbed052f4be5a5a95beac5b23bda1d85f3e2759ff3e82ebd83e0cda463d5e38cfbd14c78dbeb52590bbc2f4063fb38bce3e40751abee744a7be28cd22be4eceb73e17cabe3e425311bfa07cc5be44dd31be9f82693e145eaa3ed5f5c2beb3fc6abeafa887bd42906ebcffdf913e8c07c2bce606d63d6ddb813e1f3ab93eebe2303f2e7aab3efc80d53e3c08c53e70a8a83ee9d8783e092af0be55909bbd5bfe13be65ba31be70b17cbea30179bfb33237bf4fc809bf49e51dbf709be5be26c24bbe9fadaabe29bab2be678a15be8a3f82bd253897be6432aabee8eea7bebd37a2bdf9c463be431af4befdc557be94a36bbd2aab273e9bdc253e4c90c8be5da0c0bc0773fc3da4ab2d3db285693e729ec13da67bbe3e0ea7603e6d8137bc3d86393ea2b0a73e86c5b33e311aee3c5f3e563e7272ae3e0cb05bbe3ef4f9bd50021cbb2b2867be470825becc5eb63d35e5513ebc1920bed21167beade50fbf88b876bd1a24d23ef85c6dbc5829f3bef06510bfeaabecbdd781113eb6b08d3e3f7c2e3db2393dbc0ddd1e3c52057c3e3128203f62ea2e3f79bc713eeb072abebde9aabe78c843bedd205b3dfcf8103e90423b3e104f0cbf4db83bbfb29816bf03b9c4be09500a3f8e37b13e9d2c81be066db1be26fa57be296f613eafae283ffec4ba3e8e7a043ebe60e0bd85b0763d8f0f9b3e78ac723eb034f03eefa6643e47a5c83d643a0f3f16945bbea954eabee4e858beec93ba3e4560f93e56bbd0be69c0dbbe017c7dbe8c71d43e589b993e0171eabed09a9bbe5960b7bd345d8e3edd5aea3d177330be250fb4be71ad1bbef884b23e88413e3e142d913d9365093e3c2a3dbd26edb4bc482c07bef8c5bb3d562a6d3eb0f2ad3ec102293e71c2c03eeeb5473efa5da13e2230113f57acf1bd7aaf483e91bc073efdbf433dd1d9083ef975e83c8e7d0ebefc59f7bde4454abede9500bf71bb12bd4b6242be1ae6dabe88ca91be19eb42be420a506172616d65746572352a3608080801080110012220ab6a25beb51fdebe77aebb3da90d8abc952c85bd4be606beb542a73ca408f8bd420a506172616d65746572362a57081008010801100122401272a8bd98f6debdaf6c10be39c951be566f37bee19b5cbe320409be056c48be265889be643484beb6f79bbdbfa5593c61a491bbe958d4be071537bea3551ebd420b506172616d6574657238382a2d080210073a030180024222506f6f6c696e673136305f4f75747075745f305f72657368617065305f73686170652a26080210073a0380020a421b506172616d657465723139335f72657368617065315f73686170652a3e0801080a10012228f4ba37bd3151ff3b71788b3d6fb5f53c877101be81950f3e6c7262bdaf464abd0ab1ac3dc5655fbd420c506172616d657465723139345a200a06496e7075743312160a14080112100a0208010a0208010a02081c0a02081c62220a10506c75733231345f4f75747075745f30120e0a0c080112080a0208010a02080a6a280a15506172616d657465723139335f7265736861706531120f0a0d080112090a030880020a02080a6a300a16436f6e766f6c7574696f6e32385f4f75747075745f3012160a14080112100a0208010a0208080a02081c0a02081c6a290a0f506c757333305f4f75747075745f3012160a14080112100a0208010a0208080a02081c0a02081c6a290a0f52654c5533325f4f75747075745f3012160a14080112100a0208010a0208080a02081c0a02081c6a2c0a12506f6f6c696e6736365f4f75747075745f3012160a14080112100a0208010a0208080a02080e0a02080e6a310a17436f6e766f6c7574696f6e3131305f4f75747075745f3012160a14080112100a0208010a0208100a02080e0a02080e6a2a0a10506c75733131325f4f75747075745f3012160a14080112100a0208010a0208100a02080e0a02080e6a2a0a1052654c553131345f4f75747075745f3012160a14080112100a0208010a0208100a02080e0a02080e6a2d0a13506f6f6c696e673136305f4f75747075745f3012160a14080112100a0208010a0208100a0208040a0208046a2f0a1c506f6f6c696e673136305f4f75747075745f305f7265736861706530120f0a0d080112090a0208010a030880026a230a1154696d65733231325f4f75747075745f30120e0a0c080112080a0208010a02080a42040a00100c";

    constructor(bytes memory _model) {
        model = _model;
    }

    function infer(int[] calldata input) public returns (uint, int[] memory) {
        int[] memory out = onnx.InferFloat32(input, model, 8);
        uint guess = 0;
        int best = out[0];
        //Find which digit has the highest score
        for (uint i = 1; i < 10; i++) {
            if (out[i] > best) {
                best = out[i];
                guess = i;
            }
        }
        emit InferenceResult(guess, out);
        return (guess, out);
    }
}

Last updated