["..E$ ","A)BrEfB*aCCC|F66664G76479666}A(.B(B#CXCPF66F8*BBX","Sealed"," classes cannot be derived from. Does the sealed keyword improve the performance of method calls? This C# keyword prevents derivation. And it has an impact on performance in some contexts.","Example."," Applying the sealed keyword tells the C# compiler to apply the \"sealed\" metadata decoration in the assembly of your class. The sealed keyword is a syntax hint that restricts class declarations that might build on top of your sealed class. ","The JIT compiler can also detect the sealed decoration and optimize method invocations better when it is used.","Next: ","We show an interface with one method (ITest) and two classes that implement that interface.","The first class, TestA, is not sealed. The second class, TestB, has the sealed decoration."," .NET 4.6\n\n","C# program that uses sealed class","\n\nusing System;","\n\n/// <summary>\n/// Example interface.\n/// </summary>\n","interface ITest\n{","\n /// <summary>\n /// Method required by the interface.\n /// </summary>\n ","int GetNumber();\n}","\n\n/// <summary>\n/// Non-sealed class that implements an interface.\n/// </summary>\n","class TestA : ITest\n{","\n /// <summary>\n /// Interface implementation.\n /// </summary>\n ","public int GetNumber()\n {\n return ","1",";\n }\n}","\n\n/// <summary>\n/// Sealed class that implements an interface.\n/// </summary>\n","sealed"," class TestB : ITest\n{","\n /// <summary>\n /// Interface implementation.\n /// </summary>\n ","public int GetNumber()\n {\n return ","2",";\n }\n}\n\nclass Program\n{\n static void Main()\n {\n ITest test1 = new ","TestA","();"," // Regular class\n ","ITest test2 = new ","TestB","();"," // Sealed instantiation\n ","Console.WriteLine(test1.GetNumber());"," // TestA.GetNumber\n ","Console.WriteLine(test2.GetNumber());"," // TestB.GetNumber\n ","}\n}\n\n","\n\n","1\n2","The two classes"," that implement the ITest interface are slightly different. The difference is the integer-literal stored in the GetNumber method (for demonstration) and the keyword sealed stored in the TestB declarator.","Discussion."," What mechanism does the .NET Framework use to call interface methods and other virtual methods? Programming languages that implement class-level polymorphism store a virtual method dispatch table. ","Interface ","interface","Then,"," the runtime looks for the method location during execution. In the .NET Framework, each type has a Type pointer on the managed heap. This is used for virtual method dispatch. ","Type ","type","Also,"," the JIT (just-in-time) optimizations in the .NET Framework are not always invoked. This depends on the execution environment. If you execute this program in the Visual Studio environment, the sealed optimization is not applied. ","However: ","You can run the program outside of the debugger by clicking on the executable.","Benchmark."," I found evidence of the small but measurable speedup allowed by sealed. The benchmark shows that for the very simplest interface methods, the sealed keyword can improve performance by about a third of a nanosecond per method invocation. ","For interface-heavy programs, the sealed decoration can result in a speedup on all method calls with no downside.","Outer variables used in benchmark","\n\nint sum1 = 0;\nint sum2 = 0;\nITest test1 = new TestA();\nITest test2 = new TestB();\n\n","Contents of tight loops","\n\nsum1 += test1.GetNumber();"," // Loop 1 body\n","sum1 += test1.GetNumber();\nsum1 += test1.GetNumber();\nsum1 += test1.GetNumber();\nsum1 += test1.GetNumber();\n\nsum2 += test2.GetNumber();"," // Loop 2 body\n","sum2 += test2.GetNumber();\nsum2 += test2.GetNumber();\nsum2 += test2.GetNumber();\nsum2 += test2.GetNumber();\n\n","Results","\n\nIterations: 1000000 * 100\nTestA.GetNumber (regular): ","2.490 ns","\nTestB.GetNumber (sealed): ","2.162 ns"," [faster]","In this benchmark,"," five method calls in inner loops were done together. Results take this into account and divide by 5. Stopwatch figures are converted into nanoseconds. Both methods return the value 1 in GetNumber(). ","Stopwatch ","stopwatch","Benchmark ","benchmark","Summary."," We looked at the keyword sealed in the C# language. We applied it to a class where it produced a measurable speedup on all method invocations. Sealed has performance benefits\u2014these depend on the execution environment."]

