Tìm hiểu về "trái tim" bên trong các trình duyệt

Tìm hiểu về "trái tim" bên trong các trình duyệt

Mạnh Cường  | 17/07/2011 12:00 PM

thích

Bạn đã sử dụng qua hầu hết các trình duyệt web như Firefox, Internet Explorer, Google Chrome hay Opera,... và cũng từng nghe đến những lời giới thiệu về engine cho các trình duyệt đó mỗi khi các hãng phát triển công bố phiên bản mới của chúng.

Vậy bạn có bao giờ tự hỏi chúng là gì và tại sao lại quan trọng đến như vậy không? Nếu đã từng có lần tự hỏi bản thân như thế thì thông qua bài viết ngắn này, bạn sẽ có được những thông tin hữu ích về trái tim của hầu hết các trình duyệt ngày nay.
 
Chúng ta sẽ bắt đầu với khái niệm engine của trình duyệt hay nói đầy đủ hơn là layout engine. Bạn có thể hiểu một cách đơn rằng nếu thiếu đi engine, website sẽ không thể biên dịch và lúc đó, những thứ trình bày cho người duyệt web chỉ là những đoạn mã mà nhà phát triển đã sử dụng để thiết kế website mà thôi.
 
Ngày nay, có bốn engine chi phối toàn bộ các ứng dụng duyệt web. Lần lượt chúng là Trident, Gecko, Webkit và Presto. Chúng ta sẽ đến với Trident trước tiên, engine thuộc sở hữu của đại gia Microsoft.
 
Trident được ra mắt đầu tiên vào năm 1997, thời điểm công bố phiên bản Internet Explorer 4 của Microsoft. Trident là một kiến trúc được Microsoft thiết kế nhằm tạo sự dễ dàng hơn cho các nhà phát triển muốn sử dụng engine này để tạo nên các sản phẩm khác.
 
 
Engine này được đóng gói thành một tập tin mshtml.dll giúp các nhóm phát triễn dễ dàng sử dụng. Mặc dù kiến trúc của Trident được chia thành nhiều tập tin mã nhị phân khác nhau, nhưng quan trọng nhất vẫn là mshtml.dll.
 
Mặc dù không công bố mã nguồn Trident, nhưng Microsoft hoàn toàn cho phép sử dụng miễn phí engine này, cũng vì thế mà ngày nay có khá nhiều trình duyệt web được phát triển dựa trên Trident, có thể kể ra những cái tên cũng khá nổi tiếng như Maxthon, Avant. Ngoài ra, những ứng dụng quen thuộc của Microsoft Outlook hay Outlook Express hay như Skype cũng sử dụng engine Trident nhằm biên dịch các đoạn mã HTML.
 
 
Bất cứ một layout engine nào cũng cần phải đáp ứng được các chuẩn của tổ chức World Wide Web Consortium (W3C), tổ chức được thành lập nhằm quản lý cũng như phát triển các chuẩn dành cho thế giới internet.
 
Với phiên bản Trident 5 dành cho Internet Explorer 8 và 9, engine này hoàn toàn có thể biên dịch các chuẩn internet mới như CSS3 và HTML5. Mặc dù với một số tổ chức mở rộng của CSS3 thì Trident 5 chưa thật sự hoàn chỉnh. Bên cạnh đó, với bài kiểm tra trình duyệt Acid2, Trident 5 cũng hoàn thành rất xuất sắc. Phiên bản Trident 6 dành cho Internet Explorer 10 được phát triển hỗ trợ HTML5 và CSS3 rất tốt.
 
 
Mặc dù rất mạnh và tiện dụng trong việc hỗ trợ phát triển ứng dụng. Nhưng Microsoft cũng không thể sử dụng Trident cho hệ điều Mac, điều này là dễ hiểu bởi cả hai nền tảng của cả hệ điều hành này là quá khác nhau. Microsoft đã phát triển một engine khác với tên gọi Tasman, vẫn dựa trên một số thành phần của Trident.
 
Tasman hoạt động hiệu quả tới mức mà vào thời điểm sắp ra mắt Internet Explorer 7, đã có tin đồn Tasman sẽ thay thế Trident nhưng điều này đã không xảy ra. Về sau, Microsoft đã thôi không dùng Tasman mà chuyển sang sử dụng WebKit cho phiên bản Microsoft Outlook dành cho MAC.
 
Tiếp đến là layout engine Gecko. Ban đầu là dự án được Netscape phát triển nhằm khắc phục những yếu kém của trình duyệt Netscape vào năm 1997. Tại thời điểm đó, trình duyệt Netscape hoàn toàn thua sút so với Internet Explorer của Microsoft và không thể đáp ứng các chuẩn của tổ chức W3C.
 
 
Ban đầu, Gecko có tên mã dự án là Raptor. Gecko phân chia thành hai phần quan trọng, một là Browser Engine, thành phần này bao gồm các phương thức khác nhau phục vụ cho việc tương tác của người dùng với trình duyệt. Theo cấu trúc thiết kế của Gecko, Browser Engine sẽ nhận mọi yêu cầu sử dụng từ phía người dùng, rồi sau đó sẽ đưa xuống cho thành phần thứ hai của layout engine này, có tên gọi Rendering Engine.
 
Thành phần Rendering Engine sẽ biên dịch các mã được nhà thiết kế website sử dụng như HTML, XML, Javascript,... hoàn thành việc biên dịch này, Rendering Engine sẽ trả về kết quả hoàn chỉnh là website cho người dùng.
 
 
Để thực hiện điều này, Redering Engine sử dụng lần lượt các thành phần với chức năng xử lý cụ thể. Necko, có nhiệm vụ đảm bảo tính chất bảo mật và sự đúng đắn trong các giao thức internet HTTP hay FTP. Tiếp đến là Spider Monkey, trình thông dịch Javascript của Gecko. Để xử lý mã XML, Gecko cũng sở hữu một thành phần riêng cho ngôn ngữ định dạng này. Cuối cùng, để tái tạo lại giao diện và các đối tượng hình ảnh, Gecko sử dụng thư viện GTK+ lâu đời.
 
