Dot Net Perls
Top 37 C# Example Pages

["+.swtryj.++bCCST~~}T~~YF5745759668FFZCP555594594759459FFaCEC#BS}T~~}T~~","MemoryMappedFile."," This type provides a performance advantage. It is found in the System.IO.MemoryMappedFiles namespace. It is an abstract data type.","With MemoryMappedFile,"," we put a file into memory. It some cases it allows for better memory management than using arrays. MemoryMappedFile improves performance of binary file loading.","A simple start."," Let's try just loading a file into a memory mapping. Make sure you create the \"test.file\" and add some characters to it. Then we load it into a mapping. ","Zeros: ","The ReadByte method returns zeros after the content of the text file. So we can stop processing when zeros are encountered.","Note: ","For an important program, we would want better looping behavior to know the precise end of the data.","ins","class","adsbygoogle","data-ad-client","ca-pub-4712093147740724","data-ad-slot","6227126509","data-ad-format","auto","ins","class","adsbygoogle","data-ad-client","ca-pub-4712093147740724","data-ad-slot","6227126509","data-ad-format","auto","Based on:"," .NET 4.7 (2017)\n\n","C# program that uses MemoryMappedFile, CreateViewStream","\n\nusing System;\nusing System.IO.MemoryMappedFiles;\n\nclass Program\n{\n static void Main()\n {\n ","using"," (","MemoryMappedFile"," file =\n MemoryMappedFile.CreateFromFile(","\"c:\\\\programs\\\\test.file\"","))\n ","using"," (","MemoryMappedViewStream"," stream = file.CreateViewStream())\n {\n ","while"," (true)\n {","\n // Read in byte from the MemoryMappedFile.\n ","int result = stream.","ReadByte","();","\n // Zero bytes are past the end of the file.\n ","if (result == 0)\n {\n break;\n }","\n // Print file data to the console.\n ","Console.WriteLine(","\"NUMBER: \""," + result);\n char letter = (char)result;\n Console.WriteLine(","\"LETTER: \""," + letter);\n }\n }\n }\n}\n\n","Contents (test.file):","\n\nHELLO\n\n","Output","\n\nNUMBER: 72\nLETTER: H\nNUMBER: 69\nLETTER: E\nNUMBER: 76\nLETTER: L\nNUMBER: 76\nLETTER: L\nNUMBER: 79\nLETTER: O","Benchmark."," This program loads a binary file of 4.37 MB that contains binary data. The file is essentially a grouping of about 1400 smaller files. ","Tip: ","To do this, the program uses FileStream and then BinaryReader. It uses MemoryMappedFile, MemoryMappedStream, and then BinaryReader.","C# program that benchmarks MemoryMappedFile","\n\nusing System;\nusing System.Diagnostics;\nusing System.IO;\nusing System.IO.MemoryMappedFiles;\n\nclass Program\n{\n static void Main()\n {\n const int max = 1;\n var s1 = Stopwatch.StartNew();\n for (int i = 0; i < max; i++)\n {\n ","Test1","();\n }\n s1.Stop();\n var s2 = Stopwatch.StartNew();\n for (int i = 0; i < max; i++)\n {\n ","Test2","();\n }\n s2.Stop();\n var s3 = Stopwatch.StartNew();\n for (int i = 0; i < max; i++)\n {\n ","Test3","();\n }\n s3.Stop();\n Console.WriteLine(((double)(s1.Elapsed.TotalMilliseconds * 1000 * 1000) /\n max).ToString(\"0.00 ns\"));\n Console.WriteLine(((double)(s2.Elapsed.TotalMilliseconds * 1000 * 1000) /\n max).ToString(\"0.00 ns\"));\n Console.WriteLine(((double)(s3.Elapsed.TotalMilliseconds * 1000 * 1000) /\n max).ToString(\"0.00 ns\"));\n }\n\n static void ","Test1","()\n {","\n // FileStream.\n ","using (","FileStream"," file = File.Open(","\"C:\\\\P.bin\"",", FileMode.Open))\n {\n Read(file);\n }\n }\n\n static void ","Test2","()\n {","\n // MemoryMappedFile.\n ","using (","MemoryMappedFile"," file = MemoryMappedFile.CreateFromFile(","\"C:\\\\P.bin\"","))\n using (","MemoryMappedViewStream"," stream = file.CreateViewStream())\n {\n Read(stream);\n }\n }\n\n static void ","Test3","()\n {","\n // MemoryStream.\n ","using (","MemoryStream"," stream = new MemoryStream(File.ReadAllBytes(","\"C:\\\\P.bin\"",")))\n {\n Read(stream);\n }\n }\n\n static void ","Read","(Stream stream)\n {","\n // This method reads in the file-format specific values.\n ","using (","BinaryReader"," reader = new BinaryReader(stream))\n {\n int count = reader.ReadInt32();\n for (int i = 0; i < count; i++)\n {\n string u = reader.ReadString();\n int len = reader.ReadInt32();\n byte[] b = reader.ReadBytes(len);\n }\n }\n }\n}\n\n","Results when max is 1:","\n\n9671400.00 ns\n6737300.00 ns\n6958400.00 ns\n\n","Results when max is 100:","\n\n7246513.00 ns\n4726050.00 ns\n7294708.00 ns","Notes, benchmark."," MemoryMappedFile is fast. For loading the file only once, MemoryMappedFile is faster than the other two approaches. The FileStream approach is the slowest. ","And: ","For loading the file 100 times, MemoryMappedFile is somewhat less than twice as fast as the other approaches.","File.Open ","file-open","Note: ","The program requires a binary file. To reproduce, use any large file and read all the bytes in sequentially using BinaryReader.","A summary."," MemoryMappedFile provides a way to load a file with good performance. It seems to have better performance than FileStream and also the File.ReadAllBytes approach. ","File.ReadAllBytes ","file-readallbytes","ins","class","adsbygoogle","data-ad-client","ca-pub-4712093147740724","data-ad-slot","3679700504","data-ad-format","link","ins","class","adsbygoogle","data-ad-client","ca-pub-4712093147740724","data-ad-slot","6227126509","data-ad-format","auto"]