%iVBORw0KG;)NSUhEUg?AK)AxCAM?ABqK1L5)MFBMVEX:/+zzvd8rvO/1fj1+P4xiu5tpfFbnfDg6/xIk++ZvvWLtvSmxvbV5Pvr8v3K3PnaFXRJ)1ElEQVR4Xu3W7QbEMBBG4Xcm3/3a+7/bVZRlqEI5Vs7vhIcwE+3lQbrP4/kHN2LNfbW06zcAMDTWlFnA2LDMAsbGBwaMJTqwJDqw7HRgpQNLogOdDiwHHZjowEXqflXj7r56H2hmW43AevttMIVeA+qsRyILqE4HKrxyhwG3sO1gQPt34AQ6HJgHfMxsBQ081uBrGKC7txJbAcDbjA7scOAQHGhw4DjgQBMbWMUGtswG1iw0cMsiA5dDwgLbkrJEA/rZYpb2gGMAdRMZOIETOIETOIFfGWpGTAdlDEM)ASUVORK5CYII=$/9j/2wCE?gGBgYGBggGBggMCAcIDA4KCAgKDhANDQ4NDRARDA4NDQ4MEQ8SExQTEg8YGBoaGBgjIiIiIycnJycnJycnJycB.gI.oJCw@Cw4LDQsOEQ4ODg4REw0NDg0NExgRDw8PDxEYFhcUFBQXFhoaGBgaGiEhICEhJycnJycnJycnJ:BABEIAHEA8AMAIgABEQECEQH/xACe)BwEB))))AQIDBAUGBwgQ?AFAgMDCAQHDAkFAQ)ABAgMEBRIGERMhIjEHFCMyQVFhcRVCUpEkMzdicnOBFjZDU3SChKGxsrPBCDQ1dZK0wsPRFyU4Y9LhEQACAgEDAQUECAUFAQ)ABAgADEQQSITEFIkFRcRMyYYEGFCMzQlKRoTRicrHRU8HS4fDx/9oADAM?AEBAgEAPwDv4?AEE)KCEfAQZp9Co88i4mYmq6pirqqj5qrxMs/IAHkRu44Rj8JlnXVqcVtPLM8toRev2j94UVilneq3ifDMNh72gmcIPUnrCUtftH7w2p1ftH7wsNLChYI0w+MSbi/bP3mGluue2r3mDUGVB1WEi2BvMwlOu+2r3mGVvO5ddXvMGoNKDokcsR4mMqeez+MV7zAQ49n8Yr3mBaD2BURuJ84+Trv4xXvMNree/GK95hNwQpW0CBSfMwlvPfjFe8w3rvfjFe8wa+AYzAi8nzMt49RchUmZIzVetaG7szGVRX6eupuz66+7zJpJ6MZCjNbivUa2er3mLCtSkx8PFtP+sZ8M+wc7jJbl1WKxKUaWFK6RXaSRT6rvXsPDidL7BVU7IoI95wxJ8eTOs0WpUvFUPpGlU51J2R9tyDEhmFUpdMqDXOF6Ud1LdmZ/GZkKTBLL82HL3NJCnTTHcy3bO9PkOoKKnwIZwkZX2G+98/ZvLV5hKWEVvVgY9INTQp1NWorLKw99QcgjwMwhKVGW0y66eps7T2jUx5RyocdzM+B/qMc7xTVIz8qMmE5c64Vy7T6nhsG5wnDlPQ29cz0kZJSv2vohWn4JboBG9f3q1QZLMenkB1M1VCI8n/zf5i4DEVlDCLGy3Q+HScmREXaoW)CKg?BBJME?AIJ3Q4lzqmKSsOloGjtV/IW0lZIR4DK1GSbi1K+zLuIMtZgyLq3C1keYlcYIEAE+2lPtgDYWGlBS2mIdeI2sRlh9YafdN1V1qU7C6pZFsEyp8yHYowZGVxDZmHFEQtjpXwZE2sSUxGLSQ1sK75v2iS1qVrudgI3p9Ffq3KUIXYc/wD2UeQFot5FLpjLjbCKkWs98UhZF/pMQJkSTAd0ZSLF5Zp7leKQqrUVW8IwJHUeMVq+ytZpAH1FRVW6N1X9RIyyJJcQ2eYnwqs9AJVjDL1345F2XkI0iQch1Ty@Rd6qCySXkQdBOemJDZUCgq2SeoxjHzjEhaF26benul255n2q+0RTEleWQY2A8QsyDWmjlUR9tKrebrJ/wA8i2jLUWilW5zTDLi2nlZ9KgrrfFfgNoadppyuvK00cbiPZbkNBh/DjFFjvyIy.+rpXkqPqpL1BXa2nDe0BHem5+jfaO/SnSMhPscnd+EK3T5wMlHwvS9BBKcZhoO72jz/wD0cwl4nq9SnPKafWrnJ6LaE+x7An1HEtSxDKqbbC+bRrbUs/6j88g5ybUg/ST1akLTzenZt25bVOKLinPuEMYALS+yQSAOSJf4Kwa6yv0lXGzb01dDGUZb2zrL8B1aBuklSSK3Pd7shlinlMz0+rnaNRSiPQbT2J6v2Akcs3wEj6gbRz1PWXqOAUEo6pAxJzIEMAEDB5hQgQMEGmaHACABBrdDlbWXDQwnI8tu3yGTfc3jGhxA7anaexKf1mMmtzaIzHLGVWub7TEcuBXBk1gjcClQmQGfEevDKliTTIbtUlc2aO1OVzi/ZFlPwu/HZN6M4b1vWRll/hD6oAeYtdPfYhsRCV/v6CZ5agwpQ0NNwtKnIW5LWcVKT3E5EajEGt0CRR0E/eT0ZR26mWRkfYSiEqrGQMyNdotStZtNZC+PmPUdZBgt6r+q4XQM77ncfgKyYutcoUg6c2aWKIw6XOdM+ls+Yr2hY1JtbVBW0wo+cOGSlWnxLu9wzMKryqSx8Cc0levs4+Yg6u8vbgchOBNh2J2f9X0YOALLe8xPhnw+UuIvJBSG9RVOqM5Ey5K2JMg8ybJKtuRduYv5D0fnicNVRw3Hk5KY@9TZx8j7hi3ce1/I0qeK3wLIXNOp0yVPj1eW6Wpkm67PqdbIJFrBw4yGHiJNfSK9T0X4at1PdPPMm1ChzYKurrM+o4nu8UipcuT1iNJ+Q6MSycb1djmwRuaR5BLvQV3FKbdgsU7QOO+ufiOJmL/AKMVMS1Fxrz+FhuA+fBnPiWE5jWSaBTHjJWSmF/+vgf2Bj7m6f8Aj3D8Nh.uvpxk5Hylc/0b14bauxh+YNgfvGsGQW5VSemvpuZgpI0fWr6vuISMSIR8K1VLbacb6RaDP8AULWmMxqZHONFI0trXqL25mZ5DMVvEXNpc+PIjm82pPQdpZ5ZbRA1N4tfI6ZwJqOyOz20unFRALnl8eJzOaQ4SmZaHEZ6S3d76JH6w1C6ow09oRSS23n5EZjMKlOstL2lYsz+zPuEV3OQ23oGa3rrUsoLNRmfgI1pz8peKoUsT1PSdCoCJa6uuQtZ6SSyQnPdO7w8B1yDHJlpCfAveOa8n8N1CijzGt9KU3X9ZPmOqsp4BdIwMkSn1VwssKqc7eMx8uAMEAHt0jww?AtYIQIKBBDQRIAMRJzxoYXae3LiGSICcAzMYimE8+baD3UHl55DPqWJFSfJUhzz/YGKZG9IzkRbrU+v35F2EEKnjKK5muvKr1Y4EOI0qZMZhoUSVPKt29niNmeGKQ3GPVSe6W88ajI/MRJtHiUphE2Ogm30KSlLmZmorjEB6qzZEqFGmunoOvEXC0lGW0rjBmwK23af/ecudF2SBWXs2OcnP4sDyGZKQ3IpDhOxUpS17PtfSE8pUyrt8DjtZ71m24NYpfKn0OXPyK6Oi5Pv6v2iXSKlTpdNZlMPo0lILtIuz1vIEtbb2UucEZIJlllFqVkqUbTtBA4GPhGo0xVPWtpZm61n37SEWbUGa3Mbo6meg2OXKPipJ5+4gilvtV5UyU2fwVLym2F+1Z2+WYiV1P3Pqi1aLvLQ5au71kqLqhYNiAd7u9Y57KmxijLusZcAH3dxHj4SdW6ES6e8rNNyEHarLI0n3jAPYdhvRULUo9X1reBjS1DGD9bS3S4TCoiZK0oefWZK3cy3UF4941a6PH5rpaaer3FkAVSwn2fOIrNunRRd3GYnA/lnHjocVtROJbNSWjJStuz7RetT3am0htB9Ez1bSy4CdUMMM1BJKROdioSs70obNWfzbu0hZ0fDcSD1OcPpyy3iJKf2doYNbEx72gA73JHSCkuqbjJR66lH5ZC3PUdTahJ+4L03Y7VkWGlpKerszGYrVcxHAQrRNN30d37A5jaAOfkIhENx7u0f1N/jMnVUpzOSksWs7Om4/qFPIqJtKQhauv+vIU9P5XY/OeY4gaSje01uN+p9NIXi2myEJRVqQ4qTBy1ejO6zP1/EjDb7geCcfHwjoqZDtsAHkQcg/8AcvmZGpFbc8/2ihxJm23rtIJzcVqJ7+4TDeW3SY7iutpou7NpjNVOTPcuREUW8nw4hQaEFIyw+M5/FcXKfW2tXrdUz4GZ/wAh0DDeF5FKc9PTFpSiKZ6VpkZOHlsIhzqCpcOopfWg3FNLPUQW3M8x1dxxxUWNE9RCSd47DUsKCmyzbIfaOr+raZnHLN3V9TNRgpL8qbMnu/hTK4d.WwZ7CtO5hTG0fhHekX5q7BoiLYHieeJU6VCtS7urd4+sMGCBgCSIAY?eWF?DBAzCiV8BQV+cmKwacy1Flul/MXMx4mGlL9kjHN67UnH5NyzLhul3EEircZE1t/s6z5yOhCp0xuMlXxisrj7BopNMZw9GKqsXdFlepXifd5imoVMcmkc9LpoW2Z6Nu3eL2hCruI61UTcoktKE6K+kSyR5rNPf4doY1DBMrk5x4SR2JoN+22xFJJ3ZbqK/MSbUcUP1J+Jzm1EaO4Tiko91ys+4T8XyIDWHnn+cIUpRJVFtMrr892ztzEDD1KYnQVodQjWQo9RLmzJIwVcgE1VJcaIZrjtLtbVmdpbOCfIMDds3v3t3nL4JU1orr7nsjyAPjGp+LKlNjpj1Oet1pOXRqyyPz7xBZqjLu40s/sMyIU8qlVB2WqOyyp1ezq7eI22DMDVFl8pNSYQpr2VZn2BJGR1k4NWgP?/SaDBOMY9GZVBnoPmuZrQ4ktpd5KIW9VqjuN5DdOoyDTT46ickyXCt3vVSI1Uwsw4wfN7GnE9S0shMwIyURMqlSDJt++9KvaLL1e/IO1sx+zb3ZBuFSltVWO+P2/mkGdRX6AhNQcVchkyXqcSJWez3izVynRuZGluGvn1veWndl1ru4TMaLjwMPPxnndR2TkhlPrXGf8hz0sN1ZiKUt5g0tZZ8d4i8SAffWfsvKO0LTqqhZqjkh8Kc7cj0nTsL1BLtEiqkqudUSlOKy4quPaLtU6OhPHZ4DM0CnSGqRFS6ZIVZ1eJ5dgrvTjPpVyk3Hzps+p/wF5dVH6SK2mrttsKHIUljjyzNe/WqfHQbkhzT+kK7EDMGRT1SnHNGwtS7/wChj+UJ2RCoeskiuuLxyIYWZyjVWowG6VOaQlrdS49tvUkDcSCGEdr0YUV21sR3ju58BBiikYfrUeTUoU5hh6Km7W/HKy+K8xG5POUaPQ2FUivJW5AUfQOp3tLP1Le1IyWIqnA34dLZU2wpRLWpw+srwFAw5vAwmUi7LUZ9oOR4545noGs4molTjG3SnL7iLsyIvEYesT5cfT5q5apWd2zMVFDlobZ472f6hMqjiXGCdz6phgDDD1jmFAwOmPWRKaa4k5t5aL9Q7VJ453GOoQ0c6kMXosvNO53Zdg5VTlPypbCEJNbl6dNPaeZjtVLhOel2m3k2qayU54ZEHaiNzekz/bIZhSq8qXnQoKCS0jZsIsiISwzGLoyDwVCWAGADDiiCAGCBh4Qo)qCUuIpPN4q/asMk/aObsRymVBqMu40Z9J5DZYmkX6+3dQVqRT0tdPj02Q9PcKNclW91Vq2bLA5nZXule1X1nWJWT3V5PHXnpF4hnzMHRo8qlttWvnpc3V5dcY2j1I5dZdlTllrv3OLVw3u4Ip8eRWFOc7lOuIZ+KvM1KJJn+oZ2oITGnOp1FJ0FnprLj+oVbZY9ZrKUrqQ1gAvjBIGO74CaupNvzq21Hp8haEKavesM89h5cBLVT0Rz01F1dveGsGpeTTVVOeRqmSFK6RZcWk9QvAg9NqTaFrfdMr/Vb7fAgnaSwVRkk8AQ2uSpS9jKioOWPH7xhlmLAN2Y98Ys/d5eIlsY3qkUkpbZbUwn8Gotp+Yzbkl6U5qPH+b3Ay6yUeJFkLbT6CuusvYNzYJ8gJje0PpFfqNQlW@rrDAcgFn5xznOPSbFGJefvKada0thb+eZZn2CvqL5tqS7madvXI8svtDFLjNLJxxSjVtMvcJ/NCeZU1ISS05imcEmbSp04GMc.Evxpamn3ndZxhaV7yrlFkfDiNhVqtRWKJJnrnot0ldHmV12XVt45jmFZo8umGp1G+1tUlSc9n;YSfOffWeztC6dwHTMXdQlm07yAD4ePwnbaTyp4X9ENLqClMzmEW6GR9bL1e/Mc5k1qZ6VVipxaEIdcNWldvJQr/AIGGWT2d2QZkOyHEGnIPEM0JRVp95XJLjHJz8pu8ScoCH2G4sWQcnbepSi3U+HmMFUau9Lc1Lt72hDOK9lwDZx3cuqHVqUSHZe5UrnA8hBebvWPaFttKzCWmHbuqLmJGUvLYDYxpOYiI64gWjOvII0pSpezuM8i8RNhUjnDiG8useQ2tFoSYJWpTctZWuLy2q28MhFscDwkscLyZR4Rcbpk1Lq2yW84okN/Nz4mO1UqKaX+ceu9lx9khmoVBj87RKcipTYVtmWRfS8x0CHHYtbU2Z7hWhuk5f5SDrhvSsflOZYsFuB0JQWwLEzbIcIGADDiwQ?ABcKAIecSy0t3PqkYWKbEs1uJAO9Vt5hQGSBEu21GY+AmUq63KlJRT45lq56riu7zDFakRJMX0LoHzzdSp1Zbqfq/MFQm5ch56rZkt1JGmxXVIV7cuZOqCp7zZOOJV1G+xJdiQjVN0rHhF9mVDa2obq3I58B7sht0xcJ1SEuqSpSfU/mCo/omkty5ElgpExxZ2ahXZJDdVnqmTkuM3x0NJtWnPeVt4CvdzcVw/NDdWlss4XgfmMk6vtOnSg+077sAdi8HPhuPgI5Nq0h/NtpRWZ92REXcQrDPeNajuV4h9afARVqFpRpqqfdGSfxGZPtDtDUa0j2hAVfdReFH+THUmQeilqS@8/2CIlRidS1EmWaleyYVqm26ew/yn95F7Oq367Tqf8AUX9uZbQUqZImvH3mYvJ0+k0iK3Jq8tqAys7UKeUSblZZ7vao/IRqZDclrPQRdaMhi8o9O5W8Mu4mU36ERHTaqRkcZK+mzuu3c9Sy4z8MxQ0V7pvdRZtx59Jp6nJg1uln9z0tme06ZtuvsqJdmzqn2pVl3jm+lhpKzbVVIupmaVXOpTkZcesewaTkxYjzOULF8mjW/c4o16amy6LV1iU1p/Nt1MsuwyFBGof3T4rxpRaVMpzUaQ8jpHUazmm2tR3w9NaU7qtihICKuYhdVYFUDk5MsEUKjQnmnK3KZiRXM9Nx5RJQtWXVuDdQgYSmOMt0moRHZbyrEx47hLz2eyNk/hulQqfTW5rpKYoKUOMPPLJHxKLNR31cu/PYOecmEWkyaPryree0+e6+xv76dRlpu5afZO1WXZxBqByRDtts3KDjkRhynU1uX6NVJa57cSOb3FfcothW+QedpFGgOkxU5rER60l6byySdp55Ht8g9MkQXeVilb7diWDQ7tTlq6b9t3zt5OXbwE/lHgU2q1aJTtRrnfoya40i5JOG83Y8wj6Tllqe/aF45jDWNz8DiRalQKJSVoZqE6PGedbJ5tDq0pubUZ2r8jNJhEimQKQhp6dIbjtPl0K3FZEosiVun5DGViU/XsOenp1mrDcp1Fhb3SaceK/rr/xaaj+kOs8trEBjCzLjbjPwh9pUS007yMjz0vm8OAJkBxErawyfKQIzUCFEbqkiS2zDXabUlStw7i3cleIvqRibDC3GI7dWjPy3HUoZb1CuWpR2oQnxPgI1dk4WYwczLrOT0FtLDsVlhZdM8lNzSEW7DI+PdltGIwlPoknEcTFeJlok1KqTExqTTIejbFVdpNvSGr7@T6m7n6wa9ipjjXNnwnbp1apFKjpk1WS3AaWom0OSFElKl5Gq0vHiNPRqlSqtBbm0eU1LiZmjWZUSkmpPW4dpGOM8pFSi1Kr4awsw03UFrmpmS4GuyzqaZWtx75CkozevUREZ7ezM8gvkDrcaFPrOD33mm+n53TWucNPam6eqhtxlSm3TShtKjsM+0wEpx6xuxyT8J1BXKPgNpamnMQwkOIM0rQp0iMjI9uzwFieK8N+hyxB6Tj+iLrOf3lo3XafX+kOP41puFsK47wNAYdYjxWZUmXUOcuo3Ndba739TqpVvW3fYNpjKhULCXJTWaNBtYgNRnubJkOXdK8o1klKnDzuvVulxD2BGZt6bWKVWIPpKly2pULNXwlpRae51t7hs7RV0/HmDKrPKl06uQ5M1R2tstupzX9X2L/NMxzJXOn/AOjr/wBkO97mqec6BldYmT8JSq3t0+sXdmMBiCTh2ZgfAkPCuivFLbvSNxU/CUu+tq/Setsu48UhUE9MVnFGHsOqZTXKkxAVIu0OcLJF9mV1vf1iCJOLMNQ6lHpEqqR2qhK0+bRVOFe5rHa1Z33nwHM+XdiBPjYUpNRmMxHJVSbbkPrUhOkwvo3n978Gi7MxisByKz/1PwthTELLfOsN8+itve2zzR1xj6SUfg1ezkBBPTQzWK/6v9hfvEOaABdcZ1H3TTeUj+zJXkr9ggUv1vIhkgAzd7/zkrSfw0upP9ce+kf7Q2KkAStP93+sqe0v4hvRf7SwUIy+IYAEiV0@EqF8ar6P8xWgBrVfcPHuz/4yr+r/adDw98S79Iv2Dl/Lr/YqPylP7DE0AVtc1Fv4/SWHId94bH5Q/8AvjnHJF8pFU+pl/x2xtwA7GfyS9x9961c/IpH8Mcf5IevWP0f/dHQwASR2z309JzJ75Wmfyxj+EgXuKflbpH1TP8AujYABUZ/5Ti73ydw/wC+pX+UijonLT96uEfqUfwGxp?cTMZjr5KsMfoX+VeHO8JffVQ/wC8In8dA7uACh/imHxN8s9E/LaX/FbFRyJfKdQv0v8AycgdP?hTC/0gvv/AP0GP+84Ov8ALx8nE76+N/FSM0AFRM0PIf8AJjG+sl/xFDkvJJ8rLn05f743IAEEpf6S39p4f+okfvti6mf+QmG/7tP/ACcs?CCf:Z%iVBORw0KG;)NSUhEUg?AG4?ACCAgM?ADasxWR)DFBMVEX/6Nn:/+VlZX29va5ksB5)SElEQVR4AWPACZj/f0DmjkqOSjKtQgcLyJccZiEE9SOmP8mXHEaBMBoIo4EwGggryJccvvVKKAogTnJUclRyVHLklgmjkqOS?LWyrsxEHLD)AElFTkSuQmCC%iVBORw0KG;)NSUhEUg?AL4?ABBCAM?ABYbu5j)MFBMVEX:/+1wv+jqv9siv/p6:W3f8zZv9gb:19v9NK/8zAP999:S:8z:8zzP+z6P/0gInF?ABg0lEQVR4XtXXy1ICURAD0H7c96D+/9/KQqkhlEKD0iTrWZzKYtJXbou2s+jvn1Q55f2mfAMOb6Ec5D6+c/ObcvOdm98qN9+5+a1w842b3wo33/6Dv2H22g3zCL+PKF/uSKDsGL8pN9+5+U25+c7Nb5Wb74R8h+ki41eYLja+Qf1k/AL1k/HF4XIg4ytMFxl/X7/z8aF+Ov6A6bqR:FTnswXa2B96LmyPZtfoH4yvsDlwMaHy4GLj/Xz8RXqJ+PD5UDGh+ni448O08XEh+lSrtUVnC6qm+ey/krGx+li4+N0sfHh7Cfj43Sx8bF+Mj5OFxkf67c8frF+jJUovzRIBr/4+kovMb5YPr/OdcrUGL9k8FG/Tw3xxbP55/o1R4hfk/m6IBbii+fyJ/JnjK+5/HWRGuJLfzG+xvh6lX89f8m3GH90ar7Ya/FrkF8y+XNhRpAvlsi3+H8fUxP5A+svYb54Hl8Uy4/zNZEvCvo4XzyRLzrhXg7zNZMvw/o6ptsQpvDnE+wJyVGQ5SG7)AElFTkSuQmCC!C%iVBORw0KG;)NSUhEUg?AJY?ACKCAM?AB/y0Mw)YFBMVEX::3Hh73KSn3Nzf7qan/+fn91tb/9fX5aWn4WFj8vb36jIz6kpL+6en:v74TEz5fHz6hIT90dH93d35YmL+8PD+4uL:Pz9y8v4Q0P8xsb8tbX5cHD6mpr7pKT5dnb11Thq?AB6ElEQVR4Ae3Y2YrjQAyFYZ0q7/uS2Nk6/f5vOTBIJA3pNHNhfIbWd2/4ERaIkldg5Gc3KNmKZ3nWFjwrMVxZML8wy7MyIz9bMrVB1gY8y7M8y7M8y7M8y7M8y7NYb/kc/+J3ZXmWZ3lWfICJ3/GnEc/yLM/yLM/yLM/yLM/yLM/yLM/yLM/yLM/yLM/yLM/6n7NSzqx8oyzP8qwjVVaAaqmyItRMldVDZVRZJdSJKquAqqiyBqiEKquBaqiyEqiCKquCih1T1gwzM2WlMAlTlpRQ/cqU1cBUTFkXmLgQZeUB5pzxZMmIh3Fa5WE9zlOVXPfJyvAsHMbm46Meh6KM+KvcIcs+euO8U9YS8E7YKUsSvJXulNXVeOe4U5Z0d7yxyAvpplkmK/GtSV7IYWRL3WkIeOFc1Iu8cISKsrF0SuqijAFA7A9Dc69OSyrfaGHdwmSGKoXJCaoQJleoUZg0UHdhUkBVQiQNUDPlHx9SITJSLmIboBLKPcQiPDKYg/DIe5hKaKyfMP3KUzWAcFj5J2BunZBoS8DEVkhcIh4uwiGv8eQuHE5nPPkQCu2AL1WdEEjvAc+uwuDS41mchEB6wxdFKxS+ZIV@ToZzGERGjeoeF0JL6z6KDxsXLdFyGTAYRI+9aUTLn8AHeMh+Y1hhGE)ASUVORK5CYII=%iVBORw0KG;)NSUhEUg?AMg?ABJCAM?ABPapnR)MFBMVEX::9amn+z879o6Lx:rj:T/MTH95OP/9PT8ubj/?Dj0cTR/+3b6drx9O/W9ORYTpHN?AEfklEQVR4XtWa23KzOgyF0cFHkvT933Y3wa4QQYPr/RPqdUenhnwjLUUSmYYRs6tinqaQiACAvoVhIAp3q3KOHwmyFsQhMITi5pgf5PNWfoho3ETMHARDBGNxOGZOeU+kAqgOMLyFD4jC3+TIuAZRAWT2u+iewkUcjr8vJa+Alg+PSAQ52iCPbIniBT53yyVUjHDALiCYTflwFQcpSyiZFqH8F0g0R/TCcQjinOOV16HKX0HiKocKCDTB18sC/yVOCwk+XberZ/Vnwt+AxGIHd1vfLIDUuw+IdUBQAtJxSNstVhL6oNVZZ1bqSUcqkSqhkkLuPwhSL4ttYzu9HEKpZpowf84iTmc7TD1ej9IjsMq5HKTDdq5Uu+fTEgG8qh2lWAF4Ub0MiPM832/O8XL9OuLLiSOL0K9AgiSQAYI7cwJv5gTAdbSdThFauqdJnaF4nO19XrdB3hs69HkrCG8pwuwrCDMjGF2Dne19XhcQjZjf5p0AeUc+bUCYudzb7fYPEA+yferyugnij8MhoZN7O2YuaTszP4RDRKd43W4TCkd9VFJjCxHIdeQfEHeTdhT5sR/DeIrXBUTHitSYIBwwF+ZINURUQJ4cTkCkkgPGZ7mrIU1lU+LcnVYq1EAbpQ6vC2K+qz9XDj+r707d5jxju/JF5YC707cmSdfcIGrxup1ZBVzTwdf+V04J3eKmAgA1VYx7C/KBsMXrZvFNe2MCGN3qvC4L9ebelxAKSNq.AtIaPG6NdnAbpTibu3TIOWvRf6+sbOA6LWBLd/mdVcDonvfec82YToGkTgJogkScoPgf/Xwu3XsfabxqjDUI8JB+4/ll9zta/4WFtWn4Eahxes3xZF8Vk7X1D5ajbLXHCFXgfHYg2y3ZaeEcEiZz/BlPJ61oZLEbw2I0laZg5M9sTbOxsyq2ixCTFTQhGP7hBzZ6c9bj/iwCaz0Im7RDwi8FHrHXL2bOzIZPKw0lAobkMTRSQDVZOa7utj2veTBFypJAXDrFbGHH3njAOtlYersYv/Jbo5CiZ6E76DKp7cSAMcB6e/hNQjYGPptxWE7BGGzLZTqSyfM6y17eA8pKmjVDpmLe3swizZDfw+vsz5ssl5eN7aDeCDsWHueM68frYgdiwlpLcTYuWU7a15vX8eG9i3bwYET5vWmJ6h1XfsB/8ndXBdIf96et5vrAGl37RVe7wexvY7Xet12YejYqF/odfu/U6NrJx3uxlPhBK8b8YMO117rdVmr6OkpjeR14RaSKFv0Tte2nwr/lt7pgY9WrzbYKQikYLn2Qq+L9JYqeOl25zsv5sTy3gqNbvyDXu/9vY4WfsLr/fTtIwn2e91umPvp+0nwb3pdxBoFwQL5q163UchvIYBSOMHrZ/8Q97XMInhKZkRLnV4fTLbXB5M9HI8lu/kbTHYdHU66vY5+zMyyB57BZM87Y8j+oe+YAZF+geWt10gOcYvqUpleAul6aCxfGO/XB+CwRrUBODrmG4/TmCDTBGsMiqM1V1J1vVDgNJSYy0yzCJGIEH8H8R86J7+C+8H8W)ABJRU5Er@ggg==$/9j/2wBD?cHBw@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.n/wQARCABSAJgDACI?RE?hEA/8QAUw?AQUBAQE)))?AECAwUGBAcIE?CAgECAgUKBAUF))AgEDEQQSBRMGISIxQjIzQVFSYWJxcpIUI7LSc4GCorORocHh4v/a?wD?AB?I?D8A+k?QUUjstSpZex0rWPEzYj/AHKW3pDpYdaqc2s04z5CeVj09r+wy/SHiv4m3lVN+VXuhZjxz4n/AGFJouu+v61/UXum4Us1cy7dmV3bO77i/wBNwhZq5t27Mru2d33HsQDWnrCCiKDA8BBRB)?B?UB?Dl1utq0lTW2/0rHe8+qDzvW8b1upZtrvXX7CM0R/P2jd8T4emtqhJna6ddbejr8qJIZp0XDtI6stcLsaGllWXunb/cWektorWJ5TXXs23b7MfCWuiuopWJ5TXXs+3b7MfCZfo9xS+NUlL2O9dk7drM07Z8M/cehHnvRrTLbq2tloiKu1C7utpnqXC/CeghxWE5+EjHYXft9YcXhPxGEjE7F37fWKAgFYVQkmT6S62+pEorjalsZZ473+A1cnNqNLVqOXzU38t9y+puz3SdOmtSu1Xdd0L4f0nVpbUrtWx13Qva2+/wnkt2mtqhHtSViyNyTPijdjI7Refr+tf1Gp6XRHMoxGIirq+5jLaLz9f1r+o1VF03afmTGNyt2VNbRfN+m5sxjcrdlT112xIisMvkhRzJQuVMhC5U7sjjnVyaJGTBFMDgEyGRo3AomRstAxnHRA6IJJYZLELORS46EHwh07zIcS4PqdXfbbDoq96QzNlsL6Mbi312vTTV7265mcKvtFLqekaTW0Uo+9oxltvZz8ix0lWoWd9K9/Z3N3FloqdQs8yle/sbm7ig4VY9Wtq2TMTzFiflLYaD1Xcee8B0DWXxqXjCVzlc+J/D9pvUkdxZla2IjvVNrN7x/GGVrViOuVTaze8nAQCoKUUbgeJgMhkw3S7zlH8Nv8jGW0Xn6/rX9Rqel3naP4bf5GMhVZNbq8d6ysx/I1vD4zo64j0qxseHRnRVxHpVv1HsN6nBnrKjg/FtRr9Q8WzEKtbTCKuIzuX+oubFxJn2paluW+3MLu7PvM81L0NyrNuYVW7PvJEc6Fcr4kkVyNkI2TJ37ys4nxRNFVme1Y3m0/5+k6IcoOI8KnU3pbzJlZlYeJ8ER6iTT1VzZHNnCR2vq+Ek01NU2Rzpwkdpvi+Ey2r4lq9S0u7vt9Cx1IvyUuuj2vtl2odpZZhpWJ8Mx6jt4r+G0+japa0WX2rXG1c9TZ37vKKzo9p53vdMYWI2x85Llnrs0tk8pa4jsp+4uWeqzSWTFS1xDbU/ca+XmRmZCIHwkyU3VBTdUFXr+HRq4jLyjLGI9MHFpuj1STE2PNnwwuINNsJIQkjV2qmxbGiCWNbaqbFsaI+EhrrhIhVWFVeqIjuU6kgFQm2nGzZOF3yKAoERAOKfjept0+jayp5Rt6rujvxO4uDm1ekr1VcVW52b1acdW7HoJKWVbK2eMpDKzL7iShlWytnjKQysy9/UeSO1+pfLS9jt6Z3TLFzpOjWruxLryln02dU/Z5R6DptFp9NGKakr+KFy/wB89o6S1u4w2NtNa1x7Td/2lvdxp8baK1rjws3XP2lJw7g1WhmXV3ssZNsz3RifUp2WKdswRMpWzc7tLvO6Z8RWTe7vL2NumfEVzKN64Ot0IGQlhokmhokj3SQ33rUjWPOFWM/9E8qZDj2rmbIoWezX5X1/+Tq01POshfR5TfI69NRzrISO7ym+RBEXcT1OfDH+iJBoq9XpaJr01U7myq4j1y2MyxQ6TitWlohKa99rdbu3dn1bY8KkPDtPffq67YreVixWaYVsLG7JY3U7obf+VTUv5S7sbp9pizup3Q2/8qmpfyl3Y3T7THoCITqg5UJdpnWYzTOMhB+0dgXAzJFLDRwCjRuRAFAQQ))QbMDxBRckMqRsh04E2joYfDHHKGTu6P3anU22NMV1tY/X3y0bvQsG32jdp006p6ZmUnEyu3cdVGrspmZScTK7dxQ6XgOkpxlOa3x932F4lcLEQqwqx3RC4gkhR2CO297Jy7M31ENuossnLszfUIOAUgIMiCgAgg)))))gCgAo0BwCgIAo)CC)))H/9k=%iVBORw0KG;)NSUhEUg?ANI)9C)AD94GjJ?ADQklEQVR4Xt3awW4yMQwE4P+heLq8VJ7HZ5/nOtf8DS61QIFJCt0I5kKlKM1+8tpit/3XLiEBd7cedwfYVG63kG1/WpAIt0H8PosYb8G0Cp7Bi0nJGcRHqNT8GsWrQ19L4ggijpM7ZGD2d6Rm6ya5Q5foWJI26R2qRAeTtMmliaJEf0ty01kmmSjRfhKWSRAl2k5y0QxyR248ggTLeET0RpDWu4lmh5HcAbJlCElyAPzZROi5DDuKRMq5dHsm2WQNMFg+inQvy2dStN9+EkS3q+YfcHeTKEiqTKJK2EBqgiR22Hgtq/4eJH9A4u0A3X3j4QlSehOwh4Rfk/yccaflQ+XuIc550t1nb2RBDiHpiazDCwg9Q7GzbSPR1o9EiHAOR+Rw7iHBfnffdVAtp9OpfOXxLs8cQKKbrY9wdpGjgyJtluR/QYI9SlsoUj1NkvATdx5NmjsQWSTrQFVbRtBzNIkr4w5fonoNsO+CfVu/f4yOc++fxdrtQrRk8QvAajlvsBaJX1fLKRjlfGp8SpLPipJUNOk2UAs/HZr6SJDqComzjRQmlG6qWCRVtVBPpUSdxqRYwJcRkmSYFQWpA84qihsPjdF3/aOohUgNQ5LKmRwWno8qLxkPud27qZwi/pBkeYXdLBauCp56XnVW3H9TJIMWJQm0GioqkiVJLbQYD9ckC07OhzJNMmhRmtgZHVVfSArP@TN1JmYJJkUJSlqw1eSAlfM6l2Sd6x114XEqwDDMmmRhWiKRHKWlM01IKXQY5T/Exe6+Nre6WZdVHM+tNDZmJQyRcIdUjZTSZJ+ujDO0Xk+PFLytIggyRsvBkQdkALdlz1JyoRJUV5/PlvYkASgWwCsjYcyIOUhLUmqANCicHtM21KZ8Pge9xSJtWuqlXukFt4kyTL5VI1W4hlne0WilZKkX+Rp0WZStNIzJKhv7Mc+1UbnrZCUaAHz+tcp+QVipZeUaCspW+mJiQd77pL2v+Y3vFi0/524cV60n0RqUZK0aD+J8XwNkg/+om4Pvv75newjDS5PPAPCprKVpMOPI3l7JxJmSPw4Etqnkbx9Gsnbm5Fc33XvRmpU/yf+fqQewsX/5r8bKUIiZe4A21vmP24hqdv1SRFy)AElFTkSuQmCC!