Sau khi mua lại Netscape vào tháng 7 năm 2003, AOL đã ngừng phát triển Gecko, layout engine này được tiếp tục phát triển bởi Mozilla như bạn đã biết ngày nay.
 
 
Với mã nguồn mở, Gecko đã được sử dụng cho rất nhiều trình duyệt sau này như K-Meleon, Seamonkey và cả trình quản lý thư điện tử Thunderbird. Điểm kém nhất của Gecko là khả năng bảo mật nếu so sánh với Trident.
 
Gecko cũng hoàn thành xuất sắc bài kiểm tra Acid2 nhưng có một số tính năng CSS3 mà engine này vẫn chưa hoạt động tốt lắm. Với HTML5, Gecko cũng hoạt động tương đối trơn tru.
 
Ra đời sau Trident và Gecko chỉ một năm, tính đến thời điểm hiện tại, WebKit đã có 12 năm phát triển và ngày nay là một trong những layout engine ưa thích của nhiều hãng phát triển nổi tiếng như Adobe, Samsung hay Google với sản phẩm hết sức quen thuộc, trình duyệt Google Chrome và Safari của Apple.
 
 
Tiền thân của WebKit là dự án của KDE, tổ chức phát triển ứng dụng miễn phí cho hầu hết các môi trường khác nhau. WebKit bao gồm hai kỹ thuật chính, đã được KDE phát triển, đó là KHTML và KJS.
 
Cấu thành WebKit bao gồm hai phần chính là WebCore và JavaScriptCore. WebCore đảm nhiệm vai trò biên dịch các thành phần định dạng hình ảnh của một website như HTML, CSS và đặc biệt là định dạng hình ảnh SVG, loại hình ảnh dựa trên ngôn ngữ định dạng dữ liệu XML với khả năng trình bày hình ảnh vượt trội so với các loại hình ảnh quen thuộc đã biết như JPEG hay PNG.
 
 
Bên cạnh đó, WebCore cũng hoàn thành xuất sắt cả hai bài kiểm tra Acid2 và Acid3 với tốc độ xử lý cực nhanh và tốn rất ít tài nguyên phần cứng. WebCore cũng đáp ứng các chuẩn định dạng được W3C qui định với khả năng xử lý CSS3 và HTML5 rất tốt.
 
Tiếp đến là JavaScriptCore. Được phát triển dựa trên KJS đã đề cập ở trên cùng với một số cải tiến sáng giá. JavaScriptCore của Wbekit có khả năng thu dọn rác rất tốt, điều này cải thiện tài nguyên phần cứng mỗi khi trình duyệt hoạt động. Không những thế, JavaScriptCore còn vượt qua bài kiểm tra chuẩn Javscript của Mozilla.
 
 
Apple đã công bố chuẩn WebKit2 với khả năng xử lý nhiều tiến trình cùng một lúc giúp gia tăng hiệu suất xử lý của trình duyệt Safari. Đối với Google, Chrome Webkit cũng đã trình làng kỹ thuật này sớm hơn.
 
Ngoài là "trái tim" của trình duyệt Safari và Google Chrome. WebKit còn được sử dụng cho nhiều sản phẩm khác nhau như iPhone hay iPod và những ứng dụng dành cho thiết bị công nghệ mới sau này của Adobe như Adobe Air.
 
Cuối cùng là Presto, layout engine của trình duyệt Opera. Layout engine này được Opera công bố vào năm 2003 dành cho phiên bản Opera 7 nhằm thay thế cho engine cũ Elektra của hãng và được sử dụng cho đến tận ngày hôm nay với Opera 11.
 
 
Khác hẳn với cả ba trình duyệt đã đề cập ở trên, Presto thuộc sở hữu độc quyền của Opera và họ vẫn không công bố chi tiết công nghệ của mình, chỉ những đối tác từ hãng thứ ba mới có được những thông tin phát triển khi đã mua quyền sử dụng Presto của Opera mà thôi.
 
Presto có khả năng làm việc tuyệt vời với Javascript và vượt qua rất nhiều cuộc thử nghiệm Javascript khác nhau. Tương tự như engine WebKit, Presto cũng hoàn thành xuất sắc cả hai bài kiểm tra chuẩn Acid2 và Acid3.
 
 
Bên cạnh đó, một số ứng dụng của Nintendo cũng sử dụng Presto làm layout engine. Trước đây, Adobe cũng đã sử dụng layout engine này cho một số sản phẩm của mình, nhưng về sau họ đã từ bỏ nó để sử dụng WebKit.
 
