/** * @author 小九九 * @name python_manual * @team 小九九 * @origin 小九九 * @version 1.0.1 * @rule [\s\S]+ * @description python插件兼容层对接插件 * @admin false * @public true * @disable false * @service false * @classification ["Service"] * @priority 99999 */ // python.ts /// const sysConfig = { //这些设置会发送给python兼容层 loglevel: { python: "INFO", //系统日志等级-可选["TRACE", "DEBUG", "INFO", "SUCCESS", "WARNING", "ERROR", "CRITICAL"],具体我只用了DEBUG->ERROR match: "INFO", //插件匹配日志等级-INFO显示匹配日志,ERROR不显示匹配日志 }, dev_code: { //这部分功能尚未实现 code: "standard_user", auth_url: "https://frp0721.dynv6.net/python/verify", }, }; const file_dir = "/bncr/src"; //python兼容层文件所在位置 const port1 = 9999; //需要在容器内部使用两个端口,默认是9999和999,如果端口被占用请修改 const port2 = 999; const python_bin = "/usr/bin/python3.11"; //python3.11所在位置,which python3.11 sysMethod.testModule(["reconnecting-websocket", "ws", "http-proxy-middleware"], { install: true }); if (!sysMethod.testModule(["reconnecting-websocket", "ws", "http-proxy-middleware"])) { throw Error("安装依赖失败"); } import { spawn } from "child_process"; sysMethod.createStartupCompletionHook("python", async () => { console.log("-py 启动python插件加载器..."); try { const proc = spawn(python_bin, ["-u", `${file_dir}/__init__.py`], { env: { ...process.env, BNCR_PYTHON_PORT1: port1.toString(), BNCR_PYTHON_PORT2: port2.toString(), }, }); proc.stdout.pipe(process.stdout); proc.stderr.pipe(process.stderr); } catch (e) {console.log(`-py ${e}`)} await sysMethod.sleep(5); init(); }); /** Code Encryption Block[419fd178b7a37c9eae7b7426c4a0420368961269dfbf3ceae4a71f2c083773b92d5eda6933d01b4b1dd5b024acbfde8641b8c4d441beafe2db82dde29b6231a61b93e8593737c09a83343339549fd3bb6cf24f01c7ad1ca9a2c34d78249d93fc03fc3e9abef16fc008512cfb02e195ee1ac3113a601f0f92b056f70b5a8df72435f26d321ebe1a55fd7ef120cc71d5d691ca546e3ee5617a59e094b8cc8cbd2e748a8abe623af575365684093a94fa652b3811054c65c487c8cd1832804e3e17b6b80c6903e98f3289dc9aa7855113ba9f7d7ce0b3ebfa3169880de7b21bb813e4f99f01c37c69dcf25f346aaff4a234674fac27e7b403f6c3b7592e4f53bffcaf58416b555b575fa50ce082ff1367b773adfb551c7d3a4a895fdbef3de54124d75bfe305e1c1a9d4612cd5eeab310eaeb8ec051e7e37675109ecfdf06ea1dbab6136b98600f8b777abb72f6c95bc5aee53f3ad4cde72a56bfdd58b42060cbd03703ad7261e11938d3e0577320d4e6b05c1797cbdefaf57fccd4582a50f0f66edfac0a95890d16b5362763847c4ff39fd89b4738ae6e52b8567d0842586a14441cf59d9d85e67da77a1cfe58b5a154124c706ec5e03227202fb293550b14a54ad76c01c4251e9fd04eb55314ae4b2376dd93535d3973b7014686928d5b4aab1e6c49d097710d24221c91da71e8ec43fb452e7ce4b8bcd185e25233265b42786f2ae21e5ceb3592a95f0ca99efca84f6a31396e47796346cfd40eb8699c64f81dae0865f15f0588132d9bba4d4c9005c8719e58e395e3999009b3d24a2abee5758dd2d5de87acd4e483a3acf71a026f8a3e0e9a88bc10ac51e2cff798f2c169ca7743425cfce5ccf0123a1091a034dc6da3165d785ce549a8b7fc788215b87f3ff2f7e37b9078f9fde6b13c2f7b800790c826dfc1d194c00da49c82631fc2083e0b0a3abd2ff7e3946b2bd9f505d87b7c2929fc75a0804a60d9f607f11be900e621d585d61bccd8480a0293b0ce5b5d9511ba0b981f8b4e14f32090979a531052f2e37a98c39a4fc9c08c5bff21c3bf4c4dd7eb2f5faeab949b8d9480d5734d8a289a05069a6ff0776b47484441bb199478d13601b721f8d5fc220e7ba98accbf9d2bc4bdb378432e1d5603ed22cbf80a735a01ae63f83f7c629f6315b7d1f1ed51c4694ae46e66de97cdfc2b5844bb189ce99b971a755ba03b0996a0e6664d532b6a23f2a6dd649034202283c5a3f94896e09ccdc06ba953425ba6b2ba5f7f7fc8ac343d1f555c81e21c4960fcffbbf84297eb298e9a6d66b532ee0989a8f88c188b8598d54ab964df67bc6f8cc87520162025af8a0ea5383bd2c2c560851bd7f99a82b939dda2015b018124a9147a8c846501b4629e76f181ea6a47163b1af7ea0083c257c8dff1a590f4cc2fb17c0a1c3062dd174f3c06cca37ca02f49f45339e8f47e3c26bc6f3152c06999888e79444069141588c0747a3b83994c729a578dae5f4f342e14c6a2a0882376e3a242fd381b3dc3f45171ac1bcbc5479e21e808c0fe6defd405e1339bf2bcc113ba435e9cf098011a42c2b2a65a4cc485f379efc832a78df52f2aea10f6edee8b68c1e298f031998fd6029c0701bb3da516c653baa2abfebadd9cf16a2bf8b988d7f1c0adc8878f51d22d8ba27d0e26baf7146c9cd21caa88ac91775e1b886a9a07c8f778a6d60a9baa69724a702c72f2025a49600eb0ed2facf5e3a8eb98074f993e4036fbd03a48e90254c77aec12835d460f52ef3e8781df2bd541be14eb88d5c319d41095f853e46ccbbfc228216ff574b4a1e5a784aeff61372cd6a26eb985d7e1df56c099ed38df13231e78fe21e59539feb415db4a7e9b984a7c908bd4f81f86238893eab65c5744be439d6f9e03731e9b1838460f7e8bf2fef9636d0a2815a9f757e3426d8924c9c07fb8816200806592c35bb9b62e0080a5641ab477e20dd184b76b9d448162df12ec81c7a63e5a5ec884e0e5ebb6880b9f3488fa53338375bf79d5ab84044a54712991593dfd3506fbe81869633ed95c4b110484d26d06dd4594bb9c99b8e0d4280623799817180f47733f87e0509784a6b1cf9852a49655adf194fa7416d545fd97f182da1143264b263780ab81aae5565a990da12173ff32ea8e3da3d90d1fa9d22898551a9eac436ce3e700b9b5e18f2f4d342e224387eec4e017acacc8ed817f2714dc6b703f9efe1d8d8c149e4acd74fbcc9a592be7afd49abc2adf0f94254b18e3fe3a50381a9df2b147c2c40ad34b7cd97d547d65725832857f9868f88295115d8f6c82762364b4c918eeaae1d742e10c5ac27fa208ceba57e37231471841da97774e0ca267b31c4e347b44d6ff8239b2fcbf538c467e9e4bf67c52addf4dd43b0ebc9dc125806223c955995707d3544078d410ee115cb2b66b81eeeb7b2c8ecd29490505f87caeb7cd66c66be2bbe375fc533301aed013040f1fd4ed297b104abea0ace0234dfd756101bcafe393be16661a5f80b40f55d70e5d87fb9c0f78a57d244bae9fa9de632990c208562a25206fb7c288c00e93115a5b21390bc7ace15484a3966321d3aaf7965a4122ab73c0b1543ec51e5893dd37340fc31ed6b6ac8d73f9a750f313c039469629075f4a23f714f5cd670aef559f45a37dabe3c9e14662b2bd18eaca30a2c0d2048c66e9962f4b0158306462b8fa403124ec26c1d93c92616f6e1f8ce7f72ff05b23ca9f0bdf8fe42787759c42b39661699309139a886022e4c02d1e37912b82f47af381e6a5e98803236a76e819fded1a5f012688d4c56ff67fb4ba76c196047dc29e62de5a01fc45491ca0f4a70fec63ae2031a2d2fa8e28a2d97174256ee2ec19a42aa1deea66ac7454c4e09efd1e881da92abc0dab5c1bb775a4c6dea28dcdb3b633622f6b406893702f39ea44ccb4e5a4252c24150008070d4bb155bf3db6109d8b4e1fbfda16b43013eaa7dfed54adca8f116e84a9f58c3180ab6405c8e8b215436743faed4e10a0b88767a4d080d8ed1008e88cf12f4fcc4f596d5e8ab5f9409ae068eb7a86bd4df724bd82438792f5e553f90736d7405436fd59201cb21afed2f9715fb0126f41a842feb92b2f42a21b1f0601de3fafd3ee88cfedab565d5ee9a5f80a63c39600fae66b93a42a20cc1420ea3e8f004f98516f2e71399f4730f8cdf880789ec9a8309c2e844ad9d9bf7f857e6e64f18dda9621428e4f94e317e14bb8413d9544fa016a9842377af9e7370839381ffdd23912a596659361d0cea670f320aa048576b5bcb9f334c5431836962d9c2621e3aa2f9f89a7fc8192eff6c6d44976a45a9b16042ecbbafaeb4e2736cd23d983bb52d561dc2d9e29766cd8b888cd55c6be83ef5fb9cd4a2d13e02266fb52e8aa7816591c2ea9cbc4c85bb44a60218878dcf1d21d9c9abbb0cf8b705a7112ec0c64d7876d6595f25910b853ccfce02659a193b8a319a0ff31190a4231bdc80d0b938332acbac9514e0324960ddb27c0ba12799353b44d3ace9ac8fbe377c7a77568db2278ef419f521e89c422026f4d37ce3d8e84d4178489693324bb51db0736ff9fedb661871d6d1a850a513fc5a96a0e4bee510095ac1cc8d4900e76d4482107091eb1c0f3fe407059a16f6f5acc9173e00965797c01a8cfb3411160ccff116a44eddfa2cd9deb263e350dc9bb4d7660a90efc4361d527c4bd5e134965074b6bb09e6fffccd22e98fd3a193c75bad49d7fc14987d1935e028adb2fbc6de6e217598a1a83cc2d05b39c50695eeceae8d11a340894e80eb30c84d84689f3be8b9b4feba73b67fc87dcabc3d9bd9b9c4090d91386478791cf5c2382d21ebceedd568e00a023ffb5eb96aa35634fc04fc78ca4c0092e1bae7a4fd1fcf96ae3131c9c2cfa060121053d4f5d98d81a29d7b4546dedc36d0ce7187cec26f5a6056d1f16e046d3b943194a8276bf8a75437da15a5a4e74533d0b6544345a116372a8e7175f4c5e5b3605c24087ea852c778b21d6e70d3f996c22f065c4242b136038bcad47da8fa5359f3cf838ad0185c144d77b15743e74871c2bad73dc0e7cc0a7cc7c6b9570898ac32dc44658e05e4f13b6e5c49f522664629027057e9509f86b664ac543ba2bace70383da78203531eb1f873af0a7d95a470907270c12447aa21a57aff2ebf3e58b092624b765b2fc90dbde03177c967c4aa890256b6f4917d6219e014d93aed38b49ec3d3fee2c1287dd8c10b46c53710e7c900221addb2975e015a3971c95c96d2e242000fc3631d9c879e3ebc77d9e74b3e33eee96656c95238dc3234841ea00396f634ebaf01840fdde99b5290d4d4e03bf96cff1483fd7f42a3a0271c02a85523fc5dcc0e01f27a473b5a4ff5a5c5fca76a1c754ab887a104146972cec56bc484d4020fb1b8162575ddb1b95fd28e719aea1ddcafa1b8914718ec66bdc783cb3c4298792ced78fe6d147495eecb6fae3ee0bf5b03f362c4b4fdd9384c45b92b83332f62fdff5377380a944bbfc3372dc58e482451d919bf44017bd2e3cda9fb0228a0db257507373dcd3e9d720d530e114f4ad98a5da5455f34e21b58a64d1a8af93f0f7048683468d1adae0492adc9aa47b58ded5c966099ea3c1434d3c07dab10793ec8cd4e53f0b79ba8b693b98d850984e170bc66c10fa66de7f820ecd36d75d57bffdacc6dfc8e5017959565233818d29095cbc1b8ef32f7eb5f2554b53357c10193a8b2833e1f237ad399a90206fc956f23871fa7e46cf9fe7867b2129771199b8d10ff6d165745200023cbcfe786d0c2de57115b0acb37812d765af739d91142c67b0798b8df1b0cb0f7749b11f55bfb2bc341e4b9eaf38235d1c10fcf533194d384f6277eb1670b23f9d636dd6ec2e56f37236586bcd9247c0a8dd8417bd3d476954194ad4729eb4790908715951f570c000bc26813039b5bfe280925f00b9a81a3cbb3118fb7c377e60ce1329b12b150fff138a0b9eb1faa7ebe6b9fcb80a3486aba16bb7c059dcab02fa32fe51db6c8272b78c38b5377d3ceb27ca072bdcabb8c7fc88ee57fc5290a221969646032368073c54a99d2d6baa58c05844d673635d41a8b8cb4c47d6d77700ef34a64ff7aaa120ad61ddb679e1e3a4487b049ae143610daaa6725ae19d0818fba7975db7b4a20102a432bdffc36aaeae22c73a07ecbb12e10190cbff5ca8792977df0ef4d3fdc3a8e5ac5a857dcec5b951c10db4c7ae674161c80208b5ef65357aa21ad0f27a2377b7744daa96194b4bd16304e8fed6561e2064382d852f44b6dc541f631955f8a6d246aa74fd372e143b7ee39f6abf7cfc921013079434bacc2194af0bd29099115996b2bb90e67921f1567d3665acfb8a4f9cf09122ba0492b704d60c50f910ba3747e3f45fa8149be332a4197308ac51e89a5d21c387c2aa07d1e720aacc6bb65411112b866c521bdd7fff272c958fd5b645f0c3638fbbd871ef3568327ad72a8f8c85b66b834787961696584c08f180ed6930fbd25df53aeb5b919bfbb943e039479f360fa2fb4b2444e72531ef21673204075a6566cb71d41e628a12c94b3a9df1a041ab5da3ed5e18bdf977c83f48d340ff023c3962ce7e96a6c6465f3f3bba90c444e87e1d97106aa2bdaf526710fd4e5910e7a62405729857aac1e93be9c86d9a31acf3352fc591faef5342f2348f6f457e3f91669eecfa48f5b675aea13200cab4aac7ea2e7a84f42f66ac999edf10970720588e792a0d936a3740a6e563603166a4d5e3042ad6921f93f7381cd7ba7beffac7bdf8f359d71a33c5dd81d3a4d0e6807caa250604c2f36acaf4922726a4a912332c6f822801ca2076753b29d79614d0c118d14df3b048bfe41bc2a0cc6068579e22448de1b05bce0a39d89367408cd465fabce1450b326d4d08ad2e823b600802b0b612484ad853bb02639e621180ac885d576bd233b3ea0cc7584ae8530597fc985a2053ed0a96df4370ddbdfd77dd6c2593d6aea8b19ae6611629242fcc7f89ea7a4de7aee1cb42dd3759ea8ddb7d160c1200bafba33021049de181b0b1b77ff8e357ccccaccaba0d370634162e12cdb4e4c4298825052174b9d811074e812909fdd081d45eefff954393499d41b0002a12d80857080cadd1f903767befa07b46eda1a7822e59c780433319c5f4aa3855a205a488f25f02414d796b2ebefafeae6f150c4be65cd51b2d16d33d297936b63025515ade329bd4c3b2bfbf0f279442355bcdf0a531271c07162fb760a5991dbf685bd5dc86ae96777cf1e82cbdacbb82a9bd4c44eb5ba0632f9ac9804f48fcd5dbe92178845f15f63195a00bc519141985f72d2d97756fa8491c147092f0c54ef06c06a480c5e9de9046cad42d1e81909b1ab72285b5c8157992a6e98a3c1d6d8e1a175d52cc80ed95ef7bac99fa9c14eb087cfbe1411b7f2247b6b420e81838ceac3fe9d29cf40b3139ccb8c2f5ff467b33a1ed4c8c327ec72a67ba28f51d238a4abe41f17d6a584633bf2d9660051c4c53310391dd7ec6c099e2fdb344720192c039b0439f9184b753fd3ef89ae90e497c79908249647f4dc15e44ac4d50e6b55680effa15f7db16f395c55a7559dbfeb6342889cfe3270c82c48189d1a52e58d7fefbe209ed41814334982f33cee55bcdad3c12e7b4caf275830b5fb6d0e48ea47f4e21bd9b60a093dc81df0bfe89ac0b26f868d5d353fddec99e4be6196b54c4d712a417e331e775090717f205f4d460f1db6170a84a4ca0af08521e31f1777299403b66384459e2e99672580e50e8d1e6fb6fdcd9de885ee1ac0ed6f76544e1795e0b46414ed860009fcf8baae56b28237a1fa4973b58e1f96c2ab9e89887405b6a9568ed735ba01ea97d346569fc974b19a96584876d51ef3186f6694b0b8b6a08dbec34f455b382cdd10888f37e088c8479da97ebf371ad4978771467b4270a81600cbd74c90a6d01ac66e0ad94b91fea9505ff94cf9d5646cda9fdef470f7da50383e30fb80c80b0155c70d677eb63d557aa6de77b7d962416a9d86912669e76e6c64e042a65d14536ce8d67c9b2e76a086a3d5fcfff588641adef4c8004b254b372ae6039e00b0d77d53231ffcdba3697bc787a5c38111f3c661fbb90cecb8b090d995d44a3b351853cb227036d01219bfcabba4a974b2872630108f3a16edca4a9f16a49c1ed1e4475443759adce8bacae61f5e3c64947bbbbd80d1164445d21f1712da76c7289a16b9b2aa3cd5abf65031622935c0b6a96d5eb3110c0eeb29822e856dcc3d320b19e2c6db3dd52ec6ea25d3a34a33fa6b70b04b9a16f89b5ce918a5d79c4ee595a749f790ac60b4ba8f532a2bfe8c69dfd85035620b2f67e5f43254cc301428813345cd05aa0329f6b7d8b10f8b7867c38bd62cade3067525f9ec56c9778f136e94b4392acdb6488240d265910fa782262394a63f2d07541a844e73c4cc8658554d0dab2f9f28deef41a581d52d0ebb68f2a144d191a04f1cfb0981797b7bf1d81f74243c1ad60ade92d772bcfa413c52f1d1314df2690b24135d4b3d6067d680c135f713f7fa3ccbfb319f25d3cef278ecce6e6703df552731344290c06ff5aed1db44003f147bb10925778dc36d757752c4be35b737eb70b2a26e56c684800114b2081d217f595cf4a142f1aae544414db1d70d41fbcbece06fff04e4ee6c91b4812cffa849187f8c647b46a6485813704dd1f9efefcc67c53e90636944e80a2b43525a4cbd072c0e57f48b71403a6edea5c02827ea7e30121c00acb1cb948d3890bcb021f3521e69125ed8239934ec78eaf06e4ccd4b6ddbba33699669b5c1a47fd4eda898231dbab6f4d3a0c0b7a93e9f948f5b7ab3c2772d660ed43a5f6a03db1588b65fc85fef6d4d3ae155dea293f8b65347f5ebb4e02bd3ba2720933f93d9ba25ce760337e018e86630a8c1438dd510f90bd087a7ba5f6aebd2ab683a90667c8866478f664d4d5fc1f28369c540d0d17d54995c7dec1f94c2970f85bb50d976b83ecc641cee7cd5549c50469b86b1c6bd6f6678cb091dad4a598b468334745206cb14471bc247fcbced55a4e14c0700e72ff3f494f5c4fa336522b7e568d072f822b31035eb25ac1b5b83980dd6396aff6da3c3073dcf64a6154df85538681707c3dd0c47cb3b22fe958ef4221a517c7a83a3c16580c097445f7e408c4eccec82d8a8906c11ccfdc187ad027bfbae1bd9c4784c4f966853fcf60242d17c50f85e3ef6844aec6e2a80367eb2a922e1adea059b1c155ae365911dd543c168a083c716ec9c9992c856c76b049e81639a70489ea49174586752388b311bf626dd04bdc72a0294230acfa68c9723c614f6f041dd55ce59f1addffda7eb4326e971807495e18fccb764558e1979766e163b5cce7a60d938148c484a543d63fa764e19135f204252276e2cba0bb88e406493bc8fc7f2638c3f278642f9cd0a3c7c6304a6015d3310351896048b9c7e6c77cbe991e18b73b87f93d1c590867ce70209dcb92507922f51b6823f68522e4a1da427524ec37467c918cc330f131508be745c3e693e04070a78961cf72e13eb8d6cc098ae58f333cb6006b1e72fd9bcfaa5f31d4671d8ca615f3db034f72afa1f91ca511ef566701fc922d59e8b13161379dff12b068c50cc16d88a51dc1c8b5bf2479ad0ff0c6a4ea9855284504d108da3c67c153df14dfae7a46313fe1282dd0eb32dd4bed7bef7c2e86fff6d608805244d1a0884997569e8fc6868016b5218b29c1a26fa8c007ac216dfa1d83838009964ab6d6b5b818098e3c874afb6945ed9035eeb1613872b4eaaca4a2f51b7740dac8ee39383a5db4d2645fde3975e32369d249c740372714643bbc57d6622f8198efb7267163fc77e4bd0d809620382fe4ff42d38a936280c9c1ae2f3f8ff9f49228b426bc04f10c9783474a472830bf4e8606bb90994ddfe9ee1d27c2eae9317d34a6bd3ef67fd87515dc2d62a266d66ff287ad4de2950fb48791ef19a558a9a3d0fb5a641070d445ddcb4c98b786e54e08a2ac305485058fb5f7a4d4ac0bd7a9d05b01054ca989f724a78207a6c0482bbb521605a551f448a221c1010f32ce57e93bedaacc7d6848634e86f5361337537754728e0224ebe31e83343145708c6d548a40ea904e8c6be9190f86d5672eca4db713cb63d0f5c286c7e3c57b2d5bf8ef06b912e084d289a9201b13175d89e507ca1630373464392e7f7a3690ec7f11161bc483aa65560659e9f6796f41dbd53c463bed2a0ea06e11ca5fad0082e640e2f1244593339f0d258a3e39072007ddb201db96788bdd0a35c7c927dd204d739c0ca83dee9f21a023492447c05cfe427ff975709fc56c7d75f6b1d06db958117cd53aa279553724f03cd5cdddfd46332d260bc877ab228f77fea8487d8a1cd703de96e1f37c052d87d2aa1262bf2e346f7a03b0f1426cc4895ed9261eddc5049ad76fe9765bb983bf9837e585511b9141090026cb60526d13fff88de26569f3f1b02e80de8268f221880aacc33ae0093cf454db4f1385bc59deda9fc198f76f1c03f2ea92bdb95760127a43cdfd14279e25ab94596e980453e42d5ce32d176addf940e4d3ff0afc11037b2ce551ac8393802ee5758d0a76963d207a96130b99f0c88277b6287dae19435dadc9a4c9624e590d5b06b071ef2a360bfbb2f1ca0b73dcd0ce5f39910d701231abc24c741414d3b3e0532761478a913ad79934770dc3148dbd5a84f6f7467f0d5d2322c9ad619e3de74125a1c2c847d231bde4ca9445dfce619eda0be7d6492ee37d2e3655017c812b2a44014f1f0935204148854b20ff6790f7e02f4a1e06ce81e51fb6b620ac60ad4a567606eb8e8fe76c4cc0e604b9ca983bc12d53e2e7f70755e6eb9362c1e45677e60dd143f4229906cdb62f6e10422fbdb563e1f03ef37d3ba11016040ac77e0cea00664122f125300e11abb88fb5a1add60e23ac2df0ef96c984156e04dd7bdb1d0077f366525eee084ce1918e75d91f547fe0c5da514130899476a9bc93e536b3bb6bcf6bcfe816da563f15956dea5fac0359ccba2826449fa184913c48caf940cd25782b9220074eb5d2abf45edfa234bc05021cef1201a38717c65f85f14836138102c76291f8864514cd9931afc04d6e27c4841cba5aede5cfa8e51cf4824581112344bb88eef6a3413d994e94e689fa4ae4e4141e8a9bfe0a43d3f986bd3ce369852c27dae93b18d547541c8318429dbbf6251089d8a72dc2889746ccdafe480fb5ee332dd434aef990bc4b9bc687455cd45b039bfef8ce22c72f3c36a2ad8d5df88ccbc4d1ecf6caf87bc8b34027ca3b14c117823d8548d3405fce7f676f809898ec967ce87bb7b1fa1007c4f6deaf81057e08efa44680fd0d9950de9474264444efe8ad055304b936f616ca28bfc6b4a9979691df593c6384428387a48868e1e58a6c4721165f13f30e37c81f85a9595708cda032c33e877136f6074c519d1019e8ba763333ae1b1b159eb43bbc68bb7dc0f847d324c3ddccfce114b962481eae1b23c102437567fd43653b1e9190cb56f64b0c47b722c36f349d9fb16f8b72d2082b501f0d3fa7df3a91dbd38c4bf3afd7693002fad320732968ca86fb2bac3fbc81df953145f6aa1a6798ec6c3eb3f4b2c61cf52abe02536da7f6ec939e4aca4514fcf0ccfdfa84e2c1399beefe9434dadc086b266e311f9629907b28d13561a930bb19490ac081cd6006ef3bd255ebc7bc093378554588d61acc15af79d467aa387cb74e69397be6d6bfca2c1921aab12f65ff6766caed4c735d09b31c6025a4a575dddf55ebbff585e3ae9ddd45799acb576b4fbe00d128e70c5d13609e516ec3072ae085e606ec1d25c5716da40f55d555e047d95d117d12542e5e09b3284dd18c77b5c379079d63680e264765f8c0e9fe1a930a3629624b93e88f47d275d54c0d7b87cad29af445a8867919e506012ecebab62dc1885aa1f4e922deae5ce8760c1688e6c0e11c514dc66a11b97e4a0e408ac719e5bac0c7a482da85303fab20f9e6ba8c45cd71ff6e3a8f705ad57a62f62d19ce3d33500739ff28a5ca7663e833155b42b14c77fb355f1f932ee5b0e9cb0c80a61b41df211e60a1d35d0c57dcfabff44458c9ab87487d9d663f4096f395995e37151d5e655de2d5f3b0677242d10d1278bc68735d5fd7ec295e0164095a0a684472266cd1121a1fceccf8878a20cda066fc018f232f06b0c580b86e5a406207bef3a81867c61025f87ab0306da974878b7d2c9337be65692d9aaa93d49655a75bae1b68a348c7735e4138901799c0e9f71bb5e006787afcb443e286d511bbba13b45dc5148feae82cde792cc2ae96f1e632a8b8c50c256fde119daa02365fa0d54bdb214fa67f400413b7af413b1a72a651ea6599caa3483fc2ae76a6db2fcfd36d1dc6e43dc3fe42e3b8417ca59b693a9ac858680d2c720c48b351eb1bf1ce2d77855da58d80605034ffa1ddf34652d80b693d93a7af2afcb3b2c146add2fb8fd8e834e2fa8238a82fb49c0817b0b1780c0a0c57b9a8a857f32d1bab597122c4a70df822d45aba293327c04be6f1804609977bf8b417bfdf4d7ac768024197a4bc28d13141d2f9eafe0605a2510788c265805e6771effaaab7c6f01ac453619d66160a3f9afe32c3a59e6c239a8331673a5040597be7e7ea9f703fb4ef4a199022f133da0f04dfa685cd37604af22ad4edc4fa800bd6005900d046beb94eef83a9225b0a9f834e3e744b89ba43336316850d26e420261d13d217c3344cec63f2bd865571e0fa221f1cefab950f9a38689e7743fd6df8e3e4ddfc3e943cfb43330cb5a5044fa9ee6d31bdbe7ba8741cb843b2b1db3de314f2f22ceb32144c7e7b9bee41f13b9d6745fbde4a29d9bacf55a7eb86e6343c4f2ef70dc4f4af22df2bde3b21ef52870a2f969df2d7566e69709bc592ed9fbb4e674fdebce80c2f79b50707a9ba1f54a692276005fef6969517bb11ea7aab97f28b994e15c8c4a05bf911e541c1759512058b3bef4ee9f1a5a2f301c672c8efc8fee662e3b45703aeca8e59b07624232a5fe501e38310c4660e86f4fec15a5a2a8f5662b7ffb664bd3fe018585e8e475fb6c01bb6298a2f348c992e922936e5a4b52d5434680b7ba902cb855a62bbf1f9093f52b6a566f1dac34c039aa43224aa76babe85c0624dd767c7d7145d266be4fb6d6c1d6b9593f697a0cc1c6bfc789c1df58aad0dd59e9717eb92c51ef43a528e798d7e61f07278120f1702e74d898ca11862ead0f50aaccbdc1a6403f15e46799a9b4c232739d960f6b6b94abb9bd5a8aba91ff9ba9d6ca07b9523a58c0dd0a78e3ab31005ece33ef7cb2c1e45b149c59b82e42e5c564f800be4cd45ef08e30689edf3ae74d1add820b06a0285d0b185659387b94815f0c57f63548d12fe22a19f2a1f3bb206514c7fda22ed1d0cba1a3f8a1f43b6a4c88001a1e781542a137bbbbb90a742e11c9d4c2958e81e4c08e4a1cd26a518a26158216c0114568cddef1eeb98bb3903d65e6bad7a955b2e4df813c09be9756609eeb2419f5acb8d746491ee40747daf2fce83fa5d0c138a70798a3697fce9a96a48b72919ae486d01e0a6883874579bdc671d05c1b70291a7e24e8ecd474a34c6ba2ea08b3008ce9f8a997efbb04556d2a9b943bdd97c1cb1e696638b533bcdf77512f9282292ac1526e19cf5d0c3f3d5cad2209789777a8c7a8d2537b1fe4fa9d0bae6d495afd80845ad0e722e2cd59aa0dedc71c6ec4adde77f1e1c73ca10317a41d51c8165eba7ba5aac311db5e42bb25fee81b9bbf0de29a2eb8e95aeddc3cafb00d60733440d70571e3578a69265f2529d6be456a9c2bdd547251242c2d0fc1d0356ccd13dcfa6595ac495fba45d1f8b83b287b4811b219b92eaadb37c7f0bd079af667df2cefb3583c6a6f1630383945adde3fcc40dfc50189f08ddea0ddba20980be51415c348dffd04ee6f5d13e5018b8fb654ef2d10950544a0f1007dc4b09ac8ce5570657b77778865e2d86b12047d1a931ea5e429d90be2660c6e76723854d8d2ea9358b8d3124ef82d7f9f9f311658f25cbfcdffa0c00117656ae3a93af1f6cf8c7ec637f0bf0ee12eddbc74cf6e077a3c35a16a0de8c6edbc71ecb5cc33d32ef0dc6c2226da9ba050a01738e5e61ac17990c852dc0ece26b412ce595a56bb0cd86471de5f670bb0eb98b3ab5a453552ec6dd14079e6f23655a40f76035c2ac5ba6234089e723802208c62f7662fdd1a7c63798a8bc7df6fa01b7027c5fb5e3a8fe153a3ef07bacfe7c13ab4caf85523d71cf43807bec1d2c55043b2b457673b0f4d9b6ebb425c820c0fb24557adff9abc147cabd71fb62ea790964a2f7dbb32df5fbd16d5106968acfd1a06147f729c64b672a4b5689c7fd951249ee4d2ff0ca54912eb978d823738bf6a9d13f2ecba386056f1f5908891a8cbd324bffd6bf8d9c8ecf076d97a56e9d60bcb539406150c0d8539956779099b89025a42219a927323fffb452cdd262316b33c078ab1ee828c7d5ff7a9b7e4d7b9e35008dc8201ac3380f6d10eb714ee69639ef321b73ff329d017c232c0949deb6162fe3f005579ff844af236ff3e3cdcdf3a03eac9febd3ad51ca38b62295643adcf19b30f60ed9df8f3059c81d041a2da9f6d64378b00d435eb08443709546b536196d86d5a8ecc54c63b67dc5dfe10ef5d4c868866d4891a3e8662b0ea2841aee17924eb3c0f519e66de2ebd5200106b190d650b0cd58fe5927a0142fe0bdaa907e35902117123ab2cc364632cd89db9466ded73a9ce5afa25c0e691351dcf432a18b96ba65e59b584ca82b11cbe9ad7f7aee2e92e9f6f7e7e050527cb5be876b564c9d57ab78ec70163d26f546b2c2b8e24880be14b8e66b86d0382688ca2d89679c678f83fa1d4c77b58273d503b35841ae5e484eb34413987939a7eca20766fbe0f809f853e0a35e9687faa77c2804b5a4f3c71cf1667088d3b4f01f61f1bc924589d094d704fdf417ff8ace2f6adf12c4c1afc33c79ed3ec18736a35e9b8998aa00a1d773176869afce504bfcca04ed377f283c9cff5457cfd302ff1ea574853c6bfd46c2f241a0692d5591f53c0a8068dabb43da7563646e3177f479013a7ed2d89d1c6db50c2af0040465437b72779b31dd412b7761f52cc21fb7912c9d7ab1389deb58b0936a039f5f51980987d94f20d0759f9ea0697b7cfdf3fcccd598aa499fbd6a239a96bea6c496a370e6f75d89f80bb9ba87c68c569d85d5532e4498114f2b5a8159c5b9b1481c4dfc62cea31780359d6460cf2646f45f47c35108bb5e405ba0a7c51b95216c6bca5bf7b4718f11a16e7144854750868e09008ca7edab417aad9f6601777422317c6064dc36559a1b237e44d6fe97a4d5aeea95f2f8d177627a1629c13074e5ee7631450118a83b984d5c4fe93bbdb167cd8c1db77540babf8ffdfc86c365e577e7179caecb3131cc02b948623e648e51a21aaf6249617a7926a036cffddb3b9591bb0bc74db776462aee11261dfa99170464809823465d589773ad24f004186e4fec917af36a87c88cd4b63415811448350f80cd5e7c539c6e5cb870387129c4ebbed482a553a20827c994884b694896b3ed6ee3282e09b7c73a724ffcaf1b758ef62dfcfd20d4d17bd58ac24b9a3379638a748669a4b661e90ae89870caecd68ecfcb9a7c6880064bc5b6a53528aed779cd92b8f6e80eeccab9eed5f9f0b83e626cd1369f4be49efbe070a348cf6d8bc36d518a88494f25a514d65903762d2fe67fb702c29618c8f9d40b6c51b279527afe527a62e36b04aeebfc4acb0b27db56045bcfa7a9ed6c10b82da26e7806e5881273c902856d224e6b442eab78e0c0b098d5e538caeea6671feaabd2d8cee23d1b93d6da1088fede84c80a36b9753617988952284beadb05c1410b935268e273f77d12726978c75dad367d1129a3827b63822e34a6d91eb73ff920eb9e64e3166fe8cc94bdd7004309b4739c55c461a2515455e073c64f2c043d02b3ed27b01ab2a585cd5b5033be5e0fb7b2911ab7e660c11f4cf34baa631c764c54bd61edac3154da2e000fe7223e50b863ab8733564f15c38e3b1b50172f13dd4bf72b3d4b7a8e7d4e736df86edc461aa0f9848453220592b65529463a4e39b4fed036e961154273891c311ebaeda5c7416c043df51677915e2ab6871c41053da88c24690a81617a7d77915bfe7e68e5de37ab37f4cbbc7fd8eacede05102116af188c6fea23208da9b7ba18d802b3dd79a9c414cb239c94120ff806238e0e0f1d16efdd1da8cb7ce7bf0fe8ea95bd830b1bb9f17f292b8fd5a9a49906c10aeeeae40a45f78394830b82d096cd78aed1fecfd894f17355697de36a5393b98b84cb7a63c96ed5bae14562c8b24e7d05cb9798e5faa2a9aa93f994ddb5bc42ba2c1526015f8a05a92b524ae89639362f420fddb7764865ba1937536ea76ac78aa8f730889a7697faacda7740ac2647261ed6d21033d67b115c2487693004df0d42b4e89bf155a9f7fe396daf32561a9a443ae0412d1492de9ca89a8c9504ca0d64bab40309c7059ea92ba4bbb77427eb80891012fffea1f42a0d8c91b24e6d2e2872c6d82f885cddc23abf1bc9247e5e4af3fabd847a779b6ffdfd0e5eef32b9d9348e62d83ec02a8bcaec070ae0c65f64f981507b0e83c79b94eb624fb9108a8a3970372363a9891f3784dd1eeba2352f5668a651fd6cb6e405281065b33ad10efda47908689897f5c74f1742f2b966d868e37fc2ceec4369d7861348aa93789c063f7fd8fc47f5b0637b198a1ccc578884161bebd674e1ff9b62486cc994e8f28faa4250a7922531d68dc23749535191de67f55411c50e36568ef60f116a1ce3e7d1460d5cf307d1acbc6bc7cbdf333a4d45c24f9d47ae26431a3b5a37b97108cb2913290c8f6d265178c6ec964d959f12b141a5ebd054062dd27f5d973e8dc05601d48b52e98a1acae79ca131a47acf4f25bac728d2956cb089b00b89d8e0e50a0c622224b25d8f4e5a549cc2743c3ed3ea58127d8187dd6d693ca1cf38ce956a650dabe29501a1dd8fb5e4ffdb7a2215422978c513f76e47b887c9f21178fc2f401807754c0c883718a25988de57ea4694c27b81c22d38c5272727fb8eacf724c148e81c62d1f35771cf736b603ea7e3b14f3450b8314a2d10e3998191e49c1134b0fceec42fad89f837b3eab171aacef512d3469cc567e55820de9d54a210198706da63e8d0327d65b70f0498f2219da82c2aed4d1166f671e3875fdd7fa977c0ebeff92458ab6dfb54c00fe6620e657d83a0c8fc5253c8174c93fe5cfa1c791f2cdedf906313ba7e3e5b874da22ce3664c467e055e3f80ad57c50e7a398380fa38e08e2af02962f80f96892b21a5bb450eaced3915909243857d035791a60d3f86a5144b7253497d8a36b6411a34ff5e757c2d01d12b8bf15c08dcd18b5151e78d32a75b5ddeaa6141dfb66c71684f963323ff3458e4dfaf0a28629b69234a71be51b76a973db83602681975bbba7434f41856604fe7383579d5a96f665db7fcc72e4bb73ae985358476e1562cebe1fce69f351a915a430057a21c6e0377273363328f404ae1b3bd4dd27eddc83b4818d3df32d4853c43a054b1ccdb12637ee340955acc59add870f5b25282575e8b83c9d65dea552f835f33da7435867b18ad1995f5bcd9798d8c42c5fcabbc5d8e66bf10556605a846cf4c8ae94ecb1b7d012ae6e7678bbbb3f854731196e1988b85b7761eaf4c631dc4a6d005c090617077f711be6123771c55c1b1351daef23a32eb14daf38e0cdf268d3beb9accd8f01a414fdb7c06eb9c7f5519386bd1846b0ab5e1010e137767e070aff09022c2c90782997911a90a16b84379645f87dd8b291970b0977b5af68ac05b9273523b1a7bda18122587678447ca1588b699eb91b01f33fb22f9df23f4614bccd80cf9bbd8d0d389fdc2ab64a85ffb5ae27d6b0a71651c58af307cec8514ba46075b147ddd082b4f63002ad324d5d9ece2aa8af486264c0227c6a1044871cafa8f112df3c6fd01ebe5c06bccb8b4e031d2110bc14326aa4325b70ac574f48382ced43e7d5619f3a6844d1106b8e9de0a66d533b882ba2ce976d9ee9ebc69f0fe93c6477baaf3ecbcd254cbe9360d09e676dc0adc134cde8a2cdde557ecf2b55343d8dcb4a3d814f9f7428861fe1056d3600701b036e82755a94ba51fdd3ad01ea3b85687691d407bbf3df9e04736f512fce7fa5a372fdc441ce9f2902b8050e63ae6c9b6aed0a6f15c5810419117f5d279551e685054e92d3e50c2be7ebf617bc490258a6204cbe66e3e5fbb2432d1185fd91236eeb0912391b307cb925f9c05904fbd7087aaef32a19c61aa33b177d396e60fdd97113d9f79dd4c14bd4b0c1cf8762b6b590bef1f114cb66be479fcb7bb68ff9eded44ce72391f926a384d90a33b167e4dff92b5d54a4a44679a0388c8e8e980f66777aaaf8cf25060f6529263b2d236f3ebd96d10fe1ef9819ae9163c00a5974dcfec204a5cf90efde72d61f9d400c7248901da3e621b72a625bc89361c837af3f4e54bf9d134d5f042ea127d3771cf590813cc1954dc59339cf88a99bbe9ce01a398cd1ba43c059715fbd2d719d029c7a8269e263b2ea7f063c40163991e046754d58e643bb2fcd94834003d14c9421400007136de6c56ce45685c61c34debf021e490a97c753c9fd7e3d747416d450d8ca4a0cd347cdf607f739f250d9382e00eebc598e90a96a24d03fef8314a6b0365db0807beab51a9d3bee7119b72f2918d6c77efc72eb381e3bbdf2e9a49c5f60eb1b6b0d67065f94fd77d246e36e655af0c7e5d2d44c0f9eb720e3f08533a8d73b5cf568ee18efda732e16d010823c314c99178868b00860cdca7c8fa10f5b5a6c959c1279fee83245039e50daba5446a7a857d65d4eb509a0a54df3a9eb8646d157c66c11dadfa7eaed2df1dd965b2598ecb92d863938534f81cf2aa36a4f37f0cdff77d0b95f9329f29a7fa61a76d29903c26be6d1c90658d9ead5e6cb32ee6cfa9ebd86e3e48b2de221ebe8fb510fe806e84a60888542913bc6e5791a390f5002da5d6e941adf5783d20b12c32e8d9d7d6fba8d41b83d8f6aa2a3e1acb0ea500a3cf28739614278a1309b4fdf6824f68a17a49ae6220222fe3e4c52e5dc9073941282f821a12fc430f0050b84a7180998d330c809be070b27498cbb1c7f44df23e21b0a54264d57a6b5768c3a33e403ae641fa224fe5dcda5e749ec8da7c84fc3cda9d588e1b499d540240a9563e08524f2bf6c6ef16625caa968208c7a6aed22b4b90a8b9b92dee002a27c25c74cc2c3423ae45d1d9411103b0ab1b57f893299ff920413be61db1b7f08e3ac5d110c13e50e7bcc0562ab0b70c0750f4008a80cf98f3e1bf28881d14569ff754eebbe68b622904f73237077c95f204f6f9ac6f4381af1e7c7b8721560d0085c365e701e41817b2bb9b8a285893c25b26b5bfec61dea7a57051598bf0465350bb04a7ef2300cd87d2338df3d2aee9a1084e5978b061ff932ce6aa4581f6c8e2ad573a91eee28af6664929faf20c45d7f5f7e12813b6d93b26e86ac71050a1bc9d90d51d4d901b41dcc2dd06b5de33fa1c4e285b09270c3ef967a552130ae5eecb5fb0dd991dd150923b3d77580a51ea3f3a6b97fa692ddd8b14dc393d6026f3b949ff72833728443b19ee23784df5b87e4834491c09d0f0ce536e559d3ac550bb363da98ddb6b2c435262ad3a42f6d6b178a8fd76eab5ee52ae131f3162d9573ae90733cf59a7e43f21773ae0c00649de8df9f7dc278cf9aa17cefaba836d702daef7f2c4fa7fc15a39144d46da16b2fb4bcdc79ce00e2b9f6b021ac495642a2c1b1b5f367a4471d99fbe3ff5fd8665975be5c14990d56656d5708f37de5e551f0313af5391ce6b7744a30987118134108098355fb966cec4ca8a1dfc283779a759a407828a18ca2cf75bfe075959123d2c92b3f1ffdb16e7a05621f2efa020aa5177ae74a25dbbdfc620aa121522c4eaab60a484b55af390c1ceb6f8ea7631685efec9372e0fc8ee382ac5a92edc36df08f2326361c2acd9bab487fb4d3cbd5a0168c2fee16ea6116ec61dc085a74352ae135cabceab54f705d22a50376c3a4c5631488bc3c67f836431793304f921566f944f94e8453228f4333a2f4b98846678f8f6bf1d3c20d337758b864712a0f2d2b7e30f7fb750cfb0cb85ca5d3daabb1eb38f9b853a2963165f0fa9d3620941225b7ca2c92db549e00223ed711c856214ec0f02261d7c8bdadb50f4cbcbf10958a8b6d4d215fa92ae5e019464ed70f68b77c00db1e39f642227a916b62d2a1ce00ebc0c9689ddf7b6793a6b1d9eefad697a10bf9d72a47a679667d26d4ee83e37c1ce377e71a811d07ecb78d7f3d1fb1fb2d6ea45a561ccc22c984c95d31e7c69164ab40c565d802d5e83e7fc079ca549181eea6f632b400a53bdf75aeb726c5151cb7a8c1aefae9bcb38beb8e17ca224758de3a52f145f4b31f9cb824c8b111446dd854fff7f1065216f9016fe04f27e5011a1296cea03e0decf1142ac89b22f7ea21dfc7676d41d3503443cabed9a4758736fadc272eac6dab9f644913e131dbc35b50c73e02a5d39c825921da73bceab1da3ae21f55ebf379426c988c507fd33b208aeab96b3876cceae8f69b29b64e8ded4cecc7c02832147f3fe969726b4ff4f602f0011af547d943c563829fc08436ebc517e08d7664c8885acb073f832b722e759e3cbddade4ffe06b2fdab69b7a2485e4cfb62d9c46948e8e98cb47d0466ee510466465453c86385f14db4856addb05f5e600dbaa42900dbd657b8f3695ba03b4389de635c8f8d04c01e4d4c4e459f5d7a15f4caecf59534e3857bc9558049b3455e41eb4db8a1843eba5c839692ed4b73c5278c356baf411ca7be4574324826abdedbe7ad9bf2d3db8d8f2628f6ca5c0471891a904d26ac4399c6ceca6e09e81f1930e76a579e0e31d98418defe559622f864cf56a2c5db6d5956adae1e70df1a95f0169869de2597a6de8e819557206cf47ed8bac8460cc634039d3655877909f7cfbbf442a70149fed9676db1aa51f1e480fe1c8dc55b2806f2ed0e9a93cbb2e11cae90ee7f06c2f6856495aa145a91a0436a8b943d3379f7e52956151a39d6e739acbf180e30464e85edb3f347653f5782981bcea175ed78e5f4e7abb14a4733e0bf6225d380f162ddb546e782590ebac9ab9cd830a03a110e845f37b8008203dab6262bb0ac8a8efd5d0ff58ea2e294cb85c327cd320543ffb54c539aab03d0101911ea571443043960c471e0b0723a8e133a63f7e686eee70478637e94090d72d5dc8e336d7a4aef0671b007313ae02c3e0ab71a6de948f5485b34e1c192dee412e3b1a9948f4b538159f4e2a8655e95ec0ff14c67594833ab16b6d083e75c2fef7b5ec87de5fce5b4ce06802930550d994c3097a66ac0b598e201ba98bf790f2b7b78733783adf597124bafe16644aa3c802fe6cb338d279deca7bf5b9baf90708ec8ba9809cfc9dc4a724ac3802c3b50122d4afc9d2393376222e18d11fd1086d879a27195541680a518784d11ce16a094afbdfea7ecc0c937aa6915804a47ace6f99aa859021ca21adb23d4d30845cd0f4f3f240b3cd87978cbe47696929f32871531569a9599] */