安全研究
CVE-2023-4357 Chrome LibXSLT XEE:浏览器里被忽视的 XML 外部实体面
Thinking
2023-08-22
2 分钟阅读
研究档案
#漏洞分析#代码审计#Web安全
Chrome 等基于 WebKit 的浏览器把 LibXSLT 当作默认 XSL 引擎,但其 document() 函数允许加载外部实体,于是 sandbox 之外的 file:// 资源被悄悄读走——这是一场围绕『一致性缝隙』的浏览器侧 XEE 复盘。
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a47062292625ea7240d146fb061f3975a6253d117e97272d7df5aa897fb9fe2c09034f658aae2645a68076992d7d9de07ae63e2fac88f85e475412988dfbc9247681cc8f2d78cbbc42e29a052df1def52dec41b0893268b594d5376c09564082a9f760d36b4551d76dde585a6e9b02de0b49ca6bc916688d8a0a61ffb3f102a82b5b225dc09d1d6662252f987f5083a88e85d5f2fc6baa71d9df0a8e75126571e649fbe12bdf4810760e4d554d56bc5afee705ecbec8f96af319eceade2c37ec3206ea339d2f89b0cb327da56353180366a756413610dc941e30ad76c594e516cdfd707b91945500f16859351f11f8d4d9326b3945208e7f5e6e58689b92bf5c24478f46ad0f9823325e84dc1db7a7a104ae455e86906196f666901c6fa991ba352e9ecf78abd2c3408360e90ded200fc1ca3a50911bd1f7fa87ae76200f1d04686ea1a01872e097d84d698cb5ed4bf9d6784f6985fd71ca38c999d126772352b8c5653182f4807042f8e19ac2cc3d01c9b0091fef1a3d13d3ef7914c11af6cf96705f27f7d8e93a7a714dfbfca4b580fa5a69498bdf2ff1276d7cbc970e383938a8939fa217d528ab5c2684d85150da7962dc533c27deba554da08bef2341014cf488ce95a097b108c230974527529f4e8fe2666877ffa8c4e1edc1192c7ace660587d1fc35d00ccfa7088904d5b6d9449cc01a667505c8d7a6594facdd856dd821d040689083d31fcb03c24c8b9bb805c67a642dadfcb4ae3ba1bbec7c1a33f37c5b81581b3ff14904136495d443b9622a2160105e290d6009b0de9f3683a1753db86d2be63dd3b38ca60c8c9f78837bc029f5d9baf55fbcdab799cb225a1c0d1f41a67b6d479c10a2b1de773a997151d721afc94850edefb847690a0eb5559eb5daf164b9cbe3e60833e7aec4e8e2e4dd9dbd762fb8ff942bbc1fb1f52a6213e139e2a9ef865f9527183d232c499c27e84a483dff3f51d07d8359cdcacdda071b340f7ead06fede4285590b6ed5674df24131529874593532f98ad7400953501b800510a08ef11f29cc1f2a75c7a9f90adf6a3e92dd8e15424c9f35b7d28d058d92ff6042ee1754ae68e3ae043a1f8265aecbb7e5b3f81381143250a5c07820bcf13775cb3f2421c3470f6192b0e8b7597331e878ca6bfb826454819be232624fde40454c9dbd1a4fa1d1de567e62f4942e277977abe406d69b23a35e4b7a2610d55780fa4d55d6abc2850e0ad8a8514a6a7916e2ccd9217786ecc34336464eb4c0090e294928322a620d0614350e0283769c9f732e97fcdb89018c65edb6937907bf109bfeddb48547123387b0f647c7dc7f5b09dc201962f94bd66c30314e4b2c2fd5fd5a52c167e128302b101e9ffefa530190119207a9d246bb30f73e17dedbf96171518470c8b79e6b2c486cfbffca53671df46370e603d756da2d4ea1043a0c2bbbcb4034f9d8a729684458417727b82db8f57dc76a0e1dc2d0364093f0a6b6b7cf1b3052edbe5290c01d26b386201b359546acbf2b26eaf0536ada660c0eac669fd352c1cd6cd6647989203601780bf082f2ee3363df592ab6937513fab30e69c007dfa7bd35d09997291d0c0e74c4d07fbfbfcc77c58895261c92678480417bc37e2865baa5ba38c0cefd629cb63da1f640f76bf7f657855502a2cb88fea65cc8b6eb6609caca6688b985b98553b94c69d3c03bb92fffdad7960601a6065ba5a6321dd30ea1309bc45afd59b5936a9d2731a5cbd6a29ceae5fcfc4df56db616e83ace7bd9eb226f75aeded1e7503d093d34bc434364e3843fdebc5659e6d6e0b1ef9fd2141132912a1f74e4ed661be3192ad498e83bbf613a4849e9129f1e10ba48baed2f9b7b595743c1aa8056a8701954166e45739fe3112378bb4e371b702cf5f5b3416d6e2826d755db2f6bf45ef1ff45510453b169d19cca5f8d9526388d87d1842418bd6e90ded493f2b80300d52f9ac9231f295042e946f09e89274e33438c1d817edf4033269e3066fe89daf811d5cd040308aaa9c0a5bf91778237936c5a828a0e37ca0074be658ff7d3217a6358aa166e414d381df5b4ea7e44476e4b61cdb4629b3f4a6416918753f5631d7a4125850677fdec573ba22062acd963644f484487ecf0a1e3ea855ed6e91871cbb8d083c8ce00ffc99546fe109f6b4a47bd7a44048b880ad43e7b27044f5363a86e6e7862fb3794ac3583c3dc09ccb2b351b308ece1a149ea98587e4c6532410cf6633ac9d398b89c72d421e0c5a4fa9841fcf99912cdf168c0635f7b71689a08a7623f836ffe833e5479218b80a8975902a9d563667924272502668ba82b0db91e33b146b06d147d48ac0bb3ba73b20cd0ba2d5c6c9a28b35c1ae6a89cead80ed54906fce778863e1d68e0fd645e422ae18dcd55d53b06110fe77a5e5057df70c5dffad6684874fadc4c45142c0a81b09ceb8b75da846dda2c83d58656d122a173121e933fe29666340f91cacc77f2110a007935d831f2742e44d62b0d400dfa5a96703c44e9c6e307fc1c0d3ba24d38193fa8ba1f6d9f207cc5e7dd81477f0c210fe6cc5cc59e40fe34d6fdc255fd199b615d2841b748a5cfed6897ea1e2f87ceac781ff0f332ce81d0c65d4e5ee319934e71de670c5da3c98d6a26305395003fb5b8573ccd1f4cbcde0841e66a9dd978703391810e037d67150a9268efb2d89e8c820f58c92d41be589e000ff70eea8e66061c38493ec2a74f179d80417bb3bae2fb6ae5dbf9e0793d80dfcd6052423a2bf68d3ac71359f874a93d5ad54650330f05ab477eecff6688f71447ee99aa6eb72a1bb67b28ca8c86b6379c8f62b605895c0d5b28119eb7b9bbb08b080cd9f3abb903ffd666c399dee94468a0929365c6c72db2355ad761ae2ba748e45357f84e88ff58a1a0e95cf6353c34d70b1c98d474a6ba3c48118d4dba379a1e8021ba955d9a84520da625172192c7bb0bd98e1097e3cfd22c9dad37d9ef35a3fa5c291d98fec503893044a7b12399372c1d3116957e4b0867e0d4f2834690ae28d3670ed84760bb8f8dd87834b3e425814f244b48221f4c4b084deaf39457a98559d28f768e33ef55bd40b8d96afaf893d96d613f5e058f08295c97ed8d4f7a909d7e887d86c78416a860d264418fb47512868ac3216490518062204dcf690cf6b3c2613b0e65629999b15f1ec247fe5d396a7ebbde329a4dad94fcc6414fda84067a697d5190ba8805369eb16341d44330010186839538c0c3b8dd45cf84da01e093c9a9fc3902c2f65dbd984eaf8dcef478d964f99ef0cf7844aafd6cacab8da940add32d250dd46bba2797e3db83020f8984c9e9763dd3cd1b210869d5adeec746f70e30e8e75166dc50f7d2d009febcf094d68ec7b6ecce698ae3167fcd804d7e6a3f54554f4097f78151776597c1c76a62865782b8a0e964842feba31eeebfea785ecbfaf9072e9103e20c27318f661927f61d9a42bddc075a844914abf607e420150349aa1c96a03dd0268975a961a6f525b5ab2e5f083cac87c943d8004a09eb00cc6e0549a3bbb7873d85bc72b251c1805601d364f2b3deed722a86b8e5473f7a0ecb97d6ba79570afd6d2b7baefacba51a873a1d37fed7459c4269d20366c285a755b0ff14caaa301a5158036d51501cceb507e98838b3637729eea7f11d24dc967a49051a9ba4a37f3192f921432b299d0e01403133bb35dc20dbdc849146696f66bb8f13797b720cd4b1e6e0a62ddd0c714e04d2f7d226934affb0d79bc2cfda868b90d06de8e1316237ee34f3522861a06927f8c2056dee674ee1fe7b5bb3409f84d6c7aee13c5a46e6f479451a680ceac02f5a99c523608ad9cafe67d4012a087bf873e13bdf545e880f2096d0d9def183cc6fd90c996e939af215a51e4a1e757221b1811be620b3cc527d26b577aae330384fa3983e6cd189c774f6bbfa22ae8dacc3a06dfa090054cc635e46b45b94062affad2a9311d0011526b31be3d0b39a043a91ec92087f1a8d6638484f592e57fccc9370734ae543af6b3734179a20c39b847907f55125a81e5511aa34aca4daf265dbd846082da14a9ebae776048c8f6953921e65b268ea19d34071febc5c6cd6f9d7b4ded3d99cb3d2e584332435f14190f86fde58610a4cd98a9ee46e7cb4e510ee2b90cc4e1cdf1b3f0695535a62cc1aece93c694c2a45134d3a70fa344a48305bd10d92933af8b00c357c0e9d9d05f5ed81058306bc5eaddd05cb21cf4fd42da9f45cb623c4cd810598393394443ef81bbacecfc7c0e9b3eaf8a9380c28ec571b134e1f1ac00d42098f0cceb0590f14c49fe2a3ce1500a315f16385047c9d9a53a9b8b022f59c86066c02d951cb116996b7db02f76500380cde53b1e86fb6ffc43e66067bf87dfa1d85d6f52eb429a723070d4cbdf847254aadf25e664227a7e5f8c3a610d3e0ebc1ea16f562cebbca702e012ae87f4acd564e2901883598bebebfaefa5b74885751fe54a6d19c139ff4acd786a552dda83f27ed2804f621ef3df64e215f7e9206eb91c88caf9cf4886fd7a179476e50911b78dde4abf1e2df963abe2ef8a570832ead9c7d6cbc8876b0ee48dd8527023bc2e85adc16ddcb9866d26d65528f6874e7d2d4c46e4534568d3965fc65d6dac053239abc4876e03d4e4ed2bd3e83414ad23d44d543b0fd27dc8fae64a59c5c0533338f5b7d281d92a08e4592b50ad4f1d41be634271856b92da3bbf34b6262ea6a0a88367023a16f06f20ffadd1ed8a4bfc7a378c0e141c51fdd8cabcd98d2843b76fccf1ce97e6d49f39a1e92cc2194840bac1151e24cfdc8d6100f3c621b417c296ca4a534b6f72a93d7d49dcc737416a4003f9f39efb1f86b22904560c25def58b39ab9935f0656683ea3b97987382b8b50ca9b5118341ab8816e1e4de50018a0bdafae87ca5bd4f9ed557211282f3e2b887553daf3b8aeef62c93b13c2afd1d0b6ff4924e4cd66b157344555993483abed4d60815be2417af723e9ee9bd5f4671ab7d75174ecf0460a8c20e69d153c6df26bfab4de39b028445c806a8c120fd8d6d43ce74a5df3ce3a0eb1e3efd95bec31f1a9e2ac5f6ca3e27c21024fd9c56591647d9e58e8654ac2309008ba2552489eae3e84ea1e62a62684213a6f2e15c9820369ec3234eec40dcb132a29abc27815b189be0f37867a6af2e29fd18181e5eb83f7fb53534d6976f81079d2e823a4b9e2af225e2dd5591c853d1d91e43f4cb27d283aabb1552586cc85541d597f71597a34cd706f00c788f27bf32e2c380ced1be932ced0bc09eed310b3359a609098fcae11973ee2e0d7f49e254a3844577fabe0116433ffdee0f06f06652a171c71b33d79b76ccebd68b61508710a55d07fa49a01d57504b7a8fbebd89b0ad3e76328af96dcfbab67124419ed1cb5e5f4167c8eb920da0c6e10a502e8c4fe63438ba51a2875b785db5244cfe0415ea9dd8a694b86c4a87d6c3434574e7a14d8a99effea0e36555b1eee8341dcb2ab0be52a51526454fd919f55bfe097ec717b402dc946e98449faa92e32dbf2f6cc704006f355067a5812470f9e74d5d97b91926cd519576ecb545ab65dffb22bd54c24335e71a8fced2571602ccbcb8321519bb3c32476581be0f030c3a5cfd91fda017890cfb25e4d104ad6974372eb468a803c7d29aeaf0e821b390d2a140a88813998d16fbe8752d3686b095ed2e03713c7c1820a64afe8b471bcdbee0f17ec02ef54369757ac79dab406858eb195db82cf349e528d13f3226e88f5c38ef631894bed507b395828d3e03ff47ff47d08c108626667040ef469f28ffc9fe1edffb926a4d7725066c21204bd592f7d5ebc6ef8cdd18e8705237c58ff970f6547f0260e5767f843c82ef4c9db0084f5d1698a1ccd187112e9f3ebf0ad8a6fc8084cee70373f89909c21784fa3207ce643c13eeb76ddf7ce11d94e5d58b8d5eedd5108892228a2e7b791a3c85750a022568f48552c54ca2c39aa6997fa5209e99f0d7c4f1bfb70d4d6f703401f23ac18f64d5dc7bbf2c03d16ff8984c05d38674147f98b38f20614a08903bf5d335f94078577064654d13453734d08220014b818c8cd2fd77578ae62348e1b1f347644736571814bc8380b232f2ecd6cc193d2ddbc8a87136a1205b41faf2634ced5a765784ea8e8df6442e962874c6f12080504ea5425be06bbbb302ce2b6d0cfda2f971a40cb7c862b95b0a81f0df786a34d771e8c4b5d3e1ce057a3f90f60a9c71d01ef0651ebbdcdaf4830e43e23538a1f3e8cc0dd612935672fe5a5c40fa9e7e3a97dc4730b15fd23f58c8ea35a1a20de90a1cdfce666a8486d9b8138049550222d27cf2eb2dd862524aadb6490a36c125690e774730eebd82b761c42db4f6697f1509951d3ac33f1faa01a935ee173e618f1e87ae71bb914cd476c701a54eee0bacc66783e3b8097e11e996ba2afd85f725450ce24f1298ec834cbe5f0943dc292429e1da727f1d5d0e62adcd3d515cfde4607d68f3f9eb4567e85f2a0b59bae13b08d034c813b695c0686b4ecf88e6d87c0575b39a4134c995d16fe047cde0faac61c5738ce8da7794b6cbf89e7cd675962ebe4a2b0e7f4fd2b367afd09d8eda99621ba600d21378e4f63ff91541b8af02aab6f9a66eed2934021351a0be67d4eec237a3e3eb6fa509cda08178b54a9c4a327d19bdcbd89fb0a043114d1495b58b1a81567f64caa92c44de1a9cfac3ecdcd3f1b40bf72e35f7ed1133af4f1f440e652e86a029db5bfcec618b5d6dada9ba785fd6631ce1ed2e5dc20ccec6fdfce6d80f26da76e4532c54a34d07ecfbcf438dcd43260b8b8cef435f59e6c50cc31a9cbd03c7d60eaa444c8fb3f84f3de163073b4a8d4b4f93fab5911a2db129037920d1fe387d214ab05966ba6ec88903413664a7b584b305961235aae84a5ecbd19848c49d26bafdfb2c9e5f6b37bcb6cb7fdae4d761ba17d0205bdd51688ce21963e9fd99e230c871470405043a1dc99be301f6ce59af65cbf3c9057c4bacf55f793177f097a932b394b7925cfaf5cb2910f9f69bc0720074deffad37bcbb027716bf3a3c4b8b5d3e5b295bbafa2990c63ae54c3796abc2e72af89c30cfcd9c983c0b930033e66be3529eff8f784855af03395035c8445fe3616dcafd04a2eff20909f2246ec32a5e51b564696cc1507a45848447ce415709449e643f111b32104a8c7b1f58b396fd8efcafb945d92d082030f05e62d9744b18930ce6d00a32fa6c452dc3498b59a06edb2778543b82589ba38c62a2efefcce50e573dabbbf58937f74925752f4efb34d7a47df71ed24660420d0cc439e6b9c1c56c02c8b5e84c05b2d90890c0b6774b4500130d73fcadb52975be9dc4623f00a9b521608a8826b7f3358717adeb3d505264babd7c05066a9d421c20632eb6d4ccf644c9115bf3f74582ee5b64ae5fc3f1176a77da5ee849120093a9613ed5f45437e9f7e7561a765649a8c227416e7f351360624e0428875d9d0eabd341e1f07bdc6c66d7ab3ae7003c422e2be47a2f60a999ab448a27de6ed6edd5604ab14a373cbe2dae85a8caaec616ec307dc039cf5822e708a125d22ecb93202c2261f69cb50a21489df5efdce0f08184a18c1393608cf885fa00d4e088f3170c24a9d943ce2370e1b012e211591ed6988fdba269b3670d8ea7748b6e33396cbd48b0b71710c9b1725c91f7348e00b68801322b36b7d65396dbacb69f01d3a60369b5008803b580344c8cb20f9cf66cc03bf29c1b4be66267d77725a5a16d68a8867920c743d529057e87e3d54821d30efa06f88f6cb5baaf82a62f46763236464ec6e3c9ee3a6cafbc6dfdbe46ae2d953279b6fea1ecb632c9d05ac0e6f70a2bc47f179381381838591b0bf25b36ca5be889d436ac6cc8e621150b524336b846154e042f3a8df7753961a95f2d6c2694352430132ea813f1483fc66863e3df3fac14b178747a72483288e198053e0417e463948fe2aefc4dcf116c005e41b0855184d2f82001ca346eecc1cf47efe4302a1a39bcd25d944be17dc70fa4d79557d524766a37be6236f23885d403b1eebbff3b15c60af57ad1b8ae86086c7958bb08bb74a01ca7feadcec751b0932e9eba5fd0fb51825773b1162e8fc7f5864da10c770fd7a61aefa2eeff8605e10af07f1691b451ab452ce93be88f667b1246bff01b0db26650ddc57e82f30cb7ebf21468335578aeacbda6f0bd2979f68517177218657afcd49b8930c300d2617d57664ee73a2e19fbd19aa7688e8b9ab67edfbce37a3f943aa822d5e621d4a8e083ee4d5b65da5aa6cd36452ba18aa3ba0ee7a8e2992fe982d3a52b63486c0f7e18d05c6e2df8beb0ec8002b2b5f9b5b6b7859486b9767d2cf1ff919faec0bc9118d6066fa9d394550bd43c9e727a1b5890d5febcf70a095df25b7285571ebf74b6baca738fb43efe7a6f6ee169fcf48b5098f3d92f99d12cc586d76941e36a74c60ccbd6e909bd44af9ae239f85d8bb3904b8aeb3756dc5b14a917fe1e7fa550d3eb5cdd88616d2da2bdcc771f0d4984357f83bb488ec36eaabb3bb3959cbe419c7407dc613fc4798aa311b7007359a8f871bcdd7ba85a9a4f4825d58794166b8f1366fc7edeb562ec6b63be272c0f5d65f464f886fc332c2af5c4205e213e85ce2bc7dc3c1fd165437c19ba26a51f59ded3a86882e3f5ad21964d66e0f5826dca21a5b1a7cb3bbb320ac0d5951084feaa8ef796571f3646af96fe101e52370ea9b9eafaf34df0e321dbb82589310320855fba224c3c2b70f79fbe3daf5b6612864654ecab6c3273e33aaa9fc8fe3ab78ba0af6dfb5a0b2fc298c54fa58151f3ea8b9db8b44f12da7f3c7a255c7112e1785ac28656f9968b08f797fb8ecdbc20987b185ead89c06b58719722a9520cfe43d032f7e00789bbf1203c2b84ee44f98a4193e0b6308e98fb5ba54e36f59ff218816b8d39b26c975b7cfeb9216927e861395e78c2b850e409f5b4427945a5e27c7eac184908e3afde5ef76b927f9ebfb45b2f1bf95c18de2fed57f6b3c270f0c0dfceb7134399b711718331da4af4f09ee94caf2553a797825423bfe8f1973169e6668109bb01749e909d5cb4d0c553048080eecd865112f8a65def7581eeab0c0254d34c22a149767f924f22e66ef9c86826d8f1f523f0e8f50a487e2e27b32b7bbf5a5ef4fbea3aa445d513b4f838033549d3ff1e04b22c8e969b47250fd0c1aca9a47f9f507d5c084c8cd378a3c7b643971bb1bdf2253420bb80e69f0e28f5c02f730bcc8703ad1ee04a12d602fa9a515842ff5415206f9d8921fd914a72c516d2375aa8408fd0431d3bd6efbb103f8a76ca72e4397171f37db55a0734fca92d5ac81f28b005a125af2f07f748b893cf2bb576978ce768da047a66efe80724b56d0de6948ba50cb0453a78bd8c2dfe711ce0b2c01bd3704f5f44cb3ae10175bdd68b1285d6096addc0f9d6ddb1df783bc9e644c38c2c42ef6ac865f05cb79f45c3b48a19bfcab9ca1e8f3a84c548fffb4475937ccc8dc290d71b6220bdccde81499fcdd556f4c9ecb0ee2c99fc84d87ef55c2754cc71067f10b586f3925314a93fa962047f94a67a85886748745e58287908244141ff97edd2cfce0f62664290d5d4124d528dc8d76621d5f8708a4b10919bf6d7b5c5567d5c3db5a9c3b211999f4f8f59d07b955ce0068f9f1e944d3cb02122beb9e34364f6a10da412042238895a7552b8e2f88d4e610dc221eb23b222ea0ca622f80d1efa8b7c82db6e0b286dc0d2fcd1da9fa40b0b5d46aede5565cb632776a82565d6bfaa25051523b68029a1d2d4bf99418234da427468bbd52819ec3f9ffe56fef64f57a7c3e73a860213a73e07b46370c06e58ae35a8b79dc05f1968b942b0d4574322a993cef1fc959ec65f41cb0a9e36d15e092d81cc289a32d043a110cccb57853a00f7e021e3bfb8aa890f3f6d3bf1ced6623d0fd6ecb39e924a434bec67f2f3e00257b37e764a25bb7e7f85ef70000a88ed91b8cdd56dfb2e599cc43668bcb4f1d630fa84b5eea163cf53f03b16b0bb203f591645f893400d22ceaef4bd8ffa1e347c8b3d17dc68ee61c2986409d6a696fe507e63aa1843adb8869f2bab367d889a516ce58f44f23065d7eed87b074d412ff8435115fb27ee3c55db74246f14e6f169b89adbbf3750f1d1419ceb1e40671598076479ba2e34183834d9f274564f5d4261bfdb5c3aa410ec6738924a16aab5b2652a6c175515537753de71e4123dfde0a6603f8d77cd0305ac80ae585d2e425f4d07aaa9d325b8de25b78176f47ec666fc18e378688ff1dd2b9fb74d820deaac05293a1cf0c809673ef1f6844e69ef6d983b40315cbb522c9523ce1e7bb3e9171023c5ea710320c4a8331a40070c452fdf0544c96e3cf5668f918dda8d9fdf8eebe048d1a78754c1234ba9a22a8918dbe55f5b9c52496793ac1668d114bd79d716e0da43d101d953b17e4bc091f2515dc44ae56b8facb23de57e12d810612c764998048130c1c94babdc220b23c8685c3b1e76ea9ad17823a6c392d1f8ac31ad6908f0972b49e0a5a69f609da1722276316a9bd3ac3e1c6ab0318f3d5a63d336bb8e6e4fbdf7007bb045f3828bd181eb319a43498140b9b31cd35fe7cb3256b7e2021f99427aaeac02ed7c5bfd94f066ab49551930f48a3b5e1ec517a43ec88d4001b7dcd218f9643b85163ca97dc7389c67a1cef6992249ac78aef3a38e3aaa1b1d7b299e9bc59c9049e1880a8f0940ef607e219d74516cf9d38080a24ae06b0c4727f0b4c6ed47cbf931453e78f6153f89f6489659f4a91ec5fbacf7d0f5040c7991737bff8a88a5c9afe35bde892c597ec9989a79ab96fe0d4ccbbbd7c30974d29efbdcb0ab080080c848afb9c03908cc731362266cb76c2b40fb9a6087f2fe11845ab1e99ee36a03befff065efe53a85feb56dbb9bf69bf655bc1815a2e83d4e8e486e425e36e3003cceb2d1840c0d7f30e6daccfd5c76984b0d8266cba00d42a09ad338e8365008a461a485d792eb3e72c543c27c4cb4d93bae163eba5832c8cc8a43615e5eaf0e749d55e3444f0c9040e2e368a87fc79fffaf0791da9a99439d5b196a852774c2058abc7efda5d405bdfa340e6049809c1c7ea63f0e06ec371e3e89a05ac5c8ae3d0c934dbed3c3e2436efa5feaf489133b81abfdae97f6eb15d6516dc04db42dc79aace7bed54095e392c24519f39e3ff12400d2d95bff70eb149dc6cfabd7a51ff76329746abd41bd4e3bf53d9c024959f3d194a8d13a1da577e6b3d1dd83e2f9b2304f1e251c1842630fccc9f20502d1171384334f1bf847065f5625ce38be353740e64f03c3c82583258622f6def7be60ceaa618f02cacffd8e4dae6bfea8271cb25332bb8c79a9a14de67e0