MVC4 WebAPI(二)——Web API工作方式_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > MVC4 WebAPI(二)——Web API工作方式

MVC4 WebAPI(二)——Web API工作方式

 2014/11/27 19:24:26  BlueWhale84  程序员俱乐部  我要评论(0)
  • 摘要:在上篇文章中和大家一起学习了建立基本的WebAPI应用,立刻就有人想到了一些问题:1.客户端和WebService之间文件传输2.客户端或者服务端的安全控制要解决这些问题,要了解一下WebAPI的基本工作方式。(一)WebAPI中工作的Class在MVC中大家都知道,获取Request和Response使用HttpRequest和HttpResponse两个类,在WebAPI中使用两外两个类:HttpRequestMessage和HttpResponseMessage
  • 标签:MVC 工作 API Web 方式

在上篇文章中和大家一起学习了建立基本的WebAPI应用,立刻就有人想到了一些问题
1.客户端和WebService之间文件传输
2.客户端或者服务端的安全控制
要解决这些问题,要了解一下WebAPI的基本工作方式。

(一)WebAPI中工作的Class

在MVC中大家都知道,获取Request和Response使用HttpRequest和HttpResponse两个类,在WebAPI中使用两外两个类:
HttpRequestMessage 和HttpResponseMessage,分别用于封装Requset和Response。除了这两个类之外,还有一个常见的抽象 类:HttpMessageHandler,用于过滤和加工HttpRequestMessage和HttpResponseMessage

(二)解决第一个问题

其 实第一个问题之所以被提出来应该是和客户端有关,如果客户端的请求是我们手写提交的,比如使用HttpClient封装的请求,则要传递文件之前,我们一 般会进行一次序列化,转化为二进制数组之类的,在网络上传输。这样的话,在Controller中的Action参数里,我们只需要接收这个二进制数组类 型的对象就可以了。
但是如果客户端是Web Form呢,比如我们提交一个Form到指定的Controller的Action中,这个Action要接收什么类型的参数呢?
或者我们问另外一个问题,如果我将Web Form提交到一个WebAPI的Action中 ,我要怎么去取出这个表单中的数据呢?
其 实我们应该想到:我们的Action设置的参数之所以能够被赋值,是因为WebAPI的架构中在调用Action时将HTTP请求中的数据解析出来分别赋 值给Action中的参数,如果真是这样的话,我们只需要在Action中获取到HTTP请求,然后直接获取请求里面的数据,就能解决上面的问题。
这 种想法是正确的,只不过,此时的HTTP请求已经不是最原始的HTTP Request,而是已经被转化成了HttpRequestMessage,在Action中,我们可以直接调用base.Requet来得到这个 HttpRequestMessage实例,通过这个实例我们就可以随心所欲的取出HTTP请求中想要的数据。

2.1从RequestMessage中获取普通表单数据

这里的普通表单是指不包含File的表单,也就是说表单的enctype值不是multipart/form-data,这时,表单的数据默认情况下是以Json来传递的
如下页面

class="cnblogs_code_copy">复制代码
<form name="form" action="~/api/FormSubmit?key=11234" method="post">
    <input type="text" name="key" id="txtKey" />
    <br />

    <input type="text" name="value" id="txtValue" />
    <br />
    
    <input type="submit" id="btnSubmit" value="Submit" />
     
</form>
复制代码

捕获到的请求为

提交到对应的Action为:

复制代码
        [HttpPost]
        public async void submitForm()
        {
            StringBuilder sb = new StringBuilder();
            HttpContent content = Request.Content;
            JsonObject jsonValue = await content.ReadAsOrDefaultAsync<JsonObject>();
            foreach (var x in jsonValue)
            {
                sb.Append(x.Key);
                string va ;
                if (x.Value.TryReadAs<string>(out va))
                {
                    sb.Append(va);
                }
            }
        }
复制代码

这样最后可以得到 Json的值:{"key":"123","value":"123"}  sb处理后的值为:key123value123

 

注:在该action中使用到了关键字async和await,这些在4.5中新提出的关键字主要是用于进行多线程取值的,在MVCAPI的设计中,大部分的方法都被设计成类似于下面的方法

public static Task<T> ReadAsOrDefaultAsync<T>(this HttpContent content);

返 回值是一个Task,这种返回新线程的方法虽然可以提高系统的响应能力,但是多线程取值会给编码带来不便,所以新出的关键字await用于阻塞当前线程并 获取目标线程的返回值,在方法体中使用await关键字后要求将方法声明为async用来表示该方法是异步的,并且返回值必须为void或者将返回者封装 在一个Task中
当然,如果你不喜欢这种写法,上面的action也可以写为:

            Task readTask = content.ReadAsOrDefaultAsync<JsonObject>().ContinueWith((task) => { jsonValue = task.Result; });
            readTask.Wait();


2.2从RequestMessage中获取multipart表单数据
将view页面改写为

复制代码
<form name="form" action="~/api/FormSubmit?key=11234" method="post" enctype="multipart/form-data" >
    <input type="text" name="key" id="txtKey" />
    <br />
    <input type="text" name="value" id="txtValue" />
    <br />
    <input type="file" name="file" id="upFile" />
    <br />
    <input type="submit" id="btnSubmit" value="Submit" />
</form>
复制代码

此时捕获到得请求是


这里的文件内容被捕获软件解析成字符串,当然如果我上传的是其他的非文本格式的文件,文件会被转化为二进制数组
这时如果我们不更改action,而直接调用,会发生错误,原因很明显,这个HTTP的报文内容是无法被转换为JSON的,这时我们需要将表单的报文解析成另外一种格式

复制代码
                IEnumerable<HttpContent> bodyparts = await content.ReadAsMultipartAsync();
                foreach (var bodypart in bodyparts)
                {
                    string name;
                    name = bodypart.Headers.ContentDisposition.Name;
                    sb.Append(name + ":");
                    if (bodypart.Headers.Contains("filename"))
                    {
                        Stream stream = await bodypart.ReadAsStreamAsync();
                        StreamReader reader = new StreamReader(stream);
                        sb.Append(reader.ReadToEnd());
                        sb.Append("----");
                    }
                    else
                    {
                        string val = await bodypart.ReadAsStringAsync();
                        sb.Append(val);
                        sb.Append("----");
                    }
                }
复制代码

得到的处理后的sb值为:

{"key":123----"value":123----"file":******{文件的内容}*****----}
整合后的Action为

复制代码
        [HttpPost]
        public async void submitForm()
        {
            StringBuilder sb = new StringBuilder();
            HttpContent content = Request.Content;
            if (content.IsMimeMultipartContent())
            {
                IEnumerable<HttpContent> bodyparts = await content.ReadAsMultipartAsync();
                foreach (var bodypart in bodyparts)
                {
                    string name;
                    name = bodypart.Headers.ContentDisposition.Name;
                    sb.Append(name + ":");
                    if (bodypart.Headers.Contains("filename"))
                    {
                        Stream stream = await bodypart.ReadAsStreamAsync();
                        StreamReader reader = new StreamReader(stream);
                        sb.Append(reader.ReadToEnd());
                        sb.Append("----");
                    }
                    else
                    {
                        string val = await bodypart.ReadAsStringAsync();
                        sb.Append(val);
                        sb.Append("----");
                    }
                }
            }
            else
            {
                JsonObject jsonValue = await content.ReadAsOrDefaultAsync<JsonObject>();
                foreach (var x in jsonValue)
                {
                    sb.Append(x.Key);
                    string va;
                    if (x.Value.TryReadAs<string>(out va))
                    {
                        sb.Append(va);
                    }
                }
            }
        }
复制代码

 

(三)WebAPI工作方式

要想解决第二个问题就没这么容易了,我们需要更深入的理解WebAPI的工作方式。
其实对于WebAPI来说,它最初被设计为和WCF一样的:客户端、服务端两套结构,我们到现在之所以还没有提到客户端,是因为我们的请求别的方式来封装成HTTP请求或接收HTTP相应的,比如AJAX和Form表单提交。

在这里先给出一个服务端的响应工作流,让大家有个大体上的认识
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lBrZDhw4pd0JWVlaqa2tqWuvu7j5//nxPT09fX9/AwIAa1W7fvj00NKQsoH3yySfahKbNZtpIZpq7tKbnxe2Pavox5rc9TZG0LhFxvQ9erp+8UmIa3jRLcO53Ml2K/AYAgDljfjuOxJSUlGzatOnv//7vly5dqiyyrVq1asOGDfn5+cotkcoKmxrY6uvrm5ub29vbOzo6Ojs7lbU1bVoLBAKDg4PKkpoa1dScpg1ppvGM0OU15LdMq1/vvbB+W61aIqJ9uvH3La73MI2K/AYAgDnymy07duxYu3btd7/73T/+4z/+oz/6o+XLlz/11FO5ubnKIltJScnhw4c//PBDn89XU1Nz/PjxpqamtrY2JbCdP39euRPS7/dfu3ZNWVvTpjXtqpqS1tSoZhXS3P74IBbyW4YXw5VMkd8AADBnzG910KisrNy6devq1atXrFixZMmSe++999FHH33uuefefPPNwsJC7SKb8h22hoaGlpaWkydPnjlz5ty5cz09PWpgU5bXPv7449HR0U8//dS4tqakNdOo5vbHBPNBfsvwYriSKfIbAADm1EvMoaGh3t7eP/zDP1y2bNn3v//9559//o033igrK6vNPG+99dZPfvKTv/3bv1V/fWTVqlX/8i//otwYqX6TraKiorq6uq6urrGxsa2t7dSpU93d3RcuXLh06dLAwMDVq1fVFTZtYLNaWyOtLT7G/JbfFEnrEhHX+5BGxXAlU+Q3AADMKZeYY2Njw8PDfX19paWl//Ef//GP//iP3/nOdx566KE777xzyZIly5Yte/zxx59++ulXX331vffeczteOe+tt9568cUXH3/88aVLl4rIn/7pnyqLbOqvjxhvjFS+yXb69OmzZ89evHhRWWS7fv36rVu3hoaGlFsi1RU24/IaaS0TkN8yvBiuZIr8BgCAuenp6ampqfHx8ZGREb/ff+bMmePHjx89erS0tPTAgQOFhYW7d+/esGFDTk7OqlWrHnnkkXvvvVf5k9PLli178sknn3766S1btmzZsqWiouJYmtiyZcv69euffvrpFStW3HfffSJy//33f+tb38rJyVH/IJuyyBbjxsje3t7Lly9fuXLlxo0b6iKb8h029U+lEdgyHPktw4vhSqbIbwAAWJqampqYmAgGg4FA4NKlS6dOnWpqaqqtra2srCwvL//www8PHz5cWlpaXFx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" alt="" width="908" height="437" />
(不得已在图片中加了水印,因为看到自己辛苦写的东西被人直接拿走,也不给出原文链接,心里真的不好受..希望不会影响大家的阅读...)
由于图片大小限制,所有的HttpRequestMessage被简写为HttpRequestMsg,HttpResponseMessage被简写了HttpResponseMsg

大 家可以看到,HTTP的请求最先是被传递到HOST中的,如果WebAPI是被寄宿在IIS上的,这个HOST就是IIS上,HOST是没有能力也没有必 要进行请求的处理的,请求通过HOST被转发给了HttPServer此时已经进入WebAPI的处理加工范围,HttpServer是 System.Net.HTTP中的一个类,通过HttpServer,请求被封装成了WebAPI中的请求承载 类:HttpRequestMessage,这个封装后的请求可以经过一系列自定义的Handler来处理,这些handler串联成一个 pipeline,最后请求会被传递给HttpControlDispather,这个类通过对路由表的检索来确定请求将被转发到的具体的 Controller中的Action。