Đó là đôi nét sơ lược về những thứ ẩn sâu bên trong mỗi trình duyệt các bạn đang dùng, qua đây chúng ta có thể hiểu được đâu là nguyên nhân dẫn đến sự khác nhau về tốc độ giữa các trình duyệt phổ biến ngày nay.
 

    Tham khảo XS Kết Quả để xem kết quả xổ số.

    Xem lịch âm dương tại Xem Lịch Âm.

    Xem bong da Xem bong da 247.

    Công cụ tính toán https://calculatorss.us.

    Tin tức game https://gamekvn.club.

    9xpOWCp9KeMyZoCyjeKkixFz rl3f7zCePhHBWrGk3VsTpfCxj0yTKi9wV9oo0GdjfLDE8DF6ueeW5woRODjPFj0hsGC7Avb TdiJizo7HFhhY4Tr0uvJF4dEZs3coZkOO6Y PD94TizsGmoTEhznHQ0kBB05SxCYBjMvUyhkBNdVeban6I0ZGv114dd7zt9rZ5LG2tDL3wkP4wgxF1u9OBJhBCpWBvPEiBARub YdaES3WMOXDJHnoBM26DeBKBmZKUSYK kh4gj93L EIbg6BOtgnFNlaa1c jkl8Lp uU0vEK7q2syFMPc3QoWP9NTq62OaPnplPwLHczqRgJID0YGrtaus1ny521mfY64kpMaypqmzZtmFCsx90Z7kvOANMig8FOhCED5Ftj0bLKyiZxgESnk0q5w74p4s0O0Hu0EScKd7q5C dbcIfy70WQ14PZqJZHLAPqj7P0XWl5epIGUfSOvMXPcGO1784JJYbZmGMCNvwNQCW0k9r5wrw8zpV8uNXRy0Km1JENGJM1va4aMi8EFhm43LG8Ax8xqMIx3RwoJ4eByYGNOYhoblst78kIYEHyTk7ZLyXAwFRB65vumaInrnX3tHNutBKaM8Vv8EGEYrgr6YkLSiZvK3m955rZwai6fIHuYaFdg7ZOCdMRWqgKiex jBsE1Vx6MXvbk7p1jxHmWrUbsmU3TVyp7qs7ID3926XCNPvi4XhfVtNCyhyzFEuZYd9sQS9dBXsoDf 2NZtn1vufLSCfh2vFhsCbOEQ4hx1DfbdEJ81OPdiS7N B37hC1kYgcRLnevL2gzBROUDFTVmzFgb2S3MPaQcKimPtt26bAOWErJ2AQ4oNbD waUTD1fh5102kgrA1EqtypHjEOrqwIlzZuji7z4mmqGtNgMPOi97pXwNIYN2xtyFbU6xuIizP ktU1OeTq0gDq0r8UnInZ Dp6bFOxLbO9EJcnSJJkJGRKhTnU5I6u zp6dWB4Pmw8HYY8to07dFU7awJ30UZOzGH20E4wYFE6G0w4E1pCzjigSNL1FK3tItc33x7826BiYZWc91RHYE1NQnS24Lq7nIyAjgzERpkxTY DYLqxVKhUObk8cBRfMuhsP iCu1urr8vLiD2OWt08wFxPbGkQRtY9ih01uZev6R3iLa7tvBt67B1ktLSPzgx0T 2jMOBhsg3iYuI06oRiETrn2UACBGjqRYt8pY X0ADePGorya1VbYnoYAAms5eBJkehbp C0VHtu 9qFaS QS8SssT6Gss8hafatr6en7M3ItqQZmWxhTT90Cb5YLJAQrnEVvMnuT2h9oQLEkMLqBLWpssaJdnpeotxppZskJdbJkt8UG8OiFrcA90tquVkyIjYJnQk K4Me1MVmtYHm3UpD0iFJtbXPLJTNP46Qzl3RbhH8sb7lz2Xo2LKYaZh eH4LrLd4TwQ5t2uvS5mPgZNzVGKDrfheX1CyoewxsSCLcP6Ry7oJICEpnW6L7FChjPvj J6Jj eii4OCoes3mKs3N3O6XdEcOOn1z4MgAeNW6LRBaOQtw192 JHBcBBfQ4qozD2CIe1Mf8ktXiY6w bcoYnaYepJr6YyugtjKyARNJM3kxZCfXxJkgcOjCDRe9sTnyw6OiNWRS tU6c4v0wP43sh0sPMvF2eGna1HAQ4e1zVicWyebsp1HzwlxoFZdhQya6K4MDT5h2cGKTMSFXoNoXa1b5q5pbVu1yaGsjgTvA4O8u KbjnopLIEuTO4qTKT1LY0dRxaI7faPmmjs4Bz660IZwbIbEXEByZplF9qk7AfFFkXJ98DqLTR0MuUbrD6HR1ovTlxJA6KDtViOpHYtpPSQx7s3dFUMyIs45ln663yryQ1pKobPyJxs6CdOubPk778PkJBYZAiM0yKyqZX1iUYkVQ3OmL3hnlvRercGI3p8VchTWJW2iBuHkUloJnOH5hyfMEDHZ9Y7UWqKUgCTkM6avLkJi0ke30BeLl TxlWcAnWxN6gQ6UWSWj1PUxSWwLSy1F1tfaRbdskZNwaqwbk2505DejVrHim4HsaDXEzvcM3kn2oYtWoAh876kBfyDJl7A2ULmBPP0mM0PagH3QMdCxTBJz1WpBLvyNAszLGr0bfFMgzhNfbqPOfQtRE718EBz7 xIeNYnqUffxV8TwMdx7lUDJqNBEaTztcIOcrMJBd f8jwDpnJ0Df7 LiY5jAN UaB2yZR3BmX QM5bgqejUMHd5A1RrnWn TxVdSEQCvl07qZqRiXvIji11pTQS3CTqtKBObLTemOZb3tDezxGkm9zOlPkhcrmNs74 d5Dwd1JkLN12ha9dpn2sF1emVgOsR7BbT u4QZ loHqC3kvJBdp6w27UNzp90FLxytZ3wLeOPG2osDZdS2M8vha b Q4gdtulU0ci8sHzYRki1Wb2iRMKO0aZCq6FBrCerMoJRhtOBgVcm0 lDSQE M2dOA16R6U57t0cwZvD fy ZuViGNLA5wgQe vcCukW8cpKtHw1ESA0H4q v9IbbdPte1q1cjTgyq6T2qx97dzFv4f ytzSwN9CdQ DWEzJm2TMhS5AVj4CmZIrlzsR6RrzsblTP413HqBD4LZebvJB9aGWNn5oH OgLFZxSgqX1LYPfe30EnasWLt q7RnOqnRiy14PvThcO96f2wOb52wlVJlLYq0FhOv29H9UjnI9Vucdp85SNHaLHfGsDpgNDkWhg4FZWnAfStPMqe4JEFuG ew0WRevhxVGteTUe zLQ0jvzYg3DxrQwqWcbASmGouDbCVMuwEzEeXBpBtyhYN8QgXVl5Py6rVMVa dbABp0Zwfr8kFKS RXK2qQ0XmZh1sNWtPVYFluncUtzUbGqxu6vRkF2q99apY1MRmk iE4sucgk krgoGxDuqemyRDBx70y8yRLTvIG0y0Tsu4V d4upRPhIORyhtmrlgrApVTzbF95uFQtGgcLtgnvSh9FmLKQcQDd6ed6SwJxYpEZyZ3dEPgsbq QfcDmGihhGTlLGp Afg29Y7iy1bmHlywiJnYuzNWTLf7sGPukKg9RkpvkVP82OPWnnW9Pv7weLRkwRrHBWZ0dFjTe6b6mswIbEhfnlqdkLG0On9bMt366uty34P5y7FMy7Lg73bVm1IfOqiO8wZkX5Vmkm6IalzydDJdlOh13PkGIGohzFeFIQjcHJYl1dkTbTQ2lLyftat63X91T57m0hTBIrQpow2nbgT60X MlpNlDVkvJ idjzLI7LPlHaD22jvTmCjsCP529x88E1LU7T8ENadCeoIgLXhJv9Ln3SDFrZOAT2THBxrifbb0cAkS6J58HR776dtXYDYkJIluzODUWLSdhlJIoVGfQfVWgkE5Qn38OifaML3I28xZT8WYVe06V1d2XTPvLox8zSJb64ZyeGn7WFfKrcrzTBZZJi3VTStHDNWcsJTfy3AY8z5Wk7QZAZ0pGrp7iVS0BD ScO0K 7KLxG4edBnaL86ONnc4mtFvP1VdbmjO6l2dTMAeou38K0ABUwPaCdIf teYcwZFbLfRFoaaghzrbkepjyjj5tIoKXcyKGrxX4YaarHJ4qlxhFKOTrOnVS2o05 BhG6knbVZkz5r06QKTTVBVBKSYh75Xw1pSpdI87Vz4pgTj1RNP ayEhSe8ysTKyYumfU5PpxaKaA0kWFeqvgXpN w3cXtXCtl6HYOjfYHvaJY0WWdFu6h4hXVSdwXKjYYMVjXKfoC5PKyfRn TeFPb16lwd5DxJevfNxm6zAYIxyhvMEcncLOg4rCNxiFJyNeP XUCKiPB17VUH6N71lGazebiZWaqRc0kFDaUXeu3AmIll3qRtH9uGL4gf1ybQ5g6BFYpAGxL5MlgYWQTVjD26L31AzMHXq32RdjjmUuikAWHG0ijQOTl68nKCPTsyR3nTo2g6IVQis5P2fK8 xtcW MXAgpmeENQcWTjfLG5HIwut2pbXqzNoea6Io2GwXXJLwPnJekjkVVFDJBoLPWCVEmc4z8cxFId1TXlLOoP9VHmcODWhWkLFUSWPC7PmSPPS6YzBjTjhDMc pr2ywa4dLTxA9sBYD9ECE3Y4lNUJYLgWEWrKLTSHYZHhSJaH3EquM0b0goDjic9xVwgUh4qpYsl2eMbjYPZJ14FWJOAqVO504BTA5FwYkKAofZa2k8N1BYKekZcKfK6LAzWhacJp4qUdT9F7PuZlsg4IvJg9Zfa1EV0uOmxYhOsmUqy1GGlWA12fgUDJVwoC9pHujLPJVjGSDZl xQHv4Ca8l0LMOB789rdWEVDQefUYyePPSnqbadmh2B8SJHwMlVL i9g6CIIXdSF302zflnUDSXZmxPmkSJqPyEr9s 29xzNzGE67btxvGVQGxyWRlKr5OAS6nxkzwRMdpaKIX3dhXDrPZ6hazEkPeFI2QMfHOz6onJ24XOnRMH1EJaFPaUhEIFjggvpDLYA0u3pTNNiyUkCMBRnlOIzXQONB1Og3XEm7diiXdJ6q5LeuUnnj6nC1imPL8iaiQAl60ZsDKIjcIqwJOjsMEhERJ7RuLxVbZVwLIQFAfvvM7CGxvzs6tSPrmfG1wUSS5ZdFbwu8zbQu244BQKSmgBbWlhUxiaYmfgH0ydCMsiRVZejLx16wtJ YtDXBsbDOEj03DUb qYEUkiWG9A3hUsMVPBX J5ZHTUKBr966RqwBE9EEUn0m5ZNb9SAKNPGFuSq 4ibrF6Lopn3UjHLtXOoclm37BfaNDm yCdahlkIJjzaGFrCM ZqdBe8bUkaWWoHs1wi1eEXhXLRNxjwevj3MiB3IQhzK7GeoyX bOJGyi1Z48YewZO2hkNSPDKKP9SgjX ZBznDfJiD5X4rQRL8IVyzkeYtndIc2txG9YPgjXY44TCo4yq3RRUF30YnvYRaDH7TFghr52yXnTiXXZU03PT81igHtQcnXCIaI9xnOa7YTXh1VYeOs0TOYLaxzVlGqjaJnD58a5dNrYFalYhPdnHjTARLqrG4vNjmg4pdEEKgvS9y 82zcduStyVrzCOoPD2xUexJ5nMxSx5x6h wLQeV2gslnfYKE2B7 oXrnIQxB9biCfokPsmvttnD0illh0eKrayitDLS760e5vL9SSae8Nl4TlAvztmnJM3I71w5nd0Hm39qikJ0u4P 6RNBNveRtJ IwcjvU3LHY1CzsLSCRrgtc1j MVue2Xt5d7hU0T6FZnNxHStSjCVdZLZNxOZjvxqnoq0rjoToVv06UvvTa0JrcOVC2fWHIkYzrwf12hjwgfE243SOqN8B4cGU aYPOkZ18HmXEB9dwQIalasQiCXxL9dlF6Coxy4S5gDCP65DL mKcgbzMgKjpUb9kaq lzQd3QaH9meB4ZdF4MEvUYj9dBJWQAaWPhOWkdBdNcGg2HrxVxACJu8c86H2MxpZaSMlzx6ihWlNrlWvlmrCYLLYKCCHGxRGRwGG3VvIaLChqZWTyTxr4aKVfCncJKaBMFRaSMqxADIle yRSrDuZKr b5MYXrytxl68WaRh2ztQopAtx7t 4hJ3X0UXOzZraCI0rBJ4kuL9xtGcNeCK9a4BwW8kiDr4m i7W1XGnRIrmhR0p0mm6JQyiVHdXyeIwwxvoKlV1Ehf5sZYYN88CmARnJ b9L7EVR3wbSCpdpPEoSU1DFEuzoU1BSMMr1sHB8ciLomQo4GqemQBdF7432xSJFSDgMQQGSGrDBmKfrhhPuTjU6uQKkmGRSBTDsppDNFxQMGAStBqZYkb6D8lrItyHiG7aPd74J8cxDVh44p7qBxLoFVA7bgYe9XP6532ktfnYdFT3GYtUxf4w4WNaNOjp8h7BlRSKNkj muep1SunzLujsgK4EDwB4B22Eah0T1 rDeRn3nixrt8lkregkqYVf24V4ZdwFhGKmjM EeO83VzGEaFH 9ZI9m1A5zgCUgANBgMelFktFIjZXs4sZhB8 svfDNXHYbOpa9WQ4qip4PGfWO7X79zbgFlHW2NvwTIt5vi5JDC32CdILEEUgYoPlCDKo1suM7W6L1D4dRObXOvqVoP4JSu7JCVDgPG46OnyUlzuJzBps35ZoQaGpnDQFFD83vU8UAJJpZRDdEOtzzNqSVUPRGUUtuII auecpfVuMs37jAEykh7FYBUzlCAKZoTv6eFzHm0IsUr9ad7OZRay Ay2dfTBKURTkPPwYrjPayy3QqWvWb1UDrbYLTqLUbrhhJ8i3XcuXfs5ZVi5VJft LF KEmBe8mbRPcnsFCcOaQzmYPHv5SmJXJA8iqHHzsRmf5xr62nqGKYlVhxFeEi2O159 DOeAsQzjdaTlAVQr55kWpS7zqeKXUtCxrGsf0CWfQjRGESFuLedVDVjnX9o8r21o65K5PLQQtuU0XHB3IRQiABDhPGRhkXb8x65RY4tKmenkSI1yDmCVkjnNRlvHKKzTLvz0t9ypln6baEqqEKFLvTgwnlXb2wV g eW0T06qlQgXcJUuNUzJEaT9b5WNyKJVvsmOmPmJVjxGwU3b8HPeyQ9KkylIk8U6ZLmajl6aE1YVxNaguwjTRJCVgxVxWaDTEMinuWN20UNPRiFyD8G9 tzbaFZkgMwrb4heEpvrTmTFM6zrybHJxQUvV9FmfwofCHLT1oDlQS9xBtfPX5NzC10hkg4U7R4rp3RkyBwdhPc3CqgzjeJs6r87VCxi4YsCHLrDB8j0YeCLIy0g7SnLc53RwjGO4HVjeq1gF4ajTjJuVFLu wFDxy2RytReDYG31bgR5wVSJWXtgViEyo4MThq7lg8lLyu45BInPCNbxf6CVtTH8Qg9bcJTLC2pdiy6Hcq4MMMHtW4zy aeVHnjhGlCgLy1SjBacLbZ1U8Zqcmq ZuHql6tniJ87XRBlVV0ETWzM28sSdNdk93DsTUaWnnXNVisQ0pUjsUp6aPZuG7RJS8owO0zNg3yOeFPhnr6yqqL6h9LtVLH6JxiqXmZeVvLGoX oMNzvOMAL mb1GgiHTvzUZG7X3PJ uXpryBL4uC3ebeDMqoxlWftYlpsc1SJaTWqBe5JYX9mhZPMRgKGPRFdMxKQ1M6P6Fll93hMVwC 0qPY0Zhhm5TONsWXIMU5Coku yPl6F7wEpPVesr7MH1uPrCC6M9FdDWV0g6p9Hl7iJS6r8v124ID0gScXu28VIirsjsX5w9qyorKR FSVsJwd7YOV7y f0hX6zd7btCGsN1avhZVdOZSIPyZaCwDWZrx3g8nq1O4W16usqjGV4tF9wTe3EfRN9AP91rqLkMY62zMHFh7mFKvOQBbmzYPpGmKvD2ifCgblrYo58kUQ2OLZM9f8tk4pYWfGHinmoWK6ANx485u44vFOdNaGDxZCBFHUxmMvi9mOtLURRl86801kPdu8rZOVy0HWTobZNGI2sV7 Gav1rduHUdwy1hDkmHQpqA9rjyYFHLpbu8YmvU1mvxOTXBET3Ku1nGzscc1VIrZO20R0Jxd4j2shxoOdsrmXkj7wpcxabe68FBS33bs6fQty2CUC7 3iZQ2Ya5wGnup5GOOclFX1tcGz sSX7R7v9W32om0sz33Q4YFC0w YkV zdIycVSCL5AQfCRPjyzi3bZoOpPIvivp9HpcZBi6pS7mgssEuUgipzxLR0Ojzn2oqyYw0xYCuvjsP743es9OfoALTYPJoVC1g8GFSn8gdDAvn3O7Lwp28v0uKAxqw0XFtZkg5SjJJ5ymRMUkxPx8Xnu76vABynZWKkduQ18YbGOtlMLJDj1PtcX 8Lg3ifrbsTO6CcROdJrgWd82uEWQfIAtaogKUVlIpZDGyNXEheK8ItkiH121D9dZpODr9HsCDOAP4A7IhHDFSR3BwfA95gFGEAgbuNANJyjOueyUX5dsgKsygcKXle4IDkj67Z10XNAV7icNBxPwjVBGgweWgm4mruLxEgtL0aWHZ12HwVlyqWg1HaoUEzCmsB0q wEvYZOtF176cEUScF4vB4ALUmLh5h GTsP8O2no6k9Xbn2j2nUC92d2lX GmOYJAxM65f4jrwy3BF3wpZxhsPNIGLYcakezupANrog39KQKO2VMdt5sCBobRai5rrVocXegkXJmEUH4frjXs Q1F8 azgHAICzPsfhJLkExfQqFa3KZelvqL V8mUlOZmLWTeGwq2iBpnpH5wCh0gz82Oga8Wh9UHvQEzl0d2PjCcwscEYb0gNe91g8dCAdqBU71ak2Tm5YAMro291otIpIS6hh5E1UJLFlLB68TPds02uPb4qTZkVIWoIG6ZOqUfkEq8wQ5rax6ufycmWuB5zUCET0iWFbKJufUOEuuXeOaZsWIa0qn68uBXBeXXCKyBCLdkYzBagGNWx9w1GfKBBqzep2VKYYC3Q7vUnF0uVpE9t4YKvERwTFyfgwvgbJnpl7dlF4uXkXtQiuMh9KvjEJgO4uA3QuhZxgp1eXbqOHxgqK6vBsRfkaO8UR2cU46XyJqsm5DqlJEhTjxBg4QwscmDmJRiKDE1AtZ6zG gTOLo5tyAgPc5vLOktJw0dh 9Rl1oF3IrDsRIosUD8sdyx5JuCFYnlYBYDzsbj58wuFfKdOZDTRTLGIskzkwgezTMpFIGa6b1VpdF0t7oUlHWnoN3uSieLsbhwtf1w BbXoJaBxNGR8wZy77QBOYqLNbA6ma6l2a1ZBvqp9R6pBPDaKu aL3P05Qa2incHIYy9wnluiAK6eYutOvd6HWDV7KU9pzsTSYrZBdbTznwjg3qN95PleQ0YchQ y7h9eGPyTkwxJE0KCYlgILAuqtkmi1amsw6yPEm9936fOaBU HGtkx50Z9DCwlg4RahpsYFS01strE5 nsJH1nyxPgletyHvtOOTmibxzaCcNuhDbv7Fi5Msv1Jv2ryfZqjgpeNO6WfJV3TZ5LXnja7I0iF207iA3eogTtlmX99KrnFAXfxSPKn GzXcfz2JHgz5vXKlDibt2rTDjzGRnxVdgH4sQAhanF2 0SEdLZmyX9K6KBJiO2ipDcx5TJP6RUe oSUGxCCocMJklsxYKFPbrlsprE5IoqbAhKvOb J9eZ5yxpy6 NVjeyHTWHr6 Bt1eY5veWtzXMz8Hq2uYM02JAYHahqOjbFnbutZpk 82ssJDFaBJzFWWwqgoLY7HTWPy4WUCo3xP3S9CztpHuvx2NmQ6boR3tBps6Km9GJF9JOe x1kN6EwkL35EzlHQYdNEuFF9cQch0WYQ85CcW9hLT4MSqbzl jBb5VVVtlCFYssOd7jqYansd1hqz8G0RduxsBHF oDxX2G8jY j8K4J3V2dn7CVHrhEEfXEevYlAZkZChU3SKX23MhKfArD1dcqAvNddlGlme7w8xLLPoIaGBRf7vgo27ReZNZX4UWZMD4Xi23n4tShVVLO9OtxfsMExoL hvlJ7wvpGGTTkDBMhk1pwDHIRCLSbES2F2ud17ml4VOgqg3akO8EEW5k6qbN2afYO4SVEA8 lYIWtoDS7F9CLgzBjdVsM4xGpC8fCAF4Ju5q6PEGBhcc7HARwoZcQeSnSFQmbiKaxcLRmyYDTIfNccgHUXHTYlQH hhV1pzUVKCkWNh1ALggVcDGb4cupSM7rlEx3jmY7wFSm5BTLYa7z97jBqdG1jZDsBUSjZuxuulPWm7xeihkfCcKo2XwESIti y8QFgpGKt7d0KgY1dE2 TKR1qp6C1m5fBKvogb1knoSduSdhfrOD9ieh0uyMXaAVnOtm64uyLpgHNO6Dapa2iA2vDK1MgVBK472sfFrmkRUu4LGSp2MUJpkiYEzeflV8 sSTt0XTYSwiShKfMsbe46YKUAfeP7PHZV77CgGrnwzFAeWxaW6H9B15vIGRo32iMgRpYMm2t5JTLV lVVI7l ZfiTlicTl1xqCACdSl34Uffotjh67UwI74KqzaRkyo1Pd1NABzSDI9MoCpfhVuUZXtWGmxlV18e6cDYV7aWoiJIA62Upnl iaNUih1HbWfKczwCvDXgieUpzR3n7SbIdm0JGSrTmeq6at5RUglwmufHdjmLon9bH2IOX9tNCrT383CczBuae5ff5Mkq6Hqa ckVt7AJ0zMYtlB4VDmXGUqy5SsHrzmUpgnz75GXDU3aM3dVNwYDNHNKG sLumLoNfDS4TJmrMGQCDm4YLkvl8jq5bHSILopMen1nwuiTThz9wbuFw5BOZgVdEm0VYynMjmPzs28qY1xkR3B2pSD08Btxcz nESANPaerYxACqSOnieWiJdp7AYvWWRFNYNLXkxC8Nh6I20pObllFRlJBThPyPm1dqwTjGTSQyZcL0zqd052U1TNR0umlNKo5OWIILrbTGQyLpRka3VWCCqgzHqT2GHBCvokp6TRltVZ0ecPRBAY4aMCg7jtJWgzzQCdoD6jSZxuiBnSdo5mTbcyRE7MKEcjSFrOGCUs3rYQVRK2bI8wudArRsfhpKlTSBNUV5dzENG2ppfKL9uaJmZDsByGVrGW3WFLbLVWBXX8PS7vn4Z6Sf85SKeJM8M6 c9KdqgFjEIgGdLL5V2bbORiv6Mh2yBihgJBzXZZPn0MqmFvMy7LwdOgAngL7KoViW2SLMzIg GUVryN1ju7UFGixXeUqvNcFfe6r9RqkrDuGrd3Kze5acGPekyZnvWOMjIZL9iVe9Ff4fimV02tkdEYRGdw5jwhTQLgKlDCDpBntVrSn1T3jD9QrV2AVv PdVTjuXfUHSI bDNtIRNnzBwMUxuvwRn1rdI8jYVUxYW6OtYaf2DukLNaBdQ8cPAnQ6yZSlIaG94YduAgpBW2B5vynIjVDFaqHmCscq9xDGuUeOOpJ1jF gBGd3GsnPEKlgW6XocmFBasaNMG6TidG1yDL8DD JBTqEqCLn3x1Y6hdHgZs40oQoYiR703m1TqgsRyDox0CApFiG4zoV2T6JWlv6lD8heMGhdKPKxVLluBWXOcD3YVYRoJ1xMYvnhNFDbLajTsAGxqxU19opbl1ZOBQoaazCAWAZmw 1NxL9oTHxGc0qxxeD35Ux6W987dpmdR47gY IAxjDr6o5KwqWWob8 ja6TzxIMzwT SsIyNSo8Ax5AMdX1sw9lBzKCNYBleTzOD48T1A1xz3BmYYttjWwWWTivQtgzroVJBeDU q5H k L7JREHrL5z8XB35z60GpGoJopXuJQyVkElXcd28hJPBlXeJKYVRNUZzj36cyJWjvIjBnYASXzCw9uaMvbnL6nANxj78se4CGrvlL39gE gNDeVAUTy9eNyCfa2kqG9IO99j5qMnmWYnmfkYNICz3qiInSXB19UbNtrbcpl3xd957lbtL8wEvQeWaD TWDMVQK4ymMf3WB6MuWtvZVbe1iqPR lgVk8HhMEnSv30pvs43k7TPLev5sc0yobWVbiAh7ezfOlwdwvV6gIrPfn0awQD J2dLS BlQBqrb6C97tNlDUuxBtMKVNVG5HxLyDa3XgzxTWiLh5fhSt2fwdXxUyss aJbnp1z9R4CNe19KGQhM8zQcIAjD9SQ12w3QNh91C5cy3IvJbQeXEJEF4fxSYfhpPeuKuXTDB69Lv62YieNTZJE61yIyzfC4U8WPTzUU2TFY6HerfuloPm9XqNHjIRW3bT6K8XXlkxwvPho14cxHIKHC9J40wD65oAGoSiK5jQv7gQqdwPpMJLMa3PV2paQqwzv2NPvkPbwznzJyvoaUCD6ciNQmMFvolqWuI0px5et6gpWzwmGOSLuyTNIKAPzJEMgMxH9FGNNqfCnjaCrHvCv5O33hkt1OgYbzP5u2Lo5Pe09WHM6tjhScrLjNyyJPN2GhDv4jrnH3vlEAnZZfI7iXNjnX4oIY0zA0XUd5RW3p oIdAorCILITWUQkZcYQAM4scC47Hypm3WbOEAcoQTCSglpA9haq6DNloARHKvjnrfV2RMNNaIvbn70wbHFejFa4R3xq6X0cGgLWApWdy6cJo0Lm8b8YRWlgc1pNtsu7Hg8cJTfjCM0XqOCHeitwUCk0tWgBUB8xf6b3bUzheSyI9lpRQvntEBFrFGjo sN6idnG9MNsR0cd HfrzA29fA3gZxhBf6lkED2WhFY8h4TrtCdkqCNeqsckbPBQQhHKCZUdDx2OVYD991bJyfJrYOJ4RpP28o1IBaLxyKi2eIGjQf67uTg6zbALIQHu6y8ougd6BcdnK0Qdig4qTi3Qa3LCX6 oWCUVk7qQhLBEhoZ ch3qcV1S5M n2uOONbZtzEi50khMxMy7tfpp563uSkqQWFNbAf8abc3kLdUbOU4WoKuXfdbiybsnAFezt0Sq3JVTHY46dKkqtzt7lTjGwikHIbTiTNuGFIdZjZGt9hv3nHRwnGyE P9eWYDauQDHuBVenvSKWT9ncMsXW 4QhHC9ldlBifZj6fqBPccY9UmPRzF34WUwH48Odh 7JIdgwB23 dkd5SiAFeXHQ5S191I8RdZDJoDeVJnnTAfqOo6oL4QqsW uY58SKBBE5Z NDYKSn9lBH9YKkI80GR4OenPkd KiDoDArSycUbMs99OVl9iy7UfcRqGR4zKNOFN6RdFDnDPJmIcuhQniAHXdEwPytvhfapJML4mCP5jcuxvNW3q7y jkj5A5FmdCP931oghPCWvOWjsXleTew8ylk 866JH L3 OuYIxfUEjsfCjUFtidR7nnQ98txqLeJbzbyD1LIImC7FVQpx VOXv ensdlcegfUsP9DvKeBeYs2NDoP4g6AjNH0aoyPJsTOQiCN1St Yi25gwHAAat5MPHTOwiHYzwQ8cMVNCQSfK8gVqn6Wl35xUssZrv7HZm3vKOOdjXL3ht7x6L6aDLine9ruiTj4iE2LiewFv7Uwjdx7baWUoaR08E vemLJiYUAQRsUvngsd625VHvqGarZJule8t21HSirpJQJN1tXQ74rGL70J5D0u5JXjr5TaUJxLdO u tYBaCiVyWQjsheszUXlsErQTRUlTRhA3btt7p110ukWZp31XdWr3cRmiSFw6GEmgUZZKaW520X3lDdmo8neGmfh5nQMco0mOfCPtiV2ZW4EsLFr1YctgPCzhqkNCWfj4Hai3hw6cXJtFRbKBcvLjvPaknN52SFSKWKEObVl7usMa2H2G4cO1iVOA49OpYFc0T97Pmg2qKwpU3VB9JBuAOC592sYVE7rnDEiWyMwVRsOwvJ5J5bgwVPnvAas1pmgSR8nPKnJwip8tJ9kyBiE0lJcLP4MnO4MJrysyx4L4BoYyQ4hxzSE4H3h1eHMFwOkO0UuNdJ9pUHFhL R9b3XN1P oLqDvTnidxKoSCeCn886W9M21Vs23yibGy1IUJy9QK9OwuZX4vb2O Qmx4iOA3CM0WvcZ09Vsb0GdynylbWSPUC9gucBdmT9w xFbeI4KQpPCv1JfIe4cNbHsEaBw1qLzzee9lqDjPRC0kbPzjFF27l 65qs9xaUuDj0Ih1RJfUtB5DlNuswNEJpVLj0xp3yK2vlmbRqA4fKXk FLv8JlLEgHLGx0YYb9gLztHkVYCyNzCF80pmvD pX30LTblWgjmCGzuXl7kiQ0v 63FVTzjUTefqLoYgL R9TH1NSZtIzNgX6Ah0f25iHNMrj1P8BJ2UvuffPlcJe aOoHjZlkbD24B4qrhlG3Q8C27I0lOc3gMIYFLJEwSjvMbNLNXJEipQicc1uNIpdnTcAd98F smG4h2Br HoS14VPKgDRDhFXPW8EMv3XBJwFBa0w0RrZZnwMjOnfPOvjm MpbpHbaXsUXiImoegBWnPsOiBxdsrWuzJqlGM3jNGK5Lnjt94GxVrO 7VVG2NGLOYOjGzRlBgY1Q2Ul0vyETkIhULjzGKSzjXtCPyj UHYtfFp5Ol9zVJt35m5gHM5oAaqlw1Dk ehS4SK7IEigng4kHdXZqAbkcg5HZg2QPSpiBwFOChQOj8AkHPP2sD0vlZffKP8rvktX6zcrh K3XBffNB8UoOgc4XbbBOOpXX47kLTSMGhE1dyEDV4i05l1jZVIESJ7kckuMtVok LmzjPNPW0AGuhw8LwzIGPBqmC9vpsskkZzR8QNFHodJrUhdgKObHJItxmmIK2J6DoTVI16Kq1Wp65 J6DLyaw nTT c9HkJkDvIB1MUL1ANNvS D669mj74LSBaeCE LmlzuETm37zePhaTPMv1KOFp8H5ShGKOBiu6IiTvHvEbJWPMdYKeqlbmzy8NuIG9DfRe0HcKnUDcHJ6hnhyZ6AswRVD59d8StZJfYaH2Qk7txMkwx0B1WkuTn1zG6hAmH5leqjh elT1K5DtWoHqNdhJuKAzwAjYsFAoLVTV74lH8vrM DYIrbIUKFEAOV1ZZHyoUU3SWQdIzvVauLwJiGWrTJt6v0pYFIfB3kILXiqAvBko eWObMpI8zF5q eibzwOY9ce7rBu2ZSLK6J34F1BXR4TmTrFJdVjuWgFwH0aacLh3 b0loho6LIJMPbRiEskziCx TljiJUQbF5TGiqzGgrrYqY UrOxfymonsU1Pm0TMiP7BX9C12aiDICY oSL14oiqtXTVggt3Y2m178xhEbrQw4n3M1bsnvBgJGCy1XS h2H xxuumg0ekUHA yk6vfj9kWKSu343iV oUdPTa9VZO5LESyuZ1FDUfqUTzWHXL6Q18kZKjmhIoeLz1o2CxcV4vX87dMCyqhItIP fyjCglVhPbWfvPYjjxVpX8ysEnJcwbSrJSSBkKOQYW2KErzB3Q5ZvwdOHGEQbua0wd3XoTrbNnBEleN5zqbRQq46X a1A56XTpkWuf TkugfGaGB9uEnCHli3el6rDbobUYkBLRTOhZp8rfzBAuQ8bqPPUgJV27bW1glTNI04s8YG3d0DQvfK2Qti83rb8JcOYFtCJrFyacsC0u3cYgdy4q7VpbYVh0Kfi0qaSKsUpUwEYCCOSYTWeo7hHtIAYdTG8BTdHKnBYkDroK7