["c# list","","37 C# ","A+rwsrrfz.Y88A(CST~~}T~~PF6666669666666F(BB)CCkC()BBCXS}T~~}T~~","List, equals."," Two Lists may be equal when element order is ignored. We develop an algorithm to test for this condition. There are many possible approaches. We want the simplest. We look at some research and develop a C# solution. ","Input and output","\n\nList 1 contents: 1, 2, 4\nList 2 contents: 2, 1, 4\nEqual?: ","True","\n\nList 1 contents: 5, 4, 6\nList 2 contents: 6, 5, 4\nEqual?: ","True","\n\nList 1 contents: 1, 2, 4\nList 2 contents: 1, 4\nEqual?: ","False","\n\nList 1 contents: 1, 5\nList 2 contents: 2, 5\nEqual?: ","False","\n\nList 1 contents: 1, 2\nList 2 contents: 1, 2\nEqual?: ","True","Example."," Before developing the solution, I researched and found a variety of approaches. One solution copies both Lists to arrays, sorts them, and then loops over the elements. The best versions use Dictionary and compare frequencies. ","Here: ","We see a generic method\u2014it receives parameters of a caller-specified type. The syntax uses the angle brackets, < and >.","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.6\n\n","C# program that tests List equality","\n\nusing System;\nusing System.Collections.Generic;\n\nclass Program\n{\n static void Main()\n {\n List<int> la = new List<int>() { 1, 0, 4, 200, -40 };\n List<int> lb = new List<int>() { -40, 200, 4, 1, 0 };\n List<int> lc = new List<int>() { 3, 5, 4, 9, 11 };\n List<int> ld = new List<int>() { 6, 6, 100 };\n List<int> le = new List<int>() { 6, 100, 100 };\n Console.WriteLine(UnorderedEqual(la, lb));"," // true\n ","Console.WriteLine(UnorderedEqual(la, lc));"," // false\n ","Console.WriteLine(UnorderedEqual(lc, ld));"," // false\n ","Console.WriteLine(UnorderedEqual(ld, le));"," // false\n\n ","int[] a1 = new int[] { 1, 2, 5 };\n int[] a2 = new int[] { 2, 5, 1 };\n int[] a3 = new int[] { 1, 1, 3 };\n int[] a4 = new int[] { 3, 3, 1 };\n Console.WriteLine(UnorderedEqual(a1, a2));"," // true\n ","Console.WriteLine(UnorderedEqual(a1, a3));"," // false\n ","Console.WriteLine(UnorderedEqual(a3, a4));"," // false\n ","}\n\n static bool ","UnorderedEqual","<T>(ICollection<T> a, ICollection<T> b)\n {","\n // 1\n // Require that the counts are equal\n ","if (a.Count != b.Count)\n {\n return false;\n }","\n // 2\n // Initialize new Dictionary of the type\n ","Dictionary<T, int> d = new Dictionary<T, int>();","\n // 3\n // Add each key's frequency from collection A to the Dictionary\n ","foreach (T item in a)\n {\n int c;\n if (d.TryGetValue(item, out c))\n {\n d[item] = c + 1;\n }\n else\n {\n d.Add(item, 1);\n }\n }","\n // 4\n // Add each key's frequency from collection B to the Dictionary\n // Return early if we detect a mismatch\n ","foreach (T item in b)\n {\n int c;\n if (d.TryGetValue(item, out c))\n {\n if (c == 0)\n {\n return false;\n }\n else\n {\n d[item] = c - 1;\n }\n }\n else\n {\n // Not in dictionary\n return false;\n }\n }","\n // 5\n // Verify that all frequencies are zero\n ","foreach (int v in d.Values)\n {\n if (v != 0)\n {\n return false;\n }\n }","\n // 6\n // We know the collections are equal\n ","return true;\n }\n}\n\n","Output","\n\nTrue\nFalse\nFalse\nFalse\nTrue\nFalse\nFalse","In this example,"," TryGetValue is used instead of ContainsKey. The TryGetValue method eliminates extra hash key computations. This enhances performance and yields a method that is faster than most. ","TryGetValue ","trygetvalue","ContainsKey ","containskey","UnorderedEqual"," receives ICollections and checks length. Two collections that implement ICollection<T> are received and their Counts are compared. If the two parameters don't have the same number of elements, they cannot be equal. ","Note: ","The Dictionary used in this method is for storing each key of type T and its frequency.","And: ","If a specific key is found once, its frequency will be set to 1, for example.","The method places"," each element into the Dictionary as a key. If an element occurs twice, its frequency is incremented. TryGetValue helps avoid hash computations. Each element in the second collection is decremented in the Dictionary. ","And: ","If any value goes below zero, we already know the collections are not equal.","Final steps."," It verifies the keys. The method enforces that each key have a frequency of 0. This ensures there are no extra elements in the first collection. Here we know that the collections are equal.","Generics."," I don't normally use custom generics. They add needless complexity to small programs. You can rewrite the above solution simply by changing the arguments to int[], and the Dictionary and loops to use int instead of T. ","Generic Method ","generic-method","Generic Class ","generic","However: ","The implementation here will work on both strings and numeric types, with no code changes.","Summary."," We saw a solution to checking unordered elements that is a generic method, which works for both string and int. It uses a more efficient Dictionary syntax that avoids excessive lookups. ","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?ALs?ABECAM?ADuirSU)MFBMVEX::V7/mWn6Gi3/N6enrg4eG75/a3uLjy+v3Iycnp9vuc0eOYxtaQtMD4+Pj5/f5J+Z7p?AC2UlEQVR4XtXZ646rIBSAUfaF60Xf/22PR+xkpBurHW3x+9mIWaGkhKJOadBaq1vmkf9n78cfkB/ZG9K/hfeN9gKQf+c/audGOwGa1w03stvK7m9kx8pub2TnKrwMqq2+eN6RjLsEzsz64vWeiQjOdQ8z/AK7ruyRzsUPvsAP2aF0cOKR5uDMpXLcTqVj+yrT0niOHXnT7qe4Kk9Jdhlv+RFGWoJr7ELSnIt2OY1Fnom6tssNKSX6nbnOHsCdaleG6CP2AEQUzrVDZYcmJ2g9vGsHIjrNrn9KpUglJz9uFwz6UL1gEN+9tuc0F8+xc2nf77tfSWxY7WxamnO5fKndjOKPUZW/0g5T79iNE+gCwip/mb0AjtoNKIku5fuyh9aBXAy7sisxz636t/Mt7GHOba92RHyyh9K4ww5hzp1tpzmzuWQSTUWsPiuFHXYqwd/siHjcjlSKuGm3zy8vnWEv4Vv2ErbtJfm7+aKdIy3FG9h1Y8US9m8fuA6LI+VHsVe7sswSv6pPu2axnEz/dmW5kQ3Qu31AbuvNQbspvbKvXEfsB/DszU579cyn7Gqw3Aw7tpc0tvF927f1CEuuV7syMeOLs0e39kBTSfLbXu0WHyUqPfNdR3aZYA0txUofwV1kl13H7ax/8IlrGKg6u23XU1yVSlrr0+2soWknM27+v5BrO+9LdrFU2rQzLtso1nYB75/XQ8z5S/YSTnFV3HHg4ozM/E27nLivaq7r0Z7FC5NwC3vjsgI7sheLOEa8MbEd2ZOMz63DR+jIToQiXbbLE5/hSntByHbK0gDZLp+38rwLOIDP2pGo1mOmVe7lMT2TAWN+XcjRnmr75uCwcYMcMyIzYs7x9duDRf4Jc6LSt+ztQEmF1e1tr/Zx886/C7shuaDkoCN7gNaKkXMd2cf2TMpBP3ZJY4JqN5pe7GbmwEoOajsQ7N/MzZuMMQBu18NUmocEda/G1fXtP47JaK+yvhpR)AElFTkSuQmCC%iVBORw0KG;)NSUhEUg?AG4?ACCAgM?ADasxWR)DFBMVEXZ7::/+VlZX29vYl5th1)SElEQVR4AWPACZj/f0DmjkqOSjKtQgcLyJccZiEE9SOmP8mXHEaBMBoIo4EwGggryJccvvVKKAogTnJUclRyVHLklgmjkqOS?LWyrsxEHLD)AElFTkSuQmCC%iVBORw0KG;)NSUhEUg?AG4?ACCAgM?ADasxWR)DFBMVEX/6Nn:/+VlZX29va5ksB5)SElEQVR4AWPACZj/f0DmjkqOSjKtQgcLyJccZiEE9SOmP8mXHEaBMBoIo4EwGggryJccvvVKKAogTnJUclRyVHLklgmjkqOS?LWyrsxEHLD)AElFTkSuQmCC%iVBORw0KG;)NSUhEUg?AII?ACKCAM?ABRjmKi)YFBMVEX::29vbq6urw8PD09PTs7Ozu7u7y8vLo6OjmnP7suv3no/7wzf3+/v7uyfr8/Pzw4vb5+fnt1Pb:v/t6u7z0/788:18ff9+f7q4u345/7r4O/+/P/m5ub07vf29PZvdKUE?AC00lEQVR4Xu2b2W7bMBQFfblp974kXf:L8vIMCzyEKkbmIdAzXnOw+Bw4ICCtHoShzHBtpnRSzarXHzrkKG98nPJlE2h75C1QgedzeCtS/BdoUO+czh1SK88kYJaZWPokL1CB+HGeASFnDGuUzFaCw7sGO3N4a6w48ZoLcygVtQfhb0NHUrE6GaH5QwtOUbtIoesMQ4dstXeIcyB/cuoPxRcMIMlx6g90VHki/GcilHPBDPQY0SHJpvBj2SMjb6yUMgX4zYVo2maeAZHjtGgAznGi7k73BTyxTimYjQGZjDkGA04KHaMZukwK2hujCcxMAM7RhGYgRyjeKIZ2DGKwAzci2QvAjPQYxSYYceOEWegxwgz5IvxkI5RYAZ2jKhg6DHCSdBjhBmaiXqRXAsqyN9PdPgiXYrhc95vN5vFjX/joyLyHt71X12hfXUFVRWqQlWoClWhKjz8b+rc/yspgf4xjvqOm7F285ynGoNEGA/3IjkmDLgXye5XQoF7kewTBsJ+qoEKj1b2P8dYYxQYgR6jlI9Risco5WOU8jFK+RilfIxihB0jUDxGKR+jlI9RDPktNkHKxyj0GBFyjM8Z4fD2GKkY9xfk7TOmadrEBJXVR5/16WtVqApVoT5xqwpVAQxeU6FNKJxPCcY7fYcMY8B6ZgTwjy5mQXNl84WLJL6mUPYRm7lBfs8aDZpSLw4tTpV8kfwtM0FX3IvkGibQWkrEuBDwFIjRhO+3smOMJ/DsyDHGE3gmbowwAT9GMHCOHCMcgnMNN8Y9TOAsOcYmnsBaR47ReIIJrDXcGI9hh/YDdoxooMkxhh16lCLHqOMJlLLkGBsdGyjD/VB0Gx+ChxxjPIGHHSMatMKN0aGBIsc4CwQGLTvGyKD1kGOMM/A4dowuNqDHiAYtOUYvEBvQP6EHA/ZXyzeBhYElxwgG/E/oZ4HAgB1jbOAV2DGqUMAbPC3GPzZST8eWeJrK)AElFTkSuQmCC$/9j/2wCE?gGBgYGBggGBggMCAcIDA4KCAgKDhANDQ4NDRARDA4NDQ4MEQ8SExQTEg8YGBoaGBgjIiIiIycnJycnJycnJycB.gI.oJCw@Cw4LDQsOEQ4ODg4REw0NDg0NExgRDw8PDxEYFhcUFBQXFhoaGBgaGiEhICEhJycnJycnJycnJ:BABEIALEB.MAIgABEQECEQH/xACP?E?wEBAQEB)))AQIDBAYFCAcQ?EDAgMDBwQJDgwH)?ABAgMEEQUGEhMhMQcUIjJBUWEVcYGRIzNCUpOhtMHRCBYXNlRVcnWCpLHT1OQYJDQ3Q0RWYoSio+ElU2Zzg5KyEQEBAQE?gEFAQEBAQ)?AQIRAyFBEhMiMWFxMlGR/9oADAM?AEBAgEAPwD+/gC4AEXJ)ARc.Rck)))?AXQXQABdCLp3gALp3i6d4Aki6d4ugEgXFwAFw)/l3KPywfY/wAcp8G8jeUdvSsq9vzrYW1ySxaNGwl4bK979p/UD8v/AFRv270H4qh+UVQHoP4TH/S/5/8Auh/cMBxTy3gmGYzsth5RpYKvYatejbxtl0a7N1adVr2Q/CJ+3cifaRlr8VUPyaMD0RFyCuoDyPKPnr6wMEp8Z5h5R29Uyk2G22FtccsuvVs5b+1WtbtP5h/CYX+y/wCf/uh936ov7SaD8aw/J6o/MoH7L5Oc9fX/AIJUYxzDydsKp9JsNtt76I4pderZxcdra1uw9ih/HfqdvtKr/wAaTfJ6U/r6BLQkoilrh.RcATcEA.QAJKv4Fir+AT8q?hYIcSQ4JipFwpRVBavcs124xuTqCtrdFLGKONUUkSWTgVLJwCKkABAeVzJyd5PzbXR4lmDDeeVcUSU8cu3ni9ia50mnTBLG3rSO7Lnqjx2aqysp8RiZT1EsTFha7TG9zUvrfvs1fAD532E+TL7x/ndZ+0Ht6GipcMoabDqJmypKOKOnporq7TFE1I2N1PVXbm23qtz+e+VMT+7Z/hXnv8Pe5+H0j3uVz3Qx6nOXeq6E3qoHTqMnOPyNnLOGcKbN+P01NmDEoaeHEqyOGGOsnYxjGzva1jGtemlvchXJ+cM31WbcApqrH8SmgmxGjjmhkrJ3sex07GuY9rn2VqpuVFJS/UOYst4Hmyijw7MFLzykilSoZHtJIvZGtdHq1QvY7qvduvY8z9hvky+8n51Wfrz2kki36PrJjY53mIt/i8x66+fl3L2BZUopMOy/Sc0pJZVqHxbSST2RzWs1apnyO6rG7r2Pstm8CGwp3krG0p3SZMtElb3l9RyORSWSLwXgUnk9puPmOwm5iji9zWVnYvcXK3FyULXBW5NwhYq/gSQ7gE/KoFlFlIWCri1lMJXr1W+ki2SJzO1LnJ3mauIRjiVaRm2mpIi5NyCFRbF1GiGzV3IfP2qsXwO6NdTW9yoRLKtc8a3LpwQzRFNE4Eq1IACA8fmqjq6jEIn09PJKzYtbqYxzkvrevFqHsDNxHU8fzfyXiP3JN8G/6D3VCjo6ClY9Fa5sMbXNtZUVGpfcdD3mDpDO7aTD8r5uyZmiqzXjtVT4JXywz4hVyxSx0szmPY+d7mua5rLKlluioZ5UydmikzVgdTUYJXwww4hSSSyyUszWsYydjnOc5zLIiJvVVP1RrMtS6h9yJ+20YzWvgdCO0+c+FmbM9BlHDosRxGKaaGWZtO1tM1jn63MfJv2j40taNe08szloytf8AkWI/BQftBft4rbOv6Nd/epVyu8T5uWc0YfmrD5MRw+KaGGOZ1PoqGsa/U1rHrujfIlrPTtPquchnuLZvWW07yF8Crk3hFM51p6bRuNrnK1TbUbYZbbXFzPUTqQ1UaXJRTNHFkUIXuT2FUUnsIAXBVVIqYrI/du4qYtbv8C0i7yL7jHV7ffw1k5PXylz04GMj1snnHaZVMiMjTz/MpF8nJVpjtk/adoviSkyHMyobf6SZU3a28Bnydnc3vE3xe+Wcbys1JqadNOvRb5k/QcdM/Umnu4Hexu5PMht6vNT5Za7Pxvw3QsVTgXLMwABCDCRxucshTdXxGEjznc8vKczji3quzGZxfUTF1k85n2msfEjOvadT1XjuVuHb5apGW/r0a/6M5/IYMM39U/ReNYDR5hoo6OtdIyOORJm7JWo7Vpcz3bX7ump8ePk3wKPftqr/AN4/1R3Yri1Pbg5M6Xm+Xqhlv6293+lEnzHsWt6XoMsLwanwemdS0ivdG56yeyKl7qjW+5RvvTs0LfgZ6x+TTOuZ4zchWxqpVS0z7PqVsXQrfwGo0zFLWlybmWvwLI4sq0uWRTLV4F9QGqFuwz1FtW4g4sVUa/Apr8CulpKo7iUdwJc/fwKajDTaRBzVvtSfhJ+hToMKxPYk/CT9CmPk/wCNNPH/ANz/AF88709oXVx0/Mc8cSX6RvI9NGjt7Svg/GW35jTy/lZJ/wCppE6foPoo/em7sOSjiWyvXzHR7tfUduLzx/65PJy7v8dbF3IXKNTchc0Y0?QgyeiW4GpRSulsuV7G9yeoyWNnvU9R1OapTQYaw2zpgkbPep6ijGcDr0EMjK/b/S31/t5/Ns9TT4XA6lmkgetQ1uuJysVW6JFsqtVNx8WhqcTfbVWTu/8r1+c9FmqknqcPgjp4nyu27XaY2q5URGP32bfvPmUGHVbETXTyN/IcnzHTiOfV7XosIWXmrtq9z3a16T1Vy2sh2OQyoI3RwK1zVaupV4W7EOhxPESslQzebKZPJ4nrMheJKqVuSBZOBS/gW7ALGjeCGe/uNG8ECVkLrwKF16pFIqUc9C5k8z00zxi+ZvcplzuPud8X0lpGqckka7zj8m9x1Yxiz26Fqo+53xfSYz1DZGo1qKi38DC6lmuQxvl1r1bzrSePM9ydeYzfT5lqko/rfWXo7XnGxmbDx0aL9Nmrgp6jBaSr8m0TK/VzhkESVGp2pyyIxNd3X3rq7bkvcvR2a952RTu0N0pvtxXvNcXPJNXv+ftl5Pq7bmc7/8AHW5zYmo1voTuJgbv8O0wijfI7v8A7yn0GMRjdJ147u+56jl3zM5+7f2shIBsx?AK2LADNWkaTQFfpW6ppGkuBxHWU88VLC6ed2mNttTrKvbpTc268VOdmJ0MvUl/wArk+YrjTf+GTfkf/bT41HHuQsh6RkjJEXQv6Q4xo06LvR85uBmZvQ2UzeSlzqqFNTb8d5Z6IYs9tb6f0BLlxXHMGwJkUmMVsVFHMqtifM7SjlamqyL4JvNqjFcLpMMXGKiriZhuhsnPNSLFoeqI1+vell1JvPkZty3iGYPJrsOrYaKXD531OqeB1Q1yuhkp+q2SLgkrl9XpymyWrcguyRQViMvSpR89njV/RVfZHbNj2b1S+npbt3HtD7tZi+FYbh/lWvq4qags13OZnIxnsltG93f2FWZhwJ2Dtx9tfD5JcqJz7UixKqybCyO/wC50fOfKzRlSbMeE4ZS88ZTV+FVdNiFNUbJZIdvTIvXh1tVWO1Lu1f7/TwvBpKHAmYXULSTzt2knsdK2Gl2r5HTtdzZjuDXuv1rqu+9wNcJzBgmORSzYRXRVsUFtq+F2rTqRbX86G1FjOFYlh64pQ1kU9A3XqqmuTZps77S7uHR33PmZNy3JlXL1Ng0k0NRUUzFj53HEsW0bddntG63qqtR1ut6jlwvJT6fI1Tk3EKxJudMrI31cEaxfyySWa6Me+TqulXtIOvr4PmHA8wMlkwTEIK9sKo2bm70fo1JdNSdl+w5kzXlqSp5kzFKd1TzjmWx19LnP/J/C8D5eScjVWWKuuxHEcQZX1dXBSUbdhAlNG2Gij2MfQRz+m5N7l9W4+VByWSxZxjze/E27Xn81bUUsUT2slY5jmQNdqmcm0i2j+nbei8CvE/U9ZiuN4NhE1LT4pWw0k1c5Y6NkzkasrrtbpZ373t9ZXFMRw7BqZazFKllJTakZtpVs3U7qnmeUDk6rc7VjJvKjKOGmp1iombF73xyvlilkm17Vt7pEiIiIlu/sX6eacuV+Y8tR4M+tjhrNVNLUVezk0OfTvbK7ZsjmY9mp7N1pLonbfeYbzn02zvXt0+VcHlwtccjrIX4ZoWTnrHpstDV6TtXDcqbzPDcUwnGFl8l1kVXsUjdLsl1ads3aRr+U3engYZUy1Jl3Lzcv11UzEomOmRsmySLVFK5X6ZW6na3KrnandtzPI2U0yhgvkp0sdRJtnyvqI2Oj1I6yMa7W+Vy6G2YnS4Ihj9rFta/d3Of57febAvgeZzrkuvzOuHcxmhj5pttpt3Pb7Zs9OnQx/vN59XMGAOxpabS5jdhr66r7vTw3f3T7VBAtLR09Lu9hjZF4dFqNN/H4ZnmmPk8t1LL+nmsWyhiOIYZgVFBLA2TDKfYT63P0udoiZ0OhdUvGvGx7DDqd9JQUlLIqa4IY4n6eCqxqNXs4bjOaB8unh0b/GdMSK1jW+CJ6jojCtQAE))?Awq6fnUD4NWnVbpWvwVHcPQcseFbP+l/y/wC53vVWtXvM0ld3IBMUWyRd9/RYsoY7VcwqKhYno3dw7QNbFHHMtcvcnx/SdTVR7Gv98ifGgHO6Je/4jJKZWyI/V8Xh5zt0oRpQlLEt2F9CEo1AKF+waULpwIEFuwE9gEFXFjJxXVWzGb3nM95rIUhi20iN9z7o5d91eT5dGeSdvwiKB834Hf8AQbKyOPz+JeolVloYksvh2eCGaRaU6a7zXx5mbzn1X+st6up23kv6kNxZnWTzldxLesnnN2SlbSSVCpoc3h7pV+hTvQyVDOWspKdyNqKiOJ1v6R7Wrbv6SoEOtCSqFg))?ArJ1FOc6uPEjS33qeoDKFet6D5WMT7Kdv4CL8an2kaidiegzlpqeZdU0TJN1uk1FWwH@a5O89TRu10dM/30TPjahPk7D/uSH4Nv0G7WMY1rGNRrGomltrIiJwREAgqebdyhZP8AvknwM/6s2w3O+VsXrosNw+vSarm1bKLZTN6jVkd0nxtb1WqvED7xNi1kCpuAqSibiAE8WsT2FSHcAniVM3E7yu8rVpGT2mtKxG6neNvUUVptAm5TPOfyW1fx4xiZqkdJ28fWHIr3r3G7W71IVu8vnPJJ/Vbe3v8APTnVpDesnnNlaQ1m9POaRVjU4hR0j0ZUSaHW1cHLu/JRe44MYy/5WnbNzjY6WIzTo1dquv1mnXXYPTYhKksz5Gua1GdBURLIq97VPpIQqzfJGxem7fbuU2MZIGSrqcq8LbjY))))AVLFQPyLUYgu/eeh5LatZeUHCGX+6fksx6+TkCd/aP8AMv3k+plDkadlXMlFmDy5zzme1/i3Ndlq2sT4Ovt3269+qB/VSV4EheAGZIBCwQ7gSQ7gEqkEghZFi8faVLs7REfCwsSCyiioTpJJQBYWJAQ))))?AVLFQPzfJ9UBnH7iwz4Ko/aT73J/wAsuZ81Zww7L+IUlBFSVm32j4I5myJsoJZ26dc729Zie54H8Glcez5GP5zMD/xfyOcD9cheAQkClhZSwCeq2UhyLYuCE9ZWXuFl7jUDh9TKy9xZiLv3FwgLQEglVBI)))))?AIJAH4OkPbci/8AObgf+L+Rzn67AEEgAQ.EoBIAgEgIQSg)))?B:9k=!C%iVBORw0KG;)NSUhEUg?AGo?ACZCAM?ADw+V8S)DFBMVEX::09PTk5OTU1NQ/cPF/?ABzUlEQVR4Xu3bQarDMBRD0Xel/e/5w59m0FiNRQnWBg6vBidynVkOAJIAYLYEJF9j6VHxqly9Zxzfiig4T2jycpQPVM.4yiA4hCs0ebB8BMhWKRtlvxYFIy0w8J2x5JdsmR3LLwl1CSbmmQHy5RGNcmmJlk1yaYm2aGUj4ULUSblY9lvG2t6Fj1LU7M065b+k+/vrBcNpGxzIik0KKGGqDkRVQayiqaAGrJekVBDVCqIXjGI6ktEDTv7xHyyZrZQV0uzjxpWpZwaLtI2aliTcE4NK9LoG2pYkPiy1BFIITXclCboCGGClpUFL6QnqSaZySO3hpJLQ+HF9CRq59SqSaa0TLZ+XZLX05OIJLckEkm5dCRzpIUOVd8j+vsek6Ug1Z6E/af7qCaNay981KSR3Wo2PWl60hSkoOy2KE2NokZp3kjxQupQhzrUoUb3klAnJ/nVZYl9joILvRkUNI+8jjQwglawqWGpJtmqSbYqUm71i0i/M8qt0kiv3ssrKaxU/+9Eq0e59vvZzAvPHK0nqUMdih+m6O0W1T2wtVgqPq+6d3ryqDBUdIW3ZdVepM20LGpVhFrBolVQ1ardpnCYEEA5pgAKPiYvnDYCRMgfJbla10Up7Tk)ASUVORK5CYII=%iVBORw0KG;)NSUhEUg?AMk?ABhCAM?ABLV3W0)YFBMVEX+:/q:3j:zc:zy:7ojyrh7P3UiTj5:4d9+/3lB3ZNKX1nzP3Hbf1NL5Fvrnk8P7s7u3uwn3uftVy+vXx9PTr9f7d6v7m9ebp6em4f0hoaWm0/fnpyOvp5caVWYCLfXim?ACzUlEQVR4Xu3c2Y7iMBCG0S4vWdj3pbd5/7ccyK+O0zFIccUam0x9l0gldHDTEKnCW/ZJ1fCynEdVeNnM+w4zPFgymXd1GKGYHOZdPw4KCRaUct6DgKGGBgwoied/S4wBQw8NGFASz3uQy24xC2mxuxDhhM0dUuxXy5BW++LXvD7UYR10nwLINxxBlm8ig4i+4AiyfHXmP+vwPkHpHgnRBZBASnMqOBF?ilFO69rTpoIh9I5kt2M0w4SItovOe3b+QNLcsChdCVqwZIsVEMhUiuWZNXO17xUT0KkZrwUIbXkhfkxEoIEkDESUBRX0s6PkIACCSndAqwty9LagRINidIOMG8aKGnnmRKtnknK959Ky5HM/7TxJeuPpnESKJBlS9CcIQEExTgTVPIliCGBI6IEDZIoTxJyKO2854gqsf9e8hFNgn9aliUBBZ7EZ4L4EhdHguJJLP994pqPkqzXsSWWIwEELRmS9bquo0tmLImDzBkSaBL/dfmQfCSWI3GQlJIep2RIHCSxpERciYPcSyp5j/kZH10iknI2AQkgLy1x73Y7e1UJLyfh5SSMJioRiUhEIhKRiEQkIhGJSEQiEhopobwlIhHJdHYkprG3MqFdolj7XTRyv4si7HdNZ+ducnuQ6XdTTYTd1PT7wgbjwfPaPX8eO9yAgALL0NzzJ96rh8Owx918+nsdvFcCBb8OSe8/8R38VzKHe4LMcXt1bY/mR7M5d9u0AKW7qUaS9j4tZK69tgbAc6/CAK77GUASBvHVa9tIzl5FI9F+kKSmHB9IjjfIyYcUpxuEtB9BkpiyfSC5H0rxQLK5SZT2U1lIHkAaiQ+BRD8qA0kVSVK9lmQjEpGIR.ieZnPE/mMl+9dk/gujJ5enxSe5On1CSD5UQCpTPHkmlH1HMq8ZVLVu45vFwROXUtxah+nrkVRle2vu3AezxDDePy/TZKkv3nHL1n0R/wt)AElFTkSuQmCC!