Client端的处理与服务端类似,直接上图:
APPgbaK8DYSDQAqhIBFoAADz4G2ivAWEg0AKoSARaAAA8+BtorwJhINACqEgEWgAAPPgbaEeBMBBoAVQkAi0AAB78DbRXgDAQaAFUJAItAAAeHALtJTXP6hhKt19MnuhVGk6N7zg8KCIRIAwisuPwYMOp8RO9SvvFZMdQOv/TuJAi0AIIFIEWAAAP9kDbcUnNs9qH0m0Xk8d7lUOnxt8/PCgil4EwiMj7hwcPnRo/3qu0XUy2D6XzP40LKQItgEARaAEA8OBvoB0BwkCgBVCRCLQAAHjwN9AOA2Eg0AKoSARaAAA8+BtoL6HqbHpM5LFNly5danlumSx7riWUThBoAVQkAi0AAB78DbRDvtm0Uuat3ORfw4XJdGvZcy0uc0qnq0abVlp7Zp9ScNuZQOtHmwtGoAVQkQi0AAB48DfQDvri6HPLRJY9dzT7fONKWblxEW0YmvDLxpUiy5Y5NL1xpSxbtkwW3tGi2LjS2jP7lILbDmiX54VAC6AiEWgBAPBQgoHWl6wVYKBdudHWQ21rz/kWEv1GoCXQAihHBFoAADzYA237JTXPahtKt15MHutVDp4a3354UEQu+mDjCpEVGx1nHVmzTJatOWJf8siaZfrnk1dsND6T7Aqmidn2j6xZZlp+xUatVeOKTp2z9FFrxmmqdYNOU52W0zth7ob5lRnmOW8rxz41T3HcnNPOsS2/YqPekuXoOHZJazOzustRXgwR2X548OCp8WO9SuvFZNtQOv/TuJAi0AIIFIEWAAAPDoF2SM2z2gbTrQPJYz3Kwc5MoB0oXNOaZbJsTVM+8zasEFmxwXkV87SmNcu0RfX1tGdNa5aJZJfbsCKT6PRn9n5kN2maa5yY3Yhpi/OdsXfVofNNa5aZ2s4+MTw2reWyLUu37TKruG3OtHMML864OW2Z+Z1pWtehS+Y2/ZMJtJ3jx3qU1oFk22A6/9O4kCLQAggUgRYAAA+VEmgdQqE58ZnmO0dhYyC1PrNONKy5YUXmkWEN6xazy9i76tR5yxbdQqzHtpy6nWOKbWX73tZfgmVztl3i2qVcR7cQBFoAFYlACwCAB38DbX/hmp5dKrJiveu8pc82ZZ+uX6Ev2fTs0sxdx/UOixoWnJ+7Yr21QfNitpXME7OrGppw6s+87HZsXXWYsn6F05rrV+iPjR3PsS3312Ka4rw5l72d3Xe2lgzLu3bJ0qZvCLQAKhKBFgAAD/4G2j4fND6zVOTRd91mLX2mMfv03UetC84vYFrUst78muYZ5vbsrZsnav185pml+lKWmaYter0WwxTzDnj3UX2xdx81BMT5rnlvy+G1zE9x3ZzL3rZuTm/JMMO1S3n0dVEItAAqEoEWAAAP9kDbNqTmWa2D6ZMDyZYe5UDn+LbDgyLS64t1j4rI0mcOG55nnq17VJ9x+JmlIiKPrjOuefiZpZn5h59Zaphpfjbfyvzy2enz7ZmfOU1cpwVM0/PsE/MWHZg3bZxinHP4maViePHmFYwr5tyWw2uZn+K2OWsP9TWMmzMeBVtDDl2yv2p/iMi2w4MHOsdbepSTA8nWwXT+p3EhRaAFECgCLQAAHvwNtD1+aVht/Mzq8nX6jHXL5yeuW67Nmp8msnR1g2XJzBTHhRpWL7WsMb8p8zPXReZXt65hfg3aHHsvnPo1v+bS1etWLzV113m3uM9xeS3GKS6bM+8c0xrGo9Cweqk23bK8Y5csy/iGQAugIhFoAQDw4G+g7UZgDj29RGT5O/rzd5abnlY3Ai2AikSgBQDAg0OgHVTzrNaL6ZP9yZZu5UDH+LaGQRHpQmAOPb1Eljx9yPhUHnknzB6VEBHZ1jB4oGO8pVs52Z9svZjO/zQupAi0AAJFoAUAwIO/gfYCAnTwqSXGD/E+Uhd2h0oHgRZARSLQAgDgwR5oWwfVPOvkxfSJ/mSzIdCeB8KgB9rmbuVEf/LkxXT+p3EhRaAFECgCLQAAHvwNtOeAMBBoAVQkAi0AAB78DbRngTAQaAFUJAItAAAe/A20ZwAD/ZTIfW5Y5i7iRLIHWhGxnK6WKfYFCLQASg2BFgAAD/4G2lOAgX5KOJ4b4mIRW3FDoAVQ1gi0AAB4cAi0F9U86+RA+kRfsrlLOdA+vu3QoIh0Aln6+WDPmTmWzNFa7rnbDg0eaB8XkRN9yZMDafvpKiL6A2vuzfuctxSBFkCgCLQAAHiwB9qTF9U868RA+nhf8miX8mH7+NZDgyLSAXR0dHR0aEFRe6D/b46Fjcs4Lqw36NbC1kODH7aPi8jxvuSJgbTxRDVmV+2p/r/GB4soAi2qUNpLSfWnyJ3xHYEWAAAP/gbadqC9XTsTtABpnGJZJreFbjFHoLUEV/u2CLRAbno+TKVSqVQqmUwmk8mEmTZRWyDQPOnYGUt/itaZoBFoAQDw4G+gbQOyjOeDMT3mXnJxG3LjFmi5Qwvkw5gbE4lEbHos2tcQbXpB2fDw3CtfstZrf6Ls+F606QWlY2PsyulEdFaLlH6FSb0zWnaNXTmtnNsZPf66suN7ypt/Zu+PsvnR6KE10TPbYte6tIjrY2eKhkALAIAHfwNtK5BlPB9ynBv2FLq4bS3oDi2BFshNT4+JRCI+eU05+m/KhoeVtx+M7f1Joq0uNXJCHb9krVv9qb79iba6xJEXYu9/W3nzz5SDz0avXtDC5KKTpDHHxpV7Svc+Zevjc698Kfb+t+OHVsdbXkn17U/f6LL3JzV0NHFqQ/zwc9Gtj8298iVl6+NK+4bYzO3ySrYEWgAAPPgbaE8CWcbzwe3cyNxHdVkr95KWufkEWj3K8pFjwI2W9LS7oNGrF+b2/4uy7qHEyTdSw8fVj4cWUGN9ic710a2PKRsenmvfEJse05PkgnqiherorWGl8QXl7Qfj+3+aGji0sJ58PKR+PJQaOJQ48oLy9oPKwWejt4YTiURZxFoCLQAAHuyB9sRFNc86PpA+1pc80qXsbx/fcmhQRE4AWcbzwRIg9Sn2WW5nUY5Z2twthwb3t4+LyLG+5PGBtPFEzaxrPnvtUxZRBFpUGD1AKpdOzm19PLr1seTpzYtIj6YkOXw8ceSF6IaH5y7sicfjed6tnY+yVy/MbX08uuFriba309cvFNiZTMze8DVl54+Ui0f1WFuc3bsIBFoAADz4G2iPA1nG8yHHuWGZtbizKHegdSwCLUpf7t/v9ffuov6x3tjczNyRl2If/F1q4KD68aBflb5+Pr7/p3M7fxSdupk7Rhp7ohz7VXTrY/72RKtk167Y7ifm9v9L9O7kQm8dFxOBFgAAD/4G2mNAlvF8yHFu2O/QLnQruRFoUUby+f3eIH7FV9tiPB5XrvdFNz+aOPmG7wFSj5HRDQ/PGm7VuvVkbuhEdOPD8ZZXAupJpj9nNkc3PDw30hGPx0sz0xJoAQDw4BBoB9Q863h/+lhv8sgFZX/b+JaDgyLSAoRBRLYcHNzfNn7kgnKsN3m8P53/aVxIEWjhC0uIjd+5FR1uVVrr3H6/N/Mrvlsfjza9oJzbGbtyupBf8dX+CsTj8dm2d6Nbv5EaPhZohszcqq3/h9jcjPHjx/p3d6N3J5UDz8Q++Lt0pC3QnmT6c/V07P1vz7W8aulPiSDQAgDgwd9A2wyEgUCLMmX83aPYtS7lw1XKu3+lvP1g7IO/ix95MdW7N33tnHrromOl+g8mWt+KH3w69v63tX+lRjm3c6G/4pvJkNHoXMur8cPPqTd73DbnbyXPb5/b/ffKvTv6x48z3929MxH74HuJzneL0w294i2vzG1arnx8pdS+VUugBQDAg7+B9ggQBgItyoueYzP/FM25ncqGh6NbHkuefi99uXVxkSx1sTF+8Gnl7QeVxufz/BVfPc3eO/ZGvPmlImfIZNeuud1/PzczHY/HE4lEPB6fmx6PffC91MXGIvckswMvtcR2fHfuVqSkMi2BFgAAD/ZAe3xAzbOO9adbepNNF5T97RNbDg39u9/6lOcXGoEg/Lvf+tSWQ0P72yeaLigtvclj/en8T+NCikCLRZj/0aOPRzL/FM3Bp1KXmtVbAz7Uze5E66+jG742t/VxpXtfjlg7n2bbN8YPP+fP1hdYydPv3dv75OzsrKIo927fyqbZEHqiVfrySS3Tls5Xagm0AAB4KDzQHumK7u+Y3HZ45NfbO9fWNax5ddfql7Y/tXbrqhe3FKdEpGjbqoD6zO/+/hNPvR70ViwHRX/qdrDyn65PeWrt1tUvbV/z6q61dQ0isu3wyP6OySNd0ZbepIgQaFGC9K+JxuPxubZ3o5sfSbT+On3tXBDZLNV/IL7/n5UND0evXrDfctTT7MzZnfH9Pw0xQyY619/b+y9TlzpDT7OZ/XaxcW77t2enPi6RTEugBQDAQ6GBti91pDt28NT0jqOj79Z3/WrTibV1Dc+/uf8Xb+z7+et7i1MiUrRtlXv97TefFJGl//3Pg96QdlDcbqjqy+RgbMfSpvb0F2/se/7N/WvrGn616biI7Dg6euDU1JHuWEtfanGB1nEtfaLjXMdAK5K5BNUe6E+NLMvkYxGrBCr36ypBnn1zW8A+XT9LPScaW9C/Jioic1u+kWh6Xv2oWx0bCLRSl5qjWx5Tjv3K+I/TaG/7sVhsZqAl9sH3g+6DZ0Xf/47yzpdTA42h9ySz0wZKKNOW7ogCAKBEFBJojw+oLX2poz3xhrMze06ObW0Yfre+69fbO9/Y2vb6ltbXNp8sTolI0bZV7vWZ3/0DEfmN3/jEz1/bG+iG9IOiPbA81R7YJ7qtbm9KRF7f0vrG1rZfb+98t75LRPacHGs4O3O0J5470GrbJdAWrkoCrWNwtT92nGhsQc+Qs23vikiq70N1rL9oFW/5pf6P02j/3k8sFpuZnoxueDg9cqKYPbFX8vwHsR3fSV89G2437L2a/eCHc3NziUSCQAsAQEkrMNDqnzo+eGp6z8mxHUdHtzYMbzk0tPngYNFKRIq5ufKtH616Tb+JVPPgI4EeEY3xsXGi48KOCxifWhrcfHBwy6Eh44pNFxQROdafLiTQGhew982ymB5oRUQLtPaEo8da4xQLx8XsjahOIdnyeHGzLG8LjgvnP9HyMh1b9lzSrTOOy7vtZPsCOfaA2xS3jrnNcuxtIpGIjo/ObfmGiKgfdRU/oaWvdMTe/9bs6e2KokSj0Xv37t05+qv40bXh5sb0lY7oe3+TvtIReoK1V/zgU3c7t4X+bQICLQAAHuyB9tiAmn+19Keb+1JHexONF5RDZ2c+PDW1r2NyX/vE3rbxopWIFHNz5Vu/9wd/rCeBT3zikxv29RXhoGgPLE8ti+WYqzM+1Zfc1z6xr2Pyw1NTItJ4QTnamxCRlv60ccX8T2bj8rkfGB9b7tAaA5X+wHFiPovpLLNyBLPFzcqxrRwvIZ/XtaAX6/nCc7ScT8dy7wG3/W/vVe5ZlpZTqZSIzN2KxHZ8N9X3oYiEGtKevnf0l9PT05OXu6KbHgklWhsrtuM7yfMfhJ5dneujruimR+5c7YtGoyFmWgItAAAeCgy0eqZt7k0e6Yk3dccaLyhFLi3MULnr6ZffF7MvP/y9IhwUsbEvoy/m2Y4+xbhwU1dURJp7k819KS1qykJyrDHQ2h/neJB/oNWH20IToOeK9v9d9Kx8tr6I17WgiXaFdCZHxzx3Tu4+5OibcaJ2PsTjcRGJ7fhueuS4OtYnIupYX4gVb/nl3d0/ubfh4VRPfbg9SZ7dEtv5g3D7kLtSfftnt317ZnpS+zKt21kaKAItAAAeCg+0WqbNxFqtepPFrEyYoXLW73/285Zg+YlP/ubOlutBHxTtgeVp7oUdZ1mamp/el9JyrHYSEmgXPSufrS/ideXzGvVzUrUpcqB17Eb+gdY4XU+zs2OXRURLs2oJBFp1rC/e+LPo+q+G3o3oe3+TGmgIvRse+6rh2Tsn14f4ZVoCLQAAHhwCbb9aSLX0pYtcIlL8jZZXrXlllzj5ytd/WMyDYp/o2CuNfRXtsWWBlr70sX5VRLTTT3ugP7WXtq7bLPvjHA+0xwTa/F9O7tfoe2fcOqYdJuP/plIp7YPBlgfaDwJri1nCjFua1TehtWOk3uxTb/bpD0Ks2Ac/SJ7dEm4fkme3xD74Qei7wrPSkfbZd74yPflxNBoN5RePCbQAAHjwPdAWv3KkF0qr3//sFxxD4yc++Zu7j98M7qC4hdVjhmBpOXz2p5Yl3YKl4zKOHXObK3kHWuNjY6BdXL7SHziu7rhw7q0sepZnJz077LlKjnUd+7PQlh0fSzaR6jkzmUwmEonE7esiErtyOnbltNK9T0SU1jqltU5Eome2adO1f2VH+wdvjBHXrZ/a41Qqpd2bje34Tnr4mIioN3vVm736gxArHWlT3vlL9cb5cLsR3fg3qYFDoe+NfCp+6NmpE+/eu3cvlA8eE2gBAPBgD7Qt/Wp5lYiE3odSrjWv7nYLlqLdpA3yoBiPjuORsky0LJ9jde2p4zKLOyUct6W3b3ygP7X8yvGCAq2etfQHqjnpGSfam8qxlcXNsjzO5yV4LmmZa3+9bkvm6Ew+yxsf6/dgk8lk/M4t5dxOEVF2fHfutT9R1j0kIrHt34pt/1Z835MiEm96QSt9+twrXxIRZdNyZc9PlHM745PXLCPI3ivtH5udvTs1u/kxLbNJKQXaxPFX4wdXh96Nckmz6s3edKRt9td/MTU1FcqvQxFoAQDwQKCt+Nq4f+Df1jfrJSLGp69vbQ/6oDgmT+Ncixxt5ljSPjd3a768NMd/h3ZxLJmt4gX9evX7sYlEIvbxyFz7BmXTcuXtB+MHViWOv5rq3r2gW5SpgUPJs5vjB1Yp6x5S1j+sHP236NULiURCu3NrPO7pdDqRSMzNzc20vB4/8mLoYcxesW3fSHXvDr0b5VWxXT+aOLtPu0lLoAUAoLQQaKut2F0+7kAC7YI43tj0nZZjk8lkXLmndO9TNi2PbvhaovFnft0STA0dSRx/NbplpfLmnykHn41PXtNjrbbdaDR65/L56NbHQv9Yr73SV08rb/15CXasxCvVu29m08pQbtJW/vsCAAAFItBWW7G7fCwfAy0Kp0fK2PSY0viC8vaD8X1PpgYOqjd7gqj01VOJ9jpl3UPKwWdjE1cTiUQikYhGo3enJu5tXhncdgup5Pnt8b3/GHo3yrGUNx+4de3y7OxskX/umEALAIAHAm21FbvLxyLQlghjlJ07+rKy7qHEiTfSo6fUj3qKUIm2OmXdH97BxwAAIABJREFUQ3P1/zh7tefu3btTzb9ONP68OJteTF0/F34fyrDi+578uHXLnTt3YrFYMX8aikALAIAHAm21FbvLxyLQhk77rqz2AeO5E29FN3wtcfzVUDJb8szm6Kav39v2fWXD1wiNlVeJtrqp3U9OTk4WebATaAEA8GAPtM19anmViITehzIqdpePRaANl/6zT9HxUeX978SPvJAe7VQ/6g6xEiffiG78m/jRteF2g/K90pda7r31P8fGxu7du1fMTx0TaAEA8ECgrbZid/lYBNoQZW7MxuNz/U3RTY+kevaGnnkydf1s4vBz0c3LU4ON4XeG8q+UXz8w0fCy8aehijDkCbQAAHgg0FZbsbt8LAJtKOZ/T3j27lzDz2O7fhT6jVl7pXr2RjcvT3auD70nlF8V3/lDZfOjytsPzjatVcYuJRIJ7detAx34BFoAADwQaKut2F0+FoG2+PSPGc/dHIpuezxx8k31o67SrPRoR2z3E/GmX4TeE8qXih98OnHsl+nLJxLHfhld/7/mtj6udO9LRGcDvVtLoAUAwAOBttqK3eVjEWiLTEuz8Xh8tvtAdOtjqb4D6o2uEq944y/ie/4x9G5QhVe88Rfxxl/oT1M9e+J7/0lZ95By6WRwd2sJtAAAeLAH2qN9anmViITehzIqdpePRaAtJu3NKhaLzZ7fHdvz9+krHaEnnDwr0fZW7P1vq9fOhN4TqpBKtL1l/28T6ZETsR3fUw48E707qcdaH097Ai0AAB4ItNVW7C4fi0BbNHqanRloie16Qr12Wr1xoYwqeXZrfP8/h94NqpBKnn4v9sH3HWcl2t6Obnh4buBIPB73N9MSaAEA8ECgrbZid/lYBNri0D5pHIvFZq50RbesLLs0S1VGpYeOJlp+6Tp35Hhs5w/ndv4oencymUz6FWsJtAAAeHAItL1qeZWIhN6HMip2l49FoC0C/XuzM9cHolseS0fa1OvnKao0K3l2q7L928qdCb8+fkygBQDAA4G22ord5WMRaIOmp9l7N0di738nPXgk9MRCUbkr1bt/bvu356bHfcm0BFoAADzYA+2RXrW8SkRC70MZFbvLxyLQBmr+N42nPo5uezw10BB6VqGofCrVuz+6efncrUjhX6kl0AIA4IFAW23F7vKxCLSBSqfTiURibmZ6bvu3U9271evnKKpcKj3YFHv/O7NjlwvMtARaAAA8EGirrdhdPhaBNjj6W9NM24b4wdWh5xOKWmj5kmkJtAAAeCDQVluxu3wsAm1A9H+k587YFWXdV9TRTvXaWYoqu0r17J3b/NjczPSiv09LoAUAwIN7oI38eKl88ZlI6JnBs6o7oS34MFX37vK5CLQByfwQ1L17M/U/SbavCz2WUNSiK970/Ezza3Nzc4lEgkALAID/HAJtj3qkRz3SE/nxUvni6kj2aaH10nIx+qt1/jR7pEcVEX/6trRui3VW81/53Vu/a8GHKffuCu4wBVphHUECbRAyX52dm5seOB7b/s3QAwlFFVjRLSvuXOqMRqOLeJcg0AIA4MEeaJt61KYetakn8sRS+eLqSPbpfG1aXSNL6za5PHWrtctFljdnnq6rFal5osFjlTxLRBa6iqXPa5eLLK35or1L62plac0XRR5a509XA6gFH6bcuyu4wxRohXUECbRBSKVSsVjszu3xe5tWpHr2qtfOUFRZV6r/wOzGr9+dmojFYgv94DGBFgAAD+EEWvfGF1H+BNrlzeYe6p2se6hqA62vhynQCusIEmh9p92enZ2dnT7xbvzg06FHEYrypRLHfzVz4LnZ2dmFfvCYQAsAgAevQNv8xNLMp08fWpeZOG9p7UOmp3WbeiJPLJWH1s0vpschc9hofkiMScnYbO3a+cDQ/FB2qtam3gfDus0yH1ec29m0ukbM7Zj7nO3bulrT1hvqvii1a3uajXHI3JS+mFGRb2ku/DCJ+HuYbPvEtXFLx4xHzbh8rr3t0oewjiCB1l/a21E0Gp2+GVHWfUW90qFePUNRlVGx7Y9PDxxf6HsFgRYAAA+5A+38xb0hKuS8Q5vJG8aooD02JqVNq2sMwSPyxFLzrExrxunGZt0CrUs7DXX2T6I63qG15DfjRMPLsTRlWMVpQ8UJtAs6TCLi52FyeNVujZtaaFpXa47ftpfg1rLDqRLaESTQ+kv/Lag7B59PNL+sXj1NURVTyc53Zz748d27d7V/xSfPQUGgBQDAgz3QNvaojT1qYzY3Zp82PyQ1TzSojYYgoc0yP7Wspb64XGR5c+bB/D3D+dUbsynCuiGH6fLQOoeOabkoZzumLtlfgt5Jw3T99erbdWrKtNHMPWTjhoKvBR8mEfH7MFl2r0vj1hb0jbq8BI+9bXqxYR1BAq2P9PeiqYlbytsPpkeOh55AKMrfir73t7cvnVnQLx4TaAEA8LCQQJu51l98oF3erDeVfZzJGGZ6nql9cT485BNondoxbiK7UbdAq8cbcy4yhBxrU5n7e05xqzi14MPkHWgXdJgc9olL4+tqxXRA1U2ra1wCrSl/zrfs3oewjiCB1kfa7dmZmZnbx9+JH3xKvXqKoiqsEs0vTR34+Z07d7Rfh8pnXBBoAQDw4BBou9XGbrWxO/LEEvni05Hs0+aHRB56R23sVjc9XSNL6jZlplueWtaKPLFEZHlzY3c2cmjT36kVqXnikNrYrTYeqvui/thY1ul6B6wdE226WzvzNb+i5SUY+qZ1uO6JJZkXa3zhTk3Nf8tXHBYrQi34MImIn4fJoScujdtayG7L9SVYW3bvQ1hHkEDrF/2N6Pbt2/c2/G2quz707EFR/teVNuXtvxi/cWVubi7PdwwCLQAAHhYZaKX2RWNSmn8aeWKJzKcgQyIyJSVT4/Npyh45TCkl24EXl0s2qhmnu7XjkP0sL8GW4sQwN2cceqfWGBrDqAUfJj3Q+nSY7D1xa9zcgnl6XoHWvQ9hHUECrV+0Hze+d+/eeN+J6OYV4QcPigqm4gefmmypy/+btARaAAA8LCLQzt/UyiQB41Ntrbr5XyfOBglzUnKMwTpTFMl8svSQUwdEHnqn2bAVp3Yy8cbYYetLMPet+SFxeeFOTW16usa4yaLfpF34YRLx8zA57BPXxs23Q/V7rS4vwfnAOZ8qYR1BAq1ftH97dnp6euLwv8UPP6de7aSoiqz0pabZX//55ORknm8aBFoAADzYA+3hbrWAivxoifzfT0cKa8SxMrHEPktEAthcXqXlvX/Vp7xTa3pakiUiQR4mNeDGfa4CjyCB1hfau9Dc3Nz4+Pi9dX+d6tunjnZSVKVW9L2//Xig4969e/n8NBSBFgAADwTaQuPQkrpNbumoJItAa6wCjyCB1hfpdFr7OaixwTPR9f8r9LxBUYFW/MCqj4++NT09nc9PQxFoAQDwQKAt/PUaPwFb4mn2MIHWqbeLPoIEWl+kUqloNDo1NfXx0bfiB1apox0UVcGVOPHa7V1PTkxM5PPTUARaAAA8+B1oQ6hQA235FbvLxyLQFs74eePbu55MnHgt9LxBUYFWeuDgvbe/fPPmzXw+dUygBQDAgz3QNnSp5VUiEnofyqjYXT4WgbZw+u8b37x5897bX04PHFBH2ymqsktZ95WPBs/n8w/SEmgBAPBAoK22Ynf5WATawqVSqXg8fufOneuXB5U3H1CvtFNUxVds9xM3T267fft2NBol0AIAUBACbbUVu8vHItAWTv8C7Y3OvbH3vxN60qCoIlTi6Ivje58dHx/3/BotgRYAAA8E2mordpePRaAtkP7+MzExcaNlQ3zP36tX2iiq4itx4tWJD34yNjY2Ozub+2u0BFoAADzYA+2hLrW8SkRC70MZFbvLxyLQFkh7/5mdnb1169ZH+/813vBs6EmDoopQiROvju/4xxs3bszMzMTjcQItAACLR6CttmJ3+VgE2gIZfxFqYsc/Jk68GnrSoKgiVOLEqx+//w/Xrl27c+dOPB7P8TVaAi0AAB4ItNVW7C4fi0BboHQ6HY/H7969e/369anN30p2vqtGWimq4it1ZtP0eyuvXLkyPT2d+4eOCbQAAHhwCLQX1PIqEQm9D2VU7C4fi0BbIP0njq9evTr93srUmU2hJw2KKkKlzmya2rgiEolMTU0RaAEAKAiBttqK3eVjEWgLlEqlYrHY1NTUlStXpjauTJ15T42cpKiKr9SZ96Y2rrh8+bLnv9xDoAUAwIM90B68oJZXiUjofSijYnf5WATaAmmB9vbt25cvX57auIJAS1VJaYF2ZGSEQAsAQKEItNVW7C4fi0BbIO0fob19+/bIyMjUxhWp0++pl09SVMVX8sTrt7b8gEALAIAPCLTVVuwuH4tAWyAt0E5OTg4PD09tXJE6vVG9fIKiKr4SB5+6vPt5Ai0AAD4g0FZbsbt8LAJtgYyBdvK9x5Md60JPGhRVhIp98P2LDe/yo1AAAPjAHmgPXFDLq0Qk9D6UUbG7fCwCbYH0QDsyMjK29ceJY6+EnjQoqggVXf/VnpMHR0dH+Wd7AAAolEOgPa+WV4lI6H0oo2J3+VgE2gIZA+21navjDc+pI8cpquJr7pUvXbhw4dq1a3fv3o3H4zneOgi0AAB4KMdA+4+/2PrwN5/SS0SMT7/3z2+E3sNSLgKtj0WgXbR0Oq2/+WgfOb66/Z+iH/wg9KRBUUFXqmvX3be/0tPT89FHH83MzCQSCQItAACLV46B9l9e2i3uHq99OfQelnIRaH0sAu0ipNPpVCqVSqWSyWT01vBs5+a7B569u/kbyuv/I7rpkdDDBkUFXckTr93c/P3+/v6xsbHZ2dncbx0EWgAAPNgD7Yfn1dKv3/vPX3BMs//+t+/b3amE3r1SLhEJvQ9h1fmvi/r1ZqcpkeElooqtvl7nMr05s65hYrrJdlVaa16rOZwxXiK0W7Jajo1Nj0WPv6as/1/R9V+N7//nxNEXU6c3pPs/VN6oUUeOUVRlV2zXDwf2vzk0NDQ+Pj43N0egBQCgIGUaaH/qcpP28dqXQ+9biReBNueUyPASmVkVsa3rMP3810Vd8mLmDm3DD1UR9agt0NY2Zx4316pSo0aKPcDn1dWoNXWhbFmPsolEIjY9NnfkJWXdV+KHn0t17bRc6Ct1D6Z79oSeNygqwLp0ZPb1mjOdbSMjI5OTk7n/zR6VQAsAgKcyDbQfOt2k5fZsPkWgzTllsYFWGUz/qai1R02jyxho1YhaI2pdpMgDfF5IgdYcZdcq676SaHpeHTqiDh+zV3zXjxIt/+Y4i6Iqo5LHf3Vj43fPnTuXz08cqwRaAAA8lW+gtd+k5fZsPkWgzTmlsED7dsQ0ukyBtlkVY6CNqDX6p5FrDes0Gz6iHFFrtA8qW8Jws+EDzC7t1NVY29GfFivW6j/7FFfuKcdezUbZJnW4xa0Sjb+I7/tJjgUoqqwrPXBIqfvy+X11+i9C5f6JY5VACwCAp/INtB+ab9JyezbPqvZA6/KF2GwV8pHjP1Uj7h85rqsxBM6IWmOelQmZxunZFNqsugdal3YidQ4fby7uHVr9xqxyZ2Lug7+LH/5Z7iirVerctuj6r4aeOigqoEo0/kJ55y97P3z74sWLH3/88ezsbO6fOFYJtAAAeLIH2v3n1HKpn66dv0n7jdqXQ+9PWZSIhN6HsEq7H5tzSuTSEplZFbGt6zDdHI//JD2S80ehjGHSGjibM08dpucMtLnasX28uYiBVkuz8Xh87lpvdNMjqVPr873iH2pSfv3/hp46KCqQGmpS6h5Mnd8+U/fQyED3xMREPr+OTqAFAMCD74F239l0MUu7Sfvvf/u+ne1zRd50mZaIhN4HfyvMQDv/kWOnC9P5O7TNqhhupWqB01R6ELV9/LhZzRlondoxbsLhPnCwtLeUWCw229cY2/Z4urtevdSSf6X7Dy1oeYoql0o0/iK+9yfqpZZEyy+ndv7T5OQkgRYAAB/4Emgz0eJMSqu9Z5JFqydf3Ckijz2xtpgbLesSkdD74GPpZ10+4Ta8QGv+lWPHjwQ7TF/oHVo7w4pFCbTzabbjvdiO76X7D6qXmimKSvfui67/arp3n/Y0tv1bk12H+cgxAAA+KDzQalF275nkH3z2847/lA4QtN//7Ocy4TZnpg0z0JpCqfm7r/PcvkOrqrVi+p6t43doHZgDren2r//0NHuvfWN8949DjxAUVToV3/nDRMvL+tN0777Zui9PT36s/cox/w4tAACLZw+0+86p+dfes+m9Z1L1pxM7OxQRmQjDjRs3QtlumdqzZ0/YXfCfiOzsUOpPJ/aeSe09m3Y7Xc9+XdSvN+ecEhlaIjOrIrZ1HaafXVigdfpdqPmPCuvTmw0fHjb+mrHx14/dfuU4205zrdN3d5ttU/ykfW82Fovdu3wmtu0b6mBj6BGCokqkkm1vx7Y+ZpkY3//P0yfevXfvXu6btARaAAA8FB5o95xJ7uxQth2fFpFxIAwisu349M4OZc+ZZI5A63s9sKoxV6AtlDG4ljT9V6BmpiejG76W7t6lXjpKUZR66ag6eDj6zlfsgyLdu1e7SRuNRnO8exBoAQDwUEig1W7P7j4V33Fy5r3GMRH5GAiDiLzXOLbj5MzuU/HcN2kJtEFIp9OJRGJ2dvbevlWJln8LP0JQVInU4OHY9m8l295ynBtveO5O41rtX6NNpVKOg4tACwCAB4dAe1bNs/aeSe89ndrdEdvWMrXuw1ERuQWEQUTWfTi6rWVqd0ds7+nU3jPp/E/jQopAqxreQ+6c/iC++8fq0BGKorSK7fhu8tgrrgtcbJh74/+ZmriV4w2EQAsAgAd7oN17Vs2z9pxJ159O7myPbm6efGvviIiMAWEQkbf2DG9untzZHq0/ndxzJp3/aVxIBRxoy4D+1dk7V/ui7/2NerEh9AhBUSVS8fofJ5pe8Fhm/5O3j7+T4yYtgRYAAA+FB9oP2pXNRyfe3D0kIjeBMIjIm7uHNh+d+KBdIdAG5+bNmy+//LKiKPoU7auz9+7du3tgjee1O0VVT8UPrIofWOW5WOr89tl1f3379m239xACLQAAHnwJtJuOjL+xa5BAi7CIyBu7BjcdGSfQBioSiYjIfffdp8Va/d1j6qPLyjt/qV48pA41URSVaHo+Xv/jPBeO7fjuxNl9bj93TKAFAMCDv4H2IyAMBNri0AKt5r777nvppZfu3r07MzMz1fRq/MBToacIiiqFSrb+Or7zBwtY/tgvp3f+w9TUVDQatf+btARaAAA82APtnrNqnlV/Jr37dHJHu/JeNtDeAMKgBdr3jozvaFd2n07Wn0nnfxoXUtUcaDWf/vSnn//Zs3PvfCXdUx96kKCokqgFflQh3bd/9s3/b3zsxuzsrP0mLYEWAAAPBFpUAAJtcdgDrYj8zX+9b2rTN9XBRoqiFlexrStvXWi8e/duLBaz/DQUgRYAAA8OgfaMmmfVn07vPpXc0aa815QJtNeBMNhTFoqm86fLUh11oUcCiirfSjQ+f3vPU9pPQ1k+dUygBQDAg7+B9hoQBtHu0DaN72hTdp9K1p9O538aF1L/f3t3+pzGnegLv9/eW+c/uC+e8+Y+VffNrVvnvDhVY1fdPJU6czzJHSdxkplsJ4sz2ZNJ4jjb3JnEjp1tkkwcO7ZlrdYuIYQWtIDYBGIRIAmhDYGEEEhIiEXs0N1A9/OiLYw2S7IlNbK/n/q+EE3z6x8xUPOd3rCHliCI1Z//P2aik7X3IQhyd2FGWxJlp1ZWVjYfdYxCCwAAsIP9LbQeAD6g0B6OzYX2f/63f1oteYL3PoAgRz3pkkeW5mdisRhN0yi0AAAAe7C50LYPsbtMm5kRmbICfbpGHrgmshME4QbgA0EQ10T2GnlAoE+LTNk2M7P7j/G95AEvtI8++qi1/jzd+SnvZaDYU/M0QRBna/ieBlLEoZrfWDKJ89c6zn/pUGgBAAB2sL+Fdh6ADyi0hyNfaB977LHBwUG/3x9u+nN24AprlyJ3Ss1TBEGcreF7GkgRJ9P9l2XJ5WAwuOHHBIUWAABgB/tbaF0AfEChPRwul+vxxx8fGRnJZDLxeHxpaSld8ggz3sFOS5E7JV9od7m+4sMTBHHiYi3P0y6SaTwYyWquhJv+7PP5NpxGi0ILAACwg/0ttHMAfEChPUy5XI6m6Wg0urCwkLr8EO9N4AgEhRbZKTljZbT6Ja/XG4/HC0+jRaEFAADYweZC22ZmdxmRiWk1ZgW6dLUscLXVThCEE4APBEFcbbVXywICXbrVmBWZmN1/jO8lD2yhpSgqHA67XK7U5YfYaQmyQ24V2lsPXRf/lSCeUk1Xlx9fOx35+AeutZVVpzdceOsp1e2hvj9b8ER+wIIx11Y4/f2OG7rzmHecBrL/YSzN8dInPB5PNBotvBstCi0AAMAO9rfQzgLwAYX20HC/GCRJhkIhp9OJQrurbFFoC9qj4oMTaxX0VhQfnCCIExer1w2yYbU7j7mXDW035tbTQA4sqcsPuVyuDdeFQqEFAADYwf4W2pkHV//Xx4njX/fzPY09qfsTQfypbuZoTn4dFNpDk//FCAaDzomhdOlJ1taL7JDqJwmCOFt96yHXM/MPWVuv6jRBEE+q8uvL3z9BECcu3iwcRHWaII6/77q95Gb58dtLuDE3vGTHDd15zC2ngRxc0qUn5yaHQ6EQCi0AAMAe7G+hdRSTulcJ4tW6Oy+564Hz1sa71QnzK6z9vR8bO5B3UThS4eSPJBTaQ1P4i+Ec1acrTvFeA45Atii0/1ouv72C6+K/7lRovz/L7Uq1bf2qzWPuYkM7jIlCe8hJV5xyjQ1uuNAxCi0AAMAONhdakZndZVpNjNCYbdalb8oCv7baCYKwF5OaVwni1Zrtlii/Pk4c/1q59tSGh9tSfn2cKFyx5tVbIxYOUPMqsavBtt3C+g3c4V3cm/xIu333RYsgiF9b7TdlgWZdWmjMtpqY3X+M7yUPeKGdHTdjD+2usl+Fdgv3XGi3HxOF9pCTrjjlHNUHAoFUKoVCCwAAsFsotFs+3P2YexxgZyi0dwGF9tBwvxipVMrv99vt9uS1E8x4G2vrQe6UW4X21sO1nnl7hbWeubbkVpOsKhjku7MEQZz+brtNbB5zFxvaYcytpoEcYNIVp2YtOr/fj0ILAACwB/tbaKeLSc1pgjhds9USxcXjBXsjjp8+ve7hRcW04uJx4nTN7dWOX1RsM2Se4uLx/GqFf0+v31z+1Rs3cbpmetPELiru9C5uP9owy20G37j+6Zr8SLuf8K2Xb/MfgTcotIcmX2i5X4xw5Qu5wXLem0CxZx8KbdXa2a1bb+KuCu0OY6LQHnLyhTaZTKLQAgAA7NYWhdbE7jKtRkY4mG3Wpm/2BX4V2gmCsBWT6o23neCqWDX3rPziceL4RfnayusfyrlGd2td+cXj3N8bXrNO4XMb/95qo9wm1taqPr1uawUbueO7kF88nl+1+jSxfqNbDF44mcL3uPcJFxmCIH4V2m/2BZq1aeFgttXI7P5jfC95YAst94vhcDgWmz7J9H3NTnUjd8rNJwmCOHvz1kPXhX8hiH8pl99ewXXhXwjiSdXtl3x7liCIY392bRqEOP3tuletPdw85q42dMcxt54GcmBJV5yaGdGurKyg0AIAAOzBfV5o14rZ5iU7FtrC6nbrhXdRaLcYiXu4ubdu/Yo7v4sNy7dq1AXPbPO27mrCxQWF9tDkfzFCodDMzMxs+490xye8N4Fiz54L7VrVJIgtiu7t/2NrfRG9i0J7xzG3nwZyIEmXnnRYjSi0AAAAe7O50Laa2F1GaGRaBrNN2nRVX+CK0E4QxFQxuXmaIE7f3G6J/MIx4tgF+dpT6x9ueHLthfILxzYOObXVAAV/yy8c27h3lXtmwyZuT23bJ7ZccvP05qG3HUN+4di6sfIj3cWEiwtBEFeE9qq+QJM23TKYFRqZ3X+M7yUPYKFlWTaXy5Ekubq6Ojc3N9VXSzW9znsTQJD7IKnLD9lsNhRaAACAvdnfQjtZTKpeIYhXqrZbIvvqGHHsK9naU+sfbvEk8UpVwR+bFb6k4O8NI229/rqpbfvE1qvefrLqla0mUPiKjZPJj3QXEy4uKLSHKZfLURQViUTcbrdlyJi4/igz1spOdSEIctdhxlqT105MT0/jolAAAAB7s7+FdqKYVL5CEK9Ubrek76tjhU+vf9j31TGCII591Zd/WeHf+QfcY+5R31fH8ss3/r1hGpvWWTe1DS+407vYtJ2tJlD4isKxufd4e/keJ1xcUGgPE8MwNE3HYrHFxUWr1eqtez8j/473PoAgRzo5c02s7CkUWgAAgD3b30I7XkwqXyaIlyu3X1L58q0jas9LNz6Unj9GHDt//uW1g27XDSM9X3hQ7tpT3Eukm/7e9IJbr9iwTuHU1k3szu/i9tDHzleeP7bNBLYanCBerpSeP8Ytv4sJFxcU2sPEMEwmk0kkEj6fb2pqarS3hmo4zU52IQhy18n2X/LXvrX59wSFFgAAYAebC63QxO4yLUZGMJht1Kar+gKXhXaCIMbuE5JzvyF+c07C9zRgtwiCuCy0V/UFGrVpwWC2xcjs/mN8L3lgCy33oxEMBmdmZgYHB+PXHmUszbxXAgQ5usmIP5tt/XZmZiYYDKLQAgAA7MEWhdbI7jItg4zAkG0cSFdJA5db7ARBWO8Ttwot39OA3SII4nKLvUoaaBxICwzZlkFm9x/je8mDWWjZ9afRjoyMOBv/Qnd/wU6KEaR4QoveZ4bqeZ/GLkM1v2WTVDqdzlAoRJJkLpfjvmsotAAAADvY30I7ep/o/fI3xG++7OV7GrBbKLSHLJfL0TQdj8eXl5cnJycNyp50xZPseBvvrQBB8slqLpPlp2jx50fik5kuPTlqUM3Pz4fDYYqiUGgBAAB2a38LrQWADyi0h4z73UilUsFgcHZ21mg0TjRdoDs+4b0VIMi6jLfR4s8upc/0AAAgAElEQVTTZSez/T/zP5ntkzNXR0ufHB0dXVhYiEajNE3nf0xQaAEAAHawudC2GNldRjDINBuyDQPpyrVCOwLAB67QVkoDDQPpZkNWMMjs/mN8L3mQCy131HE0Gl1YWBgbG9Oo5KHyZ3OD5exkJ4IUVRhLI9X4J0rwBjsu4n0yWybTe87d+NnExMTS0lI8Hs9kMii0AAAAu7W/hXYYgA93LrQf/73tUrMNhXZ/cdc6TiaTfr9/ZmbGaDQOtpVSDad57wYIsmWyih/I6meZoTreZ7I5VPNbE91l3D17kslk4Y8JCi0AAMAO9rfQDgHwYbtC+/Hf2/75//1fBEGcu65Cod1f+Z20kUiE20mrVqsXqt7IKn5kJzoRpAiTM5STVX/Iaa/yPpN1GRMlrj86pFdzV4TifkzyXzQUWgAAgB3sb6E1AfBhc6HNV1kOCu1ByO+kDQQCs7OzZrNZ0dcbLHsmZyhnJzoQpAjDjAqo2hcysm94n0k+WdVPvurXLRaL2+2ORCKFV4RiUWgBAAB2tLnQCgbZXabZwDTps/WadIUk8IvAThCEEYAPBEH8IrBXSAL1mvRH37X+83+/XWU5X15T7f6Dvfs84IWWXbt/TywWW1pampqa0ul0fV1t4bKnGXMt7z0BQbYL1fxGVvF33qexNpk3rZ0l+RNoC68IxaLQAgAA7Gh/C+0gAB+4QvvuF9X/z3//n8RWUGgPSP4HZHV11e12W61WtVotb6sPlz/DjDTwXhUQZOuMtVKNf8qqf+F9JsxIQ6zkpFE/4HA4AoFAKpXa8EuCQgsAALCD/S20BgA+EATx3/75f2xZZeEwPfnkk8PDw0qlUtlSTjX+iRmpZyfaEaQYMyak6l/OaX/ldxp099+cDX8ZHh7m7kBLkmTh8cYsCi0AAMCO9rfQ6gH4QBDEl1eVx/79me2KFvbQHpz81aFisZjP53M4HGazWS6Xa5p/jZQ9lRv4lR1vR5AiDGNppmpfyOnLeJuDVRi/cVKv6C483hiFFgAAYG/2t9DqAPhArJ1De0kw/b8ffQmF9pBxPyMkSUaj0aWlpenpaaPRKJPJelrrV8qep7u/4L26IMiWYcw1ZPkp1irkZeuZ3nPOurNGo3FmZiYYDG4+3phFoQUAANjR5kLbPMjuMk0GplGfrdOkyyWBSwI7QRBaAD4QBHFJYC+XBOo06UZ99opo7qFHX95QaHf/wd59UGjzuCsep9PpSCTi9XptNpvRaJTL5R0dHVNVZ6jGP2XaPsz0fMFahex4G4IUTzKyr2nB27xsmqx+brC7YXR01OPxRKNR7vrGKLQAAAB7s7+FdgCADxsKbZOBaR5kf21z5WstCu0hyOVyXKcNh8Ner3d6etpkMikUis7OzuHKz6iWt+m2D9OlJ1FrkWIL1fBqVvXjIW80q/pxqeo1vV4/PT29srKSTCYzmczm3xAUWgAAgB3sb6HVAPBhy0LLhau1KLSHgDuZtnA/rd1uN5vNKrmUrHsxZ6xkx9uY4Xq67cN0ySO04O2s/Hs0W6QYwliayPInmOH6w9uoVRgrOamRdoyMjOQvB7XlbwgKLQAAwA62KLQGdpdp0jONumydOl3eG7jUbCcIQg3AB4IgLjXby3sDdep0oy7bpGd2/zG+l6DQbrC509psNl/jhxnZN+yYKB9mpDHTd5Fqej197T+optfpzk+z8u9ymsvsaEvhaghyaMkqf6AaXj20zWXEn03Wf6HT6Ww2m8/nSyQSG24/m4dCCwAAsIPNhbbJwO4yjXqmQZetVafLegM/N9sJgugH4ANBED8328t6A7XqdIMu26hndv8xvpeg0G6W77TJZDIYDC6rq+nWP2/7v+xHW7Ly7+jOT6mm16naF1K/Ppy6/FA+dOenvPcc5MEJWfV0TnfjEDaU090IlT2jkkstFsv8/Pzq6up2u2dZFFoAAIAd7W+hVQHwAYW2qHAXiEqlUqH5KbLmeWakgR1rRZAiT1b5A9Vw+hA2RNb+p66twmAw2O32/O7ZDXfryUOhBQAA2MH+FloFAB9QaItKLpejaToejydqX8lpr/JeVBBklyGrns7pSg50E3TH2fH6c2q1emxszOPxRCIRkiQ3X9w4D4UWAABgB/tTaCXBSwLHf/mv/7T5/p8Ah+C//Nd/uiRwlEmCKLS8435SUqlUeFxONf6JtbYiyFFJVvED1XD6AMdX/rRU8apMJhsaGnI6nYFAYLuLG+eh0AIAAOxgc6FtNLC7TIOeqddlazRkmTT0i9B5scL4+SXpme9E719sfu+rxve+akCQg0zj+xebz3wn+vyS9GKF8Rehs0waqtGQ9bpsg57Z8hOrf55gn1dttcQ1+W8ES2zK8+XbLFfdem3BQka+qdCeXf8qFT/f8cPEnUBLUVQ0Go21fJBV/J21ChHkCCVdepIxVh7EyDlD2WrpU9IescFgsNlsS0tLsViMu/fsHb5TKLQAAAA7uMdC26DL1WqoClnkSrv7+1rruZKBzy9JP/mx6+MfxR//0IkgB5gfxZ/82PX5JemX1zXf11qvtLsrZOFaDdWgy+290OaXuCb/jYh+7tr02i2W658n2N/8eGsPrfQDliBY5aZCe1Z162/VWZY4wboO+wt+yLizZ5PJZMhhJquf5b2cIMheQ3d8Qnd8su/DMsbK1crnFe0NGo1mfHzc4/GEw+HdHNmBQgsAALCDLQqtnt19GrS5Og1dpYiXdPkutcx+X2O9WG78qlR//obuXIkWQQ4u52/ovirVXyw3fl9jvdQyW9Llq1LE6zR0gzbXoGO2/Ljeqq93WrJWXDe+dovl6wpt2s78lmDPKtd9uwoLLetiTxBsueuQv+CHLL97NtJ1PtP7JWttQZCjlZyhlCx/Yn/HZIbrIuXPyFtvqlQqi8XicrmCweCOBxtzUGgBAAB2cK+FVsfUa7M1arKiL1LS5bvS5r7UMvtzs+MfTXYEOej83Oy41DJ7pc1d0uWr6IvU9Kfrtdnt2uxhFNoy17pv17pCq2KJwkLrYk/kj0Y+e/sl5SfWH6LsYk8QrKpg5a1HyB/PvGl91XYjbz+He/sxSaVSwYWZdMUpdqSJHW1BkCMX8uYzOc2V/RqNGaqLVj6vEJQpFIqhoaGZmZmVlZV4PM5d2RiFFgAA4F7de6Ft0ObqBjI1/ekqRbyiL1wmCZX1Bkt7Aghy0CnrDZZJQhV94SpFvKY/XTeQucPu2VsVdMsTYu+90Eo/YInfsq7tDzkuP1FQGl3sifVPnShnWZZ1lW86LHmtc3LrusrXFd11xzMXLM8Pojp7a6Pbjbx5DveAu7hxLBYL9pfTbR+yowIEOYrJ9HxJC9/Zl6EY081o5XMKQZlMJjOZTHa7fXl5mTt1dpeXkUOhBQAA2MHmQtugZ/eUeh1Tr83VabO1GrpGTVX3pxHkUKMmazV0nTZbr83V65g7fFZ1zxPs86o7LrlVXDe9dovlunX1+N8Z5x0vClVYFzfWS9Wth1xfXXdY8qYDlbmSvLmg3irPG9bffuTt5nC38r8koVAoLDyb7fua91qCIHeXnPYaWfnUvowTLv+jvLlUJpMNDg5OT097vV7uPj27vyg6Ci0AAMAO7r3Q3uq0OqZem+NSp80iyOEk/6njPoR3/qDuf6G9fcjxVhd3ub2HVsUSBbtDuXq5LmtlMv/UrZW3KbT5Xa955Se2KbTr9+7mR77DHO72l4S7HNTKykqi/Omc/gbvtQRB7jrpa//BDNXeywg59c+B8uckLdV9fX2Dg4M2m21xcZG7ENRuTp3NQ6EFAADYwb4U2i3KLYIcVnb/4eSv0K6/yvEWBwBvkO+lGwrq2nHCe9hDu+F2QWsr7DyHvckfb+x1OdLXf8eONiPI0Q1V81xO/fNdvnykIdP58UrZc12iZm7f7IY2u5tTZ/NQaAEAAHaw74UWQYo2fBbadVVz/fmrW1hfaNedE8v9vfkc2oLluym0O89hb3K5HEmS4XDYO9RL1b/MWpoR5Ogm03aG7vz0Ll6Y01yOlT01WvVZZ2enQqEwmUz5NptKpfbaZlkUWgAAgB1tLrT1OhZB7svoniPY51R3XOKa+Dci+plr02u3WK57bk+FdqvrQhHrLzLMXdtp3Tm3XP8sODz49niqrY4W3qbQbjHyNnO4t5+RYDC4LLmcaT/DWpoQ5OgmK/+Wqn9lb68aqc90fuy/8YfeprLu7m6VSjU0NGS3271e793tm+Wg0AIAAOwAhRZB7jqPfCG7U6HdB0fj7rWFJ9CGhJ9mJOd5LyQIci/J6UvIssd3v35Gcj5243FL1adtbW0SiWRgYMBisczOzi4vL0cikbtusywKLQAAwI5QaBHkroNCy+EKbTweX1paCgo+yUjOsZZGBDm6YQyl6dLf72bNjORcvOT3zvI3upsqxWKxQqEwGAzj4+Mul2tlZSUWi5EkuaerQG2AQgsAALADFFoEueug0HLyV4RaWFgICD7O9J5jRxoR5AhnuC515eE7r5DpPRcv+b2z7PXupsr29naJRKLRaIaHh6enpxcWFoLBYCKR2P39ZreDQgsAALCDzYW2TsciCLKbHHyhPRq4QhuJRNxut7/5bKb3HDvSgCBHOqnLD225PCv7hhK8mbj6W2fZ612NFe3t7b29vSqVymg0jo+Pz83NcYcZp1Ipmqbv/WcBhRYAAGAHKLQIctdBoeXkcjmKoiKRyPz8/ErTRyi0yH2Q9LXfMqab3N+M/kZW9g3d+l782iOe0pc1VRdELU3t7e09PT1KpdJgMIyOjjocjsXFxWAwGI/HucOM7+6k2Q1QaAEAAHaAQosgdx0UWg5XaMPhsMvlWmn6KNP7JTtSjyBHOmTFk1Tre1Tja/Frv4tc+72n9CVD5d86mm62trZ2dnZKJBKVSsVVWbvd7vF4/H7/hh2z+/KDgEILAACwgy0KrZZFEGQ3QaHlFBbaZcGnme6/8t5GEOQeQ9W9aCt5TVn1dVtDpUAgEIlEnZ2dPT09crlco9GYTKaxsTGHw+HxeFZWVsLhcDKZ3Mcds3kotAAAADvYXGhrtSyCILsJCi0nX2jn5+fnOv9Bt77PDtcjyJEOWfl0d8ONtrY2sVgskUgUCoVGoxkcHBwZGZmcnJydnV1YWOD2yiYSicIqu7+/Ayi0AAAAO0ChRZC7DgotJ38OrdvtnlB3ktXPsMN1CHKkky5/Qt5WL5fLtVqtyWQaHR2dnJycmZlxu93Ly8vBYDAajeb3yu7jMcYboNACAADsIF9og8Ggw+F44iv5I1/IEATZTZ74Su5wOILBIAotTdPRaHRhYcE6Yk5f/x07VM17IUGQe0nyysMalXxoaGhqasrpdHo8nuXl5UAgEIlE4vF4Op2mKOqA9soWQqEFAADYAVdoSZIMhUJOp9NoNEqlUpFI1Nzc3NjY2AAA6zU2NjY3N4tEIqlUajQanU5nKBQiSfJBLrQMw9A0HY/HvV7v2NjYasVzuf6f2OFaBDmiYYwVyav/YTabHQ6H1+sNBoPcocWpVIrrsdls9qCrLAeFFgAAYAcMwxQeLmi1WgcGBqRSaVdXl1gs7gSA9cRicVdXl1Qq1Wg0VqvV7XaHw2GKovb3SjBHC8MwmUwmmUz6fL6pqSl302eZzk/ZoVoEOaLJqS9Fyv8wPj6+sLDAXfDpkHtsHgotAADAzrjDBePxuM/nm52dtVqtRqNRr9frdDotAKyn0+n0er3RaLRarbOzsz6fLx6P0zT9gBfabDabSqUCgYDD4RjvvUk1nGaHahDkiCYrOeere9dms62srCQSifwX/PC/4yi0AAAAO8sfdRyJRHw+n9vtnp2ddTgcdgDYisPhmJ2ddbvdPp8vEok84CfQcnK5HEmSq6urc3NzZrM5XPZ0Tn2J91qCIHcXuu3DOeGFmZkZ3s+QR6EFAADYGXfUcSaTSafT8Xg8HA6HQqFgMBgAgK0Eg8FQKBQOh7lrw+z7nSePIu7MhVvXhbJap1u+oUXvs0PVCHIUQ9W9OClvdDqdq6urJEnmcjm+vlkotAAAALvCddpsNkvTNEVRaQDYCUmSNE3nz6nj+0vMM+402kQi4fP5bDabfqA/VvJ7Rl/CmqsR5GiFMZQlrj1iGTLOz89HIhHuDHm+vlkotAAAALvFnR2UW5MFgO3lvym8nFZXhPI3AAuFQtxRx7MNn9EdZ1nzTQQ5Wsn0/NVb+2er1bq4uBiLxbgTaPn6ZqHQAgAA3A0GAHbC99e06HCXl4vFYouLi+Pj4zp5F1n1B8ZQyns/QZA9hWp+faLj6tTUlM/nSyQSmUyGx+87Ci0AAAAAwGFgGCabzSaTyUAgMDMzYzQaRwV/pwVv895PEGQPMVUkr/6HyaCdmZkJBAKpVCrL6yXfUGgBAAAAAA5J/qbWCwsLY2Nj/f39SxWns7ILrLkKQY5EsrKL/qpXhoeH5+fnw+Ewv1eEYlFoAQAAAAAODcMwmUwmmUz6/f6ZmRmTyaTqEUVKn2R0V1lTJYIUf2jBmxNtl8bHx71eL3eLaX7PL0ChBQAAAAA4JAzD5O/f4/V6JycntVrtcPOPVPMbvBcVBNkxjO5qrOT3gzqN3W73+/28H2/MotACAAAAABwmbidtKpUKhUIul8tisahUqunaTzPtZ1hTBYIUc+jW96aaLxbP8cYsCi0AAAAAwCHjLnecSCRWVlYcDofJZJLJZBM1f6Fb3ua9sSDIdmEGfomWPKFVKycmJpaWlrjjjVFoAQAAAAAeLNzljkmS5A48ttlsBoNBKpWa6y7QgrdZYzmCFGGohleHWq+YTKbZ2dlgMFgMxxuzKLQAAAAAAIeP67TpdDocDi8sLExMTOh0OolEMlR/kWp4ldFe4b29IEhhcsofVkufUqvV4+Pji4uL0WiUoqhcLodCCwAAAADwIMrlcvmTad1ud77Taut/iJY8lun5v6yxDEGKJGT1c/r2Sm73bDHcfjYPhRYAAAAAgAfcFY9pmk4mk8FgkOu0er1eKpWKW5tc5a9T9S8z2su8NxkEyfb+bbHqdY1GMzEx4fV687tn+f4OsSwKLQAAAAAAXwo7bSgU8ng8k5OTg4ODcrm8s7NTVftj5PpjdNuHjPYyayy9l+TkF+5xBOTQQtU8m+v/kfdp5JPr/zFU9gelRDw0NDQ3N1c8Z89yUGgBAAAAAHhT2GlXV1cXFxdtNpvZbFapVN3d3Z3CxonKD2NXf0c1vZaVnmcHS/cQw/Vs7xd0w+n0td9StS8w2l/39nKEp6Svn2AGLvM+DS6M9tdo6SllR6NOp7PZbMvLy7FYrBgubpyHQgsAAAAAwCeu03Ln04bD4aWlpZmZmdHRUZ1OJ5PJxGKxUCgcuHnRW/pCuvzxTOs72d6/Mep/sIM3tkym61Oq9gWy9GTqysNU7QuZrk8Z7ZXtVkaKLoZrqSsP8z+NtVD1rxiaL/f394+Ojrrd7tXV1XQ6XTy7Z1kUWgAAAAAA3uU7bTqdjkajfr9/fn5+ampqaGhIo9H09fWJxWKRSNTVWGEu/8RT+lLk2v9JXP0tVfefmdZ36NZ3C0PVv5Tt/Vuu/wfeuxByF8n1/0CWnuR9Glzo1vfG6r5QKBRDQ0Ozs7N+vz+ZTNI0XTxtlkWhBQAAAAAoBgzDcPfyoSgqkUisrq4uLS05nc6JiQmz2TwwMCCXy3t6ejo6OkQiUUtLS2tjjazmJ3P5JyPlH3EZLjszXHbGd/3pbO9fWUMJchSTlXxJVT/L+zRYQ0lG/NnczXf7+vqMRqPdbucONi6SW/UUQqEFAAAAACgW+VNq0+l0LBYLBoNer3dubm5qaspisQwODmo0GoVCIZVKu7u7xWJxZ2dnR0dHe3t7e3u7SCQSCoXtjVVk5R8Y7WXeGxFyF8m0f0g3v8H/NDo/9pX/p7RHrNfrJycnFxcXI5EISZJFdbAxB4UWAAAAAKCIcJ2W21WbSqVisVgoFFpeXna73TMzM5OTk6Ojo2azeXBwUKfTDQwMaDQatVrd39+vVCq5g5ONtRfo5jdYw3XkyIWqeT7b+1c+56D/lRa+7aj6c09Pj1arHR8f93g8q6urqVQqk8kUW5tlUWgBAAAAAIpQvtZye2sTiUQkEgkEAsvLywsLCy6Xa3Z21m6322y2qampycnJiYkJruhqNJre3l5/2XO5vvO81zNkr0lf/XdGe5mvrTPay1Tdi8PVX/b09AwMDFit1vn5+WAwmEwmM5lMsR1szEGhBQAAAAAoRtxZtVytzWQy3A7bRCIRjUbD4XAwGPT7/SsrKz6fb3l5eWlpyePxzM7OWq1WrVar7GgkK59idVdY/TXkqCQn/4Ysf5zHrUdLTykar+bbrMvlCgQCiUSCu09PEbZZFoUWAAAAAKDIbWi2NE2TJJlOp1OpVDKZTCaTiUQiHo9HIhG/3+9yuaxWq1qtHm78lm5+g/eShuw+mfaPaOE7PG36TODG072CmxKJRKvVjo2NuVwuv9+fSCSK8EJQhVBoAQAAAACOhnyz5cotJ5PJ5FtuPB73+/1Op3N4eFihUMzc/CDT8RGrv4ocidCi98jqZ3PSc4e50WzPX+LXH52ufK+zTdjX16fX6ycmJubn5wOBQDwepyiqCC8EVQiFFgAAAADg6GE24a4jFYvFlpeXp6enBwcHpVKpv+y5nPQcq7uKFH/SZY8ry75cvvEMVfdSTvb1QW8uJz1HVj/rKX2pu6lSLBYrFAqj0Tg1NeXxeEKhUDKZLPJ9sxwUWgAAAACA+wHXaUmSjEQiCwsLExMTWq22r6stfOMUo/w7721tD0VL8R2rvcz7NA77Xfd95S95urGxsbGxUX7z+2DJKbrptVzfVweyLdnXVP0rvhvPyOqvtLe3SyQSjUYzPDxst9u9Xm84HE4mk8V83mwhFFoAAAAAgPsEwzCZTCaVSoVCofn5+dHRUbVarRBVk7UvMJqfWd2vRyJ0y9t0y9u8T+PQ3/VbI9V/bW9v7+zsbG9vFwqFupvn/SVPp8sep4XvMMrv730Tub7ztOBNsuLJYMkpdc13IpGou7tbqVQODg6OjY05nU6fzxeJRNLpdNFe03gzFFoAAAAAgPsEd4YtTdOJRII7mXZkZESpVCpbyqn6lxj1z6z21+IP0/9j+saj7MAvvM/kMJO49ju5uEWpVKrVapVKxd1SWCQSiRvKLeUfRa79H7L6Wbrl7WzPX/f27zjwS7b7L3TTa/GrJ/wlTxsrPu9uuMFVWblcrtPpLBaL3W5fWFjgTpolSTKbzR6VNsui0AIAAAAA3E+4TsudTOvz+RwOh9lslsvlCkEZVf8So/4Hq71S/KEbT2faPuR9GoeWbPfnS5WvajSaoaGhsbExq9VqNpu1Wq1cLu/u7uZ22Eprfxkp/8h74/nEr78lK56km16jW96iW97KdJzNSb4oTKbjLN3yFlX/Mln9bOLKw54bL2mrzrU3VgmFwvb29p6eHq7KjoyM2Gy2+fn5lZWVSCTCnTRb5JeA2gyFFgAAAADgvpI/mTYajS4tLdntdqPRKJPJFIIysuYFRvE97/1tx+T6LpDlj/M+jUMLWfUHQ1f98PCww+HweDwej8fpdE5NTY2MjBgMhv7+/r6+vq6urvb29tbWVoFA0FVfoq06N1L+0XDZmdmy13w3ninMbNlrI+Uf9Vd/K639RSAQtLa2dnR0dHd39/X19ff3GwwGi8XCVVmfz7e6uppIJEiSPEKHGRdCoQUAAAAAuN9wJ9Om0+lIJOL1eqenp7lO29dSGb5xKif5G6u9XOShqp/Ldn/G+zQOIdnuz5YqX9Xr9Tabzev1rq6uhsPhUCi0vLw8Pz/vcDjGx8eHhob0er1arZbL5RKJpLu7u7Ozs6Ojo62tTSQStRYQiURtbW3cubhdXV0SiUQul6vVaoPBMDw8PD4+7nA43G43V2Xj8Xg6naZpmtsxe+TaLItCCwAAAABwX8rlcoWd1mazcZ22S9S8XPZCpuNjduByMScn+5osf4zV/Mz7TA463O7ZkZGR+fl57n45JEmm0+l4PB4Oh/1+v9frdblcdrt9YmLCYrGYTCaDwaDVatVqdX9/v1KpVCgU8jUKhUKlUqnV6oGBAb1ebzKZLBbL5OSkw+GYn5/3er1+vz8cDicSiXyVPYo7ZvNQaAEAAAAA7kPcybRcpw2Hw/n9tHK5vKtDNFvxFt3yNqv5BzvwS9EmI3idbnmH92kc7HvsPOu5+bZOp7PZbMvLy/F4nCuZ2WyWpmmSJJPJZCwWW11d9fv9S0tLHo9nbm5uZmZmenp6cnJyfHx8bGxsdHTUYrFYLJbR0VGr1To+Pj45OWmz2RwOx9zcnMfjWV5eDgQC4XA4FoulUimSJO+DKstBoQUAAAAAuD8VdlpuP63dbjebzUqlUiwWW27+X7LyqWz3X3gvddtG8490ySOM6nv+Z3IwYVTfR0seU0m7RkZGXC7X6upqOp3OH/3L/fPlm20qlYrH49FodHV1NRgMrqysLC8vLy0tLS4uLiwsLCwseDyehYWFxcVFr9e7vLy8srISDAZXV1ej0WgikdjcY496leWg0AIAAAAA3Lc2dNqlpSWHwzEyMqJWq3t6enqaq5ZKX6CbXmP6f2AHLhVhsl2f0oI3eZ/GAYWqe3FQeHXD7tlcLlf4z8f9C3LNNpPJUBTFHZCcTCYTiUQ8Ho/FYrFYLLomFovF4/FEIpFMJtPpNEmSFEVlMpnCHnt/VFkOCi0AAAAAwP2MKzCZTIa77rHP53M6nVarVafT9fX1dXR0GKrPR0tOZtrP8F7wNiQnu0DVv0zVvcj7TA4imc6z7sq3VCqVxWJxu92Fu2e3+0csLLdcv81kMvQm3HJuHW79+6zEFkKhBQAAAAC4/+Xv5ROPxwOBgNvtnpycNBqNSqWyq6urq6V2pvytdNljWfEnrOZn3sMov6MFb65eO6movDhS9lGm9V3ep7TvbzBa8pi8p8NoNDocjpWVlUQisWH37J3/NTfIrdmw/KA/V7xDoZ7eqEoAAAwxSURBVAUAAAAAeCBwnZaiqEQiEQqFFhcXHQ6HxWIZGBiQSqUdHR3dTZWe0pfIqj9kOz5iNf/gJYzy20zLm5HrJ82Vnzc3NwsEgubm5oXSl7Ldn/E1pYMIVfefesGVgYGBiYmJxcXFSCRCkuR2u2fhDlBoAQAAAAAeFNyuPJqmU6lUJBJZWVlxuVwTExNGo1GlUvX29ra1tUnqr7nKTsevnqCF7zDKbw+t42W7PqMaXold/d1wxSftgvqOjo7u7u6enp6uri5xa1P4xilGfpH3IrovyXR85K58U6lUWiwWl8sVCoVSqVQmk0GbvQsotAAAAAAAD5D8ZaJIkszvqp2ZmbFarQaDQalU9vT0tLW1dTTdnKj4IHrtUarhlWzHGVb9A6v56SCSk3xBt7wZv/6o98bzAzcvCoXCzs5OqVTa39+v0+kMBsPAwIBMJpMJq8ibfzy4aRxacpIvgmXPFB5svPlaULB7KLQAAAAAAA8c7vBjbldtNBr1+/0ej8dut1ssFr1er1Qqe3t729vbRS1NAzcvukpPJ648TNW9lGl9L9d3nlX/dK/p/yHb+THd9Kf49UeDJacs5WfEDeUikUgsFvf19anVapPJNDY2Nj09bbfbuR3ICoXC1PA91Xh6H7bOX7g2KxWLtFrt5OQkDja+dyi0AAAAAAAPovxtTimKSiaT4XB4ZWXF7Xbb7fbR0VGDwaBSqaRSqVgsFolEAoGgv/pbe9mb4Wsnk1cepmqeywhez7afyfV8nus7x6p/vHMYxde5ns8zwnfoxtNkxanElYc9N17UV/xV3FAuFArb29t7enrkcvnAwIDZbJ6YmJidnV1YWPD5fCsrKwsLC9PT0yaTSSaTzdx8n259b8fNFWdyki8Cpc/0dgj7+/tHR0fn5+dxsPG9Q6EFAAAAAHhwbTgCmau1Ho/H4XCMjY2ZTKaBgQGFQtHb2ysWi9va2oRCobC5QVbzk7n8E1fpad+NP4avnUxdfih1+SGq5rkNIW8+wz0V+/WE78Yzk2XvaqvOddWXCASC1tZW7izZvr6+/v5+g8EwMjIyNTU1Nzfn9XqDwWA0Gk0kEtyUvF6vzWYbHByUSqW26o9pweu8t9O7a7PdbQKlUjk8PDw7O+v3+/d0ZWPYEgotAAAAAMADjbu/C3dfU67WRiIRv9+/uLjodDqnpqZGR0eNRqNWq1UqlX19fT09PWKxuL29XSQSCYVC7kLETU1NspqfNkRSc6mpqYm7WLFQKBSJRB0dHV1dXRKJRC6Xq9VqvV4/NDQ0Pj7ucDjcbvfy8nIoFIrFYqlUiqIo7iarqVQqHA4vLi5OTk7q9XqJRDJc8yVV/zLb/z2r/uFIJCf5W6D0j91tAoVCYTabHQ6Hz+eLxWIURXE32uH7I3CEodACAAAAAMDGWptMJqPRaCgU8vl8Ho/H6XTabLaxsbHh4eHBwUGtVqtWq5VKpUwmk0gkt65FLBaLxeLONdzDrq6unp4eiUQik8mUSqVGo9Hr9SaTyWKxTExMOBwOl8vl9Xr9fn84HI7H4+l0mqbpbDbLNT1u73EqlVpdXfV4POPj4zqdTiKR6Bt+oOpeYhTfsP0/FHlyvevarN1uX15ejkajOHV2X6DQAgAAAADALVyt5WokRVHpdDqRSOSb7eLi4vz8/Ozs7PT09MTEhNVqHRkZMZvNg4ODBoNBp9PpdDrtGu6hwWAYHBw0m80jIyNjY2OTk5MOh2Nubs7j8SwtLQUCgXA4zO2SJUmysMpyTS9/n6FkMhkKhdxu98TEBNdp+xsvU3UvMn3n2f6/F20ybR8EbzzNtVmTyWS325eWliKRSDqdRpvdFyi0AAAAAACwTr7WcjtsuWabTCZjsVg4HA4Gg36/f3l5eXFx0e12u1wup9M5MzPjcDjs6zkcjpmZGafT6XK53G734uKiz+cLBAKrq6vRaDQej2/XYzdMJt9pg8Ggx+OZmJjQ6/VSqVTeXLp646ls+we8F9fNYeQXqNoXZive6uoQ5ffN5tssLgS1X1BoAQAAAABgaxuaLU3T+XKbSCRisVgkEgmHw6FQKBgMBoPBwHrcwlAoFA6HI5FILBZLJBJcieVOkeV67HZVtnAahftpPR7P5OSkwWCQyWQ9rfXzZa9StS8w8gu8l9jbO2bbP4xeP9lf95NYLFYqlWizBweFFgAAAAAAdsCs4cptYb8lSZIkyfT2uBUoiqJpenOJ3WW1K+y0q6urCwsLNpuNuz9tZ2dnf91P0WuP0sK32f7v+Q2juEg1vDJX9lqnsLGnp0etVo+MjMzMzHDnzeJI432HQgsAAAAAAHvAFMgVyG6lcIXCF97ddvPXiOLu5WO324eGhvr7+3t6ejpELVOVH5A3/5jr/pxVfc9Lsh1notdP6mu+7ujo6Ovr0+l0VqvV6XT6fD5cBeqAoNACAAAAAMC9Yra3v1vhOm06nY5EIsvLy7Ozs6OjozqdTiaTdXZ2yuqv+EueoupfynaeZVXfHVoyovfI8lMLpS91tdR2d3erVCqTyTQ1NeV2uwOBQDweR5s9ICi0AAAAAABwZOQ7LUmSsVjM7/fPz89PTU2Zzeb+/v7e3t62tjZt9dfeG8+nyx7LCN9h5BcOrscysvOZljfj1x9xlr3W01jK7ZjVarUWi2VmZsbr9a6uriaTSYqi0GYPCAotAAAAAAAcMdwtcymKSiQSq6urS0tLs7OzVqtVr9crFIru7m6RSCRuKJ8qfzd29QTd8HKu+1NW9e0+Jtv2Z6ruxdivJ6bK3+1qrGhvb+/t7eV2zE5OTs7Pz6+srHAnzdI0zR1uzfd/s/sTCi0AAAAAABw9hYcfc7tqPR7P9PT0yMiITqdTKBQ9PT3t7e2iliZt1Tl/yVPpssfohpczre8yki9Y5bd3kVzXp3Tza1Tt88krD7tKX+mv/ralpYWrskql0mAwWK1WbsdsKBRKJBLcjlm02QOFQgsAAAAAAEdS/qrLFEUlk8lwOOzz+ebn5202m8Vi0ev1KpVKIpF0dna2traKG8q1VedmS1+LXHuULD9F1TybaXqVbn4tJz57K92fs8pvWOU3ue7PuSXZjjN006tU/UvkzT+mLj/kL3lqrPx9Zc0PrYJGkUgkFoulUml/f//g4ODo6Kjdbvd4PH6/PxqNplIp7Jg9HCi0AAAAAABwhBWeVcsdgezz+dxut91ut1qtRqNRo9HI5fKenp7Ozk6RSNTS0tJVXyKr+clc/slY+fu+G3/kErz+ROryQ6nLDwWvP8Et8d54brjsjKbqgrT2l+bmZqFQ2NbWJhaLJRKJQqEYGBgwmUxjY2MOh8Pj8aysrITD4fwZs2izhwOFFgAAAAAAjjbucsrZbJam6XQ6nUgkwuHwysrKwsLC7Ozs5OTkyMjI4OCgRqNRKBRSqbS7u1ssFre3t7e1tbW2tgqFQoFAIBAImpubm5ubBQJBS0uLUCgUiURtbW0dHR1dXV29vb0ymUylUmm1WpPJNDo6OjU15XQ6FxcX/X5/JBJJJBIkSWYyGVTZw4RCCwAAAAAA94P8Ecg0TZMkmUwmo9FoMBhcXl52u90zMzNTU1Ojo6NDQ0MGg0Gr1arVapVKJZfL+/r6JBJJ7xqJRCKVSmUymUKhUKlUGo1Gp9MZjcbh4eGxsbHp6Wmn0+nxeHw+XygUikajyWSysMqizR4mFFoAAAAAALh/cJWSOwiZoqh0Oh2PxyORCNdsFxYWXC7XzMzM9PT05OTk2NjY6Ojo8PCw2Ww2mUxGo9FoNJrN5qGhoZGRkdHR0fHx8ampKbvd7nQ63W631+tdWVnhemwikUin0xRFocryCIUWAAAAAADuN/lam81muWabSqUSiUQ0Gg2Hw8Fg0O/3Ly8ve73ehYUFt9vtcrnm5uacTufc3Nzc3Nz8/LzH41lcXFxaWvL5fIFAIBQKRSKRWCyWTCbzPTZ/riyqLF9QaAEAAAAA4L61odlyRyOn02mu38bj8Wg0GolEwuHw6ppwOBwOh6PRaCwWi8fjyWQylUqRJElRFE3T6LFFBYUWAAAAAADuf/lmy5XbfL+laZqiKIqiyALcEq6+5htsvsSixxYPFFoAAAAAAHiwMAVy22PW43vWsAUUWgAAAAAAADiSUGgBAAAAAADgSEKhBQAAAAAAgCMJhRYAAAAAAACOJBRaAAAAAAAAOJL+f0jtVprkFoSJAAAAAElFTkSuQmCC" alt="" width="888" height="311" />
其实根据微软的说法,他们本身就被设计成类似但是可以独立运行的结构