%iVBORw0KG;)NSUhEUg?AIw?AB4BAM?ADS7QcC)GFBMVEX::0ctuZsLL4pOe8y8z4oej4qunCz9FAYxXH)f0lEQVR42u3XwQ1AQBQG4YcGvAgFbCSudCCiAQcFuGhB+xJHm/+wsnGaKeC7j7mstldl@nvoi1m+lUUrDFRFTOziRYYGBgYGBgYGBgYGBiYj4yfoiNmhksUcr0mEdFT4bIkpjtFacxoogkGBgYGBgYGBgYGBgbmB6bdRZ7pNW8Oq3ex+r2t+Q)BJRU5Er@ggg==%iVBORw0KG;)NSUhEUg?AIw?ABpCAM?ADflzs9)VFBMVEX::2+fju9PHy9/X0+Pbx9vTo8Ozj7ejZ5uDP4tmwz8Dd6uTL3dTV49x8sJe208Wuzr/P39drpoq61chopIecw7CSvahgn4F1rJFjoYOAsppyqo9IgRfD?ACtElEQVR4Xu3XyVKEMBSF4cxh7Hn2/d9TrtE+VUhTaJrcLPIvLGXjJyegiq/0ZfPIoIBRt2sOBYzLCePzwZiA+bgwtvnBaNES5iylYUlrLbffGGnlF+YiteJKNyPMWUjNkh0wu18YprTNCCM1PwZpZfLBmJwwumAKpmAKpmCSVzAFUzAF47oQvlgCcEMrYtxfMBboVTBtTpguG4wfDCoXjCXQNMb3g6/3Iwo1Bvlq3/Wti8aIfdfVwFCghtw8BnP3Jhbj.EMLMjNYhSAdSyGFO43Zk+KvuoJs39iTLhQDT0xNSm86wM7DiPCww0MoA6fvD7A6ueOtKSPxVSkGGPa502vCTuD8T9YQ8xYDDHUGENr+Oc362cw9LNYQRHGRmJoJz/GYBwoxxgcLmepeEwYov4/pkPxmDCEeRNGxGIsTTJ/ZtJhaPbqH08T2AqAaAzt5Be+ZwxhzOjR7u3bMEG16A2MWSqBlx6qojHYff53E2YhJy68GVMBA820RVjAoXkTBqz5v2eQaseXXRU2da7831QwBbNmUjapMPK4na1pds0lFcadrgtKhTlkhPH5YIxoCXM/ve5wSIXRAbNTbjLvvFKXK3VOgJEVYRqpJ7PWmPPTsjJG2m+MsFMpZRUsqTBbIScyRmhYEmJeBEsSTAvMjCUl5jhv4cfAwo+BhR8DSzKMUMBMWh4yIeblTE2wWJEQo19gtsGihGC+M7A4wYyBZaPA4JsJG/HfGVj4McfReeF66cGygYURc8RG3BicF34Mzgs/BueFGwOLEvwYbMSPgYUbsx2dF14MLPyYY4eNuDH3xwGW5BhkFDmw0SLMppls20S0o84nWJZhEgQLP+bmxTLMx/qWUy8WYjbX+7pdb5VYlFau7uq12g8NH71YilHGGLlKhpJieUZbtWbWavGH5MqJuEqfDRAN8iKPPjs)ASUVORK5CYII=%iVBORw0KG;)NSUhEUg?AP).CAM)Bfxb6)YFBMVEX::0nML5yt74wNj73ev74Oz97/X2q8v3uNP1ocX5zd/5xtz1pcj3tdH72ef2sM761OT++vv4vdf85e/5xNv+9/r8/Pzz8/P5+fno6OjW1tbIyMj86PD98fb96/P+9fmwbslD?AEqklEQVR4XuzawY7bMBADUH4FOSNnt:/l/UKSLso2mBOBULxHYK5yjRMRTY8lPbPbQ/br4G/hyp4UAHg9mpgERYoYoIFDyWMmAQ8XwjxBiKmXUPCg+qsRzTFwwI+rJOoOitgCkYLjijMEB4qnWS14HRSKdto7w4mjETyld7mwqSTsulIwNl0sGAgIoez6aQE7EA6rINl/Qo8+P2zpJcf8JjQFwB6DiX9eQmew38VERG9CKyNQK++FdBbAWrdCAke9jp7I6Dt+1AbSwULuoQBp4DHZ5oeujFBIcLnhobqrEdWdcFCp5P+ii4B62pMqOGhLxrd0TmEjGHXlHBWJ3WftulQOuktrVkn0SXgGgdMeKhy7uoQMSKc1Uk6rZPap5MwUeu0gBddAi4McDU8yPuwMogRwvyPcDqp8Z7SSTyqk+paw4ALFrTkfLQT6huA3vhq8LCuG4Br43MoYO1BX8O6Cf8SERE/Ph+Px+fHB87wk/k62HEQhKIwzFxFKbT0UjuuAN:LcdDGq1Bje3C4V/d092Xxhg9k57qZkCg94wxzycvAOp2u93H2jaKZf5n7qp0XAL8Zez6VttW53F7S6Tn/HFwM4PtDhipkIGX5OpM77dgOYNpD4yuIQOjfwB7WoLjcTDP4PsuGKkcnDodzAkc3ThcCN7jQNg+JQnh6jr/rnoC7ONjBLfDGphTt5+UnAEDsx2jJLap+iyvIxTEToGQyPpVI1gJoQGWa+DXsGmYNPJHWZxb0EnzDTgCTELUAPMOWCgMVRLYfQOuAZYjHODHHtimVQbYJbB1X4A1wHEcALd7YF8QWDClZPMxWAHsxlEBHD8G4+d/AHt6pWX4CNwAXGEwwHYHzBj3FTASZ1fTFMcPwBJgThfAz22LazFMKWDR0Zx1h8EMsMQIAN83LfKehi0GLIaapnR/FFwBHNNoUZNZFrWiFDBy3tIreRD8qwAWKQOw3AfHksCo90ypdbDJHgSASaRqgPUe+GJFYWAk.3HwDX+YCNlPUYAP/bALEoE94TCMTABPH0tIZdZGLW4VJFgsQ02GVhl4Lhu4XSGEsGBUH8I3ORgu24J6eRiwG4C9gwvixWwycAyB1cblgpnWwzYE7G13vtaE/LHwBpgiYEiwNcNiy3rtSRpEfcrYJODK4CbaSZws25xFwxTCtguvHoQWcHk4K.m/YDYLthMRiXIsHWiWPgDt5q3nr0XvWGRaYhCwGLPvjOWiK23YB9CGwB5nlLgG9blhaj2gD/tVsHKw7DQAxARWbsQwuhXic9xfb:+XSbhGLsu19Fj/aEuhpEERCbNM0TdPUTWwX0EiKc7k0NRDCRc4166AjKV41miqIoJlaQCWpCm6sE4SwmqqgnhSv2pvaEUExtRUwxXRyx0vUgN2Ug7In0Rlw0FfW/WpqgNLzYH98/OehRA+4mrqBmvvj0tfP4xu/kxZTGVRd8aoWtJPyp07aXVUGHLWTbp866XDVoo+OYWpj7aC4Sr9HR875P4yOBOquMgPOKsjo2EwV@/wz3wStZNWUHbFTtqzGgjhaqqBkitu5ZbVHREcpi6g4aq+D7ghhOVL9b9Gx+rrU3sfcEEE37lEjAZM1i5b)AElFTkSuQmCC%iVBORw0KG;)NSUhEUg?ANw?ACNCAM?ADrVuTh)YFBMVEX::4x9v2s9D85e761OP97fP++fvEwIH0msH+8/fe2HbRy3zq4XH71I6VlZWhoZq9vKWxsbHNzc3PzKXi4uKxr5Lx8fH28bD4+Pjd2anp5a3/+rP06HCa9NH/9Gj/9429Bui2?AD/0lEQVR4AdzYa4viMBTG8bwr1OE5J9dexul+/2+5GGZhbepYY8Rn+n9hQAj05wnWal5REkmXNYgzh8sBWWWB0RytUWxGOag5Xi7@Vjz3j5fkfq8+Ly8r5fidDowTubj4gZ8/grcMHnVGKOqn3aMI2bcJL8AN6ngqujnPTiv7Lghy4rED3dx0XPjBsWtxN/DYaLGTYIfkpsXn+EzZmLcoLiT/oTzGHhxg+Bucfv6ccGpfNLisq1Sl0cqkQlXYQO2BAM0v9DiIna2QZgvb3penMfupsIWIaqyH4f/+3qiP9eZ7RL2J+P1Vot/2dHsqhluPbntLB7Irv5iQKGjwgU8VLi50xLiLFA3ulEKNxsuAZWjc4WbDueAutGNWCd0OIvK0TkUseESUDk6yz85h8dL26cSyoazeDx34w6S2HCoKB8/3TCT4RJyFV8pglXWsOEcarLFp7L/t+VXERkOyYTSRoezqMoZVz4tHAUn643BHAeH4oGAESeoa7XP8ePq0yPjLCXOEkyOHecoce7IuIAmJUpcQovEUOKMoEGOFKdoUCLFhSZ3ORpc+3MZaHGuweBocO1Hl+hwQa3knrY5Q4ZLFq1S86bWuOW7s6BVcXmu9rjY0EaHQ6u6hQ/XoU39Qohb+oink+68EOJy54++P526rosxijwKi6ePJUeJKztfuP3pG5zJcgUSiTF23akvJsaB4+tvu3WX4zYMAwGYpH4wfmhP0Pufs6VKrdiFoZdULjadeXAUmA73A1aUiSOOOOKI+zK47zl4IcdwL+Rv4YgjjjjiiCOOOOKIIw45xBFHHHHE/Y84HuLEEUccccQRRxxxxBH3ZIg7hWsKmJX3xBk874kreGNcBdBi/ZY4+ZK4CkANsCqe6/e6iwiA2tRgGHFfUYzKdNcXpuOZq/qzxeuqGeJ3vMG4oX010Jp7ncRFdG0vWBNBZOFmrfV1NxYpVcQQsfFQeqwhkns9gEORPpqZX25wF2Z0h4OIYqZJvWfnXkdxpY8P9av1OUGCph97Tr1Uun/0ddcfbNIwfqdrGqtteEaDS4pXyxX/Fb3kXj9O4uIsM7/o3FB+sdJFconG31zibtSG3PfR+Br5wMksKGvwpl7fzuJCMIbAr0xcTdNyMha9LsHnoqqGkZobIA3e1esxXORVnCKyx0Wex5UXcA1j2tcXcAf3nGTL7Z7b4nzdY71wt3vu/CEerTXmoQNKxt1Pyz3uusWtaZl7PXPOlfXlBpfPuS2uzCPMkRmXzrnc66E3FN3h0hvKHrcIQPkT19JJ/xwu3i2LGmBW6x1Oms7KPa6r+Y8UtU+49W6Zex3FSWvyL3MW91iII46450PcPsQRRxxxxBFHHHHEEUccccT9BMmBXcwVjbcY)AElFTkSuQmCC$/9j/2wBD?cHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwf/wQARCAC?PMDACI?RE?hEA/8QAOw?AwEBAQEB)))?ECAwQFBggQAQADAQE?gM?wE))BAhEDEiFhBBNBFDFRYv/a?wD?AB?I?D8A/SI?AIAGQ0tBmNTNkTYhjTSmzObJmwXjX0n0ym5e4PDxt6Hpz+1exgx0ejiXPFlRYYWN9PWMWaaRYo0wo0))))?AgUyDPSmUzZnNiVENJsibM5sztc4hUQ2myJuwm7K1/tpFTx0TdE3c1usMbdftUUVjrm/wBpm7hnsn9zSOR49D9hxf7eb+2F16fYmhY9GLta3edXo3rdnNUy74s0rLjrd00llaEumFMay1hMSiTAIyMENLQAWgaZgtGjQoEDIw?UomTmWVpJcQUyytcXs572aVhcQq12Frsr3c1+mN60XEOi3X7c9+zlv1+3Ffv9uivEO+/f7YW/Ij/AK8u/wCTn9clvyft0V4FNoh7NvyPsv3/AG8T/Imf9SqvaZVPHE+4e1Hb7bV6PGr0dVLsbVxXqJevS7ppd5lLOyk647zCZelzs66WcHN1Vs5L2RLsrZtFnDF2lbsvSYdmwXphFz9H7VjbRrPR6L0eNNDP0NP0MaaNRqtPSxRpNaTABkizKW0xpTUmkS5LxLlvEvSmjC/PWlbKiXj9Nhw9LTD2unGf+PL7cZ+XXytDSJeT1vjze3WYel25z8vMvxtefp6PLwz62yHFa9rz9CtJl2x+PMfxrTh8/wCmlu0RHw8+/adctOUy6acJdnPh9O2nH6cPX8jDraZedXh9OinHHo14rjk4r/k/+nRXXLSkw7aVVXnjelMcd++t4hdPhr6REDJck3VNVepXW0soquIlHtHlvWzWLOerWJP2cVbehrKJOJVFl4109ZqhrEjFxK4nWS4VEomGkHCFw0hEmAFpMEZgFMRJgBjfnEuLrwiYn4emm1dOLTC4s+Z7fjfTk/xM/j6a/GJc1+MOmv5E5jPr8w+cv+Pn8Z14/L3L8fplHH6XPb4cX6vlx05OunNtXnn8bRRw9rurlRjFIPw28njitaXXFWPlUQvDZzMtIgsPDw2cmWHgwyGA9SAMaRKqs4aVaVDRaIW3hnIXVKoaQiVfxcI/i4aQgwAYBaZTCkjTiU4ICl6CGmkTGsb0bCSDhtziUTziHbNYT4E2keYcfg/DpmiZqwt8rhy+UzDpmqZoymrSJc+DG3g/CZqcSxiFeWsUV4R5XrLynG/gpqXgemODGvksT5PUxCoGKrDSsCZVCyhUQ3hlJxC4KIXjSIRMg4JS0gGFYkEYMEDBAgYAI?FgwzGBMwzmrYsTNVRLGap8N8LynyesfA8NsGF4P0yih+WuAeIL0y8lNWxYJoPTCal5bTUvKJoqLMPKsaeTioiqvSIhcQcQpcVRMgxhrSDgYFJAMGQI?ADQYBaNLQYLT?Mj?BAgZ?AkgwAoAj.QMBSTMDAWA8PFYnSwwZgjAB?AP/9k=%iVBORw0KG;)NSUhEUg?AK)CFCAM?ADrcAOa?ABgFBMVEU?AD:/9hY2IbHRqiqJZ7g3iPlIzu+9v6/ejz/ebv/N3+/vbn+s31/ej+/u/q7PT8/vP:vL4/M77/dtOUU64vp/7/frFx74uMSzc9dr3/fG4s879/OTI0OXN8sPy9PnI8Lzx+/Cn2Mzo+9jbxNbk6PPqycz77tP7/dTw/Mv26ej88t357uu/x+Lb+b3DzeKcweLE77zW3Oz99+vFvMf779bJ96j7/u/U1NTk+ce4w97f4N82PS89OkD4+fk+SD/C2afa4e3b5MTl6tnq8Nzq+ern1eX99OPK7ML:O/55LjV2cPw8fjw5e/M9rzr3+qq7MfT9s3x3t/L5uWw7M7k+ODE3trizNv4+8blv8PP+LDV6+rTtszH8Lqt2c/y2s7HrtWhx9zC8rG13tO37tK/8a33/Mud6Mrn/bv2+8SfzNr79PL9+O389vXy9Lzj8uL558Gi6sTlu771+73Qscn++/Hu09XOstLQ7sr44bDB88rCqdXm6rf19NbP+aX33KQ7zRWn?AGGklEQVR4Xu3bVXPrOBiAYRnDzFxmZmY8yMzMsMjw11eq9bmOJW3TZHuiOeP3JpPJzTOfLVV1UxRNRK1C7uJ+YQFuQR+v7kVuY87Cvm5RKBFKWIWY5uPx+DwXGOEWCPLytQiMJkTA+DzOzwcGOEUCPuJxFez+akAP6AE9oAf0gNs53VDX8xpCSNNW06ph6pncwk6xGIm0HxjJmauIn5Y2zJnlYrwYbB9wR8+jkzIVRSm2BxjQNYQkBp5fB0PaLC0sb49E/JGdne3zuYxuGqo9Wr1dwAwFqDM1JTvPrmLfFl47aQ1lsooSEQFXVlZWF7LZbhZIPwk2DdQtnrGsKCHMAyDT1nbAFxAuEoRbUBQOkH4SaBJIfWnMU+ab2AfPHJizxreGxwc6qYDbGtz+cb+UQBX2D5gfACNsBMjJ1yKw7C9b+aP+uqLlVCpDfGoW+5J1DYY5dYdJi0xORth2uYFBIVCUP5UcJBug1osHmBysK7zI8MB2hkC/C1hOZuAG9Nf7XoX5nS3Q7ypaHlCxL79GBuhqUNwbfpQxKPwk4OOHUuXUUWWm1BYMMOCaSfgqvyp++ZXpgEQZhQMmCvxc4IcGoJQ7n0mAMQwcc/f7DU4vblzBPWLqIlHGrS4mCrx/nR+iMOxjgGSJqNhXZIEvuBHmc6YuogQg628aaF3hGQzslhJIN8ELcIUlBBrYl4YrLCNwhZ6SA5IC/7JvQUmB5wmQHAMXZQTCGlmDNSIh0MS+VezLy;0YJuWFZjGQAMWcRPAddRsNUVpBJinJ4WgrECEK8EuIyFwhwBzLQDVdFo9jgDgPST65MLaWgPALbq6lHCbFwmA+Pv0GQK7GgQmBWUAOHaPbfL1FV7fiQ+sjU7wvjv09g6/DByn780x/X3l9XeiuphcQBjfcx7wPhO60wYg1BJQpwteXiCcFeZkBirSAT0ggOUFQg0D3wqygc/Y5h69E1biRxm3Z5;8PLeUfjFCt42CZx4ymti4unEH/woo+dHuwc0Cty7TdpjahHI1ijwAQQT/DaBNQx8KCkwIz0QDguXZAb2SgzcgANrVWbgAgZelRT4JwHmJAZ+gqdvBdmAkEafLNw8AyCpUeAPotYx0CTAl0xzXU0DqQrzemh1h4XLTGKgSp9u7Z4G+O4Y2NKThYt2YqCJgesYWGwSuNrKs5lGgDrCZbFQVqC9U3dICvxkb4TNAe2ekOBE/QDqcS2Si3skYDUCvLMCy1hWoEr/0tQpK9B+tvBMUuCGfRNKChxboc/5d2UFGhio1eAaywOExjbgOwuF1oDOw8IvUA:Z/FpJvjmZRoD81lFyZ7iNPOE6cgDE7wL9d3us4IJXiNdHKrT4bfoFZR0NbA4qSNchmyFHXVdGl8S9j3TkYcyvvwDnYMocLifNLzvDoBsGDhJlokWwyOstgs4/J/ADh3RM1enpMCONIJztaTADc0Wygm0LjIysyCUDIgzEUldxvdhVTrgQ5KBjjJjeIjVh0dxgaXS0tL4KAUyUcY5G/gb5AIO1wVAwT5ozctEVkZuTeksVMkEby2NHrdU0k01rSG9llU2R+8yObfjL7brC0SBRDY7u+9qeh8lRQ2EJ6tWmTwlaqo5s7D8uXD1eqUyvlTCMMNQV53fRO+t9DH9TKKMfts1C0OiwA/TpA/uphsBVg8MDdWlib7LH2scCAHQmhh2OjsRCG0AUZyGgdk2AKEDXWjUVEPPLcd6p6YqlfYAoQ3dUNN5y6nlrX/JKY1PbW5OVcZJFT6Q9hhsALTrx4sB1zoQunRrdJxJSqAH9IAe0AN6QA940om6gxcGcrLQbt5dAPY9PuesH6o76QPMAUxBZXfBgrDNKW6buGvChmad7Tv78JMVvDpCcVGJ4q6ozpi4Eab3ViPTZWdRZ4mQMDQvKhq5KRTGeoUNMVHn0Egd8LCuUMLqlEAcH9jbFDAlBiaaAXbunnKCMRLHB4knmBBOMGED4+5CxU5htQu8aqT37j7aRROijj1MxxM8A6BLeHgsOmwNCKu4USB0EtDZNwL0gB7QA3pAD+gBPaAH9IAeMP7:k7ykYIgx9uEsJBIGPoqEwTpYV0J5zjFE/wXzd93x5vnhJo)ASUVORK5CYII=!