Security Research
CVE-2025-32395 Vite Dev Server Path Traversal: # Character Bypass of server.fs.deny
Thinking
2025-04-15
6 min read
Research Dossier
#Vulnerability Analysis#Code Audit#Web Security
Vite Dev Server’s server.fs.deny middleware uses regex matching on the URL to refuse access to files outside the project directory — but the # character per RFC 9112/9113 should only be used as a URL fragment, while Node.js by default allows # in the path. Attackers use this difference to craft /src/safe.txt#/../../../unsafe.txt, so fs.deny sees /src/safe.txt (in whitelist) but the filesystem actually accesses unsafe.txt (outside whitelist).
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a4d4b6d4ade7253d06d61bf923572a6b8c253d117e8b63642be9ad8c68eaee7d4a02592bcdbd3155abcc6a953135deec61ed6729ad92ae056a76758bfc9dbe3a6985cd8f376b1e15ff311ad5bb4a1f33c5221594c0244287aee465f6d3a288456332b33bf78ec9769400585158a554df16069f45fa2b4f859604bc693e55fc7ca285f4dd1678d490b9a5a172f3883064126a5b0735ef4ebe542daf0185b6d9a30adc5a23a27ba5495e3c7209356f981f3b19d37b47026ed83d4a81e6c92d23a9bcef0f04902c9fa3d077ba6b82d0cee7aee25e308ff65748d6f668be00790ad03534f0865ed84749fc610f75474230427dbdbf89def463ba888d0c2fdeceb81a2a4e9940bb826c827b499fd212b0a7a5408966e95631458bf96c9b0a6eedc5b0663c89c32cf49744b12ef431ce63f2f24b29cb3aeb68d4beb6ccb1eabce58bba9de248561840d3c8e54247a1e3d844ddec272136b1c63fb875ffc5eb7b513939b7a436178dc2d251d92101a6f882460d0173d48c6bd4bcea7361b6f94cc63e594da9d5933e5d15f8f3b39e6b4b6b306229cf9ea3115eee70dfeff949795e372d30aac5b5aa5e9b6be7097ec2d25f06902d63950a326a9dfb4758e9ccef66114d03a6a8c9d5ac91ab088b728c4330519d5fabec696823ade992a4a3da4b6035826602808dbd2cd00dd9e6198b02d8bdc553989d13276308c1d5e8cd964f5d69931ffe3dd6b645cb9305811dbc038bc9fd44827a2563abfcb6fc39bfa3bf694e7de46a08cc5c473bb74445196493d650b77f2d336a485c383c6714ab9cd465dfe90935ba532bfc7cd5bdff91049c9e79967bd529eff5e7db6bf5f7eae97eb59d130f3319a33d4a5d2e8c5a6d23d79b04b79b0fb30e5bef33e0e4962a2f7e0e70cf2d7a5a5631e984e4f75c63bcbc94a46a313847168ca577131ae5442fcfd7657219af2ee3a3e29955820ddd9abeeafc0ce874ed5560af3d4fc26b94498ad6dcc016036b1964e940b88ac22f888c9900e4d3575a1373c85e4f2439ff978a0341250065c951496f12596751b594ff8a08760e18cd7767d2c09346c39563768c96970fd9bea16c41e11758af722e2cc93d04ca368bc0a5a78fe54111d9e195312efafe5275d9948f5a3e21d240146192b0b5f6677c35af378575d4a3f1b17189ab25255d85241c4cd0f45e0bf19bcd5e7a39e8d825302a71a3a51acb8673b45c5d67674d964cd9e64b4fd4a6cd88150adba35460043652a7c2937277f2d0a433754740a3c658497b043a3b277f191d1978411f887b809f6523d2e5c53ec27cac4029820268d30c8da7dfb9af32605f87f6a406808d7e5c0bdc30106eeb569f272127060e0e32d8fb125fda33e96c3720120f8df1fc141f1ad846875a4b8265ee3cc1cc9bc6a03d25529a73caa0907f0f5374f7badf147315eb3a2cb201df02983144b0043a0c2bbb96167bba9c29f2dfabf7ceb09109e5315eff148cd5b12b56fcfb1629482d637adcdb9f7674840412f7ef6544b1f9a210a473fc266db89f4965d566797cc0664537e6043e9197386fc0616b0c641de58372069f22d5592cb48c7c10fbb05bb40be389f78615f0c5f0761c5b6d51879d3bf3f682320634700c509d53818f5667892f7553b0b3af2fce95e22390ad36eafc48b66cebeb57c206b74b3ec28b915ccce597580ecfca66f5f7aab38252ab1e7c93ec2de03bfecfd6d8207c861a1cafa77202d71eac3194ca14f306f729844a5f12889f467f4361426968a22328e011fc74843987aa7f2075d797ddf11c77123c34b5455421b1ce7edeba5b4babd5e7a9a2c5d293d4c505d7d3f4600fe7fd6b81ed3f1437c828c1dc1d14e8189d4f68e348b2be7bc92615560a98b4d041ae6019541b61166fc0b206347dbb067e586a64eaefa257342c263cc64d8d6241a317a5b745520415e26d8ed3de5688c6377c8fda9ad96e42ef5b9187dfdcf6af410fd13e8c857251ad9a9d65bb1a5777ed1b704fcd46e57e8b0f3367dd7323b19e93fd54d8d20c0412e1ee92a6a598738374d36e51999d446ac81c69bd64cda38f303d5f78e216620c52747cc7e3ca304154794624477885da10513f57c0cdd8208e621e0577ca4f33fd93102da43b397f0191410e465b93f1e4bc260c55c5140e83a93b7d10485a1ea2750272c00c9a4eddf109f2771745c5cc54d3757ba2c08fc5ac1aa8a496f411f90e60e64b222599122439b45e4dcf90bfe6116fdda68eb6a1a1da58c23ac696ccfb93219c7ce0c3a5fa1eaa306c67810b3b83934d5b707168d60fa6361eece32d64a58d8cb3041d0c438d028cdd79673b0f3a73c68d653ee6e52eb1f5379a7f2c557b59bc04acbc74ae5f962eaeb1ee60f97794f1704c606400d79c62268fa2f06dc997a21622fcb1d0f62a0b36a143f68097c116b9acb70a9434cdc7bdfc2e0138bfdc030c4f3b0a93eb80fb8a66da9773d435958bd004d038b67703099460f5c2320271bb86d366f045557e3c359374ab272244892f51150ab65897666503f5d7f903f11d4273ec4c390b33e2f6186696292dd7220a6ad5b0c1a1943f4b960e994fe37489958e10fd58c8611c289e53afa18aef60d6fc0366d7c52a8bf5b1e73ed48cd7c75d4e01ee17911a7ad567590c342d27fcd4e8d36cf5b97b76dee779d7865552ff857ac24c5aa6b3b84457cadf99f6bce71a822a2f0b6b087ef1c932b741847ea60044b22087a72899ded2c1ea0825a8da082093ed5a736a2f892032376ab5f10e2b69eba784b6973701c91695910ae750b513fe4c5a221616b04031adff1e90fa1b5aef808545e3edd54dfbe216076b77b24851ab13c30ea8cf162b17c7b0bdb1f48a08109c3c2502c92428ff411f1b76e1a0263349dd144ae336ef860cf111db23960cc7c251d9672cd978586ca25cbfe8f65595c51300882a01bfa7a12088178255823bfb5e279a4245d4e544febbf4123b718d3d7c9f200980c020dca46c94a579696baaacd8737513b143fce17c3492994f5f7145165df7ab87ab50521442dd5e2ee921804192427baed9aa963760f6e966d20e344750680116770e0afbfe9141faee12d48f259f3dbd42bd08f6da7febb082c12274310e48ec47675cdea0c00a3ec59439cd729386df08f42cc4604685a77e4acecec33a629a189960275b833957747020f2f0d92f2c9dc3eb075b9312bb0e6d0737e3de37891aaf8af895461dd8940f666f7703a680e918799dbd3a4a9b0e6d5f4fa4c8dfbb5508350ced797800901f65c9b4f22346c5e155f202b3794a201fbe35a37a06325c85bb2b21cc6b666820944b5090c09146833bf468e3f0a43c32ca185607f8c9064bf7c69e9368681406c65beaf83933c88734d802241fa91d363e0f406004282709e5561ede9d0008acb0acdfbcd2bdf41318673d7a62b9a9ab532d0eb47cf7e3f00bd47b6b3ada7b4a0d3d75eb96bf8bc75c9900f9b6ec44aec7df71c26f11afc4591acbca8d3031fb01a8cff8c86bed5a17a91cc262e728c560669071338385bff720777a9a36c9d89108891c9f90d9222c5a6db75842f95af049778d877e887767256efeb06b3e44808bf2cb4f210351e292c70fe8e59bb3f39926f15cbed3db71639616a6811ae29280cbeb04efc511c3a0294dd6b589a58dc4c1441ac37121fc28f5b2b01d2b17b1a12741e1aa85dd7571339ad2dcb52d073378e34b0c037e7def6c9d309094eec50c2d747feaf139393927990d1e6f32188608c5bae59beac8bc7dd316abe0d715255e8ea981dfd374ecadf6bee2789e38dbb40ec578d5482cdb6ddf7f46e1f13acf6fd22c4909026111b7a8a6762594166c265f80ef365faf883b7adac4876bb7248adce8e0258b6ecc1e93a14f8ccf7e470432777a56a042d703e26a1900ec60c9998b8698a024639235cb3e3c94f98651e05908bfdda6317d5409fa24c369e07309e22e53344d6bcd7dc5dbd4079c9bcb17da408dba2f42e260fc4cddaae97cdd476b324e889b5b7139ded6be0c87dbdee085a4af50081197f8be14865cdfa1c5d317f6095f5198950b98a976c893e66b7899edd4c559fcff85e9dbcd579487944a31de12efa711d4ab25825bdf45e3c12c575c3b86b8cefd484a03d3fed2696dc87027b200020ca2588a8ace852d0b06383d0a83cc912b8387f15d1cc94834118d160e59dd43e6e53964043f5856623e3efe2e464d3a8e4df1175fd97737e8bd8ed11d4eeaa1d0a03083ca069e2e0b927df8321657ca397cbe6ce5023516de49b4f81987b61e8728234d333d2c6e006d4eeb9db208d0ceebc2c8eb5bd7c6ca0dcb8190111d2dc49dab2818c98336fe7cb22d94965007cf0adbbe39f694909c9ff7ef5d8d11789cf24fdc5ee7d3df8117a02739bbf189ab5d228aa942904abb406f7dea35b924ded9dccc1e79bedf92304e99fcfd8d642db3f4bb0cd2e9fdaeb311d0f52b1af34b5e96c20c0f5ed64d55679267c4a2a0beaee2fb1e46c95055ee43b0c69c9d5c5d3d1b446c832725a2ed6afcc16ad41ebd2ee2eabe90eb63ab82dd88ba8bf2f65fa1b6f39a9767ee72759fa6f6b4a68fcc61ee04d49d0eb4a47c672b26a4c7c06d5fcc356ebdd2c4a3d20ff35df5e6c506dd757a3aed6740c08ca6844917040bee6e42b7499efccf767ca496c8b321bdafaa586fc7a55a169d1955864cf0dd23c898b97fabd50f78363b9257736f5ea998c84e87fa14d4b4cb5e60f7da1875b36fcabeee06eca571f8d762feb3ce32d6dd9d9a3d0389665b3f5b564ee9dd8e1ffee9a494cdb4c4833760f78e04a15e234de8810dd7c63b94a210b10341f351600d7d3a8ddc963129e1e2d5377cea7022c8050f2f16359de8d9798dea4bf2074b688be657bc8c40bc3d9d40547d7c83a8f69fb34d59fa5cc3e345ab0f718d82dade3716a79a893283834e364a14071fb887aae25462532634bec47c484e8ef0f795bc79cd3f47e394eb63160d6e24eccc2781417c4106a508a8680bbe409342e8426fa339efa3afcbe46f0da18a7b9b170bc3cf6bb10a25b0e08cf26bec1335fa7895de8613c69f6c5583bb8d33e539e6a3eb46a63e336515d70ed6776095f86b891064b2e9de8c0629dc28b5ef35d923c8cd1ff07fbe098391944a0893062ed4921e8116d2ba83ef930d568f24fb4cd90955d27edefacd2a1c8e896b6a71c5da10b183750b0b4560486532371435b3cc941c2edacafd1702e070456677cec9db1cd6bc7cb0c43f22a5b039ecff8b671f522cbb0573bc8892b4e0f793a35b99eed63e4017b66cf3d6a8862b789072819f29d005da18b7e136e8403d7a9011bb37e0b28e999153c6c9a09f844149adaa61c6eac1b5e7e4bfe4868eb542d8e452db40708ef11809701d0ecd74adc723f636077262236e254a813034e69f182710086282cfcddb539d70067bf9971d09c55ac3bd9a3dfa751514a6a54f63f6efe36a601c86bd4910bc81335f0cbabe11215feefc813a2f5e4455565e037701f9b08abe952676843473029f46edb29de2f33e164cbf7933677dcbfc8abd418e501dc33246e8d514682723f1fa8538f2daeef8c6c6db61b63625fc726db061f4db9d159ba913de0333ab0b87b5bd9afe791769e78ee4c7060e78e9dc47289030714303f69d7698adcf1e8a2c82a565541efc347f4fc5d76e4dcb6cd7d2317f7a354cbb19c5d84877190188ee679b817ba2d958d1797c0118c9e72e48dd848d0d68b8bcee6b791a2e8cd36c8032d070bd53bb65cea252045e2e112e46448e69d170cff31a6f8f8df6b7ce7d8416b22e2f6d0b2d87f532ed6ef83e0087073f2d24418f06c6f099f68ff4f8f7b426a4d7685077c24b48f353397210a579efa38ad2807e643202d5840a6b3e93733c6d6bba7df20ec59a04bc03b0e662d703c10e228135722e012d4cbe1088cc01f1e0e6a7d98c752140e46265e74a9561fd7bdbf1c51990344f57a8ba96fd4043d9272af2cdde196c02d68a6da8846994cca8d13ac2a2739d0748f4cd194bbf81ca8e17be5f3a3f96b0972b9e2bdb1d0584f9a58b2942a0cec4945765775047b7cb3da1c3b03d00f863c298861efd15f4c9b4d635dc1d5f2c64718eed4a90175ba62285bd619ea27ece85a3b0cfed91f275b72095bf89e5c30bbe021f0d5832412a968886875fdc27d3f85c7d56efa8ae392f61a8de0ce81abaebc8e3c3a60cd2c251837714b9e51e3a64175dcd649b8913b23fbd525d5e8cf2541d3484e18e6cc988d4da0da73210eee1131e95e93e89ca1d371b508ec830b4cf9b42fecf430839e291eae3cd1f621dc729161525dd4759405cc52eaa83c7ea461e2acb8cb4ccb121bd7ce4c85b0dc9d953aff6ad9c17b85e33ac5f6485c626c0ab70025f81ae78731da2837c754610d309f468379926e95550ff1e6c31a9499860a90e20aeb93aaf4eb10dd46837254c54e6e7aac17e64642f809be2089e74a5d5bc043a2d338962f10584cf2edbb1b38b74c09e17fa78852ba5c39ef16f97d4c241c39d401cde833edfef2f7ec4eeaab99aae1db5881453d96e7b4707c3f9f0f2906dc9dc7b542ba00d07c3e9f90f9785029c5c2990b9d697d5a26258328fa3cd91635060b2f7aba2f7f5a9793119fc1485ecb49664f1760c2c37824e79fddd3b51cfb37ede628363e785827c34251d1df06d2ee0296a3b2fb8b6578b9b09049738a5c5a9278ccf176f44a3261f1c2e95c186b32352def725ad2c0d2ba25a170910e6401ee98fb00ff138aff918e9b20055a27cc07e598fea1d6b58a7ec3a909a570664275a12e7fb33b701075ec02e7e9e3c4cde4a72b332a680f853d8909e27d4a7b97d99e12e6ffbf78ab12bf51090f401ed525e43da2f30b6e549c3a6369fe3874a7b3bf3eac3bd3fd317968d0e1eb50df1279ddb7f3d48ce4cce7a872a257e3dd8ff223a02245bfff4ece7c138431f487897284afc46399ffed54e0b0679d264822e426bdde7dd19f2ca8a291ad8615cc05fb523685683a94fb7ed86fb814e740978a5b0a4623261a063ac68990c6917ca193f1e1c4e1693ed8fb197e3732aa07a7d934ce56ec2e7d99f6c2520fa047cb28ecf664a352e3b2f6469772e772c17dc8366842cf98f42e881420427c07e3510140a2c3f8deb8f3ee8f3623f2c121bbf79d0317668a109f8635787ee518bfc74c82602d99d2fd2048f1b1512d8da1d12ee37064bff17e834951e9e2cb146ffbfb8454468231ecd98d8bd93a7d125dc9b82b9c5cf76c7723a974fdf28240dae2ea4c556d73dcce9db03ed33b77b0f8f14b8fba817e8a7441b449a17f32d7a35982dfabd21c699212959acf288759e778fad91c75912c610b974d99414b47a8c081b9179ba8e106e0045fcddcaab44c00e50b95ed2240eccd62895278091ed0f04b5acbef89af1334046f7c4c830274bf7873e3cca41f0ef77be8a5a9f8c08cc57a0c5b2b2067acb3451afccb1f74997d60e5ef1c8d56e8e008e98f8f9d8776566b172279c8d3b734ff5bcded4d8b6119b1e9c164e3272aaa5c0977a3c4a87ff2265839715d07378846d4ee5117213ce538221158f1babdd3ae77ef4290c5d32800f6f40f28d3c8830e0d9c9f1172306fabfe7196ea2d422a6f391c3609b2c1a2ce6d8eb08010c5608db635f568c87c946d9c1ea57ad942edf7763ad29e4938cefbffad31205f654733f66a31b5e99b23f1a8bda701c383a4f9db35b7de372ed74b8a4d37ed0da36cd8335325f602722fadb6970c7f1f99b1a97d344696a347cf88861abf705ce3b8c6f9fd223ade9bb8797196e20f345508e0ed994aeaf5719ac653b4c9f143fefed7c88c8851baeee287af5086433766d8fd0de103708682b4f7a0054fb327dc7aa489aa5c647d12c1bcb7a8edac6d4b35af83c2f1cfecd948df3c43fbd69b4bff1c90140007a68f3de8e3fd08cae69b0ce2b9a9982b80b477a9214672e0be9aaa5d1e0b62f64ea994b3ce211bc17f7ffd2226f0bab7b6da412e069dc0c922d7e82a19571d7190116148c1cc9ab2d36398783ca08fdab32877d12b243b578deca14304f7fb81de322dc5bef2ce2d193c1f795d4286c2d97bba568ec90ada122124b74b7bfe143e31790ab2ecece8f93a6cbf2d5eb21e9192b6cfbd493e20f6668058964f4aaaee7d79926a959743aa85259ca10f18c7973e41a68c0a29341f7749cf5ca9c5adc41503e563fe556f8ad22e41b2abff7e313d65bb6f562fb39f3ef14ddb0a0848ff7a9cd380d4e85c6c8adb0569e21389a7e72c7f8ecf29638e62bb33694f7def956b5678fc1f8f533e0e2c226effc41a395730c661f4dc50b23a39dce35effd3e57ab9a7fed4ebf491eb335f80e367aabf8be73cb52541e3219f91ac8a10600b15df3deb8b27e9e98ad9eb08a528d0557df319b05629906b61c84863c78f0d59a54d51a4aaf56414dc5a46a1d83c4f89f2ab97c7e66fb984624f1e20eed02a982f5a2f45bcf8e0be1138f61b8f9528e64704c05c15f77bf596be6803ad6d8f450f8b86c97958c99321db2b1f6e1852bc2489d62b4fbf8143a00b55f056cde233bba204ffa292bb21d12a528a599e36de1a5bab9211787bd1982182d8940769f309b2a0061461ed3859715885c415d22492d13fa9aedeca13354d8e0213e62b5e6406dc279ac3c3d1c9ed29b6af33efc4974a98c8500963bfa7549b787b4d5201919fcadec6b40b097e8b95f72047d14b15750e42709533adff120610f6ab4a7ad67fb3c14344609f1aade6f786be6756e9c2cfb0ecc5a35b8c891a1aa23db08395ca28825ca3929194ef5be7ddaa7e0582cbfa285b5f460712722118aa88673727ce2fdbbd5e0fe229c07b982e5e6f3aa28e617b3533a1031a4a9d290049e07e7e1c2ce3a8915331d84f3022623d83bee923378a5f8cdd548c7a289bec38000fec91870718664d7e431042236632cdeac050fd7ed5fe15a92f845780e631fe3d0b2b053a90579c901c140ffc7d2e352e0246b4c964e9023fa0dbfe78c3ac10f42cb485b7cc8060d73d0adcb88ce947beeefb43aa03ce1e0ba55f5bbd4dc8d82814d2dc1be97bbdc81b92a65f7e6a713713118370da3b4460eadda9ecb52352d066a0f518dcc8a90ca549fa544d5ba1b5eb617bbb070304277075645cfe127632fa84980de497f582a17efa2f110dbab2a8f4f924aceca6958e5bd46ed02313d6f51a606312755d0927317475be06f9ef7802c12093b867966a5af06ae121bdbc7662fcb21a7dd66c4ba6f1cbe333cd514120b307efd31eaf0edead807cf7f9682f5b77f9df2742e7595d318ed060fc3c4473ab01ec1d6886d3ec61be00a8a93c470367ec1429f6da1f5b2aff94731a43a9ef24553823541e4627b902fc28513dd8037a82dd26792460a3910217a63c5d2ef92610bc19a1329f86a67d793974e8b472bc10aff234cf2fbe21562f3c3428703fab3307511592b5cd768a6ebbb19f1d61172b5702593c4c830ad2fb9d2eb625844a65ffc3cd9282d05399a89a43e40ae1a4405a6d10cd7609aaee72f53122f28787b2351ddc13a7b7aa5c69458041cdd6e25f33147d4cdfb44e7e2f8143c519bc943d2e3df9d084f338d42e3f1119dc56efa9eefabe85d29dfec83384cad4b03f803d2f900c86a4c54060dc1dc985cbb36e56f6272e2fa94c5c8f7ec4fc7120fe6a785d94f892175f6dd0cc4dcfaafb815042869953d260981fb336d2cc00cf40581de31487e837c7fc5bc962d36fba7a6ed862086b5a3f747617a0b498f3e4f7c7cd574b41eca484e2ec7854916f6d17d786740e465695a525ff0f5228b213ed80a2530b8683b9e810cc2e38553b5e1f9331f82df97dbe3d87b8b8be93c0bbdebcb05b1b04930f824597771d5f661ef01b43f3d3f72b521726730921907795849a8e0905a43dc4d8d164b89b326430a79616bd778a05093c5228a33af0c6d7bf7d32b5451f37c00689b85fbe8963d15f28f7a8a80bfdaf43f187e21346d6c78e831f7d0357d912d09d72aa4f21267b8b9b393c79ab453e3209d54057ff632b9886d287c9a701e8b43032223684320c2870a076100afd0853c84f80484d850eaca04db47207637ea5f5ed2e47f4b8d424f6449c70d2e4b0596c7a3818417d441adf8fb53cb4ab37e3b911c1cca774f53fb5f274ab3469d51c3e6b7f7f23e61b775d214fd8f7d5452b97b9ac04ef92f23ca4c6e039584b6b9fd650f0585fa2ae2b72e476ab67516c3e2b901d9c413887d197a7b05c34cb5bdd7d43b5edf7c43c551fb5f86a2e0454b88f02f4ff2e81b98a9fd5309e4eeee0543997fbbaf17833e7b173ef07d189d2c73d3cc1a0dd18fdaa6b51debb94403c6451c6ded43460c7b9a7195f38070a10b5eb25824ca24b4f55793c2baf8b1953b1c2900b125ecbe22355062cd2c527dcf77cbbb9cc40ad15e9d942fc5774e9ff06bb39a143bae5d1847046d23532def1b87ab8884d0f1286acf390d7b3cbd023410c153bec94f836b9e9f2c10ba9fc815f896e9757a10eaa014466a0492d656b33a371aa032e47bf77084d938c87245c1c0fe9f6a63291ad52ef447081a536e847424c366333e584f6bfc42d12a5642ebe1044386bfb77bc4629cc8d2abdd6928f1266d212392d94d4573cbfca74163242e59fdbf30eabdbb924d94be0cce03924e89ae5d8350bf1a8b298ceea8beb05479fb2d0928e60e3177208f80bc2f03aa77838568712e3fde98a1645a1196bbc14ed774179801c09e0418449e0f1594910fa257d6784b754badf402305276665b4a6629ce14b027a24f57344da460d3109719ac841f3ef0c3edb61ade27038df3e281ef19fd1664f1c92326f0981308fe7aef5ce81a35a1c2e75f59dc962c10ead434364869d22c36d6766f7e3c1f231730726738f61b4f346c3da2db52b7e86b761c945c5184f53d0f257285637ded13beeea74be57870d1552effa4a301ec892b885376f220fa0176d2dd62ba43d674a3486e7ef5239ddc6160ddc24f5a42030408c269bcc79e116f9fec8d07333a9fbd5f54381cac024d53f58bfb429aa5ff74f6112ce3f75383a5eb96db9299fb22071831d0c54b88f3739b246243ee1c3c0bb4de426a2e3fd550abbea1124bf2caafc3444209a73c393bb3f154461097107a6e33b390c8c5f415061b50c188d8060cf73bf608c0120525d6760ab955df4a2d7dd839aa0a640622b5280ed3e4d7b072192d72b711d460d27313619bb368c7969a37c4199029ee4f60ed2ab385c8cfabfe9057f70a7dea9bcba9197a4498319a31af195ffeb204ada371cc4f3ed337382ebb4541d85d1cc2ef8f3aee222cd0e2b2d0883dc3ed77d2950219d74232a6e10a1b02ae9fadf9fdf0e3b2235e12b3e931899a615241dbafe4e565d1b642a5b2b3beeac961be4eaa2c57c079be65792e46a3890d08c9120b6a1f8c346faf37b3265a3e2509c1f47395b75b7e95515bc6c4c53cbeb3248bf2e17b8c15bf4e4f739144a5adf19c6b3efdf9b21777875dd7ab77a5e4d8c262cb4949e5aa4994e5965f6ce43ba749f6898cbb3851d0a3c4db040604777ee199429ab957f52f1a43e58c0ffaace167b139d3a144e4c2b7330a9b51a4b0961293120dd8743b3602a0d3614326b981709c8256ccddd46f425388def854a47772eacc70f47fa4f85572766df29955467e22fec07a7d471883254858c45a2ddade7912ac2a50330240d68e251b676a420463a7024b515d816c334a0f774817bf1c586b2a19747b014793067c5cd12d60d8b51d9e4dd52c143862f9736e9ce28e1b6a78f7dd44d04207f3ec1077b6d0df625efaeea332f7742d4a9a1254d65764da06deb16615f5ae9e40064c0db5ef488dfd89481be961b14d6de66399d73fcfef4bce9d014f04e9abbe1c70be1c06738ef7f52627832629b88b8362e14e414734e591df53f5471b78a70d65954145ce954793cf995e3919dada001d2c67d16a7aa4f1a74b476dc4a40fa95485df656a9529a533bc380ab518d70f752e0eaba11f2116e5fab2bb89231d676f0738705be5896b2e6f2604245464fdc72de76f2bb51e35dc6b3c6607e458529145e8aab77b4531e4f5bb7b98e55421b4e975354e61e7ca9ebcf31a8a96fecc038cbdec75c7218028f6f7a7ed5434c920f6808d24c630cde922f9591b131548f71389837fac3824668d42e1738fd56563bde3bd957a3388ca0bd7f5ec6d29c7a3f00b71c1919fe9b7e9eb5cae7d007345ff1bc236c6a59b96b13f79377527bba087402c16f42d81f85f87dc2f10b45ee64ed3aaa21255b9118aa5d77159bbb819ea86a0914bb7b8a3359ddeb69cd1fcc0302cab1e32b8247e3f7d40695c36fc7d3feb1e45452b56f8d014313b0cf3244f6ffd0b33636074cef6fac18e4cfe4c5a7b39677208273b3530047415974051f72d09d99761b59cbf2b1dbfaa415f1964d65ec1199c344169a28d77680a1dcfed1b31ed4128143a6f4b7839fb16d2780797033dfb478a500c0ecaf429e2c0d1dd83d1e1b84f996adcc55899602ad926a9411297cdafb706933481196a6100afd57aa56ade4c77bd859583782f6a8680165e6b3dff9331df85bf9f0ac23fae7f7f357ce5e297e4c42ea3002c96c419d8fe71691f60b810322ed764cb59332396478cfda43dd66607d2c40ef0a68157da9e6d0cfd21a22c717e74471474e3375580322d7b77f245462ccf196bb3baf5f6ccbd1dca82994c77a2258d953bfd29f4d26c9c77598c658321dccd93e88fc644b765e526c7174db0b5fa6cf73ccbbd018f1e590f96c9a104eec7a9efadf325bb74e7bdae283181a48483ea8d6a77ed49d14806219013e3e8484bdb10bc0fac632e8c92e89daa0afc6737d8eb74ea2f6bda67fa26500689038bac771275b5555017b3d49e0e6387f7b38745fba9beba0c1117b3b71a58aa2b310df858c597804c1a5598cc60ed2e5bbb44c4a32f32a7e672de58a4349209a46798906c4e0152bd6c7cfd1b01c0d617643f3fbb0b25e7725dd4b8649a03478db70e6c8b6e082c71f9f8f36b704cd49164b9cb37044a7430cbd7dbcc54115efe2b6fe6a270de773473a982dc2574583d405867aa2d949eaf3ef6162ad4f6f60c47bdd7ced008ae108579c7f68d3f2a9ca09cfb86809a7ee265d84a35eaf69bb8ff3fd7fc60499789ba356b323470b3e2bc0c7eb378991df390404c98d81577a9972bfbed51ba3ad1c54cc55cd546c4c7fd0262e02ca716b3a97df157611d7dae16d6004819b69c0d89a75010328830db125245202159efdf696b7c9b8cf84007cd39ad5f37326461d3988015f63c547bb854b75a9f53f159ca45e1c62dad1897b365e888e38f11b7c609a2e90417d77fcc09837930832acb43645cc2d27fcd5782a8b995053c207fd89342c5d70ef8b28efff59a98e2a482443d631a494e110377c65e88290872c1c4d0f722229db91c603da902626bbc78a0d988dfdd9740f8bff9217055898dd8857233d5c6f7504a3949f30d4a54c862fe25a741781651ebcf316daf5084e4e6c5