ASP.NET Web API has a pipeline for processing HTTP messages on both the client and server. The client and server sides are designed to be symmetrical but independent; you can use each half by itself. Both sides are built on some common objects:

  • HttpRequestMessage represents the HTTP request.
  • HttpResponseMessage represents the HTTP response.
  • HttpMessageHandler objects process the request and response.

直接看图,在客户端,Handlers pipeline最终是被传递到HttpClientHandler上的,由他负责HttpRequestMessage到HTTP请求的转换。

这里只说明一下Request,Response与其类似。

(四)解决第二个问题

由 此我们早就可以看出,想要解决第二个问题,可以直接在Handler PipeLine中进行,这种AOP风格的过滤器(拦截器)在REST的Webservice的安全验证中应用很广,一般大家比较乐于在HTTP头或者在 HTTP请求的URL中加上身份验证字段进行身份验证,下面举一个在Http头中添加身份验证信息的小例子

4.1客户端
客户端的customhandler用于将身份验证信息添加入报头

复制代码
    class RequestUpHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            request.Headers.Add("key", "11234");
            return base.SendAsync(request, cancellationToken);
        }
    }
复制代码

注:
1.customhandler继承自DelegatingHandler类,上面已经说过,WebAPI的客户端和服务端被设计为相互对应的两套结构,所以不论是在客户端还是服务端,customhandler都是继承自DelegatingHandler类
2.DelegatingHandler的sendAsync方法便是处理请求和接受请求时会被调用的方法,该方法返回值是HttPResponseMessage,接收的值为HttpRequestMessage,符合我们的一般认知
3.方法的最后,调用base.SendAsync是将Request继续向该pipeline的其他customHandler传递,并获取其返回值。由于该方法不包含Response的处理逻辑,只需直接将上一个CustomHandler的
返回值直接返回
客户端主程序

