安全研究
CVE-2017-9841 PHPUnit eval-stdin.php 远程代码执行:当 PHP 测试框架成为 Web 入口
Thinking
2017-05-15
4 分钟阅读
研究档案
#漏洞分析#代码审计#Web安全#开发者安全
PHPUnit 是 PHP 最主流的单元测试框架之一,但它的 eval-stdin.php 文件被设计为『通过 CLI 接受 PHP 代码』的工具——如果这个文件被意外部署到生产环境的 Web 目录下,攻击者通过简单的 POST 请求就能执行任意 PHP 代码,CVSS 9.8,无需认证。
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a47062292625ea7240d146fb061f3975a6253d117e97272d7df5aa897fb9fe2c09034f658aae2645a68076992d7d9de07ae63e2fac88f85e475412988dfbca20768cc78e2b78cabe69246af4983f107ac163866664705590b9ed3af6c6aac14223628d22a30d7fb515cdceea824bc512efce04a54bd89d432a8d6de692f2348725520157d887b7b39993a13fb5d5f3c7b0597b3612e044be11b815eccbf3fa902a820923a932a91e5e35715af38d779ea0dc5eab9a8fb248b3970e6614f9b3094b6ed4e7dc0aa48b82f414ad0f3a3aacde488e844b039bcb1359e44487f3d27cbeed1a039632d6d40ee5dc83d489ba87cb5335121c74a4311e68f7a25a7035f0e4cf41803b64a84589a414059523416f8563b15a9c9516a8fd60df8c8727077ed3be4329ad0e44c5798261c018e71b3dcaca3dfa47d26a68454e3819790e6d736303067f7760e28d7ecd9f293e238b150ca7a7c4f09b3dfd79feccf62644716ae2e2360d82c5d248d82a04bba4851d420e44d591278f84c70328bae348d96a594da8d1dd714e09fd7d637bf7dbbbbb82f15b767284f03ffe3368779d99d6ace6b75a22b5d27fa5286fc7b94c1cb9c958c9e02285f5d83233889a75061ca5b2e6c8167a4f3f41d8843bd51cd46b0703f15fd5907c06788ac1de8ffefa105936e13d3edba5e40f9a3e908e996aeec4f7d2598fd37c27374084d5b883d641517cd903fe3dd2f345d39d048b00ea1ecec8fd4494392c3ca7fab6eb75afb6f06c4c33bf1308c419497cb9444a4078c3d943ba6d2d3733460e723d6d1aadd0923bc2ee5239f36038ed7890b1e121d7760f996ebc2ffb31007ea607a78cfbb30caff31c7a5a03cd2e7d0e0d837a3b0a8ba103dbc62bfa2514a17feca08e7b513b033380632e031721a2cc8a83685fa4f58327b7caaef5a31b7db593e81ac0ce6a5f96aa940ecf6a57351dcb35e84121fbbcbd40e527a5593ae17053cb68c7923e235d08c58da5e15c8c7ef79bd16388c5d2456d76d4ffe9ae578dba111fdbc4f5606036d8c74894d5c0ddc5dc21c1a0b619a58087fc3de2ef7b5a59a0405597f37a0d16dc368ce96d0e69ffb0248cadf706fc992a9b28187d68601bd4f323770fbea81237d2b42e1868d2aff912dae997143f687489996ca968cc708fdba7f42387ed7637168423135281f95319bd9dd65e7b2ff5d235342a71a6f716cd8b6fbe4f5d32250ed95cc6b61c2b93a680c9414993aa5328797955ae8d8a726a98f69510304b5da4db194234583e7a27710c0b55795f9363e8196abf6bb291a650ab57bf4712931068dc0c94b6ceb6eb0e4433c4fcb71494dd39401a8f261471e950c6202d2058032e32d8e11252da31ba5236265e8c661d6bfb9e9c298f069acf4b9433f439191b1717f7828e0ed308205ea2695f6ef3f6940e6b14f12d71b60cc20210dba5e235013610f50d97f07349c26b5d3a87a6c0e447ac79517ce6540e30dad90e5490e1bfb88af3173548e08d4d5626faa02bcd652568e966f922d8ab3e1e86f96ea0c5d105ccd8ba4c8cb5426dacb476a69ed3f0f63414adec57f402c8e40908a2e97974f265fc0e99b3ef7593c1a43615053a7b40109236471ff69dacf2ec8155916109b2815cb2bed97f5f21e136aaaa2fdf3fcf4a7aad79fd172dc5779d049ddd422c6fde34752181fe5c17ac3d397e3656a33c83831337d6e620e38081881d5eea1a45bfbc791b9e5ee2bf5724db6cb438c04d563732bc855b6e11e8f9e8fe7ed0a976ee639a23f02d0bb5bfc365410772a8be86c5d0348d91ee7f30f9265ed0a62a56176d200b631b1a2d900b3678c7f46a1ff11611e09bdd26b95d015415e51e854c3a72d7042b811ea4f6b11698f0d544ff0c19175a2f16209eee072f7de01321116e21f8f6a6573331663bd14d9c7013b716fcb10a05415eef6d8ddfc211d2ec75258fd594d76159f365cbd3d990e7ae5d51963f9ad66440be8e9b21bb120371a81e7d49da4fa9601adda2e32d9daf5f4f8fa159859f6f505bb7ab92e0ecd42a943d8d6157819f1869944d68af7384e2837c7b0165e54d2b014f343cd2f1d76b0018faabc1cf90655df8adf3dd6a070ccfd80c5c7502840667fd46bce12af0b5a6ed48d0babad34825700fab9b923596f5752ffdce9a99a594339f8b91268133dcf7b640a67747109684485dd1ed26366a96f140e3a2d360ef3699be1b83dcc60bdaacb655bd6bccdff1c00f7acee51e3413215cf0209d4c5366735a8214a73918305afc91347d345ab5c4036a89df9bbae96ff821edd42805cfed6c46056aafccf1a60e9e415299b9fecce4ed665be6db3069c01174f74de3e2bafdb17cc1547ae64fd818fc0c3130b566d369b45370422d871856eae82e2822974e74689ab667352b14ade1dd22ad0c80a3c51ab93844ec14af1a4a445daefde43c71c29c81db867023482063e07a66e635f0154a27c13bc92d95ef9247896976bdb7867e4326b1b96451682a7d9d7dbe74e6ea5da680f7881aba01ba8483173576ec3a8be6e5609fcc88d52a32c3931ef4e41e84fce21d53447c23b5a47d8c38eb7587661f55c63ba404a2fd87926fba365736ec54328899375b7da9922c2eb51d1a5b328bcfcf19937593f324bbcadedaa2bf36540e2bfd2053e7b10e60d5590eb19e7466a001adbefcf9bf5952d4b1dca0bca254d47f72006c1325a3d928ed418567b35353ea74d5a7358ad6d2cdec482ea9da1e2d84f240716d61ce0a717824e1b0476569baa0c5f3d42805d416c1c711f446f01be2495d7d1518b04c73afbe5485fa580d645064da2a635384246eddc72331bb171c8d139640eb805b665e8fa0b1a3f48a0b158a66361c942532ec1e67583eecee696710df134cfb7cb68c11a50f5fe47c9a394c97108cb82886ceb56d965f2867923b42f7cf02d887a1fdc950fd59cb0182fc5c98f107b4c6091ed27c1c63f6d2fb50c6f04b962480d9359ebb6884e0fcc8fd0c721efc8dcb6be2063bdb9a92dd0a09718188e0237a7832ccb91b4cc35d7cb83697129e4d7ab9d0eb947832fda064ce087b4c5131474d5491d1007049bf8ddd19800c9966b7179730f47e5f9b12324c1be5a4d59a9627c0a7c35e5a034f74dc9d3d88f65d0912db11a6188ad57051e1c4654f02dbf76ed209bed7c71fd0655f5363603211bfc55b4f20ec1e8711bf1134392ae3d335c21da688bd52a8f61058dce09bb2cc4f4940c5c30c48d1c43286a2ebe01535343acfebb7f462cfbff100e2b80c4a3bb2ea257cb53697639682fbe578e04df9b8f4cf7150a6f941a4bf9d02bf0876f48604dd66b82aa524396fa9fd288adbd27923dac9261dcd83363e41911de6636ddcb33056a12de9a5892e96d7e6c7929182e2d58c03999c4363491fb8baed8a27104b31fdeef091a7ee4a1fab6e0a308866f1e5f0b43ea7e9a718eeb2fbb0b92155596097168e10fcfc8309ae869c3287204deb85435798c8c46931fe0ca7d3ff9c2fe6164af052d468f93ba12f32d57c71cfd6f3f86b3f4e8672808e914bc55dd08bd7203d537fa14a0db840b8547d9890308236662971b9a30d7f06c5c7f0d587a7bede530b984ce1a5d684f1cb63a219ff8198252a910ff2875bef809193a554b4e215c9b72b529aa2dafe80da9c215497346fa82aebd1da3c6f53a1f37c0dabe18cce27f3da7b550e6fa0b1fdf10f81c2e09ff6278916cb234d34028caf85f90008fee7f672d748d994cbdc7ff96719784e7a7e78cd49c22f6714fcd9964558004737e535413e5e37ee3ef0540343ac5405fef81faf2c9fc23315be329a1af99ea3a898548a819857229e116cb7b80845e3b52c13dae1553805a757a55a3f6f17ec18ba11962473c06023fda0d5b8acb556fd07df14a37c5c890eee5f506c06756fe3b341a420e6b26e01428d35dfe179546dc6eb0b059daa88c9112526e167456e43718332d9dfcb5009215cde2f9c4852ef079575ff18532a78c900aaaeb6ea5a29f6acb741032dfd0c06202673643ef68ed4493123e8050faf9ae1f410f11a5fdb624f8d4d55f7133f61859806551749b6196b0e034a6090196a14d3c90846e4e517dda92788089919e3b32a561d2e87fb80fb160e08caaad9234ffa422724ead089429bc4c6ce14ebf4c0c2d1c26e0219dd2cd5bf1a3af8471520d9d1dcb05ece2265cca9cef28313653e68bda595b2bd01fba15d0bc37e65e0f0053dd2c1045a564cc646648b3ef0cb578b0aa5f0be5e8ea439887882d1d652ba53a016c8ff0eca0c67087d642c3d483043e19fac4397c3f6d19a882280c5c1cb1b610188f3b72e6724ddd2a4ec46d249916388911593778edb8818cad1047173650ab14bec9b1b2f8749cb0b5b2b6c8642c0b550154122f9ae4c4a9a3bec7dfef9b276857ee21c4a6550d5a4594f25baa22656fd9f4d1ef87a68da401c374004f85e15e6d91aba9b4c298eb5b7995e4431836499a4b8bbb5acb10b589943107aa352500742dadfe29b8ff23dfce16630b370329d4eea42ab7d45ffbfd445ab17265d2f6b17a27cc9b4b61f4fb020fed4095d3e2a6e67468f06c32177c66764f483f2a0041671a0eb45e78c2d0029661afa7b98256f398418a19f8142efc6135a607c8b99ebf3289699379446b2997777b6d9dfebb643732680944150a5de10f5c47ddc773ad95e547bea0b1c99f4d1b140a2f6e0812e711a0785ac1ccbb9d54f65f0c01671b43fc8341ddf6c4de36923affe80ce26d6496346aedb6ea297db9485ac632c3e9d2f3fe1b5ae988a15dba17721d32abb8137908e07d2d12accb273803067bd1e51221a375d6c332666adaec1721ecc0618f64f43735568f979289c0d02aae54b6f48d4c4589ea71f9379ed7d08130684adecb2f37017ca1df4f964f76638b1dff28a183120464bb2742e15787e7c3325b39dfeac5e60122b7aaedf6d4f5480e6f09773b12dbcfd1f292381d3e2b265d5cd24d3c2c09cc34dcf02dfdb239d7d256a9da066d401f4eef7f56b01a6c151d2180fc69b4bb11b4c86c2a072b956260ade75c298d54ac6df2a02d3e0a900db1abfaadd777a8cb85563805d932f3f4a71fba8263ef6ccbe9459179214caa60f921fefd921b75ca4b41b7d4bbca3871450cafe41b97dfff196fe94105dc5bb29b1a66a2b947dd67d17c39f5963e892eb5637d4c8e0ffcba7d19492e5cd9afbe9635b655b7bd32479ebec249cbee1ac0e5414e7b0966ab9c56b64fdad5dfd84f9cdb1124c9caee9414c027f2736494a9d533451d0ce9254b274055c6bc48804935417c031411ad248bd62b5073f3acc6bae39e9ccabc8a275dad3accbfe6077eee346d3e4c0ffd9d8b2e3d3c9f9589ce343924f6cc1e61d1c145b0e9dfc546ac07cb504224e3f61224a8bb6fb11738cf791ede200022153cb52efd8977373fcce3cb68284bc4da8e4c0c4616ca063d2c8c25b255e9aad556afc9519bdcb7c3bead5c1135158b583f28aae555c42764de6ad8dbe947d75cc1101a615e5255547a1b93b1646f27e67f9804f3b051f4ef03161f26647a8c10c113434f5fabdf047087b4b034a26a671cfc97c94b563d50c5471df5366a9b27a7daf0e9da9e5839d305360f498e998105a69f3d71a788b3430d7f9202f907be5bf7ef90ac7a06f484bfca3a7b6524f813fd704e681f5ebaaa08f1560899ec5e9ee9e684c74d0d77cbddf1e81fa9b86910b1fb386144057cdec7d4e977c79b2f34950de63a54bad30824bfe0d7ac2da8ee7d8c3c2872f109935546dfde26d1775593cf73cd8d93a2721214ec8cd3ded78fd7037c86b4c2b3b5340e321a290a89cfaebbce438b191083f37954bca0e9ab996dfea5bf9ea9e19259fe8c7c8135acaece75e0d5ffd9236fd27ed465da0799b677aa35353fb0d23993b3b6d0b660bbe008f950de7c6bbbacdcf7c304ae73661f85fd972ec6addde8314804a5f44f29fb3ce415291392da58ed21b2d16cd916ea2896ecaafd1d235d4b3649c5c2cac8e3d7a82fc9e980eaf5d3f2a81a79e232af92ed88120272b28f5fc3e1a7600c29bb7d7936e45cc7ac3c8731af563ded1bd59e741e6cba68b77961442742c7784ac5c931e54b83f9ef7658da67fc684e0b6d7a893ea2eb15fdbf3aef99e0b18d2e080d7d4da8d5e142c4bdf36d04f3ea4b598022b7dd4564beb9e05e45bb9e2b6e596ed0cd2cc10cd7a149bdd2f7e7b570d8e3dc7c349aa1be913665bd8ba064e7c96e6d03283c9d99b0cb4250dbaf65c0180973d818a785392872242ca6f848617fcd706157161121a640ae0a4d703a9e4d8af41fe59671cf126b6c2ccef20123d88df83ff992cce1c9cdf0551949e42d194a1d217a20855ac0f6b90c36fdae24e2963a1a478695aaf8c003e045fc60aa04e2add60c37048fa7713649b4b9f0eed4224acac20a51ced44fe5471711114d4dca1c7706876628297a41e9e67e8d0d84333545cdc24a32396d07d98bba08e20cf940e9c78f362b5c3cae13d98cdce08c59d0e4ee1af1be9e4352a85aca1ba82fc15fcd85e07922b2215038dfda2a2d4708aca575c32b3044e9295aa50d1c010847d2f83ae9a80c7ae7f493795c8b38562537faef5bdf1e0e8e06c3d76fa1981e6e68336f56a163d229958378de70e1bc9bf6ef22c836beaccae7a05044828cc4a37a9296f232befb54089da4e50de15ad8bb02b9bd3194001f96e680d28818dc1d52549dff038b02b4337880c5e4810c15103f0d28e67c762a4ec0decf01d01b07cda357b82f058240c8ff16c9593530d58315f15e3fc229e4801438c2a67df2f5d825974a93ee99cbd41d4c39936c9f3e73496832e2eb5f7cfe97bba0a93b009b0414a03cb322ea9ad4fc1a13f98abc2507d79fee1caf167dc78c4c34f52b54cb264d8882c3d4ec41f946590637e6d10d3fa2960196403a6ba88ae95371357182dd9611ef3153999a2ae5f0c0e7eab17d821073d9cabd04aa68ec36714da6c58957889514c7c83a906fabdc7b8887e745552a5b0a4624076a878ad7fd74d7306d30e7c52553716d0acc1ecf8e61c29b56e12b979ff65d8b3c6977a386ccf3b4de08880705a7b32756d75677d7c616904c68a34c778fd8f51ac85450763d874621713036c3f97fc882ffffd272c370c4bac78c478505fc323bb2c4b96e25d81fc7bdb6f19dfc22fce2dcf1b565aecd81b03fb36114b69f85c44b927b927bb46b3b0fd455275390283ded6be8da5c047d28d82dd8e8f2d942121c94fd6253905b56ecf911fcb3f8af8c103a335aa3169c05decbaf15eefbd100858ce5cb53e7a2e9e78f9e762dd9c6b6a52a1f88e33f50fdfe69ec75e21cb04b9798dcb32924dce5e5ec33afed846503b1bb49499ab1f950a4aa85cc07c488fd835986f9d92b04c09bde682b99dfb3f4161fcc3ce792b6791f33e26d55efbe577f7815b89971ba305f9cafcea457eda290ca893f3a8519ec71b45dccede79d5118fd6beb5d37b6221b478798a8c3f2812e6fec7d4d8b7079b1986544a3e73b8808ec2397002ceba22749e94439e2869802d1af01a641dce5d812e048f58fd997ba760e13c114b20c3522251b5dd7fd666bb849de050615aace1f0740af7976ee3b7ec837c9b281965f3d8aa190c565014ca39125e8ede9642c3c7e11bbd9533cd7d60f40fc0af8eb3faa8885a55e75a483f26e3185099b2247983c67011293a00defd711e9517e025fee5957e8e8d7186df7838042d085484fd732b9db4a6e06382e90a5a4e6b44eda85ce3cd20fb12d62bbac76c94aad8d3aa554b7fd24a75d132b6d7fae61814fa622d0c9c1b31e9ed7ca2fbcb43c4b76937b9617b326124a8bcbb7e537d772c5278054afb3f43fcc906dceadc2e866958c373d1c0a5d59f03a428081c8e8cc080a3e33ef16cb2a2f0cd576a107430bf93df69a896ae0af8d9329aa0ddfc5e0113d75a602211e9e2ec95b7b53630b6c92869af3bbc54e3ff9b617e12be3536e54fe0289a76da7d2bcce8b747d30e4e0a149d1b9ab42b356c9998d75da5b16cd2771eb64bb174d8d00824545bad11ae71860aa57ca39c89fef981da393960cff7b969bdd1e6e778195862def0af17a2089be52b81dadcdfb383e7d8f527ee33297bb4c883ed15093a44cb2de8b1b5fa829933e60a6136f8454e830d96dc2b68f51869daea9159f62ac5aa9a9056cc040e2b4f3aac55e4fd02d83e2db3f2e9029210f4a069ab38edba0edca1df9098eee3db3e0b1496df8da9e94e852438f7546bc8aacbfc9031a337fb1cf6a2c3a104b06c9c8fb1b91796c69b60beae1debde3818365e24aa1024f78c865da6a96116ab8228b12df30c4dbf35bd5b666aceb1ea739917054b7b2cd93dc8fa1800ff4af9dee1a764ce99acd7a6c002800d52de2b8a4e179900fa47bcab4c39f0d78c578a021eaa514b43c7b97453a2fecbef6ae6720103bfdd466ba3e26cb824e8fba1b8bd4dc4a707e65dc17cdfbc0fd34e110205941136ea0d40ec803adad5e109c9a53c93dbd88c340ea3ecbee28028e821dc2cb4a9bd557948a9141d618e5537ad2d00be2139a74655ac25b39fb12cecadaaa96c50d0fb07ed407dc61333db3ddf2378280859d3c1d243cd776b796f033502b491f0bee72d1cc5fc3c3479f4f35b69985ebd317157abeaa72aef25f84b2da9d1c10a997baa6f5cf6abc0e0025441a6ee873919b0d1a1f51a216c7d09e51918fa7c29533adfbf27650672bad4fe33be711a1e4609c0a0dd7e796cf32c538a32a414902470e09c9e9cae2ad676565cf6c7259c7c7b4a1ba5a0359ca9b71572fca2defff06666707954d0eac12c202dbfeabcdaf1f1109007f6d0e5f2f0bf7add04b31c68107de5fdf0a77eb408b1f6c9cc30895f2d1691bc666f77d74eb7db372381c0eec0029ea48ce7d88106b9c4596d36802debd50f2722712469b1a3564a94b80da80ea3b85768422a17f7eab4a654e8235cff3d9179ead185ee44f3727e22c15782729e59b293d567845d16cb5d5032c8411768d889afc19dc075a9a0e235ea76fde6e511f5acdddac1c0a62e40cef7dcfa9ddee37631b3ae8f1a6a6d4a5c5ef0fd0047ee96cade377b372c6a0f518d8fbba6ed59ddb058d7a61644f818888e5316162a5d4919fcd4327874806695c22e6e237531a19e8e59e1e016a85bb20de8a91b449ebb20e6622f610e4bc80942444fbef54f2d092fef47a485a15546477acb7f6dabd60bfd515489827c2fbe60f9a3238aee622bb1267486505c4e0b5c9774acadb3d5ff14dd6c8f97dfb77f81ed67316098df1fbf496cf9e55f20a255b085dc3f77cd0cee0485c99c207a11db428f63b1e4a8bdb04731a43a9eb71500d15f74d530378529c69911d1ce38e86b9526c51b4b1c65757e6a9ee3c3a33a0f8df15f24ab3e75db8fd0588a526fb37edf0116a6dff33f62f38e03df0ea8f6096f075e65468c22e4a4e84dbfc41478ac6c419e959d75ff76a3d2c0794240ed59fc7ce16b7f4f43cc94b5231be21e590da4af24fd609aaee7691c54723a79663603c198727635acdb9c520927d07425e4774adfd9e308bafbcd0a1605da8e10c8e391cb116970db07f1e10388c95fd6beaaa8f4533086f49f200df24c0eb623d2f866ed5270705952bd9dd45ce830e0713656b2b2c4c5a083953f94082bf78d85d94f89217591b8108b80cef3eb41041b76873d201591b16d3f08ce03fa0b8ed03f4713c23d258efdcc2e4de7a3a0f8d63590bea0bc0f5d433313aa2f416d56d574b41ed6571e66ffca5f01a49e266e4b1abf337c404c4effe146e67c63da036b61f5037ddb9b0c96b1dd16c3cbf9331fd29ece97acfe5aac91cc6c43edbe854cb5fe682cab42560719a5f924b940f5326c3e65ae602f653bc0336f0d2c39a7f19e4b64dc4fcc461b8b99262b452a3571d723f638dec5248770c8633026ddd378001ea371413cf58cfcee80274cb2ba77998dbfdaf428156f047c3921348f5aa3937d38c37e13fd36bba25a37b8f1f08fd1cabc0df66ccc43742ca260f0c62a7521dc2a498e77292223684320c28a0a5b4600a883d17dd0ad579cfe6bae80488f182f346faa0d3a9bb0701bc5121a2a00930f7d1e14dcf5b290c01af66692a3a40b801cae377fcf575ec4654847a23e5414c3498c5fd2ccb7f7b1712ff33c8635fd92334e13ac64d8cf5ded4b48f34c7e0ef3c5e2fcfd364050d7da20b6e3106a48de0c5d83b5b60c9e9358c5675f777704a51bbdf583806b0dc573509d48e747d3a5ad4e4bc5b23b08b5a00580aeed4813e9e6e51d13c96beae47ecf7b321a6ab53d488d4727969f154f9dc098ce9d28a2f80702d01e1c2afe404d16208731cfb6da5d9e3a5cd51c7f9326d78f348592e2e0bcd524414763d501bff572477d5bfc18142d952faef5b6ee4a911ec9d11fde0e0b8bf045b8b50929be56597c08643b7979a01bd3e3cd849cd33361c8284379749b082d1a9553a3c15a92209f8a3519dcecc81db5d7a7313b44b9ed1d153a4d99c14cb37e2f1df069e672e96995c825ef7b4edd8ebec00738524f907da02a4153177eeb236591233a144a410cef7f85601a6fecb8547893b8af77c26d81d5c5a4ed6531f27a580d53c9d31b507783afa3506826694ab5e772cb878be216cab00cf6149c5e87be539250981b94249fc4e0ebd87e64ee210420a3153f5364cacee52f50fe25a98972253c39c3c190714307d8bb9d4ad96f519455da976f7944d34e41d7d94af14b856148604bbbe30b2d06685507162c7bbf53ea759e52556951a63a8d5fc861edd05a32f08fafe14ba4754adbbaaec4a85c9a1f59bf93376fe7c40612ae69ee47bc5105a38bee1e7ffdb46c1bf1d0366f4817836b78b56969676838056336342273e7611d7b2f78f18852f1c968601bd70f5e9ad0721d327f817d6bb046d8bde80de57770971403ffbebe02fbd40cea0426d37faa197cd38934b345da38db37223ba623c993612d80895c5a124e0007c365f5c58f5767e8c5ba54372982a75d5b2b4da511110291dfba0bd4ecb13ef64e06a2b91783aae598d4fcd6982c082b2ccecd4d99b5779f2d3759e21b675bbadd196022258303bbb2fb295bfad4e9f67f324fac6a1b1eb1c1642841d71e4e6f30f2baf0f4846c5e4104ebec9d500c847ea45eed0f5122cc351eb06e9016797bd627bb577a636cf36149f9a497f03b7c7f67a116c428a6690f65d2e021809d877cc940932a902060be63f7c0c581e4b6ca0aed133ae78c81f8333700917dd13cf40947eda819f7fc7f870260c1675d7afe48099d1c5587e1a7248a677ad0b1f782b91de5ed34ce8f1859cf1b73a6e70e0a78e6cfe4f3fdf2eca1274f14aebd67d580775443e0b4f9ec67e2917cfeb2ababa4da18ea0ae36238dc7dee21540c3280c34e509d6a586a17fa7d3bea3bdb3e4c286f48d9e4169ea1593d87594ccddcbd30bee365d9b1a437e35abd535c78c81a94a6f79c2337a9efa20c2d834d9ab30fcaa58cc236830c49b1e41f8badc0136df626a752cebff5b37c58cab7ddcc031c437966aed117d1ee3ea62f1143b5cd56b2f09f35f06f96f317a58ed05d7ec80abab88a14c51a008361363108a88128412fae9d729c82009ac7c06b5955c7d1ea55e73a46edc070b2418988197f656ff5c708125e2ee6ce6f7b4151b91e72658e057798f42c41f96b1c7f5b40fd8e381b3c23575f46a7035a1f4c8068275971321043bf5f0a2e6e3f75611c4391017d28dd33668df8049241d566186c6cfa1d0190e2cf552e78a293089a5003eabf1d71ba9f96614eaab4e728ef622a1811fca78b45289058c1fd0954b1aedc19060059bd840bc6b8db1b17e9359e6d19a52d86d52ccafc0ecbc5430111f8e5bc1270b10916609efcf82128833c36a9908962a7525d0a3bf58bc25aa8672141fb0d60d45e00d2944f9e81c35c34088eb220211968862d3dcbfcf702022e81a44c8e5694c4656a9e33993fa76c0db918d71661455aeeed46211de59e94a2c7041d7b6d4f1e2945efc76b3f722e1f785974b080078b3c25f15b7b856b6f2e4afd53569157e3abac3e443ca2a9b92bc3fa4f24f0f76021452aa294c6e7d95ecfc0fe9950c4efb054c767c964b3a4febe6714f020b88f87239a3588ea29f842400c0f51ec1ac09623fc3235608647fc3299890c6cc8abfb9d3c15fe90189de2fe6860d1e99e683cccc1b4f5f8d2d666997245351b805c8a62958fb1f5c7323b76312faef6cf3a705cb56493b55893c64255e70ae60296f9f13e54ed459ba3c67c2f8a9c288086a78052adf3aa339492e9c4bdfc937561ea5066ed787d777b132c7131f7387ce5584d0e3d5de7c10b3d3b1fef2d0429a814690026328ba4bf8fc009a0660a376c34720a61685c11353a43cd564be16b11dbd968bb9af3331ca1b80f501f2ac15fdd0586241766b88c34267f0dd3e05841c27077512f614a3825e152d27809830e3bfb7cbb762a4489a936c8b69889c6d6b2b809a22bcbd40cc03b30e23aaf581985809f9837ea34d24d382843fb9940ea62c54575a6dfe1a84e097c869606523f5cf883399de5c69f4b8e73e1282c3563fafb91b49023a54833d7dd15cd34d3864472b8163a23db7cc4083a6dda1ca6c2a47e9e2718d2d319fdb18004dfde2b42ed27f62767602f14063ae651198065657f62e34a473ac9197fb39081be89bd5b8edacd5c74e771c29674e5388d866ccc360dcf2dca3fda9f93baca844da0328b63894e4de2f0bd29f87f99bb07c1340d47d3c9e74db882a4bfe9b661a52fe9b6f6622dcff69d8cf9c77f2aa32eb60d4268d147a6a9111f89409d50fa30098894eb8bd20ab22863d8ae2cba336cde77af7e4a6ada0dcfe9394b75e6010253f0928e49018ee3b6e1266e753f77b1c29e7e0a859659061b37d8129287d51e414cd58b34b17711f64ef0e72235aae575811aab32981ea961899e624e0214b97161fe10059a9238782e70a81832ec2413ceab6d8d0b1e96a04f3c8279193b7bf6ccf6707743fd957bf7b73a0248616d88c4c6cf14500bab3c34cad4419b202432ebcd897423497a4a196be626ecf1c450f55064461034cbe0e4b2ca7e8e40e003a00b7b7ed8ef4e7f15112be4f57be625cd4c2efb8fd9b6abb44829eead180b4bf5a2ccdce9660aba0633f9369a55e89e0d57dd96512294a50ebebd0eb246829f090d980bda387d3bdb9e68f942d96c417bf4462f4662ae088a5b1f1eeb9b1d91a80b1a328876d11a125321367ffc9027e9c95f0210ce8116d92690ecbed3a651547b1bfb6f4376ea59a7028e59fb499948f0ec6aea56167b8d2d7d27db25ba8a5a8ee91e5b5dad2085778fbb6bea43bbc5cb1e34ed25bad686fc9e566f2675c0df29d08a477353677d687b1f2e5003e4500c32f3c1ec88f83af10c8feef32305596ac4ad43579ac0d939cfbaf70c852e10581a3e516abaf9bce49e901a023d0898c85c5238ca85d78c25eac3947c8d7fe05a3153b711d7d42d2ae690810866e87ab9944dfa65c2d36fe39aed771e4c193d0880bd265956dbd845247165b97ba219c3abbddd0acb63eabc2c27a8a7607163e1a787bc59c6c354086f650134c5db6f34c8754b6897888f8afe80c1596cc66ca7456d59d45182a5e676f8b31dc16bb3b3a8ab3159e421566798203b35cbee8bd5bec77fcfd6fd82fb8a58e1e11ce99faec87baf8d03ad71412b57b9263849f10f11d37e531b94cdeaffd548aff64ce85dfcfc523d446dc9aef9507cf492b38d564d7080178ff14e03da3d7b39debf3f2c268f56ef383371084014e101efea42a5c21190ceea8731bb00875775e1ac95f7a4299aede081696316486994eb0c987c781f7ec4f8b132d5346885e3b4827c38e66e2d61e68994caa75d893c3400fa20cab41f2ceeabc0a9f4ccbfe21cf2887747f2afb1add8f44e31a576d535ae07d2ba266a93a8b6435aeed9601d4fd61d551367d521bc1249b51d7c5bf1ab72f12737d30aa8ce7a70460b9550a9cafd29474eab8d0c6719fb6f4140882c39168ed1c75689de292377b19d08370dc9211027fa929ced728072687e0d207211dc4af209414289337b402d231d73b1f788141d42c16863f2eeda9f6d15a1903f6e0fdd328607c7e22c5bb403a9ba2e3c3d9fd480a89aaf86bb09791f4f02c0094f158acf10117a28855f94b58108ba32757e3e183bf8408e9add6d86754365bf16df83690dd5950542f71bfdefe244c13ad92a9cc7c3cf5ceaf1b1cd28919432eedec01b71cc1ac415179a02b790bb0222fc6fa79af6d433de8e3f976fd72bfa632cc65f55c93fbd506d5a465bff67ec72ce8c323383fde67fa930311885740862599c13724811adf99996ea307a1323338d63011a3a18c9bb85299592acb0226f8f8e9ac2c639da786e3aae839befb1791940ca774bf30957385119c3c3af4197f91769bf0b562722693eadbd5aad34dec2f565c75431aa8462504a1c36075b9043dca9e974712e1d65ea304e7790a908c94f6b3d21753475f78da00365493da9350927ed69e654f5ad6fe6560d4e6f5f99be6dc93a08422e1d331071b162c4451eb46a0ba9e72dd63c4eec0d486c4835cef518850d9af6c291b44826f43cb974828db280c874f5c0526bd5efd181b893c6de386741e44e47ab51c0c56b2d8e70a42194cde95f7ee6096f51069ac693e3e5f33e0ebef6b1610c1a345f25dfc11d3a5a755c5ef1b80f51d1b86719d0bfb549fe2df8ad74c10ca964a33f062a880a031826e6a1c8e3d353f307250385335bc099385bb2bdb92e61c4c56f59398befd2640a00fb25c05d672416ab20d1bd7ac7c4c5132623bcff1c47331c4d77e6434650b240c6c9e60b13454a4520ffbf82d802a2da40fc7b1ce2716e4dbcf7a9b8a83bc01fc00d7cb536f2dad53e1ad4ebbfc0943671a28571bc99b89eda3e407e558bb8b806a6d7190880225226831c363bf1389daf44a6131cc8989d40d8862842ba1958682f277e9c7d6a6bcfe25cee7581716c392c0973e974333c6e4f691038f078ed34d224d3e026385a653dc229ad3333d18b9f7b0a9110f47e3129ca2823eabf290beb49330074688e2e75b4025abe8a0152ca4c7eadb71767339209962de14c43e1214718745067246d1a8315159fb9241d4ee2a930d2e75fb132ba242860c52f6750a4514a664617a88618beacec6b18755bf20503c8c72624fb1429fac35ab3a7e1b2b25bfed77c61eefbef20ad015f742262e1cfdbc9c9828b698a2a9b83b80cdb9e2a3cc3400158d94db91c95e6868fedc7f0ece05e8023fe607b7e429b8962ac33f47b7d1f3ca583ad4c140d874962200f423372194937bdb99d3277a849a1cd9288caf3092b7cfe4c2d6d631b050e90b9ed34d81ddce4d228e7d471d5d9ce3f6fab0dd1de5dd785acdc69cfd9276debf61986a7e215164218dfe59d3f4c16ec2a734e6d1accda9ced2a71ff2fbae7f2ea85d89850f9cdbdb9d900e050fcccb5fc2d6088f42005be7b36df3a496ade8dfc19227159f15d13263c3a0fecd390b3563b9fd5fd0368de4d25681addc01fe931f3a45c33a0244ee3b1b589fcd9e80c9205d52985e09513613ce3573119903f87aec9ae80c6e7674a21b2d2309910b7570639533b13560483d2a1e3ed558bc91cb33c80e39e19171bc61cbe8be15aef4d0dde6d886577155da9ac9f5c5087338293555e4b35dc999d2beefd75aa8d21da07c38a3dcd5407bfc094936b974c2699eb206a624c5f5fe0333d52530c2ed015d5b29ceedb232d021da9d449a08e12ef9791003abf016a42baf3c0f4f3c15b46d0a51a80846f2526c6d6db39fd6334a6b57f89b71e66a4c8c940a44a1e909d73be880102acc758d1b2a4de8d09e0b9547166570bd1ff33102c87992e5159aba57373a415df434182cf750eb5ee3b0876ec3b61fc57343744f665a8a00c02bd6b4d2c2c03196385a12630cfd4aae7059462729a338f3320613606da1b30e57f28bb697d93d2974da9ed69ad1b4dda7cae5b0435a01302b57fb0cb25367fc508b10748993c1a26e9d6eb3c559fc6bb43d55160faa80402587b4bcc979941f1efde5bfd6c245dbcebba7fcfcbccbbc0cf0db2087756c29c3c4ebaf51388859cc44b2fbc7a5d6680932833f1112d1a2a7eb2e0113e8a2200d362b2b484502f5d0638b9cbf8651556d35d1d3d15fc46cb4e3f1a4889d6902a1412e9bbbd60b4c5449f4b273ce5a9e3c09a5cdec319c4f9d9e5597208511ed7d0851b2ad0ae3a218453c6a0aa5252186dff26a5cf79178a598eeeebc6ee46f0e2aaea57ca0c2eea3910953f5261d0d6c1de68682379b7ca8fed3563f9ece5919d5d8b43a085c4fd98e003b248e4512ccc8291fd6376e176b1e159dccadedf02c6ef7d73291347198b8ae387c0abae6e7f9f4ac41274624a9479524a4ddf9d321692f8b7542c3fe1056d705e18bb850a644c53c413a8277faae9f6ad7ab592083d4192cf8422b57eea7c24eb97fd9d07b752dd96af00f6ae3f3aaac70946ee61bb4620dfe6df406cafadc5bc0c14c5b6e59c47b361cf7e51ec409fd3afebd6baf80b395aa5e84bd1d8c9d53dbe07d2171e4f8b622270d271ada6f2bb57306c5c624e213eb167ce49d5c1cb3afcb977259d8849bad961386263d5bf0b73a416cc917ebf3afd1fae7d5da0ac2dfba3c83b7e3a03d67c00119c60285e989945619e39a94a0a7174fa754e341be53c9b1015a09ca9b9f6d81a8d2b693246480465878d43eae2d51427dbd44c82cef95a41c367c7a44313c21405b508a19c274573359b076828181ec8ff6628d08ba6587f4905bb88be90b5f7a58a4bab570e18c762909d3060d944361d82da0a2635238700899fa1e4e547329b1cb27d3b6ba2fbf8cec4751b0be7e7dad10f90dc5acccaacee955c2866eb6def6072649a508721840192d41f5c27f7583971085bb3683c21435457befdc4315359d13ec9a4bd857329fd9b12c7c163b1eab84cd067964e0d5a759d85682e4b8da529256faf37fc11f685f29e92bd9b3ee440202354630ed3fe4f215d579c8ac7f2c4e3389bfd5f164c9287a76e635478cfc1bc0b328569ff081563fdcbdf9d9e8ca605bd177c289900a945a0724258bb0448b5bfba7a96c34b295c9807e6f74bdbb3f1e567d8bcc3fa03763ea81d08b6631f281cf75c5e38b09292a9469ef0252d9fc44e5735a8da0d0a578ff1739d8bfef0dd15976834676ace05a2ac60985d854d4083da09de1e0828c92144dded8a30ce587f4452d171d0bbaa39fbb4b14b67840f0388303f79158041c4a0b138ea7b7ddf3ed3f6be707df6df0d73d3c475ad243d60fa20470aebe4bcc928fc0bd529ef2fabfd05b2e3c224a6e43a285ed92033fd36c6297ae3e2d6772fb9bfe6bcf335