| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923 | using System;using System.Collections;using System.Collections.Generic;using System.Text;using MediaBrowser.Model.Services;using MediaBrowser.Model.Extensions;namespace Emby.Server.Implementations.HttpServer.SocketSharp{    public static class MyHttpUtility    {        // Must be sorted        static readonly long[] entities = new long[] {			(long)'A' << 56 | (long)'E' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 			(long)'A' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 			(long)'A' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 			(long)'A' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 			(long)'A' << 56 | (long)'l' << 48 | (long)'p' << 40 | (long)'h' << 32 | (long)'a' << 24, 			(long)'A' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'g' << 24, 			(long)'A' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 			(long)'A' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 			(long)'B' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32, 			(long)'C' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'d' << 32 | (long)'i' << 24 | (long)'l' << 16, 			(long)'C' << 56 | (long)'h' << 48 | (long)'i' << 40, 			(long)'D' << 56 | (long)'a' << 48 | (long)'g' << 40 | (long)'g' << 32 | (long)'e' << 24 | (long)'r' << 16, 			(long)'D' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'t' << 32 | (long)'a' << 24, 			(long)'E' << 56 | (long)'T' << 48 | (long)'H' << 40, 			(long)'E' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 			(long)'E' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 			(long)'E' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 			(long)'E' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8, 			(long)'E' << 56 | (long)'t' << 48 | (long)'a' << 40, 			(long)'E' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 			(long)'G' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'m' << 32 | (long)'a' << 24, 			(long)'I' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 			(long)'I' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 			(long)'I' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 			(long)'I' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'a' << 32, 			(long)'I' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 			(long)'K' << 56 | (long)'a' << 48 | (long)'p' << 40 | (long)'p' << 32 | (long)'a' << 24, 			(long)'L' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'b' << 32 | (long)'d' << 24 | (long)'a' << 16, 			(long)'M' << 56 | (long)'u' << 48, 			(long)'N' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 			(long)'N' << 56 | (long)'u' << 48, 			(long)'O' << 56 | (long)'E' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 			(long)'O' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 			(long)'O' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 			(long)'O' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 			(long)'O' << 56 | (long)'m' << 48 | (long)'e' << 40 | (long)'g' << 32 | (long)'a' << 24, 			(long)'O' << 56 | (long)'m' << 48 | (long)'i' << 40 | (long)'c' << 32 | (long)'r' << 24 | (long)'o' << 16 | (long)'n' << 8, 			(long)'O' << 56 | (long)'s' << 48 | (long)'l' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'h' << 16, 			(long)'O' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 			(long)'O' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 			(long)'P' << 56 | (long)'h' << 48 | (long)'i' << 40, 			(long)'P' << 56 | (long)'i' << 48, 			(long)'P' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24, 			(long)'P' << 56 | (long)'s' << 48 | (long)'i' << 40, 			(long)'R' << 56 | (long)'h' << 48 | (long)'o' << 40, 			(long)'S' << 56 | (long)'c' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'o' << 24 | (long)'n' << 16, 			(long)'S' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24, 			(long)'T' << 56 | (long)'H' << 48 | (long)'O' << 40 | (long)'R' << 32 | (long)'N' << 24, 			(long)'T' << 56 | (long)'a' << 48 | (long)'u' << 40, 			(long)'T' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24, 			(long)'U' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 			(long)'U' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 			(long)'U' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 			(long)'U' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8, 			(long)'U' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 			(long)'X' << 56 | (long)'i' << 48, 			(long)'Y' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 			(long)'Y' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 			(long)'Z' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32, 			(long)'a' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 			(long)'a' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 			(long)'a' << 56 | (long)'c' << 48 | (long)'u' << 40 | (long)'t' << 32 | (long)'e' << 24, 			(long)'a' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 			(long)'a' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 			(long)'a' << 56 | (long)'l' << 48 | (long)'e' << 40 | (long)'f' << 32 | (long)'s' << 24 | (long)'y' << 16 | (long)'m' << 8, 			(long)'a' << 56 | (long)'l' << 48 | (long)'p' << 40 | (long)'h' << 32 | (long)'a' << 24, 			(long)'a' << 56 | (long)'m' << 48 | (long)'p' << 40, 			(long)'a' << 56 | (long)'n' << 48 | (long)'d' << 40, 			(long)'a' << 56 | (long)'n' << 48 | (long)'g' << 40, 			(long)'a' << 56 | (long)'p' << 48 | (long)'o' << 40 | (long)'s' << 32,			(long)'a' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'g' << 24, 			(long)'a' << 56 | (long)'s' << 48 | (long)'y' << 40 | (long)'m' << 32 | (long)'p' << 24, 			(long)'a' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 			(long)'a' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 			(long)'b' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 			(long)'b' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32, 			(long)'b' << 56 | (long)'r' << 48 | (long)'v' << 40 | (long)'b' << 32 | (long)'a' << 24 | (long)'r' << 16, 			(long)'b' << 56 | (long)'u' << 48 | (long)'l' << 40 | (long)'l' << 32, 			(long)'c' << 56 | (long)'a' << 48 | (long)'p' << 40, 			(long)'c' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'d' << 32 | (long)'i' << 24 | (long)'l' << 16, 			(long)'c' << 56 | (long)'e' << 48 | (long)'d' << 40 | (long)'i' << 32 | (long)'l' << 24, 			(long)'c' << 56 | (long)'e' << 48 | (long)'n' << 40 | (long)'t' << 32, 			(long)'c' << 56 | (long)'h' << 48 | (long)'i' << 40, 			(long)'c' << 56 | (long)'i' << 48 | (long)'r' << 40 | (long)'c' << 32, 			(long)'c' << 56 | (long)'l' << 48 | (long)'u' << 40 | (long)'b' << 32 | (long)'s' << 24, 			(long)'c' << 56 | (long)'o' << 48 | (long)'n' << 40 | (long)'g' << 32, 			(long)'c' << 56 | (long)'o' << 48 | (long)'p' << 40 | (long)'y' << 32, 			(long)'c' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'r' << 24, 			(long)'c' << 56 | (long)'u' << 48 | (long)'p' << 40, 			(long)'c' << 56 | (long)'u' << 48 | (long)'r' << 40 | (long)'r' << 32 | (long)'e' << 24 | (long)'n' << 16, 			(long)'d' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 			(long)'d' << 56 | (long)'a' << 48 | (long)'g' << 40 | (long)'g' << 32 | (long)'e' << 24 | (long)'r' << 16, 			(long)'d' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 			(long)'d' << 56 | (long)'e' << 48 | (long)'g' << 40, 			(long)'d' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'t' << 32 | (long)'a' << 24, 			(long)'d' << 56 | (long)'i' << 48 | (long)'a' << 40 | (long)'m' << 32 | (long)'s' << 24, 			(long)'d' << 56 | (long)'i' << 48 | (long)'v' << 40 | (long)'i' << 32 | (long)'d' << 24 | (long)'e' << 16, 			(long)'e' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 			(long)'e' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 			(long)'e' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 			(long)'e' << 56 | (long)'m' << 48 | (long)'p' << 40 | (long)'t' << 32 | (long)'y' << 24, 			(long)'e' << 56 | (long)'m' << 48 | (long)'s' << 40 | (long)'p' << 32, 			(long)'e' << 56 | (long)'n' << 48 | (long)'s' << 40 | (long)'p' << 32, 			(long)'e' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8, 			(long)'e' << 56 | (long)'q' << 48 | (long)'u' << 40 | (long)'i' << 32 | (long)'v' << 24, 			(long)'e' << 56 | (long)'t' << 48 | (long)'a' << 40, 			(long)'e' << 56 | (long)'t' << 48 | (long)'h' << 40, 			(long)'e' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 			(long)'e' << 56 | (long)'u' << 48 | (long)'r' << 40 | (long)'o' << 32, 			(long)'e' << 56 | (long)'x' << 48 | (long)'i' << 40 | (long)'s' << 32 | (long)'t' << 24, 			(long)'f' << 56 | (long)'n' << 48 | (long)'o' << 40 | (long)'f' << 32, 			(long)'f' << 56 | (long)'o' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'l' << 24 | (long)'l' << 16, 			(long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'1' << 24 | (long)'2' << 16, 			(long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'1' << 24 | (long)'4' << 16, 			(long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'3' << 24 | (long)'4' << 16, 			(long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'l' << 24, 			(long)'g' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'m' << 32 | (long)'a' << 24, 			(long)'g' << 56 | (long)'e' << 48, 			(long)'g' << 56 | (long)'t' << 48, 			(long)'h' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 			(long)'h' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 			(long)'h' << 56 | (long)'e' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'t' << 24 | (long)'s' << 16, 			(long)'h' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'l' << 32 | (long)'i' << 24 | (long)'p' << 16, 			(long)'i' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 			(long)'i' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 			(long)'i' << 56 | (long)'e' << 48 | (long)'x' << 40 | (long)'c' << 32 | (long)'l' << 24, 			(long)'i' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 			(long)'i' << 56 | (long)'m' << 48 | (long)'a' << 40 | (long)'g' << 32 | (long)'e' << 24, 			(long)'i' << 56 | (long)'n' << 48 | (long)'f' << 40 | (long)'i' << 32 | (long)'n' << 24, 			(long)'i' << 56 | (long)'n' << 48 | (long)'t' << 40, 			(long)'i' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'a' << 32, 			(long)'i' << 56 | (long)'q' << 48 | (long)'u' << 40 | (long)'e' << 32 | (long)'s' << 24 | (long)'t' << 16, 			(long)'i' << 56 | (long)'s' << 48 | (long)'i' << 40 | (long)'n' << 32, 			(long)'i' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 			(long)'k' << 56 | (long)'a' << 48 | (long)'p' << 40 | (long)'p' << 32 | (long)'a' << 24, 			(long)'l' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 			(long)'l' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'b' << 32 | (long)'d' << 24 | (long)'a' << 16, 			(long)'l' << 56 | (long)'a' << 48 | (long)'n' << 40 | (long)'g' << 32, 			(long)'l' << 56 | (long)'a' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 			(long)'l' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 			(long)'l' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'i' << 32 | (long)'l' << 24, 			(long)'l' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 			(long)'l' << 56 | (long)'e' << 48, 			(long)'l' << 56 | (long)'f' << 48 | (long)'l' << 40 | (long)'o' << 32 | (long)'o' << 24 | (long)'r' << 16, 			(long)'l' << 56 | (long)'o' << 48 | (long)'w' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'t' << 16, 			(long)'l' << 56 | (long)'o' << 48 | (long)'z' << 40, 			(long)'l' << 56 | (long)'r' << 48 | (long)'m' << 40, 			(long)'l' << 56 | (long)'s' << 48 | (long)'a' << 40 | (long)'q' << 32 | (long)'u' << 24 | (long)'o' << 16, 			(long)'l' << 56 | (long)'s' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 			(long)'l' << 56 | (long)'t' << 48, 			(long)'m' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'r' << 32, 			(long)'m' << 56 | (long)'d' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'h' << 24, 			(long)'m' << 56 | (long)'i' << 48 | (long)'c' << 40 | (long)'r' << 32 | (long)'o' << 24, 			(long)'m' << 56 | (long)'i' << 48 | (long)'d' << 40 | (long)'d' << 32 | (long)'o' << 24 | (long)'t' << 16, 			(long)'m' << 56 | (long)'i' << 48 | (long)'n' << 40 | (long)'u' << 32 | (long)'s' << 24, 			(long)'m' << 56 | (long)'u' << 48, 			(long)'n' << 56 | (long)'a' << 48 | (long)'b' << 40 | (long)'l' << 32 | (long)'a' << 24, 			(long)'n' << 56 | (long)'b' << 48 | (long)'s' << 40 | (long)'p' << 32, 			(long)'n' << 56 | (long)'d' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'h' << 24, 			(long)'n' << 56 | (long)'e' << 48, 			(long)'n' << 56 | (long)'i' << 48, 			(long)'n' << 56 | (long)'o' << 48 | (long)'t' << 40, 			(long)'n' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'i' << 32 | (long)'n' << 24, 			(long)'n' << 56 | (long)'s' << 48 | (long)'u' << 40 | (long)'b' << 32, 			(long)'n' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 			(long)'n' << 56 | (long)'u' << 48, 			(long)'o' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 			(long)'o' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 			(long)'o' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 			(long)'o' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 			(long)'o' << 56 | (long)'l' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'e' << 24, 			(long)'o' << 56 | (long)'m' << 48 | (long)'e' << 40 | (long)'g' << 32 | (long)'a' << 24, 			(long)'o' << 56 | (long)'m' << 48 | (long)'i' << 40 | (long)'c' << 32 | (long)'r' << 24 | (long)'o' << 16 | (long)'n' << 8, 			(long)'o' << 56 | (long)'p' << 48 | (long)'l' << 40 | (long)'u' << 32 | (long)'s' << 24, 			(long)'o' << 56 | (long)'r' << 48, 			(long)'o' << 56 | (long)'r' << 48 | (long)'d' << 40 | (long)'f' << 32, 			(long)'o' << 56 | (long)'r' << 48 | (long)'d' << 40 | (long)'m' << 32, 			(long)'o' << 56 | (long)'s' << 48 | (long)'l' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'h' << 16, 			(long)'o' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 			(long)'o' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24 | (long)'s' << 16, 			(long)'o' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 			(long)'p' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'a' << 32, 			(long)'p' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'t' << 32, 			(long)'p' << 56 | (long)'e' << 48 | (long)'r' << 40 | (long)'m' << 32 | (long)'i' << 24 | (long)'l' << 16, 			(long)'p' << 56 | (long)'e' << 48 | (long)'r' << 40 | (long)'p' << 32, 			(long)'p' << 56 | (long)'h' << 48 | (long)'i' << 40, 			(long)'p' << 56 | (long)'i' << 48, 			(long)'p' << 56 | (long)'i' << 48 | (long)'v' << 40, 			(long)'p' << 56 | (long)'l' << 48 | (long)'u' << 40 | (long)'s' << 32 | (long)'m' << 24 | (long)'n' << 16, 			(long)'p' << 56 | (long)'o' << 48 | (long)'u' << 40 | (long)'n' << 32 | (long)'d' << 24, 			(long)'p' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24, 			(long)'p' << 56 | (long)'r' << 48 | (long)'o' << 40 | (long)'d' << 32, 			(long)'p' << 56 | (long)'r' << 48 | (long)'o' << 40 | (long)'p' << 32, 			(long)'p' << 56 | (long)'s' << 48 | (long)'i' << 40, 			(long)'q' << 56 | (long)'u' << 48 | (long)'o' << 40 | (long)'t' << 32, 			(long)'r' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 			(long)'r' << 56 | (long)'a' << 48 | (long)'d' << 40 | (long)'i' << 32 | (long)'c' << 24, 			(long)'r' << 56 | (long)'a' << 48 | (long)'n' << 40 | (long)'g' << 32, 			(long)'r' << 56 | (long)'a' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 			(long)'r' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 			(long)'r' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'i' << 32 | (long)'l' << 24, 			(long)'r' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 			(long)'r' << 56 | (long)'e' << 48 | (long)'a' << 40 | (long)'l' << 32, 			(long)'r' << 56 | (long)'e' << 48 | (long)'g' << 40, 			(long)'r' << 56 | (long)'f' << 48 | (long)'l' << 40 | (long)'o' << 32 | (long)'o' << 24 | (long)'r' << 16, 			(long)'r' << 56 | (long)'h' << 48 | (long)'o' << 40, 			(long)'r' << 56 | (long)'l' << 48 | (long)'m' << 40, 			(long)'r' << 56 | (long)'s' << 48 | (long)'a' << 40 | (long)'q' << 32 | (long)'u' << 24 | (long)'o' << 16, 			(long)'r' << 56 | (long)'s' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 			(long)'s' << 56 | (long)'b' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 			(long)'s' << 56 | (long)'c' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'o' << 24 | (long)'n' << 16, 			(long)'s' << 56 | (long)'d' << 48 | (long)'o' << 40 | (long)'t' << 32, 			(long)'s' << 56 | (long)'e' << 48 | (long)'c' << 40 | (long)'t' << 32, 			(long)'s' << 56 | (long)'h' << 48 | (long)'y' << 40, 			(long)'s' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24, 			(long)'s' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24 | (long)'f' << 16, 			(long)'s' << 56 | (long)'i' << 48 | (long)'m' << 40, 			(long)'s' << 56 | (long)'p' << 48 | (long)'a' << 40 | (long)'d' << 32 | (long)'e' << 24 | (long)'s' << 16, 			(long)'s' << 56 | (long)'u' << 48 | (long)'b' << 40, 			(long)'s' << 56 | (long)'u' << 48 | (long)'b' << 40 | (long)'e' << 32, 			(long)'s' << 56 | (long)'u' << 48 | (long)'m' << 40, 			(long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40, 			(long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'1' << 32, 			(long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'2' << 32, 			(long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'3' << 32, 			(long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'e' << 32, 			(long)'s' << 56 | (long)'z' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 			(long)'t' << 56 | (long)'a' << 48 | (long)'u' << 40, 			(long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'r' << 32 | (long)'e' << 24 | (long)'4' << 16, 			(long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24, 			(long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24 | (long)'s' << 16 | (long)'y' << 8 | (long)'m' << 0, 			(long)'t' << 56 | (long)'h' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'s' << 24 | (long)'p' << 16, 			(long)'t' << 56 | (long)'h' << 48 | (long)'o' << 40 | (long)'r' << 32 | (long)'n' << 24, 			(long)'t' << 56 | (long)'i' << 48 | (long)'l' << 40 | (long)'d' << 32 | (long)'e' << 24, 			(long)'t' << 56 | (long)'i' << 48 | (long)'m' << 40 | (long)'e' << 32 | (long)'s' << 24, 			(long)'t' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'d' << 32 | (long)'e' << 24, 			(long)'u' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 			(long)'u' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 			(long)'u' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 			(long)'u' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 			(long)'u' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 			(long)'u' << 56 | (long)'m' << 48 | (long)'l' << 40, 			(long)'u' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'h' << 24, 			(long)'u' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8, 			(long)'u' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 			(long)'w' << 56 | (long)'e' << 48 | (long)'i' << 40 | (long)'e' << 32 | (long)'r' << 24 | (long)'p' << 16, 			(long)'x' << 56 | (long)'i' << 48, 			(long)'y' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 			(long)'y' << 56 | (long)'e' << 48 | (long)'n' << 40, 			(long)'y' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 			(long)'z' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32, 			(long)'z' << 56 | (long)'w' << 48 | (long)'j' << 40, 			(long)'z' << 56 | (long)'w' << 48 | (long)'n' << 40 | (long)'j' << 32		};        static readonly char[] entities_values = new char[] {			'\u00C6',			'\u00C1',			'\u00C2',			'\u00C0',			'\u0391',			'\u00C5',			'\u00C3',			'\u00C4',			'\u0392',			'\u00C7',			'\u03A7',			'\u2021',			'\u0394',			'\u00D0',			'\u00C9',			'\u00CA',			'\u00C8',			'\u0395',			'\u0397',			'\u00CB',			'\u0393',			'\u00CD',			'\u00CE',			'\u00CC',			'\u0399',			'\u00CF',			'\u039A',			'\u039B',			'\u039C',			'\u00D1',			'\u039D',			'\u0152',			'\u00D3',			'\u00D4',			'\u00D2',			'\u03A9',			'\u039F',			'\u00D8',			'\u00D5',			'\u00D6',			'\u03A6',			'\u03A0',			'\u2033',			'\u03A8',			'\u03A1',			'\u0160',			'\u03A3',			'\u00DE',			'\u03A4',			'\u0398',			'\u00DA',			'\u00DB',			'\u00D9',			'\u03A5',			'\u00DC',			'\u039E',			'\u00DD',			'\u0178',			'\u0396',			'\u00E1',			'\u00E2',			'\u00B4',			'\u00E6',			'\u00E0',			'\u2135',			'\u03B1',			'\u0026',			'\u2227',			'\u2220',			'\u0027',			'\u00E5',			'\u2248',			'\u00E3',			'\u00E4',			'\u201E',			'\u03B2',			'\u00A6',			'\u2022',			'\u2229',			'\u00E7',			'\u00B8',			'\u00A2',			'\u03C7',			'\u02C6',			'\u2663',			'\u2245',			'\u00A9',			'\u21B5',			'\u222A',			'\u00A4',			'\u21D3',			'\u2020',			'\u2193',			'\u00B0',			'\u03B4',			'\u2666',			'\u00F7',			'\u00E9',			'\u00EA',			'\u00E8',			'\u2205',			'\u2003',			'\u2002',			'\u03B5',			'\u2261',			'\u03B7',			'\u00F0',			'\u00EB',			'\u20AC',			'\u2203',			'\u0192',			'\u2200',			'\u00BD',			'\u00BC',			'\u00BE',			'\u2044',			'\u03B3',			'\u2265',			'\u003E',			'\u21D4',			'\u2194',			'\u2665',			'\u2026',			'\u00ED',			'\u00EE',			'\u00A1',			'\u00EC',			'\u2111',			'\u221E',			'\u222B',			'\u03B9',			'\u00BF',			'\u2208',			'\u00EF',			'\u03BA',			'\u21D0',			'\u03BB',			'\u2329',			'\u00AB',			'\u2190',			'\u2308',			'\u201C',			'\u2264',			'\u230A',			'\u2217',			'\u25CA',			'\u200E',			'\u2039',			'\u2018',			'\u003C',			'\u00AF',			'\u2014',			'\u00B5',			'\u00B7',			'\u2212',			'\u03BC',			'\u2207',			'\u00A0',			'\u2013',			'\u2260',			'\u220B',			'\u00AC',			'\u2209',			'\u2284',			'\u00F1',			'\u03BD',			'\u00F3',			'\u00F4',			'\u0153',			'\u00F2',			'\u203E',			'\u03C9',			'\u03BF',			'\u2295',			'\u2228',			'\u00AA',			'\u00BA',			'\u00F8',			'\u00F5',			'\u2297',			'\u00F6',			'\u00B6',			'\u2202',			'\u2030',			'\u22A5',			'\u03C6',			'\u03C0',			'\u03D6',			'\u00B1',			'\u00A3',			'\u2032',			'\u220F',			'\u221D',			'\u03C8',			'\u0022',			'\u21D2',			'\u221A',			'\u232A',			'\u00BB',			'\u2192',			'\u2309',			'\u201D',			'\u211C',			'\u00AE',			'\u230B',			'\u03C1',			'\u200F',			'\u203A',			'\u2019',			'\u201A',			'\u0161',			'\u22C5',			'\u00A7',			'\u00AD',			'\u03C3',			'\u03C2',			'\u223C',			'\u2660',			'\u2282',			'\u2286',			'\u2211',			'\u2283',			'\u00B9',			'\u00B2',			'\u00B3',			'\u2287',			'\u00DF',			'\u03C4',			'\u2234',			'\u03B8',			'\u03D1',			'\u2009',			'\u00FE',			'\u02DC',			'\u00D7',			'\u2122',			'\u21D1',			'\u00FA',			'\u2191',			'\u00FB',			'\u00F9',			'\u00A8',			'\u03D2',			'\u03C5',			'\u00FC',			'\u2118',			'\u03BE',			'\u00FD',			'\u00A5',			'\u00FF',			'\u03B6',			'\u200D',			'\u200C'		};        #region Methods        static void WriteCharBytes(IList buf, char ch, Encoding e)        {            if (ch > 255)            {                foreach (byte b in e.GetBytes(new char[] { ch }))                    buf.Add(b);            }            else                buf.Add((byte)ch);        }        public static string UrlDecode(string s, Encoding e)        {            if (null == s)                return null;            if (s.IndexOf('%') == -1 && s.IndexOf('+') == -1)                return s;            if (e == null)                e = Encoding.UTF8;            long len = s.Length;            var bytes = new List<byte>();            int xchar;            char ch;            for (int i = 0; i < len; i++)            {                ch = s[i];                if (ch == '%' && i + 2 < len && s[i + 1] != '%')                {                    if (s[i + 1] == 'u' && i + 5 < len)                    {                        // unicode hex sequence                        xchar = GetChar(s, i + 2, 4);                        if (xchar != -1)                        {                            WriteCharBytes(bytes, (char)xchar, e);                            i += 5;                        }                        else                            WriteCharBytes(bytes, '%', e);                    }                    else if ((xchar = GetChar(s, i + 1, 2)) != -1)                    {                        WriteCharBytes(bytes, (char)xchar, e);                        i += 2;                    }                    else                    {                        WriteCharBytes(bytes, '%', e);                    }                    continue;                }                if (ch == '+')                    WriteCharBytes(bytes, ' ', e);                else                    WriteCharBytes(bytes, ch, e);            }            byte[] buf = bytes.ToArray(bytes.Count);            bytes = null;            return e.GetString(buf, 0, buf.Length);        }        static int GetInt(byte b)        {            char c = (char)b;            if (c >= '0' && c <= '9')                return c - '0';            if (c >= 'a' && c <= 'f')                return c - 'a' + 10;            if (c >= 'A' && c <= 'F')                return c - 'A' + 10;            return -1;        }        static int GetChar(string str, int offset, int length)        {            int val = 0;            int end = length + offset;            for (int i = offset; i < end; i++)            {                char c = str[i];                if (c > 127)                    return -1;                int current = GetInt((byte)c);                if (current == -1)                    return -1;                val = (val << 4) + current;            }            return val;        }        static bool TryConvertKeyToEntity(string key, out char value)        {            var token = CalculateKeyValue(key);            if (token == 0)            {                value = '\0';                return false;            }            var idx = Array.BinarySearch(entities, token);            if (idx < 0)            {                value = '\0';                return false;            }            value = entities_values[idx];            return true;        }        static long CalculateKeyValue(string s)        {            if (s.Length > 8)                return 0;            long key = 0;            for (int i = 0; i < s.Length; ++i)            {                long ch = s[i];                if (ch > 'z' || ch < '0')                    return 0;                key |= ch << ((7 - i) * 8);            }            return key;        }        /// <summary>        /// Decodes an HTML-encoded string and returns the decoded string.        /// </summary>        /// <param name="s">The HTML string to decode. </param>        /// <returns>The decoded text.</returns>        public static string HtmlDecode(string s)        {            if (s == null)                throw new ArgumentNullException("s");            if (s.IndexOf('&') == -1)                return s;            StringBuilder entity = new StringBuilder();            StringBuilder output = new StringBuilder();            int len = s.Length;            // 0 -> nothing,            // 1 -> right after '&'            // 2 -> between '&' and ';' but no '#'            // 3 -> '#' found after '&' and getting numbers            int state = 0;            int number = 0;            int digit_start = 0;            bool hex_number = false;            for (int i = 0; i < len; i++)            {                char c = s[i];                if (state == 0)                {                    if (c == '&')                    {                        entity.Append(c);                        state = 1;                    }                    else                    {                        output.Append(c);                    }                    continue;                }                if (c == '&')                {                    state = 1;                    if (digit_start > 0)                    {                        entity.Append(s, digit_start, i - digit_start);                        digit_start = 0;                    }                    output.Append(entity.ToString());                    entity.Length = 0;                    entity.Append('&');                    continue;                }                switch (state)                {                    case 1:                        if (c == ';')                        {                            state = 0;                            output.Append(entity.ToString());                            output.Append(c);                            entity.Length = 0;                            break;                        }                        number = 0;                        hex_number = false;                        if (c != '#')                        {                            state = 2;                        }                        else                        {                            state = 3;                        }                        entity.Append(c);                        break;                    case 2:                        entity.Append(c);                        if (c == ';')                        {                            string key = entity.ToString();                            state = 0;                            entity.Length = 0;                            if (key.Length > 1)                            {                                var skey = key.Substring(1, key.Length - 2);                                if (TryConvertKeyToEntity(skey, out c))                                {                                    output.Append(c);                                    break;                                }                            }                            output.Append(key);                        }                        break;                    case 3:                        if (c == ';')                        {                            if (number < 0x10000)                            {                                output.Append((char)number);                            }                            else                            {                                output.Append((char)(0xd800 + ((number - 0x10000) >> 10)));                                output.Append((char)(0xdc00 + ((number - 0x10000) & 0x3ff)));                            }                            state = 0;                            entity.Length = 0;                            digit_start = 0;                            break;                        }                        if (c == 'x' || c == 'X' && !hex_number)                        {                            digit_start = i;                            hex_number = true;                            break;                        }                        if (Char.IsDigit(c))                        {                            if (digit_start == 0)                                digit_start = i;                            number = number * (hex_number ? 16 : 10) + ((int)c - '0');                            break;                        }                        if (hex_number)                        {                            if (c >= 'a' && c <= 'f')                            {                                number = number * 16 + 10 + ((int)c - 'a');                                break;                            }                            if (c >= 'A' && c <= 'F')                            {                                number = number * 16 + 10 + ((int)c - 'A');                                break;                            }                        }                        state = 2;                        if (digit_start > 0)                        {                            entity.Append(s, digit_start, i - digit_start);                            digit_start = 0;                        }                        entity.Append(c);                        break;                }            }            if (entity.Length > 0)            {                output.Append(entity);            }            else if (digit_start > 0)            {                output.Append(s, digit_start, s.Length - digit_start);            }            return output.ToString();        }        public static QueryParamCollection ParseQueryString(string query)        {            return ParseQueryString(query, Encoding.UTF8);        }        public static QueryParamCollection ParseQueryString(string query, Encoding encoding)        {            if (query == null)                throw new ArgumentNullException("query");            if (encoding == null)                throw new ArgumentNullException("encoding");            if (query.Length == 0 || (query.Length == 1 && query[0] == '?'))                return new QueryParamCollection();            if (query[0] == '?')                query = query.Substring(1);            QueryParamCollection result = new QueryParamCollection();            ParseQueryString(query, encoding, result);            return result;        }        internal static void ParseQueryString(string query, Encoding encoding, QueryParamCollection result)        {            if (query.Length == 0)                return;            string decoded = HtmlDecode(query);            int decodedLength = decoded.Length;            int namePos = 0;            bool first = true;            while (namePos <= decodedLength)            {                int valuePos = -1, valueEnd = -1;                for (int q = namePos; q < decodedLength; q++)                {                    if (valuePos == -1 && decoded[q] == '=')                    {                        valuePos = q + 1;                    }                    else if (decoded[q] == '&')                    {                        valueEnd = q;                        break;                    }                }                if (first)                {                    first = false;                    if (decoded[namePos] == '?')                        namePos++;                }                string name, value;                if (valuePos == -1)                {                    name = null;                    valuePos = namePos;                }                else                {                    name = UrlDecode(decoded.Substring(namePos, valuePos - namePos - 1), encoding);                }                if (valueEnd < 0)                {                    namePos = -1;                    valueEnd = decoded.Length;                }                else                {                    namePos = valueEnd + 1;                }                value = UrlDecode(decoded.Substring(valuePos, valueEnd - valuePos), encoding);                result.Add(name, value);                if (namePos == -1)                    break;            }        }        #endregion // Methods    }}
 |