复制代码
        static void Main(string[] args)
        {
            HttpClient client = new HttpClient(new RequestUpHandler() { InnerHandler = new HttpClientHandler() });
            HttpResponseMessage response = client.GetAsync("http://localhost:60023/api/FormSubmit").Result;
            response.Content.ReadAsAsync<string>().ContinueWith((str) => { Console.WriteLine(str.Result); });
            Console.Read();
        }
复制代码

客 户端的主程序创建了一个HttpClient,HttpClient可以接受一个参数,该参数就是CustomHandler,此处我们嵌入了我们定义的 RequestUpHandler,用于对Request报头进行嵌入身份验证码的处理,CustomHandler通过InnerHandler属性嵌 入其内置的下一个CustomHandler,此处,由于没有下一个CustomerHandler,我们直接嵌入HttpClientHandler用 于将HttpRequestMessage转化为HTTP 请求、将HTTP响应转化为HttpResponseMessage

4.2服务端
服务端的customHandler用于解析HTTP报头中的身份认证码

复制代码
        protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            int matchHeaderCount = request.Headers.Count((item) =>
            {
                if ("key".Equals(item.Key))
                {
                    foreach (var str in item.Value)
                    {
                        if ("11234".Equals(str))
                        {
                            return true;
                        }
                    }
                }
                return false;
            });
            if (matchHeaderCount>0)
            {
                return base.SendAsync(request, cancellationToken);
            }
            return Task.Factory.StartNew<HttpResponseMessage>(() => { return new HttpResponseMessage(HttpStatusCode.Forbidden); });
        }
复制代码

注:代码的处理逻辑很简单:如果身份验证码匹配成功,则通过base.SendAsync继续将请求向下传递,否则返回直接中断请求的传递,直接返回一个响应码为403的响应,指示没有权限。
注意由于SendAsync的返回值需要封装在Task之中,所以需要使用Task.Factory.StartNew将返回值包含在Task中

将customHandler注入到HOST中
本例中WebAPI HOST在IIS上,所以我们只需将我们定义的CustomHandler在Application_Start中定义即可

        protected void Application_Start()
        {
            //省略其他逻辑代码

            GlobalConfiguration.Configuration.MessageHandlers.Add(new HttpUrlHandler());
        }

由于WebAPI Host在IIS上,所以HttpServer和HttpControllerDispatcher不用我们手工处理

在加上上面的处理后,如果没有身份验证码的请求,会得到如下的响应

 

 ******************************************************************************
作者:王坤 
出处:http://www.cnblogs.com/wk1234
本文版权归 王坤和博客园共有,欢迎转载,但请注明出处。

发表评论
用户名: 匿名