安全研究
lunary-ai 三个 npm 漏洞串联:SAML XSS、IDOR 与权限升级的同一套信任链
Thinking
2024-12-19
4 分钟阅读
研究档案
#漏洞分析#代码审计#Web安全
同一个 npm 包 lunary-ai/lunary(1.6.7 之前)一口气爆了三个 CVE——SAML 元数据 Stored XSS、PATCH score 端点的 IDOR、PATCH model 端点的权限升级。三个漏洞的根因都指向**「认证 vs 授权」这条被反复忽视的边界**。
Unlock to view this content.
ad8d9422966c73fee42096dad808c6448a272095349f41facc28f3d18d1ee66a0726fb5aaffd9271b6702e0ae53f6961031443030e63d37842b7356b4a67d1f44b648f709f84d99b1640e6f7a87a3d44129b61502fc0c5c728a88c67798e6cfb7bcb30fe880464fad1a2cf9635735fbd6e964b402ea4ed27e494f7c87c72f1c586b333a47062292625ea7240d146fb061f3975a6253d117e97272d7df5aa897fb9fe2c09034f658aae2645a68076992d7d9de07ae63e2fac88f85e687739d4cdb2d676329a93cf74395e5fe62256c8f34a4f3d836d56dc06ca840f4433f33d3b2a1086e5ad7bb53846c971a73397bea79474ff49188f3498552d95911db6674d55c544e3b5ebd7166e90c59293d2e51b6c53117724015675ba00fb006ebc5fcbdfc8be144cfad68e0d821d1c6d334f382bc2422a4aff64411573863e4b8fd2de2a2ce0bde30c05dc0489acc375ff658fdbd96f0e823804165da38c5a5bbf2bb8b49070ddb93843c31bb28f0184858fb811f2e8fdf43727227a9b191d7cf0a14d733ff3c1cf66b63b7c9446a5bb170e892077408846865b86b6d14305eb65f2ff0960ff693e92d47593d20ae52ea7749f2df8ef54748477ae3ea2b4aec8e5eaa1a18af18ae2475d5b5b9bc3f9164de2edcd0bcaef603f4cf0946bb837ba83a4355c2a3af4e03e0ade88984ac83708aef995070c4f7ed59d66ccb5ed366bfdabcf03cecfb6465f08dbdada3baef09a21550073216c9ccde6425ea67cd3b9bf5f7953642e6cfcdff0f152947ae81437c5d34c43c92669db51792ac6f91852e8c7fc344b494cefc4cacda099b714cf74975e7f198c5eb3ec71a7eb44dba58c9d89182229824e12a4ccb322c11ecea70e8b4ca095fa10114ad5e189f04b4903efb8717b42c710ec658ba153d18f58c254ac43d8d8f757837aa3ba66724037b77141cf4e7352c9390792084631f6000f1063dfc349b22cb9efa183feaea1b4e0bcdb9f75c7c0453fbb7f2aa734dc77676a88685ef25fed7bc35d524b32cd4739210493684794b5c6aa0e929b5b54c7702155f2f21ed9946ea97c5ab775f2b3dc704c280e33836c29154477f297a9ae5978a9f4daa664362e575692af671d59a92d67c2992a265ca26cb3a4b2d214d0668ec9a3e8ae49bb31b04f30e7734dcc6c8259c4c5dbd61f40279f8977c74350874babaec74ae0c257135c3e9811016177abd8d2455f365d0388021a72100b2202ec91e49f40380c16ca617793dd9841c39a6537daf8af2580e9bc3d1aa2520df3313ffd23cf33f953e297e3b5e8ad02568da082f6f307db615380c3db487d699001453f132c5cde6d4b70eb69d167d5b0f3b523ff801a2bdc66cf82f639bd7600fe9fce566732e815eac6bfba726ac93ef6408578703fafcd01d91c16c5bb37a6f5bb2d495605eda6dfe916f8859deeeb216364cbb3a2982f14a6c4d29eb4ebc346070b4e3e1359a33f998a7e39d49f8101ed5163c591569ddf1a8201756e08b348567ad1aedc47c7c03b125fc06c116afc06d72a2b221d4d213cc5e64a1edc76f76032361d02d7fee1055a54d24b81571b803d97328e9cde88a0322508816e98a69d7a3a4925b0e8dc0e7a11ea2037eb0add56926c4da3072b0966eb0085f6706bcd6d7c03ebc1f88217cf2d51bb5ddacbad6f03eeb203654a3271348d94d87774961310eda16306abf3fb17e57ff0233be3fb1d67cb152d3392231d7f8d770e124ad1f841d9f1c68a9d0e5af7e233af3aacae0d48fbfa293aec05a6026f3370fb553763bedeebb6d4315e9b52301f8ec394bc82bc39d64544c08425eb938d265175b211668609b08bbc7b05cf6fb069118b06b056c6f5094d41809ab7b1535ccacc7ba7f3e93672913eb3be1925d226d9235d3e5f928e7e8ca14327a0ede605ab2e93c151b758f739a5651e0e889f5b755fe0dedc4daa203aab17a4e80084410de2fcc129182123d484ddb7e87ed0b3b82710895e698fca23126b5b4c50674c473cd8510b1da7db3b7dd67ebf023c13e87c0710d58313f00aa098a647fea479854d56130a97b49c0eee62504144335269d4e1002a6aad5c785a6a64e8ffa65623646927db4a9c3c03b811b2b4474f2e53ad21c29c8913ccda3d368f96d896320af22f8a96c999e7af4d04992390d1640ca08c9169b95f49f121f6fb9611c630e417cebd3a917875fce793ae11968145505babefdbb6ec977a9127887c169f9b187fc81d79a22d8fec857a3e4f64e44d2b4258796c43193ef89881f9aaf1096099d51d506f549d8b93258d3275572eca5e3deb8108692bc591a5fe4cde85bdd07b0a711da8918c2d99e4542eebdd96a4939e029089a7048804eaffe000f2b2abcdc5c30cd43135adc38fd2f24eeea6deff19f45ce425c9abc85491beee30b68883fbe5ff5c72d9b19beeefbd88462ca243504c679372df28e1c7b2fa9b66f0f6be30c6f56a078ebbe4bfa2db0ba8341ab2e33063a19cd8e7c3aec2c74f8c3508962a29627fe07a76e6c51066c018bc09a85f0e7338db648b3c57b923c34ab808636e8f1a7794f1605760694ecf907b2dc3e7ff6fc89eb40139bfbfcaf63907312b8d1e88c789587c427a8d79944a354d34ffc7b34e4d89c581adeb416a1d30059752c762d33a9383e547d734b7614854dbf63454fbc696171d15fb25bfd186e3f07097f20267019d264c4f2bf252916c7349dac7fd0bf34e86f41dcbdedfb9055442209e2528c508592580e282e48873409b1d9c53f26e9ed78119bc4ac87c5f7a18a044b29ded6cdbf70266c091ab6715f2ea7398a69e89090b53a056dd067c83334d0f273574b193f4d36be2b97d7cd9a42c989f5116fd886187411efe3e7db1c36802c0aff4b14afe637d4425453bbf9d7dff08902bb14c41a4259ae0348ac4c5cff60628ebc0147483b34c7d6837956e257a3a2528e7adf6182c4e6151f8eb41d1620de01dd005f477b0b1b7e7e823b2e62570a2051befd7395ec05fe2aa96d9053296e9a3fb6db3c723be51fb534fc7dc12c6aab9a7adc980ee7df0b7be03cfd061ff90deca69a0425639b72466b5ef784d8205885dce6d9b0e799b05bdb62bb7cc816d94593161b03942f2db0edd8ba1fdc054eb7f829209b420b4ad5f9eb1512cb12c251d92c98e08f5991fa3c3071bc412488c1072b4aed471292292fce00e8f1450aa812b5ec8f2b2e5ba985b430b51f5d4fea64dad922feb65d64f89ef51386478d9f02b44e105caa6909ffabfa1c1fee06e0571c062359f186aed6ce67bbf588b4e19fa214e140f96ebc7c2dd19a8e1f8312811debd3671a50f8c02364a8715d64281a60f4ea795561d49f08d1dc97ae6ec894be593f882f5620417bdf16b4f0ae6d851cf38e190aee11a5cd1488a547c782982946e4f8cb580fab7483722d0b16a51abaf0fc9fcf7897b1f4d6cd4aaccf3299580946cdef0735e78cbd6460f9c7ef15421453019e87fc13f066209c7f77e6d932275387dd9435cc698e862c47dbaf77f0c36fac54ce9de96090f7824e78faeb1166886c9359e046f6a2a9801f70293dfb8a90d79ae899ff5efe76e19a0722dad82491ad3b4a187e29ae2f9585a3861332ae2bfa6133e4df025b5bcfd2190222337872459642426dbe09ccf9909d84da7f3b91bb9959c6e874f16e09e500d84f4fe4c31e140a68fe8ce7afa1f56f4578b62f566e2382bdc31338899f0ff26662dc87cd4ddc90bc598636e01b0da1f62f20e1ea912a12d64d9a105af363a7637e8a3502f55939cf2974f487b768392d843e9c6a9da92a363ad4fee8eca6c208b56e88d53a18081c1f543b1b10c88f3660f97b0bff6c5b4a90b17d16133e925e5a0b448621db18b2650e0b6c89a7534108ddad8bf294f3a72b763400e7074fe64962ac68ac68d095d4744c6cd39752e63c50551643154b671bafeb3cbf881b179cf10b2a9fd76b2c673255c5551bd0227624767b330b2190208cd46789afd68cd2def9c0172cf15ed7acefecd92f4e16a2f45acaf77e4a8eba2480ffdd36527b4814a4b64933ddc64563a18ac598144eb25219c6c4da3b585e4befad8078424c4ec59190cb5a500791e7b5e23bbaf17fa13bfc644793cb37680e633004da68435837f3a010dcfdda113fcd084a3fc55964e2b309f533700882aca1547a39f68f621b7533e5fcb1382ae83d45139c9ad9447000ee40c062d254e5c38f9a8d96f3522de200f1d542381962dea99866907e17026842655148634024b2a8ade301e4d011d0bbe7f0b2daab32ceb2b7ad5567fec0ee8428c5911a08af5b9576a0a2cb68ffd306d7cacf03186e37aeb99d346d74b620a49c589a8f1a7a75a4f43dd474f12dec13181d7f7168ae0d724e36528d9e498cdd7abaeb89e11a9858bbd1bec65c88c52a18464554652d986627f392fc92e03a64ea9fd264eb2240f45d6757db07ce80e29169c42bcf0598c71d35be1c591badfb8fbfabac1064c77f02f43241c4206a783b5a060ebceae583d7fc08eb62519cf9277ba418941c100b0d00a9b6837ec1617514409021010de13739afa5d8f982a1d5842ef20e9dc312c2971eae9c3bf16fb1cfa132c2fa379e27ad78f077dbef579074498ef5e675d27b2e13f064c8a271d7c3809a20127abb22a181e8ec50e465d974a523f8228534d48ffbcb5f6155486541ef05ab6d5c89d5d13671b5329b3727da2fa6cf7db61c209ac23e22a684f70b1271e14632e5c2d6bbb35012779128b68bdd5633c2c46295135e900a45d6faa365c92e5c5cf660207c2ff353a5a89eae2cb9e4fe408b3fad7448e120d01a56852cd87f48e5d5f84f664ea875fc85614cf726bb7c783be22bdafa31de73849cf8a1cb6bd7c4ce4c12ddf8033b10955cef7bbf470cd93c3d5796f48ba41fa0fd2fa86dd99364a808c3ad7473a38f26169fbacca74bba58ba27d0b1e74c28161c2ccd0f6d69c094014f7711d6e0356664c74d1e1251c98679feb921b09f31a43c7032ffa7e8ea13ad886cdbba1d4ba869e6be6e39b63f315d46bd6160c381ebf4f075e916460a35a8e9f9c0812d83c64a937f12fc7bbefcf4c673f654cc0ad12d03757ce58bb62a9b1e7f3181bea8dcb788acc4b3d42474c4ab490eaacdc82e9afd06e4dbb87d21e15b887ff65c0390ceaa3dc56450d7a656610eb1ab2efd69d46b558c48a77b212b1110c4dea2ffdabbc8578a1fc3a2dc379f4d64704a02fea96152a65f96ffbb5d92bb2335f509d7d4acdeb5e331b9729ee52f7d33b2897edd5e454c503fd8cf1a7714aa2e675232e4ddadd7c9e534b9d44c9666ad13cac08b4027646ada6fadee669f3cc7a98756675aa12ffa1cb23e04467e99354de7b7c3ffd9c496beb9ec05639e72b6a8a809ab5e4aca2b1a9af8e7630176f3ea82e3487d24acdb4bae733144bfd3679a96943878f6243d32a0959cda0158a5f56203c547a380b5c1359d2152a34a0faf129bf124344298c916ef5547bb322d5d23ea934ba479c8ad34ba757b33d3e600547e2121321075cf6950123af3dd5ff83a9767a635e010bd13435d15687eb451a92d08380ba24f5766260b85a7672c9dea2aba26fbfdb02738ff09fd1df0d203858cf74eeeb947f67f9cc2bb5456e53fb10af5b35c48d6263653b0ce69fa51649ae6ac5981a752f8c9b487617a8c29d253f2f0107df96b94921d895c9327fd0e331d1c7c30b4691b580f3b929577289044d152acbf084c02fed321240de8a231ef5ffeddc9ffae4579ff0726a2af0d07be32724ed6826cb32d1d79b04d5b55d983d7cbd059cbcbdbbf6731470e39ee05adfa7eb0216d19759a0aabf57dd8753cc2275b58a0db48d20c9bf53afb484594bb7f729e5521d90b4b1ddc800c242369abcf1d1dcad30e54ea1591f8d0af8a99c9f2503bf972a427ad7e461467ac8e2b1fc7d52fa6aa75cb7318f6ffe346ccecf8ce7e5e1cca12efc289c5a5dcb27b9fd7f7e2af738eb36d0e6a7a4d40d28c57e9c28bfdb2ecb9181671403e126a9dc63783a6e1e157685f94f793453e6b97da3e5f6fd71ee2b3c5d7c22260b7045d6d789b9c21cb3cbfd9220fe13d4aae35eb348bae56f941cc1197c9f352e23076f0ead430748c7723d2d323609f6c195ea0b60c50f52891c2fc3e6df1d905f5b56e8e8d1e5c79a7566656d5f1c909eef5b45bf23578f8eb5c1d93fcfb73603d3e33047dd35c1345a4c844485b8d041311a9b29e83ddba9052e1a0af5c90212512e2e1f72534ea5db28b790f06f06e67bb197cf51eb5ae5d5b9de39dd5e4264342f9eef53f61014a63e85bd7883be3b92d7f1bcd0e383fc65a611b2febcf1de5fd00919461f3c42479185c7875bce2788e1582e52f1b0e9357c39e69245fb13f1aa9ca4ccae851929d565a6d26a2a8cf3e88e96351a9e9b1d913f75cf98d06c3f95e6a30b123ae013618da93f9e0c59671f88964908bb765c9de5fb49c2cb38b2cac616ecc3035cb70d3b7c170f8dcfd147f5ea8ec77183c9e95cc90b83834924899dc7221a47133a9c59c31164cee2268a1397f1abdd05a45d31ec0fe05c39ec4e77fbc0ad1c758a3d1af5c53c3f06479c03ef6e24cd6c8c5b1ef766037692cb4d9ec76825b9b83cb31eb217cf4776650a73a4a1eec97d667a20dc8abc16fd6fe4cba117335c19d824b52390cc24ccf8afc769869618911ba762b7c3cde127d99a9500df875c41c28626d0ad7570d1a6a1b2c5fc50e1d2504d9273695a0ccbb0abacf07fc3c656552aef0d01c4dae8178d8e5f80632592fd87d2d0a6745420d0cab3ca23103be4a7294a20614eaca1ac38884e38e69021f36a102a209f01f27038b8951fda6af76cff08a8cfc50eb4dcc19f17b18a1af3045dac5b6cc06908c8be329d403e2ec27d5f81a1c560ef7d57a6701b0571d91cd0e638a3264c24c95a6f647cbe0f852067d425f72da1e201ecd75230ba61dd6f72aee50b6b5e87f2389e8400681662172ec6d814a927275fdf287b963e5d994a29c83ea6d2bd1ca7d99e25c0b6c3348585412188b2d8e762b61cd69846fc565b04c03361aba141dba42989f58b492726b6a89ef777803aded95a4ee617fe28d88d367114c8508d22ca206c3c5ed9f125675b7105a2e185a88e730a5a417a972754d6466bc6a2b26f353102b41bed7d013994b78956a0d4a03515ef6a5cdc59a25c0705c0fb06e7b9c9a9c24e3449388f9a61d29cf47eba3da14cc8bae755f9bfd1aff3d33c5c47792abe2a0b8d56577e8136e20c525261beaef01395a84f03489cdac2f5f2cebceba4c6f485d1584ecacb38fb8b46a99f48122adc6f7811461f616688ea9a3f781093add8f5de5baf4c8fa8dd77adbb5f4d9cfd5d81b542fc5595317a05b804cc18569f1d259bff2ab4d9cef43dd81efb46c26934a628231f8cc99cd38413681f1d0bb79137f2acf6cb8fda6cd56f22d40ede692404b76dbddc53d9b55011d109a92fefedf35a98743c39ee2ce904124a8212e93a61338679a1a921556bc0efaa757b78d4b410c9fad0f35725877be53ed900e57fed64d7867288357ffa8d8ab17d27076dbc10425eb458c736149a90738d7798def25a08b1bba9f692f67f405cf4c8c22f2b48b6b52273cf5efbe56ca8cd41898d0acc57ebdaecf62571c33c15b787bfe84896828ea23d0706831fff6a477965579e9404f73e291a6dc1b991343b34345c40cc17d17f90abe9e65d2f8e009fc20f0675f0e5617659e24650bb64891dc4f38e38120e87e5cadd7f27a62f9b70c4cdd8da4b8bb7ec6269f807d2069ccdbb03260ee7bbb52b70a38d2ec9aee2cbee7be38fd8671f44ea80f6899807dad9b6764d17875e2b0a14ba9f28c77d69fb63b60f0d0d2c0c0b93d04586d6a8e04ddcd970775d1ac68c3050b9ecc15563f6d613b627c4319cec7ec3882a90d96c2552622a66fac72d689efde4cd5598429a9ee4f0b3256ca63d3baa48fb5045cdd91ae1f6f881871763657cc59502d03018664a125d6bb7dfc742da7efbe227f4a39618bcfe3963a3622db2c1c2242835172f32773e02255d00ab6959b9b05e9cea19d159eafc0dff4a6cc6e2ad47f3786d4b80c08f86b2e424b371ffa5f0cd0b6a1d7a7be3ce8f22c7d5fa4af859cb64364a18def2ea926146075d6955434d3722e8903218b2c46a9609d82f1244ceb7875e8eec65c4fa21d472c22236d6f5b36b4cc0a86a7bdd4c8087150034c5c19153a2ba77d96e1373cd011eb3be61565e22ee5eb171d28c6ab2307f0ad490e5b54b5e0b94f9e82c2a180c72b8bd9fff7b370d8e88749edb0ebaebaedfec9da682e93bf41f7633b2c6c9fd026c68018b2d7e4d7f78634c6789785d7e6dbfa20cec2c158c9073e59ec0aa805afd5191fb8d5aae0e87b4ebc2e539c0361957c42237bf6710e39e08f2b937be707862f7537b35036a036029f3969a7851747721827e627c1becbc4f442b7873c7e636a475b9f0d4f81abc749ed9b1f423aee6c421e6f65ae601a08deed6a28a52b203685ed7126df78d3d5eca6e9061c4c33bfd32f7a1826c7742e450b49883d8d67afd5131d5de7593038cbca2629e0b583af29c11870f4253c27c6b488d09f61c95937965f6d3844bd37b45e118752ce3924c53c5dcae9037a2324326a5940264f0a123ea098de9a6fbf3559f891dfb4adb74ddb752c6255f4649d1433eb84872afce3cdac8bc04e6d66cd68297962202f7b8f6ff89649f0bc12ce6ecec5b2909e74a007ac55572e16a4fec3933db0a7df77ea384ad36f6eaacf43d1a84b65cc71d7ddb13619e61d13d1d6c5142f9c1d2029a5147596f482149a880f1bfe62804d1e8263825a0a05e62d279ac623d03dbcb9325f77fb94361aec49f438c75a96443a486b4c9720659b3d5ad3916bfd16348b621c2a0db7780b86798c4d4f63237dba9437db2b0fef506fede86ebcf1b6093787973a974749630e1c83bf5f30461566e5e4d9a5c2e19a5c96fcf3335425cbabf36d6a9a6046ff6a2ceb2fe4439016247c492a2616473e22d1d48295bb2ba2db690a5b0bcec6edd07b3dbd18bb878485f6c9d719950b3d3c7349e1e571d94bb64262ea03b93f30f4f99a8d69b1398b6dae5849412a0841b6830917fdaaf3a1e22363b77c9f618199ba442fc468ea509690b6f1ea1d0aebb0df33758fe7ec300a99ed7ab448f587e418371d635b158ebafc365881d57cb514728dd092160d5f1c0939dc401c6cb875bf469d184b511bd879597a2c2ac6f0d82f88add90dcef2276afa3dd5f3831152217bfb30f0dbdd484801d071d2c6a02158d8887c1ca1a9db25585e9581cbc0785c129031823236c8f2835fbb39c0f9e0177e185e490c228711ecc0b1e9b7ecbed831023bb9e7d0e8a61a8a5fdc9ff40cfead3880439002c087b86583071467367605f86fc8c7a34917695cc2447d3a01b910d33fe5a75f3f32ceb9759ff87c2f3b250a35f255a69118f6baa21121a18fc5b5a81bdae1f5ec376cfcd0767e1b765a67b1914c4f11fe776c9160824a2a28f428614f877400abdbe387fa4fd24131553927743e4f398774bbccd24f1fe58ca2303c71097b888d7a5ade0353cd6db2558d6f95766aa6762d18e8c4dcc52219c03815b1ab4d2e2d1fd7d4b87722482b6216000532f03843adea2eb4ddb8a563d35aee55b1130ba63cc666e2b365944ec56fc3495f786a79c696836c4ca25d98f864125c841c95c1344435f1b20767d2e3456cadb273974b6dec00e0b38c92923e3705796c2f744f7959c5d6d509f864bc8b4d48e1f066adb5cf1a847889438eec3b18ded5d60dbe8833a0cf44d08eb3fc2b12bff3f18521346e589cb14e96aed7c7158b0bfc0909ab9e11dde4a2bb5f3c48d1ada296181ab71ca99c9a6a51204737c863b2106c6f437246d9c41b34fca95714070d07a6ae1f2cf6270eaf3a1a0d83380a8a7bd12594a3e6dc5271a6d019d31e65bd048152ee68e1a1fe0d162625b4ead317c1b4c59e2fa4da17c3e85036b54ab693df1b10f95b1b360faeceb230dc793de85b488f0442bb35d7fde83cb48aeb55834e2c9d2f8b6776fa752a270868faf8c40e9bbb259bafb98c09ef1272408f38a44c505e1b78193e0ffaabfddc211dc0296312b7ac3f63f82a9e35717e08adc03c5839c2206021603e98f7976a1c9b8c4aec3054dfc80bbaacee16aec0f57e09ec31a76914fd09712a0333b7465070f50f327fe68d0a1e03f85374ec3afb976b59d0dc57343570b2b20050c85c0ce996e1150b87117945b393584cf44860e793462a91b269bb42b61824d4f002cab655a2957dcd6f7d6c15ac24baeffee478814a3a6972e1ed647b6c7962c7c6133ea08de5185b3f9b4e53860bd3cc218fe8433117eb87bf5cc06eb4058b20971168acce2a7d736401398f73cacb70e2455977859d3edac5e8f870ec1294562771b941bbdf5c0cf255e917301cd5cea5bd3fdee475384b62b1df9e05096b2fd5f16f4affe095f8405bbb3059a3e3a416ae2780d83283d96c41506d9c0c5a9a555b9dd4b4bdb574c6aaf564b1a37c300c4a5ca40846601e519388a7ae2b5488a9afbe5b5947e1c0371b10fefbd2215507bdd3a553cc97bd7fbe5ba0bc54b9ad963814e569fba4dac934e21ea5d4a63026b7c537ee65481a184c0d8f532289c30043653ef5120758f53b6d3438f7bd79a3a5bbb898c58f984a9757e08e0a60855314d8bca41ae3b7859be61ad6db267c1c765ba164eaaa6b8d41856193bf315a025174f186f8e6720dd70350e03056b48b6296f90ba0171908ee9acb267d821d2c1d3e5db6531f13b28356292d5057c74cab9bb1c732d3616fde537f0faffc933dbbe5e935acf0a87e553db14f009c76d8596fee1be6176e82e083efd626279278580b67b50a525848771347577d483aa6e5a05c2e6c91281691b8d0fd594010a5ff94e41d8d64a33ea3631c59fc13823e3a4b9a0d588b82e6fb647d763d7daaabbc914b553ec4f82487d95ae5c493060d10dd58c643fae91fb19af7a7ff0d03e0ca5cb1515b06ff40ea51134b28ea20c0fd4932217f3913e20150e886673f76a2f71211e356208726228b343467b7830b4da17eba17c33068903058eea7a27222bc0626bbc15a7eead5feb3822d07d24b0adea1abc9b2b9e5d3fd065a24c74c4997eb7189726b4497769e8239bd63223cfc24d46171d4d509b3efc86811120a496ba07262999a6481c7648e2455a1cfd90ef4590ebb16eff0906a2b956d4ebacccd4dff1e26148392cccda0c9eea639629271ff04f3f43b7df09346b2a8c19adf1a9500ff7d9b2c70d421be9721b1ff99e302f47d756576060afd2d989ef4912655581acb77a4cc736e11dce214135936616ab0619c68df328ef3a9081492ca6320cabaac5bf147671fc78f454b874301f7089b4368da89c37c4589e667f84cc7bc67f0657002c3a769d11cbff2c6c0b1787b8e430b248d469e4af7a71c67619ad850171a830322dbb1a09559bea4f141fe330c3bd6439312a49bc0852f3345b97e2009b98746cc7b3ec3405760710606b70aaa1eaeafef07a710f3d4dee90e2e93edbb549b6b2fd8fbb940af20ffe6579c23578b49dbfce5bb1574e9f4d08385eac707eb978be215e2836008cef3096fb2759c5170a90443fb97957edf39be477c057b254511c9f17274b2f1f91a0352d48908b59df6f702596ecc99573d1260ae4aa4cdbe8e81358d41a8b3a83b3b4ef2e508beb86df1a020a686ee2995e97fe55ef204752ba8014f6e9f966ff73d9a75fe0dcba6d598d57fbb49711d61341c5736d7f30cdd3271c0ffeca5d80824785ddd9645648da91f71da45776f8db79ef31e58c79515640bbca276c1a67a5a83f31721e9f3e435bd5190dd08e695bf92a4c2f1709d6803f06696d034e7da71e0c5171e72d7a091f321718bd114b632b5e202f4a56881b3518866f2395bb1f995fc82e522221ed6a7697c88f156e5288901786008f25319db65ffabce9b637bca523f5653d0235fda493546a998a794fe7cd0e664cbac1b9d1e1ee488efd985076aa76bc5b3ead708fc570def90ed5dc514308f9eeb4546271c5f2f5522477df8dd33410b59b9773fa410f81b33217228461b9fbf84dccf3299a0df1a17fb4a7cdcacff54a47e890edd158bf96cbd6b742427ad8f409b55a95d92f3eef29a229ba7b43be00dc08682615a0ed166049a6d69aa2cd15143d6b073b7c15f8983862372d61771163b2827ef53c7ef1123f85366f2f55ff5e579f42e1b1a2735a639da1bb33d7e74822b9f468385d64ab92d9b8a41f8694fedd12c7a2a33a822b9a6af5edb0fa753fcd71e286c63a953485e13ff20a4f074748fd54d4c271a5614f35c847ee3dc2da0c2bf8bcf9b07026d3b344d0e6fa7563d7ee9f737ec2dcb3e1bdf6ae12b27d157746e50bf82dd9cae2efc72173442178e7e3935e3f08846e9bac529c9c1555ba03ef02cdd3f15d1ba3439bb9c72315d39e28c988a0914bada9b16fcdced0e7b3b6c03a2fe20b66b4357f70790969353ff76a73e80901492801b4c8506f5f58b22d2c20b304782a283c85a478144ace67c1cc8cf8f2c49a4b351134017a66bd0f44f62d03db976fb889af3049f3be085d0e28df58d915c83e0a2daed339665e1c97fe1e76e2547a0a5320062932fc409b754b921538e6169c4b1e0e95e968b6f395c18397f6fd5bc87a5e2ab606dce44dee5ac4fd66d1d58123962af84d383407b2cf23e660d05368efd0c6b85a096bc88d174f6610ff99209481b89d55a473e1282cf1e74c6f416e900590657c123ad11d805919878124d1e4aa208a56969fb07d8d48702ebb008f90361f9f0b5f15ed765ec4a06cde0eab848bf18ceab112d7dd18c5ad95b771a988bc3be7a3183845202272c739befc6941d60ec2049a0db9281fa85690ce6f8cba0eefaeafa00f67b82ddf18a713e8827e4bce48c25ccb3af178d8b8d71564698b1607620b7273c744b12b6b27f0d89bf7978afb8363b404a5e97f2e6819d0356c8cc715b162834eda995366796165cf0285a6751be326db48fe579945501399429dac398eec74c9a6f8351f269db168a3b99c42edafedf9450d582239eacc5cf8bbe11fda0e160c87cd9d5226e22eb5953fb88d8c1c04fe71be09d313e31ed64dfd6c3de6a3d6df718ee80cda836363b5b3e7f962f2a621959a214ce762e2d57e6ac7dc45f1ead1e76522729f998a085b38b37bd2fad981ce0e3e2659bde7df2286fe190ee31dbdf38165072ac8f3c0d9d7c086628852184ed7fc59a620106daef3b6d5f916e057827cb5482d64a9b06727633c407a44fe01fe51a9d36919687d1dcc1124aaca3b7b38d9cfbffd9432006e8193541ccd1dbbd004578b877b6bd5a510b2f946ed46ba920ac5d1258b53564e85b121bc67bb3560a27d9ca1631eb35a4390e78f706d4980e4c0c6f303b4359abe9a693a552b029fead9670327c744d040b2137e7a69259394cc5baf311f37e759ae0fd11bb9109448ad9a54b856b38945e5cab2c946f2d919d4bb4117ce31f304a136338b3bc453255bc69152f272d6a2fa9413712f30480b860304db707543737f66d9bde7bf3693c36be4a88d8db052e754ecfb9745202bf7296aa8fb593c52a3475344d939fb87d1cb99c851bde4ab21681019243b0b8fd39bb6db717a0546cb37721fa22db837e9c0d1ba10c2d51e2a2379468fb503fb1c51cf18a8485eaaa0bade414d88c7ce824c75acbdeb425f9ef1d4bc56882150f58ef0e530da75e76aa2907f3382b78a29296d50d63f2ed1f7a8fffda6c8fe60d755a1cfb3430c46761337495b70deaa5dade4a13cd7152521812c32d230fc2bd8ddb87c0bde68ec9734f0cc8614851739e8da33b295a99a989856740cc4060d0ebb6fe00cef44b68af912a72a6c08eb0248c2391f188cd3e4e3c906394599a01ca7a4157e6e32c9bdac1e73879db319a680e748ad8ffe0b32e574fdd60db13736229258fc282468134e47ab0fedf648a59311c6ceef923db69a6b88fa192f002866ec0f42e3e2d8b29e1427a9bb5cc490fb85b46393ef3b9b5d42e24647099df321f8ce4bd4d9d892e44f98373d506ab82b24d3f6e398fe9ca1454c12d73747f3b07f3a5d66540ae2e9699741cf6a9c31526d2e117108acb51f51ea928b6a98582a7a1dd775ab956f9295f8fb9978f01503dc3f93ce536d452ab2528cf8f0347ba23e7d88bfc779bc9aad27b593c15c1a49e95c53823065662c656328b659044cb0abd4917c20f182b0889aaf8c1abb739bbdcc61bccfb6e9ce98d8082876a8d1b357c81280eaa9dc5871fe8b722b20b767bb56a5dd4ec76ba4496789a052d1fed1ce98dcdeb7683e380456f368faf2092f96f390cb31b147355fa4b507707e8eddecf84e8791dd6388764463bc05e483762e11ce06325767b8fd9e29cb67ac0ff4bbc88c38dfaf2921b7716bfa18194bce9307da3d818ff254afe7e618758c70ecc5f8b24bcacc63aa386dec448871ae73fe26a0aeca9fd86455d8a5aab3795